├── .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 | ![输入图片说明](https://github.com/java668/ox-admin/blob/main/docs/images/1683383586326.jpg?raw=true 23 | "微信图片_20190422175210.png") 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 menuList = menuService.findByUserId(user.getId(), Boolean.FALSE); 72 | if (CollUtil.isEmpty(menuList)) { 73 | return sysUser; 74 | } 75 | // 4. 封装权限信息 76 | Set authoritiesSet = new HashSet<>(); 77 | Set roles = new HashSet<>(); 78 | Set permissions = new HashSet<>(); 79 | for (Menu menu : menuList) { 80 | // 权限标识 81 | String permission = menu.getPermission(); 82 | // 角色编码 83 | String code = menu.getCode(); 84 | if (StrUtil.isNotBlank(permission)) { 85 | permissions.add(permission); 86 | authoritiesSet.add(new SimpleGrantedAuthority(permission)); 87 | } 88 | if (StrUtil.isNotBlank(code)) { 89 | roles.add(code); 90 | authoritiesSet.add(new SimpleGrantedAuthority(DEFAULT_ROLE_PREFIX + code)); 91 | } 92 | } 93 | sysUser.setAuthorities(authoritiesSet); 94 | sysUser.setRoles(roles); 95 | sysUser.setPermissions(permissions); 96 | return sysUser; 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/config/secrity/components/CustomAccessDeniedHandler.java: -------------------------------------------------------------------------------- 1 | 2 | package com.java668.oxadmin.config.secrity.components; 3 | 4 | import lombok.extern.slf4j.Slf4j; 5 | import org.springframework.security.access.AccessDeniedException; 6 | import org.springframework.security.web.access.AccessDeniedHandler; 7 | import org.springframework.stereotype.Component; 8 | 9 | import javax.servlet.http.HttpServletRequest; 10 | import javax.servlet.http.HttpServletResponse; 11 | import java.io.IOException; 12 | 13 | /** 14 | * 授权失败处理器 15 | * 16 | * @author jerry.chen 17 | * @since 2023-03-25 19:55:38 18 | */ 19 | @Slf4j 20 | @Component 21 | public class CustomAccessDeniedHandler implements AccessDeniedHandler { 22 | 23 | @Override 24 | public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException { 25 | // 当用户在没有授权的情况下访问受保护的REST资源时,将调用此方法发送403 Forbidden响应 26 | response.sendError(HttpServletResponse.SC_FORBIDDEN); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/config/secrity/components/CustomAuthenticationFailureHandler.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.config.secrity.components; 2 | 3 | import com.java668.common.constant.Constants; 4 | import com.java668.common.model.R; 5 | import com.java668.oxadmin.modules.system.service.ILogRecordEventService; 6 | import lombok.RequiredArgsConstructor; 7 | import lombok.extern.slf4j.Slf4j; 8 | import org.springframework.security.authentication.InternalAuthenticationServiceException; 9 | import org.springframework.security.core.AuthenticationException; 10 | import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler; 11 | import org.springframework.stereotype.Component; 12 | 13 | import javax.servlet.ServletException; 14 | import javax.servlet.http.HttpServletRequest; 15 | import javax.servlet.http.HttpServletResponse; 16 | import java.io.IOException; 17 | 18 | /** 19 | * 认证失败处理器 20 | * 21 | * @author jerry.chen 22 | * @since 2023-03-25 19:55:38 23 | */ 24 | @Slf4j 25 | @Component 26 | @RequiredArgsConstructor 27 | public class CustomAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler { 28 | 29 | private final ILogRecordEventService logRecordEventService; 30 | 31 | /** 32 | * @param exception 认证失败时抛出异常 33 | */ 34 | @Override 35 | public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException { 36 | response.setContentType("application/json;charset=utf-8"); 37 | if (exception instanceof InternalAuthenticationServiceException) { 38 | log.error("登录系统内部错误:", exception); 39 | response.getWriter().write(R.failed("系统繁忙,请稍候重试").toJsonString()); 40 | } else { 41 | response.getWriter().write(R.failed(exception.getMessage()).toJsonString()); 42 | } 43 | // 登陆认证失败新增日志 44 | Long loginStartTime = (Long) request.getAttribute(Constants.LOG_START_TIME_ATTRIBUTE); 45 | Long loginDuration = System.currentTimeMillis() - loginStartTime; 46 | log.info("登录耗时: {}毫秒 错误描述: {}", loginDuration, exception.getMessage()); 47 | String username = request.getParameter("username"); 48 | logRecordEventService.pushEvent("认证授权", "用户登录", exception.getMessage(), loginDuration, username, Boolean.TRUE); 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/config/secrity/components/CustomAuthenticationSuccessHandler.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.config.secrity.components; 2 | 3 | import com.java668.common.constant.Constants; 4 | import com.java668.common.model.R; 5 | import com.java668.common.utils.AuthUtils; 6 | import com.java668.oxadmin.modules.system.service.ILogRecordEventService; 7 | import lombok.RequiredArgsConstructor; 8 | import lombok.extern.slf4j.Slf4j; 9 | import org.springframework.security.core.Authentication; 10 | import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; 11 | import org.springframework.stereotype.Component; 12 | 13 | import javax.servlet.ServletException; 14 | import javax.servlet.http.HttpServletRequest; 15 | import javax.servlet.http.HttpServletResponse; 16 | import java.io.IOException; 17 | 18 | /** 19 | * 认证成功处理器 20 | * 21 | * @author jerry.chen 22 | * @since 2023-03-25 19:55:38 23 | */ 24 | @Slf4j 25 | @Component 26 | @RequiredArgsConstructor 27 | public class CustomAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler { 28 | 29 | private final ILogRecordEventService logRecordEventService; 30 | 31 | @Override 32 | public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { 33 | response.setContentType("application/json;charset=utf-8"); 34 | String message = R.succeed(authentication, "认证成功").toJsonString(); 35 | response.getWriter().write(message); 36 | Long loginStartTime = (Long) request.getAttribute(Constants.LOG_START_TIME_ATTRIBUTE); 37 | Long loginDuration = System.currentTimeMillis() - loginStartTime; 38 | log.info("登录耗时: {}毫秒", loginDuration); 39 | // 新增登录日志 40 | logRecordEventService.pushEvent("认证模块", "用户登录", message, loginDuration, AuthUtils.getUsername(), Boolean.FALSE); 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/config/secrity/components/CustomLogoutSuccessHandler.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.config.secrity.components; 2 | 3 | import com.java668.common.constant.Constants; 4 | import com.java668.common.model.R; 5 | import com.java668.common.model.SysUser; 6 | import com.java668.oxadmin.modules.system.service.ILogRecordEventService; 7 | import lombok.RequiredArgsConstructor; 8 | import lombok.extern.slf4j.Slf4j; 9 | import org.springframework.security.core.Authentication; 10 | import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; 11 | import org.springframework.stereotype.Component; 12 | 13 | import javax.servlet.ServletException; 14 | import javax.servlet.http.HttpServletRequest; 15 | import javax.servlet.http.HttpServletResponse; 16 | import java.io.IOException; 17 | 18 | /** 19 | * 退出登录处理器 20 | * 21 | * @author jerry.chen 22 | * @since 2023-03-25 19:55:38 23 | */ 24 | @Slf4j 25 | @Component 26 | @RequiredArgsConstructor 27 | public class CustomLogoutSuccessHandler implements LogoutSuccessHandler { 28 | 29 | private final ILogRecordEventService logRecordEventService; 30 | 31 | @Override 32 | public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { 33 | response.setContentType("application/json;charset=utf-8"); 34 | String message = R.succeed(authentication).toJsonString(); 35 | response.getWriter().write(message); 36 | 37 | Long loginStartTime = (Long) request.getAttribute(Constants.LOG_START_TIME_ATTRIBUTE); 38 | Long loginDuration = System.currentTimeMillis() - loginStartTime; 39 | log.info("登录耗时: {}毫秒", loginDuration); 40 | // 新增退出登录日志 41 | String username = ""; 42 | if (null != authentication) { 43 | SysUser principal = (SysUser) authentication.getPrincipal(); 44 | username = principal.getUsername(); 45 | } 46 | logRecordEventService.pushEvent("认证模块", "退出登录", message, loginDuration, username, Boolean.FALSE); 47 | 48 | } 49 | 50 | } 51 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/config/secrity/components/CustomSecurityAuthenticationEntryPoint.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.config.secrity.components; 2 | 3 | import lombok.extern.slf4j.Slf4j; 4 | import org.springframework.security.core.AuthenticationException; 5 | import org.springframework.security.web.AuthenticationEntryPoint; 6 | import org.springframework.stereotype.Component; 7 | 8 | import javax.servlet.ServletException; 9 | import javax.servlet.http.HttpServletRequest; 10 | import javax.servlet.http.HttpServletResponse; 11 | import java.io.IOException; 12 | 13 | /** 14 | * 登录失效响应处理 15 | * 16 | * @author jerry.chen 17 | * @since 2023-03-25 19:55:38 18 | */ 19 | @Slf4j 20 | @Component 21 | public class CustomSecurityAuthenticationEntryPoint implements AuthenticationEntryPoint { 22 | @Override 23 | public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { 24 | // 当用户尝试访问安全的REST资源而不提供任何凭据时,将调用此方法发送401 响应 25 | response.sendError(HttpServletResponse.SC_UNAUTHORIZED, authException == null ? "Unauthorized" : authException.getMessage()); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/config/secrity/components/UserDetailsServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.config.secrity.components; 2 | 3 | import com.java668.oxadmin.modules.system.entity.User; 4 | import com.java668.oxadmin.modules.system.service.MenuService; 5 | import com.java668.oxadmin.modules.system.service.UserService; 6 | import lombok.extern.slf4j.Slf4j; 7 | import org.springframework.stereotype.Component; 8 | 9 | /** 10 | * 用户登录信息查询Service 11 | * 12 | * @author jerry.chen 13 | * @since 2023-03-25 19:55:38 14 | */ 15 | @Slf4j 16 | @Component 17 | public class UserDetailsServiceImpl extends AbstractUserDetailsService { 18 | 19 | private final UserService userService; 20 | 21 | public UserDetailsServiceImpl(MenuService menuService, UserService userService) { 22 | super(menuService); 23 | this.userService = userService; 24 | } 25 | 26 | @Override 27 | public User findUser(String principal) { 28 | return userService.getByUsername(null, principal); 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/config/secrity/properties/PermitProperties.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.config.secrity.properties; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | /** 7 | * @author Jerry.chen 8 | */ 9 | public class PermitProperties { 10 | /** 11 | * 监控中心和swagger需要访问的url 12 | */ 13 | private static final String[] ENDPOINTS = { 14 | "/oauth/**", 15 | "/actuator/**", 16 | "/*/v2/api-docs", 17 | "/swagger/api-docs", 18 | "/swagger-ui.html", 19 | "/doc.html", 20 | "/swagger-resources/**", 21 | "/webjars/**", 22 | "/druid/**" 23 | }; 24 | 25 | /** 26 | * 设置不用认证的url 27 | */ 28 | private String[] httpUrls = {}; 29 | 30 | public String[] getUrls() { 31 | if (httpUrls == null || httpUrls.length == 0) { 32 | return ENDPOINTS; 33 | } 34 | List list = new ArrayList<>(); 35 | for (String url : ENDPOINTS) { 36 | list.add(url); 37 | } 38 | for (String url : httpUrls) { 39 | list.add(url); 40 | } 41 | return list.toArray(new String[list.size()]); 42 | } 43 | } -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/config/secrity/properties/SecurityProperties.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.config.secrity.properties; 2 | 3 | import lombok.Data; 4 | import org.springframework.boot.context.properties.ConfigurationProperties; 5 | import org.springframework.stereotype.Component; 6 | 7 | /** 8 | * @author Jerry.chen 9 | */ 10 | @Data 11 | @Component 12 | @ConfigurationProperties(prefix = "oxadmin.security") 13 | public class SecurityProperties { 14 | 15 | private PermitProperties ignore = new PermitProperties(); 16 | 17 | } -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/generator/controller/TableColumnController.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.generator.controller; 2 | 3 | 4 | import com.java668.common.model.R; 5 | import com.java668.oxadmin.modules.generator.dto.response.TableColumnRespDTO; 6 | import com.java668.oxadmin.modules.generator.service.ITableColumnService; 7 | import lombok.RequiredArgsConstructor; 8 | import org.springframework.web.bind.annotation.GetMapping; 9 | import org.springframework.web.bind.annotation.PathVariable; 10 | import org.springframework.web.bind.annotation.RequestMapping; 11 | import org.springframework.web.bind.annotation.RestController; 12 | 13 | import java.util.List; 14 | 15 | /** 16 | * 代码生成业务表字段(TableColumn)表控制层 17 | * 18 | * @author jerry.chen 19 | * @since 2023-06-02 10:23:29 20 | */ 21 | @RestController 22 | @RequestMapping("/v1/tableColumn") 23 | @RequiredArgsConstructor 24 | public class TableColumnController { 25 | /** 26 | * 服务对象 27 | */ 28 | private final ITableColumnService tableColumnService; 29 | 30 | /** 31 | * 查询数据表字段列表 32 | */ 33 | @GetMapping(value = "/column/{tableId}") 34 | public R> columnList(@PathVariable("tableId") Long tableId) { 35 | return R.succeed(tableColumnService.listByTableId(tableId)); 36 | } 37 | } 38 | 39 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/generator/dto/request/TableColumnReqDTO.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.generator.dto.request; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.NotBlank; 6 | 7 | /** 8 | * 业务表 gen_table 9 | * 10 | * @author jerry.chen 11 | */ 12 | @Data 13 | public class TableColumnReqDTO { 14 | 15 | private static final long serialVersionUID = 1L; 16 | 17 | /** 18 | * 编号 19 | */ 20 | private Long columnId; 21 | 22 | /** 23 | * 归属表编号 24 | */ 25 | private Long tableId; 26 | 27 | /** 28 | * 列名称 29 | */ 30 | private String columnName; 31 | 32 | /** 33 | * 列描述 34 | */ 35 | private String columnComment; 36 | 37 | /** 38 | * 列类型 39 | */ 40 | private String columnType; 41 | 42 | /** 43 | * JAVA类型 44 | */ 45 | private String javaType; 46 | 47 | /** 48 | * JAVA字段名 49 | */ 50 | @NotBlank(message = "Java属性不能为空") 51 | private String javaField; 52 | 53 | /** 54 | * 是否主键(1是) 55 | */ 56 | private String isPk; 57 | 58 | /** 59 | * 是否自增(1是) 60 | */ 61 | private String isIncrement; 62 | 63 | /** 64 | * 是否必填(1是) 65 | */ 66 | private String isRequired; 67 | 68 | /** 69 | * 是否为插入字段(1是) 70 | */ 71 | private String isInsert; 72 | 73 | /** 74 | * 是否编辑字段(1是) 75 | */ 76 | private String isEdit; 77 | 78 | /** 79 | * 是否列表字段(1是) 80 | */ 81 | private String isList; 82 | 83 | /** 84 | * 是否查询字段(1是) 85 | */ 86 | private String isQuery; 87 | 88 | /** 89 | * 查询方式(EQ等于、NE不等于、GT大于、LT小于、LIKE模糊、BETWEEN范围) 90 | */ 91 | private String queryType; 92 | 93 | /** 94 | * 显示类型(input文本框、textarea文本域、select下拉框、checkbox复选框、radio单选框、datetime日期控件、image图片上传控件、upload文件上传控件、editor富文本控件) 95 | */ 96 | private String htmlType; 97 | 98 | /** 99 | * 字典类型 100 | */ 101 | private String dictType; 102 | 103 | /** 104 | * 排序 105 | */ 106 | private Integer sort; 107 | 108 | } 109 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/generator/dto/request/TablePageReqDTO.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.generator.dto.request; 2 | 3 | import com.java668.common.model.PageParam; 4 | import lombok.Data; 5 | 6 | /** 7 | * 业务表 gen_table 8 | * 9 | * @author ruoyi 10 | */ 11 | @Data 12 | public class TablePageReqDTO extends PageParam { 13 | 14 | private String tableName; 15 | 16 | private String tableComment; 17 | 18 | private String beginTime; 19 | 20 | private String endTime; 21 | } 22 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/generator/dto/request/TableReqDTO.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.generator.dto.request; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.NotBlank; 6 | import java.util.List; 7 | import java.util.Map; 8 | 9 | /** 10 | * 业务表 gen_table 11 | * 12 | * @author jerry.chen 13 | */ 14 | @Data 15 | public class TableReqDTO { 16 | private static final long serialVersionUID = 1L; 17 | 18 | /** 19 | * 编号 20 | */ 21 | private Long tableId; 22 | 23 | /** 24 | * 表名称 25 | */ 26 | @NotBlank(message = "表名称不能为空") 27 | private String tableName; 28 | 29 | /** 30 | * 表描述 31 | */ 32 | @NotBlank(message = "表描述不能为空") 33 | private String tableComment; 34 | 35 | /** 36 | * 关联父表的表名 37 | */ 38 | private String subTableName; 39 | 40 | /** 41 | * 本表关联父表的外键名 42 | */ 43 | private String subTableFkName; 44 | 45 | /** 46 | * 实体类名称(首字母大写) 47 | */ 48 | @NotBlank(message = "实体类名称不能为空") 49 | private String className; 50 | 51 | /** 52 | * 使用的模板(crud单表操作 tree树表操作 sub主子表操作) 53 | */ 54 | private String tplCategory; 55 | 56 | /** 57 | * 生成包路径 58 | */ 59 | @NotBlank(message = "生成包路径不能为空") 60 | private String packageName; 61 | 62 | /** 63 | * 生成模块名 64 | */ 65 | @NotBlank(message = "生成模块名不能为空") 66 | private String moduleName; 67 | 68 | /** 69 | * 生成业务名 70 | */ 71 | @NotBlank(message = "生成业务名不能为空") 72 | private String businessName; 73 | 74 | /** 75 | * 生成功能名 76 | */ 77 | @NotBlank(message = "生成功能名不能为空") 78 | private String functionName; 79 | 80 | /** 81 | * 生成作者 82 | */ 83 | @NotBlank(message = "作者不能为空") 84 | private String functionAuthor; 85 | 86 | /** 87 | * 生成代码方式(0zip压缩包 1自定义路径) 88 | */ 89 | private String genType; 90 | 91 | /** 92 | * 生成路径(不填默认项目路径) 93 | */ 94 | private String genPath; 95 | 96 | /** 97 | * 其它生成选项 98 | */ 99 | private String options; 100 | 101 | /** 102 | * 树编码字段 103 | */ 104 | private String treeCode; 105 | 106 | /** 107 | * 树父编码字段 108 | */ 109 | private String treeParentCode; 110 | 111 | /** 112 | * 树名称字段 113 | */ 114 | private String treeName; 115 | 116 | /** 117 | * 上级菜单ID字段 118 | */ 119 | private String parentMenuId; 120 | 121 | /** 122 | * 上级菜单名称字段 123 | */ 124 | private String parentMenuName; 125 | 126 | /** 127 | * TableColumnReqDTO 128 | */ 129 | private List columns; 130 | 131 | /** 132 | * 请求参数 133 | */ 134 | private Map params; 135 | 136 | } -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/generator/dto/response/TableColumnRespDTO.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.generator.dto.response; 2 | 3 | import com.java668.common.model.BaseDTO; 4 | import lombok.Data; 5 | 6 | /** 7 | * @author Jerry.chen 8 | * @desc 9 | * @date 2023/06/02 11:42 10 | **/ 11 | @Data 12 | public class TableColumnRespDTO extends BaseDTO { 13 | 14 | /** 15 | * 主键ID 16 | */ 17 | private Long columnId; 18 | /** 19 | * 归属表编号 20 | */ 21 | private Long tableId; 22 | /** 23 | * 列名称 24 | */ 25 | private String columnName; 26 | /** 27 | * 列描述 28 | */ 29 | private String columnComment; 30 | /** 31 | * 列类型 32 | */ 33 | private String columnType; 34 | /** 35 | * JAVA类型 36 | */ 37 | private String javaType; 38 | /** 39 | * JAVA字段名 40 | */ 41 | private String javaField; 42 | /** 43 | * 是否主键(1是) 44 | */ 45 | private String isPk; 46 | /** 47 | * 是否自增(1是) 48 | */ 49 | private String isIncrement; 50 | /** 51 | * 是否必填(1是) 52 | */ 53 | private String isRequired; 54 | /** 55 | * 是否为插入字段(1是) 56 | */ 57 | private String isInsert; 58 | /** 59 | * 是否编辑字段(1是) 60 | */ 61 | private String isEdit; 62 | /** 63 | * 是否列表字段(1是) 64 | */ 65 | private String isList; 66 | /** 67 | * 是否查询字段(1是) 68 | */ 69 | private String isQuery; 70 | /** 71 | * 查询方式(等于、不等于、大于、小于、范围) 72 | */ 73 | private String queryType; 74 | /** 75 | * 显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件) 76 | */ 77 | private String htmlType; 78 | /** 79 | * 字典类型 80 | */ 81 | private String dictType; 82 | /** 83 | * 排序 84 | */ 85 | private Integer sort; 86 | 87 | } -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/generator/dto/response/TableRespDTO.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.generator.dto.response; 2 | 3 | import com.java668.common.model.BaseDTO; 4 | import lombok.Data; 5 | 6 | import javax.validation.Valid; 7 | import javax.validation.constraints.NotBlank; 8 | import java.util.List; 9 | 10 | /** 11 | * 业务表 gen_table 12 | * 13 | * @author ruoyi 14 | */ 15 | @Data 16 | public class TableRespDTO extends BaseDTO { 17 | private static final long serialVersionUID = 1L; 18 | 19 | /** 20 | * 编号 21 | */ 22 | private Long tableId; 23 | 24 | /** 25 | * 表名称 26 | */ 27 | @NotBlank(message = "表名称不能为空") 28 | private String tableName; 29 | 30 | /** 31 | * 表描述 32 | */ 33 | @NotBlank(message = "表描述不能为空") 34 | private String tableComment; 35 | 36 | /** 37 | * 关联父表的表名 38 | */ 39 | private String subTableName; 40 | 41 | /** 42 | * 本表关联父表的外键名 43 | */ 44 | private String subTableFkName; 45 | 46 | /** 47 | * 实体类名称(首字母大写) 48 | */ 49 | @NotBlank(message = "实体类名称不能为空") 50 | private String className; 51 | 52 | /** 53 | * 使用的模板(crud单表操作 tree树表操作 sub主子表操作) 54 | */ 55 | private String tplCategory; 56 | 57 | /** 58 | * 生成包路径 59 | */ 60 | @NotBlank(message = "生成包路径不能为空") 61 | private String packageName; 62 | 63 | /** 64 | * 生成模块名 65 | */ 66 | @NotBlank(message = "生成模块名不能为空") 67 | private String moduleName; 68 | 69 | /** 70 | * 生成业务名 71 | */ 72 | @NotBlank(message = "生成业务名不能为空") 73 | private String businessName; 74 | 75 | /** 76 | * 生成功能名 77 | */ 78 | @NotBlank(message = "生成功能名不能为空") 79 | private String functionName; 80 | 81 | /** 82 | * 生成作者 83 | */ 84 | @NotBlank(message = "作者不能为空") 85 | private String functionAuthor; 86 | 87 | /** 88 | * 生成代码方式(0zip压缩包 1自定义路径) 89 | */ 90 | private String genType; 91 | 92 | /** 93 | * 生成路径(不填默认项目路径) 94 | */ 95 | private String genPath; 96 | 97 | /** 98 | * 主键信息 99 | */ 100 | private TableColumnRespDTO pkColumn; 101 | 102 | /** 103 | * 子表信息 104 | */ 105 | private TableRespDTO subTable; 106 | 107 | /** 108 | * 表列信息 109 | */ 110 | @Valid 111 | private List columns; 112 | 113 | /** 114 | * 其它生成选项 115 | */ 116 | private String options; 117 | 118 | /** 119 | * 树编码字段 120 | */ 121 | private String treeCode; 122 | 123 | /** 124 | * 树父编码字段 125 | */ 126 | private String treeParentCode; 127 | 128 | /** 129 | * 树名称字段 130 | */ 131 | private String treeName; 132 | 133 | /** 134 | * 上级菜单ID字段 135 | */ 136 | private String parentMenuId; 137 | 138 | /** 139 | * 上级菜单名称字段 140 | */ 141 | private String parentMenuName; 142 | 143 | } -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/generator/mapper/TableColumnMapper.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.generator.mapper; 2 | 3 | import java.util.List; 4 | 5 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 6 | import com.java668.common.db.mapper.EasyBaseMapper; 7 | import org.apache.ibatis.annotations.Param; 8 | import com.java668.oxadmin.modules.generator.entity.TableColumn; 9 | 10 | /** 11 | * 代码生成业务表字段(TableColumn)表数据库访问层 12 | * 13 | * @author jerry.chen 14 | * @since 2023-06-02 10:23:29 15 | */ 16 | public interface TableColumnMapper extends EasyBaseMapper { 17 | 18 | 19 | List listByTableName(@Param("tableName") String tableName); 20 | 21 | int updateGenTableColumn(TableColumn column); 22 | 23 | int insertGenTableColumn(TableColumn column); 24 | 25 | int deleteGenTableColumns(List delColumns); 26 | } 27 | 28 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/generator/mapper/TableMapper.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.generator.mapper; 2 | 3 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 4 | import com.java668.common.db.mapper.EasyBaseMapper; 5 | import com.java668.oxadmin.modules.generator.dto.request.TablePageReqDTO; 6 | import com.java668.oxadmin.modules.generator.entity.Table; 7 | import org.apache.ibatis.annotations.Param; 8 | 9 | import java.util.List; 10 | 11 | /** 12 | * 代码生成业务表(Table)表数据库访问层 13 | * 14 | * @author jerry.chen 15 | * @since 2023-06-02 10:23:28 16 | */ 17 | public interface TableMapper extends EasyBaseMapper { 18 | 19 | Page
dbTablePage(Page
page, @Param("params") TablePageReqDTO params); 20 | 21 | List
dbTableListByNames(@Param("list") List names); 22 | 23 | Table selectTableByName(@Param("tableName") String subTableName); 24 | 25 | Table selectTableById(@Param("tableId") Long tableId); 26 | 27 | List
selectTableAll(); 28 | 29 | } 30 | 31 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/generator/service/ITableColumnService.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.generator.service; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.java668.oxadmin.modules.generator.dto.request.TableColumnReqDTO; 5 | import com.java668.oxadmin.modules.generator.dto.response.TableColumnRespDTO; 6 | import com.java668.oxadmin.modules.generator.entity.TableColumn; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * 代码生成业务表字段(TableColumn)表服务接口 12 | * 13 | * @author jerry.chen 14 | * @since 2023-06-02 10:23:30 15 | */ 16 | public interface ITableColumnService extends IService { 17 | 18 | List listByTableId(Long tableId); 19 | 20 | List listByTableName(String tableName); 21 | 22 | Boolean update(TableColumnReqDTO tableColumn); 23 | 24 | Boolean removeByTableIds(List tableIds); 25 | 26 | int updateGenTableColumn(TableColumn column); 27 | 28 | int insertGenTableColumn(TableColumn column); 29 | 30 | int deleteGenTableColumns(List delColumns); 31 | } 32 | 33 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/generator/service/ITableService.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.generator.service; 2 | 3 | import com.alibaba.fastjson2.JSONObject; 4 | import com.baomidou.mybatisplus.extension.service.IService; 5 | import com.java668.common.model.PageResult; 6 | import com.java668.oxadmin.modules.generator.dto.request.TablePageReqDTO; 7 | import com.java668.oxadmin.modules.generator.dto.request.TableReqDTO; 8 | import com.java668.oxadmin.modules.generator.dto.response.TableRespDTO; 9 | import com.java668.oxadmin.modules.generator.entity.Table; 10 | 11 | import java.util.List; 12 | import java.util.Map; 13 | 14 | /** 15 | * 代码生成业务表(Table)表服务接口 16 | * 17 | * @author jerry.chen 18 | * @since 2023-06-02 10:23:29 19 | */ 20 | public interface ITableService extends IService
{ 21 | 22 | /** 23 | * 分页查询 24 | * 25 | * @param params 26 | * @return 27 | */ 28 | PageResult page(TablePageReqDTO params); 29 | 30 | /** 31 | * 详情 32 | * 33 | * @param tableId 34 | * @return 35 | */ 36 | JSONObject getInfo(Long tableId); 37 | 38 | 39 | /** 40 | * 数据库表分页查询 41 | * 42 | * @param params 43 | * @return 44 | */ 45 | PageResult dbTablePage(TablePageReqDTO params); 46 | 47 | /** 48 | * 导入表结构(保存) 49 | * 50 | * @param tables 51 | * @return 52 | */ 53 | boolean importTable(List tables); 54 | 55 | /** 56 | * 更新 57 | * 58 | * @param genTable 59 | * @return 60 | */ 61 | Integer update(TableReqDTO genTable); 62 | 63 | /** 64 | * 预览 65 | * 66 | * @param tableId 67 | * @return 68 | */ 69 | Map previewCode(Long tableId); 70 | 71 | /** 72 | * 下载 73 | * 74 | * @param tableName 75 | * @return 76 | */ 77 | byte[] downloadCode(String tableName); 78 | 79 | /** 80 | * 批量生成 81 | * 82 | * @param tableNames 83 | * @return 84 | */ 85 | byte[] downloadCode(String[] tableNames); 86 | 87 | /** 88 | * 生成代码 89 | * 90 | * @param tableName 91 | * @return 92 | */ 93 | Boolean generatorCode(String tableName); 94 | 95 | /** 96 | * 同步数据库 97 | * 98 | * @param tableName 99 | */ 100 | void syncDb(String tableName); 101 | 102 | /** 103 | * 删除 104 | * 105 | * @param tableIds 106 | * @return 107 | */ 108 | Boolean delete(List tableIds); 109 | } 110 | 111 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/generator/service/impl/TableColumnServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.generator.service.impl; 2 | 3 | import cn.hutool.core.bean.BeanUtil; 4 | import cn.hutool.core.util.ObjectUtil; 5 | import cn.hutool.core.util.StrUtil; 6 | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 7 | import com.baomidou.mybatisplus.core.toolkit.Wrappers; 8 | import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; 9 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 10 | import com.java668.oxadmin.modules.generator.dto.request.TableColumnReqDTO; 11 | import com.java668.oxadmin.modules.generator.dto.response.TableColumnRespDTO; 12 | import com.java668.oxadmin.modules.generator.mapper.TableColumnMapper; 13 | import com.java668.oxadmin.modules.generator.entity.TableColumn; 14 | import com.java668.oxadmin.modules.generator.service.ITableColumnService; 15 | import org.springframework.stereotype.Service; 16 | 17 | import java.util.List; 18 | 19 | /** 20 | * 代码生成业务表字段(TableColumn)表服务实现类 21 | * 22 | * @author jerry.chen 23 | * @since 2023-06-02 10:23:30 24 | */ 25 | @Service("tableColumnService") 26 | public class TableColumnServiceImpl extends ServiceImpl implements ITableColumnService { 27 | 28 | @Override 29 | public List listByTableId(Long tableId) { 30 | List list = lambdaQuery().eq(TableColumn::getTableId, tableId).list(); 31 | return BeanUtil.copyToList(list, TableColumnRespDTO.class); 32 | } 33 | 34 | @Override 35 | public List listByTableName(String tableName) { 36 | return baseMapper.listByTableName(tableName); 37 | } 38 | 39 | @Override 40 | public Boolean update(TableColumnReqDTO tableColumn) { 41 | TableColumn entity = BeanUtil.copyProperties(tableColumn, TableColumn.class); 42 | return updateById(entity); 43 | } 44 | 45 | @Override 46 | public Boolean removeByTableIds(List tableIds) { 47 | LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery() 48 | .in(TableColumn::getTableId, tableIds); 49 | return remove(queryWrapper); 50 | } 51 | 52 | @Override 53 | public int updateGenTableColumn(TableColumn column) { 54 | return baseMapper.updateGenTableColumn(column); 55 | } 56 | 57 | @Override 58 | public int insertGenTableColumn(TableColumn column) { 59 | return baseMapper.insertGenTableColumn(column); 60 | } 61 | 62 | @Override 63 | public int deleteGenTableColumns(List delColumns) { 64 | return baseMapper.deleteGenTableColumns(delColumns); 65 | } 66 | 67 | } 68 | 69 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/generator/utils/StrFormatter.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.generator.utils; 2 | 3 | /** 4 | * 字符串格式化 5 | * 6 | * @author ruoyi 7 | */ 8 | public class StrFormatter 9 | { 10 | public static final String EMPTY_JSON = "{}"; 11 | public static final char C_BACKSLASH = '\\'; 12 | public static final char C_DELIM_START = '{'; 13 | public static final char C_DELIM_END = '}'; 14 | 15 | /** 16 | * 格式化字符串
17 | * 此方法只是简单将占位符 {} 按照顺序替换为参数
18 | * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可
19 | * 例:
20 | * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b
21 | * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a
22 | * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b
23 | * 24 | * @param strPattern 字符串模板 25 | * @param argArray 参数列表 26 | * @return 结果 27 | */ 28 | public static String format(final String strPattern, final Object... argArray) 29 | { 30 | if (StringUtils.isEmpty(strPattern) || StringUtils.isEmpty(argArray)) 31 | { 32 | return strPattern; 33 | } 34 | final int strPatternLength = strPattern.length(); 35 | 36 | // 初始化定义好的长度以获得更好的性能 37 | StringBuilder sbuf = new StringBuilder(strPatternLength + 50); 38 | 39 | int handledPosition = 0; 40 | int delimIndex;// 占位符所在位置 41 | for (int argIndex = 0; argIndex < argArray.length; argIndex++) 42 | { 43 | delimIndex = strPattern.indexOf(EMPTY_JSON, handledPosition); 44 | if (delimIndex == -1) 45 | { 46 | if (handledPosition == 0) 47 | { 48 | return strPattern; 49 | } 50 | else 51 | { // 字符串模板剩余部分不再包含占位符,加入剩余部分后返回结果 52 | sbuf.append(strPattern, handledPosition, strPatternLength); 53 | return sbuf.toString(); 54 | } 55 | } 56 | else 57 | { 58 | if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH) 59 | { 60 | if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH) 61 | { 62 | // 转义符之前还有一个转义符,占位符依旧有效 63 | sbuf.append(strPattern, handledPosition, delimIndex - 1); 64 | sbuf.append(Convert.utf8Str(argArray[argIndex])); 65 | handledPosition = delimIndex + 2; 66 | } 67 | else 68 | { 69 | // 占位符被转义 70 | argIndex--; 71 | sbuf.append(strPattern, handledPosition, delimIndex - 1); 72 | sbuf.append(C_DELIM_START); 73 | handledPosition = delimIndex + 1; 74 | } 75 | } 76 | else 77 | { 78 | // 正常占位符 79 | sbuf.append(strPattern, handledPosition, delimIndex); 80 | sbuf.append(Convert.utf8Str(argArray[argIndex])); 81 | handledPosition = delimIndex + 2; 82 | } 83 | } 84 | } 85 | // 加入最后一个占位符后所有的字符 86 | sbuf.append(strPattern, handledPosition, strPattern.length()); 87 | 88 | return sbuf.toString(); 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/generator/utils/VelocityInitializer.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.generator.utils; 2 | 3 | import org.apache.velocity.app.Velocity; 4 | 5 | import java.util.Properties; 6 | 7 | public class VelocityInitializer { 8 | /** 9 | * 初始化vm方法 10 | */ 11 | public static void initVelocity() { 12 | Properties p = new Properties(); 13 | try { 14 | // 加载classpath目录下的vm文件 15 | p.setProperty("resource.loader.file.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); 16 | // 定义字符集 17 | p.setProperty(Velocity.INPUT_ENCODING, "UTF8"); 18 | // 初始化Velocity引擎,指定配置Properties 19 | Velocity.init(p); 20 | } catch (Exception e) { 21 | throw new RuntimeException(e); 22 | } 23 | } 24 | } -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/controller/AuthController.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.controller; 2 | 3 | import cn.hutool.core.lang.tree.Tree; 4 | import com.java668.common.model.PageParam; 5 | import com.java668.common.model.PageResult; 6 | import com.java668.common.model.R; 7 | import com.java668.common.model.SysUser; 8 | import com.java668.common.utils.AuthUtils; 9 | import com.java668.oxadmin.modules.system.service.AuthService; 10 | import com.java668.oxadmin.modules.system.service.MenuService; 11 | import io.swagger.annotations.ApiOperation; 12 | import lombok.RequiredArgsConstructor; 13 | import lombok.extern.slf4j.Slf4j; 14 | import org.springframework.web.bind.annotation.GetMapping; 15 | import org.springframework.web.bind.annotation.RequestMapping; 16 | import org.springframework.web.bind.annotation.RestController; 17 | 18 | import java.util.List; 19 | 20 | /** 21 | * @author Jerry.chen 22 | * @desc 用户授权 23 | * @date 2023/02/01 16:32 24 | **/ 25 | @Slf4j 26 | @RequiredArgsConstructor 27 | @RestController 28 | @RequestMapping("/v1/auth") 29 | public class AuthController { 30 | 31 | private final MenuService menuService; 32 | private final AuthService authService; 33 | 34 | /** 35 | * 获取登陆用户信息 36 | * 37 | * @return 38 | */ 39 | @ApiOperation("获取登陆用户信息") 40 | @GetMapping("/info") 41 | public R userInfo() { 42 | return R.succeed(AuthUtils.getCurrentUser()); 43 | } 44 | 45 | /** 46 | * 获取路由列表 47 | * 48 | * @return 49 | */ 50 | @ApiOperation("获取路由列表") 51 | @GetMapping("/routerList") 52 | public R>> routerList() { 53 | return R.succeed(menuService.routerList()); 54 | } 55 | 56 | /** 57 | * @return 58 | */ 59 | @ApiOperation("在线用户列表") 60 | @GetMapping("/onlineUser") 61 | public R> onlineUser(PageParam pageParam) { 62 | return R.succeed(authService.onlineUser(pageParam)); 63 | } 64 | 65 | } -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/controller/MenuController.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.controller; 2 | 3 | import cn.hutool.core.lang.tree.Tree; 4 | import com.java668.common.model.R; 5 | import com.java668.oxadmin.modules.system.dto.request.MenuReqDTO; 6 | import com.java668.oxadmin.modules.system.dto.request.groups.Insert; 7 | import com.java668.oxadmin.modules.system.dto.request.groups.Update; 8 | import com.java668.oxadmin.modules.system.dto.response.MenuRespDTO; 9 | import com.java668.oxadmin.modules.system.service.MenuService; 10 | import io.swagger.annotations.ApiOperation; 11 | import lombok.RequiredArgsConstructor; 12 | import lombok.extern.slf4j.Slf4j; 13 | import org.springframework.security.access.prepost.PreAuthorize; 14 | import org.springframework.validation.annotation.Validated; 15 | import org.springframework.web.bind.annotation.*; 16 | 17 | import javax.validation.constraints.Size; 18 | import java.util.List; 19 | 20 | /** 21 | * @author Jerry.chen 22 | * @desc 菜单管理 23 | * @date 2023/02/01 16:32 24 | **/ 25 | @Slf4j 26 | @RequiredArgsConstructor 27 | @Validated 28 | @RestController 29 | @RequestMapping("/v1/menu") 30 | public class MenuController { 31 | 32 | private final MenuService menuService; 33 | 34 | @PostMapping 35 | @ApiOperation("新增菜单") 36 | @PreAuthorize("hasAnyRole('ADMIN', 'USER')") 37 | public R add(@RequestBody @Validated(Insert.class) MenuReqDTO body) { 38 | return R.succeed(menuService.add(body)); 39 | } 40 | 41 | @DeleteMapping 42 | @ApiOperation("删除菜单") 43 | @PreAuthorize("hasRole('ADMIN')") 44 | public R delete(@Size(min = 1, max = 5, message = "批量删除个数须在{min}-{max}范围") 45 | @RequestParam(name = "ids", required = true) List ids) { 46 | return R.succeed(menuService.delete(ids)); 47 | } 48 | 49 | @PatchMapping 50 | @ApiOperation("修改菜单") 51 | @PreAuthorize("hasRole('ADMIN')") 52 | public R update(@RequestBody @Validated(Update.class) MenuReqDTO body) { 53 | return R.succeed(menuService.update(body)); 54 | } 55 | 56 | @GetMapping("{id}") 57 | @ApiOperation("查询菜单详情") 58 | @PreAuthorize("hasAnyRole('ADMIN', 'USER')") 59 | public R get(@PathVariable(name = "id") Long id) { 60 | return R.succeed(menuService.get(id)); 61 | } 62 | 63 | @GetMapping(value = "/treeList") 64 | @ApiOperation("查询树型列表") 65 | @PreAuthorize("hasAnyRole('ADMIN', 'USER')") 66 | public R>> treeList() { 67 | return R.succeed(menuService.treeList()); 68 | } 69 | 70 | @GetMapping(value = "/lazy/{pid}") 71 | @ApiOperation("懒加载菜单数据") 72 | @PreAuthorize("hasAnyRole('ADMIN', 'USER')") 73 | public R> lazy(@PathVariable(value = "pid") Long pid) { 74 | return R.succeed(menuService.lazy(pid)); 75 | } 76 | 77 | @GetMapping(value = "/superior") 78 | @ApiOperation("根据ID获取同级与上级数据") 79 | @PreAuthorize("hasAnyRole('ADMIN', 'USER')") 80 | public R>> superior(@Size(min = 1, max = 5, message = "ids元素个数须在{min}-{max}范围") 81 | @RequestParam(name = "ids", required = true) List ids) { 82 | return R.succeed(menuService.superior(ids)); 83 | } 84 | 85 | } 86 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/controller/OperLogController.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.controller; 2 | 3 | import java.util.List; 4 | import org.springframework.security.access.prepost.PreAuthorize; 5 | import org.springframework.web.bind.annotation.*; 6 | import com.java668.oxadmin.modules.system.dto.request.OperLogPageReqDTO; 7 | import com.java668.oxadmin.modules.system.dto.request.OperLogReqDTO; 8 | import com.java668.oxadmin.modules.system.dto.response.OperLogRespDTO; 9 | import com.java668.oxadmin.modules.system.service.IOperLogService; 10 | import lombok.RequiredArgsConstructor; 11 | import com.java668.common.model.R; 12 | import com.java668.common.model.PageResult; 13 | 14 | /** 15 | * 操作日志Controller 16 | * 17 | * @author jerry.chen 18 | * @date 2023-06-09 11:17:20 19 | */ 20 | @RequiredArgsConstructor 21 | @RestController 22 | @RequestMapping("/system/log") 23 | public class OperLogController { 24 | 25 | private final IOperLogService systOperLogService; 26 | 27 | /** 28 | * 新增操作日志 29 | * 30 | * @param body 31 | * @return 32 | */ 33 | @PreAuthorize("hasAuthority('system:log:add')") 34 | @PostMapping 35 | public R add(@RequestBody OperLogReqDTO body) { 36 | return R.succeed(systOperLogService.add(body)); 37 | } 38 | 39 | /** 40 | * 删除操作日志 41 | * 42 | * @param ids 43 | * @return 44 | */ 45 | @PreAuthorize("hasAuthority('system:log:remove')") 46 | @DeleteMapping("/{ids}") 47 | public R remove(@PathVariable List ids) { 48 | return R.succeed(systOperLogService.remove(ids)); 49 | } 50 | 51 | /** 52 | * 修改操作日志 53 | * 54 | * @param body 55 | * @return 56 | */ 57 | @PreAuthorize("hasAuthority('system:log:edit')") 58 | @PutMapping 59 | public R update(@RequestBody OperLogReqDTO body) { 60 | return R.succeed(systOperLogService.update(body)); 61 | } 62 | 63 | /** 64 | * 获取操作日志详细信息 65 | * 66 | * @param id 67 | * @return 68 | */ 69 | @PreAuthorize("hasAuthority('system:log:query')") 70 | @GetMapping(value = "/{id}") 71 | public R detail(@PathVariable("id") Long id) { 72 | return R.succeed(systOperLogService.detail(id)); 73 | } 74 | 75 | /** 76 | * 查询操作日志列表 77 | * 78 | * @param req 79 | * @return 80 | */ 81 | @PreAuthorize("hasAuthority('system:log:list')") 82 | @GetMapping("/list") 83 | public R> page(OperLogPageReqDTO req) { 84 | return R.succeed(systOperLogService.page(req)); 85 | } 86 | 87 | } 88 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/controller/RoleController.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.controller; 2 | 3 | import com.java668.common.model.PageResult; 4 | import com.java668.common.model.R; 5 | import com.java668.oxadmin.modules.system.dto.request.RolePageReqDTO; 6 | import com.java668.oxadmin.modules.system.dto.request.RoleReqDTO; 7 | import com.java668.oxadmin.modules.system.dto.response.RoleRespDTO; 8 | import com.java668.oxadmin.modules.system.service.RoleService; 9 | import io.swagger.annotations.ApiOperation; 10 | import lombok.RequiredArgsConstructor; 11 | import lombok.extern.slf4j.Slf4j; 12 | import org.springframework.security.access.prepost.PreAuthorize; 13 | import org.springframework.validation.annotation.Validated; 14 | import org.springframework.web.bind.annotation.*; 15 | 16 | import java.util.List; 17 | 18 | /** 19 | * @author Jerry.chen 20 | * @desc 角色管理 21 | * @date 2023/02/01 16:32 22 | **/ 23 | @Slf4j 24 | @RequiredArgsConstructor 25 | @RestController 26 | @RequestMapping("/v1/role") 27 | public class RoleController { 28 | 29 | private final RoleService roleService; 30 | 31 | /** 32 | * 新增角色 33 | * 34 | * @param body 35 | * @return 36 | */ 37 | @PostMapping 38 | @PreAuthorize("hasAnyRole('ADMIN', 'USER')") 39 | @ApiOperation("新增角色") 40 | public R add(@RequestBody @Validated RoleReqDTO body) { 41 | return R.succeed(roleService.add(body)); 42 | } 43 | 44 | /** 45 | * 删除角色 46 | * 47 | * @param ids 48 | * @return 49 | */ 50 | @DeleteMapping 51 | @PreAuthorize("hasRole('ADMIN')") 52 | @ApiOperation("删除角色") 53 | public R delete(@RequestParam(name = "ids") List ids) { 54 | return R.succeed(roleService.delete(ids)); 55 | } 56 | 57 | /** 58 | * 修改角色 59 | * 60 | * @param body 61 | * @return 62 | */ 63 | @PutMapping 64 | @PreAuthorize("hasRole('ADMIN')") 65 | @ApiOperation("修改角色") 66 | public R update(@RequestBody @Validated RoleReqDTO body) { 67 | return R.succeed(roleService.update(body)); 68 | } 69 | 70 | /** 71 | * 查询角色详情 72 | * 73 | * @param id 74 | * @return 75 | */ 76 | @GetMapping("{id}") 77 | @ApiOperation("查询角色详情") 78 | @PreAuthorize("hasAnyRole('ADMIN', 'USER')") 79 | public R get(@PathVariable("id") Long id) { 80 | return R.succeed(roleService.get(id)); 81 | } 82 | 83 | /** 84 | * 查询角色列表 85 | * 86 | * @return 87 | */ 88 | @GetMapping("/list") 89 | @ApiOperation("查询角色列表") 90 | @PreAuthorize("hasAnyRole('ADMIN', 'USER')") 91 | public R> list() { 92 | return R.succeed(roleService.findList()); 93 | } 94 | 95 | /** 96 | * 分页查询角色列表 97 | * 98 | * @param params 99 | * @return 100 | */ 101 | @GetMapping("/page") 102 | @ApiOperation("分页查询角色列表") 103 | @PreAuthorize("hasAnyRole('ADMIN', 'USER')") 104 | public R> page(RolePageReqDTO params) { 105 | return R.succeed(roleService.page(params)); 106 | } 107 | 108 | /** 109 | * 保存角色菜单 110 | * 111 | * @param roleId 112 | * @param menuIds 113 | * @return 114 | */ 115 | @PostMapping("/{roleId}/saveMenu") 116 | @ApiOperation("保存角色菜单") 117 | @PreAuthorize("hasAnyRole('ADMIN')") 118 | public R saveMenu(@PathVariable(name = "roleId") Long roleId, 119 | @RequestBody List menuIds) { 120 | return R.succeed(roleService.saveMenu(roleId, menuIds)); 121 | } 122 | 123 | } -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/dto/request/MenuReqDTO.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.dto.request; 2 | 3 | import com.java668.oxadmin.modules.system.dto.request.groups.Insert; 4 | import com.java668.oxadmin.modules.system.dto.request.groups.Update; 5 | import lombok.Data; 6 | import org.hibernate.validator.constraints.Length; 7 | import org.hibernate.validator.constraints.Range; 8 | 9 | import javax.validation.constraints.NotNull; 10 | 11 | /** 12 | * MenuReqDTO 13 | * 14 | * @author jerry.chen 15 | * @since 2023-03-25 19:55:38 16 | */ 17 | @Data 18 | public class 19 | MenuReqDTO { 20 | 21 | @NotNull(message = "菜单id必填", groups = {Update.class}) 22 | private Long id; 23 | 24 | private Long pid; 25 | 26 | @NotNull(message = "菜单类型必填", groups = {Insert.class, Update.class}) 27 | @Range(max = 2, message = "菜单类型必须在{min}-{max}范围内", groups = {Insert.class, Update.class}) 28 | private Integer type; 29 | 30 | @Length(max = 255, message = "权限长度必须在{max}以内", groups = {Insert.class, Update.class}) 31 | private String permission; 32 | 33 | @Length(max = 255, message = "菜单标题长度必须在{max}以内", groups = {Insert.class, Update.class}) 34 | private String title; 35 | 36 | @Length(max = 255, message = "组件名称必须在{max}以内", groups = {Insert.class, Update.class}) 37 | private String name; 38 | 39 | private Integer sort; 40 | 41 | @Length(max = 255, message = "链接地址长度必须在{max}以内", groups = {Insert.class, Update.class}) 42 | private String path; 43 | 44 | @Length(max = 255, message = "组件长度必须在{max}以内", groups = {Insert.class, Update.class}) 45 | private String component; 46 | 47 | private Boolean iframe; 48 | 49 | private Boolean cache; 50 | 51 | private Boolean hidden; 52 | 53 | @Length(max = 255, message = "图标长度必须在{max}以内", groups = {Insert.class, Update.class}) 54 | private String icon; 55 | 56 | } 57 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/dto/request/OperLogPageReqDTO.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.dto.request; 2 | 3 | import lombok.Data; 4 | import lombok.ToString; 5 | import com.java668.common.model.PageParam; 6 | 7 | /** 8 | * 操作日志对象 syst_oper_log 9 | * 10 | * @author jerry.chen 11 | * @date 2023-06-09 11:17:20 12 | */ 13 | @Data 14 | @ToString 15 | public class OperLogPageReqDTO extends PageParam { 16 | private static final long serialVersionUID = 1L; 17 | /** 18 | * 模块标题 19 | */ 20 | private String title; 21 | /** 22 | * 业务类型(0其它 1新增 2修改 3删除) 23 | */ 24 | private Long businessType; 25 | /** 26 | * 方法名称 27 | */ 28 | private String method; 29 | /** 30 | * 请求方式 31 | */ 32 | private String requestMethod; 33 | /** 34 | * 操作类别(0其它 1后台用户 2手机端用户) 35 | */ 36 | private Long operatorType; 37 | /** 38 | * 操作人员 39 | */ 40 | private String operName; 41 | /** 42 | * 请求URL 43 | */ 44 | private String operUrl; 45 | /** 46 | * 主机地址 47 | */ 48 | private String operIp; 49 | /** 50 | * 浏览器类型 51 | */ 52 | private String browser; 53 | /** 54 | * 操作系统 55 | */ 56 | private String os; 57 | /** 58 | * 操作地点 59 | */ 60 | private String operLocation; 61 | /** 62 | * 请求参数 63 | */ 64 | private String operParam; 65 | /** 66 | * 返回参数 67 | */ 68 | private String jsonResult; 69 | /** 70 | * 操作状态(0正常 1异常) 71 | */ 72 | private Long status; 73 | /** 74 | * 消耗时间 75 | */ 76 | private Long costTime; 77 | 78 | } 79 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/dto/request/OperLogReqDTO.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.dto.request; 2 | 3 | import lombok.Data; 4 | import lombok.ToString; 5 | 6 | /** 7 | * 操作日志对象 syst_oper_log 8 | * 9 | * @author jerry.chen 10 | * @date 2023-06-09 11:17:20 11 | */ 12 | @Data 13 | @ToString 14 | public class OperLogReqDTO { 15 | private static final long serialVersionUID = 1L; 16 | 17 | /** 18 | * 日志主键 19 | */ 20 | private Long id; 21 | /** 22 | * 模块标题 23 | */ 24 | private String title; 25 | /** 26 | * 业务类型(0其它 1新增 2修改 3删除) 27 | */ 28 | private Long businessType; 29 | /** 30 | * 方法名称 31 | */ 32 | private String method; 33 | /** 34 | * 请求方式 35 | */ 36 | private String requestMethod; 37 | /** 38 | * 操作类别(0其它 1后台用户 2手机端用户) 39 | */ 40 | private Long operatorType; 41 | /** 42 | * 操作人员 43 | */ 44 | private String operName; 45 | /** 46 | * 请求URL 47 | */ 48 | private String operUrl; 49 | /** 50 | * 主机地址 51 | */ 52 | private String operIp; 53 | /** 54 | * 浏览器类型 55 | */ 56 | private String browser; 57 | /** 58 | * 操作系统 59 | */ 60 | private String os; 61 | /** 62 | * 操作地点 63 | */ 64 | private String operLocation; 65 | /** 66 | * 请求参数 67 | */ 68 | private String operParam; 69 | /** 70 | * 返回参数 71 | */ 72 | private String jsonResult; 73 | /** 74 | * 操作状态(0正常 1异常) 75 | */ 76 | private Long status; 77 | /** 78 | * 消耗时间 79 | */ 80 | private Long costTime; 81 | } 82 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/dto/request/RolePageReqDTO.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.dto.request; 2 | 3 | import com.java668.common.model.PageParam; 4 | import lombok.Data; 5 | 6 | /** 7 | * @author Jerry.chen 8 | * @desc RolePageReqDTO 9 | * @date 2023/03/29 18:05 10 | **/ 11 | @Data 12 | public class RolePageReqDTO extends PageParam { 13 | 14 | private String q; 15 | 16 | private String startTime; 17 | 18 | private String endTime; 19 | 20 | } -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/dto/request/RoleReqDTO.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.dto.request; 2 | 3 | import com.java668.oxadmin.modules.system.dto.request.groups.Insert; 4 | import com.java668.oxadmin.modules.system.dto.request.groups.Update; 5 | import lombok.Data; 6 | import org.hibernate.validator.constraints.Length; 7 | 8 | import javax.validation.constraints.NotBlank; 9 | import javax.validation.constraints.NotNull; 10 | 11 | /** 12 | * @author Jerry.chen 13 | * @desc RoleReqDTO 14 | * @date 2023/03/29 18:05 15 | **/ 16 | @Data 17 | public class RoleReqDTO { 18 | 19 | /** 20 | * 主键id 21 | */ 22 | @NotNull(message = "角色id必填", groups = {Update.class}) 23 | private Long id; 24 | /** 25 | * 角色名称 26 | */ 27 | @NotBlank(message = "角色名称必填", groups = {Insert.class, Update.class}) 28 | @Length(max = 10, message = "角色名长度必须在{max}以内", groups = {Insert.class, Update.class}) 29 | private String name; 30 | 31 | /** 32 | * 角色编码 33 | */ 34 | @NotBlank(message = "角色编码必填", groups = {Insert.class, Update.class}) 35 | @Length(max = 10, message = "角色编码长度必须在{max}以内", groups = {Insert.class, Update.class}) 36 | private String code; 37 | 38 | /** 39 | * 角色描述 40 | */ 41 | @NotBlank(message = "角色描述必填", groups = {Insert.class, Update.class}) 42 | private String description; 43 | 44 | } 45 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/dto/request/UserPageReqDTO.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.dto.request; 2 | 3 | import com.java668.common.model.PageParam; 4 | import lombok.Data; 5 | 6 | /** 7 | * @author Jerry.chen 8 | * @desc UserPageReqDTO 9 | * @date 2023/03/29 18:05 10 | **/ 11 | @Data 12 | public class UserPageReqDTO extends PageParam { 13 | 14 | private String q; 15 | 16 | private String startTime; 17 | 18 | private String endTime; 19 | 20 | private Integer enabled; 21 | 22 | } -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/dto/request/UserPassReqDTO.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.dto.request; 2 | 3 | import lombok.Data; 4 | 5 | import javax.validation.constraints.NotBlank; 6 | 7 | /** 8 | * @author Jerry.chen 9 | * @desc UserPassReqDTO 10 | * @date 2023/03/29 18:05 11 | **/ 12 | @Data 13 | public class UserPassReqDTO { 14 | 15 | @NotBlank(message = "旧密码必填") 16 | private String oldPass; 17 | 18 | @NotBlank(message = "新密码必填") 19 | private String newPass; 20 | 21 | } -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/dto/request/UserReqDTO.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.dto.request; 2 | 3 | import com.java668.common.model.BaseDTO; 4 | import com.java668.oxadmin.modules.system.dto.request.groups.Insert; 5 | import com.java668.oxadmin.modules.system.dto.request.groups.Update; 6 | import lombok.Data; 7 | import org.hibernate.validator.constraints.Length; 8 | import org.hibernate.validator.constraints.Range; 9 | 10 | import javax.validation.constraints.Email; 11 | import javax.validation.constraints.NotBlank; 12 | import javax.validation.constraints.NotNull; 13 | import javax.validation.constraints.Size; 14 | import java.util.List; 15 | 16 | /** 17 | * @author Jerry.chen 18 | * @desc UserPageReqDTO 19 | * @date 2023/03/29 18:05 20 | **/ 21 | @Data 22 | public class UserReqDTO extends BaseDTO { 23 | /** 24 | * 用户id 25 | */ 26 | @NotNull(message = "用户id必填", groups = {Update.class}) 27 | private Long id; 28 | /** 29 | * 用户名 30 | */ 31 | @NotBlank(message = "用户名必填", groups = {Insert.class, Update.class}) 32 | @Length(max = 10, message = "用户名长度必须在{max}以内", groups = {Insert.class, Update.class}) 33 | private String username; 34 | /** 35 | * 密码 36 | */ 37 | @NotBlank(message = "用户密码必填", groups = {Insert.class}) 38 | @Length(max = 20, message = "用户名长度必须在{max}以内", groups = {Insert.class, Update.class}) 39 | private String pass; 40 | /** 41 | * 确认密码 42 | */ 43 | @NotBlank(message = "用户确认密码必填", groups = {Insert.class}) 44 | @Length(max = 20, message = "用户名长度必须在{max}以内", groups = {Insert.class, Update.class}) 45 | private String checkPass; 46 | /** 47 | * 用户昵称 48 | */ 49 | @NotBlank(message = "用户昵称必填", groups = {Insert.class, Update.class}) 50 | @Length(max = 10, message = "用户昵称长度必须在{max}以内", groups = {Insert.class, Update.class}) 51 | private String nickName; 52 | /** 53 | * 性别 54 | */ 55 | @NotBlank(message = "性别必填", groups = {Insert.class, Update.class}) 56 | @Length(max = 1, message = "用户昵称长度必须在{max}以内", groups = {Insert.class, Update.class}) 57 | private String gender; 58 | /** 59 | * 手机号码 60 | */ 61 | @NotBlank(message = "手机号码必填", groups = {Insert.class, Update.class}) 62 | @Length(max = 12, message = "用户昵称长度必须在{max}以内", groups = {Insert.class, Update.class}) 63 | private String phone; 64 | /** 65 | * 邮箱 66 | */ 67 | @NotBlank(message = "邮箱必填", groups = {Insert.class, Update.class}) 68 | @Length(max = 30, message = "用户昵称长度必须在{max}以内", groups = {Insert.class, Update.class}) 69 | @Email(message = "请输入正确的Email") 70 | private String email; 71 | /** 72 | * 头像 73 | */ 74 | private String avatar; 75 | /** 76 | * 状态:1禁用、0启用 77 | */ 78 | @NotNull(message = "状态必填", groups = {Insert.class, Update.class}) 79 | @Range(min = 0, max = 1, message = "状态必须在{min}-{max}范围内", groups = {Insert.class, Update.class}) 80 | private Integer enabled; 81 | /** 82 | * 用户角色 83 | */ 84 | @NotNull(message = "用户角色必填", groups = {Insert.class, Update.class}) 85 | @Size(min = 1, max = 100, message = "用户角色最多添加{min}-{max}个", groups = {Insert.class, Update.class}) 86 | private List roles; 87 | 88 | } 89 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/dto/request/groups/Insert.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.dto.request.groups; 2 | 3 | /** 4 | * @author Jerry.chen 5 | * @desc 6 | * @date 2023/04/06 14:55 7 | **/ 8 | public interface Insert { 9 | 10 | } -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/dto/request/groups/Update.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.dto.request.groups; 2 | 3 | /** 4 | * @author Jerry.chen 5 | * @desc 6 | * @date 2023/04/06 14:55 7 | **/ 8 | public interface Update { 9 | 10 | } -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/dto/response/MenuRespDTO.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.dto.response; 2 | 3 | import com.java668.common.model.BaseDTO; 4 | import lombok.Data; 5 | 6 | /** 7 | * @author Jerry.chen 8 | * @desc MenuRespDTO 9 | * @date 2023/03/29 18:05 10 | **/ 11 | @Data 12 | public class MenuRespDTO extends BaseDTO { 13 | 14 | private Long id; 15 | 16 | private Long pid; 17 | 18 | private Integer type; 19 | 20 | private String permission; 21 | 22 | private String title; 23 | 24 | private String name; 25 | 26 | private Integer sort; 27 | 28 | private String path; 29 | 30 | private String component; 31 | 32 | private Boolean iframe; 33 | 34 | private Boolean cache; 35 | 36 | private Boolean hidden; 37 | 38 | private String componentName; 39 | 40 | private String icon; 41 | 42 | public String getLabel() { 43 | return title; 44 | } 45 | 46 | } 47 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/dto/response/OperLogRespDTO.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.dto.response; 2 | 3 | import lombok.Data; 4 | import lombok.ToString; 5 | import com.java668.common.model.BaseDTO; 6 | 7 | /** 8 | * 操作日志对象 syst_oper_log 9 | * 10 | * @author jerry.chen 11 | * @date 2023-06-09 11:17:20 12 | */ 13 | @Data 14 | @ToString 15 | public class OperLogRespDTO extends BaseDTO { 16 | private static final long serialVersionUID = 1L; 17 | 18 | /** 19 | * 日志主键 20 | */ 21 | private Long id; 22 | /** 23 | * 模块标题 24 | */ 25 | private String title; 26 | /** 27 | * 业务类型(0其它 1新增 2修改 3删除) 28 | */ 29 | private Long businessType; 30 | /** 31 | * 方法名称 32 | */ 33 | private String method; 34 | /** 35 | * 请求方式 36 | */ 37 | private String requestMethod; 38 | /** 39 | * 操作类别(0其它 1后台用户 2手机端用户) 40 | */ 41 | private Long operatorType; 42 | /** 43 | * 操作人员 44 | */ 45 | private String operName; 46 | /** 47 | * 请求URL 48 | */ 49 | private String operUrl; 50 | /** 51 | * 主机地址 52 | */ 53 | private String operIp; 54 | /** 55 | * 浏览器类型 56 | */ 57 | private String browser; 58 | /** 59 | * 操作系统 60 | */ 61 | private String os; 62 | /** 63 | * 操作地点 64 | */ 65 | private String operLocation; 66 | /** 67 | * 请求参数 68 | */ 69 | private String operParam; 70 | /** 71 | * 返回参数 72 | */ 73 | private String jsonResult; 74 | /** 75 | * 操作状态(0正常 1异常) 76 | */ 77 | private Long status; 78 | /** 79 | * 消耗时间 80 | */ 81 | private Long costTime; 82 | } 83 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/dto/response/RoleRespDTO.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.dto.response; 2 | 3 | import com.java668.common.model.BaseDTO; 4 | import lombok.Data; 5 | 6 | import java.util.Set; 7 | 8 | /** 9 | * @author Jerry.chen 10 | * @desc RoleRespDTO 11 | * @date 2023/03/29 18:05 12 | **/ 13 | @Data 14 | public class RoleRespDTO extends BaseDTO { 15 | 16 | /** 17 | * 主键id 18 | */ 19 | private Long id; 20 | /** 21 | * 名称 22 | */ 23 | private String name; 24 | /** 25 | * 名称 26 | */ 27 | private String code; 28 | /** 29 | * 角色级别 30 | */ 31 | private Integer level; 32 | /** 33 | * 描述 34 | */ 35 | private String description; 36 | /** 37 | * 数据权限 38 | */ 39 | private String dataScope; 40 | /** 41 | * 角色菜单 42 | */ 43 | private Set menuList; 44 | 45 | } 46 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/dto/response/UserRespDTO.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.dto.response; 2 | 3 | import com.java668.common.model.BaseDTO; 4 | import lombok.Data; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * @author Jerry.chen 10 | * @desc UserRespDTO 11 | * @date 2023/03/29 18:05 12 | **/ 13 | @Data 14 | public class UserRespDTO extends BaseDTO { 15 | 16 | /** 17 | * 用户id 18 | */ 19 | private Long id; 20 | 21 | /** 22 | * 用户名 23 | */ 24 | private String username; 25 | /** 26 | * 密码 27 | */ 28 | private String nickName; 29 | /** 30 | * 性别 31 | */ 32 | private String gender; 33 | /** 34 | * 手机号码 35 | */ 36 | private String phone; 37 | /** 38 | * 邮箱 39 | */ 40 | private String email; 41 | /** 42 | * 头像 43 | */ 44 | private String avatar; 45 | /** 46 | * 状态:1启用、0禁用 47 | */ 48 | private Integer enabled; 49 | /** 50 | * 用户角色 51 | */ 52 | private List roles; 53 | 54 | } 55 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/entity/Menu.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.entity; 2 | 3 | 4 | import com.baomidou.mybatisplus.annotation.IdType; 5 | import com.baomidou.mybatisplus.annotation.TableField; 6 | import com.baomidou.mybatisplus.annotation.TableId; 7 | import com.baomidou.mybatisplus.annotation.TableName; 8 | import com.java668.common.db.entity.BaseEntity; 9 | import lombok.Data; 10 | import lombok.ToString; 11 | 12 | /** 13 | * 系统菜单(Menu)表实体类 14 | * 15 | * @author jerry.chen 16 | * @since 2023-03-25 19:55:38 17 | */ 18 | @Data 19 | @ToString 20 | @TableName("syst_menu") 21 | public class Menu extends BaseEntity { 22 | 23 | /** 24 | * 主键ID 25 | */ 26 | @TableId(type = IdType.ASSIGN_ID) 27 | private Long id; 28 | /** 29 | * 上级菜单ID 30 | */ 31 | private Long pid; 32 | /** 33 | * 菜单类型 34 | */ 35 | private Integer type; 36 | /** 37 | * 菜单标题 38 | */ 39 | private String title; 40 | /** 41 | * 组件名称 42 | */ 43 | private String name; 44 | /** 45 | * 组件 46 | */ 47 | private String component; 48 | /** 49 | * 排序 50 | */ 51 | private Integer sort; 52 | /** 53 | * 图标 54 | */ 55 | private String icon; 56 | /** 57 | * 链接地址 58 | */ 59 | private String path; 60 | /** 61 | * 是否外链 62 | */ 63 | private Boolean iframe; 64 | /** 65 | * 缓存 66 | */ 67 | private Boolean cache; 68 | /** 69 | * 隐藏 70 | */ 71 | private Boolean hidden; 72 | /** 73 | * 权限 74 | */ 75 | private String permission; 76 | /** 77 | * 角色编码 78 | */ 79 | @TableField(exist = false) 80 | private String code; 81 | 82 | 83 | } 84 | 85 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/entity/OperLog.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.entity; 2 | 3 | import lombok.Data; 4 | import lombok.ToString; 5 | import com.baomidou.mybatisplus.annotation.TableName; 6 | import com.java668.common.db.entity.BaseEntity; 7 | import com.baomidou.mybatisplus.annotation.TableField; 8 | 9 | /** 10 | * 操作日志对象 syst_oper_log 11 | * 12 | * @author jerry.chen 13 | * @date 2023-06-09 11:17:20 14 | */ 15 | @Data 16 | @ToString 17 | @TableName("syst_oper_log") 18 | public class OperLog extends BaseEntity { 19 | private static final long serialVersionUID = 1L; 20 | 21 | /** 22 | * 日志主键 23 | */ 24 | private Long id; 25 | /** 26 | * 模块标题 27 | */ 28 | private String title; 29 | /** 30 | * 业务类型 31 | */ 32 | private String businessType; 33 | /** 34 | * 方法名称 35 | */ 36 | private String method; 37 | /** 38 | * 请求方式 39 | */ 40 | private String requestMethod; 41 | /** 42 | * 操作类别(0其它 1后台用户 2手机端用户) 43 | */ 44 | private Long operatorType; 45 | /** 46 | * 操作人员 47 | */ 48 | private String operName; 49 | /** 50 | * 请求URL 51 | */ 52 | private String operUrl; 53 | /** 54 | * 主机地址 55 | */ 56 | private String operIp; 57 | /** 58 | * 浏览器类型 59 | */ 60 | private String browser; 61 | /** 62 | * 操作系统 63 | */ 64 | private String os; 65 | /** 66 | * 操作地点 67 | */ 68 | private String operLocation; 69 | /** 70 | * 请求参数 71 | */ 72 | private String operParam; 73 | /** 74 | * 返回参数 75 | */ 76 | private String jsonResult; 77 | /** 78 | * 操作状态(0正常 1异常) 79 | */ 80 | private Long status; 81 | /** 82 | * 消耗时间 83 | */ 84 | private Long costTime; 85 | 86 | } 87 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/entity/Role.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.entity; 2 | 3 | 4 | import com.baomidou.mybatisplus.annotation.IdType; 5 | import com.baomidou.mybatisplus.annotation.TableId; 6 | import com.baomidou.mybatisplus.annotation.TableName; 7 | import com.java668.common.db.entity.BaseEntity; 8 | import lombok.Data; 9 | import lombok.ToString; 10 | 11 | /** 12 | * 角色表(Role)表实体类 13 | * 14 | * @author jerry.chen 15 | * @since 2023-03-25 19:48:41 16 | */ 17 | @Data 18 | @ToString 19 | @TableName("syst_role") 20 | public class Role extends BaseEntity { 21 | /** 22 | * 主键ID 23 | */ 24 | @TableId(type = IdType.ASSIGN_ID) 25 | private Long id; 26 | /** 27 | * 名称 28 | */ 29 | private String name; 30 | /** 31 | * 角色编码 32 | */ 33 | private String code; 34 | /** 35 | * 角色级别 36 | */ 37 | private Integer level; 38 | /** 39 | * 描述 40 | */ 41 | private String description; 42 | /** 43 | * 数据权限 44 | */ 45 | private String dataScope; 46 | 47 | } 48 | 49 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/entity/RoleMenu.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.entity; 2 | 3 | 4 | import com.baomidou.mybatisplus.annotation.IdType; 5 | import com.baomidou.mybatisplus.annotation.TableId; 6 | import com.baomidou.mybatisplus.annotation.TableName; 7 | import com.java668.common.db.entity.BaseEntity; 8 | import lombok.Data; 9 | import lombok.ToString; 10 | 11 | /** 12 | * 用户角色关联(RoleMenu)表实体类 13 | * 14 | * @author jerry.chen 15 | * @since 2023-03-25 19:58:20 16 | */ 17 | @Data 18 | @ToString 19 | @TableName("syst_role_menu") 20 | public class RoleMenu extends BaseEntity { 21 | /** 22 | * 主键ID 23 | */ 24 | @TableId(type = IdType.ASSIGN_ID) 25 | private Long id; 26 | /** 27 | * 菜单ID 28 | */ 29 | private Long menuId; 30 | /** 31 | * 角色ID 32 | */ 33 | private Long roleId; 34 | 35 | /** 36 | * 是否删除(0:否,1:是) 37 | */ 38 | private Integer isDeleted; 39 | } 40 | 41 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/entity/User.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.entity; 2 | 3 | 4 | import com.baomidou.mybatisplus.annotation.IdType; 5 | import com.baomidou.mybatisplus.annotation.TableId; 6 | import com.baomidou.mybatisplus.annotation.TableName; 7 | import com.java668.common.db.entity.BaseEntity; 8 | import lombok.Data; 9 | import lombok.ToString; 10 | 11 | /** 12 | * 系统用户(User)表实体类 13 | * 14 | * @author jerry.chen 15 | * @since 2023-03-25 19:39:34 16 | */ 17 | @Data 18 | @ToString 19 | @TableName("syst_user") 20 | public class User extends BaseEntity { 21 | /** 22 | * 主键ID 23 | */ 24 | @TableId(type = IdType.ASSIGN_ID) 25 | private Long id; 26 | /** 27 | * 用户名 28 | */ 29 | private String username; 30 | /** 31 | * 密码 32 | */ 33 | private String password; 34 | /** 35 | * 密码 36 | */ 37 | private String nickName; 38 | /** 39 | * 性别 40 | */ 41 | private String gender; 42 | /** 43 | * 手机号码 44 | */ 45 | private String phone; 46 | /** 47 | * 邮箱 48 | */ 49 | private String email; 50 | /** 51 | * 头像 52 | */ 53 | private String avatar; 54 | /** 55 | * 状态:1启用、0禁用 56 | */ 57 | private Integer enabled; 58 | 59 | } 60 | 61 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/entity/UserRole.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.entity; 2 | 3 | 4 | import com.baomidou.mybatisplus.annotation.IdType; 5 | import com.baomidou.mybatisplus.annotation.TableId; 6 | import com.baomidou.mybatisplus.annotation.TableName; 7 | import com.java668.common.db.entity.BaseEntity; 8 | import lombok.Data; 9 | import lombok.ToString; 10 | 11 | /** 12 | * 用户角色关联(UserRole)表实体类 13 | * 14 | * @author jerry.chen 15 | * @since 2023-03-25 19:58:21 16 | */ 17 | @Data 18 | @ToString 19 | @TableName("syst_user_role") 20 | public class UserRole extends BaseEntity { 21 | /** 22 | * 主键ID 23 | */ 24 | @TableId(type = IdType.ASSIGN_ID) 25 | private Long id; 26 | /** 27 | * 用户ID 28 | */ 29 | private Long userId; 30 | /** 31 | * 角色ID 32 | */ 33 | private Long roleId; 34 | } 35 | 36 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/event/LogRecordEvent.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.event; 2 | 3 | import com.mzt.logapi.beans.CodeVariableType; 4 | import lombok.ToString; 5 | import org.springframework.context.ApplicationEvent; 6 | 7 | import java.util.Map; 8 | 9 | /** 10 | * @author Jerry.chen 11 | * @desc 12 | * @date 2023/06/09 16:16 13 | **/ 14 | @ToString 15 | public class LogRecordEvent extends ApplicationEvent { 16 | 17 | private String type; 18 | 19 | private String subType; 20 | 21 | private Long costTime; 22 | 23 | private String message; 24 | 25 | private String operName; 26 | 27 | private Boolean isFail; 28 | 29 | Map map; 30 | 31 | public LogRecordEvent(Object source) { 32 | super(source); 33 | } 34 | 35 | public String getType() { 36 | return type; 37 | } 38 | 39 | public void setType(String type) { 40 | this.type = type; 41 | } 42 | 43 | public String getSubType() { 44 | return subType; 45 | } 46 | 47 | public void setSubType(String subType) { 48 | this.subType = subType; 49 | } 50 | 51 | public Long getCostTime() { 52 | return costTime; 53 | } 54 | 55 | public void setCostTime(Long costTime) { 56 | this.costTime = costTime; 57 | } 58 | 59 | public String getOperName() { 60 | return operName; 61 | } 62 | 63 | public void setOperName(String operName) { 64 | this.operName = operName; 65 | } 66 | 67 | public Map getMap() { 68 | return map; 69 | } 70 | 71 | public void setMap(Map map) { 72 | this.map = map; 73 | } 74 | 75 | public String getMessage() { 76 | return message; 77 | } 78 | 79 | public void setMessage(String message) { 80 | this.message = message; 81 | } 82 | 83 | public Boolean getFail() { 84 | return isFail; 85 | } 86 | 87 | public void setFail(Boolean fail) { 88 | isFail = fail; 89 | } 90 | } -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/event/handler/LogRecordEventHandler.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.event.handler; 2 | 3 | import com.java668.oxadmin.modules.system.event.LogRecordEvent; 4 | import com.mzt.logapi.beans.LogRecord; 5 | import com.mzt.logapi.service.ILogRecordService; 6 | import lombok.RequiredArgsConstructor; 7 | import lombok.extern.slf4j.Slf4j; 8 | import org.springframework.context.ApplicationListener; 9 | import org.springframework.scheduling.annotation.Async; 10 | import org.springframework.stereotype.Component; 11 | 12 | import java.util.Date; 13 | 14 | /** 15 | * @author Jerry.chen 16 | * @desc 17 | * @date 2023/06/09 16:18 18 | **/ 19 | @Slf4j 20 | @Component 21 | @RequiredArgsConstructor 22 | public class LogRecordEventHandler implements ApplicationListener { 23 | 24 | private final ILogRecordService logRecordService; 25 | 26 | @Async 27 | @Override 28 | public void onApplicationEvent(LogRecordEvent event) { 29 | LogRecord logRecord = new LogRecord(); 30 | logRecord.setTenant("oxadmin"); 31 | logRecord.setType(event.getType()); 32 | logRecord.setSubType(event.getSubType()); 33 | logRecord.setBizNo(""); 34 | logRecord.setOperator(event.getOperName()); 35 | logRecord.setAction(event.getMessage()); 36 | logRecord.setFail(event.getFail()); 37 | logRecord.setCreateTime(new Date()); 38 | logRecord.setExtra(""); 39 | logRecord.setCodeVariable(event.getMap()); 40 | logRecordService.record(logRecord); 41 | log.info("==========={}", event); 42 | } 43 | 44 | } -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/mapper/MenuMapper.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.java668.oxadmin.modules.system.entity.Menu; 5 | import org.apache.ibatis.annotations.Param; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * 系统菜单(Menu)表数据库访问层 11 | * 12 | * @author jerry.chen 13 | * @since 2023-03-25 19:55:38 14 | */ 15 | public interface MenuMapper extends BaseMapper { 16 | 17 | /** 18 | * 查询用户 19 | * @param userId 20 | * @param isRouter 21 | * @return 22 | */ 23 | List selectMenuByUserId(@Param("userId") Long userId, @Param("isRouter") Boolean isRouter); 24 | 25 | } 26 | 27 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/mapper/OperLogMapper.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.mapper; 2 | 3 | import java.util.List; 4 | import com.java668.common.db.mapper.EasyBaseMapper; 5 | import com.java668.oxadmin.modules.system.entity.OperLog; 6 | 7 | /** 8 | * 操作日志Mapper接口 9 | * 10 | * @author jerry.chen 11 | * @date 2023-06-09 11:17:20 12 | */ 13 | public interface OperLogMapper extends EasyBaseMapper { 14 | 15 | /** 16 | * 批量删除操作日志 17 | * 18 | * @param ids 需要删除的数据主键集合 19 | * @return 结果 20 | */ 21 | int deleteByIds(List ids); 22 | } 23 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/mapper/RoleMapper.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.java668.oxadmin.modules.system.entity.Role; 5 | 6 | /** 7 | * 角色表(Role)表数据库访问层 8 | * 9 | * @author jerry.chen 10 | * @since 2023-03-25 19:48:41 11 | */ 12 | public interface RoleMapper extends BaseMapper { 13 | 14 | } 15 | 16 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/mapper/RoleMenuMapper.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.mapper; 2 | 3 | import com.java668.common.db.mapper.EasyBaseMapper; 4 | import com.java668.oxadmin.modules.system.entity.RoleMenu; 5 | 6 | /** 7 | * 用户角色关联(RoleMenu)表数据库访问层 8 | * 9 | * @author jerry.chen 10 | * @since 2023-03-25 19:58:20 11 | */ 12 | public interface RoleMenuMapper extends EasyBaseMapper { 13 | 14 | } 15 | 16 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/mapper/UserMapper.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | import com.java668.oxadmin.modules.system.entity.User; 5 | 6 | /** 7 | * 系统用户(User)表数据库访问层 8 | * 9 | * @author jerry.chen 10 | * @since 2023-03-25 19:39:34 11 | */ 12 | public interface UserMapper extends BaseMapper { 13 | 14 | } 15 | 16 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/mapper/UserRoleMapper.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.mapper; 2 | 3 | import com.java668.common.db.mapper.EasyBaseMapper; 4 | import com.java668.oxadmin.modules.system.entity.UserRole; 5 | 6 | /** 7 | * 用户角色关联(UserRole)表数据库访问层 8 | * 9 | * @author jerry.chen 10 | * @since 2023-03-25 19:58:21 11 | */ 12 | public interface UserRoleMapper extends EasyBaseMapper { 13 | 14 | } 15 | 16 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/service/AuthService.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.service; 2 | 3 | import com.java668.common.model.PageParam; 4 | import com.java668.common.model.PageResult; 5 | import com.java668.common.model.SysUser; 6 | 7 | import java.util.List; 8 | 9 | /** 10 | * @author Jerry.chen 11 | * @desc 12 | * @date 2023/04/17 11:36 13 | **/ 14 | public interface AuthService { 15 | 16 | /** 17 | * 分页查询 18 | * 19 | * @param pageParam 20 | * @return 21 | */ 22 | PageResult onlineUser(PageParam pageParam); 23 | 24 | /** 25 | * 强制用户下线 26 | * 27 | * @param userId 28 | */ 29 | void removeUserSession(Long userId); 30 | 31 | /** 32 | * 批量强制用户下线 33 | * 34 | * @param userIds 35 | */ 36 | void removeUserSession(List userIds); 37 | 38 | } -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/service/ILogRecordEventService.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.service; 2 | 3 | /** 4 | * @author Jerry.chen 5 | * @desc 6 | * @date 2023/06/09 16:23 7 | **/ 8 | public interface ILogRecordEventService { 9 | 10 | void pushEvent(String type, String subType, String message, Long costTime, String operName, Boolean isFail); 11 | 12 | } -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/service/IOperLogService.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.service; 2 | 3 | import java.util.List; 4 | 5 | import com.java668.oxadmin.modules.system.entity.OperLog; 6 | import com.java668.oxadmin.modules.system.dto.request.OperLogPageReqDTO; 7 | import com.java668.oxadmin.modules.system.dto.request.OperLogReqDTO; 8 | import com.java668.oxadmin.modules.system.dto.response.OperLogRespDTO; 9 | 10 | import com.baomidou.mybatisplus.extension.service.IService; 11 | import com.java668.common.model.PageResult; 12 | 13 | 14 | /** 15 | * 操作日志Service接口 16 | * 17 | * @author jerry.chen 18 | * @date 2023-06-09 11:17:20 19 | */ 20 | public interface IOperLogService extends IService { 21 | 22 | /** 23 | * 新增操作日志 24 | * 25 | * @param body 26 | * @return 27 | */ 28 | Integer add(OperLogReqDTO body); 29 | 30 | /** 31 | * 删除操作日志 32 | * 33 | * @param ids 34 | * @return 35 | */ 36 | Integer remove(List ids); 37 | 38 | /** 39 | * 更新操作日志 40 | * 41 | * @param body 42 | * @return 43 | */ 44 | Integer update(OperLogReqDTO body); 45 | 46 | /** 47 | * 获取操作日志详细信息 48 | * 49 | * @param id 50 | * @return 51 | */ 52 | OperLogRespDTO detail(Long id); 53 | 54 | /** 55 | * 查询操作日志列表 56 | * 57 | * @param req 58 | * @return 59 | */ 60 | PageResult page(OperLogPageReqDTO req); 61 | } 62 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/service/MenuService.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.service; 2 | 3 | import cn.hutool.core.lang.tree.Tree; 4 | import com.baomidou.mybatisplus.extension.service.IService; 5 | import com.java668.oxadmin.modules.system.dto.request.MenuReqDTO; 6 | import com.java668.oxadmin.modules.system.dto.response.MenuRespDTO; 7 | import com.java668.oxadmin.modules.system.entity.Menu; 8 | 9 | import java.util.List; 10 | 11 | /** 12 | * 系统菜单(Menu)表服务接口 13 | * 14 | * @author jerry.chen 15 | * @since 2023-03-25 19:55:38 16 | */ 17 | public interface MenuService extends IService { 18 | 19 | /** 20 | * 新增菜单 21 | * @param body 22 | * @return 23 | */ 24 | Integer add(MenuReqDTO body); 25 | 26 | /** 27 | * 删除菜单 28 | * @param ids 29 | * @return 30 | */ 31 | Integer delete(List ids); 32 | 33 | /** 34 | * 修改菜单 35 | * @param body 36 | * @return 37 | */ 38 | Integer update(MenuReqDTO body); 39 | 40 | /** 41 | * 查询菜单详情 42 | * @param id 43 | * @return 44 | */ 45 | MenuRespDTO get(Long id); 46 | 47 | /** 48 | * 查询树型列表 49 | * @return 50 | */ 51 | List> treeList(); 52 | 53 | /** 54 | * 根据 userId 查询菜单 55 | * @param userId 56 | * @return 57 | */ 58 | List findByUserId(Long userId, Boolean isRouter); 59 | 60 | /** 61 | * 懒加载菜单数据 62 | * @param pid 63 | * @return 64 | */ 65 | List lazy(Long pid); 66 | 67 | /** 68 | * 根据ID获取同级与上级数据 69 | * @param ids 70 | * @return 71 | */ 72 | List> superior(List ids); 73 | 74 | /** 75 | * 查询路由列表 76 | * @return 77 | */ 78 | List> routerList(); 79 | 80 | } 81 | 82 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/service/RoleMenuService.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.service; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.java668.oxadmin.modules.system.entity.RoleMenu; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * 用户角色关联(RoleMenu)表服务接口 10 | * 11 | * @author jerry.chen 12 | * @since 2023-03-25 19:58:20 13 | */ 14 | public interface RoleMenuService extends IService { 15 | 16 | /** 17 | * 查询角色菜单 18 | * @param id 19 | * @return 20 | */ 21 | List listByRoleId(Long id); 22 | 23 | /** 24 | * 批量保存 25 | * @param roleId 26 | * @param menuIds 27 | * @return 28 | */ 29 | Integer batchSave(Long roleId, List menuIds); 30 | 31 | /** 32 | * 删除角色菜单关系 33 | * @param ids 34 | * @return 35 | */ 36 | Integer deleteByRoleIds(List ids); 37 | 38 | /** 39 | * 删除角色菜单关联关系 40 | * @param ids 41 | * @return 42 | */ 43 | Integer deleteByMenuIds(List ids); 44 | } 45 | 46 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/service/RoleService.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.service; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.java668.common.model.PageResult; 5 | import com.java668.oxadmin.modules.system.dto.request.RolePageReqDTO; 6 | import com.java668.oxadmin.modules.system.dto.request.RoleReqDTO; 7 | import com.java668.oxadmin.modules.system.dto.response.RoleRespDTO; 8 | import com.java668.oxadmin.modules.system.entity.Role; 9 | 10 | import java.util.List; 11 | 12 | /** 13 | * 角色表(Role)表服务接口 14 | * 15 | * @author jerry.chen 16 | * @since 2023-03-25 19:48:41 17 | */ 18 | public interface RoleService extends IService { 19 | 20 | /** 21 | * 添加 22 | * @param body 23 | * @return 24 | */ 25 | Integer add(RoleReqDTO body); 26 | 27 | /** 28 | * 批量删除 29 | * @param ids 30 | * @return 31 | */ 32 | Integer delete(List ids); 33 | 34 | /** 35 | * 修改角色 36 | * @param body 37 | * @return 38 | */ 39 | Integer update(RoleReqDTO body); 40 | 41 | /** 42 | * 查询角色详情 43 | * @param id 44 | * @return 45 | */ 46 | RoleRespDTO get(Long id); 47 | 48 | /** 49 | * 分页 50 | * @param params 51 | * @return 52 | */ 53 | PageResult page(RolePageReqDTO params); 54 | 55 | /** 56 | * 查询角色 57 | * @return 58 | */ 59 | List findList(); 60 | 61 | /** 62 | * 保存角色菜单 63 | * @param roleId 64 | * @param menuIds 65 | * @return 66 | */ 67 | Integer saveMenu(Long roleId, List menuIds); 68 | } 69 | 70 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/service/UserRoleService.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.service; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.java668.oxadmin.modules.system.entity.UserRole; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * 用户角色关联(UserRole)表服务接口 10 | * 11 | * @author jerry.chen 12 | * @since 2023-03-25 19:58:21 13 | */ 14 | public interface UserRoleService extends IService { 15 | 16 | /** 17 | * 保存用户角色关联关系 18 | * @param id 19 | * @param roles 20 | * @return 21 | */ 22 | Integer batchSave(Long id, List roles); 23 | 24 | /** 25 | * 查询角色集合 26 | * @param id 27 | * @return 28 | */ 29 | List findByUserId(Long id); 30 | 31 | /** 32 | * 33 | * @param id 34 | * @param roles 35 | * @return 36 | */ 37 | Integer updateByUserId(Long id, List roles); 38 | 39 | /** 40 | * 删除用户角色关系 41 | * @param ids 42 | * @return 43 | */ 44 | Integer deleteByRoleIds(List ids); 45 | 46 | /** 47 | * 删除用户角色 48 | * @param ids 49 | * @return 50 | */ 51 | Integer deleteByUserIds(List ids); 52 | } 53 | 54 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/service/UserService.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.service; 2 | 3 | import com.baomidou.mybatisplus.extension.service.IService; 4 | import com.java668.common.model.PageResult; 5 | import com.java668.oxadmin.modules.system.dto.request.UserPageReqDTO; 6 | import com.java668.oxadmin.modules.system.dto.request.UserPassReqDTO; 7 | import com.java668.oxadmin.modules.system.dto.request.UserReqDTO; 8 | import com.java668.oxadmin.modules.system.dto.response.UserRespDTO; 9 | import com.java668.oxadmin.modules.system.entity.User; 10 | 11 | import java.util.List; 12 | 13 | /** 14 | * @author Jerry.chen 15 | * @desc 16 | * @date 2023/02/01 16:35 17 | **/ 18 | public interface UserService extends IService { 19 | 20 | /** 21 | * 新增用户 22 | * 23 | * @param body 24 | * @return 25 | */ 26 | Integer add(UserReqDTO body); 27 | 28 | /** 29 | * 删除用户 30 | * 31 | * @param ids 32 | * @return 33 | */ 34 | Integer delete(List ids); 35 | 36 | /** 37 | * 更新用户 38 | * 39 | * @param body 40 | * @return 41 | */ 42 | Integer update(UserReqDTO body); 43 | 44 | /** 45 | * 获取用户详情 46 | * 47 | * @param id 48 | * @return 49 | */ 50 | UserRespDTO get(Long id); 51 | 52 | /** 53 | * 分页 54 | * 55 | * @param params 56 | * @return 57 | */ 58 | PageResult page(UserPageReqDTO params); 59 | 60 | /** 61 | * 根据username查询用户 62 | * 63 | * @param userId 64 | * @param username 65 | * @return 66 | */ 67 | User getByUsername(Long userId, String username); 68 | 69 | /** 70 | * 启用停用 71 | * 72 | * @param userId 73 | * @param status 74 | * @return 75 | */ 76 | Integer changeStatus(Long userId, Integer status); 77 | 78 | /** 79 | * 修改密码 80 | * 81 | * @param dto 82 | * @return 83 | */ 84 | Integer modifyPass(UserPassReqDTO dto); 85 | } -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/service/impl/AuthServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.service.impl; 2 | 3 | import cn.hutool.core.collection.CollUtil; 4 | import cn.hutool.core.collection.ListUtil; 5 | import com.google.common.collect.Lists; 6 | import com.java668.common.model.PageParam; 7 | import com.java668.common.model.PageResult; 8 | import com.java668.common.model.SysUser; 9 | import com.java668.oxadmin.modules.system.service.AuthService; 10 | import lombok.RequiredArgsConstructor; 11 | import lombok.extern.slf4j.Slf4j; 12 | import org.springframework.security.core.session.SessionInformation; 13 | import org.springframework.security.core.session.SessionRegistry; 14 | import org.springframework.stereotype.Service; 15 | 16 | import java.util.List; 17 | import java.util.Objects; 18 | import java.util.stream.Collectors; 19 | 20 | /** 21 | * @author Jerry.chen 22 | * @desc 23 | * @date 2023/04/17 11:36 24 | **/ 25 | @Slf4j 26 | @RequiredArgsConstructor 27 | @Service("authService") 28 | public class AuthServiceImpl implements AuthService { 29 | 30 | private final SessionRegistry sessionRegistry; 31 | 32 | @Override 33 | public PageResult onlineUser(PageParam pageParam) { 34 | List users = sessionRegistry.getAllPrincipals().stream() 35 | .map(principal -> { 36 | if (principal instanceof SysUser) { 37 | SysUser sysUser = (SysUser) principal; 38 | return sysUser; 39 | } 40 | return null; 41 | }).filter(Objects::nonNull).collect(Collectors.toList()); 42 | List results = ListUtil.page(pageParam.getPage().intValue() - 1, pageParam.getLimit().intValue(), users); 43 | return PageResult.builder().list(results).total(results.size()).build(); 44 | } 45 | 46 | @Override 47 | public void removeUserSession(Long userId) { 48 | removeUserSession(Lists.newArrayList(userId)); 49 | } 50 | 51 | @Override 52 | public void removeUserSession(List userIds) { 53 | // 获取session中所有的用户信息 54 | List users = sessionRegistry.getAllPrincipals(); 55 | for (Object principal : users) { 56 | if (principal instanceof SysUser) { 57 | final SysUser sysUser = (SysUser) principal; 58 | if (CollUtil.contains(userIds, sysUser.getId())) { 59 | // false代表不包含过期session 60 | List sessionsInfo = sessionRegistry.getAllSessions(principal, false); 61 | if (null != sessionsInfo && sessionsInfo.size() > 0) { 62 | for (SessionInformation sessionInformation : sessionsInfo) { 63 | sessionInformation.expireNow(); 64 | } 65 | } 66 | } 67 | } 68 | } 69 | } 70 | } -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/service/impl/LogRecordEventServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.service.impl; 2 | 3 | import com.java668.oxadmin.modules.system.event.LogRecordEvent; 4 | import com.java668.oxadmin.modules.system.service.ILogRecordEventService; 5 | import com.mzt.logapi.beans.CodeVariableType; 6 | import com.mzt.logapi.util.IpUtils; 7 | import com.mzt.logapi.util.ServletUtils; 8 | import lombok.RequiredArgsConstructor; 9 | import lombok.extern.slf4j.Slf4j; 10 | import org.springframework.context.ApplicationContext; 11 | import org.springframework.stereotype.Service; 12 | 13 | import javax.servlet.http.HttpServletRequest; 14 | import java.util.HashMap; 15 | import java.util.Map; 16 | 17 | /** 18 | * @author Jerry.chen 19 | * @desc 20 | * @date 2023/06/09 16:23 21 | **/ 22 | @Slf4j 23 | @Service 24 | @RequiredArgsConstructor 25 | public class LogRecordEventServiceImpl implements ILogRecordEventService { 26 | 27 | private final ApplicationContext applicationContext; 28 | 29 | @Override 30 | public void pushEvent(String type, String subType, String message, Long costTime, String operName, Boolean isFail) { 31 | LogRecordEvent event = new LogRecordEvent(subType); 32 | event.setType(type); 33 | event.setSubType(subType); 34 | event.setCostTime(costTime); 35 | event.setOperName(operName); 36 | event.setMap(getVariableMap(costTime)); 37 | event.setMessage(message); 38 | event.setFail(isFail); 39 | applicationContext.publishEvent(event); 40 | } 41 | 42 | private Map getVariableMap(Long costTime){ 43 | Map map = new HashMap<>(6); 44 | map.put(CodeVariableType.COST_TIME, costTime); 45 | HttpServletRequest request = ServletUtils.getRequest(); 46 | if (request != null) { 47 | map.put(CodeVariableType.USER_AGENT, request.getHeader("User-Agent")); 48 | map.put(CodeVariableType.REQUEST_IP, IpUtils.getIpAddr()); 49 | map.put(CodeVariableType.REQUEST_URL, request.getRequestURI()); 50 | map.put(CodeVariableType.REQUEST_METHOD, request.getMethod()); 51 | map.put(CodeVariableType.CONTENT_TYPE, request.getContentType()); 52 | } 53 | return map; 54 | } 55 | } -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/service/impl/LogRecordServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.service.impl; 2 | 3 | import cn.hutool.core.map.MapUtil; 4 | import cn.hutool.http.useragent.UserAgent; 5 | import cn.hutool.http.useragent.UserAgentUtil; 6 | import com.java668.common.utils.AddressUtils; 7 | import com.java668.oxadmin.modules.system.entity.OperLog; 8 | import com.java668.oxadmin.modules.system.service.IOperLogService; 9 | import com.mzt.logapi.beans.CodeVariableType; 10 | import com.mzt.logapi.beans.LogRecord; 11 | import com.mzt.logapi.service.ILogRecordService; 12 | import lombok.RequiredArgsConstructor; 13 | import lombok.extern.slf4j.Slf4j; 14 | import org.springframework.stereotype.Service; 15 | 16 | import java.util.List; 17 | import java.util.Map; 18 | 19 | /** 20 | * @author Jerry 21 | */ 22 | @Slf4j 23 | @Service 24 | @RequiredArgsConstructor 25 | public class LogRecordServiceImpl implements ILogRecordService { 26 | 27 | private final IOperLogService systOperLogService; 28 | 29 | @Override 30 | public void record(LogRecord logRecord) { 31 | log.info("========================= {}", logRecord); 32 | Map codeVariable = logRecord.getCodeVariable(); 33 | String className = MapUtil.get(codeVariable, CodeVariableType.ClassName, String.class, ""); 34 | String methodName = MapUtil.get(codeVariable, CodeVariableType.MethodName, String.class, ""); 35 | String userAgent = MapUtil.get(codeVariable, CodeVariableType.USER_AGENT, String.class, ""); 36 | String requestIp = MapUtil.get(codeVariable, CodeVariableType.REQUEST_IP, String.class,""); 37 | String requestMethod = MapUtil.get(codeVariable, CodeVariableType.REQUEST_METHOD, String.class, ""); 38 | String requestUrl = MapUtil.get(codeVariable, CodeVariableType.REQUEST_URL, String.class, ""); 39 | String requestParam = MapUtil.get(codeVariable, CodeVariableType.REQUEST_PARAM, String.class,""); 40 | String contentType = MapUtil.get(codeVariable, CodeVariableType.CONTENT_TYPE, String.class, ""); 41 | Long costTime = MapUtil.get(codeVariable, CodeVariableType.COST_TIME, Long.class, 0L); 42 | String realAddressByIP = AddressUtils.getRealAddressByIP(requestIp); 43 | UserAgent ua = UserAgentUtil.parse(userAgent); 44 | 45 | OperLog entity = new OperLog(); 46 | entity.setTitle(logRecord.getType()); 47 | entity.setBusinessType(logRecord.getSubType()); 48 | entity.setMethod(className + "." + methodName); 49 | entity.setRequestMethod(requestMethod); 50 | entity.setOperatorType(1L); 51 | entity.setOperName(logRecord.getOperator()); 52 | entity.setOperUrl(requestUrl); 53 | entity.setOperIp(requestIp); 54 | entity.setBrowser(ua.getBrowser().toString()); 55 | entity.setOs(ua.getOs().toString()); 56 | entity.setOperLocation(realAddressByIP); 57 | entity.setOperParam(requestParam); 58 | entity.setJsonResult(logRecord.getAction()); 59 | entity.setStatus(logRecord.isFail() ? 1L : 0L); 60 | entity.setCostTime(costTime); 61 | entity.setCreateBy(logRecord.getOperator()); 62 | entity.setUpdateBy(logRecord.getOperator()); 63 | systOperLogService.save(entity); 64 | } 65 | 66 | @Override 67 | public List queryLog(String bizNo, String type) { 68 | return null; 69 | } 70 | 71 | @Override 72 | public List queryLogByBizNo(String bizNo, String type, String subType) { 73 | return null; 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/service/impl/OperatorGetServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.service.impl; 2 | 3 | import com.java668.common.utils.AuthUtils; 4 | import com.mzt.logapi.beans.Operator; 5 | import com.mzt.logapi.service.IOperatorGetService; 6 | import lombok.RequiredArgsConstructor; 7 | import lombok.extern.slf4j.Slf4j; 8 | import org.springframework.stereotype.Service; 9 | 10 | import java.util.Optional; 11 | 12 | /** 13 | * @author Jerry.chen 14 | * @desc 15 | * @date 2023/06/09 13:48 16 | **/ 17 | @Slf4j 18 | @Service 19 | @RequiredArgsConstructor 20 | public class OperatorGetServiceImpl implements IOperatorGetService { 21 | 22 | @Override 23 | public Operator getUser() { 24 | return Optional.ofNullable(AuthUtils.getCurrentUser()) 25 | .map(a -> new Operator(a.getUsername())) 26 | .orElse(new Operator("" )); 27 | } 28 | 29 | } -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/service/impl/RoleMenuServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.service.impl; 2 | 3 | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 4 | import com.baomidou.mybatisplus.core.toolkit.Wrappers; 5 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 6 | import com.java668.oxadmin.modules.system.entity.RoleMenu; 7 | import com.java668.oxadmin.modules.system.mapper.RoleMenuMapper; 8 | import com.java668.oxadmin.modules.system.service.RoleMenuService; 9 | import org.springframework.stereotype.Service; 10 | 11 | import java.util.Date; 12 | import java.util.List; 13 | import java.util.stream.Collectors; 14 | 15 | /** 16 | * 用户角色关联(RoleMenu)表服务实现类 17 | * 18 | * @author jerry.chen 19 | * @since 2023-03-25 19:58:21 20 | */ 21 | @Service("roleMenuService") 22 | public class RoleMenuServiceImpl extends ServiceImpl implements RoleMenuService { 23 | 24 | @Override 25 | public List listByRoleId(Long id) { 26 | LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery() 27 | .eq(RoleMenu::getRoleId, id); 28 | return list(queryWrapper); 29 | } 30 | 31 | @Override 32 | public Integer batchSave(Long roleId, List menuIds) { 33 | LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery() 34 | .eq(RoleMenu::getRoleId, roleId); 35 | remove(queryWrapper); 36 | List roleMenuList = menuIds.stream().map(item -> { 37 | RoleMenu roleMenu = new RoleMenu(); 38 | roleMenu.setMenuId(item); 39 | roleMenu.setRoleId(roleId); 40 | roleMenu.setIsDeleted(0); 41 | roleMenu.setCreateBy("admin"); 42 | roleMenu.setUpdateBy("admin"); 43 | roleMenu.setCreateTime(new Date()); 44 | roleMenu.setUpdateTime(new Date()); 45 | return roleMenu; 46 | }).collect(Collectors.toList()); 47 | return baseMapper.insertBatchSomeColumn(roleMenuList); 48 | } 49 | 50 | @Override 51 | public Integer deleteByRoleIds(List ids) { 52 | LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery() 53 | .in(RoleMenu::getRoleId, ids); 54 | return baseMapper.delete(queryWrapper); 55 | } 56 | 57 | @Override 58 | public Integer deleteByMenuIds(List ids) { 59 | LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery() 60 | .in(RoleMenu::getMenuId, ids); 61 | return baseMapper.delete(queryWrapper); 62 | } 63 | } 64 | 65 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/java/com/java668/oxadmin/modules/system/service/impl/UserRoleServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin.modules.system.service.impl; 2 | 3 | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 4 | import com.baomidou.mybatisplus.core.toolkit.Wrappers; 5 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 6 | import com.java668.oxadmin.modules.system.entity.UserRole; 7 | import com.java668.oxadmin.modules.system.mapper.UserRoleMapper; 8 | import com.java668.oxadmin.modules.system.service.UserRoleService; 9 | import lombok.extern.slf4j.Slf4j; 10 | import org.springframework.stereotype.Service; 11 | import org.springframework.transaction.annotation.Transactional; 12 | 13 | import java.util.Date; 14 | import java.util.List; 15 | import java.util.stream.Collectors; 16 | 17 | /** 18 | * 用户角色关联(UserRole)表服务实现类 19 | * 20 | * @author jerry.chen 21 | * @since 2023-03-25 19:58:21 22 | */ 23 | @Slf4j 24 | @Service("userRoleService") 25 | public class UserRoleServiceImpl extends ServiceImpl implements UserRoleService { 26 | 27 | @Override 28 | public Integer batchSave(Long id, List roles) { 29 | List userRoleList = roles.stream().map(item -> { 30 | UserRole userRole = new UserRole(); 31 | userRole.setUserId(id); 32 | userRole.setRoleId(item); 33 | userRole.setCreateBy(""); 34 | userRole.setUpdateBy(""); 35 | userRole.setCreateTime(new Date()); 36 | userRole.setUpdateTime(new Date()); 37 | return userRole; 38 | }).collect(Collectors.toList()); 39 | Integer batchSaveRes = baseMapper.insertBatchSomeColumn(userRoleList); 40 | log.info("保存用户角色关联关系 result:{}", batchSaveRes); 41 | return batchSaveRes; 42 | } 43 | 44 | @Override 45 | public List findByUserId(Long id) { 46 | LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); 47 | queryWrapper.eq(UserRole::getUserId, id); 48 | return list(queryWrapper); 49 | } 50 | 51 | @Override 52 | @Transactional(rollbackFor = Exception.class) 53 | public Integer updateByUserId(Long id, List roles) { 54 | LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); 55 | queryWrapper.eq(UserRole::getUserId, id); 56 | remove(queryWrapper); 57 | return batchSave(id, roles); 58 | } 59 | 60 | @Override 61 | public Integer deleteByRoleIds(List ids) { 62 | LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); 63 | queryWrapper.in(UserRole::getRoleId, ids); 64 | return baseMapper.delete(queryWrapper); 65 | } 66 | 67 | @Override 68 | public Integer deleteByUserIds(List ids) { 69 | LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery(); 70 | queryWrapper.in(UserRole::getUserId, ids); 71 | return baseMapper.delete(queryWrapper); 72 | } 73 | 74 | } 75 | 76 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/resources/application-dev.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | datasource: 3 | url: jdbc:p6spy:mysql://${java668.mysql.host}/ox-admin?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai 4 | username: ${java668.mysql.username} 5 | password: ${java668.mysql.password} 6 | driver-class-name: com.p6spy.engine.spy.P6SpyDriver 7 | type: com.alibaba.druid.pool.DruidDataSource 8 | druid: 9 | # 初始连接数 10 | initialSize: 5 11 | # 最小连接池数量 12 | minIdle: 10 13 | # 最大连接池数量 14 | maxActive: 20 15 | # 配置获取连接等待超时的时间 16 | maxWait: 60000 17 | # 配置连接超时时间 18 | connectTimeout: 30000 19 | # 配置网络超时时间 20 | socketTimeout: 60000 21 | # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 22 | timeBetweenEvictionRunsMillis: 60000 23 | # 配置一个连接在池中最小生存的时间,单位是毫秒 24 | minEvictableIdleTimeMillis: 300000 25 | # 配置一个连接在池中最大生存的时间,单位是毫秒 26 | maxEvictableIdleTimeMillis: 900000 27 | # 配置检测连接是否有效 28 | validationQuery: SELECT 1 FROM DUAL 29 | testWhileIdle: true 30 | testOnBorrow: false 31 | testOnReturn: false 32 | webStatFilter: 33 | enabled: true 34 | statViewServlet: 35 | enabled: true 36 | # 设置白名单,不填则允许所有访问 37 | allow: 38 | url-pattern: /druid/* 39 | # 控制台管理用户名和密码 40 | login-username: oxadmin 41 | login-password: 123456 42 | filter: 43 | stat: 44 | enabled: true 45 | # 慢SQL记录 46 | log-slow-sql: true 47 | slow-sql-millis: 1000 48 | merge-sql: true 49 | wall: 50 | config: 51 | multi-statement-allow: true 52 | 53 | # knife4j 接口文档 54 | knife4j: 55 | enable: true 56 | openapi: 57 | title: OX-ADMIN 58 | description: 一个轻量级开源后端管理框架 59 | email: java668_real@163.com 60 | concat: 青牛 61 | url: https://github.com/java668/ox-admin 62 | version: v4.0 63 | license: Apache 2.0 64 | license-url: https://github.com/java668/ox-admin 65 | terms-of-service-url: https://github.com/java668/ox-admin 66 | group: 67 | system: 68 | group-name: 系统管理 69 | api-rule: package 70 | api-rule-resources: 71 | - com.java668.oxadmin.modules.system.controller 72 | generator: 73 | group-name: 代码生成 74 | api-rule: package 75 | api-rule-resources: 76 | - com.java668.oxadmin.modules.generator.controller 77 | # 系统配置 78 | oxadmin: 79 | system: 80 | isDemoSite: true 81 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/resources/application-prod.yml: -------------------------------------------------------------------------------- 1 | spring: 2 | datasource: 3 | url: jdbc:mysql://${java668.mysql.host}/ox-admin?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai 4 | username: ${java668.mysql.username} 5 | password: ${java668.mysql.password} 6 | type: com.alibaba.druid.pool.DruidDataSource 7 | driver-class-name: com.mysql.jdbc.Driver 8 | druid: 9 | # 初始连接数 10 | initialSize: 5 11 | # 最小连接池数量 12 | minIdle: 10 13 | # 最大连接池数量 14 | maxActive: 20 15 | # 配置获取连接等待超时的时间 16 | maxWait: 60000 17 | # 配置连接超时时间 18 | connectTimeout: 30000 19 | # 配置网络超时时间 20 | socketTimeout: 60000 21 | # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 22 | timeBetweenEvictionRunsMillis: 60000 23 | # 配置一个连接在池中最小生存的时间,单位是毫秒 24 | minEvictableIdleTimeMillis: 300000 25 | # 配置一个连接在池中最大生存的时间,单位是毫秒 26 | maxEvictableIdleTimeMillis: 900000 27 | # 配置检测连接是否有效 28 | validationQuery: SELECT 1 FROM DUAL 29 | testWhileIdle: true 30 | testOnBorrow: false 31 | testOnReturn: false 32 | webStatFilter: 33 | enabled: true 34 | statViewServlet: 35 | enabled: true 36 | # 设置白名单,不填则允许所有访问 37 | allow: 38 | url-pattern: /druid/* 39 | # 控制台管理用户名和密码 40 | login-username: oxadmin 41 | login-password: 123456 42 | filter: 43 | stat: 44 | enabled: true 45 | # 慢SQL记录 46 | log-slow-sql: true 47 | slow-sql-millis: 1000 48 | merge-sql: true 49 | wall: 50 | config: 51 | multi-statement-allow: true 52 | 53 | knife4j: 54 | enable: true 55 | openapi: 56 | title: OX-ADMIN 57 | description: 一个轻量级开源后端管理框架 58 | email: java668_real@163.com 59 | concat: 青牛 60 | url: https://github.com/java668/ox-admin 61 | version: v4.0 62 | license: Apache 2.0 63 | license-url: https://github.com/java668/ox-admin 64 | terms-of-service-url: https://github.com/java668/ox-admin 65 | group: 66 | system: 67 | group-name: 系统管理 68 | api-rule: package 69 | api-rule-resources: 70 | - com.java668.oxadmin.modules.system.controller 71 | generator: 72 | group-name: 代码生成 73 | api-rule: package 74 | api-rule-resources: 75 | - com.java668.oxadmin.modules.generator.controller 76 | test: 77 | group-name: 测试模块 78 | api-rule: package 79 | api-rule-resources: 80 | - com.java668.oxadmin.test.controller 81 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 8081 3 | servlet: 4 | session: 5 | timeout: 24H 6 | spring: 7 | profiles: 8 | active: @profileActive@ 9 | 10 | management: 11 | endpoint: 12 | shutdown: 13 | enabled: true # 开启端点 14 | health: 15 | show-details: always # 是否展示健康检查详情 16 | endpoints: 17 | web: 18 | exposure: 19 | include: '*' # 暴露所有端点 20 | 21 | mybatis-plus: 22 | type-aliases-package: com.java668.oxadmin.modules.**.entity,com.java668.oxadmin.**.entity 23 | 24 | logging: 25 | file-location: ./logs 26 | 27 | # 代码生成 28 | gen: 29 | # 作者 30 | author: jerry.chen 31 | # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool 32 | packageName: com.java668.oxadmin.modules.system 33 | # 自动去除表前缀,默认是false 34 | autoRemovePre: false 35 | # 表前缀(生成类名不会包含表前缀,多个用逗号分隔) 36 | tablePrefix: syst_ 37 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/resources/mapper/system/MenuMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/resources/mapper/system/OperLogMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | delete from syst_oper_log where id in 32 | 33 | #{id} 34 | 35 | 36 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/resources/mapper/system/RoleMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/resources/mapper/system/RoleMenuMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/resources/mapper/system/UserMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/resources/mapper/system/UserRoleMapper.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/resources/spy.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/java668/ox-admin/555056fe7b9bcb6a20afb42b29e0b0b96be537de/ox-admin-application/src/main/resources/spy.properties -------------------------------------------------------------------------------- /ox-admin-application/src/main/resources/static/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Title 6 | 7 | 8 | test 9 | 10 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/resources/vm/java/controller.java.vm: -------------------------------------------------------------------------------- 1 | package ${packageName}.controller; 2 | 3 | import java.util.List; 4 | import org.springframework.security.access.prepost.PreAuthorize; 5 | import org.springframework.web.bind.annotation.*; 6 | import ${packageName}.dto.request.${ClassName}PageReqDTO; 7 | import ${packageName}.dto.request.${ClassName}ReqDTO; 8 | import ${packageName}.dto.response.${ClassName}RespDTO; 9 | import ${packageName}.service.I${ClassName}Service; 10 | import lombok.RequiredArgsConstructor; 11 | import com.java668.common.model.R; 12 | #if($table.crud || $table.sub) 13 | import com.java668.common.model.PageResult; 14 | #elseif($table.tree) 15 | #end 16 | 17 | /** 18 | * ${functionName}Controller 19 | * 20 | * @author ${author} 21 | * @date ${datetime} 22 | */ 23 | @RequiredArgsConstructor 24 | @RestController 25 | @RequestMapping("/${moduleName}/${businessName}") 26 | public class ${ClassName}Controller { 27 | 28 | private final I${ClassName}Service ${className}Service; 29 | 30 | /** 31 | * 新增${functionName} 32 | * 33 | * @param body 34 | * @return 35 | */ 36 | @PreAuthorize("hasAuthority('${permissionPrefix}:add')") 37 | @PostMapping 38 | public R add(@RequestBody ${ClassName}ReqDTO body) { 39 | return R.success(${className}Service.add(body)); 40 | } 41 | 42 | /** 43 | * 删除${functionName} 44 | * 45 | * @param ${pkColumn.javaField}s 46 | * @return 47 | */ 48 | @PreAuthorize("hasAuthority('${permissionPrefix}:remove')") 49 | @DeleteMapping("/{${pkColumn.javaField}s}") 50 | public R remove(@PathVariable List<${pkColumn.javaType}> ${pkColumn.javaField}s) { 51 | return R.success(${className}Service.remove(${pkColumn.javaField}s)); 52 | } 53 | 54 | /** 55 | * 修改${functionName} 56 | * 57 | * @param body 58 | * @return 59 | */ 60 | @PreAuthorize("hasAuthority('${permissionPrefix}:edit')") 61 | @PutMapping 62 | public R update(@RequestBody ${ClassName}ReqDTO body) { 63 | return R.success(${className}Service.update(body)); 64 | } 65 | 66 | /** 67 | * 获取${functionName}详细信息 68 | * 69 | * @param ${pkColumn.javaField} 70 | * @return 71 | */ 72 | @PreAuthorize("hasAuthority('${permissionPrefix}:query')") 73 | @GetMapping(value = "/{${pkColumn.javaField}}") 74 | public R<${ClassName}RespDTO> detail(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField}) { 75 | return R.success(${className}Service.detail(${pkColumn.javaField})); 76 | } 77 | 78 | /** 79 | * 查询${functionName}列表 80 | * 81 | * @param req 82 | * @return 83 | */ 84 | @PreAuthorize("hasAuthority('${permissionPrefix}:list')") 85 | @GetMapping("/list") 86 | #if($table.crud || $table.sub) 87 | public R> page(${ClassName}PageReqDTO req) { 88 | return R.success(${className}Service.page(req)); 89 | } 90 | #elseif($table.tree) 91 | public R> list(${ClassName}PageReqDTO req) { 92 | List<${ClassName}RespDTO> list = ${className}Service.list(req); 93 | return R.success(list); 94 | } 95 | #end 96 | 97 | } 98 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/resources/vm/java/domain.java.vm: -------------------------------------------------------------------------------- 1 | package ${packageName}.entity; 2 | 3 | #foreach ($import in $importList) 4 | import ${import}; 5 | #end 6 | import lombok.Data; 7 | import lombok.ToString; 8 | import com.baomidou.mybatisplus.annotation.TableName; 9 | #if($table.crud || $table.sub) 10 | import com.java668.common.db.entity.BaseEntity; 11 | import com.baomidou.mybatisplus.annotation.TableField; 12 | #elseif($table.tree) 13 | import com.java668.common.db.entity.BaseEntity; 14 | #end 15 | 16 | /** 17 | * ${functionName}对象 ${tableName} 18 | * 19 | * @author ${author} 20 | * @date ${datetime} 21 | */ 22 | #if($table.crud || $table.sub) 23 | #set($Entity="BaseEntity") 24 | #elseif($table.tree) 25 | #set($Entity="BaseEntity") 26 | #end 27 | @Data 28 | @ToString 29 | @TableName("${tableName}") 30 | public class ${ClassName} extends ${Entity} { 31 | private static final long serialVersionUID = 1L; 32 | 33 | #foreach ($column in $columns) 34 | #if(!$table.isSuperColumn($column.javaField)) 35 | /** 36 | * $column.columnComment 37 | */ 38 | ## #if($column.list) 39 | ## 40 | ## #set($parentheseIndex=$column.columnComment.indexOf("(")) 41 | ## 42 | ## #if($parentheseIndex != -1) 43 | ## #set($comment=$column.columnComment.substring(0, $parentheseIndex)) 44 | ## #else 45 | ## #set($comment=$column.columnComment) 46 | ## #end 47 | ## 48 | ## #if($parentheseIndex != -1) 49 | ## @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") 50 | ## #elseif($column.javaType == 'Date') 51 | ## @JsonFormat(pattern = "yyyy-MM-dd") 52 | ## @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd") 53 | ## #else 54 | ## @Excel(name = "${comment}") 55 | ## #end 56 | ## 57 | ## #end 58 | private $column.javaType $column.javaField; 59 | #end 60 | #end 61 | #if($table.sub) 62 | /** 63 | * $table.subTable.functionName信息 64 | */ 65 | @TableField(exist = false) 66 | private List<${subClassName}> ${subclassName}List; 67 | 68 | #end 69 | ###foreach ($column in $columns) 70 | ###if(!$table.isSuperColumn($column.javaField)) 71 | ###if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) 72 | ###set($AttrName=$column.javaField) 73 | ###else 74 | ###set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) 75 | ###end 76 | ## public void set${AttrName}($column.javaType $column.javaField) { 77 | ## this.$column.javaField = $column.javaField; 78 | ## } 79 | ## 80 | ## public $column.javaType get${AttrName}() { 81 | ## return $column.javaField; 82 | ## } 83 | ###end 84 | ###end 85 | 86 | ###if($table.sub) 87 | ## public List<${subClassName}> get${subClassName}List() { 88 | ## return ${subclassName}List; 89 | ## } 90 | ## 91 | ## public void set${subClassName}List(List<${subClassName}> ${subclassName}List) { 92 | ## this.${subclassName}List = ${subclassName}List; 93 | ## } 94 | ## 95 | ###end 96 | ## @Override 97 | ## public String toString() { 98 | ## return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) 99 | ###foreach ($column in $columns) 100 | ###if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) 101 | ###set($AttrName=$column.javaField) 102 | ###else 103 | ###set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) 104 | ###end 105 | ## .append("${column.javaField}", get${AttrName}()) 106 | ###end 107 | ###if($table.sub) 108 | ## .append("${subclassName}List", get${subClassName}List()) 109 | ###end 110 | ## .toString(); 111 | ## } 112 | } 113 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/resources/vm/java/mapper.java.vm: -------------------------------------------------------------------------------- 1 | package ${packageName}.mapper; 2 | 3 | import java.util.List; 4 | import com.java668.common.db.mapper.EasyBaseMapper; 5 | import ${packageName}.entity.${ClassName}; 6 | #if($table.sub) 7 | import ${packageName}.entity.${subClassName}; 8 | #end 9 | 10 | /** 11 | * ${functionName}Mapper接口 12 | * 13 | * @author ${author} 14 | * @date ${datetime} 15 | */ 16 | public interface ${ClassName}Mapper extends EasyBaseMapper<${ClassName}> { 17 | 18 | /** 19 | * 批量删除${functionName} 20 | * 21 | * @param ${pkColumn.javaField}s 需要删除的数据主键集合 22 | * @return 结果 23 | */ 24 | int deleteBy${pkColumn.capJavaField}s(List<${pkColumn.javaType}> ${pkColumn.javaField}s); 25 | #if($table.sub) 26 | 27 | /** 28 | * 批量删除${subTable.functionName} 29 | * 30 | * @param ${pkColumn.javaField}s 需要删除的数据主键集合 31 | * @return 结果 32 | */ 33 | int delete${subClassName}By${subTableFkClassName}s(List<${pkColumn.javaType}> ${pkColumn.javaField}s); 34 | 35 | /** 36 | * 批量新增${subTable.functionName} 37 | * 38 | * @param ${subclassName}List ${subTable.functionName}列表 39 | * @return 结果 40 | */ 41 | int batch${subClassName}(List<${subClassName}> ${subclassName}List); 42 | 43 | /** 44 | * 通过${functionName}主键删除${subTable.functionName}信息 45 | * 46 | * @param ${pkColumn.javaField} ${functionName}ID 47 | * @return 结果 48 | */ 49 | int delete${subClassName}By${subTableFkClassName}(${pkColumn.javaType} ${pkColumn.javaField}); 50 | #end 51 | } 52 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/resources/vm/java/pageReqDTO.java.vm: -------------------------------------------------------------------------------- 1 | package ${packageName}.dto.request; 2 | 3 | #foreach ($import in $importList) 4 | import ${import}; 5 | #end 6 | import lombok.Data; 7 | import lombok.ToString; 8 | import com.java668.common.model.PageParam; 9 | 10 | /** 11 | * ${functionName}对象 ${tableName} 12 | * 13 | * @author ${author} 14 | * @date ${datetime} 15 | */ 16 | @Data 17 | @ToString 18 | public class ${ClassName}PageReqDTO extends PageParam { 19 | private static final long serialVersionUID = 1L; 20 | #foreach($column in $columns) 21 | #if(!$table.isSuperColumn($column.javaField)) 22 | #set($queryType=$column.queryType) 23 | #set($javaField=$column.javaField) 24 | #set($javaType=$column.javaType) 25 | #set($columnName=$column.columnName) 26 | #set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) 27 | #if($column.query) 28 | #if($queryType == "BETWEEN") 29 | /** 30 | * $column.columnComment 开始区间 31 | */ 32 | private $column.javaType begin$AttrName; 33 | /** 34 | * $column.columnComment 结束区间 35 | */ 36 | private $column.javaType end$AttrName; 37 | #else 38 | /** 39 | * $column.columnComment 40 | */ 41 | private $column.javaType $column.javaField; 42 | #end 43 | #end 44 | #end 45 | #end 46 | 47 | } 48 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/resources/vm/java/reqDTO.java.vm: -------------------------------------------------------------------------------- 1 | package ${packageName}.dto.request; 2 | 3 | #foreach ($import in $importList) 4 | import ${import}; 5 | #end 6 | import lombok.Data; 7 | import lombok.ToString; 8 | 9 | /** 10 | * ${functionName}对象 ${tableName} 11 | * 12 | * @author ${author} 13 | * @date ${datetime} 14 | */ 15 | @Data 16 | @ToString 17 | public class ${ClassName}ReqDTO { 18 | private static final long serialVersionUID = 1L; 19 | 20 | #foreach ($column in $columns) 21 | #if(!$table.isSuperColumn($column.javaField)) 22 | /** 23 | * $column.columnComment 24 | */ 25 | private $column.javaType $column.javaField; 26 | #end 27 | #end 28 | #if($table.sub) 29 | /** 30 | * $table.subTable.functionName信息 31 | */ 32 | private List<${subClassName}ReqDTO> ${subclassName}List; 33 | #end 34 | } 35 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/resources/vm/java/respDTO.java.vm: -------------------------------------------------------------------------------- 1 | package ${packageName}.dto.response; 2 | 3 | #foreach ($import in $importList) 4 | import ${import}; 5 | #end 6 | import lombok.Data; 7 | import lombok.ToString; 8 | import com.java668.common.model.BaseDTO; 9 | 10 | /** 11 | * ${functionName}对象 ${tableName} 12 | * 13 | * @author ${author} 14 | * @date ${datetime} 15 | */ 16 | @Data 17 | @ToString 18 | public class ${ClassName}RespDTO extends BaseDTO { 19 | private static final long serialVersionUID = 1L; 20 | 21 | #foreach ($column in $columns) 22 | #if(!$table.isSuperColumn($column.javaField)) 23 | /** 24 | * $column.columnComment 25 | */ 26 | private $column.javaType $column.javaField; 27 | #end 28 | #end 29 | #if($table.sub) 30 | /** 31 | * $table.subTable.functionName信息 32 | */ 33 | private List<${subClassName}RespDTO> ${subclassName}List; 34 | #end 35 | } 36 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/resources/vm/java/service.java.vm: -------------------------------------------------------------------------------- 1 | package ${packageName}.service; 2 | 3 | import java.util.List; 4 | 5 | import ${packageName}.entity.${ClassName}; 6 | import ${packageName}.dto.request.${ClassName}PageReqDTO; 7 | import ${packageName}.dto.request.${ClassName}ReqDTO; 8 | import ${packageName}.dto.response.${ClassName}RespDTO; 9 | 10 | import com.baomidou.mybatisplus.extension.service.IService; 11 | import com.java668.common.model.PageResult; 12 | 13 | 14 | /** 15 | * ${functionName}Service接口 16 | * 17 | * @author ${author} 18 | * @date ${datetime} 19 | */ 20 | public interface I${ClassName}Service extends IService<${ClassName}> { 21 | 22 | /** 23 | * 新增${functionName} 24 | * 25 | * @param body 26 | * @return 27 | */ 28 | Integer add(${ClassName}ReqDTO body); 29 | 30 | /** 31 | * 删除${functionName} 32 | * 33 | * @param ${pkColumn.javaField}s 34 | * @return 35 | */ 36 | Integer remove(List<${pkColumn.javaType}> ${pkColumn.javaField}s); 37 | 38 | /** 39 | * 更新${functionName} 40 | * 41 | * @param body 42 | * @return 43 | */ 44 | Integer update(${ClassName}ReqDTO body); 45 | 46 | /** 47 | * 获取${functionName}详细信息 48 | * 49 | * @param ${pkColumn.javaField} 50 | * @return 51 | */ 52 | ${ClassName}RespDTO detail(${pkColumn.javaType} ${pkColumn.javaField}); 53 | 54 | /** 55 | * 查询${functionName}列表 56 | * 57 | * @param req 58 | * @return 59 | */ 60 | #if($table.crud || $table.sub) 61 | PageResult<${ClassName}RespDTO> page(${ClassName}PageReqDTO req); 62 | #elseif($table.tree) 63 | List<${ClassName}RespDTO> list(${ClassName}PageReqDTO req); 64 | #end 65 | } 66 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/resources/vm/java/sub-domain.java.vm: -------------------------------------------------------------------------------- 1 | package ${packageName}.entity; 2 | 3 | #foreach ($import in $subImportList) 4 | import ${import}; 5 | #end 6 | import lombok.Data; 7 | import lombok.ToString; 8 | import com.baomidou.mybatisplus.annotation.TableName; 9 | import com.java668.common.db.entity.BaseEntity; 10 | 11 | /** 12 | * ${subTable.functionName}对象 ${subTableName} 13 | * 14 | * @author ${author} 15 | * @date ${datetime} 16 | */ 17 | @Data 18 | @ToString 19 | @TableName("${subTableName}") 20 | public class ${subClassName} extends BaseEntity { 21 | private static final long serialVersionUID = 1L; 22 | 23 | #foreach ($column in $subTable.columns) 24 | #if(!$table.isSuperColumn($column.javaField)) 25 | 26 | /** 27 | * $column.columnComment 28 | */ 29 | private $column.javaType $column.javaField; 30 | #end 31 | #end 32 | } 33 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/resources/vm/java/sub-reqDTO.java.vm: -------------------------------------------------------------------------------- 1 | package ${packageName}.domain; 2 | 3 | #foreach ($import in $subImportList) 4 | import ${import}; 5 | #end 6 | import lombok.Data; 7 | import lombok.ToString; 8 | 9 | /** 10 | * ${subTable.functionName}对象 ${subTableName} 11 | * 12 | * @author ${author} 13 | * @date ${datetime} 14 | */ 15 | @Data 16 | @ToString 17 | public class ${subClassName}ReqDTO { 18 | private static final long serialVersionUID = 1L; 19 | 20 | #foreach ($column in $subTable.columns) 21 | #if(!$table.isSuperColumn($column.javaField)) 22 | /** 23 | * $column.columnComment 24 | */ 25 | private $column.javaType $column.javaField; 26 | #end 27 | #end 28 | 29 | } 30 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/resources/vm/java/sub-respDTO.java.vm: -------------------------------------------------------------------------------- 1 | package ${packageName}.domain; 2 | 3 | #foreach ($import in $subImportList) 4 | import ${import}; 5 | #end 6 | import lombok.Data; 7 | import lombok.ToString; 8 | import com.java668.common.model.BaseDTO; 9 | 10 | /** 11 | * ${subTable.functionName}对象 ${subTableName} 12 | * 13 | * @author ${author} 14 | * @date ${datetime} 15 | */ 16 | @Data 17 | @ToString 18 | public class ${subClassName}RespDTO extends BaseDTO { 19 | private static final long serialVersionUID = 1L; 20 | 21 | #foreach ($column in $subTable.columns) 22 | #if(!$table.isSuperColumn($column.javaField)) 23 | /** 24 | * $column.columnComment 25 | */ 26 | private $column.javaType $column.javaField; 27 | #end 28 | #end 29 | 30 | } 31 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/resources/vm/js/api.js.vm: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request' 2 | 3 | // 查询${functionName}列表 4 | export function list${BusinessName}(query) { 5 | return request({ 6 | url: '/${moduleName}/${businessName}/list', 7 | method: 'get', 8 | params: query 9 | }) 10 | } 11 | 12 | // 查询${functionName}详细 13 | export function get${BusinessName}(${pkColumn.javaField}) { 14 | return request({ 15 | url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, 16 | method: 'get' 17 | }) 18 | } 19 | 20 | // 新增${functionName} 21 | export function add${BusinessName}(data) { 22 | return request({ 23 | url: '/${moduleName}/${businessName}', 24 | method: 'post', 25 | data: data 26 | }) 27 | } 28 | 29 | // 修改${functionName} 30 | export function update${BusinessName}(data) { 31 | return request({ 32 | url: '/${moduleName}/${businessName}', 33 | method: 'put', 34 | data: data 35 | }) 36 | } 37 | 38 | // 删除${functionName} 39 | export function del${BusinessName}(${pkColumn.javaField}) { 40 | return request({ 41 | url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, 42 | method: 'delete' 43 | }) 44 | } 45 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/resources/vm/sql/sql.vm: -------------------------------------------------------------------------------- 1 | -- 菜单 SQL 2 | ##insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) 3 | ##values('${functionName}', '${parentMenuId}', '1', '${businessName}', '${moduleName}/${businessName}/index', 1, 0, 'C', '0', '0', '${permissionPrefix}:list', '#', 'admin', sysdate(), '', null, '${functionName}菜单'); 4 | INSERT INTO `syst_menu`(`pid`, `type`, `title`, `name`, `component`, `sort`, `icon`, `path`, `iframe`, `cache`, `hidden`, `permission`, `create_by`, `update_by`, `create_time`, `update_time`, `is_deleted`) 5 | VALUES (${parentMenuId}, 1, '${functionName}', '${businessName}', '${moduleName}/${businessName}/index', 1000, '#', '${businessName}', b'0', b'0', b'0', '${permissionPrefix}:list', 'system', 'system', now(), now(), 0); 6 | 7 | -- 按钮父菜单ID 8 | SELECT @parentId := LAST_INSERT_ID(); 9 | 10 | -- 按钮 SQL 11 | ##insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) 12 | ##values('${functionName}查询', @parentId, '1', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:query', '#', 'admin', sysdate(), '', null, ''); 13 | ## 14 | ##insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) 15 | ##values('${functionName}新增', @parentId, '2', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:add', '#', 'admin', sysdate(), '', null, ''); 16 | ## 17 | ##insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) 18 | ##values('${functionName}修改', @parentId, '3', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:edit', '#', 'admin', sysdate(), '', null, ''); 19 | ## 20 | ##insert into sys_menu (menu_name, parent_id, order_num, path, component, is_frame, is_cache, menu_type, visible, status, perms, icon, create_by, create_time, update_by, update_time, remark) 21 | ##values('${functionName}删除', @parentId, '4', '#', '', 1, 0, 'F', '0', '0', '${permissionPrefix}:remove', '#', 'admin', sysdate(), '', null, ''); 22 | 23 | INSERT INTO `syst_menu`(`pid`, `type`, `title`, `name`, `component`, `sort`, `icon`, `path`, `iframe`, `cache`, `hidden`, `permission`, `create_by`, `update_by`, `create_time`, `update_time`, `is_deleted`) 24 | VALUES (@parentId, 2, '${functionName}查询', '${businessName}', '', 1000, '#', '#', b'0', b'0', b'0', '${permissionPrefix}:query', 'system', 'system', now(), now(), 0); 25 | 26 | INSERT INTO `syst_menu`(`pid`, `type`, `title`, `name`, `component`, `sort`, `icon`, `path`, `iframe`, `cache`, `hidden`, `permission`, `create_by`, `update_by`, `create_time`, `update_time`, `is_deleted`) 27 | VALUES (@parentId, 2, '${functionName}新增', '${businessName}', '', 1000, '#', '#', b'0', b'0', b'0', '${permissionPrefix}:add', 'system', 'system', now(), now(), 0); 28 | 29 | INSERT INTO `syst_menu`(`pid`, `type`, `title`, `name`, `component`, `sort`, `icon`, `path`, `iframe`, `cache`, `hidden`, `permission`, `create_by`, `update_by`, `create_time`, `update_time`, `is_deleted`) 30 | VALUES (@parentId, 2, '${functionName}修改', '${businessName}', '', 1000, '#', '#', b'0', b'0', b'0', '${permissionPrefix}:edit', 'system', 'system', now(), now(), 0); 31 | 32 | INSERT INTO `syst_menu`(`pid`, `type`, `title`, `name`, `component`, `sort`, `icon`, `path`, `iframe`, `cache`, `hidden`, `permission`, `create_by`, `update_by`, `create_time`, `update_time`, `is_deleted`) 33 | VALUES (@parentId, 2, '${functionName}删除', '${businessName}', '', 1000, '#', '#', b'0', b'0', b'0', '${permissionPrefix}:remove', 'system', 'system', now(), now(), 0); 34 | 35 | -------------------------------------------------------------------------------- /ox-admin-application/src/main/resources/vm/vue/v3/readme.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/java668/ox-admin/555056fe7b9bcb6a20afb42b29e0b0b96be537de/ox-admin-application/src/main/resources/vm/vue/v3/readme.txt -------------------------------------------------------------------------------- /ox-admin-application/src/main/resources/vm/xml/mapper.xml.vm: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | #foreach ($column in $columns) 9 | 10 | #end 11 | 12 | #if($table.sub) 13 | 14 | 15 | 16 | 17 | 18 | #foreach ($column in $subTable.columns) 19 | 20 | #end 21 | 22 | #end 23 | #if($table.sub) 24 | 31 | #end 32 | 33 | 34 | delete from ${tableName} where ${pkColumn.columnName} in 35 | 36 | #{${pkColumn.javaField}} 37 | 38 | 39 | #if($table.sub) 40 | 41 | 42 | delete from ${subTableName} where ${subTableFkName} in 43 | 44 | #{${subTableFkclassName}} 45 | 46 | 47 | 48 | 49 | delete from ${subTableName} where ${subTableFkName} = #{${subTableFkclassName}} 50 | 51 | 52 | 53 | insert into ${subTableName}(#foreach($column in $subTable.columns) $column.columnName#if($foreach.count != $subTable.columns.size()),#end#end) values 54 | 55 | (#foreach($column in $subTable.columns) #{item.$column.javaField}#if($foreach.count != $subTable.columns.size()),#end#end) 56 | 57 | 58 | #end 59 | -------------------------------------------------------------------------------- /ox-admin-application/src/test/java/com/java668/oxadmin/OxAdminApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.java668.oxadmin; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class OxAdminApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | -------------------------------------------------------------------------------- /ox-admin-common/.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-common/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-common 14 | 0.0.1-SNAPSHOT 15 | ox-admin-common 16 | ox-admin公共包 17 | 18 | 19 | UTF-8 20 | 8 21 | 8 22 | 23 | 24 | 25 | 26 | org.springframework.boot 27 | spring-boot-starter-web 28 | 29 | 30 | 31 | org.springframework.boot 32 | spring-boot-starter-actuator 33 | 34 | 35 | 36 | org.springframework.boot 37 | spring-boot-configuration-processor 38 | true 39 | 40 | 41 | 42 | org.springframework.boot 43 | spring-boot-starter-security 44 | 45 | 46 | 47 | org.apache.commons 48 | commons-lang3 49 | 50 | 51 | 52 | 53 | com.baomidou 54 | mybatis-plus-boot-starter 55 | 56 | 57 | 58 | com.google.guava 59 | guava 60 | 61 | 62 | 63 | com.github.xiaoymin 64 | knife4j-openapi2-spring-boot-starter 65 | 66 | 67 | 68 | org.springframework.boot 69 | spring-boot-starter-validation 70 | 71 | 72 | 73 | org.springframework.boot 74 | spring-boot-starter-aop 75 | 76 | 77 | 78 | 79 | cn.hutool 80 | hutool-all 81 | 82 | 83 | 84 | 85 | io.github.mouzt 86 | bizlog-sdk 87 | 3.0.6-oxadmin 88 | 89 | 90 | 91 | 92 | 93 | -------------------------------------------------------------------------------- /ox-admin-common/src/main/java/com/java668/common/aop/annotation/DemoSite.java: -------------------------------------------------------------------------------- 1 | package com.java668.common.aop.annotation; 2 | 3 | import java.lang.annotation.*; 4 | 5 | @Target(ElementType.METHOD) 6 | @Retention(RetentionPolicy.RUNTIME) 7 | @Documented 8 | @Inherited 9 | public @interface DemoSite { 10 | 11 | 12 | } -------------------------------------------------------------------------------- /ox-admin-common/src/main/java/com/java668/common/aop/interceptor/ApiLogAop.java: -------------------------------------------------------------------------------- 1 | package com.java668.common.aop.interceptor; 2 | 3 | import cn.hutool.http.Header; 4 | import cn.hutool.http.useragent.UserAgent; 5 | import cn.hutool.http.useragent.UserAgentUtil; 6 | import cn.hutool.json.JSONUtil; 7 | import com.alibaba.fastjson2.JSONObject; 8 | import lombok.extern.slf4j.Slf4j; 9 | import org.aspectj.lang.JoinPoint; 10 | import org.aspectj.lang.annotation.AfterReturning; 11 | import org.aspectj.lang.annotation.Aspect; 12 | import org.aspectj.lang.annotation.Before; 13 | import org.aspectj.lang.annotation.Pointcut; 14 | import org.springframework.core.annotation.Order; 15 | import org.springframework.util.MimeTypeUtils; 16 | import org.springframework.web.context.request.RequestContextHolder; 17 | import org.springframework.web.context.request.ServletRequestAttributes; 18 | 19 | import javax.servlet.http.HttpServletRequest; 20 | import java.util.Arrays; 21 | 22 | /** 23 | * 使用Aop拦截Controller层需要进行日志记录的API 24 | * 25 | * @author Jerry.chen 26 | */ 27 | @Slf4j 28 | @Aspect 29 | @Order 30 | public class ApiLogAop { 31 | 32 | /** 33 | * 记录module下所有rest子包的controller 34 | */ 35 | @Pointcut("execution(public * com.java668.oxadmin.modules.*.controller.*.*(..))" 36 | + "||execution(public * com.java668.oxadmin.*.modules.*.*(..))") 37 | public void webLog() { 38 | } 39 | 40 | /** 41 | * 在方法执行前执行 42 | * 43 | * @param joinPoint 连接点 44 | */ 45 | @Before(value = "webLog()") 46 | private void doBefore(JoinPoint joinPoint) { 47 | //判空,如果为空则返回 48 | ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); 49 | if (requestAttributes == null) { 50 | return; 51 | } 52 | HttpServletRequest request = (requestAttributes).getRequest(); 53 | log.info("========================= Request Start ========================="); 54 | log.info("url : " + request.getRequestURL().toString()); 55 | log.info("http_method: " + request.getMethod()); 56 | 57 | /** 58 | * add 客户端信息 59 | */ 60 | UserAgent ua = UserAgentUtil.parse(request.getHeader(Header.USER_AGENT.toString())); 61 | log.info("Platform: {}", ua.getPlatform().toString()); 62 | log.info("客户端信息: {}", JSONUtil.toJsonStr(ua)); 63 | 64 | log.info("IP : " + request.getRemoteAddr()); 65 | log.info( 66 | "CLASS_METHOD : " 67 | + joinPoint.getSignature().getDeclaringTypeName() 68 | + "." 69 | + joinPoint.getSignature().getName()); 70 | String contentType = request.getContentType(); 71 | if (contentType != null && contentType.contains(MimeTypeUtils.APPLICATION_JSON_VALUE)) { 72 | Object[] args = joinPoint.getArgs(); 73 | if (args.length > 0) { 74 | log.info("args : {}", JSONObject.toJSONString(args[0])); 75 | } 76 | } else { 77 | log.info("args : {}", Arrays.toString(joinPoint.getArgs())); 78 | } 79 | } 80 | 81 | @AfterReturning(returning = "ret", pointcut = "webLog()") 82 | public void doAfterReturning(Object ret) throws Throwable { 83 | // 处理完请求,返回内容 84 | log.info("resp: " + JSONObject.toJSONString(ret)); 85 | log.info("========================= Request End ========================="); 86 | } 87 | 88 | } 89 | -------------------------------------------------------------------------------- /ox-admin-common/src/main/java/com/java668/common/aop/interceptor/DemoInterceptor.java: -------------------------------------------------------------------------------- 1 | package com.java668.common.aop.interceptor; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import com.java668.common.aop.annotation.DemoSite; 5 | import com.java668.common.enums.ResultEnum; 6 | import com.java668.common.exception.BizException; 7 | import com.java668.common.properties.SystemSettingProperties; 8 | import com.java668.common.utils.AuthUtils; 9 | import lombok.RequiredArgsConstructor; 10 | import org.aspectj.lang.annotation.Aspect; 11 | import org.aspectj.lang.annotation.Before; 12 | 13 | /** 14 | * @author Jerry.chen 15 | * @desc 演示环境 aop拦截器 16 | * @date 2023/03/29 18:05 17 | **/ 18 | @Aspect 19 | @RequiredArgsConstructor 20 | public class DemoInterceptor { 21 | 22 | private final SystemSettingProperties systemSettingProperties; 23 | 24 | @Before("@annotation(demoSite)") 25 | public void doAfter(DemoSite demoSite) { 26 | if (systemSettingProperties.getIsDemoSite() && !StrUtil.equals(AuthUtils.getUsername(), "admin")) { 27 | throw new BizException(ResultEnum.SYSTEM_DEMO_SITE_EXCEPTION); 28 | } 29 | } 30 | 31 | } -------------------------------------------------------------------------------- /ox-admin-common/src/main/java/com/java668/common/constant/Constants.java: -------------------------------------------------------------------------------- 1 | package com.java668.common.constant; 2 | 3 | public interface Constants { 4 | 5 | /** 6 | * UTF-8 字符集 7 | */ 8 | String UTF8 = "UTF-8"; 9 | 10 | /** 11 | * http请求 12 | */ 13 | String HTTP = "http://"; 14 | 15 | /** 16 | * https请求 17 | */ 18 | String HTTPS = "https://"; 19 | 20 | /** 21 | * logStartTime 22 | */ 23 | String LOG_START_TIME_ATTRIBUTE = "logStartTime"; 24 | } 25 | -------------------------------------------------------------------------------- /ox-admin-common/src/main/java/com/java668/common/db/config/DateMetaObjectHandler.java: -------------------------------------------------------------------------------- 1 | package com.java668.common.db.config; 2 | 3 | import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; 4 | import com.java668.common.db.properties.MybatisPlusAutoFillProperties; 5 | import com.java668.common.utils.AuthUtils; 6 | import org.apache.ibatis.reflection.MetaObject; 7 | import org.springframework.util.StringUtils; 8 | 9 | import java.util.Date; 10 | 11 | /** 12 | * @author Jerry.chen 13 | * @desc DateMetaObjectHandler 14 | * @date 2023/03/29 18:05 15 | **/ 16 | public class DateMetaObjectHandler implements MetaObjectHandler { 17 | private MybatisPlusAutoFillProperties autoFillProperties; 18 | 19 | public DateMetaObjectHandler(MybatisPlusAutoFillProperties autoFillProperties) { 20 | this.autoFillProperties = autoFillProperties; 21 | } 22 | 23 | /** 24 | * 是否开启了插入填充 25 | */ 26 | @Override 27 | public boolean openInsertFill() { 28 | return autoFillProperties.getEnableInsertFill(); 29 | } 30 | 31 | /** 32 | * 是否开启了更新填充 33 | */ 34 | @Override 35 | public boolean openUpdateFill() { 36 | return autoFillProperties.getEnableUpdateFill(); 37 | } 38 | 39 | /** 40 | * 插入填充,字段为空自动填充 41 | */ 42 | @Override 43 | public void insertFill(MetaObject metaObject) { 44 | String createBy = (String) getFieldValByName(autoFillProperties.getCreateByField(), metaObject); 45 | String updateBy = (String) getFieldValByName(autoFillProperties.getUpdateByField(), metaObject); 46 | 47 | if (StringUtils.isEmpty(createBy) || StringUtils.isEmpty(updateBy)) { 48 | String username = AuthUtils.getUsername(); 49 | // 获取当前登录用户 50 | if (StringUtils.isEmpty(createBy)) { 51 | setFieldValByName(autoFillProperties.getCreateByField(), username, metaObject); 52 | } 53 | 54 | if (StringUtils.isEmpty(updateBy)) { 55 | setFieldValByName(autoFillProperties.getUpdateByField(), username, metaObject); 56 | } 57 | } 58 | 59 | Object createTime = getFieldValByName(autoFillProperties.getCreateTimeField(), metaObject); 60 | Object updateTime = getFieldValByName(autoFillProperties.getUpdateTimeField(), metaObject); 61 | if (createTime == null || updateTime == null) { 62 | Date date = new Date(); 63 | if (createTime == null) { 64 | setFieldValByName(autoFillProperties.getCreateTimeField(), date, metaObject); 65 | } 66 | if (updateTime == null) { 67 | setFieldValByName(autoFillProperties.getUpdateTimeField(), date, metaObject); 68 | } 69 | } 70 | } 71 | 72 | /** 73 | * 更新填充 74 | */ 75 | @Override 76 | public void updateFill(MetaObject metaObject) { 77 | setFieldValByName(autoFillProperties.getUpdateTimeField(), new Date(), metaObject); 78 | 79 | String updateBy = (String) getFieldValByName(autoFillProperties.getUpdateByField(), metaObject); 80 | if (StringUtils.isEmpty(updateBy)) { 81 | String username = AuthUtils.getUsername(); 82 | setFieldValByName(autoFillProperties.getUpdateByField(), username, metaObject); 83 | } 84 | } 85 | } -------------------------------------------------------------------------------- /ox-admin-common/src/main/java/com/java668/common/db/config/EasySqlInjector.java: -------------------------------------------------------------------------------- 1 | package com.java668.common.db.config; 2 | 3 | import com.baomidou.mybatisplus.annotation.FieldFill; 4 | import com.baomidou.mybatisplus.core.injector.AbstractMethod; 5 | import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector; 6 | import com.baomidou.mybatisplus.core.metadata.TableInfo; 7 | import com.baomidou.mybatisplus.extension.injector.methods.InsertBatchSomeColumn; 8 | 9 | import java.util.List; 10 | 11 | /** 12 | * @author Jerry.chen 13 | * @desc 此SQL注入器继承了DefaultSqlInjector(默认注入器) 14 | * @date 2023/03/29 18:05 15 | **/ 16 | public class EasySqlInjector extends DefaultSqlInjector { 17 | 18 | 19 | @Override 20 | public List getMethodList(Class mapperClass, TableInfo tableInfo) { 21 | // 注意:此SQL注入器继承了DefaultSqlInjector(默认注入器),调用了DefaultSqlInjector的getMethodList方法,保留了mybatis-plus的自带方法 22 | List methodList = super.getMethodList(mapperClass, tableInfo); 23 | methodList.add(new InsertBatchSomeColumn(i -> i.getFieldFill() != FieldFill.UPDATE)); 24 | return methodList; 25 | } 26 | 27 | } -------------------------------------------------------------------------------- /ox-admin-common/src/main/java/com/java668/common/db/config/MybatisPlusAutoConfigure.java: -------------------------------------------------------------------------------- 1 | package com.java668.common.db.config; 2 | 3 | import com.baomidou.mybatisplus.annotation.DbType; 4 | import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; 5 | import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; 6 | import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; 7 | import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; 8 | import com.java668.common.db.properties.MybatisPlusAutoFillProperties; 9 | import org.mybatis.spring.annotation.MapperScan; 10 | import org.springframework.beans.factory.annotation.Autowired; 11 | import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; 12 | import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; 13 | import org.springframework.boot.context.properties.EnableConfigurationProperties; 14 | import org.springframework.context.annotation.Bean; 15 | 16 | /** 17 | * @author Jerry.chen 18 | * @desc MybatisPlusAutoConfigure 19 | * @date 2022/09/07 18:35 20 | **/ 21 | @EnableConfigurationProperties({MybatisPlusAutoFillProperties.class}) 22 | @MapperScan(basePackages = {"com.java668.**.mapper"}) 23 | public class MybatisPlusAutoConfigure { 24 | 25 | 26 | @Autowired 27 | private MybatisPlusAutoFillProperties autoFillProperties; 28 | 29 | 30 | @Bean 31 | public MybatisPlusInterceptor mybatisPlusInterceptor() { 32 | MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); 33 | // 乐观锁插件 34 | interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); 35 | // 分页插件。如果你不配置,分页插件将不生效 指定数据库方言为 MYSQL 36 | interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); 37 | return interceptor; 38 | } 39 | 40 | @Bean 41 | @ConditionalOnMissingBean 42 | @ConditionalOnProperty(prefix = "java668.record-platform.mybatis-plus.auto-fill", name = "enabled", havingValue = "true", matchIfMissing = true) 43 | public MetaObjectHandler metaObjectHandler() { 44 | return new DateMetaObjectHandler(autoFillProperties); 45 | } 46 | 47 | /** 48 | * 批量插入 49 | * @return 50 | */ 51 | @Bean 52 | public EasySqlInjector easySqlInjector() { 53 | return new EasySqlInjector(); 54 | } 55 | 56 | } -------------------------------------------------------------------------------- /ox-admin-common/src/main/java/com/java668/common/db/entity/BaseEntity.java: -------------------------------------------------------------------------------- 1 | package com.java668.common.db.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.baomidou.mybatisplus.extension.activerecord.Model; 8 | import lombok.Getter; 9 | import lombok.Setter; 10 | 11 | import java.util.Date; 12 | 13 | /** 14 | * @author Jerry.chen 15 | * @desc SuperEntity 16 | * @date 2023/03/29 18:05 17 | **/ 18 | @Setter 19 | @Getter 20 | public class BaseEntity> extends Model { 21 | 22 | private static final long serialVersionUID = 1L; 23 | 24 | /** 25 | * 创建人 26 | */ 27 | @TableField(fill = FieldFill.INSERT) 28 | private String createBy; 29 | 30 | /** 31 | * 更新人 32 | */ 33 | @TableField(fill = FieldFill.INSERT_UPDATE) 34 | private String updateBy; 35 | 36 | /** 37 | * 创建时间 38 | */ 39 | @TableField(fill = FieldFill.INSERT) 40 | private Date createTime; 41 | 42 | /** 43 | * 更新时间 44 | */ 45 | @TableField(fill = FieldFill.INSERT_UPDATE) 46 | private Date updateTime; 47 | } 48 | -------------------------------------------------------------------------------- /ox-admin-common/src/main/java/com/java668/common/db/mapper/EasyBaseMapper.java: -------------------------------------------------------------------------------- 1 | package com.java668.common.db.mapper; 2 | 3 | import com.baomidou.mybatisplus.core.mapper.BaseMapper; 4 | 5 | import java.util.Collection; 6 | 7 | /** 8 | * @author Jerry.chen 9 | * @desc SuperEntity 10 | * @date 2023/03/29 18:05 11 | **/ 12 | public interface EasyBaseMapper extends BaseMapper { 13 | /** 14 | * 批量插入 仅适用于mysql 15 | * 16 | * @param entityList 实体列表 17 | * @return 影响行数 18 | */ 19 | Integer insertBatchSomeColumn(Collection entityList); 20 | } -------------------------------------------------------------------------------- /ox-admin-common/src/main/java/com/java668/common/db/properties/MybatisPlusAutoFillProperties.java: -------------------------------------------------------------------------------- 1 | package com.java668.common.db.properties; 2 | 3 | import lombok.Getter; 4 | import lombok.Setter; 5 | import org.springframework.boot.context.properties.ConfigurationProperties; 6 | 7 | /** 8 | * @author Jerry.chen 9 | * @desc MybatisPlusAutoFillProperties 10 | * @date 2023/03/29 18:05 11 | **/ 12 | @Setter 13 | @Getter 14 | @ConfigurationProperties(prefix = "java668.record-platform.mybatis-plus.auto-fill") 15 | public class MybatisPlusAutoFillProperties { 16 | /** 17 | * 是否开启自动填充字段 18 | */ 19 | private Boolean enabled = true; 20 | /** 21 | * 是否开启了插入填充 22 | */ 23 | private Boolean enableInsertFill = true; 24 | /** 25 | * 是否开启了更新填充 26 | */ 27 | private Boolean enableUpdateFill = true; 28 | 29 | /** 30 | * 创建人字段名 31 | */ 32 | private String createByField = "createBy"; 33 | 34 | /** 35 | * 更新人字段名 36 | */ 37 | private String updateByField = "updateBy"; 38 | 39 | /** 40 | * 创建时间字段名 41 | */ 42 | private String createTimeField = "createTime"; 43 | 44 | /** 45 | * 更新时间字段名 46 | */ 47 | private String updateTimeField = "updateTime"; 48 | } 49 | -------------------------------------------------------------------------------- /ox-admin-common/src/main/java/com/java668/common/enums/ICommonEnum.java: -------------------------------------------------------------------------------- 1 | package com.java668.common.enums; 2 | 3 | import java.util.EnumSet; 4 | import java.util.Objects; 5 | 6 | /** 7 | * @author jerry.chen 8 | * @desc 通用枚举接口 9 | * @date 2022/11/21 16:42 10 | **/ 11 | public interface ICommonEnum { 12 | 13 | /** 14 | * 获取编码 15 | * 16 | * @Param 17 | * @return T 18 | **/ 19 | T getCode(); 20 | 21 | /** 22 | * 获取备注 23 | * 24 | * @Param 25 | * @return java.lang.String 26 | **/ 27 | String getRemark(); 28 | 29 | /** 30 | * 获取枚举 31 | * 32 | * @param item 33 | * @param clazz 34 | * @return E 35 | */ 36 | static & ICommonEnum, T> E getEnum(String item, Class clazz) { 37 | Objects.requireNonNull(item); 38 | 39 | EnumSet all = EnumSet.allOf(clazz); 40 | return all.stream().filter(e -> e.toString().equals(item)).findFirst().orElse(null); 41 | } 42 | 43 | /** 44 | * 获取枚举 45 | * 46 | * @param code 47 | * @param clazz 48 | * @return E 49 | */ 50 | static & ICommonEnum, T> E getEnum(T code, Class clazz) { 51 | Objects.requireNonNull(code); 52 | 53 | EnumSet all = EnumSet.allOf(clazz); 54 | return all.stream().filter(e -> e.getCode().equals(code)).findFirst().orElse(null); 55 | } 56 | 57 | /** 58 | * 校验枚举 59 | * 60 | * @param code 61 | * @param clazz 62 | * @return boolean 63 | */ 64 | static & ICommonEnum, T> boolean isValidCode(T code, Class clazz) { 65 | Objects.requireNonNull(code); 66 | 67 | return ICommonEnum.getEnum(code,clazz) != null; 68 | } 69 | 70 | } 71 | -------------------------------------------------------------------------------- /ox-admin-common/src/main/java/com/java668/common/enums/IResultEnum.java: -------------------------------------------------------------------------------- 1 | package com.java668.common.enums; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | /** 7 | * @author Jerry.chen 8 | * 返回状态码 9 | * 错误码为字符串类型,共 5 位,分成两个部分:错误产生来源+四位数字编号 10 | * 第一位 1:系统管理;2:代码生成;... 11 | * @desc 结果码 12 | * @date 2023/03/29 18:05 13 | **/ 14 | public interface IResultEnum { 15 | 16 | /** 17 | * 异常编码 18 | * 19 | * @return 异常编码 20 | */ 21 | int getCode(); 22 | 23 | /** 24 | * 异常消息 25 | * 26 | * @return 异常消息 27 | */ 28 | String getMessage(); 29 | 30 | } 31 | -------------------------------------------------------------------------------- /ox-admin-common/src/main/java/com/java668/common/enums/MenuTypeEnum.java: -------------------------------------------------------------------------------- 1 | package com.java668.common.enums; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | /** 7 | * @author Jerry.chen 8 | */ 9 | 10 | @Getter 11 | @AllArgsConstructor 12 | public enum MenuTypeEnum implements ICommonEnum { 13 | 14 | DIRECTORY(0, "目录"), 15 | MENU(1, "菜单"), 16 | BUTTON(2, "按钮"), 17 | ; 18 | 19 | private Integer code; 20 | 21 | private String remark; 22 | } 23 | -------------------------------------------------------------------------------- /ox-admin-common/src/main/java/com/java668/common/enums/ResultEnum.java: -------------------------------------------------------------------------------- 1 | package com.java668.common.enums; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Getter; 5 | 6 | /** 7 | * @author Jerry.chen 8 | * 返回状态码 9 | * 错误码为字符串类型,共 5 位,分成两个部分:错误产生来源+四位数字编号 10 | * 第一位 1:系统管理;2:代码生成;... 11 | * @desc 结果码 12 | * @date 2023/03/29 18:05 13 | **/ 14 | @Getter 15 | @AllArgsConstructor 16 | public enum ResultEnum implements IResultEnum { 17 | 18 | /** 19 | * 基础响应结果码 20 | */ 21 | SUCCESS(200, "成功"), 22 | BAD_REQUEST(400, "参数解析失败"), 23 | UNAUTHORIZED(401, "未认证"), 24 | FORBIDDEN(403, "未授权"), 25 | METHOD_NOT_ALLOWED(405, "不支持当前请求方法"), 26 | UNSUPPORTED_MEDIA_TYPE(415, "媒体格式类型不支持"), 27 | INTERNAL_SERVER_ERROR(500, "服务器繁忙,请稍后重试"), 28 | 29 | /** 30 | * 系统管理 业务异常错误码 31 | */ 32 | SYSTEM_DEMO_SITE_EXCEPTION(10001, "演示站点禁止使用"), 33 | 34 | 35 | 36 | /** 37 | * 代码生成 业务异常错误码 38 | */ 39 | GEN_EXCEPTION(20001, "代码生成 异常错误码"), 40 | ; 41 | 42 | private final int code; 43 | private final String message; 44 | 45 | } 46 | -------------------------------------------------------------------------------- /ox-admin-common/src/main/java/com/java668/common/exception/BaseUncheckedException.java: -------------------------------------------------------------------------------- 1 | package com.java668.common.exception; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | 5 | 6 | /** 7 | * @author Jerry.chen 8 | */ 9 | public class BaseUncheckedException extends RuntimeException { 10 | 11 | private static final long serialVersionUID = -778887391066124051L; 12 | 13 | /** 14 | * 异常信息 15 | */ 16 | private String message; 17 | 18 | /** 19 | * 具体异常码 20 | */ 21 | private int code; 22 | 23 | public BaseUncheckedException(Throwable cause) { 24 | super(cause); 25 | } 26 | 27 | public BaseUncheckedException(final int code, Throwable cause) { 28 | super(cause); 29 | this.code = code; 30 | } 31 | 32 | 33 | public BaseUncheckedException(final int code, final String message) { 34 | super(message); 35 | this.code = code; 36 | this.message = message; 37 | } 38 | 39 | public BaseUncheckedException(final int code, final String message, Throwable cause) { 40 | super(cause); 41 | this.code = code; 42 | this.message = message; 43 | } 44 | 45 | public BaseUncheckedException(final int code, final String format, Object... args) { 46 | super(StrUtil.contains(format, "{}") ? StrUtil.format(format, args) : String.format(format, args)); 47 | this.code = code; 48 | this.message = StrUtil.contains(format, "{}") ? StrUtil.format(format, args) : String.format(format, args); 49 | } 50 | 51 | 52 | @Override 53 | public String getMessage() { 54 | return message; 55 | } 56 | 57 | public int getCode() { 58 | return code; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /ox-admin-common/src/main/java/com/java668/common/exception/BizException.java: -------------------------------------------------------------------------------- 1 | package com.java668.common.exception; 2 | 3 | import com.java668.common.enums.IResultEnum; 4 | import com.java668.common.enums.ResultEnum; 5 | 6 | /** 7 | * @author Jerry.chen 8 | * @desc 业务异常 9 | * @date 2023/03/29 18:05 10 | **/ 11 | public class BizException extends BaseUncheckedException { 12 | 13 | private static final long serialVersionUID = 6610083281801529147L; 14 | 15 | public BizException(String message) { 16 | super(ResultEnum.INTERNAL_SERVER_ERROR.getCode(), message); 17 | } 18 | 19 | 20 | public BizException(int code, String message, Throwable cause) { 21 | super(code, message, cause); 22 | } 23 | 24 | public BizException(IResultEnum resultEnum) { 25 | super(resultEnum.getCode(), resultEnum.getMessage()); 26 | } 27 | 28 | } 29 | -------------------------------------------------------------------------------- /ox-admin-common/src/main/java/com/java668/common/model/BaseDTO.java: -------------------------------------------------------------------------------- 1 | package com.java668.common.model; 2 | 3 | import lombok.Data; 4 | import org.apache.commons.lang3.builder.ToStringBuilder; 5 | 6 | import java.io.Serializable; 7 | import java.lang.reflect.Field; 8 | import java.util.Date; 9 | 10 | /** 11 | * @author Jerry.chen 12 | * @desc BaseDTO 13 | * @date 2023/03/29 18:05 14 | **/ 15 | @Data 16 | public class BaseDTO implements Serializable { 17 | 18 | /** 19 | * 创建人 20 | */ 21 | private String createBy; 22 | 23 | /** 24 | * 更新人 25 | */ 26 | private String updateBy; 27 | 28 | /** 29 | * 创建时间 30 | */ 31 | private Date createTime; 32 | 33 | /** 34 | * 更新时间 35 | */ 36 | private Date updateTime; 37 | 38 | @Override 39 | public String toString() { 40 | ToStringBuilder builder = new ToStringBuilder(this); 41 | Field[] fields = this.getClass().getDeclaredFields(); 42 | try { 43 | for (Field f : fields) { 44 | f.setAccessible(true); 45 | builder.append(f.getName(), f.get(this)).append("\n"); 46 | } 47 | } catch (Exception e) { 48 | builder.append("toString builder encounter an error"); 49 | } 50 | return builder.toString(); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /ox-admin-common/src/main/java/com/java668/common/model/PageParam.java: -------------------------------------------------------------------------------- 1 | package com.java668.common.model; 2 | 3 | import cn.hutool.core.collection.CollUtil; 4 | import cn.hutool.core.util.ObjectUtil; 5 | import cn.hutool.core.util.StrUtil; 6 | import com.baomidou.mybatisplus.core.metadata.OrderItem; 7 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 8 | import lombok.Data; 9 | 10 | import java.util.List; 11 | import java.util.stream.Collectors; 12 | 13 | /** 14 | * @author Jerry.chen 15 | * @desc PageParam 16 | * @date 2023/03/29 18:58 17 | **/ 18 | @Data 19 | public class PageParam { 20 | 21 | private static final String DESCENDING = "descending"; 22 | private static final String ASCENDING = "ascending"; 23 | 24 | private Long page; 25 | 26 | private Long limit; 27 | 28 | private Boolean searchCount; 29 | 30 | private List orders; 31 | 32 | public Long getPage() { 33 | if (ObjectUtil.isNull(page)) { 34 | return 1L; 35 | } 36 | return this.page; 37 | } 38 | 39 | public Long getLimit() { 40 | if (ObjectUtil.isNull(limit)) { 41 | return 10L; 42 | } 43 | return this.limit; 44 | } 45 | 46 | public Page buildPage() { 47 | Page page = new Page<>(); 48 | List orders = this.getOrders(); 49 | if (CollUtil.isNotEmpty(orders)) { 50 | List orderItemList = orders.stream().map(this::convertOrderItem).collect(Collectors.toList()); 51 | page.setOrders(orderItemList); 52 | } 53 | page.setCurrent(this.getPage()); 54 | page.setSize(this.getLimit()); 55 | if (null != this.getSearchCount()) { 56 | page.setSearchCount(this.getSearchCount()); 57 | } 58 | return page; 59 | } 60 | 61 | private OrderItem convertOrderItem(OrderItemDTO itemDTO) { 62 | String column = StrUtil.toUnderlineCase(itemDTO.getColumn()); 63 | String order = itemDTO.getOrder(); 64 | if (StrUtil.equals(DESCENDING, order)) { 65 | return OrderItem.desc(column); 66 | } else if (StrUtil.equals(ASCENDING, order)) { 67 | return OrderItem.asc(column); 68 | } else { 69 | return null; 70 | } 71 | } 72 | 73 | @Data 74 | static class OrderItemDTO { 75 | private String column; 76 | private String order; 77 | } 78 | 79 | } -------------------------------------------------------------------------------- /ox-admin-common/src/main/java/com/java668/common/model/PageResult.java: -------------------------------------------------------------------------------- 1 | package com.java668.common.model; 2 | 3 | import cn.hutool.core.bean.BeanUtil; 4 | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Builder; 7 | import lombok.Data; 8 | import lombok.NoArgsConstructor; 9 | 10 | import java.io.Serializable; 11 | import java.util.List; 12 | 13 | /** 14 | * @author Jerry.chen 15 | * @desc 分页结果 16 | * @date 2023/03/29 18:05 17 | **/ 18 | @Data 19 | @Builder 20 | @NoArgsConstructor 21 | @AllArgsConstructor 22 | public class PageResult implements Serializable { 23 | private static final long serialVersionUID = -275582248840137389L; 24 | /** 25 | * 总数 26 | */ 27 | private Integer total; 28 | 29 | /** 30 | * 当前页结果集 31 | */ 32 | private List list; 33 | 34 | 35 | public static PageResult of(Page page, Class clazz) { 36 | List list = BeanUtil.copyToList(page.getRecords(), clazz); 37 | return PageResult.builder().list(list).total((int) page.getTotal()).build(); 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /ox-admin-common/src/main/java/com/java668/common/model/R.java: -------------------------------------------------------------------------------- 1 | package com.java668.common.model; 2 | 3 | import com.java668.common.enums.ResultEnum; 4 | import com.java668.common.exception.BizException; 5 | import com.java668.common.utils.JSONUtils; 6 | import lombok.AllArgsConstructor; 7 | import lombok.Data; 8 | import lombok.NoArgsConstructor; 9 | 10 | import java.io.Serializable; 11 | 12 | /** 13 | * @author Jerry.chen 14 | * @desc 响应结果 15 | * @date 2023/03/29 18:05 16 | **/ 17 | @Data 18 | @NoArgsConstructor 19 | @AllArgsConstructor 20 | public class R implements Serializable { 21 | 22 | private T data; 23 | private Integer code; 24 | private String message; 25 | private Boolean isSuccess; 26 | 27 | public static R succeed(String message) { 28 | return of(null, ResultEnum.SUCCESS.getCode(), message, Boolean.TRUE); 29 | } 30 | 31 | public static R succeed(T model, String message) { 32 | return of(model, ResultEnum.SUCCESS.getCode(), message, Boolean.TRUE); 33 | } 34 | 35 | public static R succeed(T model) { 36 | return of(model, ResultEnum.SUCCESS.getCode(), ResultEnum.SUCCESS.getMessage(), Boolean.TRUE); 37 | } 38 | 39 | public static R of(T data, Integer code, String message, Boolean isSuccess) { 40 | return new R(data, code, message, isSuccess); 41 | } 42 | 43 | public static R failed(String message) { 44 | return of(null, ResultEnum.INTERNAL_SERVER_ERROR.getCode(), message, Boolean.FALSE); 45 | } 46 | 47 | public static R failed(T model, String message) { 48 | return of(model, ResultEnum.INTERNAL_SERVER_ERROR.getCode(), message, Boolean.FALSE); 49 | } 50 | 51 | public static R failed(ResultEnum resultEnum) { 52 | return of(null, resultEnum.getCode(), resultEnum.getMessage(), Boolean.FALSE); 53 | } 54 | 55 | public static R failed(BizException exception) { 56 | if (exception == null) { 57 | return failed(ResultEnum.INTERNAL_SERVER_ERROR); 58 | } 59 | return of(null, exception.getCode(), exception.getMessage(), Boolean.FALSE); 60 | } 61 | 62 | public String toJsonString() { 63 | return JSONUtils.toJsonString(this); 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /ox-admin-common/src/main/java/com/java668/common/model/SysUser.java: -------------------------------------------------------------------------------- 1 | package com.java668.common.model; 2 | 3 | import lombok.Builder; 4 | import lombok.Data; 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.springframework.security.core.CredentialsContainer; 7 | import org.springframework.security.core.GrantedAuthority; 8 | import org.springframework.security.core.userdetails.UserDetails; 9 | 10 | import java.util.Collection; 11 | import java.util.Set; 12 | 13 | /** 14 | * @author Jerry.chen 15 | * @desc 登录用户对象 16 | * @date 2023/04/10 13:51 17 | **/ 18 | @Data 19 | @Slf4j 20 | @Builder 21 | public class SysUser implements UserDetails, CredentialsContainer { 22 | 23 | private Long id; 24 | private String password; 25 | private String username; 26 | private String nickName; 27 | private String avatar; 28 | private String phone; 29 | private String email; 30 | private Set authorities; 31 | private boolean accountNonExpired; 32 | private boolean accountNonLocked; 33 | private boolean credentialsNonExpired; 34 | private boolean enabled; 35 | private Set roles; 36 | private Set permissions; 37 | 38 | @Override 39 | public void eraseCredentials() { 40 | password = null; 41 | } 42 | 43 | @Override 44 | public Collection getAuthorities() { 45 | return authorities; 46 | } 47 | 48 | @Override 49 | public String getPassword() { 50 | return password; 51 | } 52 | 53 | @Override 54 | public String getUsername() { 55 | return username; 56 | } 57 | 58 | @Override 59 | public boolean isAccountNonExpired() { 60 | return accountNonExpired; 61 | } 62 | 63 | @Override 64 | public boolean isAccountNonLocked() { 65 | return accountNonLocked; 66 | } 67 | 68 | @Override 69 | public boolean isCredentialsNonExpired() { 70 | return credentialsNonExpired; 71 | } 72 | 73 | @Override 74 | public boolean isEnabled() { 75 | return enabled; 76 | } 77 | } -------------------------------------------------------------------------------- /ox-admin-common/src/main/java/com/java668/common/properties/GeneratorProperties.java: -------------------------------------------------------------------------------- 1 | package com.java668.common.properties; 2 | 3 | import lombok.Data; 4 | import org.springframework.boot.context.properties.ConfigurationProperties; 5 | import org.springframework.context.annotation.Configuration; 6 | import org.springframework.stereotype.Component; 7 | 8 | /** 9 | * @author Jerry 10 | */ 11 | @Data 12 | @Component 13 | @ConfigurationProperties(prefix = "gen") 14 | public class GeneratorProperties { 15 | 16 | /** 作者 */ 17 | private String author; 18 | 19 | /** 生成包路径 */ 20 | private String packageName; 21 | 22 | /** 自动去除表前缀,默认是false */ 23 | private Boolean autoRemovePre; 24 | 25 | /** 表前缀(类名不会包含表前缀) */ 26 | private String tablePrefix; 27 | 28 | 29 | } 30 | -------------------------------------------------------------------------------- /ox-admin-common/src/main/java/com/java668/common/properties/SystemSettingProperties.java: -------------------------------------------------------------------------------- 1 | package com.java668.common.properties; 2 | 3 | import lombok.Data; 4 | import org.springframework.boot.context.properties.ConfigurationProperties; 5 | import org.springframework.context.annotation.Configuration; 6 | import org.springframework.stereotype.Component; 7 | 8 | /** 9 | * 系统设置 10 | * @author Jerry 11 | */ 12 | @Data 13 | @Component 14 | @ConfigurationProperties(prefix = "oxadmin.system") 15 | public class SystemSettingProperties { 16 | 17 | 18 | /** 19 | * 是否是演示站点 20 | */ 21 | private Boolean isDemoSite = false; 22 | 23 | /** 24 | * 是否是演示站点 25 | */ 26 | private Boolean addressEnabled = true; 27 | 28 | } 29 | -------------------------------------------------------------------------------- /ox-admin-common/src/main/java/com/java668/common/utils/AddressUtils.java: -------------------------------------------------------------------------------- 1 | package com.java668.common.utils; 2 | 3 | import cn.hutool.core.util.StrUtil; 4 | import cn.hutool.http.HttpRequest; 5 | import com.alibaba.fastjson2.JSON; 6 | import com.alibaba.fastjson2.JSONObject; 7 | import com.google.common.collect.Maps; 8 | import com.java668.common.properties.SystemSettingProperties; 9 | import com.mzt.logapi.util.IpUtils; 10 | import org.slf4j.Logger; 11 | import org.slf4j.LoggerFactory; 12 | 13 | import java.util.Map; 14 | 15 | /** 16 | * 获取地址类 17 | * 18 | * @author ruoyi 19 | */ 20 | public class AddressUtils { 21 | private static final Logger log = LoggerFactory.getLogger(AddressUtils.class); 22 | 23 | /** 24 | * IP地址查询 25 | */ 26 | public static final String IP_URL = "http://whois.pconline.com.cn/ipJson.jsp"; 27 | 28 | /** 29 | * 未知地址 30 | */ 31 | public static final String UNKNOWN = "XX XX"; 32 | 33 | public static String getRealAddressByIP(String ip) { 34 | // 内网不查询 35 | if (IpUtils.internalIp(ip)) { 36 | return "内网IP"; 37 | } 38 | SystemSettingProperties systemSettingProperties = SpringUtils.getBean(SystemSettingProperties.class); 39 | if (systemSettingProperties.getAddressEnabled()) { 40 | try { 41 | // "ip=" + ip + "&json=true" 42 | Map paramMap = Maps.newHashMap(); 43 | paramMap.put("ip" , ip); 44 | paramMap.put("json" , true); 45 | String rspStr = HttpRequest.get(IP_URL).charset("GBK" ).form(paramMap).execute().body(); 46 | if (StrUtil.isEmpty(rspStr)) { 47 | log.error("获取地理位置异常 {}" , ip); 48 | return UNKNOWN; 49 | } 50 | JSONObject obj = JSON.parseObject(rspStr); 51 | String region = obj.getString("pro" ); 52 | String city = obj.getString("city" ); 53 | return String.format("%s %s" , region, city); 54 | } catch (Exception e) { 55 | log.error("获取地理位置异常 {}" , ip); 56 | } 57 | } 58 | return UNKNOWN; 59 | } 60 | 61 | } 62 | -------------------------------------------------------------------------------- /ox-admin-common/src/main/java/com/java668/common/utils/AuthUtils.java: -------------------------------------------------------------------------------- 1 | package com.java668.common.utils; 2 | 3 | import com.java668.common.model.SysUser; 4 | import lombok.extern.slf4j.Slf4j; 5 | import org.springframework.security.core.Authentication; 6 | import org.springframework.security.core.context.SecurityContextHolder; 7 | 8 | import java.util.Optional; 9 | 10 | /** 11 | * @author Jerry.chen 12 | * @desc 获取用户授权信息 13 | * @date 2023/04/10 12:21 14 | **/ 15 | @Slf4j 16 | public class AuthUtils { 17 | 18 | /** 19 | * 获取登录用户 20 | * 21 | * @return 22 | */ 23 | public static SysUser getCurrentUser() { 24 | Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 25 | return Optional.ofNullable(authentication).map(item -> { 26 | Object principal = item.getPrincipal(); 27 | if (principal instanceof SysUser) { 28 | return (SysUser) principal; 29 | } 30 | return null; 31 | }).orElse(null); 32 | } 33 | 34 | /** 35 | * 获取登陆的用户id 36 | * 37 | * @return 38 | */ 39 | public static Long getUserId() { 40 | SysUser currentUser = getCurrentUser(); 41 | return Optional.ofNullable(currentUser).map(SysUser::getId).orElse(null); 42 | } 43 | 44 | /** 45 | * 获取登陆的用户名 46 | * 47 | * @return 48 | */ 49 | public static String getUsername() { 50 | SysUser currentUser = getCurrentUser(); 51 | return Optional.ofNullable(currentUser).map(SysUser::getUsername).orElse(""); 52 | } 53 | 54 | } -------------------------------------------------------------------------------- /ox-admin-common/src/main/java/com/java668/common/utils/JSONUtils.java: -------------------------------------------------------------------------------- 1 | package com.java668.common.utils; 2 | 3 | import com.fasterxml.jackson.core.JsonProcessingException; 4 | import com.fasterxml.jackson.databind.ObjectMapper; 5 | 6 | /** 7 | * @author Jerry.chen 8 | * @desc jackson JSONUtil 9 | * @date 2023/03/29 18:05 10 | **/ 11 | @SuppressWarnings("all") 12 | public class JSONUtils { 13 | 14 | private static final ObjectMapper om = new ObjectMapper(); 15 | 16 | 17 | /** 18 | * jackson 转json 19 | * 20 | * @param obj 21 | * @return 22 | */ 23 | public static String toJsonString(Object obj) { 24 | try { 25 | return om.writeValueAsString(obj); 26 | } catch (JsonProcessingException e) { 27 | throw new RuntimeException(e); 28 | } 29 | } 30 | 31 | } 32 | -------------------------------------------------------------------------------- /ox-admin-common/src/main/java/com/java668/common/utils/SpringUtils.java: -------------------------------------------------------------------------------- 1 | package com.java668.common.utils; 2 | 3 | import org.springframework.context.ApplicationContext; 4 | import org.springframework.context.ApplicationContextAware; 5 | 6 | /** 7 | * @author Jerry 8 | */ 9 | public class SpringUtils implements ApplicationContextAware { 10 | private static ApplicationContext applicationContext; 11 | 12 | @SuppressWarnings("NullableProblems") 13 | @Override 14 | public void setApplicationContext(ApplicationContext applicationContext) { 15 | if (SpringUtils.applicationContext == null) { 16 | SpringUtils.applicationContext = applicationContext; 17 | } 18 | } 19 | 20 | /** 21 | * 获取applicationContext 22 | * 23 | * @return ApplicationContext 24 | */ 25 | public static ApplicationContext getApplicationContext() { 26 | return applicationContext; 27 | } 28 | 29 | //通过name获取 Bean. 30 | 31 | /** 32 | * 通过name获取 Bean 33 | * 34 | * @param Bean类型 35 | * @param name Bean名称 36 | * @return Bean 37 | */ 38 | public static T getBean(String name) { 39 | //noinspection unchecked 40 | return (T) applicationContext.getBean(name); 41 | } 42 | 43 | /** 44 | * 通过class获取Bean 45 | * 46 | * @param Bean类型 47 | * @param clazz Bean类 48 | * @return Bean对象 49 | */ 50 | public static T getBean(Class clazz) { 51 | return applicationContext.getBean(clazz); 52 | } 53 | 54 | /** 55 | * 通过name,以及Clazz返回指定的Bean 56 | * 57 | * @param bean类型 58 | * @param name Bean名称 59 | * @param clazz bean类型 60 | * @return Bean对象 61 | */ 62 | public static T getBean(String name, Class clazz) { 63 | return applicationContext.getBean(name, clazz); 64 | } 65 | 66 | public static void autowireBean(Object bean) { 67 | applicationContext.getAutowireCapableBeanFactory().autowireBean(bean); 68 | } 69 | } -------------------------------------------------------------------------------- /ox-admin-common/src/main/java/com/java668/common/web/OxWebMvcConfigurer.java: -------------------------------------------------------------------------------- 1 | package com.java668.common.web; 2 | 3 | import com.fasterxml.jackson.databind.ObjectMapper; 4 | import com.fasterxml.jackson.databind.module.SimpleModule; 5 | import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; 6 | import lombok.extern.slf4j.Slf4j; 7 | import org.springframework.core.annotation.Order; 8 | import org.springframework.http.converter.HttpMessageConverter; 9 | import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; 10 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; 11 | 12 | import java.math.BigInteger; 13 | import java.text.SimpleDateFormat; 14 | import java.time.ZoneId; 15 | import java.util.List; 16 | import java.util.TimeZone; 17 | 18 | /** 19 | * @author Jerry.chen 20 | */ 21 | @Slf4j 22 | @Order(-100) 23 | public class OxWebMvcConfigurer implements WebMvcConfigurer { 24 | 25 | /** 26 | * 添加消息转化类 27 | * 28 | * @param list 29 | */ 30 | @Override 31 | public void configureMessageConverters(List> list) { 32 | MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter(); 33 | ObjectMapper objectMapper = jsonConverter.getObjectMapper(); 34 | // 序列换成json时,将所有的long变成string 35 | SimpleModule simpleModule = new SimpleModule(); 36 | simpleModule.addSerializer(BigInteger.class, ToStringSerializer.instance); 37 | simpleModule.addSerializer(Long.class, ToStringSerializer.instance); 38 | simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance); 39 | objectMapper.registerModule(simpleModule); 40 | // 日期格式化 41 | objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); 42 | objectMapper.setTimeZone(TimeZone.getTimeZone(ZoneId.of("Asia/Shanghai"))); 43 | list.add(jsonConverter); 44 | log.info("configureMessageConverters init success"); 45 | } 46 | 47 | } 48 | 49 | -------------------------------------------------------------------------------- /ox-admin-common/src/main/resources/META-INF/spring.factories: -------------------------------------------------------------------------------- 1 | org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ 2 | com.java668.common.db.config.MybatisPlusAutoConfigure, \ 3 | com.java668.common.web.OxWebMvcConfigurer, \ 4 | com.java668.common.properties.GeneratorProperties, \ 5 | com.java668.common.utils.SpringUtils, \ 6 | com.java668.common.aop.interceptor.ApiLogAop 7 | -------------------------------------------------------------------------------- /ox-admin-common/src/test/java/com/java668/common/OxAdminCommonApplicationTests.java: -------------------------------------------------------------------------------- 1 | package com.java668.common; 2 | 3 | import org.junit.jupiter.api.Test; 4 | import org.springframework.boot.test.context.SpringBootTest; 5 | 6 | @SpringBootTest 7 | class OxAdminCommonApplicationTests { 8 | 9 | @Test 10 | void contextLoads() { 11 | } 12 | 13 | } 14 | --------------------------------------------------------------------------------