You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ECMS/DetailedDesign

108 lines
4.5 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

软件详细设计报告(详细设计)
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 <token>`
- 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` APIquery→实体字段映射→ 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与校验框架
- 统一异常处理与错误码枚举;
- 审计日志与操作记录;