a
This commit is contained in:
822
(红头)后台文档.md
Normal file
822
(红头)后台文档.md
Normal file
@@ -0,0 +1,822 @@
|
||||
# 后台管理系统文档
|
||||
|
||||
**项目名称:** 瑞莱医疗后台管理系统
|
||||
**技术架构:** ThinkPHP 5.0 + Layui + jQuery
|
||||
**数据库:** MySQL
|
||||
**文档版本:** v2.0
|
||||
**创建日期:** 2025年1月28日
|
||||
**最后更新:** 2025年1月29日(已完成逻辑彻底分离)
|
||||
|
||||
> **✅ 分离状态:** 两个后台模块已实现**逻辑彻底分离**(方案一),可独立维护,互不影响。
|
||||
> - **admin 模块**:早熟预测后台,完全独立实现
|
||||
> - **adminghd 模块**:GHD预测后台,完全独立实现
|
||||
> - 两个模块不再依赖 `common` 模块的业务基类
|
||||
|
||||
---
|
||||
|
||||
## 一、系统概述
|
||||
|
||||
### 1.1 系统简介
|
||||
|
||||
本系统为两个医疗小程序提供统一的后台管理服务:
|
||||
|
||||
1. **女童成长发育早熟预测模型后台** (`admin` 模块)
|
||||
- 对应小程序:瑞莱医疗小程序
|
||||
- 小程序AppID: `wx0847525a15342a46`
|
||||
- 访问路径:`/admin/`
|
||||
|
||||
2. **生长激素缺乏预测模型后台** (`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`
|
||||
|
||||
**登录流程:**
|
||||
1. 用户访问登录页 `/admin/login` 或 `/adminghd/login`
|
||||
2. 输入用户名(手机号)和密码
|
||||
3. 系统验证用户信息:
|
||||
- 查询 `user` 表
|
||||
- 验证条件:`phone` = 用户名,`password` = MD5(密码),`status` = 1,`type` = 1
|
||||
4. 登录成功:
|
||||
- 设置Session:`admin_user_id` 或 `adminghd_user_id`
|
||||
- 设置登录时间:`admin_user_login_time` 或 `adminghd_user_login_time`(当前时间 + 3600秒)
|
||||
- 返回JSON:`{'status':1, 'msg':'登录成功', 'token':1}`
|
||||
5. 跳转到主框架页面
|
||||
|
||||
**登录验证:**
|
||||
- 所有需要登录的页面继承 `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`
|
||||
|
||||
**返回格式:**
|
||||
```json
|
||||
{
|
||||
"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`
|
||||
|
||||
**返回格式:**
|
||||
```json
|
||||
{
|
||||
"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`:用户ID
|
||||
- `nickname`:用户昵称
|
||||
- `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`:资讯ID
|
||||
- `title_plain`:标题
|
||||
- `thumbnail`:缩略图
|
||||
- `excerpt_plain`:简介
|
||||
- `url`:跳转链接
|
||||
- `create_time`:创建时间
|
||||
|
||||
**搜索功能:**
|
||||
- 支持按标题模糊搜索
|
||||
|
||||
#### 4.4.2 资讯管理流程
|
||||
|
||||
1. **添加资讯:**
|
||||
- 填写标题、上传图片、填写简介、填写跳转链接
|
||||
- 系统自动生成ID(MD5(时间戳+随机数))
|
||||
- 保存到数据库
|
||||
|
||||
2. **编辑资讯:**
|
||||
- 根据ID获取资讯详情
|
||||
- 修改后保存
|
||||
|
||||
3. **删除资讯:**
|
||||
- 根据ID删除记录
|
||||
|
||||
### 4.5 计算记录管理模块
|
||||
|
||||
#### 4.5.1 计算记录列表
|
||||
|
||||
**控制器:** `Wechatinfro.php`
|
||||
|
||||
**功能列表:**
|
||||
- **记录列表页:** `/admin/Wechatinfro/wechatRecordList`
|
||||
- **获取记录列表:** `/admin/Wechatinfro/getWechatRecordList`
|
||||
|
||||
**数据表:** `wechat_calculate_record`(两个模块共用)
|
||||
|
||||
**记录字段:**
|
||||
- `id`:记录ID
|
||||
- `name`:姓名
|
||||
- `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`:微信OpenID
|
||||
- `nickname`:用户昵称
|
||||
- `headimg`:头像
|
||||
- `create_time`:注册时间
|
||||
|
||||
#### 5.1.4 资讯表(wechat_real_time_info)
|
||||
|
||||
**说明:** 首页资讯表,两个模块共用
|
||||
|
||||
**字段:**
|
||||
- `id`:资讯ID(主键,MD5生成)
|
||||
- `title_plain`:标题
|
||||
- `thumbnail`:缩略图URL
|
||||
- `excerpt_plain`:简介
|
||||
- `url`:跳转链接
|
||||
- `create_time`:创建时间
|
||||
|
||||
#### 5.1.5 计算记录表(wechat_calculate_record)
|
||||
|
||||
**说明:** 预测计算记录表,两个模块共用
|
||||
|
||||
**字段:**
|
||||
- `id`:记录ID(主键,MD5生成)
|
||||
- `uid`:用户ID
|
||||
- `name`:姓名
|
||||
- `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`
|
||||
|
||||
**功能:**
|
||||
1. 页面加载时调用 `/admin/Menu/getMenuList` 获取菜单数据
|
||||
2. 将菜单数据渲染为左侧导航栏
|
||||
3. 支持一级和二级菜单结构
|
||||
4. 点击菜单项,在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`
|
||||
|
||||
```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类验证失败
|
||||
|
||||
**解决:**
|
||||
1. 检查Session配置
|
||||
2. 检查Base类的Session键名是否正确
|
||||
3. 检查数据库用户表数据
|
||||
|
||||
### 10.2 菜单不显示
|
||||
|
||||
**问题:** 左侧导航栏菜单不显示
|
||||
|
||||
**原因:**
|
||||
1. 菜单数据未正确返回
|
||||
2. JavaScript渲染错误
|
||||
3. 菜单表数据为空
|
||||
|
||||
**解决:**
|
||||
1. 检查浏览器控制台错误
|
||||
2. 检查 `/admin/Menu/getMenuList` 接口返回
|
||||
3. 检查 `menu` 表是否有数据
|
||||
|
||||
### 10.3 数据表不存在
|
||||
|
||||
**问题:** 提示数据表不存在
|
||||
|
||||
**原因:** 数据库表前缀配置错误
|
||||
|
||||
**解决:**
|
||||
1. 检查 `application/database.php` 中的 `prefix` 配置
|
||||
2. 确认数据库表名是否正确(包含前缀)
|
||||
|
||||
---
|
||||
|
||||
## 十一、开发规范
|
||||
|
||||
### 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 代码优化
|
||||
|
||||
1. **统一公共逻辑:** 将两个模块的公共代码提取到 `common` 模块
|
||||
2. **配置统一管理:** 使用配置文件管理业务类型和表映射
|
||||
3. **错误处理:** 统一异常处理和错误返回格式
|
||||
|
||||
### 12.2 功能增强
|
||||
|
||||
1. **权限管理:** 实现基于角色的权限控制(RBAC)
|
||||
2. **操作日志:** 记录管理员操作日志
|
||||
3. **数据统计:** 增加更详细的数据统计和报表功能
|
||||
4. **批量操作:** 支持批量删除、批量导出等功能
|
||||
|
||||
### 12.3 性能优化
|
||||
|
||||
1. **缓存机制:** 菜单数据、统计数据使用缓存
|
||||
2. **数据库优化:** 添加索引,优化查询语句
|
||||
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 里的业务基类。
|
||||
|
||||
**实施状态:** ✅ **已完成**
|
||||
|
||||
**已完成的修改:**
|
||||
|
||||
1. **✅ 解除 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`。
|
||||
|
||||
2. **✅ 代码独立性验证**
|
||||
- 两个模块的控制器已完全独立,不再依赖 `app\common\controller\*Base` 和 `BusinessConfig`。
|
||||
- 表名和 Session 键已硬编码到各自控制器中。
|
||||
|
||||
3. **✅ common 模块保留**
|
||||
- `common` 模块中的基类(`DashboardBase`、`WechatinfroBase`、`WechatsetBase`)已保留,但不再被使用。
|
||||
- 可作为参考或未来新后台的模板,但不影响现有两个模块的独立性。
|
||||
|
||||
**优点**:✅ 部署不变、数据库不变,只改一处不影响另一处,适合继续同仓库、同服务器维护。
|
||||
**维护约定**:两个模块独立维护,如需同步功能,需分别在两个模块中实现。建议在代码注释中标注需要同步的功能点。
|
||||
|
||||
---
|
||||
|
||||
### 13.3 方案二:拆成两个独立项目(物理分离)
|
||||
|
||||
**目标**:两套独立代码库、可独立部署、独立发版,甚至不同服务器、不同数据库。
|
||||
|
||||
**思路**:
|
||||
- 以当前代码为基准,复制出两份项目:一份只保留 admin 相关(及 app、index 等必要模块),一份只保留 adminghd 相关。
|
||||
- 每份项目有独立 `application`、独立入口(可共用同一 `public` 或各建各的)、独立配置与依赖。
|
||||
|
||||
**具体步骤**:
|
||||
|
||||
1. **项目 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`)和独立域名或路径。
|
||||
|
||||
2. **项目 B(GHD 预测后台)**
|
||||
- 新建目录如 `code-adminghd`,同样保留框架与必要目录。
|
||||
- 只保留 `application/adminghd`、`application/app`(GHD 小程序 API)等;删除 `application/admin` 和 common 业务基类。
|
||||
- 表名、Session 固定为 GHD(ghd_wechat_user、adminghd_user_id 等)。
|
||||
- 配置独立入口与访问方式。
|
||||
|
||||
3. **数据库**
|
||||
- **选项甲**:仍用同一库,两项目连同一 `database.php`,仅模块不同、访问表不同。
|
||||
- **选项乙**:分库(如 `ruilai` 与 `ruilai_ghd`),各项目独立 `database.php`,表结构可复制或迁移脚本分表。
|
||||
|
||||
4. **静态资源**
|
||||
- 各项目 `public/static` 下只保留本后台所需(如项目 A 只保留 `admin`,项目 B 只保留 `adminghd`),避免混用。
|
||||
|
||||
**优点**:版本、上线、回滚完全独立,技术栈升级可分批进行。
|
||||
**缺点**:两套代码、两套部署与运维;公共 bug 或需求要改两处,需通过复制或少量共享库(如 composer 私有包)来收敛。
|
||||
|
||||
---
|
||||
|
||||
### 13.4 选择建议
|
||||
|
||||
| 场景 | 建议 |
|
||||
|------|------|
|
||||
| 希望**少动部署、少动库**,只希望开发时互不干扰 | 采用 **方案一**(同仓库逻辑分离) |
|
||||
| 需要**独立域名、独立服务器、独立发版节奏** | 采用 **方案二**(拆成两个项目) |
|
||||
| 未来可能新增更多“类似后台”且希望复用一套基类 | 可保留 common 基类,仅把 admin、adminghd 改为不继承它们,实现“可选复用、默认分离” |
|
||||
|
||||
**实施完成日期:** 2025年1月29日
|
||||
**采用的方案:** 方案一(同仓库内逻辑彻底分离)
|
||||
**状态:** ✅ 已完成,两个模块已完全独立,可独立维护
|
||||
|
||||
---
|
||||
|
||||
## 附录
|
||||
|
||||
### A. 相关文档
|
||||
|
||||
- [数据库配置文档](./数据库配置.md)
|
||||
- [生长激素缺乏预测模型项目需求文档](./生长激素缺乏预测模型项目需求文档.md)
|
||||
|
||||
### B. 联系方式
|
||||
|
||||
如有问题,请联系开发团队。
|
||||
|
||||
---
|
||||
|
||||
**文档生成时间:** 2025年1月28日
|
||||
**最后更新:** 2025年1月28日
|
||||
@@ -1,143 +1,106 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<meta charset="utf-8" />
|
||||
<meta name="renderer" content="webkit|ie-comp|ie-stand">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no">
|
||||
<meta http-equiv="Cache-Control" content="no-siteapp">
|
||||
<title>用户登录</title>
|
||||
<title>登录 - 女童成长发育早熟预测模型后台</title>
|
||||
<link rel="stylesheet" type="text/css" href="/static/admin/css/style.css" />
|
||||
<link rel="stylesheet" type="text/css" href="/static/admin/css/login.css" />
|
||||
</head>
|
||||
<style>
|
||||
.login-top .tbb{ font-size:18px; font-weight:bold; position:absolute; bottom:0; left:195px; color:#FFD200;}
|
||||
.login-wrap { min-height: 100vh; display: flex; align-items: center; justify-content: center; background: linear-gradient(135deg, #667eea 0%, #764ba2 50%, #f093fb 100%); padding: 20px; box-sizing: border-box; }
|
||||
.login-card { width: 100%; max-width: 400px; background: #fff; border-radius: 16px; box-shadow: 0 20px 60px rgba(0,0,0,0.2); overflow: hidden; }
|
||||
.login-card .login-header { padding: 36px 24px 24px; text-align: center; border-bottom: 1px solid #f0f0f0; }
|
||||
.login-card .login-title { font-size: 18px; font-weight: 600; color: #1f2d3d; line-height: 1.5; margin: 0; }
|
||||
.login-card .login-body { padding: 32px 28px 40px; }
|
||||
.login-card .form-item { margin-bottom: 22px; }
|
||||
.login-card .form-item input { width: 100%; height: 48px; padding: 0 16px; border: 1px solid #e0e0e0; border-radius: 8px; font-size: 15px; color: #333; background: #fafafa; box-sizing: border-box; transition: border-color .2s, background .2s; }
|
||||
.login-card .form-item input::placeholder { color: #aaa; }
|
||||
.login-card .form-item input:focus { outline: none; border-color: #667eea; background: #fff; }
|
||||
.login-card .form-item .warning { display: block; margin-top: 6px; font-size: 12px; color: #e4393c; min-height: 18px; }
|
||||
.login-card .btn-login { width: 100%; height: 48px; border: none; border-radius: 8px; font-size: 16px; font-weight: 500; color: #fff; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); cursor: pointer; transition: opacity .2s, transform .05s; }
|
||||
.login-card .btn-login:hover { opacity: 0.95; }
|
||||
.login-card .btn-login:active { transform: scale(0.99); }
|
||||
#cover.modal { display: none !important; line-height: 100vh; text-align: center; position: fixed; top: 0; right: 0; bottom: 0; left: 0; background: rgba(0,0,0,0.6); z-index: 9999; color: #fff; font-size: 18px; }
|
||||
#cover.modal.show { display: flex !important; align-items: center; justify-content: center; }
|
||||
</style>
|
||||
<body style='min-width:1235px'>
|
||||
<div style='height:100px;'></div>
|
||||
<div style='background:#e3e3e3;height:450px;width:100%;position:relative;'>
|
||||
<div style='width:350px;height:400px;background:#EDF1F5;float:right;margin-right:20%;margin-top:1.5%;box-shadow:#666 0px 0px 20px;'>
|
||||
<div class="login-top" style="padding-bottom:0;">
|
||||
<div style='color:#453A3E;margin:30px auto 10px auto;width:auto;max-width:90%;font-size:16px;font-weight:bold;text-align:center;padding:0 10px;'>女童成长发育早熟预测模型后台</div>
|
||||
</div>
|
||||
<div style='height:1px;width:100%;background:#DEDCDD;'>
|
||||
<div style='background:#e3e3e3;height:3px;width:80%;margin:0px auto 0 auto;'></div>
|
||||
</head>
|
||||
<body>
|
||||
<div class="login-wrap">
|
||||
<div class="login-card">
|
||||
<div class="login-header">
|
||||
<h1 class="login-title">女童成长发育早熟预测模型后台</h1>
|
||||
</div>
|
||||
<div class="login-body">
|
||||
<form method="post" id="agent_login" name="login">
|
||||
<div class="login-content">
|
||||
<ul class="user-logn">
|
||||
<li class="user-jobnum" style='width:100%;margin-bottom:0px;'>
|
||||
<div class="li-bg error" style='width:100%;'>
|
||||
<label></label>
|
||||
<input type="text" id="username" name="username" placeholder="请输入账号" value="" validate="" validatename="工号" class="phonecode" style='width:83%;padding-right:0px;background:#EDF1F5;height:40px;border:2px solid balck;border-radius:4px;'/>
|
||||
<div class="form-item">
|
||||
<input type="text" id="username" name="username" placeholder="请输入账号" value="" autocomplete="username" />
|
||||
<span id="checkusername" class="warning"></span>
|
||||
</div>
|
||||
</li>
|
||||
<li class="pwd" style='width:100%;margin-bottom:0px;'>
|
||||
<div class="li-bg " style='width:100%;'>
|
||||
<label></label>
|
||||
<input type="password" style="width: 0;height: 0;border: none;" name="">
|
||||
<input type="password" autocomplete="off" id="admin_password" name="password" class="pwd" placeholder="请输入密码" validate="" validatename="密码" style='border:2px solid balck;width:83%;padding-right:0px;background:#EDF1F5;height:40px;border-radius:4px;'>
|
||||
<div class="form-item">
|
||||
<input type="password" style="width:0;height:0;border:none;position:absolute;opacity:0;" name="" tabindex="-1" />
|
||||
<input type="password" autocomplete="off" id="admin_password" name="password" placeholder="请输入密码" />
|
||||
<span id="checkpassword" class="warning"></span>
|
||||
</div>
|
||||
</li>
|
||||
<li style="margin-top:40px;width:100%;">
|
||||
<button type="submit" name="dologinbtn" style='background:#afaeb2;border-radius:4px;height:35px;width:100%;' class="actLogin" onclick="return checklogin(this.form);">立即登录</button>
|
||||
<div class="form-item" style="margin-bottom:0;margin-top:28px;">
|
||||
<button type="submit" name="dologinbtn" class="btn-login" onclick="return checklogin(this.form);">立即登录</button>
|
||||
<input type="hidden" name="loginsubmit" value="true" />
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div id="cover" class="modal">身份获取中。。。</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="cover" class="modal" style="display:none !important;">身份获取中...</div>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
<script type="text/javascript" src="/static/admin/js/jquery.js"></script>
|
||||
<script>
|
||||
var _login_time = -1;
|
||||
var _user_type = '';
|
||||
|
||||
function checklogin(form){
|
||||
var username = $('username').value;
|
||||
var pwd = $('password').value;
|
||||
var phonenumFlg = true;
|
||||
var pwdFlg = true;
|
||||
//var codeFlg = true;
|
||||
if(form.username.value == null || form.username.value == ""){
|
||||
$('#checkusername').empty();
|
||||
$('#checkusername').append(' 账号不能为空!');
|
||||
$('#checkusername').addClass("warning");
|
||||
if(!form.username.value || form.username.value.trim() === ''){
|
||||
$('#checkusername').text('账号不能为空').addClass("warning");
|
||||
phonenumFlg = false;
|
||||
return phonenumFlg;
|
||||
} else {
|
||||
$('#checkusername').empty();
|
||||
// $('#checkusername').append('<img src="/images/base/check_right.gif" width="13" height="13">');
|
||||
$('#checkusername').addClass("warning");
|
||||
}
|
||||
if(form.password.value == null || form.password.value == ""){
|
||||
$('#checkpassword').empty();
|
||||
$('#checkpassword').append(' 密码不能为空!');
|
||||
$('#checkpassword').addClass("warning");
|
||||
if(!form.password.value || form.password.value === ''){
|
||||
$('#checkpassword').text('密码不能为空').addClass("warning");
|
||||
pwdFlg = false;
|
||||
return pwdFlg;
|
||||
} else {
|
||||
$('#checkpassword').empty();
|
||||
// $('#checkpassword').append('<img src="/images/base/check_right.gif" width="13" height="13">');
|
||||
$('#checkpassword').addClass("warning");
|
||||
}
|
||||
if(phonenumFlg == true && pwdFlg == true){
|
||||
// alert(11);
|
||||
$("#agent_login").submit(function(event) {
|
||||
event.preventDefault(); // 阻止表单默认提交行为
|
||||
if(phonenumFlg && pwdFlg){
|
||||
$("#agent_login").off('submit').on("submit", function(event) {
|
||||
event.preventDefault();
|
||||
var $cover = $('#cover');
|
||||
$cover.addClass('show').css('display','flex');
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: "/admin/Login/login", // 服务器端脚本的 URL
|
||||
data: $(this).serialize(), // 自动序列化表单元素为字符串
|
||||
url: "/admin/Login/login",
|
||||
data: $(this).serialize(),
|
||||
success: function(data) {
|
||||
$cover.removeClass('show').hide();
|
||||
if(data.status){
|
||||
//alert(data.msg);
|
||||
location.replace("/admin/login");
|
||||
// location.reload();
|
||||
} else {
|
||||
alert(data.msg);
|
||||
return ;
|
||||
}
|
||||
console.log(response); // 处理服务器响应
|
||||
},
|
||||
error: function(jqXHR, textStatus, errorThrown) {
|
||||
console.error("Error submitting form: " + textStatus);
|
||||
$cover.removeClass('show').hide();
|
||||
console.error("Error: " + textStatus);
|
||||
alert('登录请求失败,请稍后重试');
|
||||
}
|
||||
});
|
||||
});
|
||||
// $('#agent_login').submit();
|
||||
// ajaxpost('registerform', 'register');
|
||||
// $('#agent_login').ajaxSubmit({
|
||||
/* $.ajax({
|
||||
url:'/admin/Login/login',
|
||||
dataType:'json',
|
||||
type:'post',
|
||||
data:{
|
||||
"username":username,
|
||||
"password":pwd
|
||||
},
|
||||
success:function(data){
|
||||
alert(222);
|
||||
alert(data.msg);
|
||||
$("#agent_login").submit();
|
||||
}
|
||||
return false;
|
||||
if(data.status){
|
||||
alert(data.msg);
|
||||
// $(form).resetForm();
|
||||
} else {
|
||||
alert(data.msg);
|
||||
return ;
|
||||
}
|
||||
}
|
||||
}) */
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -1,143 +1,106 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<meta charset="utf-8" />
|
||||
<meta name="renderer" content="webkit|ie-comp|ie-stand">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no">
|
||||
<meta http-equiv="Cache-Control" content="no-siteapp">
|
||||
<title>用户登录</title>
|
||||
<title>登录 - 生长激素缺乏预测模型后台</title>
|
||||
<link rel="stylesheet" type="text/css" href="/static/adminghd/css/style.css" />
|
||||
<link rel="stylesheet" type="text/css" href="/static/adminghd/css/login.css" />
|
||||
</head>
|
||||
<style>
|
||||
.login-top .tbb{ font-size:18px; font-weight:bold; position:absolute; bottom:0; left:195px; color:#FFD200;}
|
||||
.login-wrap { min-height: 100vh; display: flex; align-items: center; justify-content: center; background: linear-gradient(135deg, #11998e 0%, #38ef7d 50%, #06beb6 100%); padding: 20px; box-sizing: border-box; }
|
||||
.login-card { width: 100%; max-width: 400px; background: #fff; border-radius: 16px; box-shadow: 0 20px 60px rgba(0,0,0,0.2); overflow: hidden; }
|
||||
.login-card .login-header { padding: 36px 24px 24px; text-align: center; border-bottom: 1px solid #f0f0f0; }
|
||||
.login-card .login-title { font-size: 18px; font-weight: 600; color: #1f2d3d; line-height: 1.5; margin: 0; }
|
||||
.login-card .login-body { padding: 32px 28px 40px; }
|
||||
.login-card .form-item { margin-bottom: 22px; }
|
||||
.login-card .form-item input { width: 100%; height: 48px; padding: 0 16px; border: 1px solid #e0e0e0; border-radius: 8px; font-size: 15px; color: #333; background: #fafafa; box-sizing: border-box; transition: border-color .2s, background .2s; }
|
||||
.login-card .form-item input::placeholder { color: #aaa; }
|
||||
.login-card .form-item input:focus { outline: none; border-color: #11998e; background: #fff; }
|
||||
.login-card .form-item .warning { display: block; margin-top: 6px; font-size: 12px; color: #e4393c; min-height: 18px; }
|
||||
.login-card .btn-login { width: 100%; height: 48px; border: none; border-radius: 8px; font-size: 16px; font-weight: 500; color: #fff; background: linear-gradient(135deg, #11998e 0%, #38ef7d 100%); cursor: pointer; transition: opacity .2s, transform .05s; }
|
||||
.login-card .btn-login:hover { opacity: 0.95; }
|
||||
.login-card .btn-login:active { transform: scale(0.99); }
|
||||
#cover.modal { display: none !important; line-height: 100vh; text-align: center; position: fixed; top: 0; right: 0; bottom: 0; left: 0; background: rgba(0,0,0,0.6); z-index: 9999; color: #fff; font-size: 18px; }
|
||||
#cover.modal.show { display: flex !important; align-items: center; justify-content: center; }
|
||||
</style>
|
||||
<body style='min-width:1235px'>
|
||||
<div style='height:100px;'></div>
|
||||
<div style='background:#e3e3e3;height:450px;width:100%;position:relative;'>
|
||||
<div style='width:350px;height:400px;background:#EDF1F5;float:right;margin-right:20%;margin-top:1.5%;box-shadow:#666 0px 0px 20px;'>
|
||||
<div class="login-top" style="padding-bottom:0;">
|
||||
<div style='color:#453A3E;margin:30px auto 10px auto;width:auto;max-width:90%;font-size:16px;font-weight:bold;text-align:center;padding:0 10px;'>生长激素缺乏预测模型后台</div>
|
||||
</div>
|
||||
<div style='height:1px;width:100%;background:#DEDCDD;'>
|
||||
<div style='background:#e3e3e3;height:3px;width:80%;margin:0px auto 0 auto;'></div>
|
||||
</head>
|
||||
<body>
|
||||
<div class="login-wrap">
|
||||
<div class="login-card">
|
||||
<div class="login-header">
|
||||
<h1 class="login-title">生长激素缺乏预测模型后台</h1>
|
||||
</div>
|
||||
<div class="login-body">
|
||||
<form method="post" id="agent_login" name="login">
|
||||
<div class="login-content">
|
||||
<ul class="user-logn">
|
||||
<li class="user-jobnum" style='width:100%;margin-bottom:0px;'>
|
||||
<div class="li-bg error" style='width:100%;'>
|
||||
<label></label>
|
||||
<input type="text" id="username" name="username" placeholder="请输入账号" value="" validate="" validatename="工号" class="phonecode" style='width:83%;padding-right:0px;background:#EDF1F5;height:40px;border:2px solid balck;border-radius:4px;'/>
|
||||
<div class="form-item">
|
||||
<input type="text" id="username" name="username" placeholder="请输入账号" value="" autocomplete="username" />
|
||||
<span id="checkusername" class="warning"></span>
|
||||
</div>
|
||||
</li>
|
||||
<li class="pwd" style='width:100%;margin-bottom:0px;'>
|
||||
<div class="li-bg " style='width:100%;'>
|
||||
<label></label>
|
||||
<input type="password" style="width: 0;height: 0;border: none;" name="">
|
||||
<input type="password" autocomplete="off" id="admin_password" name="password" class="pwd" placeholder="请输入密码" validate="" validatename="密码" style='border:2px solid balck;width:83%;padding-right:0px;background:#EDF1F5;height:40px;border-radius:4px;'>
|
||||
<div class="form-item">
|
||||
<input type="password" style="width:0;height:0;border:none;position:absolute;opacity:0;" name="" tabindex="-1" />
|
||||
<input type="password" autocomplete="off" id="admin_password" name="password" placeholder="请输入密码" />
|
||||
<span id="checkpassword" class="warning"></span>
|
||||
</div>
|
||||
</li>
|
||||
<li style="margin-top:40px;width:100%;">
|
||||
<button type="submit" name="dologinbtn" style='background:#afaeb2;border-radius:4px;height:35px;width:100%;' class="actLogin" onclick="return checklogin(this.form);">立即登录</button>
|
||||
<div class="form-item" style="margin-bottom:0;margin-top:28px;">
|
||||
<button type="submit" name="dologinbtn" class="btn-login" onclick="return checklogin(this.form);">立即登录</button>
|
||||
<input type="hidden" name="loginsubmit" value="true" />
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div id="cover" class="modal">身份获取中。。。</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="cover" class="modal" style="display:none !important;">身份获取中...</div>
|
||||
|
||||
|
||||
</body>
|
||||
</html>
|
||||
<script type="text/javascript" src="/static/adminghd/js/jquery.js"></script>
|
||||
<script>
|
||||
var _login_time = -1;
|
||||
var _user_type = '';
|
||||
|
||||
function checklogin(form){
|
||||
var username = $('username').value;
|
||||
var pwd = $('password').value;
|
||||
var phonenumFlg = true;
|
||||
var pwdFlg = true;
|
||||
//var codeFlg = true;
|
||||
if(form.username.value == null || form.username.value == ""){
|
||||
$('#checkusername').empty();
|
||||
$('#checkusername').append(' 账号不能为空!');
|
||||
$('#checkusername').addClass("warning");
|
||||
if(!form.username.value || form.username.value.trim() === ''){
|
||||
$('#checkusername').text('账号不能为空').addClass("warning");
|
||||
phonenumFlg = false;
|
||||
return phonenumFlg;
|
||||
} else {
|
||||
$('#checkusername').empty();
|
||||
// $('#checkusername').append('<img src="/images/base/check_right.gif" width="13" height="13">');
|
||||
$('#checkusername').addClass("warning");
|
||||
}
|
||||
if(form.password.value == null || form.password.value == ""){
|
||||
$('#checkpassword').empty();
|
||||
$('#checkpassword').append(' 密码不能为空!');
|
||||
$('#checkpassword').addClass("warning");
|
||||
if(!form.password.value || form.password.value === ''){
|
||||
$('#checkpassword').text('密码不能为空').addClass("warning");
|
||||
pwdFlg = false;
|
||||
return pwdFlg;
|
||||
} else {
|
||||
$('#checkpassword').empty();
|
||||
// $('#checkpassword').append('<img src="/images/base/check_right.gif" width="13" height="13">');
|
||||
$('#checkpassword').addClass("warning");
|
||||
}
|
||||
if(phonenumFlg == true && pwdFlg == true){
|
||||
// alert(11);
|
||||
$("#agent_login").submit(function(event) {
|
||||
event.preventDefault(); // 阻止表单默认提交行为
|
||||
if(phonenumFlg && pwdFlg){
|
||||
$("#agent_login").off('submit').on("submit", function(event) {
|
||||
event.preventDefault();
|
||||
var $cover = $('#cover');
|
||||
$cover.addClass('show').css('display','flex');
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: "/adminghd/Login/login", // 服务器端脚本的 URL
|
||||
data: $(this).serialize(), // 自动序列化表单元素为字符串
|
||||
url: "/adminghd/Login/login",
|
||||
data: $(this).serialize(),
|
||||
success: function(data) {
|
||||
$cover.removeClass('show').hide();
|
||||
if(data.status){
|
||||
//alert(data.msg);
|
||||
location.replace("/adminghd/login");
|
||||
// location.reload();
|
||||
} else {
|
||||
alert(data.msg);
|
||||
return ;
|
||||
}
|
||||
console.log(response); // 处理服务器响应
|
||||
},
|
||||
error: function(jqXHR, textStatus, errorThrown) {
|
||||
console.error("Error submitting form: " + textStatus);
|
||||
$cover.removeClass('show').hide();
|
||||
console.error("Error: " + textStatus);
|
||||
alert('登录请求失败,请稍后重试');
|
||||
}
|
||||
});
|
||||
});
|
||||
// $('#agent_login').submit();
|
||||
// ajaxpost('registerform', 'register');
|
||||
// $('#agent_login').ajaxSubmit({
|
||||
/* $.ajax({
|
||||
url:'/admin/Login/login',
|
||||
dataType:'json',
|
||||
type:'post',
|
||||
data:{
|
||||
"username":username,
|
||||
"password":pwd
|
||||
},
|
||||
success:function(data){
|
||||
alert(222);
|
||||
alert(data.msg);
|
||||
$("#agent_login").submit();
|
||||
}
|
||||
return false;
|
||||
if(data.status){
|
||||
alert(data.msg);
|
||||
// $(form).resetForm();
|
||||
} else {
|
||||
alert(data.msg);
|
||||
return ;
|
||||
}
|
||||
}
|
||||
}) */
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user