前端(uni-app · Vue3)
- 设计系统:uni.scss 品牌令牌(花红 #E8604C / 蜜橙 #F5A65B / 暖米白 #FFF9F5),
App.vue 全局原子类(卡片/按钮/胶囊/单元格/空态/进度)
- 页面:登录、首页(聚合)、周期(花瓣日历+当日记录+预测+概览)、情绪(记录+趋势+日记+疗愈)、
我的(资料/会员/隐私/提醒)、健康报告、会员套餐、内容详情
- 组件:hq-tabbar(自定义底栏)、bloom-calendar(阶段日历)
- 基础层:utils/{config,request,store,api,date}.js(统一 token、401 处理、接口集中定义)
后端(FastAdmin / ThinkPHP 5.0)
- 新增 api 控制器:Home / Cycle / Mood / Content / Member / Setting,User 增补 detail、updateprofile
- 新增服务层:CycleService(四阶段计算、预测、月历、汇总)、MemberService(权益判定)
- 新增表:fa_cycle / fa_cycle_log / fa_symptom_tag / fa_mood_log / fa_content /
fa_content_category / fa_member_plan / fa_member_order / fa_user_setting
- 初始化数据:20 个症状标签、28 条内容(心语/科普/知识/食谱/运动/睡眠/痛经/冥想)、3 档会员
验证(全部通过)
- 接口全链路 48 项断言(登录→周期→首页→情绪→内容→会员→设置→资料)
- 前后端契约静态校验 24 个接口 0 偏差
- Vue SFC 编译 11/11、SCSS 编译 10/10
- 验证脚本见 scripts/verify/,报告见 docs/04-前端设计系统与联调验证.md
194 行
8.4 KiB
SQL
194 行
8.4 KiB
SQL
-- ============================================================
|
||
-- 花期 APP · V1.0 业务表结构(MySQL 5.7 / utf8mb4)
|
||
-- 库:huaqiapp 前缀:fa_
|
||
-- 说明:与 docs/03-数据模型与接口设计.md 对齐,仅包含 V1.0 纵向切片所需表
|
||
-- ============================================================
|
||
SET NAMES utf8mb4;
|
||
SET FOREIGN_KEY_CHECKS = 0;
|
||
|
||
-- ----------------------------
|
||
-- 周期档案
|
||
-- ----------------------------
|
||
DROP TABLE IF EXISTS `fa_cycle`;
|
||
CREATE TABLE `fa_cycle` (
|
||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||
`user_id` int unsigned NOT NULL COMMENT '用户ID',
|
||
`start_date` date NOT NULL COMMENT '经期开始日',
|
||
`end_date` date DEFAULT NULL COMMENT '经期结束日',
|
||
`period_length` tinyint unsigned NOT NULL DEFAULT '5' COMMENT '经期天数',
|
||
`cycle_length` smallint unsigned NOT NULL DEFAULT '28' COMMENT '周期天数',
|
||
`ovulation_date` date DEFAULT NULL COMMENT '预测排卵日',
|
||
`mode` varchar(20) NOT NULL DEFAULT 'cycle' COMMENT 'cycle/prepare/pregnant',
|
||
`source` varchar(20) NOT NULL DEFAULT 'user' COMMENT 'user/algorithm',
|
||
`createtime` bigint DEFAULT NULL,
|
||
`updatetime` bigint DEFAULT NULL,
|
||
`deletetime` bigint DEFAULT NULL,
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_user_start` (`user_id`,`start_date`),
|
||
KEY `idx_user_del` (`user_id`,`deletetime`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='周期档案';
|
||
|
||
-- ----------------------------
|
||
-- 每日症状与生活记录
|
||
-- ----------------------------
|
||
DROP TABLE IF EXISTS `fa_cycle_log`;
|
||
CREATE TABLE `fa_cycle_log` (
|
||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||
`user_id` int unsigned NOT NULL,
|
||
`log_date` date NOT NULL COMMENT '记录日期',
|
||
`flow` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '经血量 0无 1少 2中 3多',
|
||
`pain_level` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '痛经程度 0-5',
|
||
`symptom_ids` varchar(255) NOT NULL DEFAULT '' COMMENT '症状标签ID,逗号分隔',
|
||
`mood` tinyint NOT NULL DEFAULT '0' COMMENT '情绪 -2~2',
|
||
`sleep_hours` decimal(4,1) DEFAULT NULL COMMENT '睡眠小时',
|
||
`sex` tinyint NOT NULL DEFAULT '0' COMMENT '0无 1有保护 2无保护',
|
||
`note` varchar(500) NOT NULL DEFAULT '' COMMENT '备注',
|
||
`createtime` bigint DEFAULT NULL,
|
||
`updatetime` bigint DEFAULT NULL,
|
||
`deletetime` bigint DEFAULT NULL,
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uniq_user_date` (`user_id`,`log_date`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='每日症状与生活记录';
|
||
|
||
-- ----------------------------
|
||
-- 症状标签字典
|
||
-- ----------------------------
|
||
DROP TABLE IF EXISTS `fa_symptom_tag`;
|
||
CREATE TABLE `fa_symptom_tag` (
|
||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||
`name` varchar(50) NOT NULL,
|
||
`icon` varchar(20) NOT NULL DEFAULT '' COMMENT '图标字符',
|
||
`category` varchar(20) NOT NULL DEFAULT 'body' COMMENT 'body/mood/flow',
|
||
`is_preset` tinyint NOT NULL DEFAULT '1' COMMENT '1预设 0自定义',
|
||
`user_id` int unsigned NOT NULL DEFAULT '0' COMMENT '0为全局',
|
||
`weigh` int NOT NULL DEFAULT '0',
|
||
`status` varchar(20) NOT NULL DEFAULT 'normal',
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_cat` (`category`,`status`,`weigh`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='症状标签';
|
||
|
||
-- ----------------------------
|
||
-- 情绪日记
|
||
-- ----------------------------
|
||
DROP TABLE IF EXISTS `fa_mood_log`;
|
||
CREATE TABLE `fa_mood_log` (
|
||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||
`user_id` int unsigned NOT NULL,
|
||
`log_date` date NOT NULL,
|
||
`mood` varchar(20) NOT NULL COMMENT 'happy/calm/anxious/low/angry',
|
||
`intensity` tinyint unsigned NOT NULL DEFAULT '3' COMMENT '强度 1-5',
|
||
`triggers` varchar(255) NOT NULL DEFAULT '' COMMENT '触发事件标签',
|
||
`content` varchar(1000) NOT NULL DEFAULT '' COMMENT '文字记录',
|
||
`createtime` bigint DEFAULT NULL,
|
||
`updatetime` bigint DEFAULT NULL,
|
||
`deletetime` 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_content_category`;
|
||
CREATE TABLE `fa_content_category` (
|
||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||
`pid` int unsigned NOT NULL DEFAULT '0',
|
||
`name` varchar(50) NOT NULL,
|
||
`type` varchar(20) NOT NULL COMMENT 'jijing/mood/knowledge/advice/meditation',
|
||
`weigh` int NOT NULL DEFAULT '0',
|
||
`status` varchar(20) NOT NULL DEFAULT 'normal',
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_type` (`type`,`status`,`weigh`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='内容分类';
|
||
|
||
-- ----------------------------
|
||
-- 内容库(心语/科普/食谱/运动/知识/冥想)
|
||
-- ----------------------------
|
||
DROP TABLE IF EXISTS `fa_content`;
|
||
CREATE TABLE `fa_content` (
|
||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||
`category_id` int unsigned NOT NULL DEFAULT '0',
|
||
`type` varchar(20) NOT NULL DEFAULT 'jijing' COMMENT 'jijing/mood/knowledge/advice/meditation',
|
||
`title` varchar(120) NOT NULL,
|
||
`summary` varchar(255) NOT NULL DEFAULT '',
|
||
`body` mediumtext COMMENT '正文',
|
||
`cover_emoji` varchar(10) NOT NULL DEFAULT '🌸' COMMENT '封面图标字符',
|
||
`media_type` varchar(20) NOT NULL DEFAULT 'text' COMMENT 'text/audio',
|
||
`duration` int unsigned NOT NULL DEFAULT '0' COMMENT '音频秒数',
|
||
`phase` varchar(120) NOT NULL DEFAULT 'all' COMMENT '适配阶段,逗号分隔 menstrual,follicular,ovulation,luteal',
|
||
`mood_tag` varchar(120) NOT NULL DEFAULT '' COMMENT '适配情绪,逗号分隔',
|
||
`access` varchar(10) NOT NULL DEFAULT 'free' COMMENT 'free/member/pay',
|
||
`verify` varchar(20) NOT NULL DEFAULT 'passed' COMMENT 'pending/passed/rejected',
|
||
`weigh` int NOT NULL DEFAULT '0',
|
||
`status` varchar(20) NOT NULL DEFAULT 'normal',
|
||
`createtime` bigint DEFAULT NULL,
|
||
`updatetime` bigint DEFAULT NULL,
|
||
`deletetime` bigint DEFAULT NULL,
|
||
PRIMARY KEY (`id`),
|
||
KEY `idx_type_status` (`type`,`status`,`verify`,`weigh`),
|
||
KEY `idx_cat` (`category_id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='内容库';
|
||
|
||
-- ----------------------------
|
||
-- 会员套餐
|
||
-- ----------------------------
|
||
DROP TABLE IF EXISTS `fa_member_plan`;
|
||
CREATE TABLE `fa_member_plan` (
|
||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||
`name` varchar(50) NOT NULL,
|
||
`code` varchar(20) NOT NULL COMMENT 'month/year/lifetime',
|
||
`subtitle` varchar(80) NOT NULL DEFAULT '',
|
||
`price` decimal(10,2) NOT NULL DEFAULT '0.00',
|
||
`origin_price` decimal(10,2) NOT NULL DEFAULT '0.00',
|
||
`duration_days` int NOT NULL DEFAULT '30' COMMENT '0 为永久',
|
||
`benefits` text COMMENT '权益标识 JSON',
|
||
`badge` varchar(20) NOT NULL DEFAULT '' COMMENT '角标文案',
|
||
`weigh` int NOT NULL DEFAULT '0',
|
||
`status` varchar(20) NOT NULL DEFAULT 'normal',
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uniq_code` (`code`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会员套餐';
|
||
|
||
-- ----------------------------
|
||
-- 会员订单
|
||
-- ----------------------------
|
||
DROP TABLE IF EXISTS `fa_member_order`;
|
||
CREATE TABLE `fa_member_order` (
|
||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||
`order_no` varchar(32) NOT NULL,
|
||
`user_id` int unsigned NOT NULL,
|
||
`plan_id` int unsigned NOT NULL,
|
||
`plan_code` varchar(20) NOT NULL,
|
||
`amount` decimal(10,2) NOT NULL DEFAULT '0.00',
|
||
`pay_type` varchar(20) NOT NULL DEFAULT 'wechat',
|
||
`pay_status` varchar(20) NOT NULL DEFAULT 'unpaid' COMMENT 'unpaid/paid/refunded',
|
||
`trade_no` varchar(64) NOT NULL DEFAULT '',
|
||
`pay_time` bigint DEFAULT NULL,
|
||
`start_time` bigint DEFAULT NULL,
|
||
`expire_time` bigint DEFAULT NULL COMMENT '0 永久',
|
||
`createtime` bigint DEFAULT NULL,
|
||
`updatetime` bigint DEFAULT NULL,
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uniq_order_no` (`order_no`),
|
||
KEY `idx_user` (`user_id`,`pay_status`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会员订单';
|
||
|
||
-- ----------------------------
|
||
-- 隐私与提醒设置
|
||
-- ----------------------------
|
||
DROP TABLE IF EXISTS `fa_user_setting`;
|
||
CREATE TABLE `fa_user_setting` (
|
||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||
`user_id` int unsigned NOT NULL,
|
||
`app_lock` varchar(20) NOT NULL DEFAULT 'none' COMMENT 'none/password/biometric',
|
||
`app_lock_value` varchar(255) NOT NULL DEFAULT '' COMMENT '加盐哈希,不存明文',
|
||
`local_only` tinyint NOT NULL DEFAULT '0' COMMENT '仅本地存储',
|
||
`remind_json` text COMMENT '提醒开关与时间 JSON',
|
||
`createtime` bigint DEFAULT NULL,
|
||
`updatetime` bigint DEFAULT NULL,
|
||
PRIMARY KEY (`id`),
|
||
UNIQUE KEY `uniq_user` (`user_id`)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='隐私与提醒设置';
|
||
|
||
SET FOREIGN_KEY_CHECKS = 1;
|