REQ-010-1 完成内容: - 创建 6 个数据库表设计(datai_meta_org_config、datai_meta_task、datai_meta_job_execution、datai_meta_component、datai_meta_deploy_history、datai_meta_job_log) - 设计了合理的索引策略 - 对敏感字段进行了加密存储设计 - 表名前缀统一为 datai_meta_ - 所有表包含标准基础字段 REQ-010-2 完成内容: - 补充用户故事和细化验收标准 - 创建架构决策记录(MyBatis Plus 注解 + XML 映射文件混合方案) - 对比了 3 种备选方案 - 分析了决策对系统架构、开发流程、运维管理的影响 - 识别了技术风险、业务风险和实施风险 - 定义了回滚策略和验收标准 文档更新: - 创建 0010-database-table-design.md 架构决策记录 - 创建 0011-entity-mapper-create.md 架构决策记录 - 创建 0020-database-table-design-create.md 变更记录 - 创建 20260117-database-table-design-create.md 会话记录 - 创建 20260117-database-table-design-create-retro.md 复盘报告 - 创建 011-database-table-design-create.md 提示词文档 - 更新 REQ-010-2.md 需求文档 - 更新 docs/index.md 和 CHANGELOG.md
226 lines
8.3 KiB
Markdown
226 lines
8.3 KiB
Markdown
---
|
||
name: 0017-login-history-query-and-auto-login
|
||
description: 查询不同类型ORG登录历史及自动登录功能
|
||
---
|
||
|
||
# 变更记录: 查询不同类型ORG登录历史及自动登录功能
|
||
|
||
## 元数据 (Metadata)
|
||
|
||
- **变更编号**: 0017
|
||
- **变更标题**: 查询不同类型ORG登录历史及自动登录功能
|
||
- **变更日期**: 2026-01-16
|
||
- **变更人**: SSOT Architect
|
||
- **相关需求**: [REQ-007](../requirements/REQ-007.md)
|
||
- **相关ADR**: [ADR-007](../decisions/adr/0007-login-history-query-and-auto-login.md)
|
||
|
||
## 变更概述 (Overview)
|
||
|
||
本次变更为 `DataISfLoginController` 添加了两个新接口,支持查询不同类型ORG的成功登录历史和根据登录历史自动登录到对应ORG。同时,在 `IDataiSfLoginHistoryService`、`DataiSfLoginHistoryServiceImpl` 和 `DataiSfLoginHistoryMapper` 中添加了相应的方法支持。
|
||
|
||
## 变更详情 (Details)
|
||
|
||
### 1. 新增接口
|
||
|
||
#### 接口1: 查询不同类型ORG成功登录历史
|
||
|
||
**接口路径**: `GET /salesforce/login/history/success/{orgType}`
|
||
|
||
**功能描述**: 查询指定类型的成功登录历史记录
|
||
|
||
**实现文件**:
|
||
- [DataISfLoginController.java](../../datai-salesforce-auth/src/main/java/com/datai/auth/controller/DataISfLoginController.java)
|
||
|
||
**关键代码**:
|
||
```java
|
||
@Operation(summary = "查询不同类型ORG成功登录历史")
|
||
@GetMapping("/history/success/{orgType}")
|
||
public AjaxResult getSuccessLoginHistoryByOrgType(@PathVariable String orgType) {
|
||
logger.info("接收到查询登录历史请求,ORG类型: {}", orgType);
|
||
|
||
try {
|
||
List<DataiSfLoginHistory> historyList = loginHistoryService.selectSuccessLoginHistoryByOrgType(orgType);
|
||
return AjaxResult.success("查询成功", historyList);
|
||
} catch (Exception e) {
|
||
logger.error("查询登录历史请求处理失败: {}", e.getMessage(), e);
|
||
return AjaxResult.error("查询失败: " + e.getMessage());
|
||
}
|
||
}
|
||
```
|
||
|
||
#### 接口2: 根据登录历史自动登录
|
||
|
||
**接口路径**: `POST /salesforce/login/autoLoginByHistory`
|
||
|
||
**功能描述**: 根据指定的登录历史记录自动登录到对应ORG
|
||
|
||
**实现文件**:
|
||
- [DataISfLoginController.java](../../datai-salesforce-auth/src/main/java/com/datai/auth/controller/DataISfLoginController.java)
|
||
|
||
**关键代码**:
|
||
```java
|
||
@Operation(summary = "根据登录历史自动登录")
|
||
@PostMapping("/autoLoginByHistory")
|
||
public AjaxResult autoLoginByHistory(@RequestBody java.util.Map<String, Long> request) {
|
||
Long historyId = request.get("historyId");
|
||
logger.info("接收到根据历史自动登录请求,历史ID: {}", historyId);
|
||
|
||
try {
|
||
DataiSfLoginHistory loginHistory = loginHistoryService.selectDataiSfLoginHistoryById(historyId);
|
||
|
||
if (loginHistory == null) {
|
||
logger.warn("未找到ID为 {} 的登录历史记录", historyId);
|
||
return AjaxResult.error("未找到登录历史记录");
|
||
}
|
||
|
||
SalesforceLoginResult result = salesforceLoginService.autoLogin(historyId);
|
||
|
||
if (result.isSuccess()) {
|
||
logger.info("自动登录成功,用户ID: {}, 组织ID: {}, ORG类型: {}",
|
||
result.getUserId(), result.getOrganizationId(), result.getOrgType());
|
||
return AjaxResult.success("自动登录成功", result);
|
||
} else {
|
||
logger.warn("自动登录失败,错误码: {}, 错误信息: {}",
|
||
result.getErrorCode(), result.getErrorMessage());
|
||
return AjaxResult.error(result.getErrorCode(), result.getErrorMessage());
|
||
}
|
||
} catch (Exception e) {
|
||
logger.error("自动登录请求处理失败: {}", e.getMessage(), e);
|
||
return AjaxResult.error("自动登录失败: " + e.getMessage());
|
||
}
|
||
}
|
||
```
|
||
|
||
### 2. Service 层变更
|
||
|
||
#### IDataiSfLoginHistoryService 接口
|
||
|
||
**实现文件**:
|
||
- [IDataiSfLoginHistoryService.java](../../datai-salesforce-auth/src/main/java/com/datai/auth/service/IDataiSfLoginHistoryService.java)
|
||
|
||
**新增方法**:
|
||
```java
|
||
public List<DataiSfLoginHistory> selectSuccessLoginHistoryByOrgType(String orgType);
|
||
```
|
||
|
||
#### DataiSfLoginHistoryServiceImpl 实现类
|
||
|
||
**实现文件**:
|
||
- [DataiSfLoginHistoryServiceImpl.java](../../datai-salesforce-auth/src/main/java/com/datai/auth/service/impl/DataiSfLoginHistoryServiceImpl.java)
|
||
|
||
**新增方法**:
|
||
```java
|
||
@Override
|
||
public List<DataiSfLoginHistory> selectSuccessLoginHistoryByOrgType(String orgType)
|
||
{
|
||
return dataiSfLoginHistoryMapper.selectSuccessLoginHistoryByOrgType(orgType);
|
||
}
|
||
```
|
||
|
||
### 3. Mapper 层变更
|
||
|
||
#### DataiSfLoginHistoryMapper 接口
|
||
|
||
**实现文件**:
|
||
- [DataiSfLoginHistoryMapper.java](../../datai-salesforce-auth/src/main/java/com/datai/auth/mapper/DataiSfLoginHistoryMapper.java)
|
||
|
||
**新增方法**:
|
||
```java
|
||
public List<DataiSfLoginHistory> selectSuccessLoginHistoryByOrgType(String orgType);
|
||
```
|
||
|
||
#### DataiSfLoginHistoryMapper.xml
|
||
|
||
**实现文件**:
|
||
- [DataiSfLoginHistoryMapper.xml](../../datai-salesforce-auth/src/main/resources/mapper/auth/DataiSfLoginHistoryMapper.xml)
|
||
|
||
**新增SQL**:
|
||
```xml
|
||
<select id="selectSuccessLoginHistoryByOrgType" parameterType="String" resultMap="DataiSfLoginHistoryResult">
|
||
<include refid="selectDataiSfLoginHistoryVo"/>
|
||
where dslh.login_status = 'success' and dslh.org_type = #{orgType}
|
||
order by dslh.create_time desc
|
||
</select>
|
||
```
|
||
|
||
## 变更影响 (Impact)
|
||
|
||
### 影响范围
|
||
- **Controller 层**: DataISfLoginController
|
||
- **Service 层**: IDataiSfLoginHistoryService, DataiSfLoginHistoryServiceImpl
|
||
- **Mapper 层**: DataiSfLoginHistoryMapper, DataiSfLoginHistoryMapper.xml
|
||
|
||
### 兼容性
|
||
- ✅ 向后兼容:不修改现有接口,只新增接口
|
||
- ✅ 不影响现有功能:现有登录、登出、自动登录功能不受影响
|
||
|
||
### 性能影响
|
||
- 查询登录历史接口:性能影响较小,建议在 `org_type` 字段上添加索引
|
||
- 自动登录接口:性能影响较小,与现有自动登录接口性能一致
|
||
|
||
## 测试验证 (Testing)
|
||
|
||
### 测试用例
|
||
| 用例编号 | 用例描述 | 预期结果 | 实际结果 | 状态 |
|
||
|----------|----------|----------|----------|------|
|
||
| TC-001 | 查询Source类型的登录历史 | 返回所有Source类型的成功登录记录 | 待验证 | 待验证 |
|
||
| TC-002 | 查询Target类型的登录历史 | 返回所有Target类型的成功登录记录 | 待验证 | 待验证 |
|
||
| TC-003 | 查询Sandbox类型的登录历史 | 返回所有Sandbox类型的成功登录记录 | 待验证 | 待验证 |
|
||
| TC-004 | 查询不存在的ORG类型 | 返回空列表或提示无记录 | 待验证 | 待验证 |
|
||
| TC-005 | 根据历史ID自动登录到Source ORG | 使用历史记录中的凭证成功登录到Source ORG | 待验证 | 待验证 |
|
||
| TC-006 | 根据历史ID自动登录到Target ORG | 使用历史记录中的凭证成功登录到Target ORG | 待验证 | 待验证 |
|
||
| TC-007 | 根据不存在的历史ID自动登录 | 返回错误信息,提示历史记录不存在 | 待验证 | 待验证 |
|
||
|
||
### 测试方法
|
||
1. 单元测试:测试 Service 层新方法
|
||
2. 集成测试:测试 Controller 层新接口
|
||
3. 性能测试:测试接口响应时间
|
||
4. 安全测试:测试敏感信息加密
|
||
|
||
## 部署建议 (Deployment)
|
||
|
||
### 部署前检查
|
||
- [ ] 确认所有代码变更已提交
|
||
- [ ] 确认所有测试用例已通过
|
||
- [ ] 确认数据库索引已创建(如果需要)
|
||
- [ ] 确认 API 文档已更新
|
||
|
||
### 部署步骤
|
||
1. 停止应用服务
|
||
2. 部署新的代码包
|
||
3. 启动应用服务
|
||
4. 验证新接口是否正常工作
|
||
5. 验证现有接口是否正常工作
|
||
|
||
### 回滚策略
|
||
如果部署失败,可以:
|
||
1. 回退到之前的代码版本
|
||
2. 删除新增的两个接口
|
||
3. 删除 Service 层新增的方法
|
||
4. 删除 Mapper 层新增的方法
|
||
|
||
## 后续优化 (Future Improvements)
|
||
|
||
### 性能优化
|
||
- 在 `org_type` 字段上添加索引以提高查询性能
|
||
- 考虑添加分页查询功能
|
||
- 考虑添加查询结果缓存
|
||
|
||
### 功能优化
|
||
- 支持按时间范围查询登录历史
|
||
- 支持按登录状态查询登录历史
|
||
- 支持导出登录历史记录
|
||
|
||
## 相关文档 (Related Documents)
|
||
|
||
- [需求文档](../requirements/REQ-007.md)
|
||
- [架构决策](../decisions/adr/0007-login-history-query-and-auto-login.md)
|
||
- [提示词资产](../prompts/007-login-history-query-and-auto-login.md)
|
||
- [会话记录](../sessions/20260116-login-history-query-and-auto-login.md)
|
||
|
||
## 变更历史 (Change History)
|
||
|
||
| 日期 | 版本 | 变更内容 | 变更人 |
|
||
|------|------|----------|--------|
|
||
| 2026-01-16 | 1.0.0 | 初始版本 | SSOT Architect |
|