# CPP 生长减速预测模型 — 微信小程序 ## 项目概述 本项目是一个**微信小程序**,实现 CPP(中枢性性早熟)患儿在 GnRHa 治疗期间**生长减速风险的预测模型**。基于 Logistic 回归算法,根据临床指标计算12个月内发生生长减速的概率,并给出风险分级和临床建议。 与已有的"生长激素缺乏(GHD)预测模型"小程序(szjs)和"瑞来工作"小程序(rlgz)共用同一套 ThinkPHP 5.0 后台和 MySQL 数据库。 ``` ┌─────────────────────────────────────────────────┐ │ 微信小程序层 │ │ cppszjs (CPP预测) │ szjs (GHD预测) │ rlgz (工作) │ └──────────────────────┬──────────────────────────┘ │ HTTPS ┌──────────────────────▼──────────────────────────┐ │ ThinkPHP 5.0 后台 (101.43.95.130) │ │ https://ruilaizipj.com │ │ Cppwechat.php │ Ruilaiwechat.php │ Ghdwechat.php │ └──────────────────────┬──────────────────────────┘ │ ┌──────────────────────▼──────────────────────────┐ │ MySQL (ruilai 数据库) │ │ t_sys_cpp_calculate_record │ │ t_sys_wechat_calculate_record (GHD) │ │ t_sys_wechat_user │ └─────────────────────────────────────────────────┘ ``` --- ## 预测模型 ### 公式 ``` logit(p) = -2.8457 + 0.1198 × (骨龄 × 子宫长) + 1.0411 × ln(FSH峰值) - 0.4832 × 治疗3月FSH - 0.0044 × 基础IGF-1 + 0.4207 × (LH峰值 / FSH峰值) - 0.8303 × 子宫宽 p = exp(logit) / (1 + exp(logit)) ``` ### 输入指标(7项) | 字段 | 说明 | 范围 | 单位 | |------|------|------|------| | name | 患者姓名 | — | — | | bone_age | 初诊骨龄 | 5.0–13.0 | 岁 | | uterus_length | 初诊子宫长 | 1.0–4.5 | cm | | uterus_width | 初诊子宫宽 | 0.5–3.5 | cm | | lh_peak | GnRH试验 LH峰值 | 0.5–90.0 | IU/L | | fsh_peak | GnRH试验 FSH峰值 | 0.5–25.0 | IU/L | | fsh_3m | 治疗3月后 FSH | 0.0–8.0 | IU/L | | igf1 | 基础 IGF-1 | 100–800 | ng/mL | ### 风险分级 | 等级 | 概率范围 | 12月实际减速率 | 颜色 | 建议 | |------|----------|---------------|------|------| | 低风险 | p < 0.430 | 29.7% | 绿色 #27C2A7 | 继续常规GnRHa方案,每6个月随访 | | 中风险 | 0.430 ≤ p ≤ 0.572 | 51.3% | 橙色 #F0A030 | 缩短随访至3个月,必要时联合rhGH | | 高风险 | p > 0.572 | 71.2% | 红色 #E74C3C | 每2-3月密切随访,尽早考虑rhGH联合干预 | ### 模型性能 - **AUC**: 0.718(Bootstrap 矫正 0.687) - **Hosmer-Lemeshow P值**: 0.909(校准优秀) - **样本来源**: 227例CPP患儿回顾性队列研究 ### 验证示例 | 骨龄 | 子宫长 | 子宫宽 | LH峰 | FSH峰 | 3月FSH | IGF-1 | 概率 | 风险 | |------|--------|--------|-------|--------|---------|--------|-------|------| | 10.5 | 2.4 | 1.5 | 13.5 | 11.8 | 1.2 | 292 | 0.5285 | 中风险 | | 8.0 | 2.0 | 1.2 | 8.0 | 10.0 | 0.8 | 200 | 0.38 | 低风险 | | 12.0 | 3.5 | 3.0 | 50.0 | 20.0 | 5.0 | 600 | 0.75 | 高风险 | --- ## 项目结构 ``` D:\wj\cppszjs\ ├── app.js # 小程序入口,全局数据与工具方法 ├── app.json # 页面路由、窗口配置、TabBar ├── app.wxss # 全局样式 ├── project.config.json # 微信开发者工具配置 ├── package.json # npm 依赖 ├── Cppwechat.php # 后端控制器(本地备份,已部署到服务器) ├── 项目文档.md # 本文档 ├── 公式.txt # GHD公式参考(旧版) ├── 生长减速预测模型系统.xlsx # 临床模型原始数据 ├── CPP生长减速统计分析报告(6.24).docx # 临床统计分析报告 │ ├── pages/ │ ├── home/ # 主页(工具入口 + 资讯列表) │ │ ├── home.js │ │ ├── home.wxml │ │ └── home.wxss │ ├── cppDeceleration/ # ★ CPP预测计算器(核心页面) │ │ ├── cppDeceleration.js # 计算逻辑 + 表单验证 + API调用 │ │ ├── cppDeceleration.wxml # 输入表单 + 结果弹窗 │ │ ├── cppDeceleration.wxss # 风险等级颜色样式 │ │ └── cppDeceleration.json # 页面配置(引用van-overlay组件) │ ├── order/ # 历史记录列表 │ │ └── order.js │ ├── my/ # 个人中心(微信登录) │ │ └── my.js │ ├── grocur/ # 生长曲线图 │ ├── sexChart/ # 性发育图表 │ ├── heightSdsCalculator/ # 身高SDS计算器 │ ├── tarhei/ # 遗传靶身高计算 │ ├── igfrefer/ # IGF-1参考值 │ ├── ghdCalculator/ # GHD预测计算器(从szjs继承) │ ├── tool/ # 共享样式 tool.wxss │ ├── guanyu/ # 关于页面 │ ├── webpage/ # 网页容器 │ ├── news/ # 资讯页 │ └── image/ # 图标资源 │ ├── component/ # 组件 ├── miniprogram/ # npm 构建输出 ├── utils/ # 工具函数 └── subPackages/ # 分包 ``` --- ## 核心文件说明 ### 前端:cppDeceleration 页面 **`pages/cppDeceleration/cppDeceleration.js`** — 计算器逻辑 - 7个表单字段的双向绑定(`handleInput`) - 登录状态检查(`checkLogin`) - 表单验证(`validateForm`),范围校验与前端模型中一致 - 调用 `/app/Cppwechat/calculate` 接口 - 结果展示:概率百分比 + 风险等级(颜色区分) + 临床建议 - 支持重置、查看历史记录、关闭弹窗 **`pages/cppDeceleration/cppDeceleration.wxml`** — 界面模板 - 7个输入组(`form-group`),每个包含标签、参考范围提示、输入框 - 使用 `van-overlay` 组件展示结果弹窗 - 弹窗内容:预测概率(大字)、风险等级(彩色)、临床建议、AUC免责声明 - 底部"开始预测"(红色)和"重置"按钮 **`pages/cppDeceleration/cppDeceleration.wxss`** — 样式 - 复用 `tool.wxss` 共享样式 - 风险等级三色:`.risk-low`(绿)、`.risk-mid`(橙)、`.risk-high`(红) ### 后端:Cppwechat.php **部署位置**: `/www/wwwroot/code/application/app/controller/Cppwechat.php` | 方法 | 路由 | 说明 | |------|------|------| | `calculate` | POST `/app/Cppwechat/calculate` | 接收7项指标,计算概率,返回风险分级 | | `selectRecordList` | POST `/app/Cppwechat/selectRecordList` | 分页查询历史记录 | | `deleteRecord` | POST `/app/Cppwechat/deleteRecord` | 删除指定记录 | | `wechatLogin` | POST `/app/Cppwechat/wechatLogin` | 微信登录(code+encryptedData+iv) | | `selectRealtimeInfoList` | POST `/app/Cppwechat/selectRealtimeInfoList` | 分页查询资讯列表 | | `getToken` | POST `/app/Cppwechat/getToken` | 获取认证 Token | | `getUserBaseInfo` | POST `/app/Cppwechat/getUserBaseInfo` | 获取用户基本信息 | ### 数据库 **表名**: `t_sys_cpp_calculate_record` ```sql CREATE TABLE t_sys_cpp_calculate_record ( id varchar(32) NOT NULL PRIMARY KEY, -- MD5 唯一ID uid int(11) NOT NULL, -- 用户ID name varchar(32) DEFAULT NULL, -- 患者姓名 bone_age decimal(5,2) DEFAULT NULL, -- 初诊骨龄 uterus_length decimal(5,2) DEFAULT NULL, -- 初诊子宫长 uterus_width decimal(5,2) DEFAULT NULL, -- 初诊子宫宽 lh_peak decimal(6,2) DEFAULT NULL, -- LH峰值 fsh_peak decimal(6,2) DEFAULT NULL, -- FSH峰值 fsh_3m decimal(5,2) DEFAULT NULL, -- 治疗3月FSH igf1 decimal(7,2) DEFAULT NULL, -- 基础IGF-1 calculate_result decimal(6,4) DEFAULT NULL, -- 预测概率 risk_level varchar(10) DEFAULT NULL, -- 风险等级 create_time datetime DEFAULT NULL, -- 创建时间 KEY idx_uid (uid), KEY idx_create_time (create_time) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ``` --- ## API 接口规范 所有接口的通用规范: - **请求方式**: POST - **Content-Type**: `application/x-www-form-urlencoded` - **响应格式**: JSON `{ erro: 0|-1, msg: "..." }` - **成功**: `erro = 0` - **失败**: `erro = -1`,具体原因见 `msg` ### POST /app/Cppwechat/calculate 计算生长减速预测概率。 **请求参数**: | 参数 | 必填 | 类型 | 说明 | |------|------|------|------| | uid | 是 | int | 用户ID | | name | 是 | string | 患者姓名 | | bone_age | 是 | float | 初诊骨龄(5.0-13.0) | | uterus_length | 是 | float | 初诊子宫长(1.0-4.5) | | uterus_width | 是 | float | 初诊子宫宽(0.5-3.5) | | lh_peak | 是 | float | LH峰值(0.5-90.0) | | fsh_peak | 是 | float | FSH峰值(0.5-25.0) | | fsh_3m | 是 | float | 治疗3月FSH(0.0-8.0) | | igf1 | 是 | float | 基础IGF-1(100-800) | **成功响应**: ```json { "erro": 0, "msg": "计算成功", "calculate_result": 0.5285, "risk_level": "中风险", "suggestion": "建议缩短随访间隔至3个月,关注GV下降趋势,必要时联合rhGH。" } ``` ### POST /app/Cppwechat/selectRecordList 分页查询历史计算记录。 **请求参数**: | 参数 | 必填 | 类型 | 说明 | |------|------|------|------| | uid | 是 | int | 用户ID | | page | 否 | int | 页码(默认1) | | page_size | 否 | int | 每页条数(默认30) | **成功响应**: ```json { "erro": 0, "msg": "查询成功", "lists": [...], "lastPage": 3, "currentPage": 1 } ``` ### POST /app/Cppwechat/deleteRecord 删除指定记录。 **请求参数**: | 参数 | 必填 | 类型 | 说明 | |------|------|------|------| | uid | 是 | int | 用户ID | | id | 是 | string | 记录ID | ### POST /app/Cppwechat/wechatLogin 微信登录。 **请求参数**: | 参数 | 必填 | 类型 | 说明 | |------|------|------|------| | code | 是 | string | wx.login() 返回的 code | | encryptedData | 是 | string | wx.getUserInfo() 加密数据 | | iv | 是 | string | 加密偏移量 | **成功响应**: ```json { "erro": 0, "msg": "登录成功", "uid": 123 } ``` --- ## 与 szjs (GHD预测) 小程序的差异 | 项目 | szjs (GHD) | cppszjs (CPP) | |------|------------|---------------| | 预测目标 | GHD风险 | CPP生长减速风险 | | 输入指标数 | 3项 | 7项 | | 核心页面 | ghdCalculator | cppDeceleration | | 后端控制器 | Ruilaiwechat | Cppwechat | | 数据库表 | t_sys_wechat_calculate_record | t_sys_cpp_calculate_record | | 主题色 | 蓝色系 | 红色系 #C94A3A | | AppID | wx0847525a15342a46 | **wxa75a76964ae7ce73(待更换)** | | 公式 | logit = -5.908 + 0.008×IGF + 2.146×LH + 0.286×子宫厚度 | logit = -2.8457 + 0.1198×交互项 + 1.0411×ln(FSH) + ... | | AUC | 未标注 | 0.718 | --- ## 待完成事项 1. **[重要] 更换 AppID**: `project.config.json` 中的 `appid` 目前为 `wxa75a76964ae7ce73`(szjs 的 AppID),需在微信公众平台注册新小程序后更换 2. **[重要] 更新主页**: `pages/home/home.wxml` 仍显示"生长激素缺乏预测模型"标题和"GHD预测计算",应改为 CPP 相关品牌 3. **[重要] 更新主页 API**: `pages/home/home.js` 仍调用 `app/Ruilaiwechat/selectRealtimeInfoList`,应改为 `app/Cppwechat/selectRealtimeInfoList` 4. **[可选] 清理冗余页面**: ghdCalculator、tool、news 等页面从 szjs 继承,如不需要可移除 5. **[安全] 后端 Debug 模式**: 服务器 `app_debug=true` 存在安全风险 6. **[安全] 数据库编码**: `charset=utf8` 应升级为 `utf8mb4` 7. **[运维] PHP 版本**: PHP 5.6 已 EOL,建议升级 --- ## 服务器信息 | 项目 | 值 | |------|-----| | 服务器 IP | 101.43.95.130 | | 后端域名 | https://ruilaizipj.com | | 项目根目录 | /www/wwwroot/code | | PHP 版本 | 5.6 (FastCGI via /tmp/php-cgi-56.sock) | | Web 服务器 | Nginx (宝塔面板) | | 数据库 | MySQL,库名 ruilai,前缀 t_sys_ | | 后台管理 | https://www.ruilaizipj.com/adminghd/login | | 管理账号 | 13212345678 / 123456 | --- ## 开发与发布 ### 本地开发 1. 用微信开发者工具打开 `D:\wj\cppszjs` 2. 修改代码后即可在模拟器中预览 3. 如使用 npm 组件,需在工具中执行"构建 npm" ### 发布流程 1. 在微信公众平台注册小程序,获取正式 AppID 2. 修改 `project.config.json` 中的 `appid` 3. 在微信公众平台配置服务器域名白名单:`https://ruilaizipj.com` 4. 在微信开发者工具中点击"上传",填写版本号和备注 5. 登录微信公众平台,在"版本管理"中提交审核 6. 审核通过后发布上线