├── .gitignore
├── Jenkinsfile
├── README.md
├── docs
├── images
│ └── 1683383586326.jpg
└── ox-admin.sql
├── ox-admin-application
├── .gitignore
├── Dockerfile
├── pom.xml
└── src
│ ├── main
│ ├── java
│ │ └── com
│ │ │ └── java668
│ │ │ └── oxadmin
│ │ │ ├── OxAdminApplication.java
│ │ │ ├── config
│ │ │ ├── ExceptionAdvice.java
│ │ │ ├── SpringfoxHandlerProviderBeanPostProcessor.java
│ │ │ └── secrity
│ │ │ │ ├── LoginTimingFilter.java
│ │ │ │ ├── SpringSecurityConfig.java
│ │ │ │ ├── components
│ │ │ │ ├── AbstractUserDetailsService.java
│ │ │ │ ├── CustomAccessDeniedHandler.java
│ │ │ │ ├── CustomAuthenticationFailureHandler.java
│ │ │ │ ├── CustomAuthenticationSuccessHandler.java
│ │ │ │ ├── CustomLogoutSuccessHandler.java
│ │ │ │ ├── CustomSecurityAuthenticationEntryPoint.java
│ │ │ │ └── UserDetailsServiceImpl.java
│ │ │ │ └── properties
│ │ │ │ ├── PermitProperties.java
│ │ │ │ └── SecurityProperties.java
│ │ │ └── modules
│ │ │ ├── generator
│ │ │ ├── controller
│ │ │ │ ├── TableColumnController.java
│ │ │ │ └── TableController.java
│ │ │ ├── dto
│ │ │ │ ├── request
│ │ │ │ │ ├── TableColumnReqDTO.java
│ │ │ │ │ ├── TablePageReqDTO.java
│ │ │ │ │ └── TableReqDTO.java
│ │ │ │ └── response
│ │ │ │ │ ├── TableColumnRespDTO.java
│ │ │ │ │ └── TableRespDTO.java
│ │ │ ├── entity
│ │ │ │ ├── Table.java
│ │ │ │ └── TableColumn.java
│ │ │ ├── mapper
│ │ │ │ ├── TableColumnMapper.java
│ │ │ │ └── TableMapper.java
│ │ │ ├── service
│ │ │ │ ├── ITableColumnService.java
│ │ │ │ ├── ITableService.java
│ │ │ │ └── impl
│ │ │ │ │ ├── TableColumnServiceImpl.java
│ │ │ │ │ └── TableServiceImpl.java
│ │ │ └── utils
│ │ │ │ ├── Convert.java
│ │ │ │ ├── GenUtils.java
│ │ │ │ ├── StrFormatter.java
│ │ │ │ ├── StringUtils.java
│ │ │ │ ├── VelocityInitializer.java
│ │ │ │ └── VelocityUtils.java
│ │ │ └── system
│ │ │ ├── controller
│ │ │ ├── AuthController.java
│ │ │ ├── MenuController.java
│ │ │ ├── OperLogController.java
│ │ │ ├── RoleController.java
│ │ │ └── UserController.java
│ │ │ ├── dto
│ │ │ ├── request
│ │ │ │ ├── MenuReqDTO.java
│ │ │ │ ├── OperLogPageReqDTO.java
│ │ │ │ ├── OperLogReqDTO.java
│ │ │ │ ├── RolePageReqDTO.java
│ │ │ │ ├── RoleReqDTO.java
│ │ │ │ ├── UserPageReqDTO.java
│ │ │ │ ├── UserPassReqDTO.java
│ │ │ │ ├── UserReqDTO.java
│ │ │ │ └── groups
│ │ │ │ │ ├── Insert.java
│ │ │ │ │ └── Update.java
│ │ │ └── response
│ │ │ │ ├── MenuRespDTO.java
│ │ │ │ ├── OperLogRespDTO.java
│ │ │ │ ├── RoleRespDTO.java
│ │ │ │ └── UserRespDTO.java
│ │ │ ├── entity
│ │ │ ├── Menu.java
│ │ │ ├── OperLog.java
│ │ │ ├── Role.java
│ │ │ ├── RoleMenu.java
│ │ │ ├── User.java
│ │ │ └── UserRole.java
│ │ │ ├── event
│ │ │ ├── LogRecordEvent.java
│ │ │ └── handler
│ │ │ │ └── LogRecordEventHandler.java
│ │ │ ├── mapper
│ │ │ ├── MenuMapper.java
│ │ │ ├── OperLogMapper.java
│ │ │ ├── RoleMapper.java
│ │ │ ├── RoleMenuMapper.java
│ │ │ ├── UserMapper.java
│ │ │ └── UserRoleMapper.java
│ │ │ └── service
│ │ │ ├── AuthService.java
│ │ │ ├── ILogRecordEventService.java
│ │ │ ├── IOperLogService.java
│ │ │ ├── MenuService.java
│ │ │ ├── RoleMenuService.java
│ │ │ ├── RoleService.java
│ │ │ ├── UserRoleService.java
│ │ │ ├── UserService.java
│ │ │ └── impl
│ │ │ ├── AuthServiceImpl.java
│ │ │ ├── LogRecordEventServiceImpl.java
│ │ │ ├── LogRecordServiceImpl.java
│ │ │ ├── MenuServiceImpl.java
│ │ │ ├── OperLogServiceImpl.java
│ │ │ ├── OperatorGetServiceImpl.java
│ │ │ ├── RoleMenuServiceImpl.java
│ │ │ ├── RoleServiceImpl.java
│ │ │ ├── UserRoleServiceImpl.java
│ │ │ └── UserServiceImpl.java
│ └── resources
│ │ ├── application-dev.yml
│ │ ├── application-prod.yml
│ │ ├── application.yml
│ │ ├── logback-spring.xml
│ │ ├── mapper
│ │ ├── generator
│ │ │ ├── TableColumnMapper.xml
│ │ │ └── TableMapper.xml
│ │ └── system
│ │ │ ├── MenuMapper.xml
│ │ │ ├── OperLogMapper.xml
│ │ │ ├── RoleMapper.xml
│ │ │ ├── RoleMenuMapper.xml
│ │ │ ├── UserMapper.xml
│ │ │ └── UserRoleMapper.xml
│ │ ├── spy.properties
│ │ ├── static
│ │ └── index.html
│ │ └── vm
│ │ ├── java
│ │ ├── controller.java.vm
│ │ ├── domain.java.vm
│ │ ├── mapper.java.vm
│ │ ├── pageReqDTO.java.vm
│ │ ├── reqDTO.java.vm
│ │ ├── respDTO.java.vm
│ │ ├── service.java.vm
│ │ ├── serviceImpl.java.vm
│ │ ├── sub-domain.java.vm
│ │ ├── sub-reqDTO.java.vm
│ │ └── sub-respDTO.java.vm
│ │ ├── js
│ │ └── api.js.vm
│ │ ├── sql
│ │ └── sql.vm
│ │ ├── vue
│ │ ├── index-tree.vue.vm
│ │ ├── index.vue.vm
│ │ └── v3
│ │ │ ├── index-tree.vue.vm
│ │ │ ├── index.vue.vm
│ │ │ └── readme.txt
│ │ └── xml
│ │ └── mapper.xml.vm
│ └── test
│ └── java
│ └── com
│ └── java668
│ └── oxadmin
│ └── OxAdminApplicationTests.java
├── ox-admin-common
├── .gitignore
├── pom.xml
└── src
│ ├── main
│ ├── java
│ │ └── com
│ │ │ └── java668
│ │ │ └── common
│ │ │ ├── aop
│ │ │ ├── annotation
│ │ │ │ └── DemoSite.java
│ │ │ └── interceptor
│ │ │ │ ├── ApiLogAop.java
│ │ │ │ └── DemoInterceptor.java
│ │ │ ├── constant
│ │ │ ├── Constants.java
│ │ │ └── GenConstants.java
│ │ │ ├── db
│ │ │ ├── config
│ │ │ │ ├── DateMetaObjectHandler.java
│ │ │ │ ├── EasySqlInjector.java
│ │ │ │ └── MybatisPlusAutoConfigure.java
│ │ │ ├── entity
│ │ │ │ └── BaseEntity.java
│ │ │ ├── mapper
│ │ │ │ └── EasyBaseMapper.java
│ │ │ └── properties
│ │ │ │ └── MybatisPlusAutoFillProperties.java
│ │ │ ├── enums
│ │ │ ├── ICommonEnum.java
│ │ │ ├── IResultEnum.java
│ │ │ ├── MenuTypeEnum.java
│ │ │ └── ResultEnum.java
│ │ │ ├── exception
│ │ │ ├── BaseUncheckedException.java
│ │ │ ├── BizException.java
│ │ │ └── DefaultExceptionAdvice.java
│ │ │ ├── model
│ │ │ ├── BaseDTO.java
│ │ │ ├── PageParam.java
│ │ │ ├── PageResult.java
│ │ │ ├── R.java
│ │ │ └── SysUser.java
│ │ │ ├── properties
│ │ │ ├── GeneratorProperties.java
│ │ │ └── SystemSettingProperties.java
│ │ │ ├── utils
│ │ │ ├── AddressUtils.java
│ │ │ ├── AuthUtils.java
│ │ │ ├── JSONUtils.java
│ │ │ └── SpringUtils.java
│ │ │ └── web
│ │ │ └── OxWebMvcConfigurer.java
│ └── resources
│ │ └── META-INF
│ │ └── spring.factories
│ └── test
│ └── java
│ └── com
│ └── java668
│ └── common
│ └── OxAdminCommonApplicationTests.java
└── pom.xml
/.gitignore:
--------------------------------------------------------------------------------
1 | HELP.md
2 | ox-admin-application/target/
3 | ox-admin-common/target/
4 | logs/
5 | !.mvn/wrapper/maven-wrapper.jar
6 | !**/src/main/**/target/
7 | !**/src/test/**/target/
8 |
9 | ### STS ###
10 | .apt_generated
11 | .classpath
12 | .factorypath
13 | .project
14 | .settings
15 | .springBeans
16 | .sts4-cache
17 |
18 | ### IntelliJ IDEA ###
19 | .idea
20 | *.iws
21 | *.iml
22 | *.ipr
23 |
24 | ### NetBeans ###
25 | /nbproject/private/
26 | /nbbuild/
27 | /dist/
28 | /nbdist/
29 | /.nb-gradle/
30 | build/
31 | !**/src/main/**/build/
32 | !**/src/test/**/build/
33 |
34 | ### VS Code ###
35 | .vscode/
36 |
--------------------------------------------------------------------------------
/Jenkinsfile:
--------------------------------------------------------------------------------
1 | // Harbor私服地址
2 | def harbor_url = "ccr.ccs.tencentyun.com"
3 | // Harbor的项目名称
4 | def harbor_project_name = "java668"
5 | // 构建版本的名称
6 | def PROJECT_NAME = "ox-admin-application"
7 | // 端口
8 | def port = 8081
9 | // tag
10 | def tag = "latest"
11 | // 镜像名称
12 | def imageName = "${PROJECT_NAME}:${tag}"
13 | // 链接
14 | def link = "--link mysql_pro"
15 | // 挂载目录
16 | def mount = "-v /usr/local/docker_data/mblog/storage:/app/mblog/storage -v /usr/local/docker_data/mblog/logs:/app/mblog/logs"
17 |
18 | pipeline {
19 | agent any
20 | stages {
21 | stage('拉取代码') {
22 | steps {
23 | echo '=============拉取代码============='
24 | checkout scmGit(branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[credentialsId: '38dd7ab4-5c12-4624-b2d3-ea1d43e53d6a', url: 'git@github.com:java668/ox-admin.git']])
25 | echo '=============拉取代码完成============='
26 | }
27 | }
28 | stage('编译构建') {
29 | steps {
30 | echo '=============编译构建============='
31 | // 编译,打包,构建本地镜像
32 | sh "mvn -DskipTests=true -Pprod clean package install"
33 | sh 'mvn -f ox-admin-application dockerfile:build'
34 | echo '=============编译构建完成============='
35 | }
36 | }
37 | stage('项目部署') {
38 | steps {
39 | // 给镜像打标签
40 | echo "=============给镜像打标签=============${imageName}======="
41 | sh "docker tag ${imageName} ${harbor_url}/${harbor_project_name}/${imageName}"
42 | echo '=============给镜像打标签完成============='
43 |
44 | withCredentials([usernamePassword(credentialsId: '3089b821-709c-4dcf-a4b8-d7ff0090a253', passwordVariable: 'password', usernameVariable: 'username')]) {
45 | // 登录
46 | sh "docker login -u ${username} -p ${password} ${harbor_url}"
47 | // 上传镜像
48 | sh "docker push ${harbor_url}/${harbor_project_name}/${imageName}"
49 | }
50 |
51 | //删除本地镜像
52 | sh "docker rmi -f ${imageName}"
53 | sh "docker rmi -f ${harbor_url}/${harbor_project_name}/${imageName}"
54 |
55 | // 部署
56 | withCredentials([usernamePassword(credentialsId: 'c86b0e91-f186-47cc-8e1c-310efd56399b', passwordVariable: 'password', usernameVariable: 'username')]) {
57 | // some block
58 | // 环境变量参数
59 | echo "执行的命令:/opt/jenkins_shell/deploy.sh $harbor_url $harbor_project_name $PROJECT_NAME $tag $port \"-e url=mysql_pro -e username=${username} -e password=${password} ${link}\""
60 | sshPublisher(publishers: [sshPublisherDesc(
61 | configName: '81.69.220.64',
62 | transfers: [sshTransfer(cleanRemote: false, excludes: '',
63 | execCommand: "/opt/jenkins_shell/deploy.sh $harbor_url $harbor_project_name $PROJECT_NAME $tag $port \"-e url=mysql_pro -e username=${username} -e password=${password} ${link}\"",
64 | execTimeout: 120000,
65 | flatten: false,
66 | makeEmptyDirs: false,
67 | noDefaultExcludes: false,
68 | patternSeparator: '[, ]+',
69 | remoteDirectory: '',
70 | remoteDirectorySDF: false,
71 | removePrefix: '',
72 | sourceFiles: '')],
73 | usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
74 | }
75 |
76 | }
77 | }
78 | }
79 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # OX-ADMIN 后台管理系统
2 | ## 开发初衷
3 | 最近想写一个项目,找了开源社区上找了一些后台管理框架。功能复杂代码质量参差不齐,而且自己也用不到那么多的功能,不想项目中太多僵尸代码。于是开发了 ox-admin ,发现在开发过程中遇到一些问题,也算是对自己所学的知识进行一个查漏补缺。(后面会完善开发文档)
4 |
5 | OX-ADMIN 名字由来:自己的花名叫青牛,英文中 Cow Bull Ox 都可以翻译成"牛",它们之间有什么区别呢?Cow 是奶牛可以挤出奶的牛,Bull 是公牛角很长很凶的,Ox 才是中国常见的用起来种地的那种牛。所以就命名为"OX-ADMIN"。
6 |
7 | 让我们像牛一样,勇敢面对生活中的挑战,勤奋耕耘自己的梦想。无论遇到多少坎坷和困难,我们都要坚定地向前迈进,因为只有这样,我们才能收获属于自己的辉煌人生。相信自己的能力,付出努力,收获成就,成为那头无畏的牛,翻过生命的难关,奔向成功的彼岸!
8 | ## 简介
9 | 一个基于springboot开发的简单、高效、规范的后台管理框架, 项目基于 Spring Boot、 Mybatis-Plus、 Spring Security、Vue、vue-element-admin
10 | 的前后端分离的后台管理系统,项目采用分模块开发方式, 权限控制采用 RBAC,支持动态路由
11 |
12 | ## 技术栈
13 | - 开发语言:Java
14 | - 数据库:Mysql
15 | - Web 前端框架:Vue + Axios
16 | - 后台前端框架:vue-element-admin
17 | - 后端框架:Spring Boot
18 | - 安全框架:Spring security
19 | - 工具类集合:Hutool
20 |
21 | ## 项目截图
22 | 
24 |
25 | ## 项目演示地址
26 | - 项目演示地址:[ox-admin-web](http://oxadmin.java668.com)
27 | ```
28 | 测试账号:test/aa123456
29 | ```
30 |
31 | ## 前后端项目地址
32 | - 后端项目地址:[ox-admin](https://github.com/java668/ox-admin)
33 | - 前端项目地址:[ox-admin-web](https://github.com/java668/ox-admin-web)
34 |
35 | ## 打包部署
36 | ### ox-admin 打包部署
37 | ```sh
38 | 1、修改/resources/application-prod.properties配置文件中对应配置,根据部署环境不同,切换配置文件
39 | mvn clean package -DskipTests -Pprod
40 | ```
41 |
42 | ### ox-admin-web 打包部署
43 | ```sh
44 |
45 | 1、修改打包对应环境的配置文件
46 | 例如:打包prod环境
47 | 修改/ox-admin-web/config/prod中的BASE_API变量,修改为对应后台地址
48 | 2、打包部署
49 | $ npm install
50 | $ npm run dev
51 | $ npm run build:prod
52 | ```
53 |
54 | ### nginx 参考配置
55 | ```sh
56 | location / {
57 | root /usr/local/ox-admin/ox-admin-web;
58 | try_files $uri $uri/ @router;
59 | index index.html index.htm;
60 | }
61 |
62 | location @router {
63 | rewrite ^.*$ /index.html last;
64 | }
65 |
66 | location ^~ /api {
67 | rewrite ^/api(.*)$ $1 break;
68 | proxy_pass http://localhost:9999/api;
69 | proxy_set_header Host $host;
70 | proxy_set_header X-Real-IP $remote_addr;
71 | proxy_set_header REMOTE-HOST $remote_addr;
72 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
73 | access_log /usr/local/nginx/logs/ox-admin-access.log main;
74 | error_log /usr/local/nginx/logs/ox-admin-error.log warn;
75 | }
76 |
77 | ```
78 |
79 | ## SQL脚本
80 | ```
81 | ox-admin\docs\ox-admin.sql
82 | ```
83 | ## 常见问题
84 | ```
85 | 1、项目中使用了lombok插件,自行百度。
86 | 2、最好用IDEA开发工具。
87 | 3、项目打包之后,可能由于不同环境打包导致配置文件出问题,无法启动,请先删除classes、target目录,重新运行项目。
88 | ```
89 | ## 参考资料
90 | - [vue-element-admin](https://github.com/PanJiaChen/vue-element-admin)
91 | - [eladmin](https://github.com/elunez/eladmin)
92 | - [Hutool](https://gitee.com/loolly/hutool)
93 |
94 |
--------------------------------------------------------------------------------
/docs/images/1683383586326.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/java668/ox-admin/555056fe7b9bcb6a20afb42b29e0b0b96be537de/docs/images/1683383586326.jpg
--------------------------------------------------------------------------------
/ox-admin-application/.gitignore:
--------------------------------------------------------------------------------
1 | HELP.md
2 | target/
3 | !.mvn/wrapper/maven-wrapper.jar
4 | !**/src/main/**/target/
5 | !**/src/test/**/target/
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 | !**/src/main/**/build/
30 | !**/src/test/**/build/
31 |
32 | ### VS Code ###
33 | .vscode/
34 |
--------------------------------------------------------------------------------
/ox-admin-application/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM openjdk:8-jdk-alpine
2 | MAINTAINER ox-admin
3 |
4 | WORKDIR /app/ox-admin
5 | ARG JAR_FILE
6 | COPY ${JAR_FILE} app.jar
7 |
8 | ENV TZ=Asia/Shanghai
9 | RUN ln -sf /usr/share/zoneinfo/{TZ} /etc/localtime && echo "{TZ}" > /etc/timezone
10 |
11 | # 设置环境变量,可选
12 | ENV username=""
13 | ENV password=""
14 | ENV url=""
15 |
16 | EXPOSE 8080
17 |
18 | ENTRYPOINT ["sh","-c","java -jar /app/ox-admin/app.jar --java668.mysql.host=$url --java668.mysql.username=$username --java668.mysql.password=$password"]
--------------------------------------------------------------------------------
/ox-admin-application/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 | 4.0.0
5 |
6 |
7 | com.java668.oxadmin
8 | ox-admin
9 | 1.0-SNAPSHOT
10 |
11 |
12 | com.java668.oxadmin
13 | ox-admin-application
14 | 0.0.1-SNAPSHOT
15 | ox-admin-application
16 | ox-admin应用层
17 |
18 |
19 | UTF-8
20 | 8
21 | 8
22 |
23 |
24 |
25 |
26 |
27 | com.java668.oxadmin
28 | ox-admin-common
29 |
30 |
31 |
32 |
33 | mysql
34 | mysql-connector-java
35 |
36 |
37 |
38 |
39 | com.alibaba
40 | druid-spring-boot-starter
41 |
42 |
43 |
44 | p6spy
45 | p6spy
46 |
47 |
48 |
49 |
50 | org.apache.velocity
51 | velocity-engine-core
52 | 2.3
53 |
54 |
55 |
56 |
57 | commons-io
58 | commons-io
59 | 2.11.0
60 |
61 |
62 |
63 |
64 |
65 |
66 | dev
67 |
68 | true
69 |
70 |
71 | dev
72 |
73 |
74 |
75 |
76 |
77 | h2
78 |
79 | h2
80 |
81 |
82 |
83 |
84 |
85 | prod
86 |
87 | prod
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 | org.springframework.boot
96 | spring-boot-maven-plugin
97 |
98 |
99 | com.spotify
100 | dockerfile-maven-plugin
101 | 1.4.0
102 |
103 | ${project.artifactId}
104 |
105 | target/${project.build.finalName}.jar
106 |
107 |
108 |
109 |
110 |
111 | javax.activation
112 | activation
113 | 1.1.1
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
--------------------------------------------------------------------------------
/ox-admin-application/src/main/java/com/java668/oxadmin/OxAdminApplication.java:
--------------------------------------------------------------------------------
1 | package com.java668.oxadmin;
2 |
3 | import com.mzt.logapi.starter.annotation.EnableLogRecord;
4 | import lombok.extern.slf4j.Slf4j;
5 | import org.springframework.boot.SpringApplication;
6 | import org.springframework.boot.autoconfigure.SpringBootApplication;
7 | import org.springframework.context.ApplicationContext;
8 | import org.springframework.core.env.Environment;
9 | import org.springframework.scheduling.annotation.EnableAsync;
10 |
11 | import java.net.InetAddress;
12 | import java.net.UnknownHostException;
13 |
14 | /**
15 | * @author Jerry.chen
16 | * @desc ox-admin启动类
17 | * @date 2023/03/29 18:05
18 | **/
19 | @Slf4j
20 | @EnableAsync
21 | @EnableLogRecord(tenant = "oxadmin")
22 | @SpringBootApplication
23 | public class OxAdminApplication {
24 |
25 | public static void main(String[] args) throws UnknownHostException {
26 | ApplicationContext context = SpringApplication.run(OxAdminApplication.class, args);
27 | Environment env = context.getEnvironment();
28 | String host = InetAddress.getLocalHost().getHostAddress();
29 | String port = env.getProperty("server.port");
30 | log.info(
31 | "\n----------------------------------------------------------\n\t"
32 | + "Application '{}' is running! Access URLs:\n\t"
33 | + "Local: \t\thttp://localhost:{}\n\t"
34 | + "External: \thttp://{}:{}\n\t"
35 | + "Doc: \thttp://localhost:{}/doc.html\n\t"
36 | + "----------------------------------------------------------",
37 | env.getProperty("spring.application.name"),
38 | env.getProperty("server.port"),
39 | host,
40 | port,
41 | port);
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/ox-admin-application/src/main/java/com/java668/oxadmin/config/ExceptionAdvice.java:
--------------------------------------------------------------------------------
1 | package com.java668.oxadmin.config;
2 |
3 | import com.java668.common.exception.DefaultExceptionAdvice;
4 | import org.springframework.web.bind.annotation.ControllerAdvice;
5 |
6 | /**
7 | * 全局异常处理
8 | *
9 | * @author jerry.chen
10 | * @since 2023-03-25 19:55:38
11 | */
12 | @ControllerAdvice
13 | public class ExceptionAdvice extends DefaultExceptionAdvice {
14 | }
15 |
--------------------------------------------------------------------------------
/ox-admin-application/src/main/java/com/java668/oxadmin/config/SpringfoxHandlerProviderBeanPostProcessor.java:
--------------------------------------------------------------------------------
1 | package com.java668.oxadmin.config;
2 |
3 | import org.springframework.beans.BeansException;
4 | import org.springframework.beans.factory.config.BeanPostProcessor;
5 | import org.springframework.stereotype.Component;
6 | import org.springframework.util.ReflectionUtils;
7 | import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;
8 | import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider;
9 |
10 | import java.lang.reflect.Field;
11 | import java.util.List;
12 |
13 | /**
14 | * @author Jerry.chen
15 | */
16 | @Component
17 | public class SpringfoxHandlerProviderBeanPostProcessor implements BeanPostProcessor {
18 |
19 | @Override
20 | public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
21 | if (bean instanceof WebMvcRequestHandlerProvider) {
22 | customizeSpringfoxHandlerMappings(getHandlerMappings(bean));
23 | }
24 | return bean;
25 | }
26 |
27 | private void customizeSpringfoxHandlerMappings(List mappings) {
28 | mappings.removeIf(mapping -> mapping.getPatternParser() != null);
29 | }
30 |
31 | @SuppressWarnings("unchecked")
32 | private List getHandlerMappings(Object bean) {
33 | try {
34 | Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings");
35 | field.setAccessible(true);
36 | return (List) field.get(bean);
37 | } catch (IllegalArgumentException | IllegalAccessException e) {
38 | throw new IllegalStateException(e);
39 | }
40 | }
41 |
42 | }
43 |
--------------------------------------------------------------------------------
/ox-admin-application/src/main/java/com/java668/oxadmin/config/secrity/LoginTimingFilter.java:
--------------------------------------------------------------------------------
1 | package com.java668.oxadmin.config.secrity;
2 |
3 | import com.java668.common.constant.Constants;
4 | import org.springframework.util.StopWatch;
5 |
6 | import javax.servlet.*;
7 | import javax.servlet.http.HttpServletRequest;
8 | import java.io.IOException;
9 |
10 | /**
11 | * @author Jerry.chen
12 | */
13 | public class LoginTimingFilter implements Filter {
14 |
15 | @Override
16 | public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
17 | HttpServletRequest httpRequest = (HttpServletRequest) request;
18 | String requestURI = httpRequest.getRequestURI();
19 | // 在登录请求之前记录开始时间 在退出请求之前记录开始时间
20 | if (requestURI.equals("/login") || requestURI.equals("/logout")) {
21 | request.setAttribute(Constants.LOG_START_TIME_ATTRIBUTE, System.currentTimeMillis());
22 | }
23 | chain.doFilter(request, response);
24 | }
25 |
26 | }
27 |
--------------------------------------------------------------------------------
/ox-admin-application/src/main/java/com/java668/oxadmin/config/secrity/components/AbstractUserDetailsService.java:
--------------------------------------------------------------------------------
1 | package com.java668.oxadmin.config.secrity.components;
2 |
3 | import cn.hutool.core.collection.CollUtil;
4 | import cn.hutool.core.util.StrUtil;
5 | import com.google.common.collect.Sets;
6 | import com.java668.common.model.SysUser;
7 | import com.java668.oxadmin.modules.system.entity.Menu;
8 | import com.java668.oxadmin.modules.system.entity.User;
9 | import com.java668.oxadmin.modules.system.service.MenuService;
10 | import lombok.RequiredArgsConstructor;
11 | import org.springframework.security.core.GrantedAuthority;
12 | import org.springframework.security.core.authority.SimpleGrantedAuthority;
13 | import org.springframework.security.core.userdetails.UserDetails;
14 | import org.springframework.security.core.userdetails.UserDetailsService;
15 | import org.springframework.security.core.userdetails.UsernameNotFoundException;
16 |
17 | import java.util.HashSet;
18 | import java.util.List;
19 | import java.util.Set;
20 |
21 | /**
22 | * 用户登录信息查询抽象Service
23 | *
24 | * @author jerry.chen
25 | * @since 2023-03-25 19:55:38
26 | */
27 | @RequiredArgsConstructor
28 | public abstract class AbstractUserDetailsService implements UserDetailsService {
29 |
30 | private final static String DEFAULT_ROLE_PREFIX = "ROLE_";
31 |
32 | private final MenuService menuService;
33 |
34 | /**
35 | * 这个方法交给子类去实现它,查询用户信息
36 | *
37 | * @param principal 用户名或者手机号
38 | * @return
39 | */
40 | public abstract User findUser(String principal);
41 |
42 | @Override
43 | public UserDetails loadUserByUsername(String principal) throws UsernameNotFoundException {
44 | // 1. 通过请求的用户名去数据库中查询用户信息
45 | User user = findUser(principal);
46 | if (user == null) {
47 | throw new UsernameNotFoundException("用户名或密码错误");
48 | }
49 | // 2. 通过用户id去获取权限信息
50 | UserDetails userDetails = findPermission(user);
51 | return userDetails;
52 | }
53 |
54 | private UserDetails findPermission(User user) {
55 | SysUser sysUser = SysUser.builder()
56 | .id(user.getId())
57 | .username(user.getUsername())
58 | .password(user.getPassword())
59 | .nickName(user.getNickName())
60 | .avatar(user.getAvatar())
61 | .phone(user.getPhone())
62 | .email(user.getEmail())
63 | .authorities(Sets.newHashSet())
64 | .enabled(0 == user.getEnabled())
65 | .accountNonLocked(Boolean.TRUE)
66 | .accountNonExpired(Boolean.TRUE)
67 | .credentialsNonExpired(Boolean.TRUE)
68 | .build();
69 |
70 | // 3. 查询该用户有哪一些权限
71 | List