guoyu/_已清理文件备份_周六 22512/md/系统有效时间功能移植说明.md

225 lines
8.2 KiB
Markdown
Raw Normal View History

2025-12-06 20:11:36 +08:00
# 系统有效时间功能移植说明
## 功能概述
`xinli` 借鉴项目移植了系统有效时间控制功能。该功能通过在参数设置表中配置系统有效时间,当系统超过有效时间后,普通用户将无法登录系统,但系统管理员不受此限制。
## 移植内容
### 1. 代码实现
**文件位置:** `ry-study-framework/src/main/java/com/ddnai/framework/web/service/SysLoginService.java`
#### 1.1 新增导入
添加了以下导入语句:
- `java.util.Date` - 用于日期时间处理
- `org.slf4j.Logger``org.slf4j.LoggerFactory` - 用于日志记录
- `com.ddnai.common.core.domain.entity.SysUser` - 用于用户对象判断
#### 1.2 新增 Logger 字段
在类中添加了日志记录器:
```java
private static final Logger log = LoggerFactory.getLogger(SysLoginService.class);
```
#### 1.3 新增方法:`validateSystemExpireTime`
**功能说明:**
- 检查 `system.top` 参数配置
- 如果配置存在且截止时间小于当前时间,则阻止登录
- 系统管理员用户ID=1不受此限制
**实现逻辑:**
1. 首先判断用户是否为系统管理员:
- 如果提供了用户ID使用 `SecurityUtils.isAdmin(userId)` 判断
- 如果只提供了用户名,通过 `userService.selectUserByUserName(username)` 查找用户,然后使用 `user.isAdmin()` 判断
- 系统管理员直接返回,跳过检查
2. 从配置服务获取 `system.top` 配置值
3. 解析日期时间(支持两种格式):
- `yyyy-MM-dd`:自动转换为当天的 23:59:59
- `yyyy-MM-dd HH:mm:ss`:使用配置的精确时间
4. 比较当前时间与过期时间:
- 如果当前时间在过期时间之后,抛出 `ServiceException("系统出现问题,请联系管理员")`
- 记录登录失败日志
**关键代码位置:** 第 175-258 行
#### 1.4 登录前置校验集成
**文件位置:** `SysLoginService.java``loginPreCheck` 方法
**修改内容:** 在第 144-145 行添加了系统有效时间检查调用:
```java
// 检查系统有效时间(系统管理员不受限制)
validateSystemExpireTime(username, null);
```
**执行时机:** 在验证码校验之后、用户名密码校验之前执行
### 2. 数据库初始化脚本
**文件位置:** `database_init_system_expire_time.sql`
**功能说明:**
-`sys_config` 表中初始化 `system.top` 配置项
- 配置项默认值为空(不限制)
- 支持 `ON DUPLICATE KEY UPDATE`,可以重复执行
**配置项说明:**
- **配置键:** `system.top`
- **配置名称:** 系统有效时间
- **配置值格式:**
- `yyyy-MM-dd`(日期格式,系统在该日期的 23:59:59 之前可登录)
- `yyyy-MM-dd HH:mm:ss`(日期时间格式,系统在该时间之前可登录)
- 空值(不限制,系统永久可用)
- **配置类型:** Y是/否类型)
## 功能特性
### 1. 系统管理员豁免
- 系统管理员用户ID=1不受系统有效时间限制
- 即使系统已过期,系统管理员仍可正常登录
- 判断方式:
- 通过用户ID判断`SecurityUtils.isAdmin(userId)`
- 通过用户对象判断:`user.isAdmin()`
### 2. 日期格式支持
- **日期格式yyyy-MM-dd** 自动转换为当天的 23:59:59确保当天仍可登录
- **日期时间格式yyyy-MM-dd HH:mm:ss** 使用精确的过期时间
### 3. 错误处理
- 日期解析失败时,记录警告日志但不阻止登录(容错处理)
- 用户查找失败时,继续执行系统有效时间检查
- 系统过期时,记录登录失败日志并抛出明确的异常信息
### 4. 提示信息
- 当系统过期时,提示信息为:"系统出现问题,请联系管理员"
- 登录日志中记录:"系统有效时间已过期"
## 使用方法
### 1. 执行数据库初始化脚本
```sql
-- 执行初始化脚本
source database_init_system_expire_time.sql;
-- 或者直接在数据库中执行脚本内容
```
### 2. 配置系统有效时间
**方式一:通过系统管理界面**
1. 登录系统(需要系统管理员权限)
2. 进入"系统管理" -> "参数设置"
3. 找到"系统有效时间"配置项config_key: `system.top`
4. 设置有效时间:
- 日期格式:`2024-12-31`(表示 2024年12月31日 23:59:59 之前可登录)
- 日期时间格式:`2024-12-31 23:59:59`(表示该时间之前可登录)
- 清空值:不限制系统有效时间
**方式二:直接执行 SQL**
```sql
-- 设置系统有效时间为 2024年12月31日
UPDATE sys_config
SET config_value = '2024-12-31', update_time = NOW()
WHERE config_key = 'system.top';
-- 设置系统有效时间为 2024年12月31日 23:59:59
UPDATE sys_config
SET config_value = '2024-12-31 23:59:59', update_time = NOW()
WHERE config_key = 'system.top';
-- 取消限制(清空配置值)
UPDATE sys_config
SET config_value = '', update_time = NOW()
WHERE config_key = 'system.top';
```
### 3. 验证功能
1. **测试普通用户登录:**
- 设置一个已过期的日期(如:`2020-01-01`
- 使用普通用户尝试登录
- 应该看到提示:"系统出现问题,请联系管理员"
2. **测试系统管理员登录:**
- 保持过期日期设置
- 使用系统管理员用户ID=1登录
- 应该可以正常登录
3. **测试正常情况:**
- 设置一个未来的日期(如:`2099-12-31`
- 普通用户应该可以正常登录
## 技术细节
### 依赖的方法和类
1. **SecurityUtils.isAdmin(Long userId)**
- 位置:`com.ddnai.common.utils.SecurityUtils`
- 功能判断用户ID是否为系统管理员用户ID=1
2. **SysUser.isAdmin()**
- 位置:`com.ddnai.common.core.domain.entity.SysUser`
- 功能:判断用户对象是否为系统管理员
3. **ISysConfigService.selectConfigByKey(String key)**
- 位置:`com.ddnai.system.service.ISysConfigService`
- 功能:根据配置键获取配置值
4. **ISysUserService.selectUserByUserName(String username)**
- 位置:`com.ddnai.system.service.ISysUserService`
- 功能:根据用户名查找用户
5. **DateUtils.parseDate(String dateStr)**
- 位置:`com.ddnai.common.utils.DateUtils`
- 功能:解析日期字符串
6. **DateUtils.getNowDate()**
- 位置:`com.ddnai.common.utils.DateUtils`
- 功能:获取当前日期时间
### 异常处理
- **ServiceException** 当系统过期时抛出,包含提示信息"系统出现问题,请联系管理员"
- **日期解析异常:** 捕获但不阻止登录,仅记录警告日志
## 注意事项
1. **配置为空时不限制:** 如果 `system.top` 配置值为空或不存在,系统不进行有效时间检查
2. **系统管理员豁免:** 系统管理员用户ID=1始终不受限制即使系统已过期
3. **日期格式:** 建议使用 `yyyy-MM-dd` 格式,系统会自动处理为当天的结束时间
4. **时区问题:** 系统使用服务器时区进行时间比较
5. **配置缓存:** 如果使用了配置缓存,修改配置后可能需要清除缓存才能生效
## 移植对比
### 借鉴项目xinli实现
- **文件位置:** `ry-xinli-framework/src/main/java/com/ddnai/framework/web/service/SysLoginService.java`
- **配置键:** `system.top`
- **功能:** 完整实现系统有效时间检查,系统管理员豁免
### 当前项目Study-Vue-redis实现
- **文件位置:** `ry-study-framework/src/main/java/com/ddnai/framework/web/service/SysLoginService.java`
- **配置键:** `system.top`
- **功能:** 完整移植,与借鉴项目实现完全一致
## 移植状态
**代码实现:** 已完成(与 xinli 项目完全一致)
**数据库脚本:** 已创建
**功能测试:** 需要手动验证
## 移植总结
本次移植从 `xinli` 借鉴项目中完整移植了系统有效时间控制功能,包括:
1. **核心方法:** `validateSystemExpireTime` 方法完整移植
2. **集成点:**`loginPreCheck` 方法中调用系统有效时间检查
3. **依赖导入:** 添加了必要的导入语句和日志记录器
4. **数据库配置:** 创建了 SQL 初始化脚本
功能已完整移植,可以直接使用。建议执行数据库初始化脚本后,通过系统管理界面配置系统有效时间进行测试。