├── front
├── .env.development
├── .env.production
├── public
│ ├── favicon.ico
│ └── index.html
├── babel.config.js
├── src
│ ├── assets
│ │ ├── avatar.gif
│ │ └── login_bg.jpg
│ ├── http
│ │ ├── http.js
│ │ ├── modules
│ │ │ ├── login.js
│ │ │ └── menu.js
│ │ ├── auth.js
│ │ └── httpRequest.js
│ ├── views
│ │ ├── menu
│ │ │ ├── Echarts.vue
│ │ │ ├── Ueditor.vue
│ │ │ └── HomePage.vue
│ │ ├── dynamic
│ │ │ ├── sys
│ │ │ │ ├── UserList.vue
│ │ │ │ ├── MenuControl.vue
│ │ │ │ └── RoleControl.vue
│ │ │ └── DynamicMenu.vue
│ │ ├── home
│ │ │ ├── Content.vue
│ │ │ ├── Setup.vue
│ │ │ ├── UpdatePassword.vue
│ │ │ ├── Tab.vue
│ │ │ ├── Header.vue
│ │ │ └── Aside.vue
│ │ └── Home.vue
│ ├── store
│ │ ├── index.js
│ │ └── module
│ │ │ ├── user.js
│ │ │ └── common.js
│ ├── utils
│ │ └── validate.js
│ ├── i18n
│ │ ├── index.js
│ │ └── languages
│ │ │ ├── zh.json
│ │ │ └── en.json
│ ├── mock
│ │ ├── modules
│ │ │ ├── login.js
│ │ │ └── menu.js
│ │ └── index.js
│ ├── App.vue
│ ├── main.js
│ ├── components
│ │ └── common
│ │ │ ├── 404.vue
│ │ │ └── Login.vue
│ └── router
│ │ └── index.js
├── .gitignore
├── vue.config.js
├── package.json
└── README.md
├── README.md
└── back
├── src
├── main
│ ├── java
│ │ └── com
│ │ │ └── lyh
│ │ │ └── admin_template
│ │ │ └── back
│ │ │ ├── common
│ │ │ ├── validator
│ │ │ │ └── group
│ │ │ │ │ ├── AddGroup.java
│ │ │ │ │ ├── UpdateGroup.java
│ │ │ │ │ └── sys
│ │ │ │ │ ├── LoginGroup.java
│ │ │ │ │ └── RegisterGroup.java
│ │ │ ├── utils
│ │ │ │ ├── ExceptionUtil.java
│ │ │ │ ├── GsonUtil.java
│ │ │ │ ├── MessageSourceUtil.java
│ │ │ │ ├── MD5Util.java
│ │ │ │ ├── SmsUtil.java
│ │ │ │ ├── JwtUtil.java
│ │ │ │ ├── MailUtil.java
│ │ │ │ ├── Result.java
│ │ │ │ └── OssUtil.java
│ │ │ ├── config
│ │ │ │ ├── MyBatisPlusConfig.java
│ │ │ │ ├── LocaleConfig.java
│ │ │ │ ├── SwaggerConfig.java
│ │ │ │ ├── RedisConfig.java
│ │ │ │ └── JWTConfig.java
│ │ │ └── exception
│ │ │ │ ├── GlobalException.java
│ │ │ │ └── GlobalExceptionHandler.java
│ │ │ ├── mapper
│ │ │ ├── xml
│ │ │ │ └── UserMapper.xml
│ │ │ └── UserMapper.java
│ │ │ ├── modules
│ │ │ ├── oss
│ │ │ │ ├── mapper
│ │ │ │ │ ├── xml
│ │ │ │ │ │ └── BackOssMapper.xml
│ │ │ │ │ └── BackOssMapper.java
│ │ │ │ ├── service
│ │ │ │ │ ├── BackOssService.java
│ │ │ │ │ └── impl
│ │ │ │ │ │ └── BackOssServiceImpl.java
│ │ │ │ ├── entity
│ │ │ │ │ └── BackOss.java
│ │ │ │ └── controller
│ │ │ │ │ └── BackOssController.java
│ │ │ ├── sys
│ │ │ │ ├── mapper
│ │ │ │ │ ├── xml
│ │ │ │ │ │ ├── SysRoleMapper.xml
│ │ │ │ │ │ ├── SysUserMapper.xml
│ │ │ │ │ │ └── SysUserRoleMapper.xml
│ │ │ │ │ ├── SysUserMapper.java
│ │ │ │ │ ├── SysRoleMapper.java
│ │ │ │ │ └── SysUserRoleMapper.java
│ │ │ │ ├── vo
│ │ │ │ │ ├── JwtVo.java
│ │ │ │ │ ├── NamePwdLoginVo.java
│ │ │ │ │ ├── PhoneCodeLoginVo.java
│ │ │ │ │ ├── PhonePwdLoginVo.java
│ │ │ │ │ └── RegisterVo.java
│ │ │ │ ├── service
│ │ │ │ │ ├── SysRoleService.java
│ │ │ │ │ ├── SysUserRoleService.java
│ │ │ │ │ ├── SysUserService.java
│ │ │ │ │ └── impl
│ │ │ │ │ │ ├── SysRoleServiceImpl.java
│ │ │ │ │ │ ├── SysUserRoleServiceImpl.java
│ │ │ │ │ │ └── SysUserServiceImpl.java
│ │ │ │ ├── controller
│ │ │ │ │ ├── SysRoleController.java
│ │ │ │ │ ├── SysUserRoleController.java
│ │ │ │ │ └── SysUserController.java
│ │ │ │ └── entity
│ │ │ │ │ ├── SysUserRole.java
│ │ │ │ │ ├── SysRole.java
│ │ │ │ │ └── SysUser.java
│ │ │ └── sms
│ │ │ │ ├── entity
│ │ │ │ └── SmsResponse.java
│ │ │ │ └── controller
│ │ │ │ └── TestSMSController.java
│ │ │ ├── service
│ │ │ ├── UserService.java
│ │ │ └── impl
│ │ │ │ └── UserServiceImpl.java
│ │ │ ├── BackApplication.java
│ │ │ ├── controller
│ │ │ ├── UserController.java
│ │ │ ├── test
│ │ │ │ ├── TestJWTController.java
│ │ │ │ └── TestMailController.java
│ │ │ └── TestController.java
│ │ │ ├── vo
│ │ │ └── MailVo.java
│ │ │ ├── handler
│ │ │ └── MyMetaObjectHandler.java
│ │ │ └── entity
│ │ │ └── User.java
│ └── resources
│ │ ├── static
│ │ ├── i18n
│ │ │ ├── messages_zh_CN.properties
│ │ │ └── messages_en_US.properties
│ │ ├── sql
│ │ │ ├── back_oss.sql
│ │ │ ├── back_config.sql
│ │ │ ├── back_user.sql
│ │ │ └── sys
│ │ │ │ ├── sys_role.sql
│ │ │ │ ├── sys_user_role.sql
│ │ │ │ ├── sys_user.sql
│ │ │ │ ├── sys_menu.sql
│ │ │ │ └── sys_role_menu.sql
│ │ └── html
│ │ │ └── upload.html
│ │ ├── application.yml
│ │ └── logback-spring.xml
└── test
│ └── java
│ └── com
│ └── lyh
│ └── admin_template
│ └── back
│ ├── BackApplicationTests.java
│ ├── TestAutoGenerator.java
│ └── TestRedis.java
├── .gitignore
├── README.md
└── pom.xml
/front/.env.development:
--------------------------------------------------------------------------------
1 | VUE_APP_URL=http://localhost:8000
--------------------------------------------------------------------------------
/front/.env.production:
--------------------------------------------------------------------------------
1 | VUE_APP_URL=http://localhost:9000
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # admin-vue-template
2 | SpringBoot + Vue + ElementUI 实现一个后台管理系统模板
3 |
--------------------------------------------------------------------------------
/front/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lyh-man/admin-vue-template/HEAD/front/public/favicon.ico
--------------------------------------------------------------------------------
/front/babel.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | presets: [
3 | '@vue/cli-plugin-babel/preset'
4 | ]
5 | }
6 |
--------------------------------------------------------------------------------
/front/src/assets/avatar.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lyh-man/admin-vue-template/HEAD/front/src/assets/avatar.gif
--------------------------------------------------------------------------------
/front/src/assets/login_bg.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lyh-man/admin-vue-template/HEAD/front/src/assets/login_bg.jpg
--------------------------------------------------------------------------------
/front/src/http/http.js:
--------------------------------------------------------------------------------
1 | import * as login from './modules/login.js'
2 | import * as menu from './modules/menu.js'
3 |
4 | export default {
5 | login,
6 | menu
7 | }
8 |
--------------------------------------------------------------------------------
/front/src/views/menu/Echarts.vue:
--------------------------------------------------------------------------------
1 |
2 | Echarts
4 | Ueditor
4 | User List
4 | Menu Control
4 | Role Control
4 | HomePage
4 |
8 | * 用户表 Mapper 接口 9 | *
10 | * 11 | * @author lyh 12 | * @since 2020-06-08 13 | */ 14 | public interface UserMapper extends BaseMapper8 | * 用户表 服务类 9 | *
10 | * 11 | * @author lyh 12 | * @since 2020-06-08 13 | */ 14 | public interface UserService extends IService8 | * 文件上传 Mapper 接口 9 | *
10 | * 11 | * @author lyh 12 | * @since 2020-06-19 13 | */ 14 | public interface BackOssMapper extends BaseMapper8 | * 文件上传 服务类 9 | *
10 | * 11 | * @author lyh 12 | * @since 2020-06-19 13 | */ 14 | public interface BackOssService extends IService8 | * 系统用户表 Mapper 接口 9 | *
10 | * 11 | * @author lyh 12 | * @since 2020-07-02 13 | */ 14 | public interface SysUserMapper extends BaseMapper8 | * 系统用户角色表 Mapper 接口 9 | *
10 | * 11 | * @author lyh 12 | * @since 2020-07-07 13 | */ 14 | public interface SysRoleMapper extends BaseMapper8 | * 系统用户角色表 服务类 9 | *
10 | * 11 | * @author lyh 12 | * @since 2020-07-07 13 | */ 14 | public interface SysRoleService extends IService8 | * 系统用户角色表 Mapper 接口 9 | *
10 | * 11 | * @author lyh 12 | * @since 2020-07-07 13 | */ 14 | public interface SysUserRoleMapper extends BaseMapper8 | * 系统用户角色表 服务类 9 | *
10 | * 11 | * @author lyh 12 | * @since 2020-07-07 13 | */ 14 | public interface SysUserRoleService extends IService10 | * 用户表 前端控制器 11 | *
12 | * 13 | * @author lyh 14 | * @since 2020-06-08 15 | */ 16 | @RestController 17 | @RequestMapping("/back/user") 18 | public class UserController { 19 | 20 | } 21 | 22 | -------------------------------------------------------------------------------- /back/src/main/java/com/lyh/admin_template/back/modules/sys/service/SysUserService.java: -------------------------------------------------------------------------------- 1 | package com.lyh.admin_template.back.modules.sys.service; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.lyh.admin_template.back.modules.sys.entity.SysUser; 5 | 6 | /** 7 | *8 | * 系统用户表 服务类 9 | *
10 | * 11 | * @author lyh 12 | * @since 2020-07-02 13 | */ 14 | public interface SysUserService extends IService10 | * 系统用户角色表 前端控制器 11 | *
12 | * 13 | * @author lyh 14 | * @since 2020-07-07 15 | */ 16 | @RestController 17 | @RequestMapping("/sys/sys-role") 18 | public class SysRoleController { 19 | 20 | } 21 | 22 | -------------------------------------------------------------------------------- /back/.gitignore: -------------------------------------------------------------------------------- 1 | HELP.md 2 | target/ 3 | !.mvn/wrapper/maven-wrapper.jar 4 | !**/src/main/** 5 | !**/src/test/** 6 | 7 | ### STS ### 8 | .apt_generated 9 | .classpath 10 | .factorypath 11 | .project 12 | .settings 13 | .springBeans 14 | .sts4-cache 15 | 16 | ### IntelliJ IDEA ### 17 | .idea 18 | *.iws 19 | *.iml 20 | *.ipr 21 | 22 | ### NetBeans ### 23 | /nbproject/private/ 24 | /nbbuild/ 25 | /dist/ 26 | /nbdist/ 27 | /.nb-gradle/ 28 | build/ 29 | 30 | ### VS Code ### 31 | .vscode/ 32 | 33 | .mvn 34 | .target 35 | mvnw 36 | mvnw.cmd 37 | */log 38 | -------------------------------------------------------------------------------- /back/src/main/java/com/lyh/admin_template/back/modules/sys/controller/SysUserRoleController.java: -------------------------------------------------------------------------------- 1 | package com.lyh.admin_template.back.modules.sys.controller; 2 | 3 | 4 | import org.springframework.web.bind.annotation.RequestMapping; 5 | 6 | import org.springframework.web.bind.annotation.RestController; 7 | 8 | /** 9 | *10 | * 系统用户角色表 前端控制器 11 | *
12 | * 13 | * @author lyh 14 | * @since 2020-07-07 15 | */ 16 | @RestController 17 | @RequestMapping("/sys/sys-user-role") 18 | public class SysUserRoleController { 19 | 20 | } 21 | 22 | -------------------------------------------------------------------------------- /back/src/main/resources/static/i18n/messages_en_US.properties: -------------------------------------------------------------------------------- 1 | test=test I18n 2 | user.name.empty=User name cannot be null 3 | user.mobile.empty=User mobile cannot be null 4 | user.password.empty=User password cannot be null 5 | 6 | sys.user.name.notEmpty=Sys user name cannot be null 7 | sys.user.phone.notEmpty=Sys user mobile cannot be null 8 | sys.user.password.notEmpty=Sys user password cannot be null 9 | sys.user.code.notEmpty=Sys user code cannot be null 10 | sys.user.phone.format.error=Sys user mobile format error 11 | sys.user.name.format.error=Sys user name format error 12 | -------------------------------------------------------------------------------- /front/src/store/module/user.js: -------------------------------------------------------------------------------- 1 | export default { 2 | // 开启命名空间(防止各模块间命名冲突),访问时需要使用 模块名 + 方法名 3 | namespaced: true, 4 | // 管理数据(状态) 5 | state: { 6 | // 用于保存用户名 7 | userName: 'Admin' 8 | }, 9 | // 更改 state(同步) 10 | mutations: { 11 | updateName(state, data) { 12 | if (data) { 13 | state.userName = data 14 | } else { 15 | state.userName = 'Admin' 16 | } 17 | } 18 | }, 19 | // 异步触发 mutations 20 | actions: { 21 | updateName({commit, state}, data) { 22 | commit("updateName", data) 23 | } 24 | } 25 | } -------------------------------------------------------------------------------- /back/src/main/java/com/lyh/admin_template/back/service/impl/UserServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.lyh.admin_template.back.service.impl; 2 | 3 | import com.lyh.admin_template.back.entity.User; 4 | import com.lyh.admin_template.back.mapper.UserMapper; 5 | import com.lyh.admin_template.back.service.UserService; 6 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 7 | import org.springframework.stereotype.Service; 8 | 9 | /** 10 | *11 | * 用户表 服务实现类 12 | *
13 | * 14 | * @author lyh 15 | * @since 2020-06-08 16 | */ 17 | @Service 18 | public class UserServiceImpl extends ServiceImpl11 | * 文件上传 服务实现类 12 | *
13 | * 14 | * @author lyh 15 | * @since 2020-06-19 16 | */ 17 | @Service 18 | public class BackOssServiceImpl extends ServiceImpl11 | * 系统用户角色表 服务实现类 12 | *
13 | * 14 | * @author lyh 15 | * @since 2020-07-07 16 | */ 17 | @Service 18 | public class SysRoleServiceImpl extends ServiceImpl11 | * 系统用户角色表 服务实现类 12 | *
13 | * 14 | * @author lyh 15 | * @since 2020-07-07 16 | */ 17 | @Service 18 | public class SysUserRoleServiceImpl extends ServiceImpl抱歉!您访问的页面失联啦 ...
5 |16 | * 系统用户角色表 17 | *
18 | * 19 | * @author lyh 20 | * @since 2020-07-07 21 | */ 22 | @Data 23 | @EqualsAndHashCode(callSuper = false) 24 | @Accessors(chain = true) 25 | @ApiModel(value="SysUserRole对象", description="系统用户角色表") 26 | public class SysUserRole implements Serializable { 27 | 28 | private static final long serialVersionUID=1L; 29 | 30 | @ApiModelProperty(value = "用户角色表 ID") 31 | @TableId(value = "id", type = IdType.ASSIGN_ID) 32 | private Long id; 33 | 34 | @ApiModelProperty(value = "角色 ID") 35 | private Long roleId; 36 | 37 | @ApiModelProperty(value = "用户 ID") 38 | private Long userId; 39 | 40 | @TableField(fill = FieldFill.INSERT) 41 | @ApiModelProperty(value = "创建时间") 42 | private Date createTime; 43 | 44 | @TableField(fill = FieldFill.INSERT_UPDATE) 45 | @ApiModelProperty(value = "修改时间") 46 | private Date updateTime; 47 | 48 | @TableField(fill = FieldFill.INSERT) 49 | @TableLogic(value = "0", delval = "1") 50 | @ApiModelProperty(value = "逻辑删除标志,0 表示未删除, 1 表示删除") 51 | private Integer deleteFlag; 52 | 53 | 54 | } 55 | -------------------------------------------------------------------------------- /back/src/main/java/com/lyh/admin_template/back/common/config/MyBatisPlusConfig.java: -------------------------------------------------------------------------------- 1 | package com.lyh.admin_template.back.common.config; 2 | 3 | import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor; 4 | import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor; 5 | import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; 6 | import org.mybatis.spring.annotation.MapperScan; 7 | import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; 8 | import org.springframework.context.annotation.Bean; 9 | import org.springframework.context.annotation.Configuration; 10 | 11 | /** 12 | * 自定义一个 MybatisPlus 配置类,配置分页插件、乐观锁插件 13 | * mapper 扫描也可在此写上 14 | */ 15 | @Configuration 16 | @MapperScan(basePackages = {"com.lyh.admin_template.back.mapper", "com.lyh.admin_template.back.modules.**.mapper"}) 17 | public class MyBatisPlusConfig { 18 | /** 19 | * 分页插件 20 | * @return 分页插件的实例 21 | */ 22 | @Bean 23 | public PaginationInterceptor paginationInterceptor() { 24 | return new PaginationInterceptor(); 25 | } 26 | 27 | /** 28 | * 乐观锁插件 29 | * @return 乐观锁插件的实例 30 | */ 31 | @Bean 32 | public OptimisticLockerInterceptor optimisticLockerInterceptor() { 33 | return new OptimisticLockerInterceptor(); 34 | } 35 | 36 | @Bean 37 | public Jackson2ObjectMapperBuilderCustomizer builderCustomizer() { 38 | return builder -> { 39 | // 所有 Long 类型转换成 String 到前台 40 | builder.serializerByType(Long.class, ToStringSerializer.instance); 41 | }; 42 | } 43 | } 44 | 45 | -------------------------------------------------------------------------------- /back/src/main/java/com/lyh/admin_template/back/modules/sys/entity/SysRole.java: -------------------------------------------------------------------------------- 1 | package com.lyh.admin_template.back.modules.sys.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.*; 4 | 5 | import java.util.Date; 6 | 7 | import java.io.Serializable; 8 | 9 | import io.swagger.annotations.ApiModel; 10 | import io.swagger.annotations.ApiModelProperty; 11 | import lombok.Data; 12 | import lombok.EqualsAndHashCode; 13 | import lombok.experimental.Accessors; 14 | 15 | /** 16 | *17 | * 系统用户角色表 18 | *
19 | * 20 | * @author lyh 21 | * @since 2020-07-07 22 | */ 23 | @Data 24 | @EqualsAndHashCode(callSuper = false) 25 | @Accessors(chain = true) 26 | @ApiModel(value="SysRole对象", description="系统用户角色表") 27 | public class SysRole implements Serializable { 28 | 29 | private static final long serialVersionUID=1L; 30 | 31 | @ApiModelProperty(value = "角色 ID") 32 | @TableId(value = "id", type = IdType.ASSIGN_ID) 33 | private Long id; 34 | 35 | @ApiModelProperty(value = "角色名称") 36 | private String roleName; 37 | 38 | @ApiModelProperty(value = "角色码") 39 | private String roleCode; 40 | 41 | @ApiModelProperty(value = "角色备注") 42 | private String remark; 43 | 44 | @TableField(fill = FieldFill.INSERT) 45 | @ApiModelProperty(value = "创建时间") 46 | private Date createTime; 47 | 48 | @TableField(fill = FieldFill.INSERT_UPDATE) 49 | @ApiModelProperty(value = "修改时间") 50 | private Date updateTime; 51 | 52 | @TableField(fill = FieldFill.INSERT) 53 | @TableLogic(value = "0", delval = "1") 54 | @ApiModelProperty(value = "逻辑删除标志,0 表示未删除, 1 表示删除") 55 | private Integer deleteFlag; 56 | 57 | 58 | } 59 | -------------------------------------------------------------------------------- /front/src/http/httpRequest.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import { 3 | getToken, 4 | removeToken 5 | } from '@/http/auth.js' 6 | import router from '@/router' 7 | import { 8 | Message 9 | } from 'element-ui' 10 | import axios from 'axios' 11 | 12 | // 创建 axios 实例 13 | const http = axios.create({ 14 | // 统一 url 配置,定义访问前缀 baseURL 15 | baseURL: '/api', 16 | // 定义请求超时时间 17 | timeout: 10000, 18 | // 请求带上 cookie 19 | withCredentials: true, 20 | // 定义消息头 21 | headers: { 22 | 'Content-Type': 'application/json; charset=utf-8' 23 | } 24 | }) 25 | 26 | // 定义请求拦截器 27 | http.interceptors.request.use( 28 | config => { 29 | // 让每个请求携带 token 30 | config.headers['Admin-Token'] = getToken() 31 | return config 32 | }, 33 | error => { 34 | Promise.reject(error) 35 | } 36 | ) 37 | 38 | // 定义响应拦截器 39 | http.interceptors.response.use( 40 | response => { 41 | const res = response.data 42 | // 当 token 失效时,清除 cookie 保存的 token 值,并跳转到登陆界面 43 | if (res && res.code === 401) { 44 | removeToken() 45 | Message({ 46 | message: res.message, 47 | type: 'error', 48 | duration: 5000 49 | }) 50 | router.push({ 51 | name: 'Login' 52 | }) 53 | } 54 | // 未找到页面时,跳转到 404 页面 55 | if (res && res.code === 404) { 56 | router.push({ 57 | name: '404' 58 | }) 59 | } 60 | return response 61 | }, 62 | error => { 63 | return Promise.reject(error) 64 | } 65 | ) 66 | 67 | export default http -------------------------------------------------------------------------------- /back/src/main/java/com/lyh/admin_template/back/common/exception/GlobalException.java: -------------------------------------------------------------------------------- 1 | package com.lyh.admin_template.back.common.exception; 2 | 3 | import lombok.Data; 4 | import org.apache.http.HttpStatus; 5 | 6 | /** 7 | * 自定义异常, 8 | * 可以自定义 异常信息 message 以及 响应状态码 code(默认为 500)。 9 | * 10 | * 依赖信息说明: 11 | * 此处使用 @Data 注解,需导入 lombok 相关依赖文件。 12 | * 使用 HttpStatus 的常量表示 响应状态码,需导入 httpcore 相关依赖文件。 13 | */ 14 | @Data 15 | public class GlobalException extends RuntimeException { 16 | /** 17 | * 保存异常信息 18 | */ 19 | private String message; 20 | 21 | /** 22 | * 保存响应状态码 23 | */ 24 | private Integer code = HttpStatus.SC_INTERNAL_SERVER_ERROR; 25 | 26 | /** 27 | * 默认构造方法,根据异常信息 构建一个异常实例对象 28 | * @param message 异常信息 29 | */ 30 | public GlobalException(String message) { 31 | super(message); 32 | this.message = message; 33 | } 34 | 35 | /** 36 | * 根据异常信息、响应状态码构建 一个异常实例对象 37 | * @param message 异常信息 38 | * @param code 响应状态码 39 | */ 40 | public GlobalException(String message, Integer code) { 41 | super(message); 42 | this.message = message; 43 | this.code = code; 44 | } 45 | 46 | /** 47 | * 根据异常信息,异常对象构建 一个异常实例对象 48 | * @param message 异常信息 49 | * @param e 异常对象 50 | */ 51 | public GlobalException(String message, Throwable e) { 52 | super(message, e); 53 | this.message = message; 54 | } 55 | 56 | /** 57 | * 根据异常信息,响应状态码,异常对象构建 一个异常实例对象 58 | * @param message 异常信息 59 | * @param code 响应状态码 60 | * @param e 异常对象 61 | */ 62 | public GlobalException(String message, Integer code, Throwable e) { 63 | super(message, e); 64 | this.message = message; 65 | this.code = code; 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /back/src/main/java/com/lyh/admin_template/back/modules/oss/entity/BackOss.java: -------------------------------------------------------------------------------- 1 | package com.lyh.admin_template.back.modules.oss.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.FieldFill; 4 | import com.baomidou.mybatisplus.annotation.IdType; 5 | import com.baomidou.mybatisplus.annotation.TableField; 6 | import com.baomidou.mybatisplus.annotation.TableId; 7 | import com.fasterxml.jackson.annotation.JsonFormat; 8 | import com.fasterxml.jackson.databind.annotation.JsonSerialize; 9 | import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; 10 | import io.swagger.annotations.ApiModel; 11 | import io.swagger.annotations.ApiModelProperty; 12 | import lombok.Data; 13 | import lombok.EqualsAndHashCode; 14 | import lombok.experimental.Accessors; 15 | 16 | import java.io.Serializable; 17 | import java.util.Date; 18 | 19 | /** 20 | *21 | * 文件上传 22 | *
23 | * 24 | * @author lyh 25 | * @since 2020-06-19 26 | */ 27 | @Data 28 | @EqualsAndHashCode(callSuper = false) 29 | @Accessors(chain = true) 30 | @ApiModel(value="BackOss对象", description="文件上传") 31 | public class BackOss implements Serializable { 32 | 33 | private static final long serialVersionUID=1L; 34 | 35 | @ApiModelProperty(value = "文件 ID") 36 | @TableId(value = "id", type = IdType.ASSIGN_ID) 37 | // @JsonSerialize(using = ToStringSerializer.class) 38 | private Long id; 39 | 40 | @ApiModelProperty(value = "URL 地址") 41 | private String fileUrl; 42 | 43 | @ApiModelProperty(value = "存储在 OSS 中的文件名") 44 | private String ossName; 45 | 46 | @ApiModelProperty(value = "文件名") 47 | private String fileName; 48 | 49 | @TableField(fill = FieldFill.INSERT) 50 | @ApiModelProperty(value = "创建时间") 51 | // @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone="GMT+8") 52 | private Date createTime; 53 | } 54 | -------------------------------------------------------------------------------- /back/README.md: -------------------------------------------------------------------------------- 1 | 项目说明: 2 | + 此项目为 后台管理项目模板 -- 后台代码 3 | 4 | 项目特点: 5 | + 引入 Swagger 生成接口文档 6 | + 引入 MyBatis-plus 进行持久层操作 7 | + 引入 JSR 303 进行数据校验 8 | + 自定义国际化处理操作 9 | 10 | 11 | 博客地址: 12 | 13 | [SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 后端篇(一): 搭建基本环境、整合 Swagger、MyBatisPlus、JSR303 以及国际化操作](https://www.cnblogs.com/l-y-h/p/13083375.html) 14 | 15 | [SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 后端篇(二): 整合 Redis(常用工具类、缓存)、整合邮件发送功能](https://www.cnblogs.com/l-y-h/p/13163653.html) 16 | 17 | [SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 后端篇(三): 整合阿里云 OSS 服务 -- 上传、下载文件、图片](https://www.cnblogs.com/l-y-h/p/13202746.html) 18 | 19 | [SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 后端篇(四): 整合阿里云 短信服务、整合 JWT 单点登录](https://www.cnblogs.com/l-y-h/p/13214493.html) 20 | 21 | [SpringBoot + Vue + ElementUI 实现后台管理系统模板 -- 后端篇(五): 数据表设计、使用 jwt、redis、sms 工具类完善注册登录逻辑](https://www.cnblogs.com/l-y-h/p/13264307.html) 22 | 23 | 代码结构: 24 | ```javascript 25 | back 26 | |--- src 27 | | |--- main 保存源代码 28 | | | |--- java 代码目录 29 | | | | |--- common 保存公共操作 30 | | | | | |--- config 保存配置类 31 | | | | | |--- exception 保存异常处理操作 32 | | | | | |--- utils 保存工具类 33 | | | | | |--- validator 保存 JSR303 校验相关操作 34 | | | | |--- controller 保存控制层代码 35 | | | | |--- entity 保存实体类代码 36 | | | | |--- handler 保存数据处理相关操作 37 | | | | |--- mapper 保存 sql 相关映射操作 38 | | | | |--- service 保存业务层代码 39 | | 40 | | | |--- resources 资源目录 41 | | | | |--- static 用于保存项目静态文件 42 | | | | |--- application.yml 用于保存项目的配置信息 43 | | | | |--- logback-spring.xml 用于保存日志的配置信息 44 | | 45 | | |--- test 保存测试代码 46 | | | |--- java 47 | | 48 | |--- pom.xml 用于保存项目依赖信息 49 | ``` 50 | -------------------------------------------------------------------------------- /front/src/views/Home.vue: -------------------------------------------------------------------------------- 1 | 2 | 5 |15 | * 系统用户表 16 | *
17 | * 18 | * @author lyh 19 | * @since 2020-07-02 20 | */ 21 | @Data 22 | @EqualsAndHashCode(callSuper = false) 23 | @Accessors(chain = true) 24 | @ApiModel(value="SysUser对象", description="系统用户表") 25 | public class SysUser implements Serializable { 26 | 27 | private static final long serialVersionUID=1L; 28 | 29 | @ApiModelProperty(value = "用户 ID") 30 | @TableId(value = "id", type = IdType.ASSIGN_ID) 31 | private Long id; 32 | 33 | @ApiModelProperty(value = "用户名") 34 | private String name; 35 | 36 | @ApiModelProperty(value = "用户手机号") 37 | private String mobile; 38 | 39 | @ApiModelProperty(value = "用户密码") 40 | private String password; 41 | 42 | @ApiModelProperty(value = "性别, 0 表示女, 1 表示男") 43 | private Integer sex; 44 | 45 | @ApiModelProperty(value = "年龄") 46 | private Integer age; 47 | 48 | @ApiModelProperty(value = "头像") 49 | private String avatar; 50 | 51 | @ApiModelProperty(value = "邮箱") 52 | private String email; 53 | 54 | @TableField(fill = FieldFill.INSERT) 55 | @ApiModelProperty(value = "创建时间") 56 | private Date createTime; 57 | 58 | @TableField(fill = FieldFill.INSERT_UPDATE) 59 | @ApiModelProperty(value = "修改时间") 60 | private Date updateTime; 61 | 62 | @TableField(fill = FieldFill.INSERT) 63 | @TableLogic(value = "0", delval = "1") 64 | @ApiModelProperty(value = "逻辑删除标志,0 表示未删除, 1 表示删除") 65 | private Integer deleteFlag; 66 | 67 | @TableField(fill = FieldFill.INSERT) 68 | @ApiModelProperty(value = "禁用标志, 0 表示未禁用, 1 表示禁用") 69 | private Integer disabledFlag; 70 | 71 | @ApiModelProperty(value = "微信 openid(拓展字段、用于第三方微信登录)") 72 | private String wxId; 73 | 74 | @ApiModelProperty(value = "QQ openid(拓展字段、用于第三方 QQ 登录)") 75 | private String qqId; 76 | } 77 | -------------------------------------------------------------------------------- /back/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | # 配置端口号 2 | server: 3 | port: 8000 4 | spring: 5 | # 配置数据源 6 | datasource: 7 | driver-class-name: com.mysql.cj.jdbc.Driver 8 | username: root 9 | password: 123456 10 | url: jdbc:mysql://localhost:3306/admin_template?useUnicode=true&characterEncoding=utf8 11 | # 配置环境(dev 开发环境、prod 生产环境) 12 | profiles: 13 | active: dev 14 | # 配置国际化,basename 指定国际化文件前缀 15 | messages: 16 | basename: static/i18n/messages 17 | encoding: UTF-8 18 | # Redis 配置 19 | redis: 20 | # Redis 服务器地址 21 | host: 120.26.184.41 22 | # 连接端口号 23 | port: 6379 24 | # 数据库索引(0 - 15) 25 | database: 0 26 | # 超时时间(毫秒) 27 | timeout: 10000 28 | # lettuce 参数 29 | lettuce: 30 | pool: 31 | # 最大连接数(使用负值表示没有限制) 默认为 8 32 | max-active: 10 33 | # 最大阻塞等待时间(使用负值表示没有限制) 默认为 -1 ms 34 | max-wait: -1 35 | # 最大空闲连接 默认为 8 36 | max-idle: 5 37 | # 最小空闲连接 默认为 0 38 | min-idle: 0 39 | # mail 配置 40 | mail: 41 | # SMTP 服务器地址 42 | host: smtp.163.com 43 | # 邮件服务器账号 44 | username: m_17730125031@163.com 45 | # 授权码 46 | password: KFYRVDQAUXLNBSUO 47 | # 配置端口号(默认使用 25,若项目发布到云服务器,需要开放相应端口 465,需要配置相关 ssl 协议) 48 | port: 465 49 | # 编码字符集采用 UTF-8 50 | default-encoding: UTF-8 51 | # 配置 ssl 协议(端口为 25 时,可以不用配置) 52 | properties: 53 | mail: 54 | smtp: 55 | ssl: 56 | enable: true 57 | socketFactory: 58 | port: 465 59 | class: javax.net.ssl.SSLSocketFactory 60 | # 文件上传大小配置 61 | servlet: 62 | multipart: 63 | # 限制单个文件大小 64 | max-file-size: 10MB 65 | # 限制单次请求总文件大小 66 | max-request-size: 50MB 67 | # 设置 json 中日期显示格式 68 | jackson: 69 | # 设置显示格式 70 | date-format: yyyy-MM-dd HH:mm:ss 71 | # 设置时区 72 | time-zone: GMT+8 73 | 74 | # 阿里云配置信息 75 | aliyun: 76 | # common 配置信息 77 | accessKeyId: LTAI4GEWZbLZocBzXKYEfmmq 78 | accessKeySecret: rZLsruKxWex2qGYVA3UsuBgW5B3uJQ 79 | # OSS 相关配置信息 80 | endPoint: http://oss-cn-beijing.aliyuncs.com 81 | bucketName: admin-vue-template 82 | domain: http://admin-vue-template.oss-cn-beijing.aliyuncs.com 83 | # SMS 短信服务 84 | regionId: cn-hangzhou 85 | signName: 后台管理系统 86 | templateCode: SMS_194050461 87 | -------------------------------------------------------------------------------- /back/src/main/java/com/lyh/admin_template/back/entity/User.java: -------------------------------------------------------------------------------- 1 | package com.lyh.admin_template.back.entity; 2 | 3 | import com.baomidou.mybatisplus.annotation.*; 4 | import com.lyh.admin_template.back.common.validator.group.AddGroup; 5 | import com.lyh.admin_template.back.common.validator.group.UpdateGroup; 6 | import io.swagger.annotations.ApiModel; 7 | import io.swagger.annotations.ApiModelProperty; 8 | import lombok.Data; 9 | import lombok.EqualsAndHashCode; 10 | import lombok.experimental.Accessors; 11 | 12 | import javax.validation.constraints.NotEmpty; 13 | import javax.validation.constraints.Pattern; 14 | import java.io.Serializable; 15 | import java.util.Date; 16 | 17 | /** 18 | *19 | * 用户表 20 | *
21 | * 22 | * @author lyh 23 | * @since 2020-06-08 24 | */ 25 | @Data 26 | @EqualsAndHashCode(callSuper = false) 27 | @Accessors(chain = true) 28 | @TableName("back_user") 29 | @ApiModel(value="User对象", description="用户表") 30 | public class User implements Serializable { 31 | 32 | private static final long serialVersionUID=1L; 33 | 34 | @ApiModelProperty(value = "用户 ID") 35 | @TableId(value = "id", type = IdType.ASSIGN_ID) 36 | private Long id; 37 | 38 | @NotEmpty(message = "{user.name.empty}", groups = {AddGroup.class, UpdateGroup.class}) 39 | @ApiModelProperty(value = "用户名") 40 | private String name; 41 | 42 | @NotEmpty(message = "{user.mobile.empty}", groups = {AddGroup.class, UpdateGroup.class}) 43 | @Pattern(message = "手机号格式不合法", regexp = "^[1-9]{1}\\d{10}$", groups = {AddGroup.class, UpdateGroup.class}) 44 | @ApiModelProperty(value = "用户手机号") 45 | private String mobile; 46 | 47 | @NotEmpty(message = "{user.password.empty}", groups = {AddGroup.class, UpdateGroup.class}) 48 | @ApiModelProperty(value = "用户密码") 49 | private String password; 50 | 51 | @TableField(fill = FieldFill.INSERT) 52 | @ApiModelProperty(value = "创建时间") 53 | private Date createTime; 54 | 55 | @TableField(fill = FieldFill.INSERT_UPDATE) 56 | @ApiModelProperty(value = "修改时间") 57 | private Date updateTime; 58 | 59 | @TableField(fill = FieldFill.INSERT) 60 | @TableLogic(value = "0", delval = "1") 61 | @ApiModelProperty(value = "逻辑删除标志,0 表示未删除, 1 表示删除") 62 | private Integer deleteFlag; 63 | 64 | @Version 65 | @TableField(fill = FieldFill.INSERT) 66 | @ApiModelProperty(value = "版本号") 67 | private Integer version; 68 | 69 | } 70 | -------------------------------------------------------------------------------- /back/src/main/java/com/lyh/admin_template/back/common/exception/GlobalExceptionHandler.java: -------------------------------------------------------------------------------- 1 | package com.lyh.admin_template.back.common.exception; 2 | 3 | import com.lyh.admin_template.back.common.utils.Result; 4 | import org.slf4j.Logger; 5 | import org.slf4j.LoggerFactory; 6 | import org.springframework.validation.BindingResult; 7 | import org.springframework.web.bind.MethodArgumentNotValidException; 8 | import org.springframework.web.bind.annotation.ExceptionHandler; 9 | import org.springframework.web.bind.annotation.RestControllerAdvice; 10 | 11 | import java.util.HashMap; 12 | import java.util.Map; 13 | 14 | /** 15 | * 全局异常处理类。 16 | * 使用 slf4j 保存日志信息。 17 | * 此处使用了 统一结果处理 类 Result 用于包装异常信息。 18 | */ 19 | @RestControllerAdvice 20 | public class GlobalExceptionHandler { 21 | private Logger logger = LoggerFactory.getLogger(getClass()); 22 | 23 | /** 24 | * 处理 Exception 异常 25 | * @param e 异常 26 | * @return 处理结果 27 | */ 28 | @ExceptionHandler(Exception.class) 29 | public Result handlerException(Exception e) { 30 | logger.error(e.getMessage(), e); 31 | return Result.error().message(e.getMessage()); 32 | } 33 | 34 | /** 35 | * 处理空指针异常 36 | * @param e 异常 37 | * @return 处理结果 38 | */ 39 | @ExceptionHandler(NullPointerException.class) 40 | public Result handlerNullPointerException(NullPointerException e) { 41 | logger.error(e.getMessage(), e); 42 | return Result.error().message("空指针异常"); 43 | } 44 | 45 | /** 46 | * 处理自定义异常 47 | * @param e 异常 48 | * @return 处理结果 49 | */ 50 | @ExceptionHandler(GlobalException.class) 51 | public Result handlerGlobalException(GlobalException e) { 52 | logger.error(e.getMessage(), e); 53 | return Result.error().message(e.getMessage()).code(e.getCode()); 54 | } 55 | 56 | /** 57 | * 处理 JSR303 校验的异常 58 | * @param e 异常 59 | * @return 处理结果 60 | */ 61 | @ExceptionHandler(MethodArgumentNotValidException.class) 62 | public Result handlerValidException(MethodArgumentNotValidException e) { 63 | logger.error(e.getMessage(), e); 64 | BindingResult result = e.getBindingResult(); 65 | Map20 | * 系统用户表 服务实现类 21 | *
22 | * 23 | * @author lyh 24 | * @since 2020-07-02 25 | */ 26 | @Service 27 | public class SysUserServiceImpl extends ServiceImpl23 | * 文件上传 前端控制器 24 | *
25 | * 26 | * @author lyh 27 | * @since 2020-06-19 28 | */ 29 | @RestController 30 | @RequestMapping("/oss/back-oss") 31 | @Api(tags = "文件上传") 32 | public class BackOssController { 33 | 34 | @Autowired 35 | private OssUtil ossUtil; 36 | @Autowired 37 | private BackOssService backOssService; 38 | 39 | @ApiOperation(value = "删除文件") 40 | @DeleteMapping("/delete/object") 41 | public Result deleteObject(@RequestParam String key) { 42 | ossUtil.deleteObject(key); 43 | QueryWrapper queryWrapper = new QueryWrapper(); 44 | queryWrapper.eq("oss_name", key); 45 | backOssService.remove(queryWrapper); 46 | return Result.ok(); 47 | } 48 | 49 | @ApiOperation(value = "获取签名数据") 50 | @GetMapping("/policy") 51 | public Result policy() { 52 | return Result.ok().data("policyData", ossUtil.getPolicy()); 53 | } 54 | 55 | @ApiOperation(value = "保存并获取文件 url") 56 | @PostMapping("/saveUrl") 57 | public Result saveUrl(@RequestParam String key, @RequestParam String fileName) { 58 | BackOss backOss = new BackOss(); 59 | backOss.setOssName(key); 60 | backOss.setFileName(fileName); 61 | backOss.setFileUrl(ossUtil.getUrl(key)); 62 | QueryWrapper queryWrapper = new QueryWrapper(); 63 | queryWrapper.eq("oss_name", key); 64 | // 数据不存在则添加,否则根据 oss_name 更新数据 65 | backOssService.saveOrUpdate(backOss, queryWrapper); 66 | return Result.ok().data("file", backOssService.getOne(queryWrapper)); 67 | } 68 | 69 | @ApiOperation(value = "上传文件") 70 | @PostMapping("/upload") 71 | public Result upload(@ApiParam MultipartFile file) { 72 | // 用于保存文件 url 73 | String url = null; 74 | // 用于保存文件信息 75 | BackOss backOss = new BackOss(); 76 | try { 77 | // 获取文件上传路径 78 | url = ossUtil.uploadSuffix(file.getInputStream(), "aliyun", file.getOriginalFilename()); 79 | 80 | // 保存文件路径到数据库中 81 | backOss.setFileName(file.getOriginalFilename()); 82 | backOss.setOssName(url); 83 | backOss.setFileUrl(ossUtil.getUrl(url)); 84 | backOssService.save(backOss); 85 | } catch (IOException e) { 86 | throw new GlobalException("文件上传失败"); 87 | } 88 | return Result.ok().message("文件上传成功").data("file", backOss); 89 | } 90 | 91 | @ApiOperation(value = "获取所有文件信息") 92 | @GetMapping("/getAll") 93 | public Result getAll() { 94 | return Result.ok().data("file", backOssService.list()); 95 | } 96 | } 97 | 98 | -------------------------------------------------------------------------------- /back/src/test/java/com/lyh/admin_template/back/TestAutoGenerator.java: -------------------------------------------------------------------------------- 1 | package com.lyh.admin_template.back; 2 | 3 | import com.baomidou.mybatisplus.annotation.IdType; 4 | import com.baomidou.mybatisplus.generator.AutoGenerator; 5 | import com.baomidou.mybatisplus.generator.config.DataSourceConfig; 6 | import com.baomidou.mybatisplus.generator.config.GlobalConfig; 7 | import com.baomidou.mybatisplus.generator.config.PackageConfig; 8 | import com.baomidou.mybatisplus.generator.config.StrategyConfig; 9 | import com.baomidou.mybatisplus.generator.config.rules.DateType; 10 | import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy; 11 | import org.junit.jupiter.api.Test; 12 | import org.springframework.boot.test.context.SpringBootTest; 13 | 14 | @SpringBootTest 15 | public class TestAutoGenerator { 16 | @Test 17 | public void autoGenerate() { 18 | // Step1:代码生成器 19 | AutoGenerator mpg = new AutoGenerator(); 20 | 21 | // Step2:全局配置 22 | GlobalConfig gc = new GlobalConfig(); 23 | // 填写代码生成的目录(需要修改) 24 | String projectPath = "E:\\myProject\\myGit\\admin-vue-template\\back"; 25 | // 拼接出代码最终输出的目录 26 | gc.setOutputDir(projectPath + "/src/main/java"); 27 | // 配置开发者信息(可选)(需要修改) 28 | gc.setAuthor("lyh"); 29 | // 配置是否打开目录,false 为不打开(可选) 30 | gc.setOpen(false); 31 | // 实体属性 Swagger2 注解,添加 Swagger 依赖,开启 Swagger2 模式(可选) 32 | gc.setSwagger2(true); 33 | // 重新生成文件时是否覆盖,false 表示不覆盖(可选) 34 | gc.setFileOverride(false); 35 | // 配置主键生成策略,此处为 ASSIGN_ID(可选) 36 | gc.setIdType(IdType.ASSIGN_ID); 37 | // 配置日期类型,此处为 ONLY_DATE(可选) 38 | gc.setDateType(DateType.ONLY_DATE); 39 | // 默认生成的 service 会有 I 前缀 40 | gc.setServiceName("%sService"); 41 | mpg.setGlobalConfig(gc); 42 | 43 | // Step3:数据源配置(需要修改) 44 | DataSourceConfig dsc = new DataSourceConfig(); 45 | // 配置数据库 url 地址 46 | dsc.setUrl("jdbc:mysql://localhost:3306/admin_template?useUnicode=true&characterEncoding=utf8"); 47 | // dsc.setSchemaName("testMyBatisPlus"); // 可以直接在 url 中指定数据库名 48 | // 配置数据库驱动 49 | dsc.setDriverName("com.mysql.cj.jdbc.Driver"); 50 | // 配置数据库连接用户名 51 | dsc.setUsername("root"); 52 | // 配置数据库连接密码 53 | dsc.setPassword("123456"); 54 | mpg.setDataSource(dsc); 55 | 56 | // Step:4:包配置 57 | PackageConfig pc = new PackageConfig(); 58 | // 配置父包名(需要修改) 59 | pc.setParent("com.lyh.admin_template"); 60 | // 配置模块名(需要修改) 61 | pc.setModuleName("back"); 62 | // 配置 entity 包名 63 | pc.setEntity("entity"); 64 | // 配置 mapper 包名 65 | pc.setMapper("mapper"); 66 | // 配置 service 包名 67 | pc.setService("service"); 68 | // 配置 controller 包名 69 | pc.setController("controller"); 70 | mpg.setPackageInfo(pc); 71 | 72 | // Step5:策略配置(数据库表配置) 73 | StrategyConfig strategy = new StrategyConfig(); 74 | // 指定表名(可以同时操作多个表,使用 , 隔开)(需要修改) 75 | strategy.setInclude("back_user"); 76 | // 配置数据表与实体类名之间映射的策略 77 | strategy.setNaming(NamingStrategy.underline_to_camel); 78 | // 配置数据表的字段与实体类的属性名之间映射的策略 79 | strategy.setColumnNaming(NamingStrategy.underline_to_camel); 80 | // 配置 lombok 模式 81 | strategy.setEntityLombokModel(true); 82 | // 配置 rest 风格的控制器(@RestController) 83 | strategy.setRestControllerStyle(true); 84 | // 配置驼峰转连字符 85 | strategy.setControllerMappingHyphenStyle(true); 86 | // 配置表前缀,生成实体时去除表前缀 87 | // 此处的表名为 test_mybatis_plus_user,模块名为 test_mybatis_plus,去除前缀后剩下为 user。 88 | strategy.setTablePrefix(pc.getModuleName() + "_"); 89 | mpg.setStrategy(strategy); 90 | 91 | // Step6:执行代码生成操作 92 | mpg.execute(); 93 | } 94 | } 95 | -------------------------------------------------------------------------------- /back/src/main/resources/static/sql/sys/sys_menu.sql: -------------------------------------------------------------------------------- 1 | -- DROP DATABASE IF EXISTS admin_template; 2 | -- 3 | -- CREATE DATABASE admin_template; 4 | 5 | -- --------------------------sys_menu 菜单权限表--------------------------------------- 6 | USE admin_template; 7 | DROP TABLE IF EXISTS sys_menu; 8 | -- 系统菜单权限表 9 | CREATE TABLE sys_menu ( 10 | menu_id bigint NOT NULL COMMENT '当前菜单 ID', 11 | parent_id bigint NOT NULL COMMENT '当前菜单父菜单 ID', 12 | name_zh varchar(20) NOT NULL COMMENT '中文菜单名称', 13 | name_en varchar(40) NOT NULL COMMENT '英文菜单名称', 14 | type tinyint NOT NULL COMMENT '菜单类型,0 表示目录,1 表示菜单项,2 表示按钮', 15 | url varchar(100) NOT NULL COMMENT '访问路径', 16 | icon varchar(100) DEFAULT NULL COMMENT '菜单图标', 17 | order_num int DEFAULT NULL COMMENT '菜单项顺序', 18 | create_time datetime DEFAULT NULL COMMENT '创建时间', 19 | update_time datetime DEFAULT NULL COMMENT '修改时间', 20 | delete_flag tinyint DEFAULT NULL COMMENT '逻辑删除标志,0 表示未删除, 1 表示删除', 21 | PRIMARY KEY(menu_id) 22 | ) ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COMMENT='系统菜单权限表'; 23 | 24 | -- 插入数据 25 | INSERT INTO `sys_menu`(`menu_id`, `parent_id`, `name_zh`, `name_en`, `type`, `url`, `icon`, `order_num`, `create_time`, `update_time`, `delete_flag`) 26 | VALUES (1278601251755451111, 0, '系统管理', 'System Control', 0, '', 'el-icon-setting', 0,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), 27 | (1278601251755452211, 1278601251755451111, '用户管理', 'User Control', 1, 'sys/UserList', 'el-icon-user', 1,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), 28 | (1278601251755453311, 1278601251755451111, '角色管理', 'Role Control', 1, 'sys/RoleControl', 'el-icon-price-tag', 2,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), 29 | (1278601251755454411, 1278601251755451111, '菜单管理', 'Menu Control', 1, 'sys/MenuControl', 'el-icon-menu', 3,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), 30 | 31 | (1278601251755452221, 1278601251755452211, '添加', 'Add', 2, '', '', 1,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), 32 | (1278601251755452231, 1278601251755452211, '删除', 'Delete', 2, '', '', 2,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), 33 | (1278601251755452241, 1278601251755452211, '修改', 'Update', 2, '', '', 3,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), 34 | (1278601251755452251, 1278601251755452211, '查看', 'List', 2, '', '', 4,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), 35 | 36 | (1278601251755453321, 1278601251755453311, '添加', 'Add', 2, '', '', 1,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), 37 | (1278601251755453331, 1278601251755453311, '删除', 'Delete', 2, '', '', 2,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), 38 | (1278601251755453341, 1278601251755453311, '修改', 'Update', 2, '', '', 3,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), 39 | (1278601251755453351, 1278601251755453311, '查看', 'List', 2, '', '', 4,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), 40 | 41 | (1278601251755454421, 1278601251755454411, '添加', 'Add', 2, '', '', 1,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), 42 | (1278601251755454431, 1278601251755454411, '删除', 'Delete', 2, '', '', 2,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), 43 | (1278601251755454441, 1278601251755454411, '修改', 'Update', 2, '', '', 3,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), 44 | (1278601251755454451, 1278601251755454411, '查看', 'List', 2, '', '', 4,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), 45 | 46 | (1278601251755455511, 0, '帮助', 'help', 0, '', 'el-icon-info', 1,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), 47 | (1278601251755455521, 1278601251755455511, '百度', 'Baidu', 1, 'https://www.baidu.com/', 'el-icon-menu', 1,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0), 48 | (1278601251755455531, 1278601251755455511, '博客', 'Blog', 1, 'https://www.cnblogs.com/l-y-h/', 'el-icon-menu', 2,'2020-07-02 16:07:48', '2020-07-02 16:07:48', 0); 49 | 50 | -- --------------------------sys_menu 菜单权限表--------------------------------------- 51 | -------------------------------------------------------------------------------- /back/src/main/java/com/lyh/admin_template/back/common/utils/Result.java: -------------------------------------------------------------------------------- 1 | package com.lyh.admin_template.back.common.utils; 2 | 3 | import lombok.Data; 4 | import org.apache.http.HttpStatus; 5 | 6 | import java.util.HashMap; 7 | import java.util.Map; 8 | 9 | /** 10 | * 统一结果返回类。方法采用链式调用的写法(即返回类本身 return this)。 11 | * 构造器私有,不允许进行实例化,但提供静态方法 ok、error 返回一个实例。 12 | * 静态方法说明: 13 | * ok 返回一个 成功操作 的结果(实例对象)。 14 | * error 返回一个 失败操作 的结果(实例对象)。 15 | * 16 | * 普通方法说明: 17 | * success 用于自定义响应是否成功 18 | * code 用于自定义响应状态码 19 | * message 用于自定义响应消息 20 | * data 用于自定义响应数据 21 | * 22 | * 依赖信息说明: 23 | * 此处使用 @Data 注解,需导入 lombok 相关依赖文件。 24 | * 使用 HttpStatus 的常量表示 响应状态码,需导入 httpcore 相关依赖文件。 25 | */ 26 | @Data 27 | public class Result { 28 | /** 29 | * 响应是否成功,true 为成功,false 为失败 30 | */ 31 | private Boolean success; 32 | 33 | /** 34 | * 响应状态码, 200 成功,500 系统异常 35 | */ 36 | private Integer code; 37 | 38 | /** 39 | * 响应消息 40 | */ 41 | private String message; 42 | 43 | /** 44 | * 响应数据 45 | */ 46 | private Map