文件
huaqiapp/server/db/03_modules.sql
linda d243ece39c feat: 补齐 M1–M9 全部 47 个功能点并打通前后端
后端(新增 7 控制器 + 2 服务 + 17 张表)
- Prepare:排卵预测、BBT(双向体温识别)、试纸识别(规则引擎+额度)、备孕任务、同房指导
- Family:邀请码绑定(≤5)、话术库、爱心积分、私密留言、家庭健康视图
- Health:按周期阶段输出饮食/运动/睡眠/痛经四类建议
- Relation:关系测评、引导卡、冲突工具、课程下单、双人任务(联动记忆)、纪念日
- Parenting:宝宝档案、成长记录、月龄活动匹配、共育任务、育儿情绪、疫苗儿保排期
- Consult:咨询师(资质/定价/时段)、预约下单/取消、量表测评(4 套)、危机干预转介
- Setting:自定义提醒 CRUD、数据备份快照与恢复(保留 5 份)
- Mood 增补急救包;Home 提醒合并自定义提醒
- 服务层:ContentService(统一内容/锁态/购买态)、AssessmentService(计分分级+危机识别)

前端(新增 8 页面)
- 备孕、家人共护、健康建议、两性关系、亲子教育、心理咨询、测评执行页、情绪急救包
- 首页快捷入口扩至 8 个模块;我的页新增提醒中心与数据备份
- utils/api.js 扩至 84 个接口

数据(可重复执行脚本)
- 03_modules.sql:fa_reminder/bbt/lh_test/task/family_bind/care_message/point_log/memory/
  assessment(+record)/course_order/baby/growth_record/vaccine/counselor/consult_order/user_backup
- 04_module_seed.sql:话术6/引导卡6/冲突3/急救4/同房3/课程6/活动6/育儿情绪4/知识7、
  4 套量表、17 项疫苗儿保、3 位咨询师

验证(全部通过)
- 接口全链路 82 项断言(M1–M9,含高风险测评危机干预、备份恢复)
- 契约校验 84 接口 0 偏差;Vue SFC 19/19、SCSS 18/18 编译通过
- 修复 3 个真实缺陷:action 内调用 action 导致响应被劫持、coTasks 返回数组、
  咨询时段跨年错误
2026-11-05 23:27:21 +08:00

314 行
13 KiB
SQL

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

-- ============================================================
-- 花期 APP · M3–M9 功能补齐(新增表结构)
-- MySQL 5.7 / utf8mb4 / 前缀 fa_
-- 执行一次即可(含 fa_content 扩展列)
-- ============================================================
SET NAMES utf8mb4;
-- 内容库扩展:结构化附加信息(如疫苗月龄、课程节数、量表编码)
ALTER TABLE `fa_content` ADD COLUMN `extra` varchar(500) NOT NULL DEFAULT '' COMMENT '结构化附加信息 JSON' AFTER `mood_tag`;
-- ----------------------------
-- M1/M6 智能提醒(自定义提醒项)
-- ----------------------------
DROP TABLE IF EXISTS `fa_reminder`;
CREATE TABLE `fa_reminder` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`user_id` int unsigned NOT NULL,
`title` varchar(60) NOT NULL,
`type` varchar(20) NOT NULL DEFAULT 'custom' COMMENT 'period/ovulation/record/medication/custom',
`remind_time` varchar(5) NOT NULL DEFAULT '21:00' COMMENT 'HH:mm',
`repeat_rule` varchar(20) NOT NULL DEFAULT 'daily' COMMENT 'daily/once/weekly',
`remind_date` date DEFAULT NULL COMMENT '一次性提醒日期',
`enabled` tinyint NOT NULL DEFAULT '1',
`createtime` bigint DEFAULT NULL,
`updatetime` bigint DEFAULT NULL,
`deletetime` bigint DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_user` (`user_id`,`enabled`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='自定义提醒';
-- ----------------------------
-- M3 基础体温
-- ----------------------------
DROP TABLE IF EXISTS `fa_bbt_record`;
CREATE TABLE `fa_bbt_record` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`user_id` int unsigned NOT NULL,
`log_date` date NOT NULL,
`temperature` decimal(4,2) NOT NULL COMMENT '℃',
`measure_time` varchar(5) NOT NULL DEFAULT '',
`device` varchar(20) NOT NULL DEFAULT 'manual' COMMENT 'manual/bluetooth',
`createtime` bigint DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_user_date` (`user_id`,`log_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='基础体温记录';
-- ----------------------------
-- M3 排卵/早孕试纸识别
-- ----------------------------
DROP TABLE IF EXISTS `fa_lh_test`;
CREATE TABLE `fa_lh_test` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`user_id` int unsigned NOT NULL,
`test_type` varchar(10) NOT NULL DEFAULT 'lh' COMMENT 'lh/hcg',
`log_date` date NOT NULL,
`image` varchar(255) NOT NULL DEFAULT '',
`result` varchar(20) NOT NULL DEFAULT '' COMMENT 'negative/weak/positive/strong/unknown',
`confidence` decimal(5,2) NOT NULL DEFAULT '0.00',
`algo` varchar(20) NOT NULL DEFAULT 'rule' COMMENT 'rule/cnn',
`is_free_quota` tinyint NOT NULL DEFAULT '0',
`createtime` bigint DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_user_date` (`user_id`,`log_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='试纸识别记录';
-- ----------------------------
-- 通用任务(备孕任务 / 双人任务 / 共育任务)
-- ----------------------------
DROP TABLE IF EXISTS `fa_task`;
CREATE TABLE `fa_task` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`user_id` int unsigned NOT NULL,
`scope` varchar(20) NOT NULL DEFAULT 'prepare' COMMENT 'prepare/family/relation/parenting',
`title` varchar(80) NOT NULL,
`category` varchar(20) NOT NULL DEFAULT 'check' COMMENT 'folic/check/nutrition/partner/daily/care',
`due_date` date DEFAULT NULL,
`done` tinyint NOT NULL DEFAULT '0',
`done_time` bigint DEFAULT NULL,
`share_partner` tinyint NOT NULL DEFAULT '0',
`createtime` bigint DEFAULT NULL,
`updatetime` bigint DEFAULT NULL,
`deletetime` bigint DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_user_scope` (`user_id`,`scope`,`done`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='任务(备孕/双人/共育)';
-- ----------------------------
-- M4 家人绑定(≤5 人)
-- ----------------------------
DROP TABLE IF EXISTS `fa_family_bind`;
CREATE TABLE `fa_family_bind` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`user_id` int unsigned NOT NULL COMMENT '被关怀方',
`member_user_id` int unsigned NOT NULL DEFAULT '0' COMMENT '家人用户ID',
`member_name` varchar(30) NOT NULL DEFAULT '',
`relation` varchar(20) NOT NULL DEFAULT 'partner' COMMENT 'partner/parent/friend',
`scope` varchar(120) NOT NULL DEFAULT 'remind,care' COMMENT '可见范围',
`invite_code` varchar(32) NOT NULL DEFAULT '',
`confirm_time` bigint DEFAULT NULL,
`status` varchar(20) NOT NULL DEFAULT 'pending' COMMENT 'pending/normal/removed',
`createtime` bigint DEFAULT NULL,
`updatetime` bigint DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_invite` (`invite_code`),
KEY `idx_user` (`user_id`,`status`),
KEY `idx_member` (`member_user_id`,`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='家人绑定';
-- ----------------------------
-- M4 私密沟通空间
-- ----------------------------
DROP TABLE IF EXISTS `fa_care_message`;
CREATE TABLE `fa_care_message` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`bind_id` int unsigned NOT NULL,
`user_id` int unsigned NOT NULL COMMENT '发送方',
`type` varchar(20) NOT NULL DEFAULT 'text' COMMENT 'text/voice/gift',
`content` varchar(1000) NOT NULL DEFAULT '',
`media_url` varchar(255) NOT NULL DEFAULT '',
`createtime` bigint DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_bind_time` (`bind_id`,`createtime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='沟通空间留言';
-- ----------------------------
-- M4 爱心积分流水
-- ----------------------------
DROP TABLE IF EXISTS `fa_point_log`;
CREATE TABLE `fa_point_log` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`user_id` int unsigned NOT NULL,
`action` varchar(30) NOT NULL DEFAULT 'care_daily',
`point` int NOT NULL DEFAULT '0',
`ref_id` int unsigned NOT NULL DEFAULT '0',
`remark` varchar(255) NOT NULL DEFAULT '',
`createtime` bigint DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_user` (`user_id`,`createtime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='爱心积分流水';
-- ----------------------------
-- M7 纪念日 / 爱的记忆时间轴
-- ----------------------------
DROP TABLE IF EXISTS `fa_memory`;
CREATE TABLE `fa_memory` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`user_id` int unsigned NOT NULL,
`bind_id` int unsigned NOT NULL DEFAULT '0',
`title` varchar(60) NOT NULL,
`memory_date` date NOT NULL,
`type` varchar(20) NOT NULL DEFAULT 'anniversary' COMMENT 'anniversary/milestone/daily',
`content` varchar(500) NOT NULL DEFAULT '',
`remind` tinyint NOT NULL DEFAULT '1',
`createtime` bigint DEFAULT NULL,
`deletetime` bigint DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_user_date` (`user_id`,`memory_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='纪念日与记忆时间轴';
-- ----------------------------
-- M7/M9 量表测评
-- ----------------------------
DROP TABLE IF EXISTS `fa_assessment`;
CREATE TABLE `fa_assessment` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`code` varchar(30) NOT NULL COMMENT 'pms/prepare_anxiety/relation/pdp',
`title` varchar(80) NOT NULL,
`intro` varchar(255) NOT NULL DEFAULT '',
`questions` mediumtext NOT NULL COMMENT '题目 JSON',
`scoring` varchar(500) NOT NULL DEFAULT '' COMMENT '分级阈值 JSON',
`level` varchar(10) NOT NULL DEFAULT 'basic' COMMENT 'basic/pro',
`scope` varchar(20) NOT NULL DEFAULT 'mood' COMMENT 'mood/relation/parenting',
`access` varchar(10) NOT NULL DEFAULT 'free' COMMENT 'free/member/pay',
`status` varchar(20) NOT NULL DEFAULT 'normal',
`weigh` int NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_code` (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='量表测评';
DROP TABLE IF EXISTS `fa_assessment_record`;
CREATE TABLE `fa_assessment_record` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`user_id` int unsigned NOT NULL,
`assessment_id` int unsigned NOT NULL,
`answers` varchar(1000) NOT NULL DEFAULT '' COMMENT '答案数组 JSON',
`score` decimal(8,2) NOT NULL DEFAULT '0.00',
`result` varchar(20) NOT NULL DEFAULT '' COMMENT 'low/medium/high/risk',
`report` text COMMENT '解读建议',
`risk_flag` tinyint NOT NULL DEFAULT '0' COMMENT '1 触发危机干预',
`createtime` bigint DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_user` (`user_id`,`assessment_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='测评记录';
-- ----------------------------
-- M7/M8 课程订单
-- ----------------------------
DROP TABLE IF EXISTS `fa_course_order`;
CREATE TABLE `fa_course_order` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`order_no` varchar(32) NOT NULL,
`user_id` int unsigned NOT NULL,
`content_id` int unsigned NOT NULL COMMENT '课程内容ID',
`amount` decimal(10,2) NOT NULL DEFAULT '0.00',
`pay_status` varchar(20) NOT NULL DEFAULT 'unpaid' COMMENT 'unpaid/paid',
`createtime` bigint DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_order_no` (`order_no`),
KEY `idx_user` (`user_id`,`content_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='课程订单';
-- ----------------------------
-- M8 宝宝档案 / 成长记录
-- ----------------------------
DROP TABLE IF EXISTS `fa_baby`;
CREATE TABLE `fa_baby` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`user_id` int unsigned NOT NULL,
`nickname` varchar(30) NOT NULL DEFAULT '',
`gender` tinyint NOT NULL DEFAULT '0' COMMENT '0未知 1男 2女',
`birthday` date DEFAULT NULL,
`due_date` date DEFAULT NULL COMMENT '预产期(孕期)',
`status` varchar(20) NOT NULL DEFAULT 'normal',
`createtime` bigint DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_user` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='宝宝/孕期档案';
DROP TABLE IF EXISTS `fa_growth_record`;
CREATE TABLE `fa_growth_record` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`user_id` int unsigned NOT NULL,
`baby_id` int unsigned NOT NULL,
`record_date` date NOT NULL,
`height` decimal(5,1) DEFAULT NULL COMMENT 'cm',
`weight` decimal(5,2) DEFAULT NULL COMMENT 'kg',
`milestone` varchar(100) NOT NULL DEFAULT '',
`note` varchar(300) NOT NULL DEFAULT '',
`createtime` bigint DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_baby_date` (`baby_id`,`record_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='成长记录';
-- ----------------------------
-- M8 疫苗与儿保计划(静态表)
-- ----------------------------
DROP TABLE IF EXISTS `fa_vaccine`;
CREATE TABLE `fa_vaccine` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(60) NOT NULL,
`type` varchar(20) NOT NULL DEFAULT 'vaccine' COMMENT 'vaccine/checkup',
`month_from` smallint NOT NULL DEFAULT '0' COMMENT '建议月龄起',
`month_to` smallint NOT NULL DEFAULT '0',
`note` varchar(120) NOT NULL DEFAULT '',
`weigh` int NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='疫苗与儿保时间表';
-- ----------------------------
-- M9 咨询师与咨询订单
-- ----------------------------
DROP TABLE IF EXISTS `fa_counselor`;
CREATE TABLE `fa_counselor` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`avatar_emoji` varchar(10) NOT NULL DEFAULT '🌷',
`title` varchar(80) NOT NULL DEFAULT '',
`cert_no` varchar(60) NOT NULL DEFAULT '' COMMENT '资质编号',
`cert_verify` varchar(20) NOT NULL DEFAULT 'passed' COMMENT 'pending/passed/expired',
`price_text` decimal(10,2) NOT NULL DEFAULT '0.00',
`price_voice` decimal(10,2) NOT NULL DEFAULT '0.00',
`price_video` decimal(10,2) NOT NULL DEFAULT '0.00',
`rate` decimal(5,2) NOT NULL DEFAULT '0.30' COMMENT '平台分成比例',
`intro` varchar(500) NOT NULL DEFAULT '',
`tags` varchar(120) NOT NULL DEFAULT '',
`status` varchar(20) NOT NULL DEFAULT 'on' COMMENT 'on/off',
`weigh` int NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='咨询师';
DROP TABLE IF EXISTS `fa_consult_order`;
CREATE TABLE `fa_consult_order` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`order_no` varchar(32) NOT NULL,
`user_id` int unsigned NOT NULL,
`counselor_id` int unsigned NOT NULL,
`mode` varchar(10) NOT NULL DEFAULT 'text' COMMENT 'text/voice/video',
`start_time` bigint DEFAULT NULL,
`duration` int NOT NULL DEFAULT '50',
`amount` decimal(10,2) NOT NULL DEFAULT '0.00',
`pay_status` varchar(20) NOT NULL DEFAULT 'unpaid',
`consult_status` varchar(20) NOT NULL DEFAULT 'pending' COMMENT 'pending/ongoing/finished/canceled',
`rate_amount` decimal(10,2) NOT NULL DEFAULT '0.00',
`createtime` bigint DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `uniq_order_no` (`order_no`),
KEY `idx_user` (`user_id`,`consult_status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='咨询订单';
-- ----------------------------
-- M6 数据备份快照
-- ----------------------------
DROP TABLE IF EXISTS `fa_user_backup`;
CREATE TABLE `fa_user_backup` (
`id` int unsigned NOT NULL AUTO_INCREMENT,
`user_id` int unsigned NOT NULL,
`name` varchar(60) NOT NULL DEFAULT '',
`size` int unsigned NOT NULL DEFAULT '0',
`payload` mediumtext COMMENT '备份 JSON',
`createtime` bigint DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_user` (`user_id`,`createtime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户数据备份';