Files
code/后台架构文档.md

458 lines
19 KiB
Markdown
Raw 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 生长减速预测模型 — 后台架构文档
## 一、系统总览
```
┌──────────────────────────────────────────────────────────────────────┐
│ 客户端 (微信小程序) │
│ ├── 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) |