Files
code/后台架构文档.md

19 KiB
Raw Permalink Blame History

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 实现:

// /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 统计数据

统计返回字段:

{
  "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 — 登录校验基类

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 在渲染时自动转换:

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