后台权限管理系统
2022-08-03 09:57:03
321
{{single.collect_count}}

项目简介

CommonAdmin是一个按钮级权限管理系统,包含企业后台最常用的系统模块,代码简洁,开箱即用。

访问地址:https://gitee.com/caochenlei/common-admin

主要功能

  • 登录功能

  • 后台首页

  • 错误页面

  • 部门管理

  • 用户管理

  • 角色管理

  • 菜单管理

  • 日志管理

  • 系统配置

  • 个人中心

采用技术

前端技术栈:

技术名称采用版本官方地址
vue-element-admin4.4.0点击访问

后端技术栈:

技术名称采用版本官方地址
Spring Boot2.5.3点击访问
Spring Security5.5.1点击访问
Undertow2.2.9点击访问
MyBatis3.5.7点击访问
JJWT0.11.2点击访问
Knife4j3.0.3点击访问

开发的工具:

工具名称采用版本下载地址
IntelliJ IDEA2021.1下载地址
Maven3.6.3下载地址
MySQL5.7.34下载地址
Redis3.2.100下载地址
Visual Studio Code1.58.2下载地址
Node.js14.17.1下载地址
Java JDK1.8.0_291下载地址

目录介绍

common-admin 前端工程common-admin-server后端工程

common-admin目录介绍:

├─plop-templates 模板文件,可以使用npm new来创建,可以用代码生成器代替├─public└─src│App.vue 根组件│main.js 入口文件│permission.js 权限控制│settings.js 全局设置├─api│cloudStorage.js 存放访问后端统一存储接口api│sysConfig.js存放访问后端系统配置接口api│sysDepartment.js存放访问后端系统部门接口api│sysLog.js 存放访问后端系统日志接口api│sysMenu.js存放访问后端系统菜单接口api│sysRole.js存放访问后端系统角色接口api│sysUser.js存放访问后端系统用户接口api├─assets 静态资源├─components 组件库├─directive指令集├─filters过滤器├─iconsSVG图标├─layout 后台布局├─router 全局路由├─store全局存储├─styles 样式库├─utils工具类└─views├─dashboard│index.vue 默认首页├─error-page│401.vue 401错误页│404.vue 404错误页├─login│index.vue 登录页面├─profile│avatar.vue头像上传组件│index.vue 个人中心├─redirect│index.vue 重定向└─system├─config│cloudStorage.vue云存储配置组件│index.vue 系统配置管理页面├─department│index.vue 系统部门管理页面├─log│index.vue 系统日志管理页面├─menu│index.vue 系统菜单管理页面├─role│index.vue 系统角色管理页面└─user index.vue 系统用户管理页面

common-admin-server目录介绍:

│pom.xml项目依赖└─src└─main├─java│└─io│└─github│└─caochenlei││MainApplication.java 主启动类│├─annotation││ RedisCache.java 方法缓存注解││SysLogRecord.java系统日志注解│├─aspect││RedisCacheAspect.java方法缓存切面││SysLogAspect.java系统日志切面│├─common││Constant.java全局常量││Payload.java JWT载荷│├─config││AsyncConfig.java 异步线程池配置││ImageCodeConfig.java 图片验证码配置││RedisConfig.java Redis访问配置││SwaggerConfig.java 接口文档配置││WebMvcConfig.java解决跨域配置││WebSecurityConfig.java 登录/权限配置││WebServerFactoryCustomizerConfig.java解决Undertow警告配置│├─controller││CloudStorageController.java││SysConfigController.java││SysDepartmentController.java││SysLogController.java││SysMenuController.java││SysRoleController.java││SysUserController.java│├─domain││SysConfig.java││SysDepartment.java││SysLog.java││SysMenu.java││SysRole.java││SysUser.java│├─dto││SysUserInfoDTO.java 载荷中传输的用户对象│├─exception││AuthTokenException.java Token认证失败异常││AuthTokenExpiredException.javaToken时间过期异常││CustomAuthenticationException.java自定义认证失败异常││ImageCodeException.java 图片验证码失败异常│├─filter││CustomAuthenticationFilter.java 请求验证过滤器(重要)│├─handler││CustomAccessDeniedHandler.java无权限访问处理器││CustomAuthenticationEntryPointHandler.java无权限访问处理器││CustomAuthenticationFailureHandler.java 登录失败处理器││CustomAuthenticationSuccessHandler.java 登录成功处理器││GlobalExceptionHandler.java 全局控制器异常处理器│├─mapper││SysConfigMapper.java││SysDepartmentMapper.java││SysLogMapper.java││SysMenuMapper.java││SysRoleMapper.java││SysUserMapper.java│├─prop││RsaKeyProperties.java 获取RSA公/私钥配置对象│├─service│││SysDepartmentService.java│││SysLogAsyncService.java│││SysLogService.java│││SysMenuService.java│││SysRoleService.java│││SysUserService.java││└─impl││CloudStorageServiceImpl.java││CosCloudStorageServiceImpl.java││KodoCloudStorageServiceImpl.java││OssCloudStorageServiceImpl.java││SysConfigServiceImpl.java││SysDepartmentServiceImpl.java││SysLogAsyncServiceImpl.java││SysLogServiceImpl.java││SysMenuServiceImpl.java││SysRoleServiceImpl.java││SysUserDetailsServiceImpl.java登录时验证用户/获取权限││SysUserServiceImpl.java││SysUserTokenServiceImpl.javaToken处理服务类│├─utils││FileUtils.java文件处理操作类││IpUtils.java获取客户端请求IP工具类││JsonUtils.javaJSON解析工具类││JwtUtils.java Token解析/生成工具类││MakeUtils.java部门树、菜单树、路由表工具类││RedisCacheUtils.javaRedis缓存工具类││RegionUtils.java通过IP地址获取区域工具类││RsaUtils.java 用于生成RSA公/私钥,用来加密│└─vo│CloudStorageConfigVo.java回显云存储结果│PermissionVo.java回显前端权限│ResultVo.java回显前端统一处理结果│RoleVo.java回显角色选中项│RouterVo.java回显前端路由表│SysUserInfoVo.java 回显前端系统用户信息│TokenVo.java 回显前端Token│UploadVo.java回显上传文件后结果└─resources│application.yml系统配置│banner.txt 启动Banner自定义信息│mybatis-config.xml MyBatis配置├─mapper│SysConfigMapper.xml│SysDepartmentMapper.xml│SysLogMapper.xml│SysMenuMapper.xml│SysRoleMapper.xml│SysUserMapper.xml└─rsarsa_key RSA私钥rsa_key.pub RSA公钥

项目安装

# 导入数据库,注意数据库账号和密码common-admin.sql
# 克隆项目git clone https://gitee.com/caochenlei/common-admin.git

common-admin-server安装及启动:

# 进入后端cd common-admin-server# 安装依赖mvn install# 运行项目mvn spring-boot:run

common-admin安装及启动:

# 进入前端cd common-admin# 安装依赖(注:如果实在安装不上,那就试试:cnpm install)npm i --legacy-peer-deps# 运行项目npm run dev
访问地址:http://localhost:9527/登录账号:zhangsan登录密码:123456

快速开发

为了能够进行快速开发,可以使用我的另一个开源项目《代码生成器》,我已经内置了一套关于《Common-Admin》的开发模板。

软件下载地址:https://gitee.com/caochenlei/code-builder/releases/v1.0.0

但是一定注意:JDK 8,如果JDK不是8可能不会正常运行。

如果你想了解代码生成的整个细节,可以使用CMD命令行的方式启动。

java -jar CodeBuilder-1.0.0.jar

第一步:获取数据库名,然后选择《common-admin》,最后点击开始生成代码

第二步:修改工程包名,然后选择《Common-Admin》,最后点击一键生成代码

第三步:查看生成代码,然后拷贝到对应前后端工程文件夹,最后保存以后重新启动

注意事项

问题一:为什么采用Undertow而不是Tomcat

回答一:项目整个的开发环境采用的是主流的JDK 8,在这个环境下,如果我采用最新的Spring Boot,那么Spring Boot内置的Tomcat的版本为9.x,而Tomcat 9.x需要JDK 8及以上的支持,有人会想说,这不版本挺对应的吗,实际上,JDK 8对Tomcat 9.x支持还是有些问题,如果你用DEBUG模式启动后端项目就会发现有几个报错的地方,主要是找不到class文件,因此,我决定更换为Undertow。

问题二:如果我想用Tomcat应该怎么调整回去?

回答二:找到POM.XML,然后对这段依赖进行修改,将注释下的内容全部删去,此时最好将JDK切换为JDK 11。

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><!-- Remove default Tomcat container--><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions></dependency><!-- Add Undertow container --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-undertow</artifactId></dependency><dependency><groupId>io.undertow</groupId><artifactId>undertow-websockets-jsr</artifactId></dependency>

再找到io.github.caochenlei.config.WebServerFactoryCustomizerConfig,然后删掉。

问题三:前端组件的路径有没有一定规范?

回答三:有,需要按照《主功能模块名/次功能模块名》这种形式来存放生成出来的views界面,并且需要修改组件名为index.vue。


问题四:如何实现的按钮级别权限管理?

回答四:

  • 后端使用@PreAuthorize("hasAuthority('sys:department:add')")注解来控制后端方法的访问权限
  • 前端使用v-if="checkPermission(['sys:department:add'])"方法来控制按钮是否显示到页面

问题五:如何生成自己的RSA公/私钥?

回答五:在工程里新建RsaUtilsTest,然后运行以下代码生成即可。

public class RsaUtilsTest {private String publicFile = "D:\\auth_key\\rsa_key.pub";private String privateFile = "D:\\auth_key\\rsa_key";private String secret = "123456789abcdefg";@Testpublic void generateKey() throws Exception {RsaUtils.generateKey(publicFile, privateFile, secret, 2048);}}

生成后的文件可以直接替换工程默认的RSA公/私钥,也可以在application.yml中配置指定路径。

问题六:系统关于时间类型的处理?

回答六:系统后端所有时间字段需要手动加以下两个注解,代码生成器不会生成,第一个是用于返回前端的格式,第二个是序列化时采用的格式。

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")@JsonSerialize(using = LocalDateTimeSerializer.class)private LocalDateTime createTime;//创建时间

问题七:系统配置要注意的问题?

回答七:系统配置中order_num>0的配置项默认是通用配置项,而order_num=0为存储配置,如果你有其他特殊配置,可以让order_num为负数,并且可以在系统配置选项卡增加一个选项,并且自己实现。

问题八:为什么我配置了云存储,但是上传头像的时候遇到跨域问题?

回答八:相对应的云存储需要开启跨域配置,默认为"*",可参考:点击访问

问题九:@RedisCache注解如何使用?

回答九:@RedisCache应该运用到查询结果经常不会改变的方法上,方法参数最好是基础数据类型,引用类型也是可以的但是不建议,并且在该方法查询数据对应的修改方法上标注此注解,同时开启flush = true功能,以缓存系统配置为例:


问题十:为什么我分配菜单后刷新当前页面,发现没有生效?

回答十:其实已经生效了,由于组件缓存,所以才没有看到效果,此时只需要CTRL+F5强制刷新一下就能看到啦。

如果您有其他的问题,请联系作者或者关注CSDN进行私信。

版本说明

  • v3.0.2
    • 修改接口描述
  • v3.0.1
    • 优化上传流程
    • 优化401页面
    • 优化404页面
    • 系统部门改为选填
    • 验证码区分大小写
  • v3.0.0
    • 新增401错误页面
    • 新增404错误页面
    • 支持用户多角色化,去掉分配角色搜索
    • 新增系统部门时自动打开部门列表
    • 新增系统菜单时自动打开上级列表
    • 前端表格加载提示
    • 超级管理员角色不可删除,不可编辑
    • 数据库内数据进行了调整
    • 修复前端分页的BUG
  • v2.0.0
    • 新增登录背景(默认不开启,需手动开启)
    • 新增系统配置(通用配置项以及特殊配置)
    • 新增个人中心(头像上传、修改密码)
    • 新增通用存储(七牛云(0)、阿里云(1)、腾讯云(2))
    • 新增缓存注解(@RedisCache)
    • 优化登录流程(登录成功弹出提示)
    • 优化退出流程(退出成功弹出提示)
    • 优化缓存前缀(验证码、Token缓存统一添加前缀,防止和其它应用冲突)
    • 修复日志注解(@SysLogRecord在对文件等特殊参数序列化失败的问题)
  • v1.0.0
    • 完成权限控制
    • 完成部门管理
    • 完成用户管理
    • 完成角色管理
    • 完成菜单管理
    • 完成日志管理

联系作者

Email:774908833@qq.com

CSDN:https://caochenlei.blog.csdn.net/

回帖
全部回帖({{commentCount}})
{{item.user.nickname}} {{item.user.group_title}} {{item.friend_time}}
{{item.content}}
{{item.comment_content_show ? '取消' : '回复'}} 删除
回帖
{{reply.user.nickname}} {{reply.user.group_title}} {{reply.friend_time}}
{{reply.content}}
{{reply.comment_content_show ? '取消' : '回复'}} 删除
回帖
收起
没有更多啦~
{{commentLoading ? '加载中...' : '查看更多评论'}}