v0.03 重构换分支

v0.0
bruce 2025-02-12 23:47:57 +08:00
parent 7ef4e49890
commit 56e70736c9
25 changed files with 297 additions and 277 deletions

80
pom.xml
View File

@ -9,7 +9,7 @@
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.bruce</groupId>
<artifactId>SAMS</artifactId>
<artifactId>SAMS_O</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>SAMS</name>
<description>SAMS</description>
@ -39,73 +39,64 @@
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.10.1</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter-test</artifactId>
<version>3.0.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
<!-- token &jwt 依赖 -->
<!-- boot 日志依赖-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.5</version>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<version>3.4.2</version>
</dependency>
<!--MyBatis PLUS3-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.10.1</version>
</dependency>
<!--MySQL驱动-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.5</version>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<!-- 日志系统依赖 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.5.16</version>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.36</version>
<optional>true</optional>
</dependency>
<!--validation 依赖-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.5.16</version>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<!--日志框架-->
<!-- jwt 依赖 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.16</version>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.12.5</version>
</dependency>
<!--fastjson-->
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.53</version>
</dependency>
</dependencies>
@ -120,6 +111,7 @@
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.36</version>
</path>
</annotationProcessorPaths>
</configuration>

View File

@ -1,95 +0,0 @@
package com.bruce.sams.Config;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.bruce.sams.Entity.SysRole;
import com.bruce.sams.Service.SysUserService;
import com.bruce.sams.Entity.SysUser;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
/**
* Spring Secrutiy
*/
@Configuration
public class SecurityConfig {
private final SysUserService userService;
public SecurityConfig(SysUserService userService) {
this.userService = userService;
}
// 配置 AuthenticationManager处理用户登录
@Bean
public AuthenticationManager authenticationManager(HttpSecurity http) throws Exception {
AuthenticationManagerBuilder authenticationManagerBuilder = http.getSharedObject(AuthenticationManagerBuilder.class);
authenticationManagerBuilder.userDetailsService(userDetailsService())
.passwordEncoder(passwordEncoder());
return authenticationManagerBuilder.build();
}
// 配置 UserDetailsService用于从数据库加载用户信息
@Bean
public UserDetailsService userDetailsService() {
return username -> {
// 获取用户信息
SysUser user = userService.getOne(Wrappers.<SysUser>lambdaQuery().eq(SysUser::getUserName, username));
if (user == null) {
throw new UsernameNotFoundException("用户不存在");
}
// 获取角色信息
SysRole role = userService.getRoleByUserId(user.getUserId()); // 假设你提供了这个方法来查询角色
if (role == null) {
throw new UsernameNotFoundException("用户角色不存在");
}
// 将角色添加为 ROLE_ 前缀
return org.springframework.security.core.userdetails.User
.withUsername(user.getUserName())
.password(user.getPasswd())
.roles("ROLE_" + role.getRoleKey()) // 根据角色的 role_key 设置角色,确保加上 ROLE_ 前缀
.build();
};
}
// 配置密码加密方式
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
// 配置 HttpSecurity进行权限管理
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(authz -> authz
.requestMatchers("/login", "/register").permitAll() // 登录和注册允许匿名访问
.requestMatchers("/admin/**").hasRole("ADMIN") // 只有 ADMIN 角色才能访问 /admin 路径
.requestMatchers("/user/**").hasRole("USER") // 只有 USER 角色才能访问 /user 路径
.anyRequest().authenticated() // 其他请求需要认证
)
.formLogin(form -> form
.loginPage("/login") // 登录页面
.permitAll()
)
.logout(logout -> logout
.permitAll()
);
return http.build();
}
}

View File

@ -1,6 +1,6 @@
package com.bruce.sams.Controller;
import com.bruce.sams.Service.SysLoginService;
import com.bruce.sams.service.SysLoginService;
import com.bruce.sams.Utils.AjaxResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@ -19,7 +19,7 @@ public class LoginController {
* @param password
* @return AjaxResult token
*/
@PostMapping
@PostMapping("/login")
public AjaxResult login(@RequestParam String schoolId, @RequestParam String password) {
try {
// 调用登录服务生成Token

View File

@ -1,10 +1,15 @@
package com.bruce.sams.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/zhangsan")
public String show (){
return "这是张三";
}
}

View File

@ -1,87 +1,74 @@
package com.bruce.sams.Utils;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import org.springframework.stereotype.Component;
import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;
public class TokenUtil {
// 密钥用于签名和验证Token
private static final Key SECRET_KEY = Keys.secretKeyFor(SignatureAlgorithm.HS256);
private static final Key SECRET_KEY = Keys.secretKeyFor(SignatureAlgorithm.HS256); // 需要一个256-bit的密钥
private static final long EXPIRATION_TIME = 1000 * 60 * 60 * 10; // 10小时
// Token过期时间单位毫秒
private static final long EXPIRATION_TIME = 3600000; // 1小时
/**
* Token
*
* @param userId ID
* @return Token
*/
public static String generateToken(String userId) {
// 生成Token
public static String generateToken(Long userId, Long roleId) {
Map<String, Object> claims = new HashMap<>();
claims.put("userId", userId); // 将用户ID放入Token的负载部分
claims.put("roleId", roleId); // 存储权限ID
return Jwts.builder()
.setClaims(claims) // 设置自定义信息
.setIssuedAt(new Date(System.currentTimeMillis())) // 设置签发时间
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) // 设置过期时间
.signWith(SECRET_KEY) // 使用密钥进行签名
.compact(); // 生成Token
.setClaims(claims)
.setSubject(String.valueOf(userId)) // 用户ID
.setIssuedAt(new Date()) // 签发时间
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) // 过期时间
.signWith(SECRET_KEY, SignatureAlgorithm.HS256) // 签名
.compact();
}
/**
* Token
*
* @param token Token
* @return
*/
// 验证Token
public static boolean validateToken(String token) {
try {
Jwts.parserBuilder()
.setSigningKey(SECRET_KEY) // 设置密钥
.build()
.parseClaimsJws(token); // 解析Token
return true; // 如果没有异常表示Token有效
} catch (Exception e) {
return false; // 如果解析失败表示Token无效
Jwts.parser().setSigningKey(SECRET_KEY).build().parseClaimsJws(token);
return true;
} catch (JwtException | IllegalArgumentException e) {
return false;
}
}
/**
* TokenID
*
* @param token Token
* @return ID
*/
public static String getUserIdFromToken(String token) {
Claims claims = Jwts.parserBuilder()
.setSigningKey(SECRET_KEY) // 设置密钥
.build()
.parseClaimsJws(token) // 解析Token
.getBody();
return claims.get("userId", String.class); // 提取用户ID
// 提取用户ID
public static Long extractUserId(String token) {
String userId = extractClaim(token, Claims::getSubject);
return userId != null ? Long.parseLong(userId) : null;
}
/**
* Token
*
* @param token Token
* @return
*/
public static Date getExpirationDateFromToken(String token) {
Claims claims = Jwts.parserBuilder()
.setSigningKey(SECRET_KEY) // 设置密钥
// 提取权限ID
public static Long extractRoleId(String token) {
Claims claims = extractAllClaims(token);
return claims.get("roleId", Long.class);
}
// 提取过期时间
public static Date extractExpiration(String token) {
return extractClaim(token, Claims::getExpiration);
}
// 提取单个Claim
private static <T> T extractClaim(String token, Function<Claims, T> claimsResolver) {
final Claims claims = extractAllClaims(token);
return claimsResolver.apply(claims);
}
// 解析所有Claims
private static Claims extractAllClaims(String token) {
return Jwts.parserBuilder()
.setSigningKey(getSigningKey())
.build()
.parseClaimsJws(token) // 解析Token
.parseClaimsJws(token)
.getBody();
return claims.getExpiration(); // 获取Token的过期时间
}
}

View File

@ -1,7 +1,6 @@
package com.bruce.sams.Entity;
package com.bruce.sams.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

View File

@ -1,7 +1,6 @@
package com.bruce.sams.Entity;
package com.bruce.sams.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

View File

@ -0,0 +1,49 @@
package com.bruce.sams.domain.entity;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.Collection;
import java.util.List;
public class UserDetail implements UserDetails {
private Long userId;
private Long roleId;
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return List.of();
}
@Override
public String getPassword() {
return "";
}
@Override
public String getUsername() {
return "";
}
@Override
public boolean isAccountNonExpired() {
return UserDetails.super.isAccountNonExpired();
}
@Override
public boolean isAccountNonLocked() {
return UserDetails.super.isAccountNonLocked();
}
@Override
public boolean isCredentialsNonExpired() {
return UserDetails.super.isCredentialsNonExpired();
}
@Override
public boolean isEnabled() {
return UserDetails.super.isEnabled();
}
}

View File

@ -1,4 +1,4 @@
package com.bruce.sams.Exception;
package com.bruce.sams.exception;
public class CustomException extends RuntimeException {
public CustomException(String message) {

View File

@ -1,6 +1,6 @@
package com.bruce.sams.Exception.User;
package com.bruce.sams.exception.user;
import com.bruce.sams.Exception.CustomException;
import com.bruce.sams.exception.CustomException;
/**
*

View File

@ -1,6 +1,6 @@
package com.bruce.sams.Exception.User;
package com.bruce.sams.exception.user;
import com.bruce.sams.Exception.CustomException;
import com.bruce.sams.exception.CustomException;
/**
*

View File

@ -1,6 +1,6 @@
package com.bruce.sams.Exception.User;
package com.bruce.sams.exception.user;
import com.bruce.sams.Exception.CustomException;
import com.bruce.sams.exception.CustomException;
/**
*

View File

@ -1,6 +1,6 @@
package com.bruce.sams.Exception.User;
package com.bruce.sams.exception.user;
import com.bruce.sams.Exception.CustomException;
import com.bruce.sams.exception.CustomException;
/**
*

View File

@ -1,6 +1,6 @@
package com.bruce.sams.Mapper;
package com.bruce.sams.mapper;
import com.bruce.sams.Entity.SysRole;
import com.bruce.sams.domain.SysRole;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;

View File

@ -1,6 +1,6 @@
package com.bruce.sams.Mapper;
package com.bruce.sams.mapper;
import com.bruce.sams.Entity.SysUser;
import com.bruce.sams.domain.SysUser;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;

View File

@ -1,4 +1,4 @@
package com.bruce.sams.Service;
package com.bruce.sams.service;
public interface SysLoginService {
/**

View File

@ -1,6 +1,6 @@
package com.bruce.sams.Service;
package com.bruce.sams.service;
import com.bruce.sams.Entity.SysRole;
import com.bruce.sams.domain.SysRole;
import com.baomidou.mybatisplus.extension.service.IService;
/**

View File

@ -1,7 +1,7 @@
package com.bruce.sams.Service;
package com.bruce.sams.service;
import com.bruce.sams.Entity.SysRole;
import com.bruce.sams.Entity.SysUser;
import com.bruce.sams.domain.SysRole;
import com.bruce.sams.domain.SysUser;
import com.baomidou.mybatisplus.extension.service.IService;
/**

View File

@ -1,20 +1,23 @@
package com.bruce.sams.Service.impl;
package com.bruce.sams.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bruce.sams.Entity.SysUser;
import com.bruce.sams.Exception.User.IncorrectPasswordException;
import com.bruce.sams.Exception.User.UserNotFoundException;
import com.bruce.sams.domain.SysUser;
import com.bruce.sams.exception.user.IncorrectPasswordException;
import com.bruce.sams.exception.user.UserNotFoundException;
import com.bruce.sams.Utils.PasswordEncoder;
import com.bruce.sams.Utils.TokenUtil;
import com.bruce.sams.Mapper.SysUserMapper;
import com.bruce.sams.Service.SysLoginService;
import com.bruce.sams.mapper.SysUserMapper;
import com.bruce.sams.service.SysLoginService;
import jakarta.annotation.Resource;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
@Service
public class SysLoginServiceImpl extends ServiceImpl<SysUserMapper, SysUser>
implements SysLoginService {
implements SysLoginService, UserDetailsService {
@Resource
private PasswordEncoder passwordEncoder;
@ -46,4 +49,20 @@ public class SysLoginServiceImpl extends ServiceImpl<SysUserMapper, SysUser>
return TokenUtil.generateToken(user.getUserId().toString());
}
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// 查找用户
SysUser user = this.getOne(Wrappers.<SysUser>lambdaQuery().eq(SysUser::getUserName, username));
//如果用户不存在,抛出用户未找到异常
if (user == null) {
throw new UsernameNotFoundException("用户不存在");
}
// 登录成功生成Token
// todo 返回UserDetail
return null;
}
}

View File

@ -1,9 +1,9 @@
package com.bruce.sams.Service.impl;
package com.bruce.sams.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bruce.sams.Entity.SysRole;
import com.bruce.sams.Service.SysRoleService;
import com.bruce.sams.Mapper.SysRoleMapper;
import com.bruce.sams.domain.SysRole;
import com.bruce.sams.service.SysRoleService;
import com.bruce.sams.mapper.SysRoleMapper;
import org.springframework.stereotype.Service;
/**

View File

@ -1,12 +1,12 @@
package com.bruce.sams.Service.impl;
package com.bruce.sams.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bruce.sams.Entity.SysRole;
import com.bruce.sams.Entity.SysUser;
import com.bruce.sams.Mapper.SysRoleMapper;
import com.bruce.sams.domain.SysRole;
import com.bruce.sams.domain.SysUser;
import com.bruce.sams.mapper.SysRoleMapper;
import com.bruce.sams.Utils.PasswordEncoder;
import com.bruce.sams.Service.SysUserService;
import com.bruce.sams.Mapper.SysUserMapper;
import com.bruce.sams.service.SysUserService;
import com.bruce.sams.mapper.SysUserMapper;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

View File

@ -1,10 +1,26 @@
server:
port:
spring:
application:
name: SAMS
datasource:
url: jdbc:mysql://localhost:3306/SAMS
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/SAMS_O
username: root
password: admin123
driver-class-name: com.mysql.cj.jdbc.Driver
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
mybatis-plus:
configuration:
# MyBatis 配置
map-underscore-to-camel-case: true
global-config:
# 全局配置
db-config:
# 数据库配置
id-type: auto
mapper-locations: /mapper/*Mapper.xml

View File

@ -1,44 +1,93 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--
CONSOLE :表示当前的日志信息是可以输出到控制台的。
-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--输出流对象 默认 System.out 改为 System.err-->
<target>System.out</target>
<!-- 日志存放路径 -->
<property name="log.path" value="E:\Bruce\logs" />
<!-- 日志输出格式 -->
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!--格式化输出:%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度
%msg日志消息%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] %c [%thread] : %msg%n</pattern>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- File是输出的方向通向文件的 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!--日志输出路径-->
<file>/log/itheima-data.log</file>
<!--指定日志文件拆分和压缩规则-->
<rollingPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--通过指定压缩文件名称,来确定分割文件方式-->
<fileNamePattern>/log/itheima-data2-%d{yyyy-MMdd}.log%i.gz</fileNamePattern>
<!--文件拆分大小-->
<maxFileSize>1MB</maxFileSize>
<!-- 系统日志输出 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-info.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>INFO</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-error.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>ERROR</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
level:用来设置打印级别大小写无关TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
默认debug
<root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。
-->
<root level="ALL">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE" />
<!-- 用户访问日志输出 -->
<appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/sys-user.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按天回滚 daily -->
<fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 系统模块日志级别控制 -->
<logger name="com.ruoyi" level="info" />
<!-- Spring日志级别控制 -->
<logger name="org.springframework" level="warn" />
<root level="info">
<appender-ref ref="console" />
</root>
<!--系统操作日志-->
<root level="info">
<appender-ref ref="file_info" />
<appender-ref ref="file_error" />
</root>
<!--系统用户操作日志-->
<logger name="sys-user" level="info">
<appender-ref ref="sys-user"/>
</logger>
</configuration>

View File

@ -4,7 +4,7 @@
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bruce.sams.mapper.SysRoleMapper">
<resultMap id="BaseResultMap" type="com.bruce.sams.Entity.SysRole">
<resultMap id="BaseResultMap" type="com.bruce.sams.domain.SysRole">
<id property="roleId" column="role_id" />
<result property="roleName" column="role_name" />
<result property="roleKey" column="role_key" />

View File

@ -4,7 +4,7 @@
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bruce.sams.mapper.SysUserMapper">
<resultMap id="BaseResultMap" type="com.bruce.sams.Entity.SysUser">
<resultMap id="BaseResultMap" type="com.bruce.sams.domain.SysUser">
<id property="userId" column="user_id" />
<result property="roleId" column="role_id" />
<result property="nickName" column="nick_name" />