guoyu/Study-Vue-redis/系统有效时间功能移植说明.md
2025-12-03 18:58:36 +08:00

225 lines
8.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 系统有效时间功能移植说明
## 功能概述
`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 初始化脚本
功能已完整移植,可以直接使用。建议执行数据库初始化脚本后,通过系统管理界面配置系统有效时间进行测试。