14 KiB
14 KiB
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
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) |
成功响应:
{
"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) |
成功响应:
{
"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 | 加密偏移量 |
成功响应:
{
"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 |
待完成事项
- [重要] 更换 AppID:
project.config.json中的appid目前为wxa75a76964ae7ce73(szjs 的 AppID),需在微信公众平台注册新小程序后更换 - [重要] 更新主页:
pages/home/home.wxml仍显示"生长激素缺乏预测模型"标题和"GHD预测计算",应改为 CPP 相关品牌 - [重要] 更新主页 API:
pages/home/home.js仍调用app/Ruilaiwechat/selectRealtimeInfoList,应改为app/Cppwechat/selectRealtimeInfoList - [可选] 清理冗余页面: ghdCalculator、tool、news 等页面从 szjs 继承,如不需要可移除
- [安全] 后端 Debug 模式: 服务器
app_debug=true存在安全风险 - [安全] 数据库编码:
charset=utf8应升级为utf8mb4 - [运维] 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 |
开发与发布
本地开发
- 用微信开发者工具打开
D:\wj\cppszjs - 修改代码后即可在模拟器中预览
- 如使用 npm 组件,需在工具中执行"构建 npm"
发布流程
- 在微信公众平台注册小程序,获取正式 AppID
- 修改
project.config.json中的appid - 在微信公众平台配置服务器域名白名单:
https://ruilaizipj.com - 在微信开发者工具中点击"上传",填写版本号和备注
- 登录微信公众平台,在"版本管理"中提交审核
- 审核通过后发布上线