# 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) |