458 lines
19 KiB
Markdown
458 lines
19 KiB
Markdown
# CPP 生长减速预测模型 — 后台架构文档
|
||
|
||
## 一、系统总览
|
||
|
||
```
|
||
┌──────────────────────────────────────────────────────────────────────┐
|
||
│ 客户端 (微信小程序) │
|
||
│ ├── szjs (生长激素缺乏 GHD) → 微信AppID: wx... │
|
||
│ ├── cppszjs (CPP 生长减速) → 微信AppID: wx0847525a15342a46 │
|
||
│ └── rlgz (瑞来工作) → 微信AppID: wx... │
|
||
└──────────────────────────────┬───────────────────────────────────────┘
|
||
│ HTTPS POST
|
||
▼
|
||
┌──────────────────────────────────────────────────────────────────────┐
|
||
│ ThinkPHP 5.0 后端 (ruilaizipj.com) — 腾讯云 101.43.95.130 │
|
||
│ │
|
||
│ app 模块 (小程序API) │
|
||
│ ├── Cppwechat.php ← cppszjs 小程序 API │
|
||
│ ├── Ruilaiwechat.php ← szjs 小程序 API │
|
||
│ └── ... │
|
||
│ │
|
||
│ 后台管理模块 (三套独立入口) │
|
||
│ ├── admincpp/ → /admincpp CPP 生长减速预测模型后台 │
|
||
│ ├── adminghd/ → /adminghd 生长激素缺乏预测模型后台 │
|
||
│ └── admin/ → /admin 通用后台 │
|
||
└──────────────────────────────┬───────────────────────────────────────┘
|
||
│
|
||
▼
|
||
┌──────────────────────────────────────────────────────────────────────┐
|
||
│ MySQL 数据库 (127.0.0.1:3306, 库名: ruilai) │
|
||
│ 表前缀: t_sys_ │
|
||
│ 用户名: rootrui 密码: X2)jB+k%YH.p │
|
||
└──────────────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 二、URL 路由与模块隔离
|
||
|
||
### 2.1 模块自动识别
|
||
|
||
ThinkPHP 通过 URL 第一段自动识别模块名,由 `BusinessConfig.php` 实现:
|
||
|
||
```php
|
||
// /application/common/config/BusinessConfig.php
|
||
public static function getBusinessTypeByModule() {
|
||
$module = request()->module();
|
||
if ($module === 'adminghd') return self::BUSINESS_ADMINGHD;
|
||
if ($module === 'admincpp') return self::BUSINESS_ADMINCPP;
|
||
return self::BUSINESS_ADMIN;
|
||
}
|
||
```
|
||
|
||
### 2.2 三个后台入口
|
||
|
||
| 模块 | URL | Session Key | 对应项目 |
|
||
|------|-----|-------------|----------|
|
||
| admin | /admin/login | admin_user_id | 通用 |
|
||
| adminghd | /adminghd/login | adminghd_user_id | 生长激素缺乏 GHD |
|
||
| admincpp | /admincpp/login | admincpp_user_id | CPP 生长减速 |
|
||
|
||
### 2.3 表名映射
|
||
|
||
不同模块访问同一逻辑表名时,自动路由到不同的物理表:
|
||
|
||
| 逻辑表名 | admin | adminghd | admincpp |
|
||
|----------|-------|----------|----------|
|
||
| user | wechat_user | ghd_wechat_user | wechat_user |
|
||
| calculate_record | wechat_calculate_record | wechat_calculate_record | cpp_calculate_record |
|
||
| feedback | — | — | cpp_feedback |
|
||
| real_time_info | wechat_real_time_info | wechat_real_time_info | wechat_real_time_info |
|
||
|
||
> 注:ThinkPHP `Db::name('xxx')` 会自动添加 `t_sys_` 前缀,例如 `Db::name('wechat_user')` → `t_sys_wechat_user`
|
||
|
||
---
|
||
|
||
## 三、admincpp 模块 — 目录结构
|
||
|
||
```
|
||
application/admincpp/
|
||
├── common/
|
||
│ └── Base.php # 基类 (session 登录校验)
|
||
├── common.php # 模块公共函数
|
||
├── config.php # 模块配置
|
||
├── controller/
|
||
│ ├── Dashboard.php # 仪表盘 / 统计
|
||
│ ├── Files.php # 文件上传
|
||
│ ├── Index.php # 首页 / 菜单管理 API
|
||
│ ├── Login.php # 登录 / 退出 / 超时跳转
|
||
│ ├── Menu.php # 菜单管理 (CRUD)
|
||
│ ├── Wechatinfro.php # 用户列表 / 计算记录 / 反馈列表
|
||
│ └── Wechatset.php # 首页资讯管理
|
||
├── model/
|
||
│ ├── Permission.php # 权限模型
|
||
│ └── Role.php # 角色模型
|
||
└── view/
|
||
├── dashboard/
|
||
│ └── index.html # 系统概览页 (统计卡片)
|
||
├── login/
|
||
│ ├── login.html # 登录页
|
||
│ ├── logoutJump.html # 超时跳转页
|
||
│ └── nav.html # 主框架 (侧边栏+顶栏+iframe)
|
||
├── wechatinfro/
|
||
│ ├── feedbackList.html # 反馈列表
|
||
│ ├── userList.html # 用户列表
|
||
│ └── wechatRecordList.html# CPP 计算记录列表
|
||
└── wechatset/
|
||
├── realTimeInfo.html # 资讯列表
|
||
├── realTimeInfoAdd.html # 添加资讯
|
||
└── realTimeInfoUpdate.html # 编辑资讯
|
||
|
||
public/static/admincpp/
|
||
├── css/
|
||
│ ├── activity.css # 活动页样式
|
||
│ ├── index.css # 内容页样式 (table, main, head)
|
||
│ ├── login.css # 登录页样式
|
||
│ ├── nav.css # 主框架样式 (侧边栏+顶栏)
|
||
│ └── style.css # 全局基础样式 (reset)
|
||
├── js/
|
||
│ ├── common.js # 公共函数 (超时检测)
|
||
│ ├── jquery.js # jQuery
|
||
│ ├── menu.js # (废弃) 早期菜单组件
|
||
│ ├── nav.js # 主框架JS (菜单渲染、用户信息、退出)
|
||
│ ├── wechatinfro/
|
||
│ │ ├── feedbackList.js # 反馈列表 DataTable
|
||
│ │ ├── userList.js # 用户列表 DataTable
|
||
│ │ └── wechatRecordList.js # 计算记录 DataTable
|
||
│ └── wechatset/
|
||
│ ├── wechatRealTimeInfoAdd.js # 添加资讯
|
||
│ ├── wechatRealTimeInfoList.js # 资讯列表
|
||
│ └── wechatRealTimeInfoUpdate.js # 编辑资讯
|
||
├── img/
|
||
│ └── upload.png # 默认头像
|
||
└── layui/ # layUI 框架 (v2.x)
|
||
├── css/
|
||
├── font/
|
||
├── images/
|
||
├── lay/
|
||
└── layui.all.js
|
||
```
|
||
|
||
---
|
||
|
||
## 四、控制器详解
|
||
|
||
### 4.1 Login.php — 登录控制器
|
||
|
||
| 方法 | URL | Method | 说明 |
|
||
|------|-----|--------|------|
|
||
| index() | /admincpp/Login/index | GET | 渲染登录页 (未登录) 或导航框架 (已登录) |
|
||
| login() | /admincpp/Login/login | POST | 验证手机号+MD5密码,写入 session |
|
||
| logout() | /admincpp/Login/logout | POST | 清除 session,退出登录 |
|
||
| logoutJump() | /admincpp/Login/logoutJump | GET | 超时跳转提示页 |
|
||
|
||
**登录验证流程**:
|
||
1. 查询 `t_sys_user` 表:`phone=$username AND password=MD5($password) AND status=1 AND type=1`
|
||
2. 验证通过后设置 session:
|
||
- `admincpp_user_id` → 用户ID
|
||
- `admincpp_user_login_time` → `time() + 3600`
|
||
|
||
### 4.2 Dashboard.php — 仪表盘
|
||
|
||
| 方法 | URL | Method | 说明 |
|
||
|------|-----|--------|------|
|
||
| index() | /admincpp/Dashboard/index | GET | 渲染系统概览页 |
|
||
| getStatistics() | /admincpp/Dashboard/getStatistics | POST | 返回 JSON 统计数据 |
|
||
|
||
**统计返回字段**:
|
||
```json
|
||
{
|
||
"status": 1,
|
||
"data": {
|
||
"user_count": 87, // 微信用户总数
|
||
"today_user_count": 0, // 今日新增
|
||
"total_calculate_count": 19, // 累计计算次数
|
||
"info_count": 2, // 首页资讯数量
|
||
"last_calculate_time": "2026-07-18 15:37:53"
|
||
}
|
||
}
|
||
```
|
||
|
||
### 4.3 Wechatinfro.php — 数据管理
|
||
|
||
| 方法 | URL | Method | 说明 |
|
||
|------|-----|--------|------|
|
||
| wechatUserList() | /admincpp/Wechatinfro/wechatUserList | GET | 用户列表页 |
|
||
| getWechatUserList() | /admincpp/Wechatinfro/getWechatUserList | POST | 用户列表 JSON |
|
||
| wechatRecordList() | /admincpp/Wechatinfro/wechatRecordList | GET | 计算记录页 |
|
||
| getWechatRecordList() | /admincpp/Wechatinfro/getWechatRecordList | POST | 计算记录 JSON |
|
||
| feedbackList() | /admincpp/Wechatinfro/feedbackList | GET | 反馈列表页 |
|
||
| getFeedbackList() | /admincpp/Wechatinfro/getFeedbackList | POST | 反馈列表 JSON |
|
||
|
||
**计算记录列表字段** (对应 `t_sys_cpp_calculate_record`):
|
||
`id, name, bone_age, uterus_length, uterus_width, lh_peak, fsh_peak, fsh_3m, igf1, calculate_result, risk_level, create_time`
|
||
|
||
### 4.4 Wechatset.php — 资讯管理
|
||
|
||
| 方法 | URL | Method | 说明 |
|
||
|------|-----|--------|------|
|
||
| wechatRealTimeInfo() | /admincpp/Wechatset/wechatRealTimeInfo | GET | 资讯列表页 |
|
||
| wechatRealTimeInfoAdd() | /admincpp/Wechatset/wechatRealTimeInfoAdd | GET | 添加资讯页 |
|
||
| wechatRealTimeInfoUpdate() | /admincpp/Wechatset/wechatRealTimeInfoUpdate | GET | 编辑资讯页 |
|
||
| getWechatRealTimeInfoList() | /admincpp/Wechatset/getWechatRealTimeInfoList | POST | 资讯列表 JSON |
|
||
| saveWechatRealTimeInfo() | /admincpp/Wechatset/saveWechatRealTimeInfo | POST | 保存/更新资讯 |
|
||
| delWechatRealTimeInfo() | /admincpp/Wechatset/delWechatRealTimeInfo | POST | 删除资讯 |
|
||
| getRealTimeInfoDetail() | /admincpp/Wechatset/getRealTimeInfoDetail | POST | 获取单条资讯详情 |
|
||
|
||
### 4.5 Menu.php — 菜单管理
|
||
|
||
| 方法 | URL | 说明 |
|
||
|------|-----|------|
|
||
| getMenuList() | /admincpp/Menu/getMenuList | 获取菜单树 (一级+二级) |
|
||
| getUserInfor() | /admincpp/Menu/getUserInfor | 获取当前登录用户信息 |
|
||
| doaddMenu() | /admincpp/Menu/doaddMenu | 添加菜单项 |
|
||
| doupdMenu() | /admincpp/Menu/doupdMenu | 更新菜单项 |
|
||
| delMenu() | /admincpp/Menu/delMenu | 删除菜单项 |
|
||
|
||
### 4.6 Base.php — 登录校验基类
|
||
|
||
```php
|
||
class Base extends Controller {
|
||
protected function _initialize() {
|
||
if (!session('admincpp_user_id')) {
|
||
// 未登录 → 跳转超时页
|
||
return $this->error('您还未登录', url('Login/logoutJump'));
|
||
}
|
||
$log_time = session('admincpp_user_login_time') - time();
|
||
if ($log_time < 0) {
|
||
// 超时 → 清除 session → 跳转
|
||
Session::clear();
|
||
return $this->error('登录超时', url('Login/logoutJump'));
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
Dashboard、Wechatinfro、Wechatset、Menu 均继承 Base,需登录后才能访问。
|
||
|
||
---
|
||
|
||
## 五、前端框架 (nav.js) 工作流程
|
||
|
||
### 5.1 页面加载流程
|
||
|
||
```
|
||
Login 成功 → 设置 session → 跳转 /admincpp/Login/index
|
||
→ Login::index() 检测 session → 返回 nav.html
|
||
→ nav.html 加载 nav.css + nav.js
|
||
→ nav.js 初始化:
|
||
1. 设置默认 iframe 页面: /admincpp/Dashboard/index
|
||
2. AJAX 调用 /admincpp/Menu/getMenuList 获取菜单数据
|
||
3. AJAX 调用 /admincpp/Menu/getUserInfor 获取用户信息
|
||
4. MenuHtml() 渲染侧边栏菜单
|
||
5. 点击菜单 → 更新 iframe src
|
||
```
|
||
|
||
### 5.2 菜单 URL 转换
|
||
|
||
数据库共享 `t_sys_menu` 表,菜单 URL 默认为 `/admin/...`。nav.js 在渲染时自动转换:
|
||
|
||
```javascript
|
||
// nav.js 中的 URL 转换逻辑
|
||
data-url="${(child.url || '').replace('/admin/', '/admincpp/')}"
|
||
```
|
||
|
||
### 5.3 主框架布局
|
||
|
||
```
|
||
┌──────────────┬────────────────────────────────────┐
|
||
│ .layui-side │ .top_right │
|
||
│ (侧边栏导航) │ ┌ .header_title ──┬ .user_right ┐ │
|
||
│ │ │ 标题 │ 用户名 退出 │ │
|
||
│ .layui-side- │ └─────────────────┴─────────────┘ │
|
||
│ scroll │ │
|
||
│ │ .main_content │
|
||
│ ul#nav │ ┌──────────────────────────────┐ │
|
||
│ (菜单树) │ │ iframe#iframeId │ │
|
||
│ │ │ (加载各功能页面) │ │
|
||
│ │ │ │ │
|
||
│ │ └──────────────────────────────┘ │
|
||
└──────────────┴────────────────────────────────────┘
|
||
```
|
||
|
||
---
|
||
|
||
## 六、小程序 API (app/Cppwechat.php)
|
||
|
||
位于 `/application/app/controller/Cppwechat.php`,为 CPP 小程序提供后端接口。
|
||
|
||
### 6.1 API 列表
|
||
|
||
| 方法 | URL | 说明 |
|
||
|------|-----|------|
|
||
| selectRealtimeInfoList() | /app/Cppwechat/selectRealtimeInfoList | 首页资讯列表 |
|
||
| calculate() | /app/Cppwechat/calculate | CPP 生长减速预测计算 |
|
||
| selectRecordList() | /app/Cppwechat/selectRecordList | 计算历史记录 |
|
||
| deleteRecord() | /app/Cppwechat/deleteRecord | 删除计算记录 |
|
||
| submitFeedback() | /app/Cppwechat/submitFeedback | 提交意见反馈 |
|
||
| wechatLogin() | /app/Cppwechat/wechatLogin | 微信登录 |
|
||
| getToken() | /app/Cppwechat/getToken | 获取登录 Token |
|
||
| getUserBaseInfo() | /app/Cppwechat/getUserBaseInfo | 获取用户基本信息 |
|
||
|
||
### 6.2 预测模型公式
|
||
|
||
```
|
||
交互项 = 骨龄 × 子宫长
|
||
比值项 = LH峰值 / FSH峰值
|
||
log(FSH峰值) = ln(FSH峰值)
|
||
|
||
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))
|
||
```
|
||
|
||
### 6.3 输入参数
|
||
|
||
| 字段 | 说明 | 范围 | 单位 |
|
||
|------|------|------|------|
|
||
| bone_age | 初诊骨龄 | 5.0 – 13.0 | 岁 |
|
||
| uterus_length | 初诊子宫长 | 1.0 – 4.5 | cm |
|
||
| uterus_width | 初诊子宫宽 | 0.5 – 3.5 | cm |
|
||
| lh_peak | LH 峰值 | 0.5 – 90.0 | IU/L |
|
||
| fsh_peak | FSH 峰值 | 0.5 – 25.0 | IU/L |
|
||
| fsh_3m | 治疗3月FSH | 0.0 – 8.0 | IU/L |
|
||
| igf1 | 基础IGF-1 | 100 – 800 | ng/mL |
|
||
|
||
### 6.4 风险分级
|
||
|
||
| 等级 | 概率范围 | 临床建议 |
|
||
|------|----------|----------|
|
||
| 低风险 | p < 0.430 | 继续目前 GnRHa 治疗方案,常规6个月随访 |
|
||
| 中风险 | 0.430 ≤ p ≤ 0.572 | 缩短随访间隔至3个月,关注GV下降趋势 |
|
||
| 高风险 | p > 0.572 | 每2-3个月密切随访,尽早考虑 rhGH 联合干预 |
|
||
|
||
### 6.5 性能指标
|
||
|
||
- **AUC**: 0.718 (Bootstrap 矫正 0.687)
|
||
- **Hosmer-Lemeshow**: P = 0.909(校准优秀)
|
||
|
||
---
|
||
|
||
## 七、数据库表结构
|
||
|
||
### 7.1 t_sys_cpp_calculate_record(计算记录)
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| id | varchar(32) PK | MD5 唯一ID |
|
||
| uid | int(11) | 用户ID |
|
||
| name | varchar(32) | 患者姓名 |
|
||
| bone_age | decimal(5,2) | 初诊骨龄 |
|
||
| uterus_length | decimal(5,2) | 初诊子宫长 |
|
||
| uterus_width | decimal(5,2) | 初诊子宫宽 |
|
||
| lh_peak | decimal(6,2) | LH 峰值 |
|
||
| fsh_peak | decimal(6,2) | FSH 峰值 |
|
||
| fsh_3m | decimal(5,2) | 治疗3月 FSH |
|
||
| igf1 | decimal(7,2) | 基础 IGF-1 |
|
||
| calculate_result | decimal(6,4) | 预测概率 p |
|
||
| risk_level | varchar(10) | 风险等级 |
|
||
| create_time | datetime | 创建时间 |
|
||
|
||
### 7.2 t_sys_cpp_feedback(意见反馈)
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| id | int(11) PK AUTO_INCREMENT | 自增ID |
|
||
| uid | varchar(50) | 用户ID |
|
||
| content | text | 反馈内容 |
|
||
| create_time | datetime | 提交时间 |
|
||
|
||
### 7.3 t_sys_wechat_user(微信用户)
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| uid | int(11) PK AUTO_INCREMENT | 用户ID |
|
||
| openid | varchar(64) | 微信 OpenID |
|
||
| nickname | varchar(64) | 微信昵称 |
|
||
| headimg | varchar(200) | 头像URL |
|
||
| create_time | datetime | 注册时间 |
|
||
|
||
### 7.4 t_sys_user(后台管理员)
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| id | int(11) PK AUTO_INCREMENT | 管理员ID |
|
||
| user_name | varchar(125) | 姓名 |
|
||
| user_head | varchar(125) | 头像 |
|
||
| phone | varchar(11) | 手机号(登录账号) |
|
||
| password | varchar(64) | MD5 密码 |
|
||
| type | int(2) | 用户类型 (1=管理员) |
|
||
| status | int(2) | 状态 (1=正常) |
|
||
|
||
### 7.5 t_sys_menu(菜单配置 — 三模块共享)
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| id | varchar(32) PK | 菜单ID |
|
||
| pid | varchar(64) | 父级ID (0=一级) |
|
||
| menu_name | varchar(64) | 菜单名称 |
|
||
| url | varchar(255) | 菜单URL |
|
||
| seq_on | int(255) | 排序 |
|
||
| menu_icon | varchar(100) | 图标 |
|
||
|
||
当前菜单数据:
|
||
```
|
||
id=1 pid=0 menu_name=小程序
|
||
├── id=2 pid=1 menu_name=小程序设置 url=/admin/Wechatset/wechatRealTimeInfo
|
||
├── id=3 pid=1 menu_name=小程序注册用户 url=/admin/Wechatinfro/wechatUserList
|
||
└── id=4 pid=1 menu_name=计算记录 url=/admin/Wechatinfro/wechatRecordList
|
||
```
|
||
|
||
> 注:三个模块共享此表。各模块的 `nav.js` 会在渲染时自动将 `/admin/` 替换为各自的模块路径。
|
||
|
||
### 7.6 t_sys_wechat_real_time_info(首页资讯 — 三模块共享)
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| id | varchar(32) PK | 资讯ID |
|
||
| title_plain | varchar(255) | 标题 |
|
||
| thumbnail | varchar(125) | 缩略图 |
|
||
| excerpt_plain | text | 摘要 |
|
||
| url | varchar(125) | 详情链接 |
|
||
| create_time | datetime | 创建时间 |
|
||
|
||
---
|
||
|
||
## 八、登录凭证
|
||
|
||
| 后台 | URL | 账号 | 密码 |
|
||
|------|-----|------|------|
|
||
| CPP | http://101.43.95.130/admincpp/login | 13212345678 | 123456 |
|
||
| GHD | http://101.43.95.130/adminghd/login | 13212345678 | 123456 |
|
||
| 通用 | http://101.43.95.130/admin/login | 13212345678 | 123456 |
|
||
|
||
> 三个后台共用 `t_sys_user` 表,使用同一套账号密码。
|
||
|
||
---
|
||
|
||
## 九、服务器信息
|
||
|
||
| 项目 | 值 |
|
||
|------|-----|
|
||
| 服务器 IP | 101.43.95.130 |
|
||
| SSH 用户 | renjianbo / 123456 |
|
||
| Web 目录 | /www/wwwroot/code/ |
|
||
| PHP 版本 | PHP 7.x |
|
||
| 框架 | ThinkPHP 5.0 |
|
||
| 数据库 | MySQL (127.0.0.1), 库名 ruilai |
|
||
| 数据库用户 | rootrui / X2)jB+k%YH.p |
|
||
| Web 服务器 | Nginx |
|
||
| 管理面板 | 宝塔 (BT Panel) |
|