diff --git a/DetailedDesign b/DetailedDesign new file mode 100644 index 0000000..624385f --- /dev/null +++ b/DetailedDesign @@ -0,0 +1,107 @@ +软件详细设计报告(详细设计) + +1. 总体说明 +本报告基于当前代码实现,细化至类/接口、方法职责、数据流与异常处理,覆盖后端各模块与前端关键交互点。 + +2. 后端详细设计 +2.1 统一基础设施 +- `com.prj.common.core.controller.BaseController` + - `startPage()`:开启分页(集成 MyBatis PageHelper); + - `getDataByPage(List)`:封装为 `TableDataInfo`; + - `toAjax(int rows)`:封装影响行数到 `AjaxResult`; +- `AjaxResult`:统一返回结构 `{ code, msg, data }`; + +2.2 鉴权与验证码 +- `CaptchaController` + - 依赖:`captchaProducerMath`、`RedisCache` + - 主要流程:生成运算验证码 → Redis存储(键:`Constants.CAPTCHA_CODE_KEY + uuid`) → Base64图片返回 + - 异常:`ImageIO.write` 抛出 `IOException` 时,返回 `AjaxResult.error(msg)` +- `LoginController` + - 依赖:`LoginService` + - 主要流程:校验验证码 → 账号认证 → 生成 `token` → 返回 `Constants.TOKEN` 字段 + +2.3 部门信息管理 +- `DeptController` + - `GET /dept_info/list`:`startPage()` → `IDeptService.selectDeptList(Dept)` → `getDataByPage(list)` + - `GET /dept_info/{id}`:`IDeptService.selectDeptById(id)` + - `POST /dept_info`:`IDeptService.insertDept(Dept)` → `toAjax(rows)` + - `PUT /dept_info`:`IDeptService.updateDept(Dept)` → `toAjax(rows)` + - `DELETE /dept_info/{ids}`:`IDeptService.deleteDeptByIds(Long[])` → `toAjax(rows)` +- Service 与持久化 + - `IDeptService`/impl:参数校验与 CRUD 组合; + - `DeptMapper.xml`:对应 SQL(与实体字段一致); + +2.4 员工信息管理 +- `EmployeeController` + - 同 Dept 接口集合; + - `PUT /employee`:`@Transactional(timeout=20, readOnly=false, isolation=DEFAULT, propagation=REQUIRED)` + - 设计目的:保证更新过程中的一致性,可在方法内扩展多表写操作; +- Service 与持久化 + - `IEmployeeService`/impl` + `EmployeeMapper.xml` + +2.5 员工评价管理 +- `EmployeeKpiController` + `IEmployeeKpiService` + `EmployeeKpiMapper.xml` + - 五个CRUD端点,同上模式; + +2.6 招人名额管理 +- `HireNumController` + `IHireNumService` + `HirenumRepo`/`HireNumMapper.xml` + - 实体 `HireNum` 使用 JPA 注解(`@Entity @Table(name="hire_num")`),字段 `id/dept/num/endtime`; + +2.7 薪资标准管理 +- `SalaryLevelController` + `ISalaryLevelService` + `SalaryLevelMapper.xml` + +2.8 领域模型 +- `Dept{id, name, manager, reportto}` +- `Employee{id, dept, name, position, salary}` +- `EmployeeKpi{id, kpi, bonus, manager}` +- `HireNum{id, dept, num, endtime}` +- `SalaryLevel{id, jobType, salary, salaryrange}` + +2.9 异常与错误处理 +- 控制器返回 `AjaxResult.error(msg)` 或 `code!=200`; +- 登录401由前端捕获并触发重新登录; + +3. 前端详细设计 +3.1 路由 +- `src/router/index.js`: + - `/index` 首页; + - 业务模块:`/dept_info`、`/salary_level`、`/hirenum`、`/employee`、`/employee_kpi`; + - `/login` 登录页; + +3.2 请求封装 +- `src/utils/request.js` + - Request 拦截器:若存在 `Admin-Token`,注入 `Authorization: Bearer `; + - Response 拦截器:基于 `code` 统一处理 401/500/非200 异常; + - `timeout=2000ms`,`baseURL=VUE_APP_BASE_API`; +- `src/utils/auth.js`:基于 Cookie 管理 `Admin-Token`; + +3.3 API 模块 +- `src/api/*.js` 与后端控制器一一对应(URL 完全匹配),方法:`list/get/add/update/del`; + +4. 典型时序(文本) +4.1 登录 +用户 → `/captchaImage` → 返回 `uuid,img`;用户提交 `/login{username,password,code,uuid}` → 返回 `token`;前端保存 Cookie 并携带到后续请求。 + +4.2 列表分页 +页面 → 调用 `list` API(query→实体字段映射)→ Controller `startPage()` → Service/Mapper 查询 → `TableDataInfo` 返回。 + +4.3 更新(员工示例) +页面 → `PUT /employee` → Controller(事务)→ Service → Mapper/JPA → 受影响行数 → `AjaxResult`。 + +5. 数据校验与约束 +- 控制器层假定实体字段按类型传入; +- 业务层可扩展非空、范围、唯一性校验(当前代码未显式实现高级校验规则)。 + +6. 配置要点 +- `application.yml`:数据源/端口/Redis等; +- `logback.xml`:日志级别与输出; + +7. 安全与权限 +- 以 Token 作为会话凭证;未实现细粒度 RBAC 的控制器级别权限; + +8. 扩展点 +- 在Service引入DTO与校验框架; +- 统一异常处理与错误码枚举; +- 审计日志与操作记录; + +