349 lines
14 KiB
Markdown
349 lines
14 KiB
Markdown
|
|
# 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. 审核通过后发布上线
|