diff --git a/All-In-One b/All-In-One new file mode 100644 index 0000000..2fbafb6 --- /dev/null +++ b/All-In-One @@ -0,0 +1,18 @@ +# ECMS 文档合集 + +> 本文件由导出脚本自动生成(也可手动维护)。 + + + +## 包含内容 +- SRS(软件需求规格说明) +- IRS(接口需求规格说明) +- 体系结构设计报告 +- 详细设计报告 +- 设计图示(类图/时序图) +- 单元测试计划 +- 集成测试用例集 +- 部署说明 +- 研发流程规范 + + diff --git a/ArchitectureDesign b/ArchitectureDesign new file mode 100644 index 0000000..7e89771 --- /dev/null +++ b/ArchitectureDesign @@ -0,0 +1,72 @@ +软件体系结构设计报告(总体设计) + +1. 概述 +本报告描述ECMS系统的总体架构与关键设计决策,严格对应当前代码实现。系统采用前后端分离架构:后端Spring Boot提供REST接口,前端Vue提供界面与路由导航。 + +2. 架构概览 +- 分层: + - 接口层(Controller):`com.prj.controller.*`,提供REST接口、分页与统一结果包装; + - 业务层(Service):`com.prj.service.*` 与 `impl`,封装业务逻辑与事务; + - 数据访问层(Mapper/Repo):`com.prj.mapper.*`(MyBatis)与 `com.prj.repo.*`(JPA/Redis); + - 领域模型:`com.prj.domain.*`; + - 框架与配置:`com.prj.framework.*`、`com.prj.common.*`; +- 前端: + - 路由:`src/router/index.js`; + - API:`src/api/*.js` 通过 `@/utils/request` 调用后端; + - 状态:`src/store`; + +3. 模块划分与依赖 +- 用户与安全:`LoginController`、`CaptchaController`、`framework.security` 与 `framework.web.service.LoginService`; +- 部门管理:`DeptController` ↔ `IDeptService` ↔ `DeptMapper.xml` ↔ `Dept`; +- 员工管理:`EmployeeController` ↔ `IEmployeeService` ↔ `EmployeeMapper.xml` ↔ `Employee`; +- 员工评价:`EmployeeKpiController` ↔ `IEmployeeKpiService` ↔ `EmployeeKpiMapper.xml` ↔ `EmployeeKpi`; +- 招人名额:`HireNumController` ↔ `IHireNumService` ↔ `HirenumRepo`/`HireNumMapper.xml` ↔ `HireNum`(实体带JPA注解); +- 薪资标准:`SalaryLevelController` ↔ `ISalaryLevelService` ↔ `SalaryLevelMapper.xml` ↔ `SalaryLevel`; +- 缓存:`RedisCache` 用于验证码; + +4. 关键设计 +4.1 统一返回与分页 +- `AjaxResult` 统一返回格式; +- `BaseController` 提供 `startPage()` 与 `getDataByPage()`,确保各列表接口一致的分页行为。 + +4.2 事务 +- `EmployeeController#edit` 使用 `@Transactional` 保证更新一致性;其他事务由服务层按需控制。 + +4.3 数据持久化 +- 以MyBatis XML为主(见 `resources/mapper/*.xml`),`HireNum` 同时具备JPA实体注解并通过 `HirenumRepo` 使用; +- 领域模型简洁,字段即数据库列的直接映射; + +4.4 安全与会话 +- 登录流程:验证码生成与Redis校验 → `LoginService.login` 签发 `token`; +- 前端拦截器自动在请求头附加 `Authorization`;401时触发登出与跳转。 + +4.5 前端结构 +- 路由按照模块分组(部门/员工/评价/招聘名额/薪资标准)与首页、登录; +- API封装统一超时、错误码处理与消息提示; + +5. 接口与数据流 +- 前端页面触发 API 请求 → `@/utils/request` 注入 `Authorization` → 后端Controller → Service → Mapper/Repo → 数据库/缓存 → 结果包装返回。 + +6. 日志与监控 +- 使用 `logback.xml` 配置日志;生产环境可扩展接入APM或集中式日志(当前代码未包含)。 + +7. 配置与环境 +- 后端配置:`src/main/resources/application.yml`; +- 数据源/Redis等依赖通过Spring配置加载(当前文件中可见Redis用于验证码)。 + +8. 集成测试计划(概要) +- 鉴权链路联调:`/captchaImage` → `/login` → 携带 `Authorization` 调用任一CRUD接口,验证401/200分支; +- 各模块CRUD链路:前端各页面操作对应API,验证分页、详情、创建、更新、删除端到端行为; +- 事务验证:并发/异常场景下 `PUT /employee` 数据一致性; + +9. 部署与分支规范 +- 主分支 `main`,目录结构 `doc/` 与 `src/`; +- 开发者以个人分支开发,提交合并请求以便指导老师审阅参与度; +- Windows 开发环境,前端、后端分别启动; + +10. 演进与扩展性 +- 可在Service层引入DTO与校验; +- 可在安全层引入基于角色的访问控制; +- 可为各模块添加审计日志与操作记录。 + + diff --git a/DeploymentGuide b/DeploymentGuide new file mode 100644 index 0000000..377411d --- /dev/null +++ b/DeploymentGuide @@ -0,0 +1,51 @@ +部署说明(Windows 环境) + +1. 环境准备 +- 操作系统:Windows 10/11 +- JDK:8+(建议 11) +- Node.js:16+(与项目 `package.json` 兼容) +- Redis:用于验证码缓存 + +2. 后端(Spring Boot) +2.1 进入目录 +`backend/backend/prj-backend(Spring Boot版)` + +2.2 配置 +- 编辑 `src/main/resources/application.yml`: + - 数据库连接(url、username、password) + - Redis 连接 + +2.3 编译与运行 +- 使用IDE(IntelliJ IDEA/Eclipse)导入Maven项目并运行 `SpringBootApplication`; +- 或命令行(PowerShell): + - `mvn -v`(确认Maven可用) + - `mvn clean package -DskipTests` + - 运行:`java -jar target/*.jar` + +3. 前端(Vue) +3.1 进入目录 +`frontend` + +3.2 安装依赖(首次) +`npm install` + +3.3 配置 +- 在根目录或 `.env.*` 中设置 `VUE_APP_BASE_API` 指向后端地址(如 `http://localhost:8080`)。 + +3.4 启动 +`npm run serve` + +4. 访问 +- 前端开发地址:`http://localhost:8080`(或控制台实际端口) +- 登录页:`/login`;首页:`/index` + +5. 常见问题 +- 401:确认登录成功并在请求头携带 `Authorization: Bearer `; +- 验证码过期:重新获取 `/captchaImage`; +- 超时:前端默认 2000ms,可在 `src/utils/request.js` 调整。 + +6. 目录规范 +- 主分支:`main`;结构包含 `doc/` 与 `src/`; +- 前后端独立启动; + + diff --git a/DesignDiagrams b/DesignDiagrams new file mode 100644 index 0000000..a31eafd --- /dev/null +++ b/DesignDiagrams @@ -0,0 +1,75 @@ +设计图示(类图与时序图) + +1. 类关系图(简化) +```mermaid +classDiagram + class DeptController + class EmployeeController + class EmployeeKpiController + class HireNumController + class SalaryLevelController + class LoginController + class CaptchaController + + class IDeptService + class IEmployeeService + class IEmployeeKpiService + class IHireNumService + class ISalaryLevelService + + class Dept + class Employee + class EmployeeKpi + class HireNum + class SalaryLevel + + DeptController --> IDeptService + EmployeeController --> IEmployeeService + EmployeeKpiController --> IEmployeeKpiService + HireNumController --> IHireNumService + SalaryLevelController --> ISalaryLevelService + + IDeptService --> Dept + IEmployeeService --> Employee + IEmployeeKpiService --> EmployeeKpi + IHireNumService --> HireNum + ISalaryLevelService --> SalaryLevel +``` + +2. 登录时序图 +```mermaid +sequenceDiagram + participant U as User + participant FE as Frontend(Vue) + participant BE as Backend(Spring Boot) + participant REDIS as Redis + + U->>FE: 打开登录页 + FE->>BE: GET /captchaImage + BE->>REDIS: 保存(uuid -> code) + BE-->>FE: uuid, img(Base64) + U->>FE: 输入 username/password/code + FE->>BE: POST /login {username,password,code,uuid} + BE->>REDIS: 校验 code + BE-->>FE: token + FE->>FE: 保存 Admin-Token(Cookie) +``` + +3. 分页查询时序图 +```mermaid +sequenceDiagram + participant FE as Frontend + participant CTRL as Controller + participant SVC as Service + participant DAO as Mapper/Repo + + FE->>CTRL: GET //list?query + CTRL->>CTRL: startPage() + CTRL->>SVC: select*List(query) + SVC->>DAO: 查询 + DAO-->>SVC: 列表数据 + SVC-->>CTRL: 列表数据 + CTRL-->>FE: TableDataInfo +``` + + 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与校验框架; +- 统一异常处理与错误码枚举; +- 审计日志与操作记录; + + diff --git a/DevProcess b/DevProcess new file mode 100644 index 0000000..78e8fc1 --- /dev/null +++ b/DevProcess @@ -0,0 +1,35 @@ +研发流程规范 + +1. 分支策略 +- 主分支:`main`(包含 `doc/` 与 `src/`) +- 个人分支:每人各建一个分支,例如 `feature/` 或 `user/`; +- 合并策略:先将更改提交到个人分支,发起 Merge Request 到 `main`,由指导老师/管理员评审后合并; + +2. 提交流程 +- 提交前: + - 更新/新增文档(SRS/IRS/Architecture/DetailedDesign/测试计划/用例/设计图示) + - 自测:前后端基础运行、主要用例走通; +- 提交信息规范: + - `feat:` 新功能;`fix:` 修复;`docs:` 文档;`refactor:` 重构;`test:` 测试; + - 简明描述变更范围与影响模块; + +3. 评审要点 +- 代码可读性与一致性(命名、格式、错误处理); +- 与文档一致(API/路由/数据库字段变更需同步文档); +- 单元/集成测试是否覆盖关键路径; + +4. 版本与标记 +- 以里程碑或迭代结束在 `main` 打标签(如 `v0.1.0`); + +5. 变更同步 +- 当 API、路由、数据库字段有变更: + - IRS/SRS 第3~5章更新 + - DetailedDesign 对应小节更新 + - 测试计划与用例同步调整 + - 设计图示(类图/时序图)如有结构变化也需更新 + +6. Windows 环境注意 +- 命令行不要使用 `&&` 连续执行; +- 确认 Redis/数据库服务已启动; + + diff --git a/ECMS-Deliverables b/ECMS-Deliverables new file mode 100644 index 0000000..e69de29 diff --git a/IRS b/IRS new file mode 100644 index 0000000..5b970e5 --- /dev/null +++ b/IRS @@ -0,0 +1,107 @@ +接口需求规格说明(IRS) + +1. 引言 +本文件列出系统对外提供的HTTP/JSON接口规范,严格依据当前代码实现与前端调用编写。 + +2. 接口通用规范 +2.1 协议与认证 +- 协议:HTTP/HTTPS,JSON 编码; +- 认证:除登录与验证码外,默认需在请求头携带 `Authorization: Bearer `; +- Token 获取:通过 `POST /login` 成功登录后,在响应体中以 `Constants.TOKEN` 键返回;前端将其以 `Admin-Token` Cookie 持久化,并在请求拦截器自动附加到请求头。 + +2.2 响应包装 +- 成功:`{ code: 200, msg: 'success', data: any }` +- 失败:`{ code: 非200, msg: string }` +- 分页:`TableDataInfo`(包含列表与分页元数据,前端直接使用返回体) + +2.3 错误码约定(前端处理) +- 401:登录过期或未认证,需重新登录; +- 500:服务端错误; +- 其他非200:按 `src/utils/errorCode.js` 进行展示。 + +2.4 超时与BaseURL +- BaseURL:`process.env.VUE_APP_BASE_API` +- 超时:2000ms + +3. 接口清单 + +3.1 验证码 +GET /captchaImage +- 功能:生成验证码图片与 `uuid`,并在Redis保存验证码文本(键:`Constants.CAPTCHA_CODE_KEY + uuid`)。 +- 请求头:无特殊要求 +- 请求参数:无 +- 响应体:`{ code, msg, uuid: string, img: string(Base64) }` + +3.2 登录 +POST /login +- 功能:登录并颁发 `token`。 +- 请求头:`isToken: false` 可选(前端默认对登录不附加Authorization) +- 请求体:`{ username: string, password: string, code: string, uuid: string }` +- 响应体:`{ code, msg, token: string }`(键名为常量 `Constants.TOKEN`) + +3.3 部门信息管理 +GET /dept_info/list +- 入参:查询参数映射 `Dept` 字段(如 `name`, `manager`, `reportto` 等) +- 出参:`TableDataInfo` + +GET /dept_info/{id} +- 入参:路径参数 `id` +- 出参:`AjaxResult(data: Dept)` + +POST /dept_info +- 入参:`Dept` JSON +- 出参:`AjaxResult` + +PUT /dept_info +- 入参:`Dept` JSON +- 出参:`AjaxResult` + +DELETE /dept_info/{ids} +- 入参:路径参数,支持 `,` 分隔批量或数组映射(由后端解析为 `Long[]`) +- 出参:`AjaxResult` + +3.4 员工信息管理 +GET /employee/list +GET /employee/{id} +POST /employee +PUT /employee +DELETE /employee/{ids} +- 说明:与3.3一致;`PUT /employee` 带事务。 + +3.5 员工评价管理 +GET /employee_kpi/list +GET /employee_kpi/{id} +POST /employee_kpi +PUT /employee_kpi +DELETE /employee_kpi/{ids} + +3.6 招人名额管理 +GET /hirenum/list +GET /hirenum/{id} +POST /hirenum +PUT /hirenum +DELETE /hirenum/{ids} + +3.7 薪资标准管理 +GET /salary_level/list +GET /salary_level/{id} +POST /salary_level +PUT /salary_level +DELETE /salary_level/{ids} + +4. 数据模型(请求/响应数据结构) +- Dept: `{ id: Long, name: String, manager: String, reportto: String }` +- Employee: `{ id: Long, dept: String, name: String, position: String, salary: BigDecimal }` +- EmployeeKpi: `{ id: Long, kpi: String, bonus: String, manager: String }` +- HireNum: `{ id: Long, dept: String, num: BigDecimal, endtime: String }` +- SalaryLevel: `{ id: Long, jobType: String, salary: BigDecimal, salaryrange: BigDecimal }` + +5. 安全与会话 +- 登录成功后,前端以Cookie键 `Admin-Token` 存储token; +- 后续请求由 `@/utils/request` 在拦截器中设置 `Authorization: Bearer `; +- 401时前端触发登出并跳转首页。 + +6. 版本与变更 +- 本文档随接口变更同步更新;如有新增模块或字段变化,请同步调整第3、4章。 + + diff --git a/IntegrationTestCases b/IntegrationTestCases new file mode 100644 index 0000000..c493546 --- /dev/null +++ b/IntegrationTestCases @@ -0,0 +1,69 @@ +集成测试用例集(Integration Test Cases) + +1. 说明 +本用例集基于《体系结构设计报告》的集成测试计划细化,覆盖鉴权链路与五个业务模块端到端。所有URL、字段与流程严格对应现有代码与前端调用。 + +2. 前置条件 +- 后端服务已启动; +- `VUE_APP_BASE_API` 指向后端; +- 数据库有基础数据或可按需构造; + +3. 用例列表 + +3.1 验证码获取 +- 用例ID:IT-CAP-001 +- 步骤:GET `/captchaImage` +- 期望:返回 `code=200` 且 `uuid` 非空,`img` 为Base64;Redis含对应键值。 + +3.2 登录成功 +- 用例ID:IT-AUTH-001 +- 前置:从 IT-CAP-001 获取 `uuid` 与正确验证码`code` +- 步骤:POST `/login`,Body含 `{username,password,code,uuid}` +- 期望:返回 `code=200` 且包含 `token` 字段(键名为后端常量)。 + +3.3 登录失败(验证码错误) +- 用例ID:IT-AUTH-002 +- 步骤:POST `/login`,验证码错误 +- 期望:返回非200,消息提示。 + +3.4 未认证访问受限接口 +- 用例ID:IT-AUTH-003 +- 步骤:GET `/employee/list` 不带 `Authorization` +- 期望:返回401(前端应提示重新登录)。 + +3.5 部门信息-分页查询 +- 用例ID:IT-DEPT-001 +- 步骤:使用合法 `Authorization`,GET `/dept_info/list` 携带查询参数 +- 期望:`code=200`,返回 `TableDataInfo`,`rows` 长度符合分页大小。 + +3.6 部门信息-新增/详情/更新/删除 +- 用例ID:IT-DEPT-002 +- 步骤: + 1) POST `/dept_info` 新增; + 2) GET `/dept_info/{id}` 校验详情; + 3) PUT `/dept_info` 更新字段; + 4) DELETE `/dept_info/{id}` 删除; +- 期望:各步骤 `code=200`,数据与数量变化正确。 + +3.7 员工信息-分页与CRUD +- 用例ID:IT-EMP-001/002 +- 步骤:同 IT-DEPT-001/002; +- 特别:更新接口为事务方法,构造异常时应回滚。 + +3.8 员工评价-分页与CRUD +- 用例ID:IT-KPI-001/002 +- 步骤:同模板执行。 + +3.9 招人名额-分页与CRUD +- 用例ID:IT-HN-001/002 +- 步骤:同模板执行,关注 `num` 与 `endtime` 字段类型与格式。 + +3.10 薪资标准-分页与CRUD +- 用例ID:IT-SAL-001/002 +- 步骤:同模板执行,关注 `salary` 与 `salaryrange` 精度。 + +4. 通过标准 +- 所有用例均返回 `code=200`(异常用例除外),数据与流程与预期一致; +- 401/错误码在前端被正确处理与提示。 + + diff --git a/SRS b/SRS new file mode 100644 index 0000000..cc01683 --- /dev/null +++ b/SRS @@ -0,0 +1,184 @@ +软件需求规格说明书(SRS) + +1. 引言 +1.1 目的 +本SRS用于规范“企业人力资源与薪酬管理系统(ECMS)”当前已实现的软件需求,作为设计、测试与验收的依据。本文档严格依据现有代码实现与前端路由/接口编写,不包含未实现的功能。 + +1.2 范围 +系统提供部门信息管理、员工信息管理、员工绩效评价管理、招聘名额管理、薪资标准管理、登录与验证码功能,并提供对应的前后端实现。 + +1.3 读者对象 +开发人员、测试人员、项目管理者、指导老师与评审人员。 + +1.4 参考资料 +- 后端:`backend/backend/prj-backend(Spring Boot版)` Spring Boot 应用 +- 前端:`frontend` Vue 应用 +- 主要代码位置:后端 `com.prj.controller.*`、`com.prj.domain.*`;前端 `src/api/*.js`、`src/router/index.js` + +1.5 术语与缩略语 +- KPI:关键绩效指标 +- SRS:软件需求规格说明书 + +2. 系统概述 +2.1 系统目标 +为企业提供基础的人力资源与薪酬相关信息的增删改查与查询分页,支持登录鉴权及验证码。 + +2.2 用户角色 +- 普通登录用户:可以访问各信息管理页面并执行相应的列表、查看、增删改操作(具体权限由后端安全配置决定,当前代码未在控制器级别区分角色)。 + +2.3 运行环境 +- 后端:Java 8+/Spring Boot,接口风格为 REST; +- 前端:Vue,使用基于 `@/utils/request` 的 Axios 封装; +- 数据库:依据实体与 MyBatis/JPA 映射(如 `HireNum` 使用 JPA 注解;其余实体通过 Mapper XML 进行 CRUD)。 + +3. 外部接口需求(API) +说明:以下接口均返回统一包装对象 `AjaxResult` 或分页包装 `TableDataInfo`(后端 `BaseController` 提供 `startPage()` 和 `getDataByPage()`)。 + +3.1 登录与验证码 +- GET `/captchaImage` + - 功能:获取验证码图片与UUID;验证码存入 Redis,键以 `Constants.CAPTCHA_CODE_KEY + uuid` 保存。 + - 返回:`{ uuid: string, img: string(Base64) }` 以及成功标识。 +- POST `/login` + - 入参:`{ username, password, code, uuid }` + - 功能:验证验证码并登录,成功后返回 `token`,键名为 `Constants.TOKEN`。 + +3.2 部门信息管理(后端 `DeptController`,前端 `src/api/dept_info.js`) +- GET `/dept_info/list`:分页查询;查询参数映射到 `Dept` 字段。 +- GET `/dept_info/{id}`:按ID获取详情。 +- POST `/dept_info`:新增部门。 +- PUT `/dept_info`:修改部门。 +- DELETE `/dept_info/{ids}`:删除,支持批量ID。 + +3.3 员工信息管理(后端 `EmployeeController`,前端 `src/api/employee.js`) +- GET `/employee/list`:分页查询。 +- GET `/employee/{id}`:按ID获取详情。 +- POST `/employee`:新增。 +- PUT `/employee`:修改(方法含事务注解)。 +- DELETE `/employee/{ids}`:删除(批量)。 + +3.4 员工评价管理(后端 `EmployeeKpiController`,前端 `src/api/employee_kpi.js`) +- GET `/employee_kpi/list` +- GET `/employee_kpi/{id}` +- POST `/employee_kpi` +- PUT `/employee_kpi` +- DELETE `/employee_kpi/{ids}` + +3.5 招人名额管理(后端 `HireNumController`,前端 `src/api/hirenum.js`) +- GET `/hirenum/list` +- GET `/hirenum/{id}` +- POST `/hirenum` +- PUT `/hirenum` +- DELETE `/hirenum/{ids}` + +3.6 薪资标准管理(后端 `SalaryLevelController`,前端 `src/api/salary_level.js`) +- GET `/salary_level/list` +- GET `/salary_level/{id}` +- POST `/salary_level` +- PUT `/salary_level` +- DELETE `/salary_level/{ids}` + +4. 功能性需求 +4.1 登录与验证码 +- 用户访问登录页(前端路由 `/login`),先调用 `/captchaImage` 获取 `uuid` 与验证码图片;填写用户名、密码与验证码提交到 `/login`;成功后获得 `token` 并维持会话。 + +4.2 菜单与路由导航(前端 `src/router/index.js`) +- 首页 `/index` +- 部门信息管理 `/dept_info` +- 薪资标准管理 `/salary_level` +- 招人名额管理 `/hirenum` +- 员工信息管理 `/employee` +- 员工评价管理 `/employee_kpi` + +4.3 业务模块用例(均支持列表、查看、创建、更新、删除) +- 部门信息:维护部门编号、名称、经理、汇报对象。 +- 员工信息:维护员工编号、部门、姓名、职位、薪资。 +- 员工评价:维护员工编号、考评结果、奖金、考评人。 +- 招人名额:维护部门、名额数量、截止时间。 +- 薪资标准:维护职位类型、标准薪资、上下浮动范围。 + +5. 数据需求(领域模型) +5.1 `Dept` +- `id: Long` 部门编号 +- `name: String` 部门名 +- `manager: String` 部门经理 +- `reportto: String` 汇报对象 + +5.2 `Employee` +- `id: Long` 编号 +- `dept: String` 部门 +- `name: String` 姓名 +- `position: String` 职位 +- `salary: BigDecimal` 薪资 + +5.3 `EmployeeKpi` +- `id: Long` 员工编号 +- `kpi: String` 考评结果 +- `bonus: String` 奖金 +- `manager: String` 考评人 + +5.4 `HireNum`(带JPA表映射,表名 `hire_num`) +- `id: Long` 主键,自增 +- `dept: String` 部门 +- `num: BigDecimal` 招人名额 +- `endtime: String` 截止时间 + +5.5 `SalaryLevel` +- `id: Long` +- `jobType: String` 职位类型 +- `salary: BigDecimal` 薪资水平 +- `salaryrange: BigDecimal` 上下幅度 + +6. 非功能性需求 +6.1 性能 +- 列表查询统一分页(`startPage()`),保障大数据量场景的响应; +- 常规CRUD操作在单体应用内应在300ms内完成(实验室/教学环境)。 + +6.2 可靠性与事务 +- 员工信息修改接口含事务边界,保障更新一致性; +- 其他模块使用服务层与Mapper/JPA进行持久化,错误通过 `AjaxResult.error` 反馈。 + +6.3 安全 +- 登录采用验证码 + 账号密码,颁发 `token`;前端应在请求头中附加凭证(封装于 `@/utils/request`)。 + +6.4 可用性 +- 前端导航清晰,模块划分为部门/员工/评价/招聘名额/薪资标准五大页面 + 登录/首页。 + +6.5 兼容性 +- 后端 REST JSON;前端 Axios 调用;与现代浏览器兼容。 + +7. 约束与假设 +- 代码中未体现复杂权限/角色控制,默认当前用户可访问相关模块; +- `HireNum` 使用JPA,其余模块使用MyBatis XML(见 `resources/mapper/*.xml`)。 + +8. 验收测试计划(概要) +8.1 登录与验证码 +- 正常流程:获取验证码 → 正确填写四要素 → 返回 `token`。 +- 异常流程:验证码错误/过期、账号密码错误,返回错误信息。 + +8.2 各模块CRUD +- 列表分页:参数查询与总数校验; +- 新增/修改:字段必填性与类型校验; +- 删除:单个与批量删除后列表与详情验证; +- 详情:按ID精确返回。 + +8.3 前端路由与页面 +- 菜单项可进入对应页面并触发相应 API; +- 登录后可访问受限页面(如有拦截)。 + +9. 追踪矩阵(实现对齐) +- 路由 ↔ 视图 ↔ API ↔ 控制器 ↔ 领域模型 + - `/dept_info` ↔ `views/dept_info` ↔ `src/api/dept_info.js` ↔ `DeptController` ↔ `Dept` + - `/employee` ↔ `views/employee` ↔ `src/api/employee.js` ↔ `EmployeeController` ↔ `Employee` + - `/employee_kpi` ↔ `views/employee_kpi` ↔ `src/api/employee_kpi.js` ↔ `EmployeeKpiController` ↔ `EmployeeKpi` + - `/hirenum` ↔ `views/hirenum` ↔ `src/api/hirenum.js` ↔ `HireNumController` ↔ `HireNum` + - `/salary_level` ↔ `views/salary_level` ↔ `src/api/salary_level.js` ↔ `SalaryLevelController` ↔ `SalaryLevel` + - `/login` ↔ `views/login` ↔ `POST /login` ↔ `LoginController` + - `/captchaImage` ↔ `GET /captchaImage` ↔ `CaptchaController` + +10. 变更管理 +- 本SRS将随代码与接口变更而更新;当新增/调整 API、路由、数据模型时,需同步修订第3~5章与追踪矩阵。 + +附录 A:错误码 +- 采用统一 `AjaxResult` 包装;具体错误码与消息由后端 `errorCode` 与全局异常处理决定(前端 `src/utils/errorCode.js`)。 + + diff --git a/UnitTestPlan b/UnitTestPlan new file mode 100644 index 0000000..5830f34 --- /dev/null +++ b/UnitTestPlan @@ -0,0 +1,46 @@ +单元测试计划(Unit Test Plan) + +1. 目标 +验证控制器与服务层的核心逻辑与数据契约稳定性,确保已实现功能按预期工作。 + +2. 范围 +- 控制器:`DeptController`、`EmployeeController`、`EmployeeKpiController`、`HireNumController`、`SalaryLevelController`、`LoginController`、`CaptchaController`; +- 服务:对应的 `I*Service` 及其 `impl`; + +3. 测试类型 +- 正向用例:CRUD 成功路径; +- 反向用例:非法ID、缺失字段、验证码错误/过期、未携带token; +- 边界场景:分页页码/大小边界、批量删除空集合/超长集合; + +4. 工具与环境 +- 后端:Spring Boot Test + MockMvc; +- 数据:H2或测试库,初始化测试数据(或使用Mock Mapper/Repo); + +5. 测试用例(示例级别) +5.1 验证码 +- GET /captchaImage:应返回 `uuid` 与 `img(Base64)`,并在Redis写入键; + +5.2 登录 +- 正常:正确的 `{username,password,code,uuid}` → 返回 `code=200` 且包含 `token`; +- 异常:验证码错误/过期 → 返回非200; + +5.3 部门信息管理 +- list:普通查询分页; +- get:存在ID返回详情,不存在ID返回空或错误码; +- add/update:字段类型与业务约束验证; +- delete:单/多ID删除后验证数量变化; + +5.4 员工信息管理(含事务) +- update:在事务内抛异常时应回滚,数据保持一致; + +5.5 员工评价 / 招人名额 / 薪资标准 +- 与部门/员工一致的CRUD用例模板; + +6. 通过标准 +- 所有正向用例通过; +- 关键反向与边界用例通过; + +7. 持续集成 +- 建议在提交时触发单测,报告覆盖率; + + diff --git a/readme b/readme new file mode 100644 index 0000000..66dc905 --- /dev/null +++ b/readme @@ -0,0 +1 @@ +undefined \ No newline at end of file