Skip to content

spring boot项目模板,集成mybatis plus,包含完整的登录、鉴权、权限管理、代码生成、模块示例

Notifications You must be signed in to change notification settings

liu-xinhui/spring-boot-template

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

配合使用的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中不包含的参数给前端

运行项目

  1. clone或者下载项目
  2. 使用Intellij idea或者Eclipse导入maven项目
  3. 创建mysql数据库,执行项目根目录/sql/db.sql
  4. 修改application-dev.properties中的数据库连接参数
  5. 运行template-main中的TemplateApplication.java即可启动项目 (请运行前端项目查看实际界面效果) vue-admin-template
  6. 更改名称,由于是模板项目,所有的项目名称包名artifactIdmodulesDockerfile代码生成器等均为template,建议按照自己的项目名称修改,也可以不改。

部署项目

使用docker部署

#进入项目目录
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服务器开放了远程访问(外网记得启用TLS,否则不安全),可直接使用idea推送至服务器

配置参考

image.png

使用docker+jenkins部署

参考我的文章 最优雅的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-plus使用

特别强大的mybatis工具,封装了大量通用方法,写很少的sql即可完成一个项目。

  • 自动填充通用字段
  • 逻辑删除
  • 多租户(saas服务)
  • 分页
  • 等等

详细文档MyBatis-Plus文档

代码生成器使用

代码生成器由mybatis-plus提供,详情请参考 mybatis-plus 代码生成器

  1. 修改com.step.generator.Generator.java中的配置参数
  • image.png
  1. 执行main函数
  2. 控制台输入表名
  • image.png

swagger2文档使用

文档配置文件com.step.template.main.config.Swagger2

只有devtest环境会生成文档,可以修改配置文件的@Profile注解自定义

文档默认访问地址http://localhost:8020/swagger-ui.html

未添加@NoAuth的api需要设置token后才可访问 image.png

权限注解使用方法

  • @NoAuth -- 默认所有的controller方法需要登录,使用这个注解排除登录,例如登录注册接口
  • @Auth -- 此注解用于实现权限验证,添加到@Auth("permissionName")controller方法中鉴权
  • permissionName建议权限值采用user:query,user:edit类似的形式,参考数据库中的permission
  • com.step.template.main.config.AuthAspect中会拦截所有controller方法,根据注解进行相应的处理

image.png image.png

权限管理系统设计思路

我们先说一种权限管理最简单的做法

  • 既然权限管理系统,必须有用户表权限表
  • 一个用户可以有多个权限,一个权限可以分配给多个用户,所以是多对多关系。
  • 多对多会产生关联表,表示如下:

image.png

这种设计已经可以满足小型管理系统的需求,使用和开发都特别简单。 但是如果用户数增大,运营人员需要为每个用户分配权限,会浪费大量的精力,而且容易出错。 用户多,但是用户的角色比如经理运维等却很少,所以应该增加一层角色。

RBAC基于角色的权限访问控制(Role-Based Access Control)

取消了用户权限的直接关联,改为通过用户关联角色角色关联权限的方法来间接地赋予用户权限。 当新增用户时只需分配已有的角色,大大减少运营人员工作量和出错率。

  • 三张表分别为多对多关系 image.png
  • 生成关联网之后的结构如下 image.png

提示

  • 仔细查看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": "部门名称"
  }
}
  • com.step.template.main.util.ScopeUtil中可获取当前用户
  • 使用构造器注入,避免在private字段上写@Autowired,这么写idea会提示警告 Field injection is not recommended。构造器注入配合lombok写法很简洁。 image.png
  • BaseService提供字段唯一性检测,参考userService里的phone唯一检测 image.png

欢迎start,有疑问、建议、bug请提issue

About

spring boot项目模板,集成mybatis plus,包含完整的登录、鉴权、权限管理、代码生成、模块示例

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published