Explorar el Código

fix: resolve merge conflict in DatabaseInitializer, add mascot to UpdateUserDTO

Sisyphus Agent hace 2 meses
padre
commit
4e9e78c99b

+ 159 - 1
cfc-backend/src/main/java/com/etotem/cfc/config/DatabaseInitializer.java

@@ -11,7 +11,9 @@ import org.springframework.util.StreamUtils;
 
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -4221,7 +4223,8 @@ try {
         // 迁移40: users表添加mascot字段(AI助手形象: xibao浠宝/fubao福宝)
         ensureColumn("users", "mascot", "VARCHAR(20) DEFAULT NULL COMMENT 'AI助手形象: xibao(浠宝)/fubao(福宝)'");
 
-        // 迁移41: 创建family_relationships表(家庭成员双向关系,替代relationship_type/role_override)
+
+        // family_relationships 表(远程新增)
         try {
             jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS family_relationships (" +
                     "id BIGINT AUTO_INCREMENT PRIMARY KEY, " +
@@ -4241,6 +4244,161 @@ try {
         } catch (Exception e) {
             log.warn("创建family_relationships表可能已存在: {}", e.getMessage());
         }
+
+        // 迁移41: 初始化五维知识中心文章分类和种子文章
+        try {
+            Integer catCount = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM article_categories WHERE name IN ('身', '智', '心', '行', '富')", Integer.class);
+            if (catCount == null || catCount == 0) {
+                jdbcTemplate.execute("INSERT IGNORE INTO article_categories (name, icon, color, sort_order, status) VALUES " +
+                    "('身', 'health', '#FF8C42', 1, 1), " +
+                    "('智', 'wisdom', '#6366F1', 2, 1), " +
+                    "('心', 'love', '#FF6B9D', 3, 1), " +
+                    "('行', 'action', '#10B981', 4, 1), " +
+                    "('富', 'wealth', '#F59E0B', 5, 1)");
+                log.info("五维文章分类已初始化");
+            }
+        } catch (Exception e) {
+            log.warn("初始化文章分类失败: {}", e.getMessage());
+        }
+
+        try {
+            Integer articleCount = jdbcTemplate.queryForObject(
+                "SELECT COUNT(*) FROM articles WHERE created_by = 0 AND status = 'published'", Integer.class);
+            if (articleCount != null && articleCount > 0) {
+                log.info("种子文章已存在,跳过初始化");
+            } else {
+                Map<String, Long> catIdMap = new HashMap<>();
+                jdbcTemplate.query(
+                    "SELECT id, name FROM article_categories WHERE name IN ('身', '智', '心', '行', '富')",
+                    (rs) -> {
+                        catIdMap.put(rs.getString("name"), rs.getLong("id"));
+                    });
+
+                if (catIdMap.size() == 5) {
+                    long bodyCatId = catIdMap.get("身");
+                    long mindCatId = catIdMap.get("智");
+                    long heartCatId = catIdMap.get("心");
+                    long actionCatId = catIdMap.get("行");
+                    long wealthCatId = catIdMap.get("富");
+
+                    insertSeedArticle("好水养人:家庭健康从一杯好水开始",
+                        "水是生命之源,但你真的会喝水吗?从水质选择到饮水习惯,本文将带你了解如何通过一杯好水滋养全家人。",
+                        "水被忽视的营养素。在营养学中,水被称为\"第七大营养素\",然而大多数人只关注吃什么,却忽略了喝什么。人体的60%是水,血液的90%是水,大脑的75%是水。水的质量,直接决定了身体的运转效率。好水的标准:安全是第一位的,天然的矿物质含量是加分项。每个家庭成员对水的需求不同,从今天开始,为家人准备一杯好水,就是最简单的健康投资。",
+                        "浠艾福", 6, "body", 1);
+
+                    insertSeedArticle("儿童体质调理的黄金期,你抓住了吗?",
+                        "中医讲\"春生夏长,秋收冬藏\",儿童的体质调理也有其黄金时期。本文从营养、运动、睡眠三个维度,告诉你如何为孩子打下坚实的健康基础。",
+                        "体质调理,从了解开始。每个孩子天生体质不同,了解孩子的体质类型,是调理的第一步。抓住三个黄金期:0-3岁基础免疫期,母乳喂养提供天然抗体;3-7岁脾胃调理期,少食生冷、定时定量;7-12岁生长发育期,需要充足的蛋白质、钙和维生素D。家庭调理小贴士:晨起捏脊增强免疫力,睡前泡脚促进血液循环,节气调理调整饮食和作息。",
+                        "浠艾福", 8, "body", 1);
+
+                    insertSeedArticle("五维健康早餐:让孩子一天元气满满",
+                        "一日之计在于晨,早餐的质量直接影响孩子一天的学习效率和身体状态。一份覆盖五维营养的早餐,让孩子从早上就充满能量。",
+                        "为什么早餐如此重要?研究表明,吃早餐的孩子在注意力、记忆力和创造力方面都明显优于不吃早餐的孩子。五维营养早餐公式:优质碳水提供持续能量,优质蛋白是身体修复的基础,维生素和矿物质增强免疫力,健康脂肪促进大脑发育,益生菌呵护肠道健康。养成规律的早餐习惯,是给孩子最好的健康礼物。",
+                        "浠艾福", 5, "body", 0);
+
+                    insertSeedArticle("DAN测评:发现孩子与众不同的天赋密码",
+                        "每个孩子都是独一无二的。DAN多维认知测评从六大维度全面解读孩子的认知特点,帮助家长找到最适合孩子的成长路径。",
+                        "什么是DAN测评?DAN测评是一套基于认知心理学和发展心理学理论的多维评估体系,从注意力、记忆力、逻辑思维、空间感知、语言能力和情绪理解六个维度,全面描绘孩子的认知发展图谱。测评的目的不是给孩子贴标签,而是为家长提供一幅\"认知地图\"。有了这张地图,你就可以选择适合孩子认知特点的学习方法,发现潜在的天赋领域加以培养,针对性地训练薄弱环节。",
+                        "浠艾福", 7, "mind", 1);
+
+                    insertSeedArticle("成长型思维:给孩子一生受用的心理资本",
+                        "斯坦福大学心理学教授卡罗尔·德韦克研究发现,拥有成长型思维的孩子更愿意接受挑战,面对挫折时更有韧性。如何培养孩子的成长型思维?",
+                        "固定型思维的孩子认为\"能力是天生的,改变不了\",遇到困难容易放弃。而成长型思维的孩子相信\"能力可以通过努力提升\",把挑战视为成长的机会。研究发现,这两种思维模式对孩子的学业成就、人际关系甚至未来的职业发展都有深远影响。当孩子完成一件事时,你的反馈方式至关重要:表扬努力而非聪明,关注进步而非结果,把失败变成学习机会。",
+                        "浠艾福", 6, "mind", 0);
+
+                    insertSeedArticle("专注力:决定孩子学习效率的关键能力",
+                        "在信息爆炸的时代,专注力成为最稀缺的能力。本文从脑科学角度解读专注力的本质,并给出提升孩子专注力的实用方法。",
+                        "哈佛大学的一项长达75年的追踪研究发现,决定一个人成功的不是智商,而是专注力和自控力。孩子的专注力是随着年龄逐渐发展的:3岁孩子能专注5-10分钟,7岁孩子能专注15-20分钟,10岁以上可以专注25-30分钟。破坏孩子专注力的三个习惯:频繁打断、多任务并行、过度刺激。提升专注力的实用方法:番茄工作法25分钟专注加5分钟休息,舒尔特方格每天5分钟训练视觉专注,冥想练习每天3-5分钟的正念呼吸。",
+                        "浠艾福", 7, "mind", 0);
+
+                    insertSeedArticle("读懂孩子的情绪密码:亲子沟通的艺术",
+                        "孩子哭闹、发脾气、沉默不语……每个情绪背后都有一个未被满足的需求。学会倾听孩子的情绪语言,是建立亲子信任的第一步。",
+                        "情绪是孩子最真实的语言。对于语言表达能力尚未成熟的孩子来说,情绪是他们最直接的沟通方式。当孩子发脾气时,他最需要的不是被制止,而是被理解。情绪接纳四步法:停下来蹲下来与孩子平视,帮孩子给情绪一个名字,让孩子知道所有情绪都是被允许的,一起寻找更合适的表达方式。通过绘本故事帮助孩子认识情绪,是很好的情绪启蒙方式。",
+                        "浠艾福", 6, "wisdom", 1);
+
+                    insertSeedArticle("家庭氛围:孩子心理健康的第一土壤",
+                        "一个温暖、稳定、充满爱的家庭环境,是孩子心理健康最坚实的保障。本文探讨如何营造积极健康的家庭氛围,让爱在家庭中流动。",
+                        "<h2>家庭氛围的隐形力量</h2><p>心理学研究表明,家庭氛围对儿童人格发展的影响超过了学校教育和社会环境。孩子就像一块海绵,无时无刻不在吸收着家庭中的情绪能量。</p><p>如果家庭氛围是温暖、开放、包容的,孩子就会发展出安全感、自信心和探索世界的勇气。反之,如果家庭中充满了争吵、冷漠和批评,孩子就会变得焦虑、退缩或叛逆。</p><h2>营造积极家庭氛围的三要素</h2><p><b>1. 有规律的仪式感</b>。每周一次的家庭会议、每晚的亲子阅读时间、周末的户外活动——这些固定的仪式让家庭成员之间建立情感连接。</p><p><b>2. 积极沟通的语言习惯</b>。多用\"我\"字句表达感受(\"我感到有点累\"),少用\"你\"字句指责(\"你总是这样\")。每天至少说出三件值得感恩的事。</p><p><b>3. 情绪修复的能力</b>。冲突不可避免,重要的是冲突后的修复。真诚的道歉(\"刚才妈妈对你发脾气了,对不起\")比完美的教育更重要。</p><h2>父母的关系是家庭的定海神针</h2><p>对孩子来说,感受到父母相爱,比任何教育都重要。和谐的夫妻关系,就是给孩子最好的心理礼物。</p>",
+                        "浠艾福", 7, "wisdom", 0);
+
+                    insertSeedArticle("每个孩子都是天使:在不完美中发现完美",
+                        "我们总是在追求\"完美小孩\",却忽略了每个孩子身上那些独特的光芒。学会接纳孩子的不完美,也许是我们能给他们的最好的爱。",
+                        "<h2>放下\"别人家孩子\"的执念</h2><p>\"你看看人家小明,每次考试都是第一。\"这句话可能在很多人的童年里留下过阴影。我们一边反感自己被比较,一边又在不自觉地比较自己的孩子。</p><p>每个孩子都有自己的成长节奏。有的孩子语言发育早,有的运动能力强,有的在社交方面天赋异禀。用统一的标准去衡量不同的孩子,就像用爬树的能力去评价一条鱼。</p><h2>看见孩子真正的样子</h2><p>试着静下心来,观察你的孩子:他专注时是什么样子?他开心时是怎么表达的?他遇到困难时是什么反应?当你放下期望,你才能真正看见——那个独一无二的小生命。</p><p>也许他数学不好,但很有爱心;也许他好动坐不住,但充满创造力;也许他内向不爱说话,但心思细腻善解人意。</p><h2>接纳是最好的教育</h2><p>当孩子感受到被完全接纳——包括他的优点和缺点——他就会建立起内在的安全感。这种安全感,是他探索世界、面对挑战的底气。正如心理学家温尼科特所说:\"孩子不需要完美的父母,只需要\"足够好\"的父母。\"</p>",
+                        "浠艾福", 5, "wisdom", 0);
+
+                    // 行(人际和谐)
+                    insertSeedArticle("亲子关系的五个黄金法则",
+                        "好的亲子关系胜过任何教育方法。本文总结了五个经过实践验证的亲子关系法则,帮助你与孩子建立深厚的情感连接。",
+                        "<h2>法则一:陪伴是最好的礼物</h2><p>不是\"在一起\"就是陪伴。高质量的陪伴需要全神贯注——放下手机,蹲下来,进入孩子的世界。每天15分钟的全情陪伴,胜过一整天的身在心不在。</p><h2>法则二:尊重是爱的前提</h2><p>尊重孩子意味着:认真对待他的感受,不轻视他的需求,尊重他的节奏。当他感到被尊重,他才会学会尊重别人。</p><h2>法则三:界限是爱的护栏</h2><p>爱不等于没有界限。清晰、一致、合理的规则让孩子感到安全。没有护栏的路,孩子不敢走;有护栏的路,孩子才能自由奔跑。</p><h2>法则四:倾听比说教重要</h2><p>当孩子想说话时,放下说教的心,只是认真地听。很多时候,孩子不需要你的答案,他只需要被听见。</p><h2>法则五:错误是成长的机会</h2><p>没有人是完美的父母,也没有完美的孩子。犯错不可怕,重要的是从错误中学习。当你能坦然面对自己的错误,孩子也会学会勇敢面对他的不完美。</p>",
+                        "浠艾福", 5, "action", 1);
+
+                    insertSeedArticle("夫妻关系:家庭幸福的第一颗扣子",
+                        "如果把家庭比作一件衣服,夫妻关系就是第一颗扣子。第一颗扣子扣对了,后面的扣子自然就顺了。良好的夫妻关系,是给孩子最好的成长礼物。",
+                        "<h2>为什么夫妻关系比亲子关系更重要</h2><p>在家庭系统中,夫妻关系是核心,亲子关系是从属关系。健康的家庭模式应该是:夫妻关系 > 亲子关系 > 原生家庭关系。</p><p>当夫妻关系稳固,孩子会从父母身上学习到如何爱人、如何沟通、如何处理冲突。这些隐性教育,比任何课程都重要。</p><h2>经营夫妻关系的三个小习惯</h2><p><b>1. 每天15分钟的\"夫妻时间\"</b>。孩子入睡后,放下家务和手机,只是聊聊天。不谈孩子,只谈彼此。</p><p><b>2. 每周一次\"约会\"</b>。不用很隆重,两个人一起散步、看场电影、吃顿饭,找回恋爱时的感觉。</p><p><b>3. 在孩子面前\"秀恩爱\"</b>。让孩子看到父母拥抱、说\"我爱你\"、互相感谢。这是最好的爱的教育。</p><h2>冲突也是成长的机会</h2><p>避免冲突不是健康的婚姻。重要的是如何解决冲突:不翻旧账、不人身攻击、不冷战。一次成功的冲突解决,会让关系更加亲密。</p>",
+                        "浠艾福", 6, "action", 0);
+
+                    insertSeedArticle("如何帮助孩子建立健康的社交圈",
+                        "社交能力是孩子未来成功的核心能力之一。从家庭到学校,从线上到线下,本文提供一套系统的儿童社交能力培养方案。",
+                        "<h2>社交能力从家庭开始</h2><p>孩子的第一个社交圈是家庭。在家庭中学会的沟通方式、分享精神和情绪管理,会直接迁移到学校和社会的社交中。</p><p>父母要做的是:为孩子创造安全的社交练习环境,而不是替他解决问题。</p><h2>分年龄段社交培养重点</h2><p><b>3-5岁:学会分享和轮流</b>。通过游戏和日常活动,让孩子体验分享的快乐。不强迫分享,而是引导孩子理解\"轮流\"的概念。</p><p><b>6-8岁:学习解决冲突</b>。当孩子和朋友发生矛盾时,引导他表达自己的感受,倾听对方的想法,一起寻找解决方案。</p><p><b>9-12岁:培养团队合作</b>。鼓励参加团队运动和小组项目,学习在团队中发挥自己的优势,理解和尊重他人的不同。</p><h2>当孩子遇到社交困难时</h2><p>如果孩子在学校感到孤独或被排挤:</p><ul><li>认真倾听他的感受,不要急于给建议</li><li>帮助他发现自己的优势,建立自信心</li><li>创造课外社交机会,如兴趣班、社区活动</li><li>必要时与老师沟通,了解学校里的情况</li></ul>",
+                        "浠艾福", 7, "action", 0);
+
+                    // 富(利他创富)
+                    insertSeedArticle("孩子的财商启蒙:从零花钱开始",
+                        "财商教育不是教孩子\"赚钱\",而是培养他管理资源的智慧和能力。零花钱是一个绝佳的教育工具,让孩子在实践中学会规划、储蓄和分享。",
+                        "<h2>为什么财商教育很重要</h2><p>财商(Financial Quotient, FQ)与智商、情商并列为现代社会三大核心素质。财商教育不是教孩子功利,而是教他如何与资源建立健康的关系——如何规划、如何选择、如何延迟满足、如何感恩和分享。</p><h2>零花钱制度的黄金法则</h2><p><b>1. 定时给,不定额</b>。每周或每月固定时间发放,但金额不宜过多,让孩子学会在有限的资源中做选择。</p><p><b>2. 三个存储罐法则</b>。准备三个罐子:\"储蓄罐\"(存起来以后用)、\"消费罐\"(可以随时花的)、\"分享罐\"(给需要帮助的人或买礼物)。每一次得到零花钱,按照比例分配。</p><p><b>3. 允许犯错</b>。孩子可能会把钱一次性花光,这是他学习的机会。不要训斥,而是和他一起复盘:\"如果下次再来一次,你会怎么做?\"</p><h2>在浠艾福,我们这样做</h2><p>在浠艾福平台,孩子可以通过完成任务、坚持打卡获得积分,自己决定如何使用积分兑换奖励。这种\"付出→获得→选择\"的闭环,让孩子在真实场景中锻炼财商。</p>",
+                        "浠艾福", 6, "wealth", 1);
+
+                    insertSeedArticle("家庭理财入门:用爱管理家庭财富",
+                        "家庭理财不只是管钱,更是管理家庭的幸福和安全感。一个健康的家庭财务体系,让每个家庭成员都能安心追求梦想。",
+                        "<h2>家庭理财的本质</h2><p>很多人觉得理财就是投资、赚钱,但其实家庭理财的本质是:用有限的资源,实现家庭最大的幸福。它包含四个层面:保障、消费、储蓄和增值。</p><h2>家庭理财四步法</h2><p><b>第一步:建立家庭账本</b>。记录一个月的收支,搞清楚钱花在哪里。推荐使用\"三个账户\"法:日常开销账户、储蓄投资账户、娱乐成长账户。</p><p><b>第二步:建立应急基金</b>。储备3-6个月的生活费,放在随时可取的地方。这笔钱是家庭的\"安全垫\"。</p><p><b>第三步:先储蓄后消费</b>。每个月收入到账后,先存钱(收入的20%-30%),再安排消费。这是一种强制储蓄的习惯。</p><p><b>第四步:投资孩子的未来</b>。除了教育储蓄,更重要的是投资在孩子的能力培养上——阅读、探索、体验。</p><h2>给孩子的财富观</h2><p>从小培养正确的财富观:钱是工具,不是目的;财富来源于创造价值;分享让财富更有意义。这些观念会影响孩子一生的财富之路。</p>",
+                        "浠艾福", 6, "wealth", 0);
+
+                    insertSeedArticle("创客成长计划:在利他中成就自我",
+                        "浠艾福创客计划为每个家庭提供了低门槛的创客机会。在这里,你不仅能够获得额外收入,更能在帮助他人的过程中实现自我成长。",
+                        "<h2>什么是创客成长计划</h2><p>创客成长计划是浠艾福打造的利他创富生态。我们相信,最好的商业模式是\"利他\"——通过分享优质的产品和服务,帮助更多家庭获得幸福,同时也实现自身的价值。</p><h2>为什么选择成为创客</h2><p><b>低门槛启动</b>:不需要大量资金,不需要囤货,只需要一颗愿意分享的心。</p><p><b>成长体系完善</b>:从初级创客到高级合伙人,每一步都有清晰的成长路径和配套培训。</p><p><b>利他即利己</b>:当你把好的产品和服务分享给身边的朋友,帮助他们改善家庭健康和生活品质,这种价值感本身就是最大的回报。</p><h2>创客的一天</h2><p>早晨,你在朋友圈分享了一篇关于儿童营养的好文章;中午,有朋友私信咨询你关于孩子体质调理的建议;下午,你在创客社群参加了一场线上培训;晚上,你收获了几份订单和满满的成就感。</p><p>这就是创客的生活——在学习和分享中,实现家庭与事业的双重成长。</p>",
+                        "浠艾福", 5, "wealth", 0);
+
+                    log.info("五维种子文章已初始化(共15篇)");
+                } else {
+                    log.warn("文章分类不完整,跳过种子文章初始化");
+                }
+            }
+        } catch (Exception e) {
+            log.warn("初始化种子文章失败: {}", e.getMessage());
+        }
+    }
+
+    private void insertSeedArticle(String title, String summary, String content,
+                                    String author, int readTime, String dimensionCode, int isFeatured) {
+        try {
+            // 查询分类ID
+            String dimCatMap = dimensionCode.equals("body") ? "身"
+                : dimensionCode.equals("mind") ? "智"
+                : dimensionCode.equals("wisdom") ? "心"
+                : dimensionCode.equals("action") ? "行"
+                : dimensionCode.equals("wealth") ? "富" : "身";
+            Long categoryId = jdbcTemplate.queryForObject(
+                "SELECT id FROM article_categories WHERE name = ?", Long.class, dimCatMap);
+
+            if (categoryId == null) {
+                log.warn("未找到分类: {}, 跳过文章: {}", dimCatMap, title);
+                return;
+            }
+
+            jdbcTemplate.update(
+                "INSERT INTO articles (category_id, title, summary, content, author, read_time, " +
+                "related_dimensions, status, audit_status, is_featured, visibility, content_type, " +
+                "article_type, word_count, published_at, created_by, created_at, updated_at) " +
+                "VALUES (?, ?, ?, ?, ?, ?, ?, 'published', 'approved', ?, 'public', 'article', " +
+                "'original', ?, NOW(), 0, NOW(), NOW())",
+                categoryId, title, summary, content, author, readTime,
+                dimensionCode, isFeatured, content.length()
+            );
+            log.info("已创建种子文章: {}", title);
+        } catch (Exception e) {
+            log.warn("创建种子文章失败 [{}]: {}", title, e.getMessage());
+        }
     }
 
     private void insertSysConfigSeed(String key, String value, String desc) {

+ 2 - 0
cfc-backend/src/main/java/com/etotem/cfc/dto/UpdateUserDTO.java

@@ -26,4 +26,6 @@ public class UpdateUserDTO {
 
     // 家长身份
     private String familyRole;
+
+    private String mascot;
 }