Files
ccszjs/项目文档.md
renjianbo 12ccebc477 sec
2026-07-18 16:31:27 +08:00

349 lines
14 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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. 审核通过后发布上线