配合使用的vue
前端项目和截图,请移步vue-admin-template
项目演示:地址 账号密码默认填充(admin,a123456)
若文档不能正常查看,请移步 文档地址
多个spring boot前后端分离管理系统
开发经验总结而成,使用restful
风格API
,
包含角色
权限
代码生成
增删改查示例
,
集成mybatis plus
无需书写sql
即可实现大部分接口。
项目功能完整,结构特别简单易懂,未做多余封装,上手难度极地。可作为模板项目使用,大大提高开发效率。
特别适合中小型项目
、新手
和个人开发者
参考及使用,一天开发一个项目不是梦。
- JDK 1.8 +
- Maven 3.5 +
- IntelliJ IDEA ULTIMATE 或者 Eclipse (安装
_lombok_
插件) - Mysql 5.7 +(mysql8 驱动名称和之前不一样,项目示例为mysql8驱动名称)
名称 | 介绍 |
---|---|
Spring Boot 2.2.1.RELEASE | 无 |
mybatis-plus 3.2.0 | 用着超爽的mybatis |
插件,可在baseService |
|
中实现常用的数据库操作 | |
jwt-token | 使用jwt |
生成token |
|
,实现登录认证 | |
swagger 2.9.2 | 生成项目文档,供app和前端使用 |
template-api
├── template-generator -- 代码生成器
│ └── Generator.java -- 运行此java生成代码
└── template-main -- 业务模块
├── base包 -- 常用父类
│ ├── BaseEntity.java -- 包含一个id,所有Entity的父类
│ ├── BaseLogEntity.java -- 继承BaseEntity,包含createBy,createTime,updateBy.updateTime四个日志相关的field
│ ├── BaseService.java -- 继承自mybatis plus,包含常用的增删改查方法,具体使用参考mybatis plus文档
│ └── BaseSvo.java -- svo为search vo简写,用于接收前端传递查询条件,包含pageNum和pageSize
├── config包 -- 项目配置
│ ├── @Auth.java -- 此注解用于实现权限验证,添加到@Auth("permission")到controller方法鉴权
│ ├── @NoAuth.java -- 默认所有的controller方法需要登录,使用这个注解排除登录,例如登录注册接口
│ ├── MybatisPlusConfig.java -- mybatis plus配置文件,分页在此配置
│ ├── MyMetaObjectHandler.java -- mybatis plus自动填充功能,可以自动插入createBy,createTime,updateBy.updateTime值
│ ├── AuthAspect.java -- aop实现鉴权,和访问日志
│ ├── MvcConfig.java -- spring mvc常用配置,包含跨域,时间格式化等等
│ ├── ProjectParam.java -- 此项目的配置文件映射,自动读取application.properties中的私有配置
│ └── Swagger2.java -- Swagger2配置文件
├── controller包 -- 使用restfull风格api
│ ├── AccountController.java -- 账户相关,登录、修改密码等
│ ├── DeptController.java -- 部门,树形结构的参考此模块,自动转换为前端通用数据结构
│ ├── DeviceController.java -- 增删改查示例模块
│ ├── PermissionController.java -- 权限
│ ├── RoleController.java -- 角色
│ ├── UserController.java -- 用户
│ └── 角色 权限 用户模块因为 多对多中间表 问题,写了好多sql,其他模块使用通用方法基本都能解决
├── entity包 -- 和数据库对应,继承BaseEntity.java或者BaseLogEntity.java
├── exception包 -- 异常类
│ ├── MyException.java -- 常见的异常,例如参数校验,是否存在等抛出此异常,前端httpstatus自动为400
│ ├── NoAuthException.java -- 未登录访问接口抛出此异常,前端httpstatus自动为401
│ └── UnauthorizedException.java -- 登录但是无具体权限抛出此异常,前端httpstatus自动为403
├── mapper包 -- mybatis mapper
├── service包 -- 服务类,继承BaseService.java
├── svo包 -- svo为search vo简写,用于接收前端传递查询条件,继承BaseSvo.java
├── util包 -- 工具类,包含BCrypt密码加密、树形结构转换、jwt token生成,日期工具,获取当前用户工具,json工具等
└── vo包 -- 相当于dto包,集成字entity,用于传递entity中不包含的参数给前端
- clone或者下载项目
- 使用
Intellij idea
或者Eclipse
导入maven
项目 - 创建
mysql
数据库,执行项目根目录/sql/db.sql
- 修改
application-dev.properties
中的数据库连接参数 - 运行
template-main
中的TemplateApplication.java
即可启动项目 (请运行前端项目查看实际界面效果) vue-admin-template - 更改名称,由于是模板项目,所有的
项目名称
、包名
、artifactId
、modules
、Dockerfile
、代码生成器
等均为template
,建议按照自己的项目名称修改,也可以不改。
#进入项目目录
cd template-api
#打包(可在本地打包,提交jar后,到服务器运行docker命令)
mvn install
#进入Dockerfile所在文件夹
cd template-main
#docker打包镜像
docker build -t template-api:latest .
#启动docker容器,可使用-e SPRING_PROFILES_ACTIVE=${env}指定环境,不指定则默认为dev
docker run -itd --name template-api -e SPRING_PROFILES_ACTIVE=dev template-api:latest
配置参考
参考我的文章 最优雅的Docker+Jenkins pipeline部署Spring boot项目
#进入项目目录
cd template-api
#打包
mvn install
#linux 在jar所在目录执行
nohup java -jar template-api.jar --spring.profiles.active=dev >log.txt &
#windows 在jar所在目录执行
java -jar template-api.jar --spring.profiles.active=dev
特别强大的mybatis工具,封装了大量通用方法,写很少的sql即可完成一个项目。
- 自动填充通用字段
- 逻辑删除
- 多租户(saas服务)
- 分页
- 等等
详细文档MyBatis-Plus文档
代码生成器由mybatis-plus提供,详情请参考 mybatis-plus 代码生成器
- 修改com.step.generator.Generator.java中的配置参数
- 执行main函数
- 控制台输入表名
文档配置文件com.step.template.main.config.Swagger2
只有dev
和test
环境会生成文档,可以修改配置文件的@Profile注解自定义
文档默认访问地址http://localhost:8020/swagger-ui.html
@NoAuth
-- 默认所有的controller
方法需要登录,使用这个注解排除登录,例如登录注册接口@Auth
-- 此注解用于实现权限验证,添加到@Auth("permissionName")
到controller方法中
鉴权permissionName
建议权限值采用user:query,user:edit
类似的形式,参考数据库中的permission
表com.step.template.main.config.AuthAspect
中会拦截所有controller
方法,根据注解进行相应的处理
- 既然权限管理系统,必须有
用户表
和权限表
- 一个
用户
可以有多个权限
,一个权限
可以分配给多个用户
,所以是多对多
关系。 多对多
会产生关联表,表示如下:
这种设计已经可以满足小型管理系统的需求,使用和开发都特别简单。
但是如果用户数增大,运营人员需要为每个用户分配权限,会浪费大量的精力,而且容易出错。
用户多,但是用户的角色
比如经理
、运维
等却很少,所以应该增加一层角色。
取消了用户
和权限
的直接关联,改为通过用户关联角色
、角色关联权限
的方法来间接地赋予用户权限。
当新增用户时只需分配已有的角色,大大减少运营人员工作量和出错率。
- 仔细查看MyBatis-Plus文档
- 仔细查看
工程结构
中项目结构介绍 - 除了查询列表(往往带有分页和模糊查询)自己写sql以外,其他情况尽量使用BaseService中的通用方法。 单个查询的使用多个service中的通用方法组合,而不是写sql,单个数据不会有性能问题。
- 数据库表和字段一定要添加comment,代码生成会根据comment生成swagger2文档
- Controller中接口返回的json数据未做包装,直接返回数据。
- 本项目根据http status判断是否成功,200等2开头的状态为成功,400,500等为失败。 前端ajax,axios会自动走到catch方法,处理特别简单。
- 如需外层包装成功失败状态,建议在aop或者拦截器中实现。
#本项目成功时返回结果如下
{
"name": "姓名",
"deptName": "部门名称"
}
#失败时
{
"name": "姓名",
"deptName": "部门名称"
}
#而不是
{
"error": 0,
"msg": "success",
"data": {
"name": "姓名",
"deptName": "部门名称"
}
}