# performance_api
**Repository Path**: hrc-code/performance_api
## Basic Information
- **Project Name**: performance_api
- **Description**: 绩效管理系统的后端地址
- **Primary Language**: Unknown
- **License**: OSL-3.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2024-06-15
- **Last Updated**: 2025-06-28
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
绩效信息化平台
----
## 项目描述
该项目是前后端分离,前端使用Vue3 + elementPlus等技术,后端用SpringBoot + Camunda等技术编写的企业内部的绩效管理系统,可以更方便的
管理企业的员工的绩效。三人合作完成,我负责后端部分。
### 技术栈
SpringBoot + Camunda + JWT + redis + MyBatisPlus
### 功能模块
1. 首页模块
2. 部门模块
3. 员工模块
4. 岗位模块
5. 权限模块
6. 申报模块
7. 评分模块
8. 审批模块
9. 归档模块
10. 登录模块
分成三大类
1. 通用模块:登录模块,首页模块
2. 基础数据相关模块:部门模块, 员工模块,岗位模块,权限模块
3. 绩效相关模块:申报模块 评分模块 审批模块 归档模块
### 线上地址
### 我的职责
1. 使用JWT生成token再结合拦截器完成员工30分钟无操作自动退出并且完成10分钟内自动续约功能
2. 绘制BPMN流程图,使用Camunda工作引擎完成绩效审批功能
3. 使用redis存放验证码解决跨域无法显示图片问题,存放员工权限路由提高接口请求速度
4. 使用EasyExcel完成员工信息与绩效信息导入与导出功能
5. 独立设计数据库并且完成RBAC权限控制功能
6. 完成项目的前端与后端的部署,并且编写脚本简化部署流程
### 我的收获
1. 通过与前端搭档接口联调和编写接口文档,提高了我的合作能力
2. 通过在IDEA中大量使用图形化git,提高了我的git使用能力
3. 通过使用各种第三方库和debug,提高了我的编码能力
4. 通过在Linux与windows上部署项目,提高了我的项目部署能力
5. 通过设计40多张表,提高了我的表设计能力
6. 通过与该公司的业务人员交流,提高了我对业务的理解与交流能力
### 部署
1)前端
1. 通过阿里云的OSS部署 http://performance.huthrc.top
2. 通过服务器的nginx部署 http://pf.huthrc.top/
2)后端
1. 通过服务器的宝塔部署java应用
### 遇到的问题
1. 在Controller层 private修饰的方法的Service实现类注入为空
原因: spring aop代理的问题,无法代理private | final | static 修饰的方法
将private方法改为public
2. 在前端分离开发中登录验证码过期问题
原因:跨域导致sessionId不一致
解决:设置一个自定义请求头的x-request-id
3. 自定义的header在跨域的时候前端访问不到
原因:在使用CORS解决跨域的请求中,默认只能取到五个response header值 Content-Language Content-Type
Expires Last-Modified Pragma
解决:跨域的时候后端必须设置允许暴露的请求头,且不能设置为*否则无效 https://www.cnblogs.com/younghxp/p/16693535.html
4. 登录获取的token直接失效
原因: jwt中的exp过期时间单位为s,代码中获取当前时间戳单位为毫秒
解决:将两者单位统一再比较
5. 用户使用https协议访问无法获取验证码
原因: 前端使用http协议请求后端,而浏览器默认不允许混合使用http与https
解决: 用户手动允许浏览器允许访问不安全内容或更换浏览器或者将前端的后端请求协议改为https
### 表的优化
PositionAssessor 岗位审核人表
实体:岗位与员工
联系: 审核
关系: 多对多
字段
id int 业务id
positionId int 岗位id
assessorId int 审核人id
level int 审核人级别
----
手动添加第一个根部门
## RBAC
- 角色表
- 路由表
- 按钮表
- 用户表
员工进行登录,前端会向后端请求动态路由,后端根据员工的角色返回其对应的路由与按钮,然后前端根据这些动态路由加入路由表
## 审核流程
1. 首先绩效专员为岗位开启这个月的绩效考核流程
2. 其次绩效专员再为这个岗位的员工进行申报(记件,奖金)
3. 然后岗位的负责人对员工进行评分(okr,kpi,评分)
4. 再由审核人员对这些评分进行审核
5. 最后由绩效专员进行归档
## 请求流程
1. 每次请求都会依次经过Token拦截器,权限拦截器
2. 如果token无效或过期直接拒绝请请求,token剩余10分钟,则重新生成token
3. 经过权限拦截器时,会首先获取请求的uri,然后根据用户的id从redis中获取该员工的权限路由
4. 将这些权限路由与请求的uri进行匹配,如果没有则拒绝请求;
5. 当然如果redis中没有存放该员工的权限或者已经过期,则根据员工的roleId去数据库中查询该员工的权限路由
6. 将数据存放到redis中,然后按照刚才的步骤检查是否拒绝请求
7. 通过拦截器之后就根据请求的uri进入对应的controller类,然后执行方法
## camunda
1. 基本概念: 事件 任务 定时器 bpmn图
2. 使用SDK方式调用 runService taskService
3. 绘制bpmn图 : camunda modeler
## redis
1. 存放验证码 key vc:userid:xxx value string
2. 存放员工权限路由 key permission_routers:userid:xxx value set