Просмотр исходного кода

Merge branch 'cfclub' of https://git.iwintrue.com/liaoxg/cfc into cfclub

Xiaogang Liao 2 месяцев назад
Родитель
Сommit
e76785c104

+ 475 - 0
docs/mascot-design.md

@@ -0,0 +1,475 @@
+# 浠宝 & 福宝 吉祥物形象设计书 v2
+> Mascot IP Design Specification · 浠艾福(Care Family)
+
+| 版本 | 日期 | 变更 |
+|---|---|---|
+| v1 | 2026-06-26 | 初版:基于"水/火"气质分别设定(鹿/瑞狮) |
+| v2 | 2026-06-30 | 物种更换 雾灵小鹿 → 虎皮鹦鹉;锦运小瑞狮 → 中华田园橘猫 |
+
+---
+
+## 一、设计总纲
+
+### 1.1 品牌身份
+- 品牌名:**浠艾福**(Care Family)——三方平台型家庭教育服务系统
+- 主体色:浅蓝 `#4A9BD7` · 浅蓝背景 `#F5FAFE` · 字体 PingFang SC
+- 五维色:**身** `#FF8C42`/土 · **智** `#6366F1`/金 · **富** `#F59E0B`/水 · **行** `#10B981`/木 · **心** `#FF6B9D`/火
+- 用户群:家长(决策者)+ 孩子(执行者)+ 规划师(服务者)
+- AI 助手在系统中承担"陪伴、共情、答疑、导引"四重主任务
+
+### 1.2 设计目标
+1. 创造**两个**强对比、互补的家庭助手 IP 形象
+2. 用户登录后从系统中**选择一个**,作为自己所有的 AI 助手形象
+3. 所有 AI 对话、导航提示、激励反馈均以用户选定的 IP 形象出现
+4. 兼顾儿童视觉愉悦与家长审美耐看,**形象 ROI 至少 5 年**
+
+### 1.3 设计原则
+| 原则 | 含义 | 反例 |
+|---|---|---|
+| **圆糯治愈** | 整体线条 Soft Round,无尖锐转折 | 不出现尖角尾巴、细高身形 |
+| **生物本真** | 严格遵循物种真实生物学,让鹦鹉像鹦鹉,猫像猫 | 不搞"杂交兽"或机械拼贴 |
+| **气质反差** | 男女 × 强弱 × 动静 双轴对立 | 不让两者气质"互换" |
+| **品牌映射** | 与五维、五行、节气温和呼应,但不绑定单一维度 | 不让某个 IP 永远只代表"心" |
+| **可工业化** | 利于表情包、动画、周边、Lottie 输出 | 不依赖复杂布光、精细渐变 |
+
+### 1.4 风格锚定(参照样)
+- **造型气韵**:Line Friends(萌系)+ 招财猫(灵气)+ Rilakkuma(软糯)
+- **非参照**:熊本熊(权威感过强)、Pixar 3D(成本过高)、水彩绘本(量产困难)
+
+---
+
+## 二、浠宝 Xibào · 鹦鹉版(女)
+
+### 2.1 身份卡
+
+| 项 | 设置 |
+|---|---|
+| 物种 | 虎皮鹦鹉(Budgerigar),雌性雏鸟感,宠物化 |
+| 年龄感 | 对应人类 5–7 岁 |
+| 身型 | 站立 1.2 头身;展翅可达 1.8 头身 |
+| 主色 | 蜜桃粉 + 蛋糕奶油 + 薄荷 + 一抹清水蓝 |
+| 性别气质 | 嘴甜心甜、有话直说、温柔但有立场 |
+| 标志物 | 三撮粉白羽冠 + 颈上浅蓝蝴蝶结丝带 |
+| 性别本能 | 学说话、复述爱意、黏人 |
+
+### 2.2 名字渊源
+- 「浠」源于品牌字"浠艾福",意为清晨溪水、雨后清新
+- 「宝」意为心爱的小宝贝
+- 文化契合:虎皮鹦鹉为中国家庭高频宠物,"会说话"的特性恰好映射浠宝"复述爱意"的核心能力
+
+### 2.3 拟人化设定
+
+#### 头部
+- 圆头小型鹦鹉比例
+- **羽冠**:三根几何短冠羽(中间最长,羽尖微卷),白底 + 蜜桃粉渐层
+- **眼睛**:黑瞳 + 月牙白高光 + 金色眶环,前置细绒毛代替睫毛
+- **喙**:钝化蜜桃粉小喙,嘴周一圈奶白柔毛
+- **颊羽**:蜜桃粉两片"腮红羽",说温暖的话时会鼓起
+- **耳覆羽**:奶油色极短绒羽,烘托娇小感
+
+#### 身体
+- 主体奶油白渐薄荷绿(背部沿脊柱一道浅浅蜜桃带)
+- 肚皮纯净奶黄,视觉传达软糯触感
+- 翅膀薄荷 + 蜜桃渐层,羽尖奶白;可张开抖动
+- 短腿 + 粉色对握爪(前两趾、后两趾,鹦鹉特征)
+- 长尾薄荷 → 奶油渐层,呈现飘逸
+
+#### 服装/装饰
+- **颈上浅蓝蝴蝶结丝带**(最显眼标志,与品牌主色呼应)
+- 羽冠正中嵌一片心形小羽绒(识别加强)
+- 不增多余服饰以免"商品化"
+
+### 2.4 性格与人设
+
+#### 语音与动作设计
+- **口头禅**:
+  - "我记下来啦~"
+  - "你说过的,我都记得~"
+  - "今天也要好好长大喔 ⚪"
+- **代表动作**:
+  - 站在用户肩上,倾头靠耳说悄悄话
+  - 伸脖蹭脸(蛋形亲吻式)
+  - 抬头张嘴复述用户说过的重要的话
+  - 一惊一乍张开翅膀 "又记到一句!"
+  - 栖在用户手指上,左右微晃
+
+#### 性格光谱
+- 擅长:倾听、复述、记下小细节、温柔催促
+- 不会:飞远、拒绝家人、激进表达
+- 弱点:每次只顾复述,反忘了回答用户问题(形成萌点)
+
+### 2.5 情绪色板
+
+| 情绪 | 主调 | 羽冠 | 触发条件 |
+|---|---|---|---|
+| 平静 | `#E8F4E8` | 直立浅粉 | 默认 |
+| 开心 | `#FFE0CD` | 张开雀跃 | 任务完成 / 鼓励 |
+| 关心 | `#FFCDD9` | 轻微下垂 | 用户表达难过 |
+| 思考 | `#DBC8F0` | 轻倾 | 接收信息中 |
+| 小忧 | `#CCE5F0` | 颤抖 | AI 不确定时 |
+
+### 2.6 应用场景
+
+| 场景 | 触发动作 |
+|---|---|
+| App 启动页 | 双翅微张,羽冠翘起,目光直视用户 |
+| 早安问候 | 栖在用户肩上贴耳说悄悄话 |
+| Loading | 喙一张一合"咕咕咕"等中发声 |
+| AI 对话中 | 歪头 → 张嘴复述(强调"在听你") |
+| 任务完成 | 翅膀竖立 + 喙微张"飞行式"庆祝 |
+| 心情激励 | 轻轻蹭脸三次,羽冠滴下一颗爱心 |
+
+---
+
+## 三、福宝 Fúbǎo · 猫版(男)
+
+### 3.1 身份卡
+
+| 项 | 设置 |
+|---|---|
+| 物种 | 中华田园橘猫(招财猫传统化),雄性小猫 |
+| 年龄感 | 对应人类 5–7 岁 |
+| 身型 | 圆润 1.3 头身;伸懒腰 1.6 头身 |
+| 主色 | 暖橘 + 奶油 + 焦糖 + 局部一点墨色 |
+| 性别气质 | 面冷心暖、护短、慢热、强观察者 |
+| 标志物 | 额心「M」虎斑纹 + 颈上赤金「福」字铃铛 |
+| 猫科本能 | 信任、蜷窝、炸毛、慢眨眼 |
+
+### 3.2 名字渊源
+- 「福」取自品牌字"浠艾福",意为福气、守护、底气
+- 「宝」意为受宠的小宝贝
+- 文化契合:中华田园橘猫即中国"家猫"原型,"招财猫"传统更让福宝与"福"字天然贴合
+
+### 3.3 拟人化设定
+
+#### 头部
+- 圆润脸 + 鼓鼓脸颊(幼猫比例)
+- 额心柔和「M」虎斑纹(写意、写实折中)
+- 圆杏眼琥珀金 + 黑瞳(冷静审视感)
+- 粉鼻小三角 + 鼻翼对称黑纹(萌版重点)
+- 耳:圆润三角,内粉外橘,耳内绒毛
+- 6 根长短不齐胡须,天然不规整
+
+#### 身体
+- 主体:暖橘 → 奶油渐变
+- 肚子纯奶油色(露软肚 = 信任标志)
+- 背部有隐约虎斑条带(不重不轻)
+- 前爪「白手套」(四白),后腿「高帮白袜」
+- 尾巴:暖橘 + 奶油渐变,末端卷成一个圈,尖端一抹白
+
+#### 服装/装饰
+- **红色颈圈 + 金边"福"字方铃**(最显眼标志)
+- 走路时铃铛轻摇
+- 不戴帽、不穿鞋(小动物最自然的拟人边界)
+
+### 3.4 性格与人设
+
+#### 语音与动作设计
+- **口头禅**:
+  - "嗯,行吧。"
+  - "有本喵在呢。"
+  - "别乱说话。"
+  - "尾甩尾甩,OK。"
+- **代表动作**:
+  - 慢慢眨眼「信任表情」
+  - 伸爪按住用户的手
+  - 卷成一团呈"圆形面包"休眠
+  - 面朝下腿蹬直"崩溃"(保留摔桌式表情包灵感)
+  - 尾巴缓缓勾腿
+  - 蹲在用户脚边、桌面角、窗台上
+
+#### 性格光谱
+- 擅长:蹲角观察、安静陪伴、关键时护短
+- 不会:高声喊、甜言蜜语、立刻表达开心
+- 弱点:在用户暴躁时不出声,但会用尾巴轻拍对方手臂(延迟式安抚)
+
+### 3.5 情绪色板
+
+| 情绪 | 主调 | 尾巴 | 触发条件 |
+|---|---|---|---|
+| 平常 | `#F4D0A0` | 平高微弯 | 默认 |
+| 得意 | `#F0A070` | 翘成竖直 | 用户称赞自己时 |
+| 严肃 | `#C8A878` | 平放压低 | 警告 / 提醒 |
+| 心软 | `#B8B8D4` | 埋进身体 | 用户难过时 |
+| 火大 | `#FF8844` | 蓬松炸开 | 用户不守规矩 |
+
+### 3.6 应用场景
+
+| 场景 | 触发动作 |
+|---|---|
+| App 启动页 | 圆团蜷起、眼睛慢慢睁开 |
+| 早安问候 | 不叫醒,蜷在你脚边等你 |
+| Loading | 缩成圆形团,缓缓眯眼 |
+| AI 对话中 | 伸爪按一下屏幕(强调"我看到了") |
+| 任务完成 | 抖抖胡须 + 慢眨一次 |
+| 心情激励 | 尾巴轻拍用户手臂三次 |
+
+---
+
+## 四、性别 × 物种 × 气质 对照
+
+### 4.1 双轴对立
+| 维度 | 浠宝(鹦鹉) | 福宝(猫) |
+|---|---|---|
+| 生物本能 | 学话 → 复述爱意 | 信任 → 慢慢眨眼 |
+| 空间姿态 | 高处栖 / 肩头依赖 | 膝盖窝 / 桌角蜷 |
+| 主动度 | 高(贴贴) | 低(偶发守护) |
+| 色彩温度 | 冷甜 → 暖跳 | 暖沉 → 信安 |
+| 关系意象 | "我说你说咱俩走" | "我不说话,但看着你" |
+| 品牌色映射 | 浅蓝主,水、心、智 | 暖金/红,身、行、富 |
+| Species Signal | 羽冠 + 蝶结 | 虎斑 + 铃铛 |
+| 标志强度 | 1 大件:浅蓝蝴蝶结 | 1 大件:赤金福铃 |
+
+### 4.2 双形象合用设计
+- 同框海报:浠宝立左福宝立右,中间水滴 + 福字铃铛呼应「浠艾福」
+- 合用色域:浅蓝 + 暖金 = 春意 + 福气 = 「家有浠宝福宝,幸福相守」
+- 默认不绑定五维,由"用户对哪个 IP 最有眼缘"自然决定
+
+---
+
+## 五、一致原则(两形象共同)
+
+1. **几何体系**:半径圆头 + 圆眼 + 圆体;禁止尖角尾巴 / 锐利线条
+2. **眼睛**:大、明亮、留白;高光为大月牙形,不闪烁
+3. **嘴**:小而可动(不发出"尖叫表情")
+4. **轮廓**:单一描线包络,避免多重笔触
+5. **动画循环**:单动作 ≤ 2s 循环,避免"过动"
+6. **可缩放**:30 px favicon 仍可识别轮廓
+7. **包容性**:性别表达中正;非动物毛发用品不出镜
+
+---
+
+## 六、Pose Library
+
+### 6.1 基础 Pose(两形象共用,各保留 IP 物种差异)
+
+| Pose ID | 名称 | 描述 | 用途 |
+|---|---|---|---|
+| P01 | 站立挥手 | 右手举起,鸟羽呈 V,猫爪呈波浪 | 主页 / 欢迎页 |
+| P02 | 蹲下平视 | 双腿蹲下,仰头对视 | 跟孩子对话 |
+| P03 | 双手比心 | 翼/爪搭成心形 | 完成激励 |
+| P04 | 头顶冒星 | 一颗星从头顶升起 | 新成就 |
+| P05 | 趴倒 wink | 侧躺摆尾,眨一只眼 | 系统异常状态 |
+| P06 | 双臂张开 | 翼展开,爪摆开 | 拥抱鼓励 |
+| P07 | 侧耳倾听 | 头偏一侧,眼眨一半 | 用户输入中 |
+| P08 | 点头+眼神 | 接连点头两次 | AI 思考中 |
+
+### 6.2 物种特色 Pose
+- **浠宝专属**:
+  - P09 停在肩膀
+  - P10 栖于指尖
+  - P11 张嘴复述(喙微张,羽冠直立)
+  - P12 蹭脸亲亲
+- **福宝专属**:
+  - P13 蜷圆面包
+  - P14 蹲角落观察
+  - P15 慢眨眼
+  - P16 尾巴勾腿
+
+---
+
+## 七、应用场景
+
+### 7.1 不同载体下的细节
+| 载体 | 建议规格 | 备注 |
+|---|---|---|
+| App 启动页 | 全身立绘 ≥ 1024 px | 双方并列;左浠宝右福宝 |
+| Loading 动画 | Lottie 6–10 帧 | 单动作循环 ≤ 2s |
+| Home 主页头像 | 头肩像 256 px | 与主体风格同 |
+| 消息气泡 | 头肩像带圆环 96 px | 圆环 4 px 主色描边 |
+| 表情包 GIF | 256 px 加线无背景 | 6–8 个常用情绪 |
+| Web 管理端avatar | 头肩像 64 px | 圆润描线 |
+| 公众号头图 | 全身 + 合用元素 | 1:1 + 16:9 双规格 |
+
+### 7.2 文字应用
+- 名称字体:圆润手写体(思源黑体 / 站酷快乐体)
+- Slogan:「浠宝陪你长大,福宝守护你长大」
+- Banner 语气:白话、温暖、8 字内
+
+---
+
+## 八、周边与延展(待二期)
+
+- 表情包:先期 8 枚,最高频使用
+- 实体周边:帆布袋、贴纸、毛绒抱枕(小批量推广)
+- 教育公益联名:与儿童书籍、儿童 APP 异业合作
+- 节日限定变体:端午、中秋、春节、生日
+
+---
+
+## 九、给画师的成稿清单
+
+### 9.1 必备产出
+| # | 项 | 数量 | 规格 |
+|---|---|---|---|
+| 1 | 标准立绘(浠宝 / 福宝) | 2 | 1024×1024 PNG 透明 |
+| 2 | 7 种基础情绪立绘(×2 IP) | 14 | 512×512 PNG |
+| 3 | Pose 库(按 §6) | 2×16=32 个 | 矢量 |
+| 4 | 双形象合绘(并肩 / 对视 / 互拌) | 3 | 1024×1024 PNG |
+| 5 | Logo 矢量 | 2(羽冠蝶结 / 福铃铛) | AI 可缩至 12 px |
+| 6 | 表情包 GIF | 6 条 | 256×256 GIF 加线无背景 |
+| 7 | 头肩像带圆环 | 各 1 | 256×256 PNG |
+
+### 9.2 推荐工具
+- 原画:**Procreate**(前期) + **Clip Studio Paint**(线稿精修)
+- 矢量:**Illustrator**(logo 矢量化)
+- 动画:**Adobe Animate / After Effects + Lottie**(web/iOS 通用)
+- 颜色管理:Pantone 校色 + sRGB 输出
+
+### 9.3 验收标准
+- 情绪色板可一一对应(14 张情绪图色彩与 §2.5 / §3.5 完全一致)
+- Logo 在 12 px 仍然能识别物种 + IP
+- 表情包 GIF 体积 ≤ 150 KB
+- 主体描线在 100% 显示时不出现锯齿
+
+---
+
+## 十、与后端系统的对应
+
+### 10.1 数据库
+```sql
+ALTER TABLE users ADD COLUMN mascot VARCHAR(20) DEFAULT NULL
+COMMENT 'AI 助手形象: xibao(浠宝-鹦鹉-女)/fubao(福宝-猫-男)/null(未选择)';
+```
+> 由 `DatabaseInitializer.runMigrations()` 在启动时执行。
+
+### 10.2 enum
+```java
+public enum MascotEnum {
+    XIBAO("xibao", "浠宝", "女",
+          "温柔嘴甜,喜欢学用户说过的话,站在肩膀上陪家人听遇每件小事",
+          "🦜"),
+    FUBAO("fubao", "福宝", "男",
+          "面冷心暖、护短慢热、蜷在脚边默默守护,关键时刻出来护住人",
+          "🐱");
+
+    private final String code;
+    private final String displayName;
+    private final String gender;
+    private final String persona;
+    private final String emojiFallback;
+}
+```
+
+### 10.3 Dify 调用注入
+```json
+{
+  "mascot_name":   "XIBAO"   // 后续可改为"浠宝"
+  "mascot_gender": "女",
+  "mascot_persona": "温柔嘴甜...(见 enum 简介)"
+}
+```
+
+### 10.4 前端通用 emoji 占位
+- 在真实 IP 立绘到位前,前端使用 emoji:
+  - 🦜 → 浠宝占位
+  - 🐱 → 福宝占位
+- 后续替换为 `image/avatar-xibao.png` 等资源路径
+
+---
+
+## 十一、出图生词指南(供插画师/AI 工具参考)
+
+> §11 的 prompt 模板是给 DALL·E / Midjourney 等生成式工具使用的"种子描述"。
+> 真实出图仍建议由专业插画师在 prompt 基础上二次精修。
+
+### 11.1 通用风格锚词(两个 IP 共享)
+```
+(Prompt anchor)
+kawaii healing mascot illustration, ultra soft rounded shapes,
+warm pastels with low saturation, thick uniform outline 2pt,
+single light source from upper-left, cel-shaded with one
+shadow layer, no texture noise, white background,
+front view, full body, no accessory clutter,
+2-head proportions, child-friendly proportions,
+inspired by Line Friends + 招财猫 + Rilakkuma,
+NOT realistic, NOT anthropomorphic for children under 4
+```
+
+### 11.2 浠宝 prompt(DALL·E / Midjourney 直接可用)
+```
+A kawaii baby budgerigar parrot mascot illustration for a
+family education app called "Xi Ai Fu (Care Family)".
+
+The character is named Xibao, a 5-year-old feeling girl.
+Two head tall Q-version proportions, ultra soft rounded body.
+
+Head: round with three little peach-pink crest feathers on top
+(centre longest, tips slightly curled). Large round black eyes
+with a crescent moon white highlight and a thin gold iris
+ring. Tiny peach-pink beak softened with a cream fur ring
+around it. Two peach-pink "blush feathers" on cheeks.
+
+Body: cream-white body fading into mint green along the
+spine. A subtle peach band runs along the upper back.
+Belly is pure cream yellow, soft-looking. Wings are mint
+green fading to peach, tips creamy white. Short legs,
+pink zygodactyl feet. Long tail, mint to cream gradient.
+
+Decoration: a sky-blue #4A9BD7 ribbon bow tied around the
+neck (the most distinctive mark, matches brand color).
+One tiny heart-shaped down feather embedded in the centre
+crest.
+
+Emotion: gentle, smiling, slightly tipping head.
+Standard pose, front view, looking at viewer.
+
+(Style anchor) kawaii healing mascot, ultra soft,
+warm pastels with low saturation, thick uniform 2pt black
+outline, single upper-left light, one cel shadow, white
+background, front view, full body, no clutter,
+2-head proportions, child-friendly.
+--ar 1:1 --s 250
+```
+
+### 11.3 福宝 prompt(DALL·E / Midjourney 直接可用)
+```
+A kawaii baby ginger tabby Chinese Li Hua cat mascot
+illustration for a family education app called "Xi Ai Fu
+(Care Family)".
+
+The character is named Fubao, a 5-year-old feeling boy.
+Round 1.3 head Q-version proportions, ultra chubby &
+soft-bodied. Lithe, mellow posture.
+
+Head: round face with chubby cheeks. Soft "M" tiger-stripe
+marking on forehead (stylized, minimal). Big round amber
+gold eyes with black pupils, calm watchful expression.
+Small pink nose triangle with symmetric black whisker
+spots. Round triangle ears, pink inside, ginger outside,
+with inner fuzz. 6 uneven whiskers.
+
+Body: ginger fading to cream. Belly pure cream. Subtle
+tiger stripes on the back. White "gloves" on all four front
+toes. White high-sock back paws. Tail ginger + cream
+gradient, curled into a loop at the tip with a small white
+stroke.
+
+Decoration: a vermilion red collar with a gold-edged
+square bell engraved with the Chinese character "福" (the
+most distinctive mark). Bell lightly sways. No hat, no shoes.
+
+Emotion: cool, calm, slightly slow-blinking, "I am
+watching over you".
+
+(Style anchor) kawaii healing mascot, ultra soft,
+warm pastels with low saturation, thick uniform 2pt black
+outline, single upper-left light, one cel shadow, white
+background, front view, full body, no clutter,
+1.3-head proportions, child-friendly.
+--ar 1:1 --s 250
+```
+
+---
+
+## 十二、变更记录
+- 2026-06-30 v2:
+  - 物种更换为虎皮鹦鹉(浠宝)+ 中华田园橘猫(福宝)
+  - 删除原 §雾灵小鹿/§锦运小瑞狮 设定
+  - 增加物种本能映射(学话 → 复述 / 信任 → 慢眨眼)
+  - 增加 §11 AI 生图 prompt 区
+- 2026-06-26 v1:初版设定,物种为雾灵小鹿 + 锦运小瑞狮
+
+---
+
+> 文末关怀:本设计书最终解释权归浠艾福品牌组。若与画师执行产生分歧,请以 §1.4 风格锚定 + §5 一致原则 + §9.3 验收标准 为三轴判定。

+ 45 - 25
docs/系统测试/issue-tracking/ISSUE-003-admin-create-user.md

@@ -1,50 +1,70 @@
-# ISSUE-003:管理员创建用户500错误
+# ISSUE-003:管理员创建用户500错误(根因已确认)
 
 
 **状态**: 待解决
 **状态**: 待解决
 **严重度**: 中
 **严重度**: 中
 **创建日期**: 2026-06-29
 **创建日期**: 2026-06-29
 **模块**: 用户管理
 **模块**: 用户管理
 **测试用例**: `ADMIN-CREATE-PARENT`
 **测试用例**: `ADMIN-CREATE-PARENT`
+**根因确认日期**: 2026-06-30
 
 
 ## 问题描述
 ## 问题描述
 
 
-管理员通过 `POST /api/admin/users/create` 创建新用户(phone=13800138002)时返回 Spring Boot 默认 500 错误页面(非业务 `Result.error`)。
+管理员通过 `POST /api/admin/users/create` 创建新用户时返回 Spring Boot 默认 500 错误页面(非业务 `Result.error`)。
 
 
 ## 错误信息
 ## 错误信息
 
 
 ```
 ```
-[ADMIN-CREATE-PARENT] FAIL code=500 resp={'timestamp': '...', 'status': 500, 'error': 'Internal Server Error', 'path': '/api/admin/users/create'}
+code=500 status=Internal Server Error path=/api/admin/users/create
 ```
 ```
 
 
-## 复现步骤
-
-1. admin 登录 → `POST /api/admin-auth/login`
-2. 创建用户 → `POST /api/admin/users/create` (phone=13800138002, role=parent, nickname="E2E测试家长")
-3. **失败**:返回 Spring 默认 500 错误
+即使使用时间戳唯一手机号(如 `13930143018`)仍500,排除重复手机号问题。
 
 
 ## 根因分析
 ## 根因分析
 
 
-`AdminController.createUser()` 逻辑:
-1. 检查 phone 是否已存在
-2. 新建 User 对象
-3. `userMapper.insert(user)` → **此处抛出未捕获异常**
+**文件**: `cfc-backend/src/main/java/com/etotem/cfc/controller/admin/AdminController.java` line 76-104
+
+```java
+User user = new User();
+user.setPhone(phone);
+user.setNickname(nickname);
+user.setRole(role);
+user.setRealName(realName);
+user.setPassword("");      // ← 空字符串可能违反约束
+user.setCreatedAt(new Date());
+user.setUpdatedAt(new Date());
+// ❌ 缺少: user.setFamilyId(...) — family_id 是 NOT NULL 字段!
+userMapper.insert(user);
+```
+
+`users` 表结构(生产库):
+```sql
+family_id BIGINT NOT NULL,   // ← 约束存在
+```
+
+**根因**: `family_id` 是 `NOT NULL` 字段,但 `AdminController.createUser()` 没有设置 `familyId`,导致 MySQL 约束违反异常 → 500。
 
 
-500(Spring 默认错误页面)而非 `Result.error(code=500)` 表明是**数据库写入异常**,可能原因:
+## 现有用户 familyId 参考
 
 
-1. **password 字段约束**:`user.setPassword("")` 空字符串可能违反 NOT NULL 或其他约束
-2. **数据库触发器**:`users` 表有触发器导致插入失败
-3. **字段类型不匹配**:某些字段值为空但类型不兼容
-4. **唯一索引冲突**(phone 之外的索引)
+| userId | phone | familyId |
+|--------|-------|----------|
+| 1 | 13910958767 | 2 |
+| 8 | 13701366188 | 2 |
+| 9 | 13701366181 | 16 |
+| 10 | 13800138999 | 17 |
+
+## 影响范围
+
+- 管理员无法通过管理后台创建新用户
+- 所有新用户创建都失败(NOT NULL 约束)
 
 
 ## 修复建议
 ## 修复建议
 
 
-1. 检查远程 `users` 表结构:
-   ```sql
-   SHOW CREATE TABLE users;
-   ```
-2. 检查 `password` 字段允许 NULL 还是 NOT NULL
-3. 在 `AdminController.createUser()` 添加 try-catch 捕获 `DataAccessException`
-4. 考虑设置 `password` 为 `null` 而非空字符串,或设置默认值
+在 `AdminController.createUser()` 中添加 `familyId`:
+```java
+user.setFamilyId(1L); // 或创建新的 family 记录
+```
+
+或者修改表结构允许 NULL(不推荐)。
 
 
 ## 责任人
 ## 责任人
 
 
@@ -56,4 +76,4 @@
 
 
 ## 回归测试
 ## 回归测试
 
 
-修复后运行:`python e2e_multi_role.py` 验证 `ADMIN-CREATE-PARENT` 通过。
+修复后运行:`python e2e_issue_tracking.py` 验证 `ISSUE003-CREATE` 通过。

+ 5 - 5
docs/系统测试/issue-tracking/README.md

@@ -10,11 +10,11 @@
 
 
 ## 问题总览
 ## 问题总览
 
 
-| # | 问题ID | 模块 | 严重度 | 状态 | 发现日期 | 解决日期 |
-|---|--------|------|--------|------|----------|----------|
-| 1 | ISSUE-001 | 商品上下架 | 中 | 待解决 | 2026-06-29 | — |
-| 2 | ~~ISSUE-002~~ | ~~文章发布~~ | ~~高~~ | ✅ 已解决 | 2026-06-29 | 2026-06-29 |
-| 3 | ISSUE-003 | 创建用户 | 中 | 待解决 | 2026-06-29 | — |
+| # | 问题ID | 模块 | 严重度 | 状态 | 发现日期 | 根因确认日期 | 解决日期 |
+|---|--------|------|--------|------|----------|-------------|----------|
+| 1 | ISSUE-001 | 商品上下架 | 中 | 待解决 | 2026-06-29 | — | — |
+| 2 | ~~ISSUE-002~~ | ~~文章发布~~ | ~~高~~ | ✅ 已解决 | 2026-06-29 | 2026-06-29 | 2026-06-29 |
+| 3 | ISSUE-003 | 创建用户 | 中 | ✅ 根因已确认 | 2026-06-29 | 2026-06-30 | — |
 
 
 ---
 ---
 
 

+ 26 - 0
docs/系统测试/test-records/README.md

@@ -33,6 +33,32 @@
 
 
 ## 历史测试记录
 ## 历史测试记录
 
 
+### 2026-06-30 — 问题追踪测试(v3脚本,深度分析)
+
+**测试commit**: `093021f`
+**测试环境**: `http://cfc.iwintrue.com:80`
+**测试脚本**: `e2e_issue_tracking.py`
+
+| 测试项 | 结果 | 说明 |
+|--------|------|------|
+| STEP1-LOGIN | ✅ PASS | adminId=7 |
+| ISSUE003-CREATE | ❌ FAIL | **根因确认**: `family_id NOT NULL` 约束未被满足 |
+| ISSUE003-SEARCH | ✅ PASS | 找到已存在家长 userId=8 (phone=13701366188) |
+| ISSUE002-CREATE | ✅ PASS | articleId=5 |
+| ISSUE002-PUBLISH | ✅ PASS | 发布成功 |
+| ISSUE001-CHECK-VENDOR | ⚠️ WARN | vendorStatus=pending(无法完整测试ISSUE-001)|
+| ISSUE001-SKIP | ⚠️ WARN | 供应商未approved,跳过商品流程 |
+| ACTIVITY-CREATE | ✅ PASS | activityId=10 |
+| ACTIVITY-PUBLISH | ✅ PASS | 发布成功 |
+| PARENT-PRODUCT-LIST | ✅ PASS | total=7 |
+| PARENT-ACTIVITY-LIST | ✅ PASS | total=10 |
+
+**汇总**: 20 tests, 8 PASS, 1 FAIL, 2 WARN
+
+**重大发现**: ISSUE-003 根因是 `AdminController.createUser()` 未设置 `family_id`,而该字段为 NOT NULL。所有现有用户均有有效 `family_id`。
+
+---
+
 ### 2026-06-29 — 多角色 E2E 测试(第二轮,v2脚本)
 ### 2026-06-29 — 多角色 E2E 测试(第二轮,v2脚本)
 
 
 **测试commit**: `e24e1b3`
 **测试commit**: `e24e1b3`

+ 133 - 0
e2e_issue_tracking_result.txt

@@ -0,0 +1,133 @@
+
+============================================================
+FINAL: 20 tests | PASS=8 | FAIL=1 | WARN=2
+============================================================
+ISSUE-001 (Vendor Shelve):  N/A
+ISSUE-002 (Article Publish): PASS
+ISSUE-003 (Admin Create User): FAIL
+============================================================
+  [--] STEP1-LOGIN: Admin login...
+  [OK] STEP1-LOGIN: OK adminId=7
+  [--] ISSUE003-TEST: === ISSUE-003: Admin create user ===
+  [--] ISSUE003-CREATE: Creating user phone=13930143018
+  [XX] ISSUE003-CREATE: FAIL code=500 msg=
+  [--] ISSUE003-SEARCH: Searching for existing parent users...
+  [OK] ISSUE003-SEARCH: Found parent userId=8 phone=13701366188
+  [--] ISSUE002-TEST: === ISSUE-002: Article create+publish (regression) ===
+  [OK] ISSUE002-CREATE: OK articleId=5
+  [OK] ISSUE002-PUBLISH: OK
+  [--] ISSUE001-TEST: === ISSUE-001: Vendor product full flow ===
+  [--] ISSUE001-CHECK-VENDOR: Checking vendor status userId=81069...
+  [!!] ISSUE001-CHECK-VENDOR: vendorStatus=pending
+  [!!] ISSUE001-SKIP: Vendor not approved (vendorStatus=pending), skip product flow
+  [--] ACTIVITY-TEST: === Activity create+publish ===
+  [OK] ACTIVITY-CREATE: OK activityId=10
+  [OK] ACTIVITY-PUBLISH: OK
+  [--] PARENT-TEST: === Parent APIs ===
+  [OK] PARENT-PRODUCT-LIST: OK total=7
+  [OK] PARENT-ACTIVITY-LIST: OK total=10
+
+
+--- RAW JSON ---
+[
+  {
+    "tag": "STEP1-LOGIN",
+    "msg": "Admin login...",
+    "status": "INFO"
+  },
+  {
+    "tag": "STEP1-LOGIN",
+    "msg": "OK adminId=7",
+    "status": "PASS"
+  },
+  {
+    "tag": "ISSUE003-TEST",
+    "msg": "=== ISSUE-003: Admin create user ===",
+    "status": "INFO"
+  },
+  {
+    "tag": "ISSUE003-CREATE",
+    "msg": "Creating user phone=13930143018",
+    "status": "INFO"
+  },
+  {
+    "tag": "ISSUE003-CREATE",
+    "msg": "FAIL code=500 msg=",
+    "status": "FAIL"
+  },
+  {
+    "tag": "ISSUE003-SEARCH",
+    "msg": "Searching for existing parent users...",
+    "status": "INFO"
+  },
+  {
+    "tag": "ISSUE003-SEARCH",
+    "msg": "Found parent userId=8 phone=13701366188",
+    "status": "PASS"
+  },
+  {
+    "tag": "ISSUE002-TEST",
+    "msg": "=== ISSUE-002: Article create+publish (regression) ===",
+    "status": "INFO"
+  },
+  {
+    "tag": "ISSUE002-CREATE",
+    "msg": "OK articleId=5",
+    "status": "PASS"
+  },
+  {
+    "tag": "ISSUE002-PUBLISH",
+    "msg": "OK",
+    "status": "PASS"
+  },
+  {
+    "tag": "ISSUE001-TEST",
+    "msg": "=== ISSUE-001: Vendor product full flow ===",
+    "status": "INFO"
+  },
+  {
+    "tag": "ISSUE001-CHECK-VENDOR",
+    "msg": "Checking vendor status userId=81069...",
+    "status": "INFO"
+  },
+  {
+    "tag": "ISSUE001-CHECK-VENDOR",
+    "msg": "vendorStatus=pending",
+    "status": "WARN"
+  },
+  {
+    "tag": "ISSUE001-SKIP",
+    "msg": "Vendor not approved (vendorStatus=pending), skip product flow",
+    "status": "WARN"
+  },
+  {
+    "tag": "ACTIVITY-TEST",
+    "msg": "=== Activity create+publish ===",
+    "status": "INFO"
+  },
+  {
+    "tag": "ACTIVITY-CREATE",
+    "msg": "OK activityId=10",
+    "status": "PASS"
+  },
+  {
+    "tag": "ACTIVITY-PUBLISH",
+    "msg": "OK",
+    "status": "PASS"
+  },
+  {
+    "tag": "PARENT-TEST",
+    "msg": "=== Parent APIs ===",
+    "status": "INFO"
+  },
+  {
+    "tag": "PARENT-PRODUCT-LIST",
+    "msg": "OK total=7",
+    "status": "PASS"
+  },
+  {
+    "tag": "PARENT-ACTIVITY-LIST",
+    "msg": "OK total=10",
+    "status": "PASS"
+  }
+]

+ 14 - 14
e2e_multi_role_result.txt

@@ -7,7 +7,7 @@ SUMMARY: 31 tests, 12 PASS, 2 FAIL, 1 WARN
   [--] ADMIN-FIND-VENDOR: Finding vendor user phone=13800138001...
   [--] ADMIN-FIND-VENDOR: Finding vendor user phone=13800138001...
   [OK] ADMIN-FIND-VENDOR: Found userId=81069 role=teacher
   [OK] ADMIN-FIND-VENDOR: Found userId=81069 role=teacher
   [--] VENDOR-APPLY: Vendor userId=81069 applying...
   [--] VENDOR-APPLY: Vendor userId=81069 applying...
-  [OK] VENDOR-APPLY: OK: 入驻申请已提交,请等待审核
+  [OK] VENDOR-APPLY: Already applied (expected)
   [--] ADMIN-APPROVE-VENDOR: Approving vendor userId=81069...
   [--] ADMIN-APPROVE-VENDOR: Approving vendor userId=81069...
   [OK] ADMIN-APPROVE-VENDOR: OK: 审核通过
   [OK] ADMIN-APPROVE-VENDOR: OK: 审核通过
   [--] VENDOR-STATUS: Checking vendor status userId=81069...
   [--] VENDOR-STATUS: Checking vendor status userId=81069...
@@ -15,20 +15,20 @@ SUMMARY: 31 tests, 12 PASS, 2 FAIL, 1 WARN
   [--] VENDOR-PRODUCT-CREATE: Creating product as vendor userId=81069...
   [--] VENDOR-PRODUCT-CREATE: Creating product as vendor userId=81069...
   [XX] VENDOR-PRODUCT-CREATE: FAIL code=200 resp={'code': 500, 'message': '仅审核通过的服务商可发布商品', 'data': None}
   [XX] VENDOR-PRODUCT-CREATE: FAIL code=200 resp={'code': 500, 'message': '仅审核通过的服务商可发布商品', 'data': None}
   [--] ADMIN-ARTICLE-CREATE: Creating article...
   [--] ADMIN-ARTICLE-CREATE: Creating article...
-  [OK] ADMIN-ARTICLE-CREATE: OK articleId=3
-  [--] ADMIN-ARTICLE-PUBLISH: Publishing article articleId=3...
+  [OK] ADMIN-ARTICLE-CREATE: OK articleId=4
+  [--] ADMIN-ARTICLE-PUBLISH: Publishing article articleId=4...
   [OK] ADMIN-ARTICLE-PUBLISH: OK: 操作成功
   [OK] ADMIN-ARTICLE-PUBLISH: OK: 操作成功
   [--] ADMIN-ACTIVITY-CREATE: Creating activity...
   [--] ADMIN-ACTIVITY-CREATE: Creating activity...
-  [OK] ADMIN-ACTIVITY-CREATE: OK activityId=8
-  [--] ADMIN-ACTIVITY-PUBLISH: Publishing activity activityId=8...
+  [OK] ADMIN-ACTIVITY-CREATE: OK activityId=9
+  [--] ADMIN-ACTIVITY-PUBLISH: Publishing activity activityId=9...
   [OK] ADMIN-ACTIVITY-PUBLISH: OK: 发布成功
   [OK] ADMIN-ACTIVITY-PUBLISH: OK: 发布成功
   [--] ADMIN-FIND-PARENT: Finding parent user phone=13800138002...
   [--] ADMIN-FIND-PARENT: Finding parent user phone=13800138002...
   [--] ADMIN-CREATE-PARENT: Creating new parent user phone=13800138002...
   [--] ADMIN-CREATE-PARENT: Creating new parent user phone=13800138002...
-  [XX] ADMIN-CREATE-PARENT: FAIL/WARN code=500 resp={'timestamp': '2026-06-29T19:21:07.869+00:00', 'status': 500, 'error': 'Internal Server Error', 'path': '/api/admin/users/create'}
+  [XX] ADMIN-CREATE-PARENT: FAIL/WARN code=500 resp={'timestamp': '2026-06-30T06:25:32.029+00:00', 'status': 500, 'error': 'Internal Server Error', 'path': '/api/admin/users/create'}
   [--] PARENT-PRODUCT-LIST: Parent viewing product list...
   [--] PARENT-PRODUCT-LIST: Parent viewing product list...
   [OK] PARENT-PRODUCT-LIST: OK total=7
   [OK] PARENT-PRODUCT-LIST: OK total=7
   [--] PARENT-ACTIVITY-LIST: Parent viewing activity list...
   [--] PARENT-ACTIVITY-LIST: Parent viewing activity list...
-  [OK] PARENT-ACTIVITY-LIST: OK total=8
+  [OK] PARENT-ACTIVITY-LIST: OK total=9
   [--] VENDOR-MY-PRODUCTS: Vendor viewing my products...
   [--] VENDOR-MY-PRODUCTS: Vendor viewing my products...
   [OK] VENDOR-MY-PRODUCTS: OK count=0
   [OK] VENDOR-MY-PRODUCTS: OK count=0
   [--] ADMIN-VENDOR-LIST: Admin listing vendors...
   [--] ADMIN-VENDOR-LIST: Admin listing vendors...
@@ -67,7 +67,7 @@ SUMMARY: 31 tests, 12 PASS, 2 FAIL, 1 WARN
   },
   },
   {
   {
     "tag": "VENDOR-APPLY",
     "tag": "VENDOR-APPLY",
-    "msg": "OK: 入驻申请已提交,请等待审核",
+    "msg": "Already applied (expected)",
     "status": "PASS"
     "status": "PASS"
   },
   },
   {
   {
@@ -107,12 +107,12 @@ SUMMARY: 31 tests, 12 PASS, 2 FAIL, 1 WARN
   },
   },
   {
   {
     "tag": "ADMIN-ARTICLE-CREATE",
     "tag": "ADMIN-ARTICLE-CREATE",
-    "msg": "OK articleId=3",
+    "msg": "OK articleId=4",
     "status": "PASS"
     "status": "PASS"
   },
   },
   {
   {
     "tag": "ADMIN-ARTICLE-PUBLISH",
     "tag": "ADMIN-ARTICLE-PUBLISH",
-    "msg": "Publishing article articleId=3...",
+    "msg": "Publishing article articleId=4...",
     "status": "INFO"
     "status": "INFO"
   },
   },
   {
   {
@@ -127,12 +127,12 @@ SUMMARY: 31 tests, 12 PASS, 2 FAIL, 1 WARN
   },
   },
   {
   {
     "tag": "ADMIN-ACTIVITY-CREATE",
     "tag": "ADMIN-ACTIVITY-CREATE",
-    "msg": "OK activityId=8",
+    "msg": "OK activityId=9",
     "status": "PASS"
     "status": "PASS"
   },
   },
   {
   {
     "tag": "ADMIN-ACTIVITY-PUBLISH",
     "tag": "ADMIN-ACTIVITY-PUBLISH",
-    "msg": "Publishing activity activityId=8...",
+    "msg": "Publishing activity activityId=9...",
     "status": "INFO"
     "status": "INFO"
   },
   },
   {
   {
@@ -152,7 +152,7 @@ SUMMARY: 31 tests, 12 PASS, 2 FAIL, 1 WARN
   },
   },
   {
   {
     "tag": "ADMIN-CREATE-PARENT",
     "tag": "ADMIN-CREATE-PARENT",
-    "msg": "FAIL/WARN code=500 resp={'timestamp': '2026-06-29T19:21:07.869+00:00', 'status': 500, 'error': 'Internal Server Error', 'path': '/api/admin/users/create'}",
+    "msg": "FAIL/WARN code=500 resp={'timestamp': '2026-06-30T06:25:32.029+00:00', 'status': 500, 'error': 'Internal Server Error', 'path': '/api/admin/users/create'}",
     "status": "FAIL"
     "status": "FAIL"
   },
   },
   {
   {
@@ -172,7 +172,7 @@ SUMMARY: 31 tests, 12 PASS, 2 FAIL, 1 WARN
   },
   },
   {
   {
     "tag": "PARENT-ACTIVITY-LIST",
     "tag": "PARENT-ACTIVITY-LIST",
-    "msg": "OK total=8",
+    "msg": "OK total=9",
     "status": "PASS"
     "status": "PASS"
   },
   },
   {
   {

+ 0 - 9
e2e_result_new.txt

@@ -1,9 +0,0 @@
-[LOGIN] status=200
-[LOGIN] SUCCESS adminId=7
-[ARTICLE] status=500
-[ARTICLE] resp={"timestamp":"2026-06-29T02:55:39.358+00:00","status":500,"error":"Internal Server Error","path":"/api/admin/articles/publish"}
-[ACTIVITY-CREATE] status=200, id=6
-[ACTIVITY-PUBLISH] status=200, id=6
-[ACTIVITY-PUBLISH] resp={"code":200,"message":"success","data":"发布成功"}
-[PRODUCT-CREATE] status=200
-[PRODUCT-CREATE] resp={"code":500,"message":"仅审核通过的服务商可发布商品","data":null}