文章目录
前言
本项目是基于开源项目江南一点雨/vhr进一步完善优化。
一 项目介绍
简介
一个企业人力资源管理系统,主要功能有员工个人信息、工资管理、部门管理、职位管理,以及员工的培训、考核、部门调动、奖励惩罚,系统角色分为管理员、人事专员、人事经理,不同角色有不同权限,管理员有全部权限,人事专员有人事管理、员工信息、工资管理权限,而人事经理比人事专员多了部门和职位管理权限。
功能结构图
技术选型
后端
技术 | 说明 | 版本 |
---|---|---|
SpringBoot | 容器+MVC框架 | 2.5.4 |
Spring Security | 认证和授权框架 | 5.5.2 |
JWT | JSON WEB TOKEN | 0.9.0 |
Mybatis | ORM框架 | 3.4.6 |
Mybatis-Generator | 数据层代码生成 | 1.3.3 |
Mysql | 数据库 | 5.7 |
Druid | 数据库连接池 | 1.2.0 |
Redis | 分布式缓存 | 5.0.14 |
FastJson | JSON 工具 | 1.2.3 |
Jackson | JSON 工具 | 2.10.1 |
Lombok | 简化对象封装工具 | 1.18.10 |
Swagger-UI | 文档生成工具 | 3.0.0 |
PageHelper | 分页插件 | 5.1.8 |
Spring-Websocket | 实时通信 | 5.3.9 |
Hibernator-Validator | 验证框架 | 6.2.0 |
JDk | JAVA 开发环境 | 1.8 |
Maven | 项目管理工具 | 3.6.1 |
Tomcat | 运行环境 | 9.0 |
Git | 版本控制工具 | 2.32.0 |
IDEA | 开发工具 | 2021.1.3 |
Postman | 接口测试工具 | 9.0 |
前端
技术 | 说明 | 版本 |
---|---|---|
Vue | 前端框架 | 2.6 |
Vue-router | 路由框架 | 3.0.7 |
Vuex | 全局状态管理框架 | 3.4.0 |
ElementUI | 前端UI框架 | 2.15 |
Axios | 前端HTTP框架 | 0.21.3 |
Echarts | 图表框架 | 5.2.1 |
JwChat | 聊天组件 | 1.0.1 |
Node.js | 运行环境 | 12.18 |
Vue/cli | 脚手架工具 | 4.5 |
VS Code | 开发工具 | 1.58 |
二 技术要点
Spring Security+JWT 实现认证授权
参考http://www.macrozheng.com/#/architect/mall_arch_04,http://www.macrozheng.com/#/architect/mall_arch_05
问题:后端需要保证接口访问的安全性,需要校验请求者的身份以及判断是否具有该权限
解决:
- 登录时后端生成token,返回给前端,token包含用户名、token的生成时间和过期时间
- 每次调用接口需要http请求头添加一个Authorization字段,存放token
- 后端先判断请求头的token是否存在,然后判断是否过期,再判断当前用户是否有相应权限,有的话则允许访问,否则拒绝访问
<!--SpringSecurity依赖配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!--JWT(Json Web Token)登录支持-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
# 自定义jwt key
jwt:
tokenHeader: Authorization #JWT存储的请求头
secret: xxx #JWT加解密使用的密钥
expiration: 604800 #JWT的超期限时间(60*60*24)
tokenHead: Bearer #JWT负载中拿到开头
AOP实现记录接口访问日志
参考http://www.macrozheng.com/#/technology/aop_log
问题:如果在每个控制器加入一段记录日志的代码,那么会导致代码冗余,而且与业务代码不能解耦
解决:使用AOP制作前置和后置通知,登录接口用后置通知,增、删、改接口用前置通知,实现记录请求客户端、请求方法、请求参数的功能
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.13</version>
</dependency>
Websocket协议实现在线聊天
参考https://blog.youkuaiyun.com/qq_41603102/article/details/82492040, https://zhengkai.blog.youkuaiyun.com/article/details/80275084
问题:在线聊天需要持久连接,全双工通信,如果用轮询方式会十分耗费网络资源
解决:使用websocket协议,一旦连接成功,便可以一直保持通信,直到断开连接,很适合在线聊天的业务场景
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
Redis缓存登录验证码
参考http://www.macrozheng.com/#/architect/mall_arch_03
问题:验证码发给前端后,需要保存以便后续校验,而且需要设置过期时间,时间到了就要删掉,使用mysql的话读写速度较慢
解决:使用redis做缓存,提高访问速度
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
spring:
# redis配置
redis:
host: localhost # Redis服务器地址
database: 0 # Redis数据库索引(默认为0)
port: 6379 # Redis服务器连接端口
password: # Redis服务器连接密码(默认为空)
jedis:
pool:
max-active: 8 # 连接池最大连接数(使用负值表示没有限制)
max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
max-idle: 8 # 连接池中的最大空闲连接
min-idle: 0 # 连接池中的最小空闲连接
timeout: 3000ms # 连接超时时间(毫秒)
# 自定义redis key
redis:
key:
prefix:
authCode: "verifyCode:"
expire:
authCode: 120 # 验证码超期时间
发送邮件
参考http://www.javaboy.org/2020/0101/springboot-mail.html
问题:hr添加员工时给新入职的员工发送邮件,邮件要按照一定格式
解决:
- 申请邮箱客户端(我用的是qq邮箱)授权码
- 使用 Thymeleaf 作邮件模板
- 使用 JavaMailSender 来发送邮件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
spring:
mail:
host: smtp.qq.com #配置 SMTP 服务器地址
port: 587 #SMTP 服务器的端口
username: xxx #配置邮箱用户名
password: xxx #配置密码,注意,不是真正的密码,而是刚刚申请到的授权码
default-encoding: utf-8 #默认的邮件编码
properties:
mail:
smtp:
socketFactoryClass: javax.net.ssl.SSLSocketFactory #配置 SSL 加密工厂
debug: false #关闭 DEBUG 模式