登录成功
This commit is contained in:
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,27 +1,49 @@
|
||||
17:57:55.998 [main] INFO org.xyzh.App - The following 1 profile is active: "dev"
|
||||
17:57:57.330 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8080"]
|
||||
17:57:57.332 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat]
|
||||
17:57:57.333 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.46]
|
||||
17:57:57.390 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext
|
||||
17:57:57.719 [main] WARN com.baomidou.mybatisplus.core.injector.methods.Insert - [org.xyzh.system.mapper.DepartmentMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert]
|
||||
17:57:57.744 [main] WARN com.baomidou.mybatisplus.core.injector.methods.DeleteById - [org.xyzh.system.mapper.DepartmentMapper.deleteById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.DeleteById]
|
||||
17:57:57.757 [main] WARN com.baomidou.mybatisplus.core.injector.methods.UpdateById - [org.xyzh.system.mapper.DepartmentMapper.updateById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.UpdateById]
|
||||
17:57:57.780 [main] WARN com.baomidou.mybatisplus.core.injector.methods.Insert - [org.xyzh.system.mapper.MenuMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert]
|
||||
17:57:57.797 [main] WARN com.baomidou.mybatisplus.core.injector.methods.DeleteById - [org.xyzh.system.mapper.MenuMapper.deleteById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.DeleteById]
|
||||
17:57:57.802 [main] WARN com.baomidou.mybatisplus.core.injector.methods.UpdateById - [org.xyzh.system.mapper.MenuMapper.updateById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.UpdateById]
|
||||
17:57:57.820 [main] WARN com.baomidou.mybatisplus.core.injector.methods.Insert - [org.xyzh.system.mapper.PermissionMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert]
|
||||
17:57:57.835 [main] WARN com.baomidou.mybatisplus.core.injector.methods.DeleteById - [org.xyzh.system.mapper.PermissionMapper.deleteById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.DeleteById]
|
||||
17:57:57.841 [main] WARN com.baomidou.mybatisplus.core.injector.methods.UpdateById - [org.xyzh.system.mapper.PermissionMapper.updateById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.UpdateById]
|
||||
17:57:57.858 [main] WARN com.baomidou.mybatisplus.core.injector.methods.Insert - [org.xyzh.system.mapper.RoleMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert]
|
||||
17:57:57.871 [main] WARN com.baomidou.mybatisplus.core.injector.methods.DeleteById - [org.xyzh.system.mapper.RoleMapper.deleteById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.DeleteById]
|
||||
17:57:57.876 [main] WARN com.baomidou.mybatisplus.core.injector.methods.UpdateById - [org.xyzh.system.mapper.RoleMapper.updateById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.UpdateById]
|
||||
17:57:57.893 [main] WARN com.baomidou.mybatisplus.core.injector.methods.Insert - [org.xyzh.system.mapper.UserMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert]
|
||||
17:57:57.904 [main] WARN com.baomidou.mybatisplus.core.injector.methods.DeleteById - [org.xyzh.system.mapper.UserMapper.deleteById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.DeleteById]
|
||||
17:57:57.916 [main] WARN com.baomidou.mybatisplus.core.injector.methods.UpdateById - [org.xyzh.system.mapper.UserMapper.updateById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.UpdateById]
|
||||
17:57:58.013 [main] DEBUG org.xyzh.auth.filter.JwtAuthenticationFilter - Filter 'jwtAuthenticationFilter' configured for use
|
||||
17:57:58.644 [main] INFO com.baomidou.mybatisplus.extension.spring.MybatisPlusApplicationContextAware - Register ApplicationContext instances org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@5b3a7ef5
|
||||
17:57:58.721 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...
|
||||
17:57:58.919 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@43cbafa6
|
||||
17:57:58.921 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed.
|
||||
17:58:00.104 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8080"]
|
||||
17:58:01.150 [main] INFO org.xyzh.App - Started App in 8.201 seconds (process running for 9.225)
|
||||
16:15:13.942 [main] INFO org.xyzh.App - The following 1 profile is active: "dev"
|
||||
16:15:15.663 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8080"]
|
||||
16:15:15.666 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat]
|
||||
16:15:15.666 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.46]
|
||||
16:15:15.724 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/schoolNewsServ] - Initializing Spring embedded WebApplicationContext
|
||||
16:15:16.106 [main] WARN com.baomidou.mybatisplus.core.injector.methods.Insert - [org.xyzh.system.mapper.DepartmentMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert]
|
||||
16:15:16.133 [main] WARN com.baomidou.mybatisplus.core.injector.methods.DeleteById - [org.xyzh.system.mapper.DepartmentMapper.deleteById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.DeleteById]
|
||||
16:15:16.139 [main] WARN com.baomidou.mybatisplus.core.injector.methods.UpdateById - [org.xyzh.system.mapper.DepartmentMapper.updateById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.UpdateById]
|
||||
16:15:16.160 [main] WARN com.baomidou.mybatisplus.core.injector.methods.Insert - [org.xyzh.system.mapper.MenuMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert]
|
||||
16:15:16.174 [main] WARN com.baomidou.mybatisplus.core.injector.methods.DeleteById - [org.xyzh.system.mapper.MenuMapper.deleteById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.DeleteById]
|
||||
16:15:16.177 [main] WARN com.baomidou.mybatisplus.core.injector.methods.UpdateById - [org.xyzh.system.mapper.MenuMapper.updateById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.UpdateById]
|
||||
16:15:16.209 [main] WARN com.baomidou.mybatisplus.core.injector.methods.Insert - [org.xyzh.system.mapper.PermissionMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert]
|
||||
16:15:16.228 [main] WARN com.baomidou.mybatisplus.core.injector.methods.DeleteById - [org.xyzh.system.mapper.PermissionMapper.deleteById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.DeleteById]
|
||||
16:15:16.233 [main] WARN com.baomidou.mybatisplus.core.injector.methods.UpdateById - [org.xyzh.system.mapper.PermissionMapper.updateById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.UpdateById]
|
||||
16:15:16.257 [main] WARN com.baomidou.mybatisplus.core.injector.methods.Insert - [org.xyzh.system.mapper.RoleMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert]
|
||||
16:15:16.273 [main] WARN com.baomidou.mybatisplus.core.injector.methods.DeleteById - [org.xyzh.system.mapper.RoleMapper.deleteById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.DeleteById]
|
||||
16:15:16.277 [main] WARN com.baomidou.mybatisplus.core.injector.methods.UpdateById - [org.xyzh.system.mapper.RoleMapper.updateById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.UpdateById]
|
||||
16:15:16.298 [main] WARN com.baomidou.mybatisplus.core.injector.methods.Insert - [org.xyzh.system.mapper.UserMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert]
|
||||
16:15:16.315 [main] WARN com.baomidou.mybatisplus.core.injector.methods.DeleteById - [org.xyzh.system.mapper.UserMapper.deleteById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.DeleteById]
|
||||
16:15:16.320 [main] WARN com.baomidou.mybatisplus.core.injector.methods.UpdateById - [org.xyzh.system.mapper.UserMapper.updateById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.UpdateById]
|
||||
16:15:16.451 [main] DEBUG org.xyzh.auth.filter.JwtAuthenticationFilter - Filter 'jwtAuthenticationFilter' configured for use
|
||||
16:15:17.645 [main] INFO com.baomidou.mybatisplus.extension.spring.MybatisPlusApplicationContextAware - Register ApplicationContext instances org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@60bbacfc
|
||||
16:15:17.732 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...
|
||||
16:15:17.905 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@36e358de
|
||||
16:15:17.907 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed.
|
||||
16:15:18.131 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8080"]
|
||||
16:15:18.216 [main] INFO org.xyzh.App - Started App in 5.44 seconds (process running for 6.491)
|
||||
16:15:21.207 [http-nio-8080-exec-1] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/schoolNewsServ] - Initializing Spring DispatcherServlet 'dispatcherServlet'
|
||||
16:15:21.344 [http-nio-8080-exec-1] INFO org.xyzh.system.user.service.impl.SysUserServiceImpl - 开始根据过滤条件查询用户:TbSysUser{id=null, username='null', password='null', email='3223905473@qq.com', phone='null', wechatID='null', status=null, createTime=null, updateTime=null, deleteTime=null, deleted=false}
|
||||
16:15:21.399 [http-nio-8080-exec-1] DEBUG org.xyzh.system.mapper.UserMapper.selectByFilter - ==> Preparing: SELECT id, username, password, email, phone, wechat_id, create_time, update_time, delete_time, deleted, status FROM tb_sys_user WHERE deleted = 0 AND email = ? LIMIT 1
|
||||
16:15:21.424 [http-nio-8080-exec-1] DEBUG org.xyzh.system.mapper.UserMapper.selectByFilter - ==> Parameters: 3223905473@qq.com(String)
|
||||
16:15:21.449 [http-nio-8080-exec-1] DEBUG org.xyzh.system.mapper.UserMapper.selectByFilter - <== Total: 1
|
||||
16:15:21.452 [http-nio-8080-exec-1] INFO org.xyzh.system.user.service.impl.SysUserServiceImpl - 根据过滤条件查询用户完成:TbSysUser{id=null, username='null', password='null', email='3223905473@qq.com', phone='null', wechatID='null', status=null, createTime=null, updateTime=null, deleteTime=null, deleted=false}
|
||||
16:15:21.518 [http-nio-8080-exec-1] INFO org.xyzh.auth.strategy.impl.PasswordLoginStrategy - $2a$10$kxhNI7a89B6ODU/vxe9LseKEUgjtHwegZkQAjwjKr1Lv.M3s8t3iq
|
||||
16:15:24.471 [http-nio-8080-exec-1] INFO org.xyzh.system.role.service.impl.SysRoleServiceImpl - 开始根据用户ID查询部门角色列表:1
|
||||
16:15:24.473 [http-nio-8080-exec-1] DEBUG org.xyzh.system.mapper.RoleMapper.selectDeptRolesByUserId - ==> Preparing: SELECT dr.id, dr.dept_id, dr.role_id, r.name as role_name, d.name as dept_name, r.description as role_description, d.description as dept_description, r.creator as role_creator, d.creator as dept_creator, r.updater as role_updater, d.updater as dept_updater, r.create_time as role_create_time, d.create_time as dept_create_time, r.update_time as role_update_time, d.update_time as dept_update_time, r.delete_time as role_delete_time, d.delete_time as dept_delete_time, r.deleted as role_deleted, d.deleted as dept_deleted FROM tb_sys_user_dept_role dr INNER JOIN tb_sys_role r ON r.role_id = dr.role_id INNER JOIN tb_sys_dept d ON d.dept_id = dr.dept_id WHERE dr.deleted = 0 AND dr.user_id = ? ORDER BY dr.create_time ASC
|
||||
16:15:24.474 [http-nio-8080-exec-1] DEBUG org.xyzh.system.mapper.RoleMapper.selectDeptRolesByUserId - ==> Parameters: 1(String)
|
||||
16:15:24.476 [http-nio-8080-exec-1] DEBUG org.xyzh.system.mapper.RoleMapper.selectDeptRolesByUserId - <== Total: 1
|
||||
16:15:24.476 [http-nio-8080-exec-1] INFO org.xyzh.system.role.service.impl.SysRoleServiceImpl - 根据用户ID查询部门角色列表完成,共找到1个部门角色
|
||||
16:15:24.751 [http-nio-8080-exec-1] INFO org.xyzh.system.permission.service.impl.SysPermissionServiceImpl - 开始根据用户ID查询权限列表:1
|
||||
16:15:24.752 [http-nio-8080-exec-1] DEBUG org.xyzh.system.mapper.PermissionMapper.selectPermissionsByUserId - ==> Preparing: SELECT DISTINCT p.id, p.permission_id, p.name, p.code, p.description, p.creator, p.updater, p.create_time, p.update_time, p.delete_time, p.deleted FROM tb_sys_user_dept_role ur INNER JOIN tb_sys_role_permission rp ON rp.role_id = ur.role_id INNER JOIN tb_sys_permission p ON p.permission_id = rp.permission_id WHERE p.deleted = 0 AND rp.deleted = 0 AND ur.deleted = 0 AND ur.user_id = ? ORDER BY p.create_time ASC
|
||||
16:15:24.753 [http-nio-8080-exec-1] DEBUG org.xyzh.system.mapper.PermissionMapper.selectPermissionsByUserId - ==> Parameters: 1(String)
|
||||
16:15:24.756 [http-nio-8080-exec-1] DEBUG org.xyzh.system.mapper.PermissionMapper.selectPermissionsByUserId - <== Total: 4
|
||||
16:15:24.756 [http-nio-8080-exec-1] INFO org.xyzh.system.permission.service.impl.SysPermissionServiceImpl - 根据用户ID查询权限列表完成,共找到4个权限
|
||||
16:15:25.107 [http-nio-8080-exec-1] INFO org.xyzh.system.menu.service.impl.SysMenuServiceImpl - 开始根据用户ID查询菜单列表:1
|
||||
16:15:25.108 [http-nio-8080-exec-1] DEBUG org.xyzh.system.mapper.MenuMapper.selectMenusByUserId - ==> Preparing: SELECT DISTINCT m.id, m.menu_id, m.name, m.parent_id, m.url, m.icon, m.order_num, m.type, m.creator, m.updater, m.create_time, m.update_time, m.delete_time, m.deleted FROM tb_sys_user_dept_role ur INNER JOIN tb_sys_role_permission rp ON rp.role_id = ur.role_id INNER JOIN tb_sys_menu_permission mp ON mp.permission_id = rp.permission_id INNER JOIN tb_sys_menu m ON m.menu_id = mp.menu_id WHERE m.deleted = 0 AND rp.deleted = 0 AND mp.deleted = 0 AND ur.deleted = 0 AND ur.user_id = ? ORDER BY m.create_time ASC
|
||||
16:15:25.108 [http-nio-8080-exec-1] DEBUG org.xyzh.system.mapper.MenuMapper.selectMenusByUserId - ==> Parameters: 1(String)
|
||||
16:15:25.111 [http-nio-8080-exec-1] DEBUG org.xyzh.system.mapper.MenuMapper.selectMenusByUserId - <== Total: 5
|
||||
16:15:25.112 [http-nio-8080-exec-1] INFO org.xyzh.system.menu.service.impl.SysMenuServiceImpl - 根据用户ID查询菜单列表完成,共找到5个菜单
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,11 @@
|
||||
server:
|
||||
port: 8080
|
||||
servlet:
|
||||
context-path: /schoolNewsServ
|
||||
encoding:
|
||||
charset: UTF-8
|
||||
enabled: true
|
||||
force: true
|
||||
spring:
|
||||
application:
|
||||
name: school-news-admin
|
||||
@@ -17,6 +23,33 @@ spring:
|
||||
idle-timeout: 600000
|
||||
max-lifetime: 1800000
|
||||
|
||||
# Redis配置
|
||||
data:
|
||||
redis:
|
||||
# Redis服务器地址
|
||||
host: localhost
|
||||
# Redis服务器端口
|
||||
port: 6379
|
||||
# Redis密码(如果没有设置密码,可以留空或注释掉)
|
||||
password: 123456
|
||||
# Redis数据库索引(0-15,默认为0)
|
||||
database: 0
|
||||
# 连接超时时间(毫秒)
|
||||
timeout: 10000
|
||||
# Lettuce连接池配置
|
||||
lettuce:
|
||||
pool:
|
||||
# 连接池最大连接数
|
||||
max-active: 50
|
||||
# 连接池最大阻塞等待时间(负值表示没有限制)
|
||||
max-wait: 3000
|
||||
# 连接池中的最大空闲连接
|
||||
max-idle: 20
|
||||
# 连接池中的最小空闲连接
|
||||
min-idle: 5
|
||||
# 关闭超时时间
|
||||
shutdown-timeout: 100ms
|
||||
|
||||
# 认证配置
|
||||
school-news:
|
||||
auth:
|
||||
@@ -71,11 +104,9 @@ mybatis-plus:
|
||||
# 日志配置
|
||||
logging:
|
||||
config: classpath:log4j2-spring.xml
|
||||
level:
|
||||
org.xyzh: DEBUG
|
||||
org.xyzh.auth: DEBUG
|
||||
org.xyzh.system: DEBUG
|
||||
org.xyzh.news: DEBUG
|
||||
charset:
|
||||
console: UTF-8
|
||||
file: UTF-8
|
||||
|
||||
# 管理端点配置
|
||||
management:
|
||||
@@ -86,13 +117,4 @@ management:
|
||||
endpoint:
|
||||
health:
|
||||
show-details: when-authorized
|
||||
|
||||
# 文档配置
|
||||
springdoc:
|
||||
api-docs:
|
||||
path: /v3/api-docs
|
||||
swagger-ui:
|
||||
path: /swagger-ui.html
|
||||
tags-sorter: alpha
|
||||
operations-sorter: alpha
|
||||
debug: true
|
||||
|
||||
@@ -14,27 +14,32 @@
|
||||
<property name="FILE_PATH" value="./logs" />
|
||||
<!-- Admin模块日志文件名 -->
|
||||
<property name="FILE_NAME" value="school-news-admin" />
|
||||
<!-- 设置系统属性 -->
|
||||
<property name="file.encoding" value="UTF-8" />
|
||||
<property name="console.encoding" value="UTF-8" />
|
||||
<property name="stdout.encoding" value="UTF-8" />
|
||||
<property name="stderr.encoding" value="UTF-8" />
|
||||
</Properties>
|
||||
|
||||
<appenders>
|
||||
|
||||
<console name="Console" target="SYSTEM_OUT">
|
||||
<!--输出日志的格式-->
|
||||
<PatternLayout pattern="${LOG_PATTERN}"/>
|
||||
<!--控制台只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
|
||||
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||
<!--控制台输出debug及以上级别的信息-->
|
||||
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||
</console>
|
||||
|
||||
<!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,适合临时测试用-->
|
||||
<File name="Filelog" fileName="${FILE_PATH}/${FILE_NAME}-test.log" append="false">
|
||||
<PatternLayout pattern="${LOG_PATTERN}"/>
|
||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||
</File>
|
||||
|
||||
<!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
|
||||
<RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/${FILE_NAME}-info.log" filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
|
||||
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
|
||||
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||
<PatternLayout pattern="${LOG_PATTERN}"/>
|
||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||
<Policies>
|
||||
<!--interval属性用来指定多久滚动一次,默认是1 hour-->
|
||||
<TimeBasedTriggeringPolicy interval="1"/>
|
||||
@@ -48,7 +53,7 @@
|
||||
<RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/${FILE_NAME}-warn.log" filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz">
|
||||
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
|
||||
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||
<PatternLayout pattern="${LOG_PATTERN}"/>
|
||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||
<Policies>
|
||||
<!--interval属性用来指定多久滚动一次,默认是1 hour-->
|
||||
<TimeBasedTriggeringPolicy interval="1"/>
|
||||
@@ -62,7 +67,7 @@
|
||||
<RollingFile name="RollingFileError" fileName="${FILE_PATH}/${FILE_NAME}-error.log" filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
|
||||
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
|
||||
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||
<PatternLayout pattern="${LOG_PATTERN}"/>
|
||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||
<Policies>
|
||||
<!--interval属性用来指定多久滚动一次,默认是1 hour-->
|
||||
<TimeBasedTriggeringPolicy interval="1"/>
|
||||
|
||||
@@ -3,6 +3,8 @@ package org.xyzh.api.auth.login;
|
||||
import org.xyzh.common.core.domain.LoginParam;
|
||||
import org.xyzh.common.core.domain.LoginDomain;
|
||||
import org.xyzh.common.core.domain.ResultDomain;
|
||||
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
/**
|
||||
* @description LoginService.java文件描述 登录服务接口
|
||||
* @filename LoginService.java
|
||||
@@ -15,11 +17,11 @@ public interface LoginService {
|
||||
/**
|
||||
* @description 登录
|
||||
* @param loginParam 登录参数
|
||||
* @return ResultDomain<String> 返回结果
|
||||
* @return ResultDomain<LoginDomain> 返回结果
|
||||
* @author yslg
|
||||
* @since 2025-09-28
|
||||
*/
|
||||
ResultDomain<String> login(LoginParam loginParam);
|
||||
ResultDomain<LoginDomain> login(LoginParam loginParam, HttpServletRequest request);
|
||||
|
||||
/**
|
||||
* @description 退出登录
|
||||
|
||||
@@ -2,6 +2,7 @@ package org.xyzh.api.system.role;
|
||||
|
||||
import org.xyzh.common.core.domain.ResultDomain;
|
||||
import org.xyzh.common.dto.role.TbSysRole;
|
||||
import org.xyzh.common.vo.DeptRoleVO;
|
||||
|
||||
|
||||
/**
|
||||
@@ -31,13 +32,13 @@ public interface RoleService {
|
||||
ResultDomain<TbSysRole> getRoleById(String roleId);
|
||||
|
||||
/**
|
||||
* @description 根据用户ID查询角色列表
|
||||
* @description 根据用户ID查询部门角色列表
|
||||
* @param userId 用户ID
|
||||
* @return ResultDomain<TbSysRole> 角色列表
|
||||
* @return ResultDomain<DeptRoleVO> 角色列表
|
||||
* @author yslg
|
||||
* @since 2025-09-28
|
||||
*/
|
||||
ResultDomain<TbSysRole> getRolesByUserId(String userId);
|
||||
ResultDomain<DeptRoleVO> getDeptRolesByUserId(String userId);
|
||||
|
||||
/**
|
||||
* @description 创建角色
|
||||
|
||||
@@ -5,6 +5,7 @@ import java.util.List;
|
||||
|
||||
import org.xyzh.common.core.domain.ResultDomain;
|
||||
import org.xyzh.common.dto.user.TbSysUser;
|
||||
import org.xyzh.common.dto.user.TbSysUserInfo;
|
||||
|
||||
/**
|
||||
* @description UserRemoteService.java文件描述 用户远程服务接口
|
||||
@@ -32,6 +33,15 @@ public interface UserService {
|
||||
*/
|
||||
ResultDomain<TbSysUser> getUserById(String userId);
|
||||
|
||||
/**
|
||||
* @description 根据用户ID查询用户信息
|
||||
* @param userId 用户ID
|
||||
* @return ResultDomain<TbSysUserInfo> 用户信息
|
||||
* @author yslg
|
||||
* @since 2025-10-06
|
||||
*/
|
||||
ResultDomain<TbSysUserInfo> getUserInfoById(String userId);
|
||||
|
||||
/**
|
||||
* @description 根据用户名查询用户
|
||||
* @param username 用户名
|
||||
|
||||
@@ -90,7 +90,6 @@
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-log4j2</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- JWT 依赖 -->
|
||||
<dependency>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
|
||||
@@ -8,6 +8,8 @@ import org.xyzh.common.core.domain.LoginDomain;
|
||||
import org.xyzh.common.core.domain.ResultDomain;
|
||||
import org.xyzh.common.utils.IDUtils;
|
||||
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
|
||||
/**
|
||||
* @description AuthController.java文件描述 认证控制器
|
||||
* @filename AuthController.java
|
||||
@@ -25,13 +27,13 @@ public class AuthController {
|
||||
/**
|
||||
* @description 用户登录
|
||||
* @param loginParam 登录参数
|
||||
* @return ResultDomain<String> 登录结果
|
||||
* @return ResultDomain<LoginDomain> 登录结果
|
||||
* @author yslg
|
||||
* @since 2025-09-28
|
||||
*/
|
||||
@PostMapping("/login")
|
||||
public ResultDomain<String> login(@RequestBody LoginParam loginParam) {
|
||||
return loginService.login(loginParam);
|
||||
public ResultDomain<LoginDomain> login(@RequestBody LoginParam loginParam, HttpServletRequest request) {
|
||||
return loginService.login(loginParam, request);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
package org.xyzh.auth.security;
|
||||
|
||||
import io.jsonwebtoken.Claims;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.xyzh.auth.util.JwtTokenUtil;
|
||||
import org.xyzh.common.core.security.TokenParser;
|
||||
|
||||
/**
|
||||
* @description JwtTokenParser.java文件描述 JWT令牌解析器实现类
|
||||
* @filename JwtTokenParser.java
|
||||
* @author yslg
|
||||
* @copyright xyzh
|
||||
* @since 2025-10-06
|
||||
*/
|
||||
@Component
|
||||
public class JwtTokenParser implements TokenParser {
|
||||
|
||||
private final JwtTokenUtil jwtTokenUtil;
|
||||
|
||||
/**
|
||||
* Spring会自动注入,无需@Autowired注解
|
||||
*/
|
||||
public JwtTokenParser(JwtTokenUtil jwtTokenUtil) {
|
||||
this.jwtTokenUtil = jwtTokenUtil;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getUserIdFromToken(String token) {
|
||||
return jwtTokenUtil.getUserIdFromToken(token);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Claims getAllClaimsFromToken(String token) {
|
||||
return jwtTokenUtil.getAllClaimsFromToken(token);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean validateToken(String token, String userId) {
|
||||
return jwtTokenUtil.validateToken(token, userId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isTokenExpired(String token) {
|
||||
return jwtTokenUtil.isTokenExpired(token);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,15 +11,25 @@ import org.xyzh.common.core.domain.LoginParam;
|
||||
import org.xyzh.common.core.domain.LoginDomain;
|
||||
import org.xyzh.common.core.domain.ResultDomain;
|
||||
import org.xyzh.common.core.enums.UserStatus;
|
||||
import org.xyzh.common.dto.permission.TbSysPermission;
|
||||
import org.xyzh.common.dto.user.TbSysUser;
|
||||
import org.xyzh.common.dto.log.TbSysLoginLog;
|
||||
import org.xyzh.common.dto.menu.TbSysMenu;
|
||||
import org.xyzh.common.exception.auth.AuthException;
|
||||
import org.xyzh.common.utils.IDUtils;
|
||||
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
|
||||
import org.xyzh.api.system.user.UserService;
|
||||
import org.xyzh.api.system.role.RoleService;
|
||||
import org.xyzh.api.system.permission.PermissionService;
|
||||
import org.xyzh.common.redis.service.RedisService;
|
||||
import org.xyzh.api.system.menu.MenuService;
|
||||
import org.xyzh.common.vo.DeptRoleVO;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
@@ -38,12 +48,18 @@ public class LoginServiceImpl implements LoginService {
|
||||
@Autowired
|
||||
private UserService userService;
|
||||
|
||||
@Autowired(required = false)
|
||||
@Autowired
|
||||
private RoleService roleService;
|
||||
|
||||
@Autowired(required = false)
|
||||
@Autowired
|
||||
private PermissionService permissionService;
|
||||
|
||||
@Autowired
|
||||
private MenuService menuService;
|
||||
|
||||
@Autowired
|
||||
private RedisService redisService;
|
||||
|
||||
@Autowired
|
||||
private JwtTokenUtil jwtTokenUtil;
|
||||
|
||||
@@ -51,9 +67,9 @@ public class LoginServiceImpl implements LoginService {
|
||||
private LoginLogService loginLogService;
|
||||
|
||||
@Override
|
||||
public ResultDomain<String> login(LoginParam loginParam) {
|
||||
ResultDomain<String> result = new ResultDomain<>();
|
||||
|
||||
public ResultDomain<LoginDomain> login(LoginParam loginParam, HttpServletRequest request) {
|
||||
ResultDomain<LoginDomain> result = new ResultDomain<>();
|
||||
String ipAddress = request.getRemoteAddr();
|
||||
try {
|
||||
// 自动检测登录类型
|
||||
String loginType = detectLoginType(loginParam);
|
||||
@@ -84,24 +100,40 @@ public class LoginServiceImpl implements LoginService {
|
||||
return result;
|
||||
}
|
||||
|
||||
// 验证密码
|
||||
if (!strategy.verifyPassword(loginParam.getPassword(), user.getPassword())) {
|
||||
if (loginType.equals("password")) {
|
||||
// 验证凭据(密码或验证码)
|
||||
if (!strategy.verifyCredential(loginParam.getPassword(), user.getPassword())) {
|
||||
result.fail("密码错误");
|
||||
logLoginAttempt(loginParam, user, false, "密码错误");
|
||||
return result;
|
||||
}
|
||||
}
|
||||
else {
|
||||
// 验证凭据(验证码)
|
||||
String storedCaptcha = (String) redisService.get("captcha:" + loginParam.getPhone());
|
||||
if (!strategy.verifyCredential(loginParam.getCaptcha(), storedCaptcha)) {
|
||||
result.fail("验证码错误");
|
||||
logLoginAttempt(loginParam, user, false, "验证码错误");
|
||||
return result;
|
||||
}
|
||||
// 验证码使用后删除
|
||||
redisService.delete("captcha:" + loginParam.getPhone());
|
||||
}
|
||||
|
||||
// 构建登录域对象
|
||||
LoginDomain loginDomain = buildLoginDomain(user, loginType);
|
||||
|
||||
LoginDomain loginDomain = buildLoginDomain(user, loginType, ipAddress);
|
||||
// 生成JWT令牌
|
||||
String token = jwtTokenUtil.generateToken(loginDomain);
|
||||
loginDomain.setToken(jwtTokenUtil.generateToken(loginDomain));
|
||||
|
||||
// 将LoginDomain存储到Redis中
|
||||
String redisKey = "login:token:" + user.getID();
|
||||
redisService.set(redisKey, loginDomain, 24 * 60 * 60, TimeUnit.SECONDS);
|
||||
|
||||
// 记录成功登录日志
|
||||
logLoginAttempt(loginParam, user, true, "登录成功");
|
||||
|
||||
result.success("登录成功", (String)null);
|
||||
result.setData(token);
|
||||
result.success("登录成功", loginDomain);
|
||||
result.setData(loginDomain);
|
||||
|
||||
} catch (AuthException e) {
|
||||
result.fail(e.getMessage());
|
||||
@@ -139,7 +171,9 @@ public class LoginServiceImpl implements LoginService {
|
||||
if (StringUtils.hasText(loginParam.getLoginType())) {
|
||||
return loginParam.getLoginType();
|
||||
}
|
||||
|
||||
if (StringUtils.hasText(loginParam.getPassword())) {
|
||||
return "password";
|
||||
}
|
||||
if (StringUtils.hasText(loginParam.getEmail())) {
|
||||
return "email";
|
||||
}
|
||||
@@ -164,35 +198,47 @@ public class LoginServiceImpl implements LoginService {
|
||||
* @author yslg
|
||||
* @since 2025-09-28
|
||||
*/
|
||||
private LoginDomain buildLoginDomain(TbSysUser user, String loginType) {
|
||||
private LoginDomain buildLoginDomain(TbSysUser user, String loginType, String ipAddress) {
|
||||
LoginDomain loginDomain = new LoginDomain();
|
||||
loginDomain.setUser(user);
|
||||
loginDomain.setLoginType(loginType);
|
||||
loginDomain.setLoginTime(new Date());
|
||||
|
||||
loginDomain.setIpAddress(ipAddress);
|
||||
// 获取用户角色和权限(如果服务可用)
|
||||
if (roleService != null) {
|
||||
try {
|
||||
// TODO: 需要在RoleService中实现findRolesByUserId方法
|
||||
// loginDomain.setRoles(roleService.findRolesByUserId(user.getID()));
|
||||
loginDomain.setRoles(new ArrayList<>());
|
||||
} catch (Exception e) {
|
||||
ResultDomain<DeptRoleVO> resultDomain = roleService.getDeptRolesByUserId(user.getID());
|
||||
if (resultDomain.isSuccess()) {
|
||||
List<DeptRoleVO> roles = resultDomain.getDataList();
|
||||
loginDomain.setRoles(roles);
|
||||
} else {
|
||||
loginDomain.setRoles(new ArrayList<>());
|
||||
}
|
||||
} else {
|
||||
} catch (Exception e) {
|
||||
loginDomain.setRoles(new ArrayList<>());
|
||||
}
|
||||
|
||||
if (permissionService != null) {
|
||||
try {
|
||||
// TODO: 需要在PermissionService中实现findPermissionsByUserId方法
|
||||
// loginDomain.setPermissions(permissionService.findPermissionsByUserId(user.getID()));
|
||||
ResultDomain<TbSysPermission> resultDomain = permissionService.getPermissionsByUserId(user.getID());
|
||||
if (resultDomain.isSuccess()) {
|
||||
List<TbSysPermission> permissions = resultDomain.getDataList();
|
||||
loginDomain.setPermissions(permissions);
|
||||
} else {
|
||||
loginDomain.setPermissions(new ArrayList<>());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
loginDomain.setPermissions(new ArrayList<>());
|
||||
}
|
||||
|
||||
try {
|
||||
ResultDomain<TbSysMenu> resultDomain = menuService.getMenusByUserId(user.getID());
|
||||
if (resultDomain.isSuccess()) {
|
||||
List<TbSysMenu> menus = resultDomain.getDataList();
|
||||
loginDomain.setMenus(menus);
|
||||
} else {
|
||||
loginDomain.setPermissions(new ArrayList<>());
|
||||
loginDomain.setMenus(new ArrayList<>());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
loginDomain.setMenus(new ArrayList<>());
|
||||
}
|
||||
|
||||
return loginDomain;
|
||||
|
||||
@@ -39,12 +39,12 @@ public interface LoginStrategy {
|
||||
TbSysUser findUser(LoginParam loginParam);
|
||||
|
||||
/**
|
||||
* @description 验证密码
|
||||
* @param inputPassword 输入密码
|
||||
* @param storedPassword 存储密码
|
||||
* @description 验证凭据(密码或验证码)
|
||||
* @param inputCredential 输入凭据(密码或验证码)
|
||||
* @param storedCredential 存储凭据(密码或验证码)
|
||||
* @return boolean 是否匹配
|
||||
* @author yslg
|
||||
* @since 2025-09-28
|
||||
*/
|
||||
boolean verifyPassword(String inputPassword, String storedPassword);
|
||||
boolean verifyCredential(String inputCredential, String storedCredential);
|
||||
}
|
||||
@@ -43,7 +43,7 @@ public class EmailLoginStrategy implements LoginStrategy {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean verifyPassword(String inputPassword, String storedPassword) {
|
||||
return passwordEncoder.matches(inputPassword, storedPassword);
|
||||
public boolean verifyCredential(String inputCredential, String storedCredential) {
|
||||
return passwordEncoder.matches(inputCredential, storedCredential);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
package org.xyzh.auth.strategy.impl;
|
||||
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.xyzh.auth.strategy.LoginStrategy;
|
||||
import org.xyzh.common.core.domain.LoginParam;
|
||||
import org.xyzh.common.dto.user.TbSysUser;
|
||||
import org.xyzh.common.utils.NonUtils;
|
||||
import org.xyzh.api.system.user.UserService;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* @description PasswordLoginStrategy.java文件描述 密码登录策略
|
||||
* @filename PasswordLoginStrategy.java
|
||||
* @author yslg
|
||||
* @copyright xyzh
|
||||
* @since 2025-09-28
|
||||
*/
|
||||
@Component
|
||||
public class PasswordLoginStrategy implements LoginStrategy {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(PasswordLoginStrategy.class);
|
||||
|
||||
@Autowired
|
||||
private UserService userService;
|
||||
|
||||
@Autowired
|
||||
private PasswordEncoder passwordEncoder;
|
||||
|
||||
@Override
|
||||
public String getLoginType() {
|
||||
return "password";
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean validate(LoginParam loginParam) {
|
||||
if (NonUtils.isEmpty(loginParam.getPassword())) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (NonUtils.isEmpty(loginParam.getUsername()) && NonUtils.isEmpty(loginParam.getEmail()) && NonUtils.isEmpty(loginParam.getPhone())) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TbSysUser findUser(LoginParam loginParam) {
|
||||
TbSysUser filter = new TbSysUser();
|
||||
if (NonUtils.isNotEmpty(loginParam.getUsername())) {
|
||||
filter.setUsername(loginParam.getUsername());
|
||||
}
|
||||
if (NonUtils.isNotEmpty(loginParam.getEmail())) {
|
||||
filter.setEmail(loginParam.getEmail());
|
||||
}
|
||||
if (NonUtils.isNotEmpty(loginParam.getPhone())) {
|
||||
filter.setPhone(loginParam.getPhone());
|
||||
}
|
||||
return userService.getUserByFilter(filter).getData();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean verifyCredential(String inputCredential, String storedCredential) {
|
||||
logger.info(passwordEncoder.encode(inputCredential));
|
||||
return passwordEncoder.matches(inputCredential, storedCredential);
|
||||
}
|
||||
}
|
||||
@@ -43,11 +43,11 @@ public class PhoneLoginStrategy implements LoginStrategy {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean verifyPassword(String inputPassword, String storedPassword) {
|
||||
public boolean verifyCredential(String inputCredential, String storedCredential) {
|
||||
// 手机号登录可能使用验证码,如果有验证码则跳过密码验证
|
||||
if (inputPassword == null) {
|
||||
if (inputCredential == null) {
|
||||
return true; // 假设验证码已经在其他地方验证过了
|
||||
}
|
||||
return passwordEncoder.matches(inputPassword, storedPassword);
|
||||
return passwordEncoder.matches(inputCredential, storedCredential);
|
||||
}
|
||||
}
|
||||
@@ -43,7 +43,7 @@ public class UsernameLoginStrategy implements LoginStrategy {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean verifyPassword(String inputPassword, String storedPassword) {
|
||||
return passwordEncoder.matches(inputPassword, storedPassword);
|
||||
public boolean verifyCredential(String inputCredential, String storedCredential) {
|
||||
return passwordEncoder.matches(inputCredential, storedCredential);
|
||||
}
|
||||
}
|
||||
@@ -39,7 +39,7 @@ public class WechatLoginStrategy implements LoginStrategy {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean verifyPassword(String inputPassword, String storedPassword) {
|
||||
public boolean verifyCredential(String inputCredential, String storedCredential) {
|
||||
// 微信登录通常不需要密码验证,通过微信授权码验证
|
||||
// 这里可以添加微信授权验证逻辑
|
||||
return true;
|
||||
|
||||
@@ -5,6 +5,21 @@ spring:
|
||||
application:
|
||||
name: school-news-auth
|
||||
|
||||
# Redis配置
|
||||
data:
|
||||
redis:
|
||||
host: localhost
|
||||
port: 6379
|
||||
password:
|
||||
database: 0
|
||||
timeout: 5000ms
|
||||
lettuce:
|
||||
pool:
|
||||
max-active: 8
|
||||
max-wait: -1ms
|
||||
max-idle: 8
|
||||
min-idle: 0
|
||||
|
||||
datasource:
|
||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||
url: jdbc:mysql://localhost:3306/school_news?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
|
||||
|
||||
@@ -12,27 +12,29 @@
|
||||
<!-- 定义日志存储的路径 -->
|
||||
<property name="FILE_PATH" value="./logs" />
|
||||
<property name="FILE_NAME" value="school-news-auth" />
|
||||
<property name="file.encoding" value="UTF-8" />
|
||||
<property name="console.encoding" value="UTF-8" />
|
||||
</Properties>
|
||||
|
||||
<appenders>
|
||||
|
||||
<console name="Console" target="SYSTEM_OUT">
|
||||
<!--输出日志的格式-->
|
||||
<PatternLayout pattern="${LOG_PATTERN}"/>
|
||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||
<!--控制台只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
|
||||
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||
</console>
|
||||
|
||||
<!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,适合临时测试用-->
|
||||
<File name="Filelog" fileName="${FILE_PATH}/test.log" append="false">
|
||||
<PatternLayout pattern="${LOG_PATTERN}"/>
|
||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||
</File>
|
||||
|
||||
<!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
|
||||
<RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/info.log" filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
|
||||
<RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/${FILE_NAME}-info.log" filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
|
||||
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
|
||||
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||
<PatternLayout pattern="${LOG_PATTERN}"/>
|
||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||
<Policies>
|
||||
<!--interval属性用来指定多久滚动一次,默认是1 hour-->
|
||||
<TimeBasedTriggeringPolicy interval="1"/>
|
||||
@@ -43,10 +45,10 @@
|
||||
</RollingFile>
|
||||
|
||||
<!-- 这个会打印出所有的warn及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
|
||||
<RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/warn.log" filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz">
|
||||
<RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/${FILE_NAME}-warn.log" filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz">
|
||||
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
|
||||
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||
<PatternLayout pattern="${LOG_PATTERN}"/>
|
||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||
<Policies>
|
||||
<!--interval属性用来指定多久滚动一次,默认是1 hour-->
|
||||
<TimeBasedTriggeringPolicy interval="1"/>
|
||||
@@ -57,10 +59,10 @@
|
||||
</RollingFile>
|
||||
|
||||
<!-- 这个会打印出所有的error及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
|
||||
<RollingFile name="RollingFileError" fileName="${FILE_PATH}/error.log" filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
|
||||
<RollingFile name="RollingFileError" fileName="${FILE_PATH}/${FILE_NAME}-error.log" filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
|
||||
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
|
||||
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||
<PatternLayout pattern="${LOG_PATTERN}"/>
|
||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||
<Policies>
|
||||
<!--interval属性用来指定多久滚动一次,默认是1 hour-->
|
||||
<TimeBasedTriggeringPolicy interval="1"/>
|
||||
|
||||
@@ -18,4 +18,35 @@
|
||||
<maven.compiler.target>21</maven.compiler.target>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<!-- Spring Web MVC -->
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-webmvc</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- Spring Context -->
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-context</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- Common Core dependency -->
|
||||
<dependency>
|
||||
<groupId>org.xyzh</groupId>
|
||||
<artifactId>common-core</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- Common Util dependency -->
|
||||
<dependency>
|
||||
<groupId>org.xyzh</groupId>
|
||||
<artifactId>common-util</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- Common Redis dependency -->
|
||||
<dependency>
|
||||
<groupId>org.xyzh</groupId>
|
||||
<artifactId>common-redis</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
@@ -1,7 +0,0 @@
|
||||
package org.xyzh;
|
||||
|
||||
public class Main {
|
||||
public static void main(String[] args) {
|
||||
System.out.println("Hello world!");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
package org.xyzh.common.annotation;
|
||||
|
||||
import java.lang.annotation.*;
|
||||
|
||||
/**
|
||||
* @description HttpLogin.java文件描述 HTTP登录注解
|
||||
* @filename HttpLogin.java
|
||||
* @author yslg
|
||||
* @copyright xyzh
|
||||
* @since 2025-10-06
|
||||
*/
|
||||
@Target(ElementType.PARAMETER)
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Documented
|
||||
public @interface HttpLogin {
|
||||
|
||||
/**
|
||||
* @description 是否必需,默认为true
|
||||
* @return boolean
|
||||
* @author yslg
|
||||
* @since 2025-10-06
|
||||
*/
|
||||
boolean required() default true;
|
||||
|
||||
/**
|
||||
* @description 当token无效时的错误消息
|
||||
* @return String
|
||||
* @author yslg
|
||||
* @since 2025-10-06
|
||||
*/
|
||||
String message() default "用户未登录或登录已过期";
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
package org.xyzh.common.annotation.config;
|
||||
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
|
||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||
import org.xyzh.common.annotation.resolver.HttpLoginArgumentResolver;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @description WebMvcConfig.java文件描述 Web MVC配置
|
||||
* @filename WebMvcConfig.java
|
||||
* @author yslg
|
||||
* @copyright xyzh
|
||||
* @since 2025-10-06
|
||||
*/
|
||||
@Configuration
|
||||
public class WebMvcConfig implements WebMvcConfigurer {
|
||||
|
||||
private final HttpLoginArgumentResolver httpLoginArgumentResolver;
|
||||
|
||||
/**
|
||||
* 使用构造器注入
|
||||
* 通过接口抽象解决了循环依赖问题,不再需要@Lazy注解
|
||||
*/
|
||||
public WebMvcConfig(HttpLoginArgumentResolver httpLoginArgumentResolver) {
|
||||
this.httpLoginArgumentResolver = httpLoginArgumentResolver;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
|
||||
resolvers.add(httpLoginArgumentResolver);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,135 @@
|
||||
package org.xyzh.common.annotation.resolver;
|
||||
|
||||
import org.springframework.core.MethodParameter;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.bind.support.WebDataBinderFactory;
|
||||
import org.springframework.web.context.request.NativeWebRequest;
|
||||
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
|
||||
import org.springframework.web.method.support.ModelAndViewContainer;
|
||||
import org.xyzh.common.annotation.HttpLogin;
|
||||
import org.xyzh.common.core.domain.LoginDomain;
|
||||
import org.xyzh.common.core.security.TokenParser;
|
||||
import org.xyzh.common.redis.service.RedisService;
|
||||
import org.xyzh.common.utils.NonUtils;
|
||||
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
|
||||
/**
|
||||
* @description HttpLoginArgumentResolver.java文件描述 HTTP登录参数解析器
|
||||
* @filename HttpLoginArgumentResolver.java
|
||||
* @author yslg
|
||||
* @copyright xyzh
|
||||
* @since 2025-10-06
|
||||
*/
|
||||
@Component
|
||||
public class HttpLoginArgumentResolver implements HandlerMethodArgumentResolver {
|
||||
|
||||
private final TokenParser tokenParser;
|
||||
private final RedisService redisService;
|
||||
|
||||
/**
|
||||
* 使用构造器注入,依赖TokenParser接口而非具体实现
|
||||
* 这样避免了与auth模块的直接依赖,解决循环依赖问题
|
||||
*/
|
||||
public HttpLoginArgumentResolver(TokenParser tokenParser,
|
||||
RedisService redisService) {
|
||||
this.tokenParser = tokenParser;
|
||||
this.redisService = redisService;
|
||||
}
|
||||
|
||||
private static final String TOKEN_PREFIX = "Bearer ";
|
||||
private static final String REDIS_LOGIN_PREFIX = "login:token:";
|
||||
|
||||
@Override
|
||||
public boolean supportsParameter(MethodParameter parameter) {
|
||||
return parameter.hasParameterAnnotation(HttpLogin.class)
|
||||
&& LoginDomain.class.isAssignableFrom(parameter.getParameterType());
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
|
||||
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
|
||||
|
||||
HttpLogin httpLogin = parameter.getParameterAnnotation(HttpLogin.class);
|
||||
if (httpLogin == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// 从请求头中获取token
|
||||
String token = extractTokenFromRequest(webRequest);
|
||||
|
||||
if (NonUtils.isEmpty(token)) {
|
||||
if (httpLogin.required()) {
|
||||
throw new IllegalArgumentException(httpLogin.message());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
// 验证token格式和有效性
|
||||
if (!tokenParser.validateToken(token, tokenParser.getUserIdFromToken(token))) {
|
||||
if (httpLogin.required()) {
|
||||
throw new IllegalArgumentException(httpLogin.message());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// 从Redis中获取LoginDomain
|
||||
String userId = tokenParser.getUserIdFromToken(token);
|
||||
String redisKey = REDIS_LOGIN_PREFIX + userId;
|
||||
LoginDomain loginDomain = (LoginDomain) redisService.get(redisKey);
|
||||
|
||||
if (loginDomain == null) {
|
||||
if (httpLogin.required()) {
|
||||
throw new IllegalArgumentException(httpLogin.message());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// 更新token信息
|
||||
loginDomain.setToken(token);
|
||||
return loginDomain;
|
||||
|
||||
} catch (Exception e) {
|
||||
if (httpLogin.required()) {
|
||||
throw new IllegalArgumentException(httpLogin.message());
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 从请求中提取token
|
||||
* @param webRequest 请求对象
|
||||
* @return String token
|
||||
* @author yslg
|
||||
* @since 2025-10-06
|
||||
*/
|
||||
private String extractTokenFromRequest(NativeWebRequest webRequest) {
|
||||
HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
|
||||
if (request == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// 优先从Authorization头获取
|
||||
String authHeader = request.getHeader(HttpHeaders.AUTHORIZATION);
|
||||
if (NonUtils.isNotEmpty(authHeader) && authHeader.startsWith(TOKEN_PREFIX)) {
|
||||
return authHeader.substring(TOKEN_PREFIX.length());
|
||||
}
|
||||
|
||||
// 从请求参数中获取token
|
||||
String token = request.getParameter("token");
|
||||
if (NonUtils.isNotEmpty(token)) {
|
||||
return token;
|
||||
}
|
||||
|
||||
// 从请求头中获取token
|
||||
token = request.getHeader("token");
|
||||
if (NonUtils.isNotEmpty(token)) {
|
||||
return token;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -23,5 +23,12 @@
|
||||
<groupId>org.xyzh</groupId>
|
||||
<artifactId>common-dto</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- JWT API - 仅接口定义,具体实现由auth模块提供 -->
|
||||
<dependency>
|
||||
<groupId>io.jsonwebtoken</groupId>
|
||||
<artifactId>jjwt-api</artifactId>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
@@ -9,7 +9,7 @@ import org.xyzh.common.dto.role.TbSysRole;
|
||||
import org.xyzh.common.dto.permission.TbSysPermission;
|
||||
import org.xyzh.common.dto.dept.TbSysDeptRole;
|
||||
import org.xyzh.common.dto.menu.TbSysMenu;
|
||||
|
||||
import org.xyzh.common.vo.DeptRoleVO;
|
||||
/**
|
||||
* @description LoginDomain.java文件描述 登录域对象
|
||||
* @filename LoginDomain.java
|
||||
@@ -40,7 +40,7 @@ public class LoginDomain implements Serializable {
|
||||
* @author yslg
|
||||
* @since 2025-09-28
|
||||
*/
|
||||
private List<TbSysDeptRole> roles;
|
||||
private List<DeptRoleVO> roles;
|
||||
|
||||
/**
|
||||
* @description 用户权限列表
|
||||
@@ -132,7 +132,7 @@ public class LoginDomain implements Serializable {
|
||||
* @author yslg
|
||||
* @since 2025-09-28
|
||||
*/
|
||||
public List<TbSysDeptRole> getRoles() {
|
||||
public List<DeptRoleVO> getRoles() {
|
||||
return roles;
|
||||
}
|
||||
|
||||
@@ -141,7 +141,7 @@ public class LoginDomain implements Serializable {
|
||||
* @author yslg
|
||||
* @since 2025-09-28
|
||||
*/
|
||||
public void setRoles(List<TbSysDeptRole> roles) {
|
||||
public void setRoles(List<DeptRoleVO> roles) {
|
||||
this.roles = roles;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
package org.xyzh.common.core.security;
|
||||
|
||||
import io.jsonwebtoken.Claims;
|
||||
|
||||
/**
|
||||
* @description TokenParser.java文件描述 令牌解析器接口
|
||||
* @filename TokenParser.java
|
||||
* @author yslg
|
||||
* @copyright xyzh
|
||||
* @since 2025-10-06
|
||||
*/
|
||||
public interface TokenParser {
|
||||
|
||||
/**
|
||||
* @description 从令牌中获取用户ID
|
||||
* @param token 令牌
|
||||
* @return String 用户ID
|
||||
* @author yslg
|
||||
* @since 2025-10-06
|
||||
*/
|
||||
String getUserIdFromToken(String token);
|
||||
|
||||
/**
|
||||
* @description 从令牌中获取所有声明信息
|
||||
* @param token 令牌
|
||||
* @return Claims 所有声明信息
|
||||
* @author yslg
|
||||
* @since 2025-10-06
|
||||
*/
|
||||
Claims getAllClaimsFromToken(String token);
|
||||
|
||||
/**
|
||||
* @description 验证令牌
|
||||
* @param token 令牌
|
||||
* @param userId 用户ID
|
||||
* @return boolean 是否有效
|
||||
* @author yslg
|
||||
* @since 2025-10-06
|
||||
*/
|
||||
boolean validateToken(String token, String userId);
|
||||
|
||||
/**
|
||||
* @description 检查令牌是否过期
|
||||
* @param token 令牌
|
||||
* @return boolean 是否过期
|
||||
* @author yslg
|
||||
* @since 2025-10-06
|
||||
*/
|
||||
boolean isTokenExpired(String token);
|
||||
}
|
||||
|
||||
@@ -3,13 +3,13 @@ package org.xyzh.common.dto.user;
|
||||
import org.xyzh.common.dto.BaseDTO;
|
||||
|
||||
/**
|
||||
* @description TbSysUserRole.java文件描述 用户角色
|
||||
* @filename TbSysUserRole.java
|
||||
* @description TbSysUserDeptRole.java文件描述 用户部门角色
|
||||
* @filename TbSysUserDeptRole.java
|
||||
* @author yslg
|
||||
* @copyright xyzh
|
||||
* @since 2025-09-26
|
||||
*/
|
||||
public class TbSysUserRole extends BaseDTO{
|
||||
public class TbSysUserDeptRole extends BaseDTO{
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@@ -20,6 +20,13 @@ public class TbSysUserRole extends BaseDTO{
|
||||
*/
|
||||
private String userID;
|
||||
|
||||
/**
|
||||
* @description 部门ID
|
||||
* @author yslg
|
||||
* @since 2024-06
|
||||
*/
|
||||
private String deptID;
|
||||
|
||||
/**
|
||||
* @description 角色ID
|
||||
* @author yslg
|
||||
@@ -49,6 +56,14 @@ public class TbSysUserRole extends BaseDTO{
|
||||
this.userID = userID;
|
||||
}
|
||||
|
||||
public String getDeptID() {
|
||||
return deptID;
|
||||
}
|
||||
|
||||
public void setDeptID(String deptID) {
|
||||
this.deptID = deptID;
|
||||
}
|
||||
|
||||
public String getRoleID() {
|
||||
return roleID;
|
||||
}
|
||||
@@ -75,9 +90,10 @@ public class TbSysUserRole extends BaseDTO{
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "TbSysUserRole{" +
|
||||
return "TbSysUserDeptRole{" +
|
||||
"id='" + getID() + '\'' +
|
||||
", userID='" + userID + '\'' +
|
||||
", deptID='" + deptID + '\'' +
|
||||
", roleID='" + roleID + '\'' +
|
||||
", creator='" + creator + '\'' +
|
||||
", updater='" + updater + '\'' +
|
||||
@@ -0,0 +1,26 @@
|
||||
package org.xyzh.common.vo;
|
||||
|
||||
import org.xyzh.common.dto.dept.TbSysDept;
|
||||
import org.xyzh.common.dto.role.TbSysRole;
|
||||
|
||||
public class DeptRoleVO {
|
||||
|
||||
private TbSysDept dept;
|
||||
private TbSysRole role;
|
||||
|
||||
public TbSysDept getDept() {
|
||||
return dept;
|
||||
}
|
||||
|
||||
public void setDept(TbSysDept dept) {
|
||||
this.dept = dept;
|
||||
}
|
||||
|
||||
public TbSysRole getRole() {
|
||||
return role;
|
||||
}
|
||||
|
||||
public void setRole(TbSysRole role) {
|
||||
this.role = role;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
package org.xyzh.common.vo;
|
||||
|
||||
public class UserVO {
|
||||
|
||||
private String id;
|
||||
private String userID;
|
||||
private String username;
|
||||
private String email;
|
||||
private String phone;
|
||||
private String wechatID;
|
||||
private String avatar;
|
||||
private String gender;
|
||||
private String familyName;
|
||||
private String givenName;
|
||||
private String fullName;
|
||||
private String idCard;
|
||||
private String address;
|
||||
private String createTime;
|
||||
private String updateTime;
|
||||
private String deleteTime;
|
||||
private String deleted;
|
||||
private String status;
|
||||
|
||||
|
||||
}
|
||||
@@ -18,4 +18,49 @@
|
||||
<maven.compiler.target>21</maven.compiler.target>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<!-- Spring Boot Redis Starter -->
|
||||
<!-- Redis 依赖 -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-data-redis</artifactId>
|
||||
<!-- 排除默认的logback依赖 -->
|
||||
<exclusions>
|
||||
<exclusion>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-logging</artifactId>
|
||||
</exclusion>
|
||||
</exclusions>
|
||||
</dependency>
|
||||
|
||||
<!-- Spring Data Redis -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.data</groupId>
|
||||
<artifactId>spring-data-redis</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- FastJSON2 for JSON serialization -->
|
||||
<dependency>
|
||||
<groupId>com.alibaba.fastjson2</groupId>
|
||||
<artifactId>fastjson2</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- Common Core dependency -->
|
||||
<dependency>
|
||||
<groupId>org.xyzh</groupId>
|
||||
<artifactId>common-core</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- Spring Context for @Component annotation -->
|
||||
<dependency>
|
||||
<groupId>org.springframework</groupId>
|
||||
<artifactId>spring-context</artifactId>
|
||||
</dependency>
|
||||
|
||||
<!-- Spring Boot Auto Configuration -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-autoconfigure</artifactId>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
</project>
|
||||
@@ -1,7 +0,0 @@
|
||||
package org.xyzh;
|
||||
|
||||
public class Main {
|
||||
public static void main(String[] args) {
|
||||
System.out.println("Hello world!");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
package org.xyzh.common.redis.config;
|
||||
|
||||
import org.xyzh.common.core.constant.Constants;
|
||||
import java.nio.charset.Charset;
|
||||
import org.springframework.data.redis.serializer.RedisSerializer;
|
||||
import org.springframework.data.redis.serializer.SerializationException;
|
||||
import com.alibaba.fastjson2.JSON;
|
||||
import com.alibaba.fastjson2.JSONReader;
|
||||
import com.alibaba.fastjson2.JSONWriter;
|
||||
import com.alibaba.fastjson2.filter.Filter;
|
||||
|
||||
/**
|
||||
* @description FastJson2JsonRedisSerializer.java文件描述
|
||||
* @filename FastJson2JsonRedisSerializer.java
|
||||
* @author yslg
|
||||
* @copyright xyzh
|
||||
* @since 2025-09-07
|
||||
*/
|
||||
public class FastJson2JsonRedisSerializer<T> implements RedisSerializer<T>
|
||||
{
|
||||
public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
|
||||
|
||||
static final Filter AUTO_TYPE_FILTER = JSONReader.autoTypeFilter(Constants.JSON_WHITELIST_STR);
|
||||
|
||||
private Class<T> clazz;
|
||||
|
||||
public FastJson2JsonRedisSerializer(Class<T> clazz)
|
||||
{
|
||||
super();
|
||||
this.clazz = clazz;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] serialize(T t) throws SerializationException
|
||||
{
|
||||
if (t == null)
|
||||
{
|
||||
return new byte[0];
|
||||
}
|
||||
return JSON.toJSONString(t, JSONWriter.Feature.WriteClassName).getBytes(DEFAULT_CHARSET);
|
||||
}
|
||||
|
||||
@Override
|
||||
public T deserialize(byte[] bytes) throws SerializationException
|
||||
{
|
||||
if (bytes == null || bytes.length <= 0)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
String str = new String(bytes, DEFAULT_CHARSET);
|
||||
|
||||
return JSON.parseObject(str, clazz, AUTO_TYPE_FILTER);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
package org.xyzh.common.redis.config;
|
||||
|
||||
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
|
||||
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
|
||||
import org.springframework.cache.annotation.EnableCaching;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.data.redis.connection.RedisConnectionFactory;
|
||||
import org.springframework.data.redis.core.RedisTemplate;
|
||||
import org.springframework.data.redis.serializer.StringRedisSerializer;
|
||||
|
||||
/**
|
||||
* @description RedisConfig.java文件描述 Redis配置
|
||||
* @filename RedisConfig.java
|
||||
* @author yslg
|
||||
* @copyright xyzh
|
||||
* @since 2025-09-07
|
||||
*/
|
||||
@Configuration
|
||||
@EnableCaching
|
||||
@AutoConfigureBefore(RedisAutoConfiguration.class)
|
||||
public class RedisConfig {
|
||||
|
||||
@Bean
|
||||
@SuppressWarnings(value = { "unchecked", "rawtypes" })
|
||||
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory)
|
||||
{
|
||||
RedisTemplate<String, Object> template = new RedisTemplate<>();
|
||||
template.setConnectionFactory(connectionFactory);
|
||||
|
||||
FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class);
|
||||
|
||||
// 使用StringRedisSerializer来序列化和反序列化redis的key值
|
||||
template.setKeySerializer(new StringRedisSerializer());
|
||||
template.setValueSerializer(serializer);
|
||||
|
||||
// Hash的key也采用StringRedisSerializer的序列化方式
|
||||
template.setHashKeySerializer(new StringRedisSerializer());
|
||||
template.setHashValueSerializer(serializer);
|
||||
|
||||
template.afterPropertiesSet();
|
||||
return template;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,384 @@
|
||||
package org.xyzh.common.redis.service;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.data.redis.core.RedisTemplate;
|
||||
import org.springframework.data.redis.core.RedisCallback;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* @description RedisService.java Redis工具服务类,封装常用Redis操作
|
||||
* @filename RedisService.java
|
||||
* @author yslg
|
||||
* @copyright xyzh
|
||||
* @since 2025-09-07
|
||||
*/
|
||||
@SuppressWarnings(value = { "unchecked", "rawtypes" })
|
||||
@Component
|
||||
public class RedisService {
|
||||
|
||||
@Autowired
|
||||
private RedisTemplate<String, Object> redisTemplate;
|
||||
|
||||
/**
|
||||
* @description 设置key-value
|
||||
* @param key String 键
|
||||
* @param value Object 值
|
||||
* @author yslg
|
||||
* @since 2025-09-07
|
||||
*/
|
||||
public void set(String key, Object value) {
|
||||
redisTemplate.opsForValue().set(key, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 设置key-value并指定过期时间
|
||||
* @param key String 键
|
||||
* @param value Object 值
|
||||
* @param timeout long 过期时间
|
||||
* @param unit TimeUnit 时间单位
|
||||
* @author yslg
|
||||
* @since 2025-09-07
|
||||
*/
|
||||
public void set(String key, Object value, long timeout, TimeUnit unit) {
|
||||
redisTemplate.opsForValue().set(key, value, timeout, unit);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 获取key对应的value
|
||||
* @param key String 键
|
||||
* @return Object 值
|
||||
* @author yslg
|
||||
* @since 2025-09-07
|
||||
*/
|
||||
public Object get(String key) {
|
||||
return redisTemplate.opsForValue().get(key);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 删除key
|
||||
* @param key String 键
|
||||
* @author yslg
|
||||
* @since 2025-09-07
|
||||
*/
|
||||
public void delete(String key) {
|
||||
redisTemplate.delete(key);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 批量删除key
|
||||
* @param keys Collection<String> 键集合
|
||||
* @author yslg
|
||||
* @since 2025-09-07
|
||||
*/
|
||||
public void delete(Collection<String> keys) {
|
||||
redisTemplate.delete(keys);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 判断key是否存在
|
||||
* @param key String 键
|
||||
* @return boolean 是否存在
|
||||
* @author yslg
|
||||
* @since 2025-09-07
|
||||
*/
|
||||
public boolean hasKey(String key) {
|
||||
return redisTemplate.hasKey(key);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 设置key过期时间(秒)
|
||||
* @param key String 键
|
||||
* @param timeout long 过期秒数
|
||||
* @author yslg
|
||||
* @since 2025-09-07
|
||||
*/
|
||||
public void setExpire(String key, long timeout) {
|
||||
redisTemplate.expire(key, timeout, TimeUnit.SECONDS);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 设置key过期时间(自定义单位)
|
||||
* @param key String 键
|
||||
* @param timeout long 过期时间
|
||||
* @param unit TimeUnit 时间单位
|
||||
* @author yslg
|
||||
* @since 2025-09-07
|
||||
*/
|
||||
public void setExpire(String key, long timeout, TimeUnit unit) {
|
||||
redisTemplate.expire(key, timeout, unit);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 获取key剩余过期时间(秒)
|
||||
* @param key String 键
|
||||
* @return long 剩余秒数
|
||||
* @author yslg
|
||||
* @since 2025-09-07
|
||||
*/
|
||||
public long getExpire(String key) {
|
||||
return redisTemplate.getExpire(key, TimeUnit.SECONDS);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 原子递增
|
||||
* @param key String 键
|
||||
* @param delta long 增量
|
||||
* @return long 递增后值
|
||||
* @author yslg
|
||||
* @since 2025-09-07
|
||||
*/
|
||||
public long incr(String key, long delta) {
|
||||
Long result = redisTemplate.opsForValue().increment(key, delta);
|
||||
return result != null ? result : 0L;
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 原子递减
|
||||
* @param key String 键
|
||||
* @param delta long 减量
|
||||
* @return long 递减后值
|
||||
* @author yslg
|
||||
* @since 2025-09-07
|
||||
*/
|
||||
public long decr(String key, long delta) {
|
||||
Long result = redisTemplate.opsForValue().increment(key, -delta);
|
||||
return result != null ? result : 0L;
|
||||
}
|
||||
|
||||
/**
|
||||
* @description Hash操作-put
|
||||
* @param key String 键
|
||||
* @param hashKey String 哈希键
|
||||
* @param value Object 值
|
||||
* @author yslg
|
||||
* @since 2025-09-07
|
||||
*/
|
||||
public void hSet(String key, String hashKey, Object value) {
|
||||
redisTemplate.opsForHash().put(key, hashKey, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description Hash操作-get
|
||||
* @param key String 键
|
||||
* @param hashKey String 哈希键
|
||||
* @return Object 值
|
||||
* @author yslg
|
||||
* @since 2025-09-07
|
||||
*/
|
||||
public Object hGet(String key, String hashKey) {
|
||||
return redisTemplate.opsForHash().get(key, hashKey);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description Hash操作-获取所有
|
||||
* @param key String 键
|
||||
* @return Map<Object, Object> 哈希所有键值对
|
||||
* @author yslg
|
||||
* @since 2025-09-07
|
||||
*/
|
||||
public Map<Object, Object> hGetAll(String key) {
|
||||
return redisTemplate.opsForHash().entries(key);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description Hash操作-删除
|
||||
* @param key String 键
|
||||
* @param hashKeys String[] 哈希键数组
|
||||
* @author yslg
|
||||
* @since 2025-09-07
|
||||
*/
|
||||
public void hDelete(String key, String... hashKeys) {
|
||||
redisTemplate.opsForHash().delete(key, (Object[]) hashKeys);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description List操作-左入队
|
||||
* @param key String 键
|
||||
* @param value Object 值
|
||||
* @author yslg
|
||||
* @since 2025-09-07
|
||||
*/
|
||||
public void lPush(String key, Object value) {
|
||||
redisTemplate.opsForList().leftPush(key, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description List操作-右入队
|
||||
* @param key String 键
|
||||
* @param value Object 值
|
||||
* @author yslg
|
||||
* @since 2025-09-07
|
||||
*/
|
||||
public void rPush(String key, Object value) {
|
||||
redisTemplate.opsForList().rightPush(key, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description List操作-左出队
|
||||
* @param key String 键
|
||||
* @return Object 出队值
|
||||
* @author yslg
|
||||
* @since 2025-09-07
|
||||
*/
|
||||
public Object lPop(String key) {
|
||||
return redisTemplate.opsForList().leftPop(key);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description List操作-右出队
|
||||
* @param key String 键
|
||||
* @return Object 出队值
|
||||
* @author yslg
|
||||
* @since 2025-09-07
|
||||
*/
|
||||
public Object rPop(String key) {
|
||||
return redisTemplate.opsForList().rightPop(key);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description List操作-获取区间元素
|
||||
* @param key String 键
|
||||
* @param start long 起始索引
|
||||
* @param end long 结束索引
|
||||
* @return List<Object> 元素列表
|
||||
* @author yslg
|
||||
* @since 2025-09-07
|
||||
*/
|
||||
public List<Object> lRange(String key, long start, long end) {
|
||||
return redisTemplate.opsForList().range(key, start, end);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description Set操作-添加元素
|
||||
* @param key String 键
|
||||
* @param values Object[] 元素数组
|
||||
* @author yslg
|
||||
* @since 2025-09-07
|
||||
*/
|
||||
public void sAdd(String key, Object... values) {
|
||||
redisTemplate.opsForSet().add(key, values);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description Set操作-移除元素
|
||||
* @param key String 键
|
||||
* @param values Object[] 元素数组
|
||||
* @author yslg
|
||||
* @since 2025-09-07
|
||||
*/
|
||||
public void sRemove(String key, Object... values) {
|
||||
redisTemplate.opsForSet().remove(key, values);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description Set操作-获取所有元素
|
||||
* @param key String 键
|
||||
* @return Set<Object> 元素集合
|
||||
* @author yslg
|
||||
* @since 2025-09-07
|
||||
*/
|
||||
public Set<Object> sMembers(String key) {
|
||||
return redisTemplate.opsForSet().members(key);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description ZSet操作-添加元素
|
||||
* @param key String 键
|
||||
* @param value Object 元素
|
||||
* @param score double 分数
|
||||
* @author yslg
|
||||
* @since 2025-09-07
|
||||
*/
|
||||
public void zAdd(String key, Object value, double score) {
|
||||
redisTemplate.opsForZSet().add(key, value, score);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description ZSet操作-移除元素
|
||||
* @param key String 键
|
||||
* @param values Object[] 元素数组
|
||||
* @author yslg
|
||||
* @since 2025-09-07
|
||||
*/
|
||||
public void zRemove(String key, Object... values) {
|
||||
redisTemplate.opsForZSet().remove(key, values);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description ZSet操作-按分数区间获取元素
|
||||
* @param key String 键
|
||||
* @param min double 最小分数
|
||||
* @param max double 最大分数
|
||||
* @return Set<Object> 元素集合
|
||||
* @author yslg
|
||||
* @since 2025-09-07
|
||||
*/
|
||||
public Set<Object> zRangeByScore(String key, double min, double max) {
|
||||
return redisTemplate.opsForZSet().rangeByScore(key, min, max);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description ZSet操作-获取全部元素
|
||||
* @param key String 键
|
||||
* @param start long 起始索引
|
||||
* @param end long 结束索引
|
||||
* @return Set<Object> 元素集合
|
||||
* @author yslg
|
||||
* @since 2025-09-07
|
||||
*/
|
||||
public Set<Object> zRange(String key, long start, long end) {
|
||||
return redisTemplate.opsForZSet().range(key, start, end);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 发布消息(Pub/Sub)
|
||||
* @param channel String 通道
|
||||
* @param message Object 消息内容
|
||||
* @author yslg
|
||||
* @since 2025-09-07
|
||||
*/
|
||||
public void publish(String channel, Object message) {
|
||||
redisTemplate.convertAndSend(channel, message);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 执行Redis原生命令
|
||||
* @param action RedisCallback<?> 回调命令
|
||||
* @return Object 执行结果
|
||||
* @author yslg
|
||||
* @since 2025-09-07
|
||||
*/
|
||||
public Object execute(RedisCallback<?> action) {
|
||||
return redisTemplate.execute(action);
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 获取所有key(慎用)
|
||||
* @param pattern String 匹配模式
|
||||
* @return Set<String> key集合
|
||||
* @author yslg
|
||||
* @since 2025-09-07
|
||||
*/
|
||||
public Set<String> keys(String pattern) {
|
||||
Set<String> keys = redisTemplate.keys(pattern);
|
||||
Set<String> stringKeys = new HashSet<>();
|
||||
if (keys != null) {
|
||||
for (String key : keys) {
|
||||
stringKeys.add(key);
|
||||
}
|
||||
}
|
||||
return stringKeys;
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 清空当前数据库(慎用)
|
||||
* @author yslg
|
||||
* @since 2025-09-07
|
||||
*/
|
||||
public void flushDb() {
|
||||
redisTemplate.execute((RedisCallback<Void>) connection -> { connection.flushDb(); return null; });
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,50 +0,0 @@
|
||||
16:57:09.456 [main] INFO org.xyzh.App - No active profile set, falling back to 1 default profile: "default"
|
||||
16:58:18.891 [main] INFO org.xyzh.App - No active profile set, falling back to 1 default profile: "default"
|
||||
17:17:14.156 [main] INFO org.xyzh.App - No active profile set, falling back to 1 default profile: "default"
|
||||
17:19:09.640 [main] INFO org.xyzh.App - No active profile set, falling back to 1 default profile: "default"
|
||||
17:39:25.742 [main] INFO org.xyzh.App - No active profile set, falling back to 1 default profile: "default"
|
||||
17:39:26.835 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8080"]
|
||||
17:39:26.836 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat]
|
||||
17:39:26.842 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.46]
|
||||
17:39:26.891 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext
|
||||
17:39:27.154 [main] WARN com.baomidou.mybatisplus.core.injector.methods.Insert - [org.xyzh.system.mapper.DepartmentMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert]
|
||||
17:39:27.168 [main] WARN com.baomidou.mybatisplus.core.injector.methods.DeleteById - [org.xyzh.system.mapper.DepartmentMapper.deleteById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.DeleteById]
|
||||
17:39:27.171 [main] WARN com.baomidou.mybatisplus.core.injector.methods.UpdateById - [org.xyzh.system.mapper.DepartmentMapper.updateById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.UpdateById]
|
||||
17:39:27.186 [main] WARN com.baomidou.mybatisplus.core.injector.methods.Insert - [org.xyzh.system.mapper.MenuMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert]
|
||||
17:39:27.195 [main] WARN com.baomidou.mybatisplus.core.injector.methods.DeleteById - [org.xyzh.system.mapper.MenuMapper.deleteById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.DeleteById]
|
||||
17:39:27.197 [main] WARN com.baomidou.mybatisplus.core.injector.methods.UpdateById - [org.xyzh.system.mapper.MenuMapper.updateById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.UpdateById]
|
||||
17:39:27.209 [main] WARN com.baomidou.mybatisplus.core.injector.methods.Insert - [org.xyzh.system.mapper.PermissionMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert]
|
||||
17:39:27.216 [main] WARN com.baomidou.mybatisplus.core.injector.methods.DeleteById - [org.xyzh.system.mapper.PermissionMapper.deleteById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.DeleteById]
|
||||
17:39:27.218 [main] WARN com.baomidou.mybatisplus.core.injector.methods.UpdateById - [org.xyzh.system.mapper.PermissionMapper.updateById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.UpdateById]
|
||||
17:39:27.238 [main] WARN com.baomidou.mybatisplus.core.injector.methods.Insert - [org.xyzh.system.mapper.RoleMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert]
|
||||
17:39:27.245 [main] WARN com.baomidou.mybatisplus.core.injector.methods.DeleteById - [org.xyzh.system.mapper.RoleMapper.deleteById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.DeleteById]
|
||||
17:39:27.247 [main] WARN com.baomidou.mybatisplus.core.injector.methods.UpdateById - [org.xyzh.system.mapper.RoleMapper.updateById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.UpdateById]
|
||||
17:39:27.286 [main] INFO org.apache.catalina.core.StandardService - Stopping service [Tomcat]
|
||||
17:39:56.337 [main] INFO org.xyzh.App - No active profile set, falling back to 1 default profile: "default"
|
||||
17:39:57.402 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8080"]
|
||||
17:39:57.403 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat]
|
||||
17:39:57.404 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.46]
|
||||
17:39:57.458 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext
|
||||
17:39:57.711 [main] WARN com.baomidou.mybatisplus.core.injector.methods.Insert - [org.xyzh.system.mapper.DepartmentMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert]
|
||||
17:39:57.725 [main] WARN com.baomidou.mybatisplus.core.injector.methods.DeleteById - [org.xyzh.system.mapper.DepartmentMapper.deleteById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.DeleteById]
|
||||
17:39:57.727 [main] WARN com.baomidou.mybatisplus.core.injector.methods.UpdateById - [org.xyzh.system.mapper.DepartmentMapper.updateById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.UpdateById]
|
||||
17:39:57.741 [main] WARN com.baomidou.mybatisplus.core.injector.methods.Insert - [org.xyzh.system.mapper.MenuMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert]
|
||||
17:39:57.750 [main] WARN com.baomidou.mybatisplus.core.injector.methods.DeleteById - [org.xyzh.system.mapper.MenuMapper.deleteById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.DeleteById]
|
||||
17:39:57.752 [main] WARN com.baomidou.mybatisplus.core.injector.methods.UpdateById - [org.xyzh.system.mapper.MenuMapper.updateById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.UpdateById]
|
||||
17:39:57.763 [main] WARN com.baomidou.mybatisplus.core.injector.methods.Insert - [org.xyzh.system.mapper.PermissionMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert]
|
||||
17:39:57.770 [main] WARN com.baomidou.mybatisplus.core.injector.methods.DeleteById - [org.xyzh.system.mapper.PermissionMapper.deleteById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.DeleteById]
|
||||
17:39:57.772 [main] WARN com.baomidou.mybatisplus.core.injector.methods.UpdateById - [org.xyzh.system.mapper.PermissionMapper.updateById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.UpdateById]
|
||||
17:39:57.782 [main] WARN com.baomidou.mybatisplus.core.injector.methods.Insert - [org.xyzh.system.mapper.RoleMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert]
|
||||
17:39:57.789 [main] WARN com.baomidou.mybatisplus.core.injector.methods.DeleteById - [org.xyzh.system.mapper.RoleMapper.deleteById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.DeleteById]
|
||||
17:39:57.791 [main] WARN com.baomidou.mybatisplus.core.injector.methods.UpdateById - [org.xyzh.system.mapper.RoleMapper.updateById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.UpdateById]
|
||||
17:39:57.801 [main] WARN com.baomidou.mybatisplus.core.injector.methods.Insert - [org.xyzh.system.mapper.UserMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert]
|
||||
17:39:57.808 [main] WARN com.baomidou.mybatisplus.core.injector.methods.DeleteById - [org.xyzh.system.mapper.UserMapper.deleteById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.DeleteById]
|
||||
17:39:57.810 [main] WARN com.baomidou.mybatisplus.core.injector.methods.UpdateById - [org.xyzh.system.mapper.UserMapper.updateById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.UpdateById]
|
||||
17:39:58.316 [main] INFO com.baomidou.mybatisplus.extension.spring.MybatisPlusApplicationContextAware - Register ApplicationContext instances org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@149c3204
|
||||
17:39:58.390 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...
|
||||
17:39:58.538 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@4d16975b
|
||||
17:39:58.540 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed.
|
||||
17:39:59.724 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8080"]
|
||||
17:40:00.762 [main] INFO org.xyzh.App - Started App in 7.332 seconds (process running for 8.448)
|
||||
17:40:03.682 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated...
|
||||
17:40:03.688 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed.
|
||||
@@ -1,29 +0,0 @@
|
||||
17:39:56.337 [main] INFO org.xyzh.App - No active profile set, falling back to 1 default profile: "default"
|
||||
17:39:57.402 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8080"]
|
||||
17:39:57.403 [main] INFO org.apache.catalina.core.StandardService - Starting service [Tomcat]
|
||||
17:39:57.404 [main] INFO org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.46]
|
||||
17:39:57.458 [main] INFO org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext
|
||||
17:39:57.711 [main] WARN com.baomidou.mybatisplus.core.injector.methods.Insert - [org.xyzh.system.mapper.DepartmentMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert]
|
||||
17:39:57.725 [main] WARN com.baomidou.mybatisplus.core.injector.methods.DeleteById - [org.xyzh.system.mapper.DepartmentMapper.deleteById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.DeleteById]
|
||||
17:39:57.727 [main] WARN com.baomidou.mybatisplus.core.injector.methods.UpdateById - [org.xyzh.system.mapper.DepartmentMapper.updateById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.UpdateById]
|
||||
17:39:57.741 [main] WARN com.baomidou.mybatisplus.core.injector.methods.Insert - [org.xyzh.system.mapper.MenuMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert]
|
||||
17:39:57.750 [main] WARN com.baomidou.mybatisplus.core.injector.methods.DeleteById - [org.xyzh.system.mapper.MenuMapper.deleteById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.DeleteById]
|
||||
17:39:57.752 [main] WARN com.baomidou.mybatisplus.core.injector.methods.UpdateById - [org.xyzh.system.mapper.MenuMapper.updateById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.UpdateById]
|
||||
17:39:57.763 [main] WARN com.baomidou.mybatisplus.core.injector.methods.Insert - [org.xyzh.system.mapper.PermissionMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert]
|
||||
17:39:57.770 [main] WARN com.baomidou.mybatisplus.core.injector.methods.DeleteById - [org.xyzh.system.mapper.PermissionMapper.deleteById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.DeleteById]
|
||||
17:39:57.772 [main] WARN com.baomidou.mybatisplus.core.injector.methods.UpdateById - [org.xyzh.system.mapper.PermissionMapper.updateById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.UpdateById]
|
||||
17:39:57.782 [main] WARN com.baomidou.mybatisplus.core.injector.methods.Insert - [org.xyzh.system.mapper.RoleMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert]
|
||||
17:39:57.789 [main] WARN com.baomidou.mybatisplus.core.injector.methods.DeleteById - [org.xyzh.system.mapper.RoleMapper.deleteById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.DeleteById]
|
||||
17:39:57.791 [main] WARN com.baomidou.mybatisplus.core.injector.methods.UpdateById - [org.xyzh.system.mapper.RoleMapper.updateById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.UpdateById]
|
||||
17:39:57.801 [main] WARN com.baomidou.mybatisplus.core.injector.methods.Insert - [org.xyzh.system.mapper.UserMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert]
|
||||
17:39:57.808 [main] WARN com.baomidou.mybatisplus.core.injector.methods.DeleteById - [org.xyzh.system.mapper.UserMapper.deleteById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.DeleteById]
|
||||
17:39:57.810 [main] WARN com.baomidou.mybatisplus.core.injector.methods.UpdateById - [org.xyzh.system.mapper.UserMapper.updateById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.UpdateById]
|
||||
17:39:57.893 [main] DEBUG org.xyzh.auth.filter.JwtAuthenticationFilter - Filter 'jwtAuthenticationFilter' configured for use
|
||||
17:39:58.316 [main] INFO com.baomidou.mybatisplus.extension.spring.MybatisPlusApplicationContextAware - Register ApplicationContext instances org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@149c3204
|
||||
17:39:58.390 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...
|
||||
17:39:58.538 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@4d16975b
|
||||
17:39:58.540 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed.
|
||||
17:39:59.724 [main] INFO org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8080"]
|
||||
17:40:00.762 [main] INFO org.xyzh.App - Started App in 7.332 seconds (process running for 8.448)
|
||||
17:40:03.682 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated...
|
||||
17:40:03.688 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed.
|
||||
@@ -1,27 +0,0 @@
|
||||
17:39:27.154 [main] WARN com.baomidou.mybatisplus.core.injector.methods.Insert - [org.xyzh.system.mapper.DepartmentMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert]
|
||||
17:39:27.168 [main] WARN com.baomidou.mybatisplus.core.injector.methods.DeleteById - [org.xyzh.system.mapper.DepartmentMapper.deleteById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.DeleteById]
|
||||
17:39:27.171 [main] WARN com.baomidou.mybatisplus.core.injector.methods.UpdateById - [org.xyzh.system.mapper.DepartmentMapper.updateById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.UpdateById]
|
||||
17:39:27.186 [main] WARN com.baomidou.mybatisplus.core.injector.methods.Insert - [org.xyzh.system.mapper.MenuMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert]
|
||||
17:39:27.195 [main] WARN com.baomidou.mybatisplus.core.injector.methods.DeleteById - [org.xyzh.system.mapper.MenuMapper.deleteById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.DeleteById]
|
||||
17:39:27.197 [main] WARN com.baomidou.mybatisplus.core.injector.methods.UpdateById - [org.xyzh.system.mapper.MenuMapper.updateById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.UpdateById]
|
||||
17:39:27.209 [main] WARN com.baomidou.mybatisplus.core.injector.methods.Insert - [org.xyzh.system.mapper.PermissionMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert]
|
||||
17:39:27.216 [main] WARN com.baomidou.mybatisplus.core.injector.methods.DeleteById - [org.xyzh.system.mapper.PermissionMapper.deleteById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.DeleteById]
|
||||
17:39:27.218 [main] WARN com.baomidou.mybatisplus.core.injector.methods.UpdateById - [org.xyzh.system.mapper.PermissionMapper.updateById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.UpdateById]
|
||||
17:39:27.238 [main] WARN com.baomidou.mybatisplus.core.injector.methods.Insert - [org.xyzh.system.mapper.RoleMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert]
|
||||
17:39:27.245 [main] WARN com.baomidou.mybatisplus.core.injector.methods.DeleteById - [org.xyzh.system.mapper.RoleMapper.deleteById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.DeleteById]
|
||||
17:39:27.247 [main] WARN com.baomidou.mybatisplus.core.injector.methods.UpdateById - [org.xyzh.system.mapper.RoleMapper.updateById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.UpdateById]
|
||||
17:39:57.711 [main] WARN com.baomidou.mybatisplus.core.injector.methods.Insert - [org.xyzh.system.mapper.DepartmentMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert]
|
||||
17:39:57.725 [main] WARN com.baomidou.mybatisplus.core.injector.methods.DeleteById - [org.xyzh.system.mapper.DepartmentMapper.deleteById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.DeleteById]
|
||||
17:39:57.727 [main] WARN com.baomidou.mybatisplus.core.injector.methods.UpdateById - [org.xyzh.system.mapper.DepartmentMapper.updateById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.UpdateById]
|
||||
17:39:57.741 [main] WARN com.baomidou.mybatisplus.core.injector.methods.Insert - [org.xyzh.system.mapper.MenuMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert]
|
||||
17:39:57.750 [main] WARN com.baomidou.mybatisplus.core.injector.methods.DeleteById - [org.xyzh.system.mapper.MenuMapper.deleteById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.DeleteById]
|
||||
17:39:57.752 [main] WARN com.baomidou.mybatisplus.core.injector.methods.UpdateById - [org.xyzh.system.mapper.MenuMapper.updateById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.UpdateById]
|
||||
17:39:57.763 [main] WARN com.baomidou.mybatisplus.core.injector.methods.Insert - [org.xyzh.system.mapper.PermissionMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert]
|
||||
17:39:57.770 [main] WARN com.baomidou.mybatisplus.core.injector.methods.DeleteById - [org.xyzh.system.mapper.PermissionMapper.deleteById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.DeleteById]
|
||||
17:39:57.772 [main] WARN com.baomidou.mybatisplus.core.injector.methods.UpdateById - [org.xyzh.system.mapper.PermissionMapper.updateById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.UpdateById]
|
||||
17:39:57.782 [main] WARN com.baomidou.mybatisplus.core.injector.methods.Insert - [org.xyzh.system.mapper.RoleMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert]
|
||||
17:39:57.789 [main] WARN com.baomidou.mybatisplus.core.injector.methods.DeleteById - [org.xyzh.system.mapper.RoleMapper.deleteById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.DeleteById]
|
||||
17:39:57.791 [main] WARN com.baomidou.mybatisplus.core.injector.methods.UpdateById - [org.xyzh.system.mapper.RoleMapper.updateById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.UpdateById]
|
||||
17:39:57.801 [main] WARN com.baomidou.mybatisplus.core.injector.methods.Insert - [org.xyzh.system.mapper.UserMapper.insert] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.Insert]
|
||||
17:39:57.808 [main] WARN com.baomidou.mybatisplus.core.injector.methods.DeleteById - [org.xyzh.system.mapper.UserMapper.deleteById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.DeleteById]
|
||||
17:39:57.810 [main] WARN com.baomidou.mybatisplus.core.injector.methods.UpdateById - [org.xyzh.system.mapper.UserMapper.updateById] Has been loaded by XML or SqlProvider or Mybatis's Annotation, so ignoring this injection for [class com.baomidou.mybatisplus.core.injector.methods.UpdateById]
|
||||
139
schoolNewsServ/news/src/main/resources/log4j2-spring.xml
Normal file
139
schoolNewsServ/news/src/main/resources/log4j2-spring.xml
Normal file
@@ -0,0 +1,139 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
校园新闻管理系统 - News模块日志配置
|
||||
-->
|
||||
<configuration status="WARN" monitorInterval="30">
|
||||
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
|
||||
|
||||
<!--变量配置-->
|
||||
<Properties>
|
||||
<!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
|
||||
<!-- %logger{36} 表示 Logger 名字最长36个字符 -->
|
||||
<property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
|
||||
<!-- 定义日志存储的路径 -->
|
||||
<property name="FILE_PATH" value="./logs" />
|
||||
<!-- News模块日志文件名 -->
|
||||
<property name="FILE_NAME" value="school-news-news" />
|
||||
<!-- 设置系统属性 -->
|
||||
<property name="file.encoding" value="UTF-8" />
|
||||
<property name="console.encoding" value="UTF-8" />
|
||||
</Properties>
|
||||
|
||||
<appenders>
|
||||
|
||||
<console name="Console" target="SYSTEM_OUT">
|
||||
<!--输出日志的格式-->
|
||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||
<!--控制台输出debug及以上级别的信息-->
|
||||
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||
</console>
|
||||
|
||||
<!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,适合临时测试用-->
|
||||
<File name="Filelog" fileName="${FILE_PATH}/${FILE_NAME}-test.log" append="false">
|
||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||
</File>
|
||||
|
||||
<!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
|
||||
<RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/${FILE_NAME}-info.log" filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
|
||||
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
|
||||
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||
<Policies>
|
||||
<!--interval属性用来指定多久滚动一次,默认是1 hour-->
|
||||
<TimeBasedTriggeringPolicy interval="1"/>
|
||||
<SizeBasedTriggeringPolicy size="10MB"/>
|
||||
</Policies>
|
||||
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
|
||||
<DefaultRolloverStrategy max="15"/>
|
||||
</RollingFile>
|
||||
|
||||
<!-- 这个会打印出所有的warn及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
|
||||
<RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/${FILE_NAME}-warn.log" filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz">
|
||||
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
|
||||
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||
<Policies>
|
||||
<!--interval属性用来指定多久滚动一次,默认是1 hour-->
|
||||
<TimeBasedTriggeringPolicy interval="1"/>
|
||||
<SizeBasedTriggeringPolicy size="10MB"/>
|
||||
</Policies>
|
||||
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
|
||||
<DefaultRolloverStrategy max="15"/>
|
||||
</RollingFile>
|
||||
|
||||
<!-- 这个会打印出所有的error及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
|
||||
<RollingFile name="RollingFileError" fileName="${FILE_PATH}/${FILE_NAME}-error.log" filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
|
||||
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
|
||||
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||
<Policies>
|
||||
<!--interval属性用来指定多久滚动一次,默认是1 hour-->
|
||||
<TimeBasedTriggeringPolicy interval="1"/>
|
||||
<SizeBasedTriggeringPolicy size="10MB"/>
|
||||
</Policies>
|
||||
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
|
||||
<DefaultRolloverStrategy max="15"/>
|
||||
</RollingFile>
|
||||
|
||||
</appenders>
|
||||
|
||||
<!--Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。-->
|
||||
<!--然后定义loggers,只有定义了logger并引入的appender,appender才会生效-->
|
||||
<loggers>
|
||||
|
||||
<!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
|
||||
<logger name="org.mybatis" level="info" additivity="false">
|
||||
<AppenderRef ref="Console"/>
|
||||
</logger>
|
||||
<!--监控系统信息-->
|
||||
<!--若是additivity设为false,则 子Logger 只会在自己的appender里输出,不会在 父Logger 的appender里输出。-->
|
||||
<Logger name="org.springframework" level="info" additivity="false">
|
||||
<AppenderRef ref="Console"/>
|
||||
</Logger>
|
||||
|
||||
<!-- 项目包日志配置 - Auth模块 -->
|
||||
<Logger name="org.xyzh.auth" level="debug" additivity="false">
|
||||
<AppenderRef ref="Console"/>
|
||||
<AppenderRef ref="Filelog"/>
|
||||
<AppenderRef ref="RollingFileInfo"/>
|
||||
<AppenderRef ref="RollingFileWarn"/>
|
||||
<AppenderRef ref="RollingFileError"/>
|
||||
</Logger>
|
||||
|
||||
<!-- 项目包日志配置 - System模块 -->
|
||||
<Logger name="org.xyzh.system" level="debug" additivity="false">
|
||||
<AppenderRef ref="Console"/>
|
||||
<AppenderRef ref="Filelog"/>
|
||||
<AppenderRef ref="RollingFileInfo"/>
|
||||
<AppenderRef ref="RollingFileWarn"/>
|
||||
<AppenderRef ref="RollingFileError"/>
|
||||
</Logger>
|
||||
|
||||
<!-- 项目包日志配置 - News模块 -->
|
||||
<Logger name="org.xyzh.news" level="debug" additivity="false">
|
||||
<AppenderRef ref="Console"/>
|
||||
<AppenderRef ref="Filelog"/>
|
||||
<AppenderRef ref="RollingFileInfo"/>
|
||||
<AppenderRef ref="RollingFileWarn"/>
|
||||
<AppenderRef ref="RollingFileError"/>
|
||||
</Logger>
|
||||
|
||||
<!-- 项目包日志配置 - Common模块 -->
|
||||
<Logger name="org.xyzh.common" level="debug" additivity="false">
|
||||
<AppenderRef ref="Console"/>
|
||||
<AppenderRef ref="Filelog"/>
|
||||
<AppenderRef ref="RollingFileInfo"/>
|
||||
<AppenderRef ref="RollingFileWarn"/>
|
||||
<AppenderRef ref="RollingFileError"/>
|
||||
</Logger>
|
||||
|
||||
<root level="info">
|
||||
<appender-ref ref="Console"/>
|
||||
<appender-ref ref="Filelog"/>
|
||||
<appender-ref ref="RollingFileInfo"/>
|
||||
<appender-ref ref="RollingFileWarn"/>
|
||||
<appender-ref ref="RollingFileError"/>
|
||||
</root>
|
||||
</loggers>
|
||||
|
||||
</configuration>
|
||||
@@ -43,6 +43,9 @@
|
||||
<!-- Log4j2 依赖版本 -->
|
||||
<log4j2.version>2.23.1</log4j2.version>
|
||||
|
||||
<!-- Redis 依赖版本 -->
|
||||
<spring-data-redis.version>3.5.4</spring-data-redis.version>
|
||||
|
||||
<lombok.version>1.18.40</lombok.version>
|
||||
</properties>
|
||||
|
||||
@@ -205,6 +208,18 @@
|
||||
<version>3.4.4</version>
|
||||
</dependency>
|
||||
|
||||
<!-- Redis 依赖管理 -->
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-data-redis</artifactId>
|
||||
<version>${spring-boot.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.data</groupId>
|
||||
<artifactId>spring-data-redis</artifactId>
|
||||
<version>${spring-data-redis.version}</version>
|
||||
</dependency>
|
||||
|
||||
</dependencies>
|
||||
</dependencyManagement>
|
||||
<dependencies>
|
||||
@@ -245,6 +260,9 @@
|
||||
<source>${java.version}</source>
|
||||
<target>${java.version}</target>
|
||||
<encoding>${project.build.sourceEncoding}</encoding>
|
||||
<compilerArgs>
|
||||
<arg>-J-Dfile.encoding=UTF-8</arg>
|
||||
</compilerArgs>
|
||||
</configuration>
|
||||
</plugin>
|
||||
</plugins>
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
package org.xyzh.system.controller;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
import org.xyzh.api.system.user.UserService;
|
||||
import org.xyzh.common.annotation.HttpLogin;
|
||||
import org.xyzh.common.core.domain.LoginDomain;
|
||||
import org.xyzh.common.core.domain.ResultDomain;
|
||||
import org.xyzh.common.dto.user.TbSysUserInfo;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
|
||||
|
||||
/**
|
||||
* @description UserController.java文件描述 用户控制器
|
||||
* @filename UserController.java
|
||||
* @author yslg
|
||||
* @copyright xyzh
|
||||
* @ since 2025-10-06
|
||||
*/
|
||||
@RestController
|
||||
@RequestMapping("/user")
|
||||
public class UserController {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(UserController.class);
|
||||
|
||||
@Autowired
|
||||
private UserService userService;
|
||||
|
||||
@GetMapping("/userinfo")
|
||||
public ResultDomain<TbSysUserInfo> getUserInfo(@HttpLogin LoginDomain loginDomain){
|
||||
ResultDomain<TbSysUserInfo> result = new ResultDomain<>();
|
||||
|
||||
logger.info("loginDomain: {}", loginDomain);
|
||||
String userID = loginDomain.getUser().getID();
|
||||
ResultDomain<TbSysUserInfo> userInfo = userService.getUserInfoById(userID);
|
||||
result.setData(userInfo.getData());
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.xyzh.common.dto.role.TbSysRole;
|
||||
import org.xyzh.common.vo.DeptRoleVO;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -20,11 +21,11 @@ public interface RoleMapper extends BaseMapper<TbSysRole> {
|
||||
/**
|
||||
* @description 根据用户ID查询角色列表
|
||||
* @param userId 用户ID
|
||||
* @return List<TbSysRole> 角色列表
|
||||
* @return List<DeptRoleVO> 部门角色列表
|
||||
* @author yslg
|
||||
* @since 2025-09-28
|
||||
*/
|
||||
List<TbSysRole> selectRolesByUserId(@Param("userId") String userId);
|
||||
List<DeptRoleVO> selectDeptRolesByUserId(@Param("userId") String userId);
|
||||
|
||||
/**
|
||||
* @description 根据角色编码查询角色
|
||||
|
||||
@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.xyzh.common.dto.user.TbSysUser;
|
||||
import org.xyzh.common.dto.user.TbSysUserInfo;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -26,6 +27,15 @@ public interface UserMapper extends BaseMapper<TbSysUser> {
|
||||
*/
|
||||
TbSysUser selectByUsername(@Param("username") String username);
|
||||
|
||||
/**
|
||||
* @description 根据用户ID查询用户信息
|
||||
* @param userId 用户ID
|
||||
* @return TbSysUserInfo 用户信息
|
||||
* @author yslg
|
||||
* @since 2025-10-06
|
||||
*/
|
||||
TbSysUserInfo selectUserInfoById(@Param("userId") String userId);
|
||||
|
||||
/**
|
||||
* @description 根据邮箱查询用户
|
||||
* @param email 邮箱
|
||||
|
||||
@@ -7,8 +7,10 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.xyzh.common.core.domain.ResultDomain;
|
||||
import org.xyzh.common.dto.dept.TbSysDeptRole;
|
||||
import org.xyzh.common.dto.role.TbSysRole;
|
||||
import org.xyzh.common.utils.IDUtils;
|
||||
import org.xyzh.common.vo.DeptRoleVO;
|
||||
import org.xyzh.system.mapper.RoleMapper;
|
||||
import org.xyzh.system.role.service.SysRoleService;
|
||||
|
||||
@@ -89,24 +91,24 @@ public class SysRoleServiceImpl implements SysRoleService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResultDomain<TbSysRole> getRolesByUserId(String userId) {
|
||||
ResultDomain<TbSysRole> resultDomain = new ResultDomain<>();
|
||||
public ResultDomain<DeptRoleVO> getDeptRolesByUserId(String userId) {
|
||||
ResultDomain<DeptRoleVO> resultDomain = new ResultDomain<>();
|
||||
try {
|
||||
logger.info("开始根据用户ID查询角色列表:{}", userId);
|
||||
logger.info("开始根据用户ID查询部门角色列表:{}", userId);
|
||||
|
||||
if (!StringUtils.hasText(userId)) {
|
||||
resultDomain.fail("用户ID不能为空");
|
||||
return resultDomain;
|
||||
}
|
||||
|
||||
List<TbSysRole> roles = roleMapper.selectRolesByUserId(userId);
|
||||
List<DeptRoleVO> roles = roleMapper.selectDeptRolesByUserId(userId);
|
||||
|
||||
logger.info("根据用户ID查询角色列表完成,共找到{}个角色", roles.size());
|
||||
logger.info("根据用户ID查询部门角色列表完成,共找到{}个部门角色", roles.size());
|
||||
resultDomain.success("查询成功", roles);
|
||||
return resultDomain;
|
||||
|
||||
} catch (Exception e) {
|
||||
logger.error("根据用户ID查询角色列表失败:{}", userId, e);
|
||||
logger.error("根据用户ID查询部门角色列表失败:{}", userId, e);
|
||||
resultDomain.fail("查询角色失败:" + e.getMessage());
|
||||
return resultDomain;
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.StringUtils;
|
||||
import org.xyzh.common.core.domain.ResultDomain;
|
||||
import org.xyzh.common.dto.user.TbSysUser;
|
||||
import org.xyzh.common.dto.user.TbSysUserInfo;
|
||||
import org.xyzh.common.utils.IDUtils;
|
||||
import org.xyzh.system.mapper.UserMapper;
|
||||
import org.xyzh.system.user.service.SysUserService;
|
||||
@@ -512,4 +513,34 @@ public class SysUserServiceImpl implements SysUserService {
|
||||
return resultDomain;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ResultDomain<TbSysUserInfo> getUserInfoById(String userId) {
|
||||
ResultDomain<TbSysUserInfo> resultDomain = new ResultDomain<>();
|
||||
|
||||
try {
|
||||
logger.info("开始根据ID查询用户信息:{}", userId);
|
||||
if (!StringUtils.hasText(userId)) {
|
||||
resultDomain.fail("用户ID不能为空");
|
||||
return resultDomain;
|
||||
}
|
||||
|
||||
TbSysUserInfo userInfo = userMapper.selectUserInfoById(userId);
|
||||
if (userInfo == null) {
|
||||
logger.warn("未找到用户信息:{}", userId);
|
||||
resultDomain.fail("未找到指定用户信息");
|
||||
return resultDomain;
|
||||
}
|
||||
|
||||
logger.info("根据ID查询用户信息完成:{}", userId);
|
||||
resultDomain.success("查询成功", userInfo);
|
||||
return resultDomain;
|
||||
|
||||
} catch (Exception e) {
|
||||
logger.error("根据ID查询用户信息失败:{}", userId, e);
|
||||
resultDomain.fail("查询用户信息失败:" + e.getMessage());
|
||||
return resultDomain;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -83,9 +83,9 @@ mybatis-plus:
|
||||
# 日志配置
|
||||
logging:
|
||||
config: classpath:log4j2-spring.xml
|
||||
level:
|
||||
org.xyzh.system: DEBUG
|
||||
org.xyzh.system.mapper: DEBUG
|
||||
charset:
|
||||
console: UTF-8
|
||||
file: UTF-8
|
||||
|
||||
# 管理端点配置
|
||||
management:
|
||||
|
||||
@@ -1,175 +1,139 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
@description log4j2-spring.xml文件描述 System模块Log4j2配置文件
|
||||
@filename log4j2-spring.xml
|
||||
@author yslg
|
||||
@copyright xyzh
|
||||
@since 2025-09-28
|
||||
校园新闻管理系统 - System模块日志配置
|
||||
-->
|
||||
<Configuration status="WARN" monitorInterval="30">
|
||||
<configuration status="WARN" monitorInterval="30">
|
||||
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
|
||||
|
||||
<!-- 全局属性 -->
|
||||
<!--变量配置-->
|
||||
<Properties>
|
||||
<!-- 应用名称 -->
|
||||
<Property name="APP_NAME">school-news-system</Property>
|
||||
<!-- 日志文件路径 -->
|
||||
<Property name="LOG_HOME">./logs/${APP_NAME}</Property>
|
||||
<!-- 日志格式 -->
|
||||
<Property name="LOG_PATTERN">%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level [%X{traceId}] %logger{36} - %msg%n</Property>
|
||||
<!-- 控制台日志格式(带颜色) -->
|
||||
<Property name="CONSOLE_PATTERN">%d{HH:mm:ss.SSS} %highlight{%-5level} [%t] %style{[%X{traceId}]}{cyan} %style{%logger{36}}{magenta} - %msg%n</Property>
|
||||
<!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
|
||||
<!-- %logger{36} 表示 Logger 名字最长36个字符 -->
|
||||
<property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
|
||||
<!-- 定义日志存储的路径 -->
|
||||
<property name="FILE_PATH" value="./logs" />
|
||||
<!-- System模块日志文件名 -->
|
||||
<property name="FILE_NAME" value="school-news-system" />
|
||||
<!-- 设置系统属性 -->
|
||||
<property name="file.encoding" value="UTF-8" />
|
||||
<property name="console.encoding" value="UTF-8" />
|
||||
</Properties>
|
||||
|
||||
<!-- 输出器配置 -->
|
||||
<Appenders>
|
||||
<appenders>
|
||||
|
||||
<!-- 控制台输出 -->
|
||||
<Console name="Console" target="SYSTEM_OUT">
|
||||
<PatternLayout pattern="${CONSOLE_PATTERN}"/>
|
||||
<!-- 只输出INFO及以上级别 -->
|
||||
<ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||
</Console>
|
||||
<console name="Console" target="SYSTEM_OUT">
|
||||
<!--输出日志的格式-->
|
||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||
<!--控制台输出debug及以上级别的信息-->
|
||||
<ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||
</console>
|
||||
|
||||
<!-- 调试日志文件 -->
|
||||
<RollingFile name="DebugFile" fileName="${LOG_HOME}/debug.log"
|
||||
filePattern="${LOG_HOME}/debug.%d{yyyy-MM-dd}.%i.log.gz">
|
||||
<PatternLayout pattern="${LOG_PATTERN}"/>
|
||||
<!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,适合临时测试用-->
|
||||
<File name="Filelog" fileName="${FILE_PATH}/${FILE_NAME}-test.log" append="false">
|
||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||
</File>
|
||||
|
||||
<!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
|
||||
<RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/${FILE_NAME}-info.log" filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
|
||||
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
|
||||
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||
<Policies>
|
||||
<!-- 每天轮转 -->
|
||||
<!--interval属性用来指定多久滚动一次,默认是1 hour-->
|
||||
<TimeBasedTriggeringPolicy interval="1"/>
|
||||
<!-- 文件大小超过100MB轮转 -->
|
||||
<SizeBasedTriggeringPolicy size="100MB"/>
|
||||
<SizeBasedTriggeringPolicy size="10MB"/>
|
||||
</Policies>
|
||||
<!-- 保留30天的日志文件 -->
|
||||
<DefaultRolloverStrategy max="30"/>
|
||||
<!-- 只输出DEBUG级别 -->
|
||||
<LevelRangeFilter minLevel="DEBUG" maxLevel="DEBUG" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
|
||||
<DefaultRolloverStrategy max="15"/>
|
||||
</RollingFile>
|
||||
|
||||
<!-- 信息日志文件 -->
|
||||
<RollingFile name="InfoFile" fileName="${LOG_HOME}/info.log"
|
||||
filePattern="${LOG_HOME}/info.%d{yyyy-MM-dd}.%i.log.gz">
|
||||
<PatternLayout pattern="${LOG_PATTERN}"/>
|
||||
<!-- 这个会打印出所有的warn及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
|
||||
<RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/${FILE_NAME}-warn.log" filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz">
|
||||
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
|
||||
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||
<Policies>
|
||||
<!--interval属性用来指定多久滚动一次,默认是1 hour-->
|
||||
<TimeBasedTriggeringPolicy interval="1"/>
|
||||
<SizeBasedTriggeringPolicy size="100MB"/>
|
||||
<SizeBasedTriggeringPolicy size="10MB"/>
|
||||
</Policies>
|
||||
<DefaultRolloverStrategy max="30"/>
|
||||
<!-- 只输出INFO级别 -->
|
||||
<LevelRangeFilter minLevel="INFO" maxLevel="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
|
||||
<DefaultRolloverStrategy max="15"/>
|
||||
</RollingFile>
|
||||
|
||||
<!-- 警告日志文件 -->
|
||||
<RollingFile name="WarnFile" fileName="${LOG_HOME}/warn.log"
|
||||
filePattern="${LOG_HOME}/warn.%d{yyyy-MM-dd}.%i.log.gz">
|
||||
<PatternLayout pattern="${LOG_PATTERN}"/>
|
||||
<!-- 这个会打印出所有的error及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
|
||||
<RollingFile name="RollingFileError" fileName="${FILE_PATH}/${FILE_NAME}-error.log" filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
|
||||
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
|
||||
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||
<PatternLayout pattern="${LOG_PATTERN}" charset="UTF-8"/>
|
||||
<Policies>
|
||||
<!--interval属性用来指定多久滚动一次,默认是1 hour-->
|
||||
<TimeBasedTriggeringPolicy interval="1"/>
|
||||
<SizeBasedTriggeringPolicy size="100MB"/>
|
||||
<SizeBasedTriggeringPolicy size="10MB"/>
|
||||
</Policies>
|
||||
<DefaultRolloverStrategy max="30"/>
|
||||
<!-- 只输出WARN级别 -->
|
||||
<LevelRangeFilter minLevel="WARN" maxLevel="WARN" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
|
||||
<DefaultRolloverStrategy max="15"/>
|
||||
</RollingFile>
|
||||
|
||||
<!-- 错误日志文件 -->
|
||||
<RollingFile name="ErrorFile" fileName="${LOG_HOME}/error.log"
|
||||
filePattern="${LOG_HOME}/error.%d{yyyy-MM-dd}.%i.log.gz">
|
||||
<PatternLayout pattern="${LOG_PATTERN}"/>
|
||||
<Policies>
|
||||
<TimeBasedTriggeringPolicy interval="1"/>
|
||||
<SizeBasedTriggeringPolicy size="100MB"/>
|
||||
</Policies>
|
||||
<DefaultRolloverStrategy max="30"/>
|
||||
<!-- 只输出ERROR及以上级别 -->
|
||||
<ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||
</RollingFile>
|
||||
</appenders>
|
||||
|
||||
<!-- SQL日志文件 -->
|
||||
<RollingFile name="SqlFile" fileName="${LOG_HOME}/sql.log"
|
||||
filePattern="${LOG_HOME}/sql.%d{yyyy-MM-dd}.%i.log.gz">
|
||||
<PatternLayout pattern="${LOG_PATTERN}"/>
|
||||
<Policies>
|
||||
<TimeBasedTriggeringPolicy interval="1"/>
|
||||
<SizeBasedTriggeringPolicy size="50MB"/>
|
||||
</Policies>
|
||||
<DefaultRolloverStrategy max="7"/>
|
||||
</RollingFile>
|
||||
<!--Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。-->
|
||||
<!--然后定义loggers,只有定义了logger并引入的appender,appender才会生效-->
|
||||
<loggers>
|
||||
|
||||
<!-- 异步输出器 -->
|
||||
<AsyncAppender name="AsyncConsole">
|
||||
<!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
|
||||
<logger name="org.mybatis" level="info" additivity="false">
|
||||
<AppenderRef ref="Console"/>
|
||||
</logger>
|
||||
<!--监控系统信息-->
|
||||
<!--若是additivity设为false,则 子Logger 只会在自己的appender里输出,不会在 父Logger 的appender里输出。-->
|
||||
<Logger name="org.springframework" level="info" additivity="false">
|
||||
<AppenderRef ref="Console"/>
|
||||
<BufferSize>1024</BufferSize>
|
||||
</AsyncAppender>
|
||||
|
||||
<AsyncAppender name="AsyncDebugFile">
|
||||
<AppenderRef ref="DebugFile"/>
|
||||
<BufferSize>1024</BufferSize>
|
||||
</AsyncAppender>
|
||||
|
||||
<AsyncAppender name="AsyncInfoFile">
|
||||
<AppenderRef ref="InfoFile"/>
|
||||
<BufferSize>1024</BufferSize>
|
||||
</AsyncAppender>
|
||||
|
||||
<AsyncAppender name="AsyncWarnFile">
|
||||
<AppenderRef ref="WarnFile"/>
|
||||
<BufferSize>1024</BufferSize>
|
||||
</AsyncAppender>
|
||||
|
||||
<AsyncAppender name="AsyncErrorFile">
|
||||
<AppenderRef ref="ErrorFile"/>
|
||||
<BufferSize>1024</BufferSize>
|
||||
</AsyncAppender>
|
||||
|
||||
<AsyncAppender name="AsyncSqlFile">
|
||||
<AppenderRef ref="SqlFile"/>
|
||||
<BufferSize>512</BufferSize>
|
||||
</AsyncAppender>
|
||||
|
||||
</Appenders>
|
||||
|
||||
<!-- 记录器配置 -->
|
||||
<Loggers>
|
||||
|
||||
<!-- SQL日志 -->
|
||||
<Logger name="org.xyzh.system.mapper" level="DEBUG" additivity="false">
|
||||
<AppenderRef ref="AsyncSqlFile"/>
|
||||
<AppenderRef ref="AsyncConsole"/>
|
||||
</Logger>
|
||||
|
||||
<!-- MyBatis日志 -->
|
||||
<Logger name="com.baomidou.mybatisplus" level="DEBUG" additivity="false">
|
||||
<AppenderRef ref="AsyncSqlFile"/>
|
||||
<!-- 项目包日志配置 - Auth模块 -->
|
||||
<Logger name="org.xyzh.auth" level="debug" additivity="false">
|
||||
<AppenderRef ref="Console"/>
|
||||
<AppenderRef ref="Filelog"/>
|
||||
<AppenderRef ref="RollingFileInfo"/>
|
||||
<AppenderRef ref="RollingFileWarn"/>
|
||||
<AppenderRef ref="RollingFileError"/>
|
||||
</Logger>
|
||||
|
||||
<!-- Druid日志 -->
|
||||
<Logger name="com.alibaba.druid" level="INFO" additivity="false">
|
||||
<AppenderRef ref="AsyncInfoFile"/>
|
||||
<!-- 项目包日志配置 - System模块 -->
|
||||
<Logger name="org.xyzh.system" level="debug" additivity="false">
|
||||
<AppenderRef ref="Console"/>
|
||||
<AppenderRef ref="Filelog"/>
|
||||
<AppenderRef ref="RollingFileInfo"/>
|
||||
<AppenderRef ref="RollingFileWarn"/>
|
||||
<AppenderRef ref="RollingFileError"/>
|
||||
</Logger>
|
||||
|
||||
<!-- Spring框架日志 -->
|
||||
<Logger name="org.springframework" level="INFO" additivity="false">
|
||||
<AppenderRef ref="AsyncInfoFile"/>
|
||||
<!-- 项目包日志配置 - News模块 -->
|
||||
<Logger name="org.xyzh.news" level="debug" additivity="false">
|
||||
<AppenderRef ref="Console"/>
|
||||
<AppenderRef ref="Filelog"/>
|
||||
<AppenderRef ref="RollingFileInfo"/>
|
||||
<AppenderRef ref="RollingFileWarn"/>
|
||||
<AppenderRef ref="RollingFileError"/>
|
||||
</Logger>
|
||||
|
||||
<!-- 系统模块日志 -->
|
||||
<Logger name="org.xyzh.system" level="DEBUG" additivity="false">
|
||||
<AppenderRef ref="AsyncDebugFile"/>
|
||||
<AppenderRef ref="AsyncInfoFile"/>
|
||||
<AppenderRef ref="AsyncWarnFile"/>
|
||||
<AppenderRef ref="AsyncErrorFile"/>
|
||||
<AppenderRef ref="AsyncConsole"/>
|
||||
<!-- 项目包日志配置 - Common模块 -->
|
||||
<Logger name="org.xyzh.common" level="debug" additivity="false">
|
||||
<AppenderRef ref="Console"/>
|
||||
<AppenderRef ref="Filelog"/>
|
||||
<AppenderRef ref="RollingFileInfo"/>
|
||||
<AppenderRef ref="RollingFileWarn"/>
|
||||
<AppenderRef ref="RollingFileError"/>
|
||||
</Logger>
|
||||
|
||||
<!-- 根记录器 -->
|
||||
<Root level="INFO">
|
||||
<AppenderRef ref="AsyncInfoFile"/>
|
||||
<AppenderRef ref="AsyncWarnFile"/>
|
||||
<AppenderRef ref="AsyncErrorFile"/>
|
||||
<AppenderRef ref="AsyncConsole"/>
|
||||
</Root>
|
||||
<root level="info">
|
||||
<appender-ref ref="Console"/>
|
||||
<appender-ref ref="Filelog"/>
|
||||
<appender-ref ref="RollingFileInfo"/>
|
||||
<appender-ref ref="RollingFileWarn"/>
|
||||
<appender-ref ref="RollingFileError"/>
|
||||
</root>
|
||||
</loggers>
|
||||
|
||||
</Loggers>
|
||||
|
||||
</Configuration>
|
||||
</configuration>
|
||||
|
||||
@@ -6,12 +6,12 @@
|
||||
<resultMap id="BaseResultMap" type="org.xyzh.common.dto.menu.TbSysMenu">
|
||||
<id column="id" property="id" jdbcType="VARCHAR"/>
|
||||
<result column="menu_id" property="menuID" jdbcType="VARCHAR"/>
|
||||
<result column="name" property="menuName" jdbcType="VARCHAR"/>
|
||||
<result column="name" property="name" jdbcType="VARCHAR"/>
|
||||
<result column="parent_id" property="parentID" jdbcType="VARCHAR"/>
|
||||
<result column="url" property="path" jdbcType="VARCHAR"/>
|
||||
<result column="url" property="url" jdbcType="VARCHAR"/>
|
||||
<result column="icon" property="icon" jdbcType="VARCHAR"/>
|
||||
<result column="order_num" property="sort" jdbcType="INTEGER"/>
|
||||
<result column="type" property="menuType" jdbcType="INTEGER"/>
|
||||
<result column="order_num" property="orderNum" jdbcType="INTEGER"/>
|
||||
<result column="type" property="type" jdbcType="INTEGER"/>
|
||||
<result column="creator" property="creator" jdbcType="VARCHAR"/>
|
||||
<result column="updater" property="updater" jdbcType="VARCHAR"/>
|
||||
<result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
|
||||
@@ -22,25 +22,19 @@
|
||||
|
||||
<!-- 基础字段 -->
|
||||
<sql id="Base_Column_List">
|
||||
id, menu_id, name, parent_id, url, icon, order_num, type,
|
||||
creator, updater, create_time, update_time, delete_time, deleted
|
||||
m.id, m.menu_id, m.name, m.parent_id, m.url, m.icon, m.order_num, m.type,
|
||||
m.creator, m.updater, m.create_time, m.update_time, m.delete_time, m.deleted
|
||||
</sql>
|
||||
|
||||
<!-- 通用条件 -->
|
||||
<sql id="Where_Clause">
|
||||
<where>
|
||||
deleted = 0
|
||||
<if test="menuName != null and menuName != ''">
|
||||
AND menu_name LIKE CONCAT('%', #{menuName}, '%')
|
||||
<if test="name != null and name != ''">
|
||||
AND name LIKE CONCAT('%', #{name}, '%')
|
||||
</if>
|
||||
<if test="menuType != null">
|
||||
AND menu_type = #{menuType}
|
||||
</if>
|
||||
<if test="status != null">
|
||||
AND status = #{status}
|
||||
</if>
|
||||
<if test="visible != null">
|
||||
AND visible = #{visible}
|
||||
<if test="type != null">
|
||||
AND type = #{type}
|
||||
</if>
|
||||
</where>
|
||||
</sql>
|
||||
@@ -48,81 +42,74 @@
|
||||
<!-- 根据用户ID查询菜单列表 -->
|
||||
<select id="selectMenusByUserId" resultMap="BaseResultMap">
|
||||
SELECT DISTINCT
|
||||
m.id, m.menu_id, m.parent_id, m.menu_name, m.menu_type,
|
||||
m.path, m.component, m.permission, m.icon, m.sort,
|
||||
m.visible, m.status, m.external_link, m.cache, m.frame,
|
||||
m.query, m.remark, m.creator, m.updater,
|
||||
m.create_time, m.update_time, m.delete_time, m.deleted
|
||||
FROM tb_sys_menu m
|
||||
INNER JOIN tb_sys_role_menu rm ON m.menu_id = rm.menu_id
|
||||
INNER JOIN tb_sys_user_role ur ON rm.role_id = ur.role_id
|
||||
<include refid="Base_Column_List"/>
|
||||
FROM tb_sys_user_dept_role ur
|
||||
INNER JOIN tb_sys_role_permission rp ON rp.role_id = ur.role_id
|
||||
INNER JOIN tb_sys_menu_permission mp ON mp.permission_id = rp.permission_id
|
||||
INNER JOIN tb_sys_menu m ON m.menu_id = mp.menu_id
|
||||
WHERE m.deleted = 0
|
||||
AND rm.deleted = 0
|
||||
AND rp.deleted = 0
|
||||
AND mp.deleted = 0
|
||||
AND ur.deleted = 0
|
||||
AND ur.user_id = #{userId}
|
||||
AND m.status = 1
|
||||
AND m.visible = 1
|
||||
ORDER BY m.sort ASC, m.create_time ASC
|
||||
ORDER BY m.create_time ASC
|
||||
</select>
|
||||
|
||||
<!-- 根据角色ID查询菜单列表 -->
|
||||
<select id="selectMenusByRoleId" resultMap="BaseResultMap">
|
||||
SELECT
|
||||
m.id, m.menu_id, m.parent_id, m.menu_name, m.menu_type,
|
||||
m.path, m.component, m.permission, m.icon, m.sort,
|
||||
m.visible, m.status, m.external_link, m.cache, m.frame,
|
||||
m.query, m.remark, m.creator, m.updater,
|
||||
m.create_time, m.update_time, m.delete_time, m.deleted
|
||||
FROM tb_sys_menu m
|
||||
INNER JOIN tb_sys_role_menu rm ON m.menu_id = rm.menu_id
|
||||
<include refid="Base_Column_List"/>
|
||||
FROM tb_sys_role_permission rp
|
||||
INNER JOIN tb_sys_menu_permission mp ON mp.permission_id = rp.permission_id
|
||||
INNER JOIN tb_sys_menu m ON m.menu_id = mp.menu_id
|
||||
WHERE m.deleted = 0
|
||||
AND rm.deleted = 0
|
||||
AND rm.role_id = #{roleId}
|
||||
ORDER BY m.sort ASC, m.create_time ASC
|
||||
AND mp.deleted = 0
|
||||
AND rp.deleted = 0
|
||||
AND rp.role_id = #{roleId}
|
||||
ORDER BY m.create_time ASC
|
||||
</select>
|
||||
|
||||
<!-- 根据父菜单ID查询子菜单列表 -->
|
||||
<select id="selectByParentId" resultMap="BaseResultMap">
|
||||
SELECT
|
||||
<include refid="Base_Column_List"/>
|
||||
FROM tb_sys_menu
|
||||
WHERE deleted = 0
|
||||
FROM tb_sys_menu m
|
||||
WHERE m.deleted = 0
|
||||
AND parent_id = #{parentId}
|
||||
ORDER BY sort ASC, create_time ASC
|
||||
ORDER BY create_time ASC
|
||||
</select>
|
||||
|
||||
<!-- 查询菜单树结构 -->
|
||||
<select id="selectMenuTree" resultMap="BaseResultMap">
|
||||
SELECT
|
||||
<include refid="Base_Column_List"/>
|
||||
FROM tb_sys_menu
|
||||
WHERE deleted = 0
|
||||
FROM tb_sys_menu m
|
||||
WHERE m.deleted = 0
|
||||
ORDER BY
|
||||
CASE WHEN parent_id IS NULL OR parent_id = '' THEN 0 ELSE 1 END,
|
||||
parent_id,
|
||||
sort ASC,
|
||||
create_time ASC
|
||||
</select>
|
||||
|
||||
<!-- 检查菜单名称是否存在 -->
|
||||
<select id="countByMenuName" resultType="int">
|
||||
SELECT COUNT(1)
|
||||
FROM tb_sys_menu
|
||||
FROM tb_sys_menu m
|
||||
WHERE deleted = 0
|
||||
AND menu_name = #{menuName}
|
||||
AND m.name = #{name}
|
||||
<if test="excludeId != null and excludeId != ''">
|
||||
AND id != #{excludeId}
|
||||
AND m.id != #{excludeId}
|
||||
</if>
|
||||
</select>
|
||||
|
||||
<!-- 批量删除菜单(逻辑删除) -->
|
||||
<update id="batchDeleteByIds">
|
||||
UPDATE tb_sys_menu
|
||||
UPDATE tb_sys_menu m
|
||||
SET deleted = 1,
|
||||
delete_time = NOW(),
|
||||
updater = #{updater}
|
||||
WHERE deleted = 0
|
||||
AND id IN
|
||||
WHERE m.deleted = 0
|
||||
AND m.id IN
|
||||
<foreach collection="menuIds" item="menuId" open="(" separator="," close=")">
|
||||
#{menuId}
|
||||
</foreach>
|
||||
@@ -135,20 +122,10 @@
|
||||
<if test="id != null">id,</if>
|
||||
<if test="menuID != null">menu_id,</if>
|
||||
<if test="parentID != null">parent_id,</if>
|
||||
<if test="menuName != null">menu_name,</if>
|
||||
<if test="menuType != null">menu_type,</if>
|
||||
<if test="path != null">path,</if>
|
||||
<if test="component != null">component,</if>
|
||||
<if test="permission != null">permission,</if>
|
||||
<if test="name != null">name,</if>
|
||||
<if test="type != null">type,</if>
|
||||
<if test="url != null">url,</if>
|
||||
<if test="icon != null">icon,</if>
|
||||
<if test="sort != null">sort,</if>
|
||||
<if test="visible != null">visible,</if>
|
||||
<if test="status != null">status,</if>
|
||||
<if test="externalLink != null">external_link,</if>
|
||||
<if test="cache != null">cache,</if>
|
||||
<if test="frame != null">frame,</if>
|
||||
<if test="query != null">query,</if>
|
||||
<if test="remark != null">remark,</if>
|
||||
<if test="creator != null">creator,</if>
|
||||
<if test="createTime != null">create_time,</if>
|
||||
deleted
|
||||
@@ -157,20 +134,10 @@
|
||||
<if test="id != null">#{id},</if>
|
||||
<if test="menuID != null">#{menuID},</if>
|
||||
<if test="parentID != null">#{parentID},</if>
|
||||
<if test="menuName != null">#{menuName},</if>
|
||||
<if test="menuType != null">#{menuType},</if>
|
||||
<if test="path != null">#{path},</if>
|
||||
<if test="component != null">#{component},</if>
|
||||
<if test="permission != null">#{permission},</if>
|
||||
<if test="name != null">#{name},</if>
|
||||
<if test="type != null">#{type},</if>
|
||||
<if test="url != null">#{url},</if>
|
||||
<if test="icon != null">#{icon},</if>
|
||||
<if test="sort != null">#{sort},</if>
|
||||
<if test="visible != null">#{visible},</if>
|
||||
<if test="status != null">#{status},</if>
|
||||
<if test="externalLink != null">#{externalLink},</if>
|
||||
<if test="cache != null">#{cache},</if>
|
||||
<if test="frame != null">#{frame},</if>
|
||||
<if test="query != null">#{query},</if>
|
||||
<if test="remark != null">#{remark},</if>
|
||||
<if test="creator != null">#{creator},</if>
|
||||
<if test="createTime != null">#{createTime},</if>
|
||||
0
|
||||
@@ -183,20 +150,10 @@
|
||||
<set>
|
||||
<if test="menuID != null">menu_id = #{menuID},</if>
|
||||
<if test="parentID != null">parent_id = #{parentID},</if>
|
||||
<if test="menuName != null">menu_name = #{menuName},</if>
|
||||
<if test="menuType != null">menu_type = #{menuType},</if>
|
||||
<if test="path != null">path = #{path},</if>
|
||||
<if test="component != null">component = #{component},</if>
|
||||
<if test="permission != null">permission = #{permission},</if>
|
||||
<if test="name != null">name = #{name},</if>
|
||||
<if test="type != null">type = #{type},</if>
|
||||
<if test="url != null">url = #{url},</if>
|
||||
<if test="icon != null">icon = #{icon},</if>
|
||||
<if test="sort != null">sort = #{sort},</if>
|
||||
<if test="visible != null">visible = #{visible},</if>
|
||||
<if test="status != null">status = #{status},</if>
|
||||
<if test="externalLink != null">external_link = #{externalLink},</if>
|
||||
<if test="cache != null">cache = #{cache},</if>
|
||||
<if test="frame != null">frame = #{frame},</if>
|
||||
<if test="query != null">query = #{query},</if>
|
||||
<if test="remark != null">remark = #{remark},</if>
|
||||
<if test="updater != null">updater = #{updater},</if>
|
||||
update_time = NOW()
|
||||
</set>
|
||||
|
||||
@@ -6,8 +6,8 @@
|
||||
<resultMap id="BaseResultMap" type="org.xyzh.common.dto.permission.TbSysPermission">
|
||||
<id column="id" property="id" jdbcType="VARCHAR"/>
|
||||
<result column="permission_id" property="permissionID" jdbcType="VARCHAR"/>
|
||||
<result column="name" property="permissionName" jdbcType="VARCHAR"/>
|
||||
<result column="code" property="permissionCode" jdbcType="VARCHAR"/>
|
||||
<result column="name" property="name" jdbcType="VARCHAR"/>
|
||||
<result column="code" property="code" jdbcType="VARCHAR"/>
|
||||
<result column="description" property="description" jdbcType="VARCHAR"/>
|
||||
<result column="creator" property="creator" jdbcType="VARCHAR"/>
|
||||
<result column="updater" property="updater" jdbcType="VARCHAR"/>
|
||||
@@ -27,11 +27,11 @@
|
||||
<sql id="Where_Clause">
|
||||
<where>
|
||||
deleted = 0
|
||||
<if test="permissionName != null and permissionName != ''">
|
||||
AND permission_name LIKE CONCAT('%', #{permissionName}, '%')
|
||||
<if test="name != null and name != ''">
|
||||
AND name LIKE CONCAT('%', #{name}, '%')
|
||||
</if>
|
||||
<if test="permissionCode != null and permissionCode != ''">
|
||||
AND permission_code = #{permissionCode}
|
||||
<if test="code != null and code != ''">
|
||||
AND code = #{code}
|
||||
</if>
|
||||
<if test="permissionType != null">
|
||||
AND permission_type = #{permissionType}
|
||||
@@ -45,63 +45,60 @@
|
||||
<!-- 根据用户ID查询权限列表 -->
|
||||
<select id="selectPermissionsByUserId" resultMap="BaseResultMap">
|
||||
SELECT DISTINCT
|
||||
p.id, p.permission_id, p.permission_name, p.permission_code,
|
||||
p.permission_type, p.resource_url, p.http_method, p.description,
|
||||
p.status, p.sort, p.creator, p.updater,
|
||||
p.id, p.permission_id, p.name, p.code, p.description,
|
||||
p.creator, p.updater,
|
||||
p.create_time, p.update_time, p.delete_time, p.deleted
|
||||
FROM tb_sys_permission p
|
||||
INNER JOIN tb_sys_role_permission rp ON p.permission_id = rp.permission_id
|
||||
INNER JOIN tb_sys_user_role ur ON rp.role_id = ur.role_id
|
||||
FROM tb_sys_user_dept_role ur
|
||||
INNER JOIN tb_sys_role_permission rp ON rp.role_id = ur.role_id
|
||||
INNER JOIN tb_sys_permission p ON p.permission_id = rp.permission_id
|
||||
WHERE p.deleted = 0
|
||||
AND rp.deleted = 0
|
||||
AND ur.deleted = 0
|
||||
AND ur.user_id = #{userID}
|
||||
AND p.status = 1
|
||||
ORDER BY p.sort ASC, p.create_time ASC
|
||||
AND ur.user_id = #{userId}
|
||||
ORDER BY p.create_time ASC
|
||||
</select>
|
||||
|
||||
<!-- 根据角色ID查询权限列表 -->
|
||||
<select id="selectPermissionsByRoleId" resultMap="BaseResultMap">
|
||||
SELECT
|
||||
p.id, p.permission_id, p.permission_name, p.permission_code,
|
||||
p.permission_type, p.resource_url, p.http_method, p.description,
|
||||
p.status, p.sort, p.creator, p.updater,
|
||||
p.id, p.permission_id, p.name, p.code, p.description,
|
||||
p.creator, p.updater,
|
||||
p.create_time, p.update_time, p.delete_time, p.deleted
|
||||
FROM tb_sys_permission p
|
||||
INNER JOIN tb_sys_role_permission rp ON p.permission_id = rp.permission_id
|
||||
FROM tb_sys_role_permission rp
|
||||
INNER JOIN tb_sys_permission p ON p.permission_id = rp.permission_id
|
||||
WHERE p.deleted = 0
|
||||
AND rp.deleted = 0
|
||||
AND rp.role_id = #{roleId}
|
||||
ORDER BY p.sort ASC, p.create_time ASC
|
||||
ORDER BY p.create_time ASC
|
||||
</select>
|
||||
|
||||
<!-- 根据权限编码查询权限 -->
|
||||
<select id="selectByPermissionCode" resultMap="BaseResultMap">
|
||||
<select id="selectBycode" resultMap="BaseResultMap">
|
||||
SELECT
|
||||
<include refid="Base_Column_List"/>
|
||||
FROM tb_sys_permission
|
||||
WHERE deleted = 0
|
||||
AND permission_code = #{permissionCode}
|
||||
AND code = #{code}
|
||||
LIMIT 1
|
||||
</select>
|
||||
|
||||
<!-- 检查权限名称是否存在 -->
|
||||
<select id="countByPermissionName" resultType="int">
|
||||
<select id="countByname" resultType="int">
|
||||
SELECT COUNT(1)
|
||||
FROM tb_sys_permission
|
||||
WHERE deleted = 0
|
||||
AND permission_name = #{permissionName}
|
||||
AND name = #{name}
|
||||
<if test="excludeId != null and excludeId != ''">
|
||||
AND id != #{excludeId}
|
||||
</if>
|
||||
</select>
|
||||
|
||||
<!-- 检查权限编码是否存在 -->
|
||||
<select id="countByPermissionCode" resultType="int">
|
||||
<select id="countBycode" resultType="int">
|
||||
SELECT COUNT(1)
|
||||
FROM tb_sys_permission
|
||||
WHERE deleted = 0
|
||||
AND permission_code = #{permissionCode}
|
||||
AND code = #{code}
|
||||
<if test="excludeId != null and excludeId != ''">
|
||||
AND id != #{excludeId}
|
||||
</if>
|
||||
@@ -126,14 +123,13 @@
|
||||
<trim prefix="(" suffix=")" suffixOverrides=",">
|
||||
<if test="id != null">id,</if>
|
||||
<if test="permissionID != null">permission_id,</if>
|
||||
<if test="permissionName != null">permission_name,</if>
|
||||
<if test="permissionCode != null">permission_code,</if>
|
||||
<if test="name != null">name,</if>
|
||||
<if test="code != null">code,</if>
|
||||
<if test="permissionType != null">permission_type,</if>
|
||||
<if test="resourceUrl != null">resource_url,</if>
|
||||
<if test="httpMethod != null">http_method,</if>
|
||||
<if test="description != null">description,</if>
|
||||
<if test="status != null">status,</if>
|
||||
<if test="sort != null">sort,</if>
|
||||
<if test="creator != null">creator,</if>
|
||||
<if test="createTime != null">create_time,</if>
|
||||
deleted
|
||||
@@ -141,14 +137,13 @@
|
||||
<trim prefix="values (" suffix=")" suffixOverrides=",">
|
||||
<if test="id != null">#{id},</if>
|
||||
<if test="permissionID != null">#{permissionID},</if>
|
||||
<if test="permissionName != null">#{permissionName},</if>
|
||||
<if test="permissionCode != null">#{permissionCode},</if>
|
||||
<if test="name != null">#{name},</if>
|
||||
<if test="code != null">#{code},</if>
|
||||
<if test="permissionType != null">#{permissionType},</if>
|
||||
<if test="resourceUrl != null">#{resourceUrl},</if>
|
||||
<if test="httpMethod != null">#{httpMethod},</if>
|
||||
<if test="description != null">#{description},</if>
|
||||
<if test="status != null">#{status},</if>
|
||||
<if test="sort != null">#{sort},</if>
|
||||
<if test="creator != null">#{creator},</if>
|
||||
<if test="createTime != null">#{createTime},</if>
|
||||
0
|
||||
@@ -160,14 +155,13 @@
|
||||
UPDATE tb_sys_permission
|
||||
<set>
|
||||
<if test="permissionID != null">permission_id = #{permissionID},</if>
|
||||
<if test="permissionName != null">permission_name = #{permissionName},</if>
|
||||
<if test="permissionCode != null">permission_code = #{permissionCode},</if>
|
||||
<if test="name != null">name = #{name},</if>
|
||||
<if test="code != null">code = #{code},</if>
|
||||
<if test="permissionType != null">permission_type = #{permissionType},</if>
|
||||
<if test="resourceUrl != null">resource_url = #{resourceUrl},</if>
|
||||
<if test="httpMethod != null">http_method = #{httpMethod},</if>
|
||||
<if test="description != null">description = #{description},</if>
|
||||
<if test="status != null">status = #{status},</if>
|
||||
<if test="sort != null">sort = #{sort},</if>
|
||||
<if test="updater != null">updater = #{updater},</if>
|
||||
update_time = NOW()
|
||||
</set>
|
||||
|
||||
@@ -3,10 +3,11 @@
|
||||
<mapper namespace="org.xyzh.system.mapper.RoleMapper">
|
||||
|
||||
<!-- 基础结果映射 -->
|
||||
<resultMap id="BaseResultMap" type="org.xyzh.common.dto.role.TbSysRole">
|
||||
<resultMap id="tbSysRoleResultMap" type="org.xyzh.common.dto.role.TbSysRole">
|
||||
<id column="id" property="id" jdbcType="VARCHAR"/>
|
||||
<result column="dept_id" property="deptID" jdbcType="VARCHAR"/>
|
||||
<result column="role_id" property="roleID" jdbcType="VARCHAR"/>
|
||||
<result column="name" property="roleName" jdbcType="VARCHAR"/>
|
||||
<result column="name" property="name" jdbcType="VARCHAR"/>
|
||||
<result column="description" property="description" jdbcType="VARCHAR"/>
|
||||
<result column="creator" property="creator" jdbcType="VARCHAR"/>
|
||||
<result column="updater" property="updater" jdbcType="VARCHAR"/>
|
||||
@@ -16,11 +17,42 @@
|
||||
<result column="deleted" property="deleted" jdbcType="BOOLEAN"/>
|
||||
</resultMap>
|
||||
|
||||
<resultMap id="deptRoleVOResultMap" type="org.xyzh.common.vo.DeptRoleVO">
|
||||
<result column="dept_id" property="dept.deptID" jdbcType="VARCHAR"/>
|
||||
<result column="dept_name" property="dept.name" jdbcType="VARCHAR"/>
|
||||
<result column="dept_description" property="dept.description" jdbcType="VARCHAR"/>
|
||||
<result column="dept_creator" property="dept.creator" jdbcType="VARCHAR"/>
|
||||
<result column="dept_updater" property="dept.updater" jdbcType="VARCHAR"/>
|
||||
<result column="dept_create_time" property="dept.createTime" jdbcType="TIMESTAMP"/>
|
||||
<result column="dept_update_time" property="dept.updateTime" jdbcType="TIMESTAMP"/>
|
||||
<result column="dept_delete_time" property="dept.deleteTime" jdbcType="TIMESTAMP"/>
|
||||
<result column="dept_deleted" property="dept.deleted" jdbcType="BOOLEAN"/>
|
||||
<result column="role_id" property="role.roleID" jdbcType="VARCHAR"/>
|
||||
<result column="role_name" property="role.name" jdbcType="VARCHAR"/>
|
||||
<result column="role_description" property="role.description" jdbcType="VARCHAR"/>
|
||||
<result column="role_creator" property="role.creator" jdbcType="VARCHAR"/>
|
||||
<result column="role_updater" property="role.updater" jdbcType="VARCHAR"/>
|
||||
<result column="role_create_time" property="role.createTime" jdbcType="TIMESTAMP"/>
|
||||
<result column="role_update_time" property="role.updateTime" jdbcType="TIMESTAMP"/>
|
||||
<result column="role_delete_time" property="role.deleteTime" jdbcType="TIMESTAMP"/>
|
||||
<result column="role_deleted" property="role.deleted" jdbcType="BOOLEAN"/>
|
||||
</resultMap>
|
||||
<!-- 基础字段 -->
|
||||
<sql id="Base_Column_List">
|
||||
id, role_id, name, description, creator, updater,
|
||||
<sql id="TbSysRole_Column_List">
|
||||
id, dept_id, role_id, name, description, creator, updater,
|
||||
create_time, update_time, delete_time, deleted
|
||||
</sql>
|
||||
<sql id="TbSysDeptRole_Column_List">
|
||||
dr.id, dr.dept_id, dr.role_id,
|
||||
r.name as role_name, d.name as dept_name,
|
||||
r.description as role_description, d.description as dept_description,
|
||||
r.creator as role_creator, d.creator as dept_creator,
|
||||
r.updater as role_updater, d.updater as dept_updater,
|
||||
r.create_time as role_create_time, d.create_time as dept_create_time,
|
||||
r.update_time as role_update_time, d.update_time as dept_update_time,
|
||||
r.delete_time as role_delete_time, d.delete_time as dept_delete_time,
|
||||
r.deleted as role_deleted, d.deleted as dept_deleted
|
||||
</sql>
|
||||
|
||||
<!-- 通用条件 -->
|
||||
<sql id="Where_Clause">
|
||||
@@ -39,23 +71,21 @@
|
||||
</sql>
|
||||
|
||||
<!-- 根据用户ID查询角色列表 -->
|
||||
<select id="selectRolesByUserId" resultMap="BaseResultMap">
|
||||
<select id="selectDeptRolesByUserId" resultMap="deptRoleVOResultMap">
|
||||
SELECT
|
||||
r.id, r.role_id, r.role_name, r.role_code, r.description,
|
||||
r.status, r.sort, r.creator, r.updater,
|
||||
r.create_time, r.update_time, r.delete_time, r.deleted
|
||||
FROM tb_sys_role r
|
||||
INNER JOIN tb_sys_user_role ur ON r.role_id = ur.role_id
|
||||
WHERE r.deleted = 0
|
||||
AND ur.deleted = 0
|
||||
AND ur.user_id = #{userID}
|
||||
ORDER BY r.sort ASC, r.create_time ASC
|
||||
<include refid="TbSysDeptRole_Column_List"/>
|
||||
FROM tb_sys_user_dept_role dr
|
||||
INNER JOIN tb_sys_role r ON r.role_id = dr.role_id
|
||||
INNER JOIN tb_sys_dept d ON d.dept_id = dr.dept_id
|
||||
WHERE dr.deleted = 0
|
||||
AND dr.user_id = #{userId}
|
||||
ORDER BY dr.create_time ASC
|
||||
</select>
|
||||
|
||||
<!-- 根据角色编码查询角色 -->
|
||||
<select id="selectByRoleCode" resultMap="BaseResultMap">
|
||||
<select id="selectByRoleCode" resultMap="tbSysRoleResultMap">
|
||||
SELECT
|
||||
<include refid="Base_Column_List"/>
|
||||
<include refid="TbSysRole_Column_List"/>
|
||||
FROM tb_sys_role
|
||||
WHERE deleted = 0
|
||||
AND role_code = #{roleCode}
|
||||
@@ -107,7 +137,6 @@
|
||||
<if test="roleCode != null">role_code,</if>
|
||||
<if test="description != null">description,</if>
|
||||
<if test="status != null">status,</if>
|
||||
<if test="sort != null">sort,</if>
|
||||
<if test="creator != null">creator,</if>
|
||||
<if test="createTime != null">create_time,</if>
|
||||
deleted
|
||||
@@ -119,7 +148,6 @@
|
||||
<if test="roleCode != null">#{roleCode},</if>
|
||||
<if test="description != null">#{description},</if>
|
||||
<if test="status != null">#{status},</if>
|
||||
<if test="sort != null">#{sort},</if>
|
||||
<if test="creator != null">#{creator},</if>
|
||||
<if test="createTime != null">#{createTime},</if>
|
||||
0
|
||||
@@ -135,7 +163,6 @@
|
||||
<if test="roleCode != null">role_code = #{roleCode},</if>
|
||||
<if test="description != null">description = #{description},</if>
|
||||
<if test="status != null">status = #{status},</if>
|
||||
<if test="sort != null">sort = #{sort},</if>
|
||||
<if test="updater != null">updater = #{updater},</if>
|
||||
update_time = NOW()
|
||||
</set>
|
||||
|
||||
@@ -17,12 +17,38 @@
|
||||
<result column="status" property="status" jdbcType="INTEGER"/>
|
||||
</resultMap>
|
||||
|
||||
<resultMap id="UserInfoResultMap" type="org.xyzh.common.dto.user.TbSysUserInfo">
|
||||
<id column="id" property="id" jdbcType="VARCHAR"/>
|
||||
<result column="user_id" property="userID" jdbcType="VARCHAR"/>
|
||||
<result column="avatar" property="avatar" jdbcType="VARCHAR"/>
|
||||
<result column="gender" property="gender" jdbcType="INTEGER"/>
|
||||
<result column="family_name" property="familyName" jdbcType="VARCHAR"/>
|
||||
<result column="given_name" property="givenName" jdbcType="VARCHAR"/>
|
||||
<result column="full_name" property="fullName" jdbcType="VARCHAR"/>
|
||||
<result column="id_card" property="idCard" jdbcType="VARCHAR"/>
|
||||
<result column="address" property="address" jdbcType="VARCHAR"/>
|
||||
<result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
|
||||
<result column="update_time" property="updateTime" jdbcType="TIMESTAMP"/>
|
||||
<result column="delete_time" property="deleteTime" jdbcType="TIMESTAMP"/>
|
||||
<result column="deleted" property="deleted" jdbcType="INTEGER"/>
|
||||
</resultMap>
|
||||
<!-- 基础字段 -->
|
||||
<sql id="Base_Column_List">
|
||||
id, username, password, email, phone, wechat_id,
|
||||
create_time, update_time, delete_time, deleted, status
|
||||
</sql>
|
||||
|
||||
<sql id="FullUser_Column_List">
|
||||
id, user_id, avatar, gender, family_name, given_name, full_name, id_card, address,
|
||||
create_time, update_time, delete_time, deleted, status
|
||||
</sql>
|
||||
|
||||
<!-- 用户信息字段 -->
|
||||
<sql id="UserInfo_Column_List">
|
||||
id, user_id, avatar, gender, family_name, given_name, full_name, id_card, address,
|
||||
create_time, update_time, delete_time, deleted
|
||||
</sql>
|
||||
|
||||
<!-- 通用条件 -->
|
||||
<sql id="Where_Clause">
|
||||
<where>
|
||||
@@ -52,6 +78,16 @@
|
||||
LIMIT 1
|
||||
</select>
|
||||
|
||||
<!-- 根据用户ID查询用户信息 -->
|
||||
<select id="selectUserInfoById" resultMap="UserInfoResultMap">
|
||||
SELECT
|
||||
<include refid="UserInfo_Column_List"/>
|
||||
FROM tb_sys_user_info
|
||||
WHERE deleted = 0
|
||||
AND user_id = #{userId}
|
||||
LIMIT 1
|
||||
</select>
|
||||
|
||||
<!-- 根据邮箱查询用户 -->
|
||||
<select id="selectByEmail" resultMap="BaseResultMap">
|
||||
SELECT
|
||||
|
||||
Reference in New Issue
Block a user