25 KiB
后台管理系统文档
项目名称: 瑞莱医疗后台管理系统
技术架构: ThinkPHP 5.0 + Layui + jQuery
数据库: MySQL
文档版本: v2.0
创建日期: 2025年1月28日
最后更新: 2025年1月29日(已完成逻辑彻底分离)
✅ 分离状态: 两个后台模块已实现逻辑彻底分离(方案一),可独立维护,互不影响。
- admin 模块:早熟预测后台,完全独立实现
- adminghd 模块:GHD预测后台,完全独立实现
- 两个模块不再依赖
common模块的业务基类
一、系统概述
1.1 系统简介
本系统为两个医疗小程序提供统一的后台管理服务:
-
女童成长发育早熟预测模型后台 (
admin模块)- 对应小程序:瑞莱医疗小程序
- 小程序AppID:
wx0847525a15342a46 - 访问路径:
/admin/
-
生长激素缺乏预测模型后台 (
adminghd模块)- 对应小程序:生长激素缺乏(GHD)预测模型小程序
- 小程序AppID:
wxa75a76964ae7ce73 - 访问路径:
/adminghd/
1.2 系统架构
┌─────────────────────────────────────────┐
│ 后台管理系统 │
├─────────────────────────────────────────┤
│ admin模块 adminghd模块 │
│ (早熟预测) (GHD预测) │
├─────────────────────────────────────────┤
│ 共同功能: │
│ - 登录认证 │
│ - 菜单管理 │
│ - 资讯管理 │
│ - 用户管理 │
│ - 计算记录管理 │
└─────────────────────────────────────────┘
二、系统架构
2.1 目录结构
/www/wwwroot/code/
├── application/ # 应用目录
│ ├── admin/ # 早熟预测后台模块
│ │ ├── controller/ # 控制器
│ │ │ ├── Login.php # 登录控制器
│ │ │ ├── Menu.php # 菜单管理
│ │ │ ├── Wechatset.php # 资讯管理
│ │ │ ├── Wechatinfro.php # 用户和记录管理
│ │ │ └── Dashboard.php # 仪表盘
│ │ ├── common/ # 公共类
│ │ │ └── Base.php # 基础控制器(登录验证)
│ │ └── view/ # 视图模板
│ │ ├── login/ # 登录相关视图
│ │ │ ├── login.html # 登录页
│ │ │ └── nav.html # 主框架页
│ │ ├── wechatset/ # 资讯管理视图
│ │ └── wechatinfro/ # 用户和记录视图
│ ├── adminghd/ # GHD预测后台模块
│ │ ├── controller/ # 控制器(结构同admin)
│ │ ├── common/ # 公共类
│ │ └── view/ # 视图模板
│ ├── app/ # 小程序API模块
│ │ └── controller/
│ │ ├── Ruilaiwechat.php # 瑞莱小程序API
│ │ └── Ghdwechat.php # GHD小程序API
│ └── common/ # 公共模块
│ ├── config/ # 配置类
│ │ └── BusinessConfig.php # 业务配置
│ └── controller/ # 公共控制器
│ ├── WechatsetBase.php # 资讯管理基类
│ ├── WechatinfroBase.php # 用户管理基类
│ └── DashboardBase.php # 仪表盘基类
├── public/ # 公共访问目录
│ ├── static/ # 静态资源
│ │ ├── admin/ # admin模块静态资源
│ │ │ ├── css/ # 样式文件
│ │ │ ├── js/ # JavaScript文件
│ │ │ └── layui/ # Layui框架
│ │ └── adminghd/ # adminghd模块静态资源
│ └── index.php # 入口文件
└── thinkphp/ # ThinkPHP框架核心
2.2 技术栈
- 后端框架: ThinkPHP 5.0
- 前端框架: Layui 2.x
- JavaScript库: jQuery
- 数据库: MySQL
- 会话管理: ThinkPHP Session
三、模块说明
3.1 admin 模块(早熟预测后台)
3.1.1 访问路径
- 登录页:
/admin/login - 主框架:
/admin/login/index(登录后自动跳转)
3.1.2 Session配置
- 用户ID键名:
admin_user_id - 登录时间键名:
admin_user_login_time - 超时时间:3600秒(1小时)
3.1.3 数据表映射
| 业务表 | 数据库表名 |
|---|---|
| 用户表 | wechat_user |
| 资讯表 | wechat_real_time_info |
| 计算记录表 | wechat_calculate_record |
| 菜单表 | menu |
| 管理员表 | user |
3.1.4 静态资源路径
- CSS:
/static/admin/css/ - JS:
/static/admin/js/ - Layui:
/static/admin/layui/
3.2 adminghd 模块(GHD预测后台)
3.2.1 访问路径
- 登录页:
/adminghd/login - 主框架:
/adminghd/login/index(登录后自动跳转)
3.2.2 Session配置
- 用户ID键名:
adminghd_user_id - 登录时间键名:
adminghd_user_login_time - 超时时间:3600秒(1小时)
3.2.3 数据表映射
| 业务表 | 数据库表名 |
|---|---|
| 用户表 | ghd_wechat_user |
| 资讯表 | wechat_real_time_info |
| 计算记录表 | wechat_calculate_record |
| 菜单表 | menu |
| 管理员表 | user |
3.2.4 静态资源路径
- CSS:
/static/adminghd/css/ - JS:
/static/adminghd/js/ - Layui:
/static/adminghd/layui/
四、功能模块
4.1 登录认证模块
4.1.1 登录功能
控制器: Login.php
登录流程:
- 用户访问登录页
/admin/login或/adminghd/login - 输入用户名(手机号)和密码
- 系统验证用户信息:
- 查询
user表 - 验证条件:
phone= 用户名,password= MD5(密码),status= 1,type= 1
- 查询
- 登录成功:
- 设置Session:
admin_user_id或adminghd_user_id - 设置登录时间:
admin_user_login_time或adminghd_user_login_time(当前时间 + 3600秒) - 返回JSON:
{'status':1, 'msg':'登录成功', 'token':1}
- 设置Session:
- 跳转到主框架页面
登录验证:
- 所有需要登录的页面继承
Base类 Base::_initialize()方法自动检查Session- 未登录或超时:跳转到登录页
4.1.2 退出功能
接口: /admin/Login/logout 或 /adminghd/Login/logout
功能:
- 清除所有Session数据
- 返回JSON:
{'status':1, 'msg':'退出成功'} - 前端跳转到登录页
4.2 菜单管理模块
4.2.1 菜单结构
数据表: menu
表结构:
id:菜单ID(主键)pid:父菜单ID(空或0表示一级菜单)menu_name:菜单名称url:菜单链接seq_on:排序序号menu_icon:菜单图标create_time:创建时间
菜单层级:
- 一级菜单:
pid为空或0 - 二级菜单:
pid指向一级菜单的id
4.2.2 获取菜单列表
接口: /admin/Menu/getMenuList 或 /adminghd/Menu/getMenuList
返回格式:
{
"status": 1,
"msg": "获取数据成功!!",
"data": [
{
"id": "xxx",
"pid": "",
"menu_name": "小程序设置",
"url": "",
"seq_on": 1,
"type": 1,
"children": [
{
"id": "yyy",
"pid": "xxx",
"menu_name": "首页资讯列表",
"url": "/admin/Wechatset/wechatRealTimeInfo",
"type": 2
}
]
}
]
}
4.2.3 菜单管理功能
- 添加菜单:
/admin/Menu/doaddMenu - 修改菜单:
/admin/Menu/doupdMenu - 删除菜单:
/admin/Menu/delMenu - 获取菜单详情:
/admin/Menu/updMenu
4.3 用户信息模块
4.3.1 获取当前用户信息
接口: /admin/Menu/getUserInfor 或 /adminghd/Menu/getUserInfor
返回格式:
{
"status": 1,
"msg": "查询成功",
"infro": {
"user_name": "管理员",
"user_head": "/static/admin/img/upload.png"
}
}
4.3.2 小程序注册用户管理
控制器: Wechatinfro.php
功能列表:
- 用户列表:
/admin/Wechatinfro/wechatUserList - 获取用户列表:
/admin/Wechatinfro/getWechatUserList
数据表:
- admin模块:
wechat_user - adminghd模块:
ghd_wechat_user
用户列表字段:
uid:用户IDnickname:用户昵称headimg:头像create_time:注册时间
搜索功能:
- 支持按昵称模糊搜索
4.4 资讯管理模块
4.4.1 资讯列表
控制器: Wechatset.php
功能列表:
- 资讯列表页:
/admin/Wechatset/wechatRealTimeInfo - 获取资讯列表:
/admin/Wechatset/getWechatRealTimeInfoList - 添加资讯页:
/admin/Wechatset/wechatRealTimeInfoAdd - 编辑资讯页:
/admin/Wechatset/wechatRealTimeInfoUpdate - 保存资讯:
/admin/Wechatset/saveWechatRealTimeInfo - 删除资讯:
/admin/Wechatset/delWechatRealTimeInfo - 获取资讯详情:
/admin/Wechatset/getRealTimeInfoDetail
数据表: wechat_real_time_info(两个模块共用)
资讯字段:
id:资讯IDtitle_plain:标题thumbnail:缩略图excerpt_plain:简介url:跳转链接create_time:创建时间
搜索功能:
- 支持按标题模糊搜索
4.4.2 资讯管理流程
-
添加资讯:
- 填写标题、上传图片、填写简介、填写跳转链接
- 系统自动生成ID(MD5(时间戳+随机数))
- 保存到数据库
-
编辑资讯:
- 根据ID获取资讯详情
- 修改后保存
-
删除资讯:
- 根据ID删除记录
4.5 计算记录管理模块
4.5.1 计算记录列表
控制器: Wechatinfro.php
功能列表:
- 记录列表页:
/admin/Wechatinfro/wechatRecordList - 获取记录列表:
/admin/Wechatinfro/getWechatRecordList
数据表: wechat_calculate_record(两个模块共用)
记录字段:
id:记录IDname:姓名age:年龄height:身高bone_age:骨龄father_height:父亲身高mother_height:母亲身高IGF:IGF-1值(GHD)或IGFBP-3值(早熟)LH:LH值(早熟)uterus_thickness:子宫厚度(早熟)calculate_resutlt:计算结果create_time:创建时间
搜索功能:
- 支持按姓名模糊搜索
4.6 仪表盘模块(Dashboard)
4.6.1 统计概览
控制器: Dashboard.php
功能列表:
- 仪表盘页面:
/admin/Dashboard/index - 获取统计数据:
/admin/Dashboard/getStatistics
统计数据:
- 注册用户数
- 首页资讯数量
- 最近一次计算时间
- 今日新增用户数
- 总计算次数
五、数据库设计
5.1 核心数据表
5.1.1 管理员表(user)
说明: 后台管理员账户表,两个模块共用
字段:
id:管理员ID(主键)user_name:管理员姓名phone:手机号(登录用户名)password:密码(MD5加密)user_head:头像status:状态(1=启用,0=禁用)type:类型(1=管理员)
5.1.2 菜单表(menu)
说明: 后台菜单配置表,两个模块共用
字段:
id:菜单ID(主键,MD5生成)pid:父菜单ID(空或0=一级菜单)menu_name:菜单名称url:菜单链接seq_on:排序序号menu_icon:菜单图标create_time:创建时间
5.1.3 小程序用户表
说明: 小程序注册用户表,两个模块使用不同的表
admin模块: wechat_user
adminghd模块: ghd_wechat_user
字段:
uid:用户ID(主键)openid:微信OpenIDnickname:用户昵称headimg:头像create_time:注册时间
5.1.4 资讯表(wechat_real_time_info)
说明: 首页资讯表,两个模块共用
字段:
id:资讯ID(主键,MD5生成)title_plain:标题thumbnail:缩略图URLexcerpt_plain:简介url:跳转链接create_time:创建时间
5.1.5 计算记录表(wechat_calculate_record)
说明: 预测计算记录表,两个模块共用
字段:
id:记录ID(主键,MD5生成)uid:用户IDname:姓名age:年龄height:身高(cm)bone_age:骨龄(年)father_height:父亲身高(cm)mother_height:母亲身高(cm)IGF:IGF-1值(GHD)或IGFBP-3值(早熟)LH:LH值(早熟预测)uterus_thickness:子宫厚度(早熟预测)calculate_resutlt:计算结果(JSON格式)create_time:创建时间
六、前端架构
6.1 主框架结构
文件: application/admin/view/login/nav.html 或 application/adminghd/view/login/nav.html
布局:
- 左侧导航栏:菜单列表
- 顶部栏:面包屑导航 + 用户信息 + 退出按钮
- 主内容区:iframe加载功能页面
6.2 导航菜单渲染
文件: public/static/admin/js/nav.js 或 public/static/adminghd/js/nav.js
功能:
- 页面加载时调用
/admin/Menu/getMenuList获取菜单数据 - 将菜单数据渲染为左侧导航栏
- 支持一级和二级菜单结构
- 点击菜单项,在iframe中加载对应页面
6.3 样式框架
CSS框架: Layui 2.x
主要样式文件:
nav.css:主框架样式login.css:登录页样式index.css:列表页样式
七、API接口
7.1 登录相关
| 接口 | 方法 | 说明 |
|---|---|---|
/admin/Login/index |
GET | 登录页 |
/admin/Login/login |
POST | 登录验证 |
/admin/Login/logout |
POST | 退出登录 |
/admin/Login/logoutJump |
GET | 超时跳转页 |
7.2 菜单相关
| 接口 | 方法 | 说明 |
|---|---|---|
/admin/Menu/getMenuList |
POST | 获取菜单列表 |
/admin/Menu/getUserInfor |
POST | 获取当前用户信息 |
/admin/Menu/doaddMenu |
POST | 添加菜单 |
/admin/Menu/doupdMenu |
POST | 修改菜单 |
/admin/Menu/delMenu |
POST | 删除菜单 |
7.3 用户管理
| 接口 | 方法 | 说明 |
|---|---|---|
/admin/Wechatinfro/wechatUserList |
GET | 用户列表页 |
/admin/Wechatinfro/getWechatUserList |
POST | 获取用户列表 |
7.4 资讯管理
| 接口 | 方法 | 说明 |
|---|---|---|
/admin/Wechatset/wechatRealTimeInfo |
GET | 资讯列表页 |
/admin/Wechatset/getWechatRealTimeInfoList |
POST | 获取资讯列表 |
/admin/Wechatset/wechatRealTimeInfoAdd |
GET | 添加资讯页 |
/admin/Wechatset/wechatRealTimeInfoUpdate |
GET | 编辑资讯页 |
/admin/Wechatset/saveWechatRealTimeInfo |
POST | 保存资讯 |
/admin/Wechatset/delWechatRealTimeInfo |
POST | 删除资讯 |
/admin/Wechatset/getRealTimeInfoDetail |
POST | 获取资讯详情 |
7.5 计算记录
| 接口 | 方法 | 说明 |
|---|---|---|
/admin/Wechatinfro/wechatRecordList |
GET | 记录列表页 |
/admin/Wechatinfro/getWechatRecordList |
POST | 获取记录列表 |
7.6 仪表盘
| 接口 | 方法 | 说明 |
|---|---|---|
/admin/Dashboard/index |
GET | 仪表盘页面 |
/admin/Dashboard/getStatistics |
POST | 获取统计数据 |
八、安全机制
8.1 登录验证
- 所有需要登录的控制器继承
Base类 Base::_initialize()自动检查Session- 未登录或超时自动跳转到登录页
8.2 密码加密
- 密码使用MD5加密存储
- 登录时对输入密码进行MD5加密后比对
8.3 Session管理
- 登录成功设置Session,有效期1小时
- 每次请求检查Session是否过期
- 退出登录清除所有Session
8.4 权限控制
- 当前版本未实现细粒度权限控制
- 所有登录用户拥有相同权限
- 预留权限控制接口(代码中已注释)
九、部署说明
9.1 环境要求
- PHP >= 5.6
- MySQL >= 5.6
- Apache/Nginx Web服务器
- ThinkPHP 5.0框架
9.2 配置说明
9.2.1 数据库配置
文件: application/database.php
return [
'type' => 'mysql',
'hostname' => '127.0.0.1',
'database' => 'ruilai',
'username' => 'rootrui',
'password' => 'X2)jB+k%YH.p',
'charset' => 'utf8',
'prefix' => 't_sys_',
];
9.2.2 路由配置
文件: application/route.php
默认使用ThinkPHP的路由规则,URL格式:
/模块/控制器/方法
例如:
/admin/Login/index→application/admin/controller/Login.php::index()
9.3 静态资源
静态资源存放在 public/static/ 目录下,通过Web服务器直接访问。
访问路径:
/static/admin/css/nav.css/static/adminghd/js/nav.js
十、常见问题
10.1 登录问题
问题: 登录后立即跳转到登录页
原因: Session未正确设置或Base类验证失败
解决:
- 检查Session配置
- 检查Base类的Session键名是否正确
- 检查数据库用户表数据
10.2 菜单不显示
问题: 左侧导航栏菜单不显示
原因:
- 菜单数据未正确返回
- JavaScript渲染错误
- 菜单表数据为空
解决:
- 检查浏览器控制台错误
- 检查
/admin/Menu/getMenuList接口返回 - 检查
menu表是否有数据
10.3 数据表不存在
问题: 提示数据表不存在
原因: 数据库表前缀配置错误
解决:
- 检查
application/database.php中的prefix配置 - 确认数据库表名是否正确(包含前缀)
十一、开发规范
11.1 代码规范
- 遵循PSR-2编码规范
- 控制器类名首字母大写
- 方法名使用驼峰命名
- 注释使用PHPDoc格式
11.2 命名规范
- 控制器: 大驼峰,如
Wechatset.php - 方法: 小驼峰,如
getWechatUserList() - 数据表: 小写下划线,如
wechat_user - Session键: 小写下划线,如
admin_user_id
11.3 文件组织
- 控制器放在
controller/目录 - 视图放在
view/目录 - 静态资源放在
public/static/目录 - 公共类放在
common/目录
十二、后续优化建议
12.1 代码优化
- 统一公共逻辑: 将两个模块的公共代码提取到
common模块 - 配置统一管理: 使用配置文件管理业务类型和表映射
- 错误处理: 统一异常处理和错误返回格式
12.2 功能增强
- 权限管理: 实现基于角色的权限控制(RBAC)
- 操作日志: 记录管理员操作日志
- 数据统计: 增加更详细的数据统计和报表功能
- 批量操作: 支持批量删除、批量导出等功能
12.3 性能优化
- 缓存机制: 菜单数据、统计数据使用缓存
- 数据库优化: 添加索引,优化查询语句
- 前端优化: 压缩静态资源,使用CDN
十三、后台模块彻底分离维护方案
两个后台(admin 早熟预测、adminghd GHD 预测)可以做到彻底分离维护,互不影响。根据目标不同,有两种做法。
13.1 分离状态
✅ 已完成逻辑彻底分离(方案一)
| 模块 | 状态 | 说明 |
|---|---|---|
| admin 模块 | ✅ 已独立 | 所有控制器继承 app\admin\common\Base,不再依赖 common 模块 |
| adminghd 模块 | ✅ 已独立 | 所有控制器继承 app\adminghd\common\Base,不再依赖 common 模块 |
| Dashboard | ✅ 已独立 | 两个模块的 Dashboard 控制器各自实现 getStatistics 方法,使用固定的表名 |
| 数据库 | 共用 | 同一库 ruilai,同一前缀 t_sys_;部分表共用(menu、wechat_real_time_info、wechat_calculate_record),用户表不同(wechat_user / ghd_wechat_user) |
| 入口与框架 | 共用 | 同一 public/index.php、同一 ThinkPHP 应用目录 |
已解除的耦合:
- ✅
Dashboard不再继承DashboardBase - ✅ 表名和 Session 键已硬编码到各自控制器中
- ✅ 两个模块可独立修改,互不影响
13.2 方案一:同仓库内逻辑彻底分离(✅ 已采用)
目标:同一套代码、同一部署,但 admin 与 adminghd 在代码上完全独立,改一个模块不会牵动另一个,也不依赖 common 里的业务基类。
实施状态: ✅ 已完成
已完成的修改:
-
✅ 解除 Dashboard 对 common 的依赖
application/admin/controller/Dashboard.php已改为继承\app\admin\common\Base,不再继承DashboardBase。getStatistics方法已独立实现,使用固定的表名wechat_user、wechat_real_time_info、wechat_calculate_record。application/adminghd/controller/Dashboard.php已改为继承\app\adminghd\common\Base,使用固定的表名ghd_wechat_user、wechat_real_time_info、wechat_calculate_record。
-
✅ 代码独立性验证
- 两个模块的控制器已完全独立,不再依赖
app\common\controller\*Base和BusinessConfig。 - 表名和 Session 键已硬编码到各自控制器中。
- 两个模块的控制器已完全独立,不再依赖
-
✅ common 模块保留
common模块中的基类(DashboardBase、WechatinfroBase、WechatsetBase)已保留,但不再被使用。- 可作为参考或未来新后台的模板,但不影响现有两个模块的独立性。
优点:✅ 部署不变、数据库不变,只改一处不影响另一处,适合继续同仓库、同服务器维护。
维护约定:两个模块独立维护,如需同步功能,需分别在两个模块中实现。建议在代码注释中标注需要同步的功能点。
13.3 方案二:拆成两个独立项目(物理分离)
目标:两套独立代码库、可独立部署、独立发版,甚至不同服务器、不同数据库。
思路:
- 以当前代码为基准,复制出两份项目:一份只保留 admin 相关(及 app、index 等必要模块),一份只保留 adminghd 相关。
- 每份项目有独立
application、独立入口(可共用同一public或各建各的)、独立配置与依赖。
具体步骤:
-
项目 A(早熟预测后台)
- 新建目录如
code-admin,保留 ThinkPHP 框架、public、application/database.php等。 - 只保留
application/admin、application/app(瑞莱小程序 API)、application/index等与早熟业务相关的模块;删除application/adminghd和application/common中业务相关部分。 - 将原 admin 内对表名、Session 的写法固定为早熟业务(wechat_user、admin_user_id 等)。
- 配置独立入口(如
code-admin/public/index.php)和独立域名或路径。
- 新建目录如
-
项目 B(GHD 预测后台)
- 新建目录如
code-adminghd,同样保留框架与必要目录。 - 只保留
application/adminghd、application/app(GHD 小程序 API)等;删除application/admin和 common 业务基类。 - 表名、Session 固定为 GHD(ghd_wechat_user、adminghd_user_id 等)。
- 配置独立入口与访问方式。
- 新建目录如
-
数据库
- 选项甲:仍用同一库,两项目连同一
database.php,仅模块不同、访问表不同。 - 选项乙:分库(如
ruilai与ruilai_ghd),各项目独立database.php,表结构可复制或迁移脚本分表。
- 选项甲:仍用同一库,两项目连同一
-
静态资源
- 各项目
public/static下只保留本后台所需(如项目 A 只保留admin,项目 B 只保留adminghd),避免混用。
- 各项目
优点:版本、上线、回滚完全独立,技术栈升级可分批进行。
缺点:两套代码、两套部署与运维;公共 bug 或需求要改两处,需通过复制或少量共享库(如 composer 私有包)来收敛。
13.4 选择建议
| 场景 | 建议 |
|---|---|
| 希望少动部署、少动库,只希望开发时互不干扰 | 采用 方案一(同仓库逻辑分离) |
| 需要独立域名、独立服务器、独立发版节奏 | 采用 方案二(拆成两个项目) |
| 未来可能新增更多“类似后台”且希望复用一套基类 | 可保留 common 基类,仅把 admin、adminghd 改为不继承它们,实现“可选复用、默认分离” |
实施完成日期: 2025年1月29日
采用的方案: 方案一(同仓库内逻辑彻底分离)
状态: ✅ 已完成,两个模块已完全独立,可独立维护
附录
A. 相关文档
B. 联系方式
如有问题,请联系开发团队。
文档生成时间: 2025年1月28日
最后更新: 2025年1月28日