chore(assets): 参赛提交规范红线修复(ASCII 化 + 相对路径)

按《参赛成果物提交规范·赛道一》§6 红线:
- samples/ 目录改名 sample/(git mv,保留历史)
- 10 个中日文样本文件 + docs 参赛手册 PDF 重命名为 ASCII
  (requirements_*/template_*/rules_*/contestant-handbook.pdf)
- tests/test_zh_template.py 硬编码绝对路径 D:\00_project\Genesis 改为相对路径
- 全局更新 21 个活动文件引用;历史日志/审查文档不改(追加说明记录)
全量 pytest 431 passed / 99.15%
This commit is contained in:
lhl
2026-08-26 14:15:52 +08:00
parent 1925ef7239
commit becd3e1f57
398 changed files with 286 additions and 72 deletions
+69
View File
@@ -0,0 +1,69 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.stock</groupId>
<artifactId>stock-trade-system</artifactId>
<version>1.0.0</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.stock</groupId>
<artifactId>trade-user</artifactId>
<version>1.0.0</version>
<name>trade-user</name>
<description>trade-user</description>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2021.0.8</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>com.stock</groupId>
<artifactId>trade-common</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>1.6.0</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
<version>1.6.14</version>
</dependency>
</dependencies>
</project>
@@ -0,0 +1,54 @@
package com.stock.trading.user.controller;
import com.stock.trading.common.api.CommonResult;
import com.stock.trading.user.dto.UmsAdminLoginParam;
import com.stock.trading.user.dto.UmsAdminParam;
import com.stock.trading.user.model.UmsAdmin;
import com.stock.trading.user.service.UmsAdminService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.Map;
/**
* 后台用户管理Controller
*/
@RestController
@Api(tags = "UmsAdminController", description = "后台用户管理")
@RequestMapping("/admin")
public class UmsAdminController {
@Value("${jwt.tokenHeader}")
private String tokenHeader;
@Value("${jwt.tokenHead}")
private String tokenHead;
@Autowired
private UmsAdminService adminService;
@ApiOperation(value = "用户注册")
@PostMapping("/register")
public CommonResult<UmsAdmin> register(@Validated @RequestBody UmsAdminParam umsAdminParam) {
UmsAdmin umsAdmin = adminService.register(umsAdminParam);
if (umsAdmin == null) {
return CommonResult.failed();
}
return CommonResult.success(umsAdmin);
}
@ApiOperation(value = "登录以后返回token")
@PostMapping("/login")
public CommonResult<Map<String, String>> login(@Validated @RequestBody UmsAdminLoginParam umsAdminLoginParam) {
String token = adminService.login(umsAdminLoginParam.getUsername(), umsAdminLoginParam.getPassword());
if (token == null) {
return CommonResult.validateFailed("用户名或密码错误");
}
Map<String, String> tokenMap = new HashMap<>();
tokenMap.put("token", token);
tokenMap.put("tokenHead", tokenHead);
return CommonResult.success(tokenMap);
}
}
@@ -0,0 +1,21 @@
package com.stock.trading.user.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotEmpty;
/**
* 用户登录参数
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class UmsAdminLoginParam {
@ApiModelProperty(value = "用户名", required = true)
@NotEmpty(message = "用户名不能为空")
private String username;
@ApiModelProperty(value = "密码", required = true)
@NotEmpty(message = "密码不能为空")
private String password;
}
@@ -0,0 +1,31 @@
package com.stock.trading.user.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotEmpty;
/**
* 用户注册参数
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class UmsAdminParam {
@ApiModelProperty(value = "用户名", required = true)
@NotEmpty(message = "用户名不能为空")
private String username;
@ApiModelProperty(value = "密码", required = true)
@NotEmpty(message = "密码不能为空")
private String password;
@ApiModelProperty(value = "用户头像")
private String icon;
@ApiModelProperty(value = "邮箱")
@Email(message = "邮箱格式不合法")
private String email;
@ApiModelProperty(value = "用户昵称")
private String nickName;
@ApiModelProperty(value = "备注")
private String note;
}
@@ -0,0 +1,29 @@
package com.stock.trading.user.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.stock.trading.common.entity.BaseEntity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 后台用户表
* Created by macro on 2020/8/21.
*/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("ums_admin")
public class UmsAdmin extends BaseEntity {
@ApiModelProperty(value = "用户名")
private String username;
@ApiModelProperty(value = "密码")
private String password;
@ApiModelProperty(value = "头像")
private String icon;
@ApiModelProperty(value = "邮箱")
private String email;
@ApiModelProperty(value = "昵称")
private String nickName;
@ApiModelProperty(value = "备注信息")
private String note;
}
@@ -0,0 +1,16 @@
package com.stock.trading.user.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.stock.trading.user.model.UmsAdmin;
/**
* <p>
* 后台用户表 Mapper 接口
* </p>
*
* @author macro
* @since 2020-08-21
*/
public interface UmsAdminMapper extends BaseMapper<UmsAdmin> {
}
@@ -0,0 +1,40 @@
package com.stock.trading.user.model;
import com.baomidou.mybatisplus.annotation.TableName;
import com.stock.trading.common.entity.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
/**
* <p>
* 后台用户表
* </p>
*
* @author macro
* @since 2020-08-21
*/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("ums_admin")
public class UmsAdmin extends BaseEntity implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private String username;
private String password;
private String icon;
private String email;
private String nickName;
private String note;
private Integer status;
}
@@ -0,0 +1,28 @@
package com.stock.trading.user.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.stock.trading.user.dto.UmsAdminParam;
import com.stock.trading.user.model.UmsAdmin;
/**
* 后台用户管理Service
*/
public interface UmsAdminService extends IService<UmsAdmin> {
/**
* 根据用户名获取后台管理员
*/
UmsAdmin getAdminByUsername(String username);
/**
* 注册功能
*/
UmsAdmin register(UmsAdminParam umsAdminParam);
/**
* 登录功能
* @param username 用户名
* @param password 密码
* @return 生成的JWT的token
*/
String login(String username, String password);
}
@@ -0,0 +1,82 @@
package com.stock.trading.user.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.stock.trading.common.exception.ApiException;
import com.stock.trading.common.util.JwtTokenUtil;
import com.stock.trading.user.dto.UmsAdminParam;
import com.stock.trading.user.mapper.UmsAdminMapper;
import com.stock.trading.user.model.UmsAdmin;
import com.stock.trading.user.service.UmsAdminService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import java.util.Date;
/**
* UmsAdminService实现类
*/
@Service
public class UmsAdminServiceImpl extends ServiceImpl<UmsAdminMapper, UmsAdmin> implements UmsAdminService {
private static final Logger LOGGER = LoggerFactory.getLogger(UmsAdminServiceImpl.class);
@Autowired
private UserDetailsService userDetailsService;
@Autowired
private JwtTokenUtil jwtTokenUtil;
@Autowired
private PasswordEncoder passwordEncoder;
@Autowired
private UmsAdminMapper adminMapper;
@Override
public UmsAdmin getAdminByUsername(String username) {
QueryWrapper<UmsAdmin> wrapper = new QueryWrapper<>();
wrapper.eq("username", username);
return adminMapper.selectOne(wrapper);
}
@Override
public UmsAdmin register(UmsAdminParam umsAdminParam) {
UmsAdmin umsAdmin = new UmsAdmin();
BeanUtils.copyProperties(umsAdminParam, umsAdmin);
umsAdmin.setCreateTime(new Date());
umsAdmin.setStatus(1);
//查询是否有相同用户名的用户
QueryWrapper<UmsAdmin> wrapper = new QueryWrapper<>();
wrapper.eq("username", umsAdmin.getUsername());
if (adminMapper.selectOne(wrapper) != null) {
throw new ApiException("该用户已经存在");
}
//将密码进行加密操作
String encodePassword = passwordEncoder.encode(umsAdmin.getPassword());
umsAdmin.setPassword(encodePassword);
adminMapper.insert(umsAdmin);
return umsAdmin;
}
@Override
public String login(String username, String password) {
String token = null;
try {
UserDetails userDetails = userDetailsService.loadUserByUsername(username);
if (!passwordEncoder.matches(password, userDetails.getPassword())) {
throw new BadCredentialsException("密码不正确");
}
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication);
token = jwtTokenUtil.generateToken(userDetails);
} catch (Exception e) {
LOGGER.warn("登录异常:{}", e.getMessage());
}
return token;
}
}
@@ -0,0 +1,15 @@
package com.stock.user.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 用户控制器
*
* @author TraeAI
*/
@RestController
@RequestMapping("/user")
public class UserController {
// TODO: 实现用户相关接口
}
@@ -0,0 +1,56 @@
package com.stock.user.dal.dataobject;
import com.stock.common.dal.dataobject.BaseDO; // 引入公共BaseDO
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
/**
* 用户DO
*
* @author TraeAI
*/
@TableName("trade_user") // TODO: 确认表名是否正确, 通常用户表名为 sys_user 或 user
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class UserDO extends BaseDO {
/**
* ID
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 用户名
*/
private String username;
/**
* 密码
*/
private String password; // TODO: 密码字段需要加密存储
/**
* 手机号
*/
private String mobile;
/**
* 邮箱
*/
private String email;
/**
* 用户状态(例如:启用,禁用)
*/
private Integer status;
// TODO: 根据实际需求添加更多字段
}
@@ -0,0 +1,15 @@
package com.stock.user.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.stock.user.dal.dataobject.UserDO;
import org.apache.ibatis.annotations.Mapper;
/**
* 用户 Mapper
*
* @author TraeAI
*/
@Mapper
public interface UserMapper extends BaseMapper<UserDO> {
// TODO: 定义用户相关的数据库操作方法
}
@@ -0,0 +1,10 @@
package com.stock.user.service;
/**
* 用户服务接口
*
* @author TraeAI
*/
public interface UserService {
// TODO: 定义用户服务相关方法
}
@@ -0,0 +1,14 @@
package com.stock.user.service.impl;
import com.stock.user.service.UserService;
import org.springframework.stereotype.Service;
/**
* 用户服务实现类
*
* @author TraeAI
*/
@Service
public class UserServiceImpl implements UserService {
// TODO: 实现用户服务相关方法
}
@@ -0,0 +1,17 @@
package com.trade.user;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* 用户服务启动类
* @author Trade Team
*/
@EnableDiscoveryClient
@SpringBootApplication(scanBasePackages = "com.trade")
public class TradeUserApplication {
public static void main(String[] args) {
SpringApplication.run(TradeUserApplication.class, args);
}
}
@@ -0,0 +1,38 @@
package com.trade.user;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.ComponentScan;
/**
* 用户服务启动类
*
* @author Trade Team
*/
@SpringBootApplication
@EnableDiscoveryClient
@MapperScan("com.trade.user.mapper") // 扫描Mapper接口
@ComponentScan(basePackages = {"com.trade.user", "com.trade.common.config"}) // 扫描通用配置,例如全局异常处理
public class UserApplication {
/**
* 主函数,启动用户服务应用。
*
* @param args 命令行参数
*/
public static void main(String[] args) {
SpringApplication.run(UserApplication.class, args);
System.out.println("(♥◠‿◠)ノ゙ Trade User Service 启动成功 ლ(´ڡ`ლ)゙ \n" +
" .-------. ____ __ \n" +
" | _ _ | \\\\ \\\\ / / \n" +
" | ( ' ) | \\\\ _. / ' \n" +
" |(_ o _) / _( )_ .' \n" +
" | (_,_).' __ ___(_ o _)' \n" +
" | |\\\\\\\\ \\ | || |(_,_)' \n" +
" | | \\\\ `' /| `-' / \n" +
" | | \\\\ / \\\\ / \n" +
" ''-' `'-' `-..-' ");
}
}
@@ -0,0 +1,58 @@
package com.trade.user.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
/**
* MyBatis Plus 配置类
* <p>
* 用于配置MyBatis Plus的相关特性,如分页插件、Mapper接口扫描等。
* </p>
*
* @author Trade Team
*/
@Configuration
@EnableTransactionManagement // 开启声明式事务管理
@MapperScan("com.trade.user.mapper") // 扫描Mapper接口,UserApplication中已有,这里可省略或保留以明确
public class MyBatisPlusConfig {
/**
* 配置MyBatis Plus拦截器,用于支持分页等功能。
* <p>
* 新版MyBatis Plus3.4.0+)推荐使用 {@link MybatisPlusInterceptor}。
* 旧版的分页插件是 {@code PaginationInterceptor}。
* </p>
*
* @return MybatisPlusInterceptor 实例
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 添加分页插件,并指定数据库类型为MySQL
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
// 如果需要其他MyBatis Plus的配置,例如乐观锁插件、SQL性能规范插件等,可以在这里添加
// 例如:
// /**
// * 乐观锁插件 (如果需要)
// */
// @Bean
// public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() {
// return new OptimisticLockerInnerInterceptor();
// }
// /**
// * 防止全表更新与删除插件 (如果需要)
// */
// @Bean
// public BlockAttackInnerInterceptor blockAttackInnerInterceptor() {
// return new BlockAttackInnerInterceptor();
// }
}
@@ -0,0 +1,38 @@
package com.trade.user.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
/**
* Spring Security配置
* @author Trade Team
*/
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
httpSecurity.csrf()
.disable()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/login", "/register", "/swagger-ui/**", "/v3/api-docs/**")
.permitAll()
.anyRequest()
.authenticated();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
@@ -0,0 +1,25 @@
package com.trade.user.config;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.Contact;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Swagger配置
* @author Trade Team
*/
@Configuration
public class SwaggerConfig {
@Bean
public OpenAPI customOpenAPI() {
return new OpenAPI()
.info(new Info()
.title("用户服务")
.version("1.0")
.description("用户服务相关接口文档")
.contact(new Contact().name("Trade Team")));
}
}
@@ -0,0 +1,4 @@
/**
* 此包存放用户服务模块的配置类,例如 MyBatis Plus 配置、Swagger 配置等。
*/
package com.trade.user.config;
@@ -0,0 +1,4 @@
/**
* 此包存放用户模块相关的常量定义。
*/
package com.trade.user.constant;
@@ -0,0 +1,114 @@
package com.trade.user.controller;
import com.trade.common.api.CommonResult;
import com.trade.user.dto.UmsAdminLoginParam;
import com.trade.user.dto.UmsAdminParam;
import com.trade.user.dto.UmsAdminUpdatePasswordParam;
import com.trade.user.model.UmsAdmin;
import com.trade.user.model.UmsPermission;
import com.trade.user.service.UmsAdminService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.security.Principal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 后台用户管理Controller
* Created by macro on 2018/4/26.
*/
@Controller
@Api(tags = "UmsAdminController", description = "后台用户管理")
@RequestMapping("/admin")
public class UmsAdminController {
@Value("${jwt.tokenHeader}")
private String tokenHeader;
@Value("${jwt.tokenHead}")
private String tokenHead;
@Autowired
private UmsAdminService adminService;
@ApiOperation(value = "用户注册")
@RequestMapping(value = "/register", method = RequestMethod.POST)
@ResponseBody
public CommonResult<UmsAdmin> register(@Validated @RequestBody UmsAdminParam umsAdminParam) {
UmsAdmin umsAdmin = adminService.register(umsAdminParam);
if (umsAdmin == null) {
return CommonResult.failed();
}
return CommonResult.success(umsAdmin);
}
@ApiOperation(value = "登录以后返回token")
@RequestMapping(value = "/login", method = RequestMethod.POST)
@ResponseBody
public CommonResult login(@Validated @RequestBody UmsAdminLoginParam umsAdminLoginParam) {
String token = adminService.login(umsAdminLoginParam.getUsername(), umsAdminLoginParam.getPassword());
if (token == null) {
return CommonResult.validateFailed("用户名或密码错误");
}
Map<String, String> tokenMap = new HashMap<>();
tokenMap.put("token", token);
tokenMap.put("tokenHead", tokenHead);
return CommonResult.success(tokenMap);
}
@ApiOperation(value = "刷新token")
@RequestMapping(value = "/refreshToken", method = RequestMethod.GET)
@ResponseBody
public CommonResult refreshToken(HttpServletRequest request) {
String token = request.getHeader(tokenHeader);
String refreshToken = adminService.refreshToken(token);
if (refreshToken == null) {
return CommonResult.failed("token已经过期!");
}
Map<String, String> tokenMap = new HashMap<>();
tokenMap.put("token", refreshToken);
tokenMap.put("tokenHead", tokenHead);
return CommonResult.success(tokenMap);
}
@ApiOperation("获取当前登录用户信息")
@RequestMapping(value = "/info", method = RequestMethod.GET)
@ResponseBody
public CommonResult getAdminInfo(Principal principal) {
if(principal==null){
return CommonResult.unauthorized(null);
}
String username = principal.getName();
UmsAdmin umsAdmin = adminService.getAdminByUsername(username);
Map<String, Object> data = new HashMap<>();
data.put("username", umsAdmin.getUsername());
data.put("menus", "");
data.put("icon", umsAdmin.getIcon());
List<UmsPermission> permissionList = adminService.getPermissionList(umsAdmin.getId());
data.put("perms", permissionList);
return CommonResult.success(data);
}
@ApiOperation("修改指定用户密码")
@RequestMapping(value = "/updatePassword", method = RequestMethod.POST)
@ResponseBody
public CommonResult updatePassword(@Validated @RequestBody UmsAdminUpdatePasswordParam param) {
int status = adminService.updatePassword(param);
if (status > 0) {
return CommonResult.success(status);
} else if (status == -1) {
return CommonResult.failed("提交参数不合法");
} else if (status == -2) {
return CommonResult.failed("找不到该用户");
} else if (status == -3) {
return CommonResult.failed("旧密码错误");
} else {
return CommonResult.failed();
}
}
}
@@ -0,0 +1,76 @@
package com.trade.user.controller;
import com.trade.common.api.CommonResult;
import com.trade.user.model.UmsPermission;
import com.trade.user.service.UmsPermissionService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
/**
* 后台用户权限管理
* Created by macro on 2018/9/29.
*/
@Controller
@Api(tags = "UmsPermissionController", description = "后台用户权限管理")
@RequestMapping("/permission")
public class UmsPermissionController {
@Autowired
private UmsPermissionService permissionService;
@ApiOperation("添加权限")
@RequestMapping(value = "/create", method = RequestMethod.POST)
@ResponseBody
public CommonResult create(@RequestBody UmsPermission permission) {
boolean success = permissionService.save(permission);
if (success) {
return CommonResult.success(permission);
}
return CommonResult.failed();
}
@ApiOperation("修改权限")
@RequestMapping(value = "/update", method = RequestMethod.POST)
@ResponseBody
public CommonResult update(@RequestBody UmsPermission permission) {
boolean success = permissionService.updateById(permission);
if (success) {
return CommonResult.success(permission);
}
return CommonResult.failed();
}
@ApiOperation("根据id删除权限")
@RequestMapping(value = "/delete", method = RequestMethod.POST)
@ResponseBody
public CommonResult delete(@RequestBody List<Long> ids) {
boolean success = permissionService.removeByIds(ids);
if (success) {
return CommonResult.success(null);
}
return CommonResult.failed();
}
@ApiOperation("获取所有权限列表")
@RequestMapping(value = "/list", method = RequestMethod.GET)
@ResponseBody
public CommonResult<List<UmsPermission>> list() {
List<UmsPermission> permissionList = permissionService.list();
return CommonResult.success(permissionList);
}
@ApiOperation("以层级结构返回所有权限")
@RequestMapping(value = "/treeList", method = RequestMethod.GET)
@ResponseBody
public CommonResult<List<UmsPermission>> treeList() {
List<UmsPermission> permissionList = permissionService.treeList();
return CommonResult.success(permissionList);
}
}
@@ -0,0 +1,116 @@
package com.trade.user.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.trade.common.api.CommonPage;
import com.trade.common.api.CommonResult;
import com.trade.user.model.UmsPermission;
import com.trade.user.model.UmsRole;
import com.trade.user.service.UmsAdminService;
import com.trade.user.service.UmsRoleService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 后台用户角色管理
* Created by macro on 2018/9/30.
*/
@Controller
@Api(tags = "UmsRoleController", description = "后台用户角色管理")
@RequestMapping("/role")
public class UmsRoleController {
@Autowired
private UmsRoleService roleService;
@Autowired
private UmsAdminService adminService;
@ApiOperation("添加角色")
@RequestMapping(value = "/create", method = RequestMethod.POST)
@ResponseBody
public CommonResult create(@RequestBody UmsRole role) {
boolean success = roleService.save(role);
if (success) {
return CommonResult.success(null);
}
return CommonResult.failed();
}
@ApiOperation("修改角色")
@RequestMapping(value = "/update/{id}", method = RequestMethod.POST)
@ResponseBody
public CommonResult update(@PathVariable Long id, @RequestBody UmsRole role) {
role.setId(id);
boolean success = roleService.updateById(role);
if (success) {
return CommonResult.success(null);
}
return CommonResult.failed();
}
@ApiOperation("删除角色")
@RequestMapping(value = "/delete", method = RequestMethod.POST)
@ResponseBody
public CommonResult delete(@RequestParam("ids") List<Long> ids) {
boolean success = roleService.removeByIds(ids);
if (success) {
return CommonResult.success(null);
}
return CommonResult.failed();
}
@ApiOperation("获取所有角色")
@RequestMapping(value = "/listAll", method = RequestMethod.GET)
@ResponseBody
public CommonResult<List<UmsRole>> listAll() {
List<UmsRole> roleList = roleService.list();
return CommonResult.success(roleList);
}
@ApiOperation("根据角色名称分页获取角色列表")
@RequestMapping(value = "/list", method = RequestMethod.GET)
@ResponseBody
public CommonResult<CommonPage<UmsRole>> list(@RequestParam(value = "keyword", required = false) String keyword,
@RequestParam(value = "pageSize", defaultValue = "5") Integer pageSize,
@RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum) {
Page<UmsRole> page = new Page<>(pageNum, pageSize);
LambdaQueryWrapper<UmsRole> lambdaQueryWrapper = new LambdaQueryWrapper<>();
if (keyword!=null && keyword.length()>0){
lambdaQueryWrapper.like(UmsRole::getName, keyword);
}
Page<UmsRole> rolePage = roleService.page(page, lambdaQueryWrapper);
return CommonResult.success(CommonPage.restPage(rolePage));
}
@ApiOperation("获取角色相关权限")
@RequestMapping(value = "/listPermission/{roleId}", method = RequestMethod.GET)
@ResponseBody
public CommonResult<List<UmsPermission>> listPermission(@PathVariable Long roleId) {
List<UmsPermission> permissionList = roleService.getPermissionList(roleId);
return CommonResult.success(permissionList);
}
@ApiOperation("修改角色相关权限")
@RequestMapping(value = "/updatePermission", method = RequestMethod.POST)
@ResponseBody
public CommonResult updatePermission(@RequestParam Long roleId,
@RequestParam List<Long> permissionIds) {
int count = roleService.updatePermission(roleId, permissionIds);
if(count>0){
return CommonResult.success(count);
}
return CommonResult.failed();
}
@ApiOperation("获取角色列表")
@RequestMapping(value = "/listRoleByAdminId/{adminId}", method = RequestMethod.GET)
@ResponseBody
public CommonResult<List<UmsRole>> listRoleByAdminId(@PathVariable Long adminId) {
List<UmsRole> roleList = adminService.getRoleList(adminId);
return CommonResult.success(roleList);
}
}
@@ -0,0 +1,4 @@
/**
* 此包存放用户模块的Controller层代码,负责接收前端请求、参数校验、调用Service层处理业务逻辑,并返回响应。
*/
package com.trade.user.controller;
@@ -0,0 +1,22 @@
package com.trade.user.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotEmpty;
/**
* 用户登录参数
* Created by macro on 2018/4/26.
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class UmsAdminLoginParam {
@ApiModelProperty(value = "用户名", required = true)
@NotEmpty(message = "用户名不能为空")
private String username;
@ApiModelProperty(value = "密码", required = true)
@NotEmpty(message = "密码不能为空")
private String password;
}
@@ -0,0 +1,30 @@
package com.trade.user.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotEmpty;
/**
* 用户注册参数
* Created by macro on 2018/4/26.
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class UmsAdminParam {
@ApiModelProperty(value = "用户名", required = true)
@NotEmpty(message = "用户名不能为空")
private String username;
@ApiModelProperty(value = "密码", required = true)
@NotEmpty(message = "密码不能为空")
private String password;
@ApiModelProperty(value = "用户头像")
private String icon;
@ApiModelProperty(value = "邮箱")
private String email;
@ApiModelProperty(value = "用户昵称")
private String nickName;
@ApiModelProperty(value = "备注")
private String note;
}
@@ -0,0 +1,25 @@
package com.trade.user.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotEmpty;
/**
* 修改密码参数
* Created by macro on 2019/10/5.
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class UmsAdminUpdatePasswordParam {
@ApiModelProperty(value = "用户名", required = true)
@NotEmpty(message = "用户名不能为空")
private String username;
@ApiModelProperty(value = "旧密码", required = true)
@NotEmpty(message = "旧密码不能为空")
private String oldPassword;
@ApiModelProperty(value = "新密码", required = true)
@NotEmpty(message = "新密码不能为空")
private String newPassword;
}
@@ -0,0 +1,6 @@
/**
* 此包存放用户模块的DTO (Data Transfer Object) 代码。
* DTO用于在不同层之间传递数据,例如Controller接收的请求参数、Service返回给Controller的数据等。
* 它们有助于解耦各层,并可以根据需要对数据进行裁剪或聚合。
*/
package com.trade.user.dto;
@@ -0,0 +1,5 @@
/**
* 此包存放用户模块的Entity层代码,即数据库表对应的Java实体类。
* 通常会使用Lombok注解简化代码,并可能包含JPA或MyBatis Plus的注解。
*/
package com.trade.user.entity;
@@ -0,0 +1,5 @@
/**
* 此包存放用户模块相关的枚举类。
* 例如:用户状态枚举、性别枚举等。
*/
package com.trade.user.enums;
@@ -0,0 +1 @@
package com.trade.user.handler;
@@ -0,0 +1,24 @@
package com.trade.user.mapper;
import com.trade.user.model.UmsAdmin;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.trade.user.model.UmsPermission;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* <p>
* 后台用户表 Mapper 接口
* </p>
*
* @author Trade Team
* @since 2024-03-20
*/
public interface UmsAdminMapper extends BaseMapper<UmsAdmin> {
/**
* 获取用户所有权限(包括角色权限和+-权限)
*/
List<UmsPermission> getPermissionList(@Param("adminId") Long adminId);
}
@@ -0,0 +1,16 @@
package com.trade.user.mapper;
import com.trade.user.model.UmsAdminPermissionRelation;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 后台用户和权限关系表(除角色外的额外权限) Mapper 接口
* </p>
*
* @author Trade Team
* @since 2024-03-20
*/
public interface UmsAdminPermissionRelationMapper extends BaseMapper<UmsAdminPermissionRelation> {
}
@@ -0,0 +1,16 @@
package com.trade.user.mapper;
import com.trade.user.model.UmsAdminRoleRelation;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 后台用户和角色关系表 Mapper 接口
* </p>
*
* @author Trade Team
* @since 2024-03-20
*/
public interface UmsAdminRoleRelationMapper extends BaseMapper<UmsAdminRoleRelation> {
}
@@ -0,0 +1,16 @@
package com.trade.user.mapper;
import com.trade.user.model.UmsPermission;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 后台用户权限表 Mapper 接口
* </p>
*
* @author Trade Team
* @since 2024-03-20
*/
public interface UmsPermissionMapper extends BaseMapper<UmsPermission> {
}
@@ -0,0 +1,16 @@
package com.trade.user.mapper;
import com.trade.user.model.UmsRole;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 后台用户角色表 Mapper 接口
* </p>
*
* @author Trade Team
* @since 2024-03-20
*/
public interface UmsRoleMapper extends BaseMapper<UmsRole> {
}
@@ -0,0 +1,16 @@
package com.trade.user.mapper;
import com.trade.user.model.UmsRolePermissionRelation;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 后台用户角色和权限关系表 Mapper 接口
* </p>
*
* @author Trade Team
* @since 2024-03-20
*/
public interface UmsRolePermissionRelationMapper extends BaseMapper<UmsRolePermissionRelation> {
}
@@ -0,0 +1,4 @@
/**
* 此包存放用户模块的Mapper层代码,定义与数据库表对应的DAO接口,继承自MyBatis Plus的BaseMapper。
*/
package com.trade.user.mapper;
@@ -0,0 +1,49 @@
package com.trade.user.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* 后台用户表
* </p>
*
* @author Trade Team
* @since 2024-03-20
*/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("ums_admin")
public class UmsAdmin implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private String username;
private String password;
private String icon;
private String email;
private String nickName;
private String note;
private Date createTime;
private Date loginTime;
private Integer status;
}
@@ -0,0 +1,34 @@
package com.trade.user.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
/**
* <p>
* 后台用户和权限关系表(除角色外的额外权限)
* </p>
*
* @author Trade Team
* @since 2024-03-20
*/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("ums_admin_permission_relation")
public class UmsAdminPermissionRelation implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private Long adminId;
private Long permissionId;
}
@@ -0,0 +1,34 @@
package com.trade.user.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
/**
* <p>
* 后台用户和角色关系表
* </p>
*
* @author Trade Team
* @since 2024-03-20
*/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("ums_admin_role_relation")
public class UmsAdminRoleRelation implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private Long adminId;
private Long roleId;
}
@@ -0,0 +1,49 @@
package com.trade.user.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* 后台用户权限表
* </p>
*
* @author Trade Team
* @since 2024-03-20
*/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("ums_permission")
public class UmsPermission implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private Long pid;
private String name;
private String value;
private String icon;
private Integer type;
private String uri;
private Integer status;
private Date createTime;
private Integer sort;
}
@@ -0,0 +1,43 @@
package com.trade.user.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* 后台用户角色表
* </p>
*
* @author Trade Team
* @since 2024-03-20
*/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("ums_role")
public class UmsRole implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private String name;
private String description;
private Integer adminCount;
private Date createTime;
private Integer status;
private Integer sort;
}
@@ -0,0 +1,34 @@
package com.trade.user.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
/**
* <p>
* 后台用户角色和权限关系表
* </p>
*
* @author Trade Team
* @since 2024-03-20
*/
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("ums_role_permission_relation")
public class UmsRolePermissionRelation implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private Long roleId;
private Long permissionId;
}
@@ -0,0 +1,7 @@
/**
* 此包包含用户服务模块的领域模型 (Domain Model) 或实体类 (Entity)。
* <p>
* 这些类通常映射到用户相关的数据库表结构,例如用户表、角色表、权限表等。
* </p>
*/
package com.trade.user.model;
@@ -0,0 +1,16 @@
package com.trade.user.service;
import com.trade.user.model.UmsAdminPermissionRelation;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 后台用户和权限关系表(除角色外的额外权限) 服务类
* </p>
*
* @author Trade Team
* @since 2024-03-20
*/
public interface UmsAdminPermissionRelationService extends IService<UmsAdminPermissionRelation> {
}
@@ -0,0 +1,16 @@
package com.trade.user.service;
import com.trade.user.model.UmsAdminRoleRelation;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 后台用户和角色关系表 服务类
* </p>
*
* @author Trade Team
* @since 2024-03-20
*/
public interface UmsAdminRoleRelationService extends IService<UmsAdminRoleRelation> {
}
@@ -0,0 +1,60 @@
package com.trade.user.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.trade.common.domain.UserDto;
import com.trade.user.dto.UmsAdminParam;
import com.trade.user.dto.UmsAdminUpdatePasswordParam;
import com.trade.user.model.UmsAdmin;
import com.trade.user.model.UmsPermission;
import java.util.List;
/**
* 后台管理员Service
* Created by macro on 2018/4/26.
*/
public interface UmsAdminService extends IService<UmsAdmin> {
/**
* 根据用户名获取后台管理员
*/
UmsAdmin getAdminByUsername(String username);
/**
* 注册功能
*/
UmsAdmin register(UmsAdminParam umsAdminParam);
/**
* 登录功能
* @param username 用户名
* @param password 密码
* @return 生成的JWT的token
*/
String login(String username, String password);
/**
* 根据用户id获取用户所有权限(角色权限和+-权限)
*/
List<UmsPermission> getPermissionList(Long adminId);
/**
* 修改密码
*/
int updatePassword(UmsAdminUpdatePasswordParam umsAdminUpdatePasswordParam);
/**
* 获取用户信息
*/
UserDto loadUserByUsername(String username);
/**
* 获取用户对应角色
*/
List<com.trade.user.model.UmsRole> getRoleList(Long adminId);
/**
* 刷新token的功能
* @param oldToken 旧的token
*/
String refreshToken(String oldToken);
}
@@ -0,0 +1,21 @@
package com.trade.user.service;
import com.trade.user.model.UmsPermission;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 后台用户权限表 服务类
* </p>
*
* @author Trade Team
* @since 2024-03-20
*/
import java.util.List;
public interface UmsPermissionService extends IService<UmsPermission> {
/**
* 以层级结构返回所有权限
*/
List<UmsPermission> treeList();
}
@@ -0,0 +1,16 @@
package com.trade.user.service;
import com.trade.user.model.UmsRolePermissionRelation;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 后台用户角色和权限关系表 服务类
* </p>
*
* @author Trade Team
* @since 2024-03-20
*/
public interface UmsRolePermissionRelationService extends IService<UmsRolePermissionRelation> {
}
@@ -0,0 +1,28 @@
package com.trade.user.service;
import com.trade.user.model.UmsRole;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 后台用户角色表 服务类
* </p>
*
* @author Trade Team
* @since 2024-03-20
*/
import com.trade.user.model.UmsPermission;
import java.util.List;
public interface UmsRoleService extends IService<UmsRole> {
/**
* 获取角色相关权限
*/
List<UmsPermission> getPermissionList(Long roleId);
/**
* 修改角色权限
*/
int updatePermission(Long roleId, List<Long> permissionIds);
}
@@ -0,0 +1,20 @@
package com.trade.user.service.impl;
import com.trade.user.model.UmsAdminPermissionRelation;
import com.trade.user.mapper.UmsAdminPermissionRelationMapper;
import com.trade.user.service.UmsAdminPermissionRelationService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 后台用户和权限关系表(除角色外的额外权限) 服务实现类
* </p>
*
* @author Trade Team
* @since 2024-03-20
*/
@Service
public class UmsAdminPermissionRelationServiceImpl extends ServiceImpl<UmsAdminPermissionRelationMapper, UmsAdminPermissionRelation> implements UmsAdminPermissionRelationService {
}
@@ -0,0 +1,20 @@
package com.trade.user.service.impl;
import com.trade.user.model.UmsAdminRoleRelation;
import com.trade.user.mapper.UmsAdminRoleRelationMapper;
import com.trade.user.service.UmsAdminRoleRelationService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 后台用户和角色关系表 服务实现类
* </p>
*
* @author Trade Team
* @since 2024-03-20
*/
@Service
public class UmsAdminRoleRelationServiceImpl extends ServiceImpl<UmsAdminRoleRelationMapper, UmsAdminRoleRelation> implements UmsAdminRoleRelationService {
}
@@ -0,0 +1,142 @@
package com.trade.user.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.trade.common.domain.UserDto;
import com.trade.common.util.JwtTokenUtil;
import org.springframework.security.core.userdetails.UserDetails;
import com.trade.user.dto.UmsAdminParam;
import com.trade.user.dto.UmsAdminUpdatePasswordParam;
import com.trade.user.mapper.UmsAdminMapper;
import com.trade.user.model.UmsAdmin;
import com.trade.user.model.UmsPermission;
import com.trade.user.service.UmsAdminService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
/**
* UmsAdminService实现类
* Created by macro on 2018/4/26.
*/
@Service
public class UmsAdminServiceImpl extends ServiceImpl<UmsAdminMapper, UmsAdmin> implements UmsAdminService {
private static final Logger LOGGER = LoggerFactory.getLogger(UmsAdminServiceImpl.class);
@Autowired
private JwtTokenUtil jwtTokenUtil;
@Autowired
private PasswordEncoder passwordEncoder;
@Autowired
private UmsAdminMapper adminMapper;
@Override
public UmsAdmin getAdminByUsername(String username) {
LambdaQueryWrapper<UmsAdmin> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(UmsAdmin::getUsername, username);
UmsAdmin admin = getOne(lambdaQueryWrapper);
return admin;
}
@Override
public UmsAdmin register(UmsAdminParam umsAdminParam) {
UmsAdmin umsAdmin = new UmsAdmin();
BeanUtils.copyProperties(umsAdminParam, umsAdmin);
umsAdmin.setCreateTime(new Date());
umsAdmin.setStatus(1);
//查询是否有相同用户名的用户
LambdaQueryWrapper<UmsAdmin> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(UmsAdmin::getUsername, umsAdmin.getUsername());
List<UmsAdmin> umsAdminList = list(lambdaQueryWrapper);
if (umsAdminList.size() > 0) {
return null;
}
//将密码进行加密操作
String encodePassword = passwordEncoder.encode(umsAdmin.getPassword());
umsAdmin.setPassword(encodePassword);
baseMapper.insert(umsAdmin);
return umsAdmin;
}
@Override
public String login(String username, String password) {
String token = null;
try {
UserDto userDto = loadUserByUsername(username);
if (!passwordEncoder.matches(password, userDto.getPassword())) {
throw new BadCredentialsException("密码不正确");
}
UserDetails userDetails = userDto;
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication);
token = jwtTokenUtil.generateToken(userDetails);
} catch (AuthenticationException e) {
LOGGER.warn("登录异常:{}", e.getMessage());
}
return token;
}
@Override
public List<UmsPermission> getPermissionList(Long adminId) {
return adminMapper.getPermissionList(adminId);
}
@Override
public int updatePassword(UmsAdminUpdatePasswordParam param) {
if(StrUtil.isEmpty(param.getUsername())
||StrUtil.isEmpty(param.getOldPassword())
||StrUtil.isEmpty(param.getNewPassword())){
return -1;
}
LambdaQueryWrapper<UmsAdmin> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(UmsAdmin::getUsername, param.getUsername());
List<UmsAdmin> adminList = list(lambdaQueryWrapper);
if(CollUtil.isEmpty(adminList)){
return -2;
}
UmsAdmin umsAdmin = adminList.get(0);
if(!passwordEncoder.matches(param.getOldPassword(),umsAdmin.getPassword())){
return -3;
}
umsAdmin.setPassword(passwordEncoder.encode(param.getNewPassword()));
baseMapper.updateById(umsAdmin);
return 1;
}
@Override
public UserDto loadUserByUsername(String username) {
//获取用户信息
UmsAdmin admin = getAdminByUsername(username);
if (admin != null) {
List<UmsPermission> permissionList = getPermissionList(admin.getId());
List<String> permissionStrList = null;
if (CollUtil.isNotEmpty(permissionList)) {
permissionStrList = permissionList.stream().map(UmsPermission::getValue).collect(java.util.stream.Collectors.toList());
}
return new UserDto(admin.getId(), admin.getUsername(), admin.getPassword(), admin.getStatus(), permissionStrList);
}
return null;
}
@Override
public List<com.trade.user.model.UmsRole> getRoleList(Long adminId) {
return adminMapper.getRoleList(adminId);
}
@Override
public String refreshToken(String oldToken) {
return jwtTokenUtil.refreshHeadToken(oldToken);
}
}
@@ -0,0 +1,46 @@
package com.trade.user.service.impl;
import com.trade.user.model.UmsPermission;
import com.trade.user.mapper.UmsPermissionMapper;
import com.trade.user.service.UmsPermissionService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 后台用户权限表 服务实现类
* </p>
*
* @author Trade Team
* @since 2024-03-20
*/
@Service
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.stream.Collectors;
public class UmsPermissionServiceImpl extends ServiceImpl<UmsPermissionMapper, UmsPermission> implements UmsPermissionService {
@Override
public List<UmsPermission> treeList() {
List<UmsPermission> permissionList = list();
List<UmsPermission> result = permissionList.stream()
.filter(permission -> permission.getParentId().equals(0L))
.map(permission -> covert(permission, permissionList)).collect(Collectors.toList());
return result;
}
/**
* 将权限转换为带有子级的权限对象
* 当找不到子级权限的时候map操作不会再递归调用covert
*/
private UmsPermission covert(UmsPermission permission, List<UmsPermission> permissionList) {
permission.setChildren(permissionList.stream()
.filter(item -> item.getParentId().equals(permission.getId()))
.map(item -> covert(item, permissionList))
.collect(Collectors.toList()));
return permission;
}
}
@@ -0,0 +1,20 @@
package com.trade.user.service.impl;
import com.trade.user.model.UmsRolePermissionRelation;
import com.trade.user.mapper.UmsRolePermissionRelationMapper;
import com.trade.user.service.UmsRolePermissionRelationService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 后台用户角色和权限关系表 服务实现类
* </p>
*
* @author Trade Team
* @since 2024-03-20
*/
@Service
public class UmsRolePermissionRelationServiceImpl extends ServiceImpl<UmsRolePermissionRelationMapper, UmsRolePermissionRelation> implements UmsRolePermissionRelationService {
}
@@ -0,0 +1,59 @@
package com.trade.user.service.impl;
import com.trade.user.model.UmsRole;
import com.trade.user.mapper.UmsRoleMapper;
import com.trade.user.service.UmsRoleService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 后台用户角色表 服务实现类
* </p>
*
* @author Trade Team
* @since 2024-03-20
*/
@Service
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.trade.user.mapper.UmsRolePermissionRelationMapper;
import com.trade.user.model.UmsPermission;
import com.trade.user.model.UmsRolePermissionRelation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
public class UmsRoleServiceImpl extends ServiceImpl<UmsRoleMapper, UmsRole> implements UmsRoleService {
@Autowired
private UmsRolePermissionRelationMapper rolePermissionRelationMapper;
@Override
public List<UmsPermission> getPermissionList(Long roleId) {
return rolePermissionRelationMapper.getPermissionList(roleId);
}
@Override
public int updatePermission(Long roleId, List<Long> permissionIds) {
//删除之前绑定的关系
LambdaQueryWrapper<UmsRolePermissionRelation> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(UmsRolePermissionRelation::getRoleId, roleId);
rolePermissionRelationMapper.delete(wrapper);
//批量插入新的关系
List<UmsRolePermissionRelation> relationList = new ArrayList<>();
for (Long permissionId : permissionIds) {
UmsRolePermissionRelation relation = new UmsRolePermissionRelation();
relation.setRoleId(roleId);
relation.setPermissionId(permissionId);
relationList.add(relation);
}
if (!CollectionUtils.isEmpty(relationList)) {
for (UmsRolePermissionRelation relation : relationList) {
rolePermissionRelationMapper.insert(relation);
}
}
return permissionIds.size();
}
}
@@ -0,0 +1,4 @@
/**
* 此包存放用户模块Service层接口的实现类。
*/
package com.trade.user.service.impl;
@@ -0,0 +1,5 @@
/**
* 此包存放用户模块的Service层代码,定义业务逻辑接口。
* 通常会包含接口定义 (e.g., {@code UserService.java}) 和其实现类 (e.g., {@code UserServiceImpl.java} in a sub-package 'impl').
*/
package com.trade.user.service;
@@ -0,0 +1,4 @@
/**
* 此包存放用户模块相关的工具类。
*/
package com.trade.user.util;
@@ -0,0 +1,4 @@
/**
* 此包存放用户服务模块的工具类。
*/
package com.trade.user.utils;
@@ -0,0 +1,6 @@
/**
* 此包存放用户模块的VO (View Object) 代码。
* VO是专门用于前端展示的对象,Controller层会将业务处理结果封装成VO返回给客户端。
* VO的设计应贴合前端页面的展示需求。
*/
package com.trade.user.vo;
@@ -0,0 +1,55 @@
spring:
datasource:
url: jdbc:mysql://localhost:3306/trade-user?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: wodiXIAO1988
driver-class-name: com.mysql.cj.jdbc.Driver
redis:
database: 0
host: localhost
port: 6379
password: #
mail:
host: smtp.qq.com
username: null
password: null
properties:
mail.smtp.ssl.enable: true
default-encoding: UTF-8
thymeleaf:
cache: false
mode: HTML5
encoding: UTF-8
servlet.content-type: text/html
mybatis-plus:
mapper-locations: 'classpath*:mapper/*.xml'
global-config:
db-config:
id-type: auto
logic-delete-value: 1
logic-not-delete-value: 0
table-prefix: ums_
field-strategy: not_empty
logging:
level:
com:
trade:
user: debug
file:
path: D:/log
secure:
ignored:
urls:
- /swagger-resources/**
- /webjars/**
- /v2/**
- /swagger-ui.html
- /doc.html
- /role/**
- /permission/**
- /admin/login
- /admin/register
- /admin/info
- /admin/logout
- /admin/updatePassword
- /admin/refreshToken
@@ -0,0 +1,55 @@
spring:
datasource:
url: jdbc:mysql://localhost:3306/trade-user?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
redis:
database: 0
host: localhost
port: 6379
password: #
mail:
host: smtp.qq.com
username: null
password: null
properties:
mail.smtp.ssl.enable: true
default-encoding: UTF-8
thymeleaf:
cache: false
mode: HTML5
encoding: UTF-8
servlet.content-type: text/html
mybatis-plus:
mapper-locations: 'classpath*:mapper/*.xml'
global-config:
db-config:
id-type: auto
logic-delete-value: 1
logic-not-delete-value: 0
table-prefix: ums_
field-strategy: not_empty
logging:
level:
com:
trade:
user: info
file:
path: /var/log/trade-user
secure:
ignored:
urls:
- /swagger-resources/**
- /webjars/**
- /v2/**
- /swagger-ui.html
- /doc.html
- /role/**
- /permission/**
- /admin/login
- /admin/register
- /admin/info
- /admin/logout
- /admin/updatePassword
- /admin/refreshToken
@@ -0,0 +1,55 @@
spring:
datasource:
url: jdbc:mysql://localhost:3306/trade-user-test?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
redis:
database: 0
host: localhost
port: 6379
password: #
mail:
host: smtp.qq.com
username: null
password: null
properties:
mail.smtp.ssl.enable: true
default-encoding: UTF-8
thymeleaf:
cache: false
mode: HTML5
encoding: UTF-8
servlet.content-type: text/html
mybatis-plus:
mapper-locations: 'classpath*:mapper/*.xml'
global-config:
db-config:
id-type: auto
logic-delete-value: 1
logic-not-delete-value: 0
table-prefix: ums_
field-strategy: not_empty
logging:
level:
com:
trade:
user: debug
file:
path: D:/log
secure:
ignored:
urls:
- /swagger-resources/**
- /webjars/**
- /v2/**
- /swagger-ui.html
- /doc.html
- /role/**
- /permission/**
- /admin/login
- /admin/register
- /admin/info
- /admin/logout
- /admin/updatePassword
- /admin/refreshToken
@@ -0,0 +1,93 @@
server:
port: 8081 # 用户服务端口,避免与网关或其他服务冲突
spring:
application:
name: trade-user # 应用名称
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 # Nacos Server地址
namespace: # Nacos命名空间ID,根据实际情况配置
group: DEFAULT_GROUP # Nacos分组,根据实际情况配置
config:
server-addr: ${spring.cloud.nacos.discovery.server-addr} # Nacos配置中心地址
namespace: ${spring.cloud.nacos.discovery.namespace}
group: ${spring.cloud.nacos.discovery.group}
file-extension: yml # 配置文件格式
shared-configs: # 共享配置
- data-id: application-common.yml # 通用应用配置
group: ${spring.cloud.nacos.discovery.group}
refresh: true
- data-id: datasource-mysql-config.yml # MySQL数据源配置
group: ${spring.cloud.nacos.discovery.group}
refresh: true
# ext-config: # 可选的扩展配置
# - data-id: trade-user-ext.yml
# group: ${spring.cloud.nacos.discovery.group}
# refresh: true
# Spring Profiles: 用于区分不同环境的配置 (dev, test, prod)
profiles:
active: dev # 默认激活开发环境配置
# MyBatis Plus 配置
mybatis-plus:
mapper-locations: classpath*:/mapper/**/*.xml # Mapper XML文件位置
# type-aliases-package: com.trade.user.entity # 实体类别名扫描包 (如果需要)
global-config:
db-config:
id-type: auto # 全局主键策略 (推荐使用AUTO或ASSIGN_ID,具体根据业务调整)
# table-prefix: t_ # 全局表前缀 (如果表名有统一前缀)
# logic-delete-field: deleted # 全局逻辑删除字段名 (如果使用逻辑删除)
# logic-not-delete-value: 0 # 逻辑未删除值
# logic-delete-value: 1 # 逻辑已删除值
configuration:
map-underscore-to-camel-case: true # 开启驼峰命名转换
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # MyBatis日志实现 (开发时可开启)
# 日志配置
logging:
level:
com.trade.user: INFO # 用户模块日志级别
com.trade.user.mapper: DEBUG # Mapper接口日志级别 (开发时可设为DEBUG查看SQL)
org.springframework.web: INFO
org.springframework.security: INFO # 如果集成了Spring Security
# file:
# name: ./logs/trade-user.log # 日志文件路径和名称
# Actuator端点配置
management:
endpoints:
web:
exposure:
include: '*' # 暴露所有端点,生产环境请按需配置
endpoint:
health:
show-details: always # 显示健康检查详情
# 如果需要集成其他组件,如Redis、RabbitMQ等,在此处添加相应配置
# spring:
# data:
# redis:
# host: localhost
# port: 6379
# # password: yourpassword
# rabbitmq:
# host: localhost
# port: 5672
# username: guest
# password: guest
# Swagger/OpenAPI 配置 (如果使用SpringDoc)
# springdoc:
# api-docs:
# path: /v3/api-docs # API文档路径
# swagger-ui:
# path: /swagger-ui.html # Swagger UI路径
# display-request-duration: true
# groups-order: DESC
# group-configs:
# - group: 'User API'
# paths-to-match: '/user/**'
# packages-to-scan: com.trade.user.controller
@@ -0,0 +1,20 @@
spring:
application:
name: trade-user # 应用名称,必须与Nacos中配置的Data ID相关联或作为前缀
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848 # Nacos配置中心地址
namespace: # Nacos命名空间ID,根据实际情况配置
group: DEFAULT_GROUP # Nacos分组,根据实际情况配置
file-extension: yml # 拉取配置文件的格式
# data-id: trade-user.yml # 如果需要显式指定主配置文件Data ID,通常由shared-configs和ext-config管理
# refresh-enabled: true # 是否开启动态刷新,默认为true
discovery:
server-addr: ${spring.cloud.nacos.config.server-addr} # Nacos服务发现地址,通常与配置中心地址一致
namespace: ${spring.cloud.nacos.config.namespace}
group: ${spring.cloud.nacos.config.group}
# 日志配置,也可以放在application.yml中,但bootstrap.yml中配置可以更早生效
# logging:
# config: classpath:logback-spring.xml # 指定日志配置文件
@@ -0,0 +1,15 @@
#数据库连接配置
spring.datasource.url=jdbc:mysql://localhost:3306/trade-user?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#指定生成代码的模块
project.module.name=trade-user
#指定生成代码的表名
#多个表名用逗号隔开
#table.names=ums_admin,ums_role,ums_permission,ums_admin_role_relation,ums_role_permission_relation,ums_admin_permission_relation,ums_resource
table.names=ums_resource
#指定生成代码的作者
author.name=macro
#是否覆盖已有文件
file.override=true
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<logger name="com.trade.user" level="DEBUG"/>
</configuration>
@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.trade.user.mapper.UmsAdminMapper">
<resultMap id="BaseResultMap" type="com.trade.user.model.UmsAdmin">
<id column="id" jdbcType="BIGINT" property="id" />
<result column="username" jdbcType="VARCHAR" property="username" />
<result column="password" jdbcType="VARCHAR" property="password" />
<result column="icon" jdbcType="VARCHAR" property="icon" />
<result column="email" jdbcType="VARCHAR" property="email" />
<result column="nick_name" jdbcType="VARCHAR" property="nickName" />
<result column="note" jdbcType="VARCHAR" property="note" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="login_time" jdbcType="TIMESTAMP" property="loginTime" />
<result column="status" jdbcType="INTEGER" property="status" />
</resultMap>
<select id="getPermissionList" resultMap="com.trade.user.mapper.UmsPermissionMapper.BaseResultMap">
SELECT
p.*
FROM
ums_admin_role_relation ar
LEFT JOIN ums_role r ON ar.role_id = r.id
LEFT JOIN ums_role_permission_relation rp ON r.id = rp.role_id
LEFT JOIN ums_permission p ON rp.permission_id = p.id
WHERE
ar.admin_id = #{adminId}
AND p.id IS NOT NULL
AND p.id NOT IN (
SELECT
p.id
FROM
ums_admin_permission_relation apr
LEFT JOIN ums_permission p ON apr.permission_id = p.id
WHERE
apr.admin_id = #{adminId}
AND apr.type = - 1
)
UNION
SELECT
p.*
FROM
ums_admin_permission_relation apr
LEFT JOIN ums_permission p ON apr.permission_id = p.id
WHERE
apr.admin_id = #{adminId}
AND apr.type = 1
</select>
<select id="getRoleList" resultMap="com.trade.user.mapper.UmsRoleMapper.BaseResultMap">
SELECT
r.*
FROM
ums_admin_role_relation ar
LEFT JOIN ums_role r ON ar.role_id = r.id
WHERE
ar.admin_id = #{adminId}
</select>
</mapper>
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.trade.user.mapper.UmsAdminPermissionRelationMapper">
<resultMap id="BaseResultMap" type="com.trade.user.model.UmsAdminPermissionRelation">
<id column="id" jdbcType="BIGINT" property="id" />
<result column="admin_id" jdbcType="BIGINT" property="adminId" />
<result column="permission_id" jdbcType="BIGINT" property="permissionId" />
<result column="type" jdbcType="INTEGER" property="type" />
</resultMap>
</mapper>
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.trade.user.mapper.UmsAdminRoleRelationMapper">
<resultMap id="BaseResultMap" type="com.trade.user.model.UmsAdminRoleRelation">
<id column="id" jdbcType="BIGINT" property="id" />
<result column="admin_id" jdbcType="BIGINT" property="adminId" />
<result column="role_id" jdbcType="BIGINT" property="roleId" />
</resultMap>
</mapper>
@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.trade.user.mapper.UmsPermissionMapper">
<resultMap id="BaseResultMap" type="com.trade.user.model.UmsPermission">
<id column="id" jdbcType="BIGINT" property="id" />
<result column="pid" jdbcType="BIGINT" property="pid" />
<result column="name" jdbc="VARCHAR" property="name" />
<result column="value" jdbcType="VARCHAR" property="value" />
<result column="icon" jdbcType="VARCHAR" property="icon" />
<result column="type" jdbcType="INTEGER" property="type" />
<result column="uri" jdbcType="VARCHAR" property="uri" />
<result column="status" jdbcType="INTEGER" property="status" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="sort" jdbcType="INTEGER" property="sort" />
</resultMap>
<resultMap id="treeList" type="com.trade.user.model.UmsPermission" extends="BaseResultMap">
<collection property="children" ofType="com.trade.user.model.UmsPermission" select="com.trade.user.mapper.UmsPermissionMapper.treeList" column="id"></collection>
</resultMap>
<select id="treeList" resultMap="treeList">
SELECT
id,pid,name,value,icon,type,uri,status,create_time,sort
FROM
ums_permission
WHERE
pid = #{id}
ORDER BY sort DESC
</select>
</mapper>
@@ -0,0 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.trade.user.mapper.UmsResourceMapper">
<resultMap id="BaseResultMap" type="com.trade.user.model.UmsResource">
<id column="id" jdbcType="BIGINT" property="id" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="url" jdbcType="VARCHAR" property="url" />
<result column="category_id" jdbcType="BIGINT" property="categoryId" />
</resultMap>
<select id="getResourceList" resultMap="BaseResultMap">
SELECT
ur.id,
ur.create_time,
ur.name,
ur.url,
ur.category_id
FROM
ums_admin_role_relation ar
LEFT JOIN ums_role r ON ar.role_id = r.id
LEFT JOIN ums_role_resource_relation rrr ON r.id = rrr.role_id
LEFT JOIN ums_resource ur ON ur.id = rrr.resource_id
WHERE
ar.admin_id = #{adminId}
AND ur.id IS NOT NULL
GROUP BY
ur.id
</select>
</mapper>
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.trade.user.mapper.UmsRoleMapper">
<resultMap id="BaseResultMap" type="com.trade.user.model.UmsRole">
<id column="id" jdbcType="BIGINT" property="id" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="description" jdbcType="VARCHAR" property="description" />
<result column="admin_count" jdbcType="INTEGER" property="adminCount" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="status" jdbcType="INTEGER" property="status" />
<result column="sort" jdbcType="INTEGER" property="sort" />
</resultMap>
<select id="getPermissionList" resultMap="com.trade.user.mapper.UmsPermissionMapper.BaseResultMap">
SELECT
p.*
FROM
ums_role_permission_relation rp
LEFT JOIN ums_permission p ON rp.permission_id = p.id
WHERE
rp.role_id = #{roleId}
</select>
</mapper>
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.trade.user.mapper.UmsRolePermissionRelationMapper">
<resultMap id="BaseResultMap" type="com.trade.user.model.UmsRolePermissionRelation">
<id column="id" jdbcType="BIGINT" property="id" />
<result column="role_id" jdbcType="BIGINT" property="roleId" />
<result column="permission_id" jdbcType="BIGINT" property="permissionId" />
</resultMap>
</mapper>