后端(新增 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 返回数组、 咨询时段跨年错误
314 行
13 KiB
SQL
314 行
13 KiB
SQL
-- ============================================================
|
||
-- 花期 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='用户数据备份';
|