清理归档下,已经迁移的逻辑

This commit is contained in:
YunaiV 2022-06-17 20:39:21 +08:00
parent e20600f0c2
commit ff18d2f30a
108 changed files with 0 additions and 4598 deletions

View File

@ -1,71 +0,0 @@
package cn.iocoder.common.framework.exception;
import cn.iocoder.common.framework.exception.enums.GlobalErrorCodeConstants;
import cn.iocoder.common.framework.vo.CommonResult;
/**
* 全局异常 Exception
*/
public class GlobalException extends RuntimeException {
/**
* 全局错误码
*
* @see GlobalErrorCodeConstants
*/
private Integer code;
/**
* 错误提示
*/
private String message;
/**
* 错误明细内部调试错误
*
* {@link CommonResult#getDetailMessage()} 一致的设计
*/
private String detailMessage;
/**
* 空构造方法避免反序列化问题
*/
public GlobalException() {
}
public GlobalException(ErrorCode errorCode) {
this.code = errorCode.getCode();
this.message = errorCode.getMessage();
}
public GlobalException(Integer code, String message) {
this.code = code;
this.message = message;
}
public Integer getCode() {
return code;
}
public String getDetailMessage() {
return detailMessage;
}
public GlobalException setDetailMessage(String detailMessage) {
this.detailMessage = detailMessage;
return this;
}
public GlobalException setCode(Integer code) {
this.code = code;
return this;
}
public String getMessage() {
return message;
}
public GlobalException setMessage(String message) {
this.message = message;
return this;
}
}

View File

@ -1,71 +0,0 @@
package cn.iocoder.common.framework.exception;
import cn.iocoder.common.framework.exception.enums.ServiceErrorCodeRange;
import cn.iocoder.common.framework.vo.CommonResult;
/**
* 业务逻辑异常 Exception
*/
public final class ServiceException extends RuntimeException {
/**
* 业务错误码
*
* @see ServiceErrorCodeRange
*/
private Integer code;
/**
* 错误提示
*/
private String message;
/**
* 错误明细内部调试错误
*
* {@link CommonResult#getDetailMessage()} 一致的设计
*/
private String detailMessage;
/**
* 空构造方法避免反序列化问题
*/
public ServiceException() {
}
public ServiceException(ErrorCode errorCode) {
this.code = errorCode.getCode();
this.message = errorCode.getMessage();
}
public ServiceException(Integer code, String message) {
this.code = code;
this.message = message;
}
public Integer getCode() {
return code;
}
public String getDetailMessage() {
return detailMessage;
}
public ServiceException setDetailMessage(String detailMessage) {
this.detailMessage = detailMessage;
return this;
}
public ServiceException setCode(Integer code) {
this.code = code;
return this;
}
public String getMessage() {
return message;
}
public ServiceException setMessage(String message) {
this.message = message;
return this;
}
}

View File

@ -1,36 +0,0 @@
package cn.iocoder.common.framework.exception.enums;
import cn.iocoder.common.framework.exception.ErrorCode;
/**
* 全局错误码枚举
* 0-999 系统异常编码保留
*
* 一般情况下使用 HTTP 响应状态码 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Status
* 虽然说HTTP 响应状态码作为业务使用表达能力偏弱但是使用在系统层面还是非常不错的
* 比较特殊的是因为之前一直使用 0 作为成功就不使用 200
*/
public interface GlobalErrorCodeConstants {
ErrorCode SUCCESS = new ErrorCode(0, "成功");
// ========== 客户端错误段 ==========
ErrorCode BAD_REQUEST = new ErrorCode(400, "请求参数不正确");
ErrorCode UNAUTHORIZED = new ErrorCode(401, "账号未登录");
ErrorCode FORBIDDEN = new ErrorCode(403, "没有该操作权限");
ErrorCode NOT_FOUND = new ErrorCode(404, "请求未找到");
ErrorCode METHOD_NOT_ALLOWED = new ErrorCode(405, "请求方法不正确");
// ========== 服务端错误段 ==========
ErrorCode INTERNAL_SERVER_ERROR = new ErrorCode(500, "系统异常");
ErrorCode UNKNOWN = new ErrorCode(999, "未知错误");
static boolean isMatch(Integer code) {
return code != null
&& code >= SUCCESS.getCode() && code <= UNKNOWN.getCode();
}
}

View File

@ -1,47 +0,0 @@
package cn.iocoder.common.framework.exception.enums;
/**
* 业务异常的错误码区间解决解决各模块错误码定义避免重复在此只声明不做实际使用
*
* 一共 10 分成四段
*
* 第一段1 类型
* 1 - 业务级别异常
* x - 预留
* 第二段3 系统类型
* 001 - 用户系统
* 002 - 商品系统
* 003 - 订单系统
* 004 - 支付系统
* 005 - 优惠劵系统
* ... - ...
* 第三段3 模块
* 不限制规则
* 一般建议每个系统里面可能有多个模块可以再去做分段以用户系统为例子
* 001 - OAuth2 模块
* 002 - User 模块
* 003 - MobileCode 模块
* 第四段3 错误码
* 不限制规则
* 一般建议每个模块自增
*
* @author Sin
* @time 2019-03-23 11:28
*/
public class ServiceErrorCodeRange {
// order 错误码区间 [1-000-001-000 ~ 1-000-002-000]
// user 错误码区间 [1-001-000-000 ~ 1-002-000-000)
// system-service 服务 => 错误码区间 [1-002-000-000 ~ 1-003-000-000)
// product 错误码区间 [1-003-000-000 ~ 1-004-000-000)
// pay 错误码区间 [1-004-000-000 ~ 1-005-000-000)
// cart 错误码区间 [1-005-000-000 ~ 1-006-000-000)
// promotion 错误码区间 [1-006-000-000 ~ 1-007-000-000)
}

View File

@ -1,15 +0,0 @@
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>common</artifactId>
<groupId>cn.iocoder.mall</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mall-security-annotations</artifactId>
</project>

View File

@ -1,18 +0,0 @@
package cn.iocoder.security.annotations;
import java.lang.annotation.*;
/**
* 要求用户认证登陆注解通过将该注解添加到 Controller 会自动校验用户是否登陆
*
* 默认请求下用户访问的 API 接口无需登陆主要的考虑是
* 1. 需要用户登陆的接口本身会获取在线用户的编号如果不添加 @RequiresLogin 注解就会报错
* 2. 大多数情况下用户的 API 接口无需登陆
*
* ps同样适用于管理员 Admin
*/
@Documented
@Target({ElementType.METHOD}) // 暂时不支持 ElementType.TYPE 因为没有场景
@Retention(RetentionPolicy.RUNTIME)
public @interface RequiresAuthenticate {
}

View File

@ -1,12 +0,0 @@
package cn.iocoder.security.annotations;
import java.lang.annotation.*;
/**
* 通过将该注解添加到 Controller 的方法上声明无需进行登陆
*/
@Documented
@Target({ElementType.METHOD}) // 暂时不支持 ElementType.TYPE 因为没有场景
@Retention(RetentionPolicy.RUNTIME)
public @interface RequiresNone {
}

View File

@ -1,24 +0,0 @@
package cn.iocoder.security.annotations;
import java.lang.annotation.*;
/**
* 参考 Shiro @RequiresPermissions 设计 http://shiro.apache.org/static/1.3.2/apidocs/org/apache/shiro/authz/annotation/RequiresPermissions.html
*
* 通过将该注解添加到 Controller 的方法上进行授权鉴定
*
* ps目前暂时只有管理员 Admin 使用到
*/
@Documented
@Target({ElementType.METHOD}) // 暂时不支持 ElementType.TYPE 因为没有场景
@Retention(RetentionPolicy.RUNTIME)
public @interface RequiresPermissions {
/**
* 当有多个标识时必须全部拥有权限才可以操作
*
* @return 权限标识数组
*/
String[] value() default {};
}

View File

@ -1,48 +0,0 @@
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>common</artifactId>
<groupId>cn.iocoder.mall</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mall-spring-boot-starter-security-admin</artifactId>
<dependencies>
<!-- Mall 相关 -->
<dependency>
<groupId>cn.iocoder.mall</groupId>
<artifactId>system-service-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- Spring 核心 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!-- Web 相关 -->
<dependency>
<groupId>cn.iocoder.mall</groupId>
<artifactId>mall-spring-boot-starter-web</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>cn.iocoder.mall</groupId>
<artifactId>mall-security-annotations</artifactId>
</dependency>
<!-- RPC 相关 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -1,60 +0,0 @@
package cn.iocoder.mall.security.admin.config;
import cn.iocoder.mall.security.admin.core.interceptor.AdminDemoInterceptor;
import cn.iocoder.mall.security.admin.core.interceptor.AdminSecurityInterceptor;
import cn.iocoder.mall.web.config.CommonWebAutoConfiguration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
@AutoConfigureAfter(CommonWebAutoConfiguration.class) // CommonWebAutoConfiguration 之后自动配置保证过滤器的顺序
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@EnableConfigurationProperties(AdminSecurityProperties.class)
public class AdminSecurityAutoConfiguration implements WebMvcConfigurer {
private Logger logger = LoggerFactory.getLogger(getClass());
@Bean
@ConditionalOnMissingBean
public AdminSecurityProperties adminSecurityProperties() {
return new AdminSecurityProperties();
}
// ========== 拦截器相关 ==========
@Bean
public AdminSecurityInterceptor adminSecurityInterceptor() {
return new AdminSecurityInterceptor();
}
@Bean
public AdminDemoInterceptor adminDemoInterceptor() {
return new AdminDemoInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
AdminSecurityProperties properties = this.adminSecurityProperties();
// AdminSecurityInterceptor 拦截器
registry.addInterceptor(this.adminSecurityInterceptor())
.excludePathPatterns(properties.getIgnorePaths())
.excludePathPatterns(properties.getDefaultIgnorePaths());
logger.info("[addInterceptors][加载 AdminSecurityInterceptor 拦截器完成]");
// AdminDemoInterceptor 拦截器
if (Boolean.TRUE.equals(properties.getDemo())) {
registry.addInterceptor(this.adminDemoInterceptor())
.excludePathPatterns(properties.getIgnorePaths())
.excludePathPatterns(properties.getDefaultIgnorePaths());
logger.info("[addInterceptors][加载 AdminDemoInterceptor 拦截器完成]");
}
}
}

View File

@ -1,59 +0,0 @@
package cn.iocoder.mall.security.admin.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties("mall.security.admin")
public class AdminSecurityProperties {
private static final String[] DEFAULT_IGNORE_PATHS = new String[]{
// Swagger 相关
"/doc.html", "/swagger-resources", "/swagger-resources/**", "/webjars/**",
// Actuator 相关
};
/**
* 演示模式 - 默认值关闭
*/
private static final Boolean DEFAULT_DEMO = false;
/**
* 自定义忽略 Path
*/
private String[] ignorePaths = new String[0];
/**
* 默认忽略 Path
*/
private String[] defaultIgnorePaths = DEFAULT_IGNORE_PATHS;
/**
* 是否开启演示模式
*/
private Boolean demo = DEFAULT_DEMO;
public String[] getIgnorePaths() {
return ignorePaths;
}
public AdminSecurityProperties setIgnorePaths(String[] ignorePaths) {
this.ignorePaths = ignorePaths;
return this;
}
public String[] getDefaultIgnorePaths() {
return defaultIgnorePaths;
}
public AdminSecurityProperties setDefaultIgnorePaths(String[] defaultIgnorePaths) {
this.defaultIgnorePaths = defaultIgnorePaths;
return this;
}
public Boolean getDemo() {
return demo;
}
public AdminSecurityProperties setDemo(Boolean demo) {
this.demo = demo;
return this;
}
}

View File

@ -1,18 +0,0 @@
package cn.iocoder.mall.security.admin.core.context;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* Admin Security 上下文
*/
@Data
@Accessors(chain = true)
public class AdminSecurityContext {
/**
* 管理员编号
*/
private Integer adminId;
}

View File

@ -1,34 +0,0 @@
package cn.iocoder.mall.security.admin.core.context;
/**
* {@link AdminSecurityContext} Holder
*
* 参考 spring security ThreadLocalSecurityContextHolderStrategy 简单实现
*/
public class AdminSecurityContextHolder {
private static final ThreadLocal<AdminSecurityContext> SECURITY_CONTEXT = new ThreadLocal<>();
public static void setContext(AdminSecurityContext context) {
SECURITY_CONTEXT.set(context);
}
public static AdminSecurityContext getContext() {
AdminSecurityContext ctx = SECURITY_CONTEXT.get();
// 为空时设置一个空的进去
if (ctx == null) {
ctx = new AdminSecurityContext();
SECURITY_CONTEXT.set(ctx);
}
return ctx;
}
public static void clear() {
SECURITY_CONTEXT.remove();
}
public static Integer getAdminId() {
return getContext().getAdminId();
}
}

View File

@ -1,31 +0,0 @@
package cn.iocoder.mall.security.admin.core.interceptor;
import cn.iocoder.common.framework.exception.util.ServiceExceptionUtil;
import cn.iocoder.mall.security.admin.core.context.AdminSecurityContextHolder;
import cn.iocoder.mall.systemservice.enums.SystemErrorCodeConstants;
import org.springframework.http.HttpMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Objects;
/**
* Admin 演示拦截器
*
* 这是个比较奇怪的拦截器用于演示的管理员账号禁止使用 POST 请求从而实现即达到阉割版的演示的效果又避免影响了数据
*/
public class AdminDemoInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
// Admin 编号等于 1 约定为演示账号
// TODO 芋艿后续去优化
if (Objects.equals(AdminSecurityContextHolder.getAdminId(), 1)
&& request.getMethod().equalsIgnoreCase(HttpMethod.POST.toString())) {
throw ServiceExceptionUtil.exception(SystemErrorCodeConstants.PERMISSION_DEMO_PERMISSION_DENY);
}
return true;
}
}

View File

@ -1,96 +0,0 @@
package cn.iocoder.mall.security.admin.core.interceptor;
import cn.iocoder.common.framework.enums.UserTypeEnum;
import cn.iocoder.common.framework.exception.GlobalException;
import cn.iocoder.common.framework.exception.util.ServiceExceptionUtil;
import cn.iocoder.common.framework.util.CollectionUtils;
import cn.iocoder.common.framework.util.HttpUtil;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.security.admin.core.context.AdminSecurityContext;
import cn.iocoder.mall.security.admin.core.context.AdminSecurityContextHolder;
import cn.iocoder.mall.systemservice.rpc.oauth.OAuthFeign;
import cn.iocoder.mall.systemservice.rpc.oauth.dto.OAuth2AccessTokenRespDTO;
import cn.iocoder.mall.systemservice.rpc.permission.PermissionFeign;
import cn.iocoder.mall.systemservice.rpc.permission.dto.PermissionCheckDTO;
import cn.iocoder.mall.web.core.util.CommonWebUtil;
import cn.iocoder.security.annotations.RequiresNone;
import cn.iocoder.security.annotations.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
import static cn.iocoder.common.framework.exception.enums.GlobalErrorCodeConstants.UNAUTHORIZED;
import static cn.iocoder.mall.systemservice.enums.SystemErrorCodeConstants.OAUTH_USER_TYPE_ERROR;
public class AdminSecurityInterceptor extends HandlerInterceptorAdapter {
@Autowired
private OAuthFeign oAuthFeign;
@Autowired
private PermissionFeign permissionFeign;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
// 获得访问令牌
Integer adminId = this.obtainAdminId(request);
// 校验认证
this.checkAuthentication((HandlerMethod) handler, adminId);
// 校验权限
this.checkPermission((HandlerMethod) handler, adminId);
return true;
}
private Integer obtainAdminId(HttpServletRequest request) {
String accessToken = HttpUtil.obtainAuthorization(request);
Integer adminId = null;
if (accessToken != null) {
CommonResult<OAuth2AccessTokenRespDTO> checkAccessTokenResult = oAuthFeign.checkAccessToken(accessToken);
checkAccessTokenResult.checkError();
// 校验用户类型正确
if (!UserTypeEnum.ADMIN.getValue().equals(checkAccessTokenResult.getData().getUserType())) {
throw ServiceExceptionUtil.exception(OAUTH_USER_TYPE_ERROR);
}
// 获得用户编号
adminId = checkAccessTokenResult.getData().getUserId();
// 设置到 Request
CommonWebUtil.setUserId(request, adminId);
CommonWebUtil.setUserType(request, UserTypeEnum.ADMIN.getValue());
// 设置到
AdminSecurityContext adminSecurityContext = new AdminSecurityContext().setAdminId(adminId);
AdminSecurityContextHolder.setContext(adminSecurityContext);
}
return adminId;
}
private void checkAuthentication(HandlerMethod handlerMethod, Integer adminId) {
boolean requiresAuthenticate = !handlerMethod.hasMethodAnnotation(RequiresNone.class); // 对于 ADMIN 来说默认需登录
if (requiresAuthenticate && adminId == null) {
throw new GlobalException(UNAUTHORIZED);
}
}
private void checkPermission(HandlerMethod handlerMethod, Integer adminId) {
RequiresPermissions requiresPermissions = handlerMethod.getMethodAnnotation(RequiresPermissions.class);
if (requiresPermissions == null) {
return;
}
String[] permissions = requiresPermissions.value();
if (CollectionUtils.isEmpty(permissions)) {
return;
}
// 权限验证
permissionFeign.checkPermission(new PermissionCheckDTO().setAdminId(adminId).setPermissions(Arrays.asList(permissions)))
.checkError();
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
// 清空 SecurityContext
AdminSecurityContextHolder.clear();
}
}

View File

@ -1,2 +0,0 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.iocoder.mall.security.admin.config.AdminSecurityAutoConfiguration

View File

@ -1,47 +0,0 @@
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>common</artifactId>
<groupId>cn.iocoder.mall</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>mall-spring-boot-starter-security-user</artifactId>
<dependencies>
<!-- Mall 相关 -->
<dependency>
<groupId>cn.iocoder.mall</groupId>
<artifactId>system-service-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- Spring 核心 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!-- Web 相关 -->
<dependency>
<groupId>cn.iocoder.mall</groupId>
<artifactId>mall-spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>cn.iocoder.mall</groupId>
<artifactId>mall-security-annotations</artifactId>
</dependency>
<!-- RPC 相关 -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
</dependency>
</dependencies>
</project>

View File

@ -1,47 +0,0 @@
package cn.iocoder.mall.security.user.config;
import cn.iocoder.mall.security.user.core.interceptor.UserSecurityInterceptor;
import cn.iocoder.mall.web.config.CommonWebAutoConfiguration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
@AutoConfigureAfter(CommonWebAutoConfiguration.class) // CommonWebAutoConfiguration 之后自动配置保证过滤器的顺序
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@EnableConfigurationProperties(UserSecurityProperties.class)
public class UserSecurityAutoConfiguration implements WebMvcConfigurer {
private Logger logger = LoggerFactory.getLogger(getClass());
@Bean
@ConditionalOnMissingBean
public UserSecurityProperties userSecurityProperties() {
return new UserSecurityProperties();
}
// ========== 拦截器相关 ==========
@Bean
public UserSecurityInterceptor userSecurityInterceptor() {
return new UserSecurityInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
UserSecurityProperties properties = this.userSecurityProperties();
// UserSecurityInterceptor 拦截器
registry.addInterceptor(this.userSecurityInterceptor())
.excludePathPatterns(properties.getIgnorePaths())
.excludePathPatterns(properties.getDefaultIgnorePaths());;
logger.info("[addInterceptors][加载 UserSecurityInterceptor 拦截器完成]");
}
}

View File

@ -1,41 +0,0 @@
package cn.iocoder.mall.security.user.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
@ConfigurationProperties("mall.security.user")
public class UserSecurityProperties {
private static final String[] DEFAULT_IGNORE_PATHS = new String[]{
// Swagger 相关
"/doc.html", "/swagger-resources", "/swagger-resources/**", "/webjars/**",
// Actuator 相关
};
/**
* 自定义忽略 Path
*/
private String[] ignorePaths = new String[0];
/**
* 默认忽略 Path
*/
private String[] defaultIgnorePaths = DEFAULT_IGNORE_PATHS;
public String[] getIgnorePaths() {
return ignorePaths;
}
public UserSecurityProperties setIgnorePaths(String[] ignorePaths) {
this.ignorePaths = ignorePaths;
return this;
}
public String[] getDefaultIgnorePaths() {
return defaultIgnorePaths;
}
public UserSecurityProperties setDefaultIgnorePaths(String[] defaultIgnorePaths) {
this.defaultIgnorePaths = defaultIgnorePaths;
return this;
}
}

View File

@ -1,18 +0,0 @@
package cn.iocoder.mall.security.user.core.context;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* User Security 上下文
*/
@Data
@Accessors(chain = true)
public class UserSecurityContext {
/**
* 用户编号
*/
private Integer userId;
}

View File

@ -1,35 +0,0 @@
package cn.iocoder.mall.security.user.core.context;
/**
* {@link UserSecurityContext} Holder
*
* 参考 spring security ThreadLocalSecurityContextHolderStrategy 简单实现
*/
public class UserSecurityContextHolder {
private static final ThreadLocal<UserSecurityContext> SECURITY_CONTEXT = new ThreadLocal<UserSecurityContext>();
public static void setContext(UserSecurityContext context) {
SECURITY_CONTEXT.set(context);
}
public static UserSecurityContext getContext() {
UserSecurityContext ctx = SECURITY_CONTEXT.get();
// 为空时设置一个空的进去
if (ctx == null) {
ctx = new UserSecurityContext();
SECURITY_CONTEXT.set(ctx);
}
return ctx;
}
public static Integer getUserId() {
UserSecurityContext ctx = SECURITY_CONTEXT.get();
return ctx != null ? ctx.getUserId() : null;
}
public static void clear() {
SECURITY_CONTEXT.remove();
}
}

View File

@ -1,77 +0,0 @@
package cn.iocoder.mall.security.user.core.interceptor;
import cn.iocoder.common.framework.enums.UserTypeEnum;
import cn.iocoder.common.framework.exception.util.ServiceExceptionUtil;
import cn.iocoder.common.framework.util.HttpUtil;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.security.user.core.context.UserSecurityContext;
import cn.iocoder.mall.security.user.core.context.UserSecurityContextHolder;
import cn.iocoder.mall.systemservice.rpc.oauth.OAuthFeign;
import cn.iocoder.mall.systemservice.rpc.oauth.dto.OAuth2AccessTokenRespDTO;
import cn.iocoder.mall.web.core.util.CommonWebUtil;
import cn.iocoder.security.annotations.RequiresAuthenticate;
import cn.iocoder.security.annotations.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import static cn.iocoder.common.framework.exception.enums.GlobalErrorCodeConstants.UNAUTHORIZED;
import static cn.iocoder.mall.systemservice.enums.SystemErrorCodeConstants.OAUTH_USER_TYPE_ERROR;
public class UserSecurityInterceptor extends HandlerInterceptorAdapter {
@Autowired
private OAuthFeign oAuthFeign;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
// 获得访问令牌
Integer userId = this.obtainUserId(request);
// 校验认证
this.checkAuthentication((HandlerMethod) handler, userId);
return true;
}
private Integer obtainUserId(HttpServletRequest request) {
String accessToken = HttpUtil.obtainAuthorization(request);
Integer userId = null;
if (accessToken != null) {
CommonResult<OAuth2AccessTokenRespDTO> checkAccessTokenResult = oAuthFeign.checkAccessToken(accessToken);
checkAccessTokenResult.checkError();
// 校验用户类型正确
if (!UserTypeEnum.USER.getValue().equals(checkAccessTokenResult.getData().getUserType())) {
throw ServiceExceptionUtil.exception(OAUTH_USER_TYPE_ERROR);
}
// 获得用户编号
userId = checkAccessTokenResult.getData().getUserId();
// 设置到 Request
CommonWebUtil.setUserId(request, userId);
CommonWebUtil.setUserType(request, UserTypeEnum.USER.getValue());
// 设置到
UserSecurityContext userSecurityContext = new UserSecurityContext().setUserId(userId);
UserSecurityContextHolder.setContext(userSecurityContext);
}
return userId;
}
private void checkAuthentication(HandlerMethod handlerMethod, Integer userId) {
boolean requiresAuthenticate = false; // 对于 USER 来说默认无需登录
if (handlerMethod.hasMethodAnnotation(RequiresAuthenticate.class)
|| handlerMethod.hasMethodAnnotation(RequiresPermissions.class)) { // 如果需要权限验证也认为需要认证
requiresAuthenticate = true;
}
if (requiresAuthenticate && userId == null) {
throw ServiceExceptionUtil.exception(UNAUTHORIZED);
}
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
// 清空 SecurityContext
UserSecurityContextHolder.clear();
}
}

View File

@ -1,2 +0,0 @@
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.iocoder.mall.security.user.config.UserSecurityAutoConfiguration

View File

@ -1,18 +0,0 @@
package cn.iocoder.mall.managementweb;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = {"cn.iocoder.mall.productservice.rpc","cn.iocoder.mall.payservice.rpc"
,"cn.iocoder.mall.promotion.api.rpc","cn.iocoder.mall.systemservice.rpc","cn.iocoder.mall.userservice.rpc"})
public class ManagementWebApplication {
public static void main(String[] args) {
SpringApplication.run(ManagementWebApplication.class, args);
}
}

View File

@ -1,23 +0,0 @@
package cn.iocoder.mall.managementweb.client.pay.transaction;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.payservice.rpc.transaction.PayTransactionFeign;
import cn.iocoder.mall.payservice.rpc.transaction.dto.PayTransactionPageReqDTO;
import cn.iocoder.mall.payservice.rpc.transaction.dto.PayTransactionRespDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class PayTransactionClient {
@Autowired
private PayTransactionFeign payTransactionFeign;
public PageResult<PayTransactionRespDTO> pagePayTransaction(PayTransactionPageReqDTO pageReqDTO) {
CommonResult<PageResult<PayTransactionRespDTO>> pagePayTransactionResult = payTransactionFeign.pagePayTransaction(pageReqDTO);
pagePayTransactionResult.checkError();
return pagePayTransactionResult.getData();
}
}

View File

@ -1,41 +0,0 @@
### /admin/page 成功
GET http://127.0.0.1:18083/management-api/admin/page?pageNo=1&pageSize=10
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer yudaoyuanma
### /admin/create 成功
POST http://127.0.0.1:18083/management-api/admin/create
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer yudaoyuanma
username=admin02&password=buzhidao&name=测试管理员&departmentId=1
### /admin/update 成功
POST http://127.0.0.1:18083/management-api/admin/update
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer yudaoyuanma
id=31&username=admin02&password=buzhidao&name=测试管理员&departmentId=1
### /admin/update-status 成功
POST http://127.0.0.1:18083/management-api/admin/update-status
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer yudaoyuanma
adminId=31&status=1
### /admin/update-status 失败,参数缺失
POST http://127.0.0.1:18083/management-api/admin/update-status
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer yudaoyuanma
adminId=31
### admin/update-status 失败,地址不存在
GET http://127.0.0.1:18083/management-api/admin/update-status---
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer yudaoyuanma
adminId=31&status=sss
###

View File

@ -1,67 +0,0 @@
package cn.iocoder.mall.managementweb.controller.admin;
import cn.iocoder.common.framework.util.HttpUtil;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.managementweb.controller.admin.dto.AdminCreateDTO;
import cn.iocoder.mall.managementweb.controller.admin.dto.AdminPageDTO;
import cn.iocoder.mall.managementweb.controller.admin.dto.AdminUpdateInfoDTO;
import cn.iocoder.mall.managementweb.controller.admin.dto.AdminUpdateStatusDTO;
import cn.iocoder.mall.managementweb.controller.admin.vo.AdminPageItemVO;
import cn.iocoder.mall.managementweb.manager.admin.AdminManager;
import cn.iocoder.mall.security.admin.core.context.AdminSecurityContextHolder;
import cn.iocoder.security.annotations.RequiresPermissions;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import static cn.iocoder.common.framework.vo.CommonResult.success;
@Api(tags = "管理员 API")
@RestController
@RequestMapping("/admin")
@Validated
public class AdminController {
@Autowired
private AdminManager adminManager;
@ApiOperation(value = "管理员分页")
@GetMapping("/page")
@RequiresPermissions("system:admin:page")
public CommonResult<PageResult<AdminPageItemVO>> page(AdminPageDTO adminPageDTO) {
return success(adminManager.pageAdmin(adminPageDTO));
}
@ApiOperation(value = "创建管理员")
@PostMapping("/create")
@RequiresPermissions("system:admin:create")
public CommonResult<Integer> createAdmin(AdminCreateDTO createDTO, HttpServletRequest request) {
return success(adminManager.createAdmin(createDTO, AdminSecurityContextHolder.getAdminId(), HttpUtil.getIp(request)));
}
@PostMapping("/update")
@ApiOperation(value = "更新管理员")
@RequiresPermissions("system:admin:update")
public CommonResult<Boolean> updateAdmin(AdminUpdateInfoDTO updateInfoDTO) {
adminManager.updateAdmin(updateInfoDTO);
return success(true);
}
@PostMapping("/update-status")
@ApiOperation(value = "更新管理员状态")
@RequiresPermissions("system:admin:update-status")
public CommonResult<Boolean> updateAdminStatus(@Valid AdminUpdateStatusDTO updateStatusDTO) {
adminManager.updateAdminStatus(updateStatusDTO);
return success(true);
}
}

View File

@ -1,39 +0,0 @@
### /department/create 成功
POST http://127.0.0.1:18083/management-api/department/create
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer yudaoyuanma
dubbo-tag: {{dubboTag}}
name=测试部门&pid=0&sort=0
### /department/update 成功
POST http://127.0.0.1:18083/management-api/department/update
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer yudaoyuanma
id=1&name=测试部门&pid=0&sort=0
### /resource/delete 成功
POST http://127.0.0.1:18083/management-api/department/delete
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer yudaoyuanma
id=1
### /department/get 成功
GET http://127.0.0.1:18083/management-api/department/get?departmentId=1
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer yudaoyuanma
### /department/list 成功
GET http://127.0.0.1:18083/management-api/department/list?departmentIds=1,13
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer yudaoyuanma
### /department/tree 成功
GET http://127.0.0.1:18083/management-api/department/tree
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer yudaoyuanma
###

View File

@ -1,81 +0,0 @@
package cn.iocoder.mall.managementweb.controller.admin;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.managementweb.controller.admin.dto.DepartmentCreateDTO;
import cn.iocoder.mall.managementweb.controller.admin.dto.DepartmentUpdateDTO;
import cn.iocoder.mall.managementweb.controller.admin.vo.DepartmentTreeNodeVO;
import cn.iocoder.mall.managementweb.controller.admin.vo.DepartmentVO;
import cn.iocoder.mall.managementweb.manager.admin.DepartmentManager;
import cn.iocoder.security.annotations.RequiresPermissions;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.List;
import static cn.iocoder.common.framework.vo.CommonResult.success;
/**
* 部门 Controller
*/
@RestController
@RequestMapping("/department")
@Api(tags = "部门")
@Validated
public class DepartmentController {
@Autowired
private DepartmentManager departmentManager;
@PostMapping("/create")
@ApiOperation("创建部门")
@RequiresPermissions("system:department:create")
public CommonResult<Integer> createDepartment(@Valid DepartmentCreateDTO createDTO) {
return success(departmentManager.createDepartment(createDTO));
}
@PostMapping("/update")
@ApiOperation("更新部门")
@RequiresPermissions("system:department:update")
public CommonResult<Boolean> updateDepartment(@Valid DepartmentUpdateDTO updateDTO) {
departmentManager.updateDepartment(updateDTO);
return success(true);
}
@PostMapping("/delete")
@ApiOperation("删除部门")
@ApiImplicitParam(name = "departmentId", value = "部门编号", required = true)
@RequiresPermissions("system:department:delete")
public CommonResult<Boolean> deleteDepartment(@RequestParam("departmentId") Integer departmentId) {
departmentManager.deleteDepartment(departmentId);
return success(true);
}
@GetMapping("/get")
@ApiOperation("获得部门")
@ApiImplicitParam(name = "departmentId", value = "部门编号", required = true)
@RequiresPermissions("system:department:tree")
public CommonResult<DepartmentVO> getDepartment(@RequestParam("departmentId") Integer departmentId) {
return success(departmentManager.getDepartment(departmentId));
}
@GetMapping("/list")
@ApiOperation("获得部门列表")
@ApiImplicitParam(name = "departmentIds", value = "部门编号列表", required = true)
@RequiresPermissions("system:department:tree")
public CommonResult<List<DepartmentVO>> listDepartments(@RequestParam("departmentIds") List<Integer> departmentIds) {
return success(departmentManager.listDepartments(departmentIds));
}
@GetMapping("/tree")
@ApiOperation("获得部门树")
@RequiresPermissions("system:department:tree")
public CommonResult<List<DepartmentTreeNodeVO>> treeDepartment() {
return success(departmentManager.treeDepartment());
}
}

View File

@ -1,38 +0,0 @@
package cn.iocoder.mall.managementweb.controller.admin.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
@ApiModel("管理员创建 DTO")
@Data
@Accessors(chain = true)
public class AdminCreateDTO {
@ApiModelProperty(value = "真实名字", required = true, example = "小王")
@NotEmpty(message = "真实名字不能为空")
@Length(max = 10, message = "真实名字长度最大为 10 位")
private String name;
@ApiModelProperty(value = "部门编号", required = true, example = "1")
@NotNull(message = "部门不能为空")
private Integer departmentId;
@ApiModelProperty(value = "登陆账号", required = true, example = "15601691300")
@NotEmpty(message = "登陆账号不能为空")
@Length(min = 5, max = 16, message = "账号长度为 5-16 位")
@Pattern(regexp = "^[A-Za-z0-9]+$", message = "账号格式为数字以及字母")
private String username;
@ApiModelProperty(value = "密码", required = true, example = "buzhidao")
@NotEmpty(message = "密码不能为空")
@Length(min = 4, max = 16, message = "密码长度为 4-16 位")
private String password;
}

View File

@ -1,22 +0,0 @@
package cn.iocoder.mall.managementweb.controller.admin.dto;
import cn.iocoder.common.framework.vo.PageParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
@ApiModel("管理员分页查询 DTO")
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
public class AdminPageDTO extends PageParam {
@ApiModelProperty(value = "真实名字,模糊匹配", example = "小王")
private String name;
@ApiModelProperty(value = "部门编号")
private Integer departmentId;
}

View File

@ -1,42 +0,0 @@
package cn.iocoder.mall.managementweb.controller.admin.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
@ApiModel("管理员更新信息 DTO")
@Data
@Accessors(chain = true)
public class AdminUpdateInfoDTO {
@ApiModelProperty(value = "管理员编号", required = true, example = "1")
@NotNull(message = "管理员编号不能为空")
private Integer id;
@ApiModelProperty(value = "登陆账号", required = true, example = "15601691300")
@NotEmpty(message = "登陆账号不能为空")
@Length(min = 5, max = 16, message = "账号长度为 5-16 位")
@Pattern(regexp = "^[A-Za-z0-9]+$", message = "账号格式为数字以及字母")
private String username;
@ApiModelProperty(value = "密码", required = true, example = "buzhidao")
@NotEmpty(message = "密码不能为空")
@Length(min = 4, max = 16, message = "密码长度为 4-16 位")
private String password;
@ApiModelProperty(value = "真实名字", required = true, example = "小王")
@NotEmpty(message = "真实名字不能为空")
@Length(max = 10, message = "真实名字长度最大为 10 位")
private String name;
@ApiModelProperty(value = "部门编号", required = true, example = "1")
@NotNull(message = "部门不能为空")
private Integer departmentId;
}

View File

@ -1,26 +0,0 @@
package cn.iocoder.mall.managementweb.controller.admin.dto;
import cn.iocoder.common.framework.enums.CommonStatusEnum;
import cn.iocoder.common.framework.validator.InEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotNull;
@ApiModel("管理员更新状态 DTO")
@Data
@Accessors(chain = true)
public class AdminUpdateStatusDTO {
@ApiModelProperty(value = "管理员编号", required = true, example = "1")
@NotNull(message = "管理员编号不能为空")
private Integer adminId;
@ApiModelProperty(value = "状态", required = true, example = "1", notes = "见 CommonStatusEnum 枚举")
@NotNull(message = "状态不能为空")
@InEnum(value = CommonStatusEnum.class, message = "修改状态必须是 {value}")
private Integer status;
}

View File

@ -1,24 +0,0 @@
package cn.iocoder.mall.managementweb.controller.admin.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
@ApiModel("部门创建 DTO")
@Data
public class DepartmentCreateDTO {
@ApiModelProperty(value = "部门名称", required = true, example = "技术部")
@NotEmpty(message = "部门名称不能为空")
private String name;
@ApiModelProperty(value = "排序字段", required = true, example = "1024")
@NotNull(message = "排序字段不能为空")
private Integer sort;
@ApiModelProperty(value = "父级部门编号", required = true, example = "2048")
@NotNull(message = "父级部门编号不能为空")
private Integer pid;
}

View File

@ -1,27 +0,0 @@
package cn.iocoder.mall.managementweb.controller.admin.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
@ApiModel("部门更新 DTO")
@Data
public class DepartmentUpdateDTO {
@ApiModelProperty(value = "部门编号", required = true, example = "1")
@NotNull(message = "部门编号不能为空")
private Integer id;
@ApiModelProperty(value = "部门名称", required = true, example = "技术部")
@NotEmpty(message = "部门名称不能为空")
private String name;
@ApiModelProperty(value = "排序字段", required = true, example = "1024")
@NotNull(message = "排序字段不能为空")
private Integer sort;
@ApiModelProperty(value = "父级部门编号", required = true, example = "2048")
@NotNull(message = "父级部门编号不能为空")
private Integer pid;
}

View File

@ -1,62 +0,0 @@
package cn.iocoder.mall.managementweb.controller.admin.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.Date;
import java.util.List;
@ApiModel(value = "分页时,管理员的信息 VO")
@Data
@Accessors(chain = true)
public class AdminPageItemVO {
@ApiModel("角色")
@Data
@Accessors(chain = true)
public static class Role {
@ApiModelProperty(value = "角色编号", required = true, example = "1")
private Integer id;
@ApiModelProperty(value = "角色名", required = true, example = "码神")
private String name;
}
@ApiModel("部门")
@Data
@Accessors(chain = true)
public static class Department {
@ApiModelProperty(value = "部门编号", required = true, example = "1")
private Integer id;
@ApiModelProperty(value = "部门名称", required = true, example = "研发部")
private String name;
}
@ApiModelProperty(value = "管理员编号", required = true, example = "1")
private Integer id;
@ApiModelProperty(value = "真实名字", required = true, example = "小王")
private String name;
@ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式")
private Date createTime;
@ApiModelProperty(value = "在职状态", required = true, example = "1", notes = "见 AdminStatusEnum 枚举")
private Integer status;
@ApiModelProperty(value = "登陆账号", required = true, example = "15601691300")
private String username;
/**
* 角色列表
*/
private List<Role> roles;
/**
* 所在部门
*/
private Department department;
}

View File

@ -1,26 +0,0 @@
package cn.iocoder.mall.managementweb.controller.admin.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.Date;
@ApiModel(value = "管理员 VO")
@Data
@Accessors(chain = true)
public class AdminVO {
@ApiModelProperty(value = "管理员编号", required = true, example = "1")
private Integer id;
@ApiModelProperty(value = "真实名字", required = true, example = "小王")
private String name;
@ApiModelProperty(value = "创建时间", required = true, example = "时间戳格式")
private Date createTime;
@ApiModelProperty(value = "在职状态", required = true, example = "1", notes = "见 AdminStatusEnum 枚举")
private Integer status;
@ApiModelProperty(value = "登陆账号", required = true, example = "15601691300")
private String username;
}

View File

@ -1,30 +0,0 @@
package cn.iocoder.mall.managementweb.controller.admin.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
import java.util.List;
@ApiModel("部门树节点 VO")
@Data
public class DepartmentTreeNodeVO {
@ApiModelProperty(value = "部门编号", required = true, example = "1")
private Integer id;
@ApiModelProperty(value = "部门名称", required = true, example = "技术部")
private String name;
@ApiModelProperty(value = "排序字段", required = true, example = "1024")
private Integer sort;
@ApiModelProperty(value = "父级部门编号", required = true, example = "2048")
private Integer pid;
@ApiModelProperty(value = "创建时间", required = true)
private Date createTime;
/**
* 子节点
*/
private List<DepartmentTreeNodeVO> children;
}

View File

@ -1,22 +0,0 @@
package cn.iocoder.mall.managementweb.controller.admin.vo;
import lombok.*;
import io.swagger.annotations.*;
import java.util.*;
@ApiModel("部门 VO")
@Data
public class DepartmentVO {
@ApiModelProperty(value = "部门编号", required = true, example = "1")
private Integer id;
@ApiModelProperty(value = "部门名称", required = true, example = "技术部")
private String name;
@ApiModelProperty(value = "排序字段", required = true, example = "1024")
private Integer sort;
@ApiModelProperty(value = "父级部门编号", required = true, example = "2048")
private Integer pid;
@ApiModelProperty(value = "创建时间", required = true)
private Date createTime;
}

View File

@ -1,88 +0,0 @@
package cn.iocoder.mall.managementweb.controller.datadict;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.managementweb.controller.datadict.dto.DataDictCreateDTO;
import cn.iocoder.mall.managementweb.controller.datadict.dto.DataDictUpdateDTO;
import cn.iocoder.mall.managementweb.controller.datadict.vo.DataDictSimpleVO;
import cn.iocoder.mall.managementweb.controller.datadict.vo.DataDictVO;
import cn.iocoder.mall.managementweb.manager.datadict.DataDictManager;
import cn.iocoder.security.annotations.RequiresPermissions;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.List;
import static cn.iocoder.common.framework.vo.CommonResult.success;
/**
* 数据字典 Controller
*/
@RestController
@RequestMapping("/data-dict")
@Api(tags = "数据字典")
@Validated
public class DataDictController {
@Autowired
private DataDictManager dataDictManager;
@PostMapping("/create")
@ApiOperation("创建数据字典")
@RequiresPermissions("system:data-dict:create")
public CommonResult<Integer> createDataDict(@Valid DataDictCreateDTO createDTO) {
return success(dataDictManager.createDataDict(createDTO));
}
@PostMapping("/update")
@ApiOperation("更新数据字典")
@RequiresPermissions("system:data-dict:update")
public CommonResult<Boolean> updateDataDict(@Valid DataDictUpdateDTO updateDTO) {
dataDictManager.updateDataDict(updateDTO);
return success(true);
}
@PostMapping("/delete")
@ApiOperation("删除数据字典")
@ApiImplicitParam(name = "dataDictId", value = "数据字典编号", required = true)
@RequiresPermissions("system:data-dict:delete")
public CommonResult<Boolean> deleteDataDict(@RequestParam("dataDictId") Integer dataDictId) {
dataDictManager.deleteDataDict(dataDictId);
return success(true);
}
@GetMapping("/get")
@ApiOperation("获得数据字典")
@ApiImplicitParam(name = "dataDictId", value = "数据字典编号", required = true)
@RequiresPermissions("system:data-dict:list")
public CommonResult<DataDictVO> getDataDict(@RequestParam("dataDictId") Integer dataDictId) {
return success(dataDictManager.getDataDict(dataDictId));
}
@GetMapping("/list")
@ApiOperation("获得数据字典列表")
@ApiImplicitParam(name = "dataDictIds", value = "数据字典编号列表", required = true)
@RequiresPermissions("system:data-dict:list")
public CommonResult<List<DataDictVO>> listDataDicts(@RequestParam("dataDictIds") List<Integer> dataDictIds) {
return success(dataDictManager.listDataDicts(dataDictIds));
}
@GetMapping("/list-all")
@ApiOperation("获得全部数据字典列表")
@RequiresPermissions("system:data-dict:list")
public CommonResult<List<DataDictVO>> listDataDicts() {
return success(dataDictManager.listDataDicts());
}
@GetMapping("/list-all-simple")
@ApiOperation(value = "获得全部数据字典列表", notes = "一般用于管理后台缓存数据字典在本地")
// 无需添加权限认证因为前端全局都需要
public CommonResult<List<DataDictSimpleVO>> listSimpleDataDicts() {
return success(dataDictManager.listSimpleDataDicts());
}
}

View File

@ -1,29 +0,0 @@
package cn.iocoder.mall.managementweb.controller.datadict.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
@ApiModel("数据字典创建 DTO")
@Data
public class DataDictCreateDTO {
@ApiModelProperty(value = "大类枚举值", required = true, example = "gender")
@NotEmpty(message = "大类枚举值不能为空")
private String enumValue;
@ApiModelProperty(value = "小类数值", required = true, example = "1")
@NotEmpty(message = "小类数值不能为空")
private String value;
@ApiModelProperty(value = "展示名", required = true, example = "")
@NotEmpty(message = "展示名不能为空")
private String displayName;
@ApiModelProperty(value = "排序值", required = true, example = "1")
@NotNull(message = "排序值不能为空")
private Integer sort;
@ApiModelProperty(value = "备注", example = "性别 - 男(嗨)")
private String memo;
}

View File

@ -1,32 +0,0 @@
package cn.iocoder.mall.managementweb.controller.datadict.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
@ApiModel("数据字典更新 DTO")
@Data
public class DataDictUpdateDTO {
@ApiModelProperty(value = "编号", required = true, example = "1024")
@NotNull(message = "编号不能为空")
private Integer id;
@ApiModelProperty(value = "大类枚举值", required = true, example = "gender")
@NotEmpty(message = "大类枚举值不能为空")
private String enumValue;
@ApiModelProperty(value = "小类数值", required = true, example = "1")
@NotEmpty(message = "小类数值不能为空")
private String value;
@ApiModelProperty(value = "展示名", required = true, example = "")
@NotEmpty(message = "展示名不能为空")
private String displayName;
@ApiModelProperty(value = "排序值", required = true, example = "1")
@NotNull(message = "排序值不能为空")
private Integer sort;
@ApiModelProperty(value = "备注", example = "性别 - 男(嗨)")
private String memo;
}

View File

@ -1,20 +0,0 @@
package cn.iocoder.mall.managementweb.controller.datadict.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
@ApiModel("数据字典精简 VO")
@Data
public class DataDictSimpleVO {
@ApiModelProperty(value = "大类枚举值", required = true, example = "gender")
private String enumValue;
@ApiModelProperty(value = "小类数值", required = true, example = "1")
private String value;
@ApiModelProperty(value = "展示名", required = true, example = "")
private String displayName;
}

View File

@ -1,34 +0,0 @@
package cn.iocoder.mall.managementweb.controller.datadict.vo;
import lombok.*;
import io.swagger.annotations.*;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.*;
@ApiModel("数据字典 VO")
@Data
public class DataDictVO {
@ApiModelProperty(value = "编号", required = true, example = "1024")
@NotNull(message = "编号不能为空")
private Integer id;
@ApiModelProperty(value = "大类枚举值", required = true, example = "gender")
@NotEmpty(message = "大类枚举值不能为空")
private String enumValue;
@ApiModelProperty(value = "小类数值", required = true, example = "1")
@NotEmpty(message = "小类数值不能为空")
private String value;
@ApiModelProperty(value = "展示名", required = true, example = "")
@NotEmpty(message = "展示名不能为空")
private String displayName;
@ApiModelProperty(value = "排序值", required = true, example = "1")
@NotNull(message = "排序值不能为空")
private Integer sort;
@ApiModelProperty(value = "备注", example = "性别 - 男(嗨)")
private String memo;
@ApiModelProperty(value = "创建时间", required = true)
private Date createTime;
}

View File

@ -1,73 +0,0 @@
package cn.iocoder.mall.managementweb.controller.errorcode;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.managementweb.controller.errorcode.dto.ErrorCodeCreateDTO;
import cn.iocoder.mall.managementweb.controller.errorcode.dto.ErrorCodePageDTO;
import cn.iocoder.mall.managementweb.controller.errorcode.dto.ErrorCodeUpdateDTO;
import cn.iocoder.mall.managementweb.controller.errorcode.vo.ErrorCodeVO;
import cn.iocoder.mall.managementweb.manager.errorcode.ErrorCodeManager;
import cn.iocoder.security.annotations.RequiresPermissions;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import static cn.iocoder.common.framework.vo.CommonResult.success;
/**
* 错误码 Controller
*/
@RestController
@RequestMapping("/error-code")
@Api(tags = "错误码")
@Validated
public class ErrorCodeController {
@Autowired
private ErrorCodeManager errorCodeManager;
@PostMapping("/create")
@ApiOperation("创建错误码")
@RequiresPermissions("system:error-code:create")
public CommonResult<Integer> createErrorCode(@Valid ErrorCodeCreateDTO createDTO) {
return success(errorCodeManager.createErrorCode(createDTO));
}
@PostMapping("/update")
@ApiOperation("更新错误码")
@RequiresPermissions("system:error-code:update")
public CommonResult<Boolean> updateErrorCode(@Valid ErrorCodeUpdateDTO updateDTO) {
errorCodeManager.updateErrorCode(updateDTO);
return success(true);
}
@PostMapping("/delete")
@ApiOperation("删除错误码")
@ApiImplicitParam(name = "errorCodeId", value = "错误码编号", required = true)
@RequiresPermissions("system:error-code:delete")
public CommonResult<Boolean> deleteErrorCode(@RequestParam("errorCodeId") Integer errorCodeId) {
errorCodeManager.deleteErrorCode(errorCodeId);
return success(true);
}
@GetMapping("/get")
@ApiOperation("获得错误码")
@ApiImplicitParam(name = "errorCodeId", value = "错误码编号", required = true)
@RequiresPermissions("system:error-code:page")
public CommonResult<ErrorCodeVO> getErrorCode(@RequestParam("errorCodeId") Integer errorCodeId) {
return success(errorCodeManager.getErrorCode(errorCodeId));
}
@GetMapping("/page")
@ApiOperation("获得错误码分页")
@RequiresPermissions("system:error-code:page")
public CommonResult<PageResult<ErrorCodeVO>> pageErrorCode(ErrorCodePageDTO pageDTO) {
return success(errorCodeManager.pageErrorCode(pageDTO));
}
}

View File

@ -1,26 +0,0 @@
package cn.iocoder.mall.managementweb.controller.errorcode.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
@ApiModel("错误码创建 DTO")
@Data
public class ErrorCodeCreateDTO {
@ApiModelProperty(value = "错误码编码", required = true, example = "10086")
@NotNull(message = "错误码编码不能为空")
private Integer code;
@ApiModelProperty(value = "错误码错误提示", required = true, example = "艿艿长的丑")
@NotEmpty(message = "错误码错误提示不能为空")
private String message;
@ApiModelProperty(value = "错误码分组", required = true, example = "user-service")
@NotEmpty(message = "错误码分组不能为空")
private String group;
@ApiModelProperty(value = "错误码备注", example = "我就是一个备注")
private String memo;
}

View File

@ -1,21 +0,0 @@
package cn.iocoder.mall.managementweb.controller.errorcode.dto;
import cn.iocoder.common.framework.vo.PageParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ApiModel("错误码分页 DTO")
@Data
@EqualsAndHashCode(callSuper = true)
public class ErrorCodePageDTO extends PageParam {
@ApiModelProperty(value = "错误码编码", required = true)
private Integer code;
@ApiModelProperty(value = "错误码错误提示", required = true)
private String message;
@ApiModelProperty(value = "错误码分组", required = true)
private String group;
}

View File

@ -1,29 +0,0 @@
package cn.iocoder.mall.managementweb.controller.errorcode.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
@ApiModel("错误码更新 DTO")
@Data
public class ErrorCodeUpdateDTO {
@ApiModelProperty(value = "错误码编号", required = true, example = "1")
@NotNull(message = "错误码编号不能为空")
private Integer id;
@ApiModelProperty(value = "错误码编码", required = true, example = "10086")
@NotNull(message = "错误码编码不能为空")
private Integer code;
@ApiModelProperty(value = "错误码错误提示", required = true, example = "艿艿长的丑")
@NotEmpty(message = "错误码错误提示不能为空")
private String message;
@ApiModelProperty(value = "错误码分组", required = true, example = "user-service")
@NotEmpty(message = "错误码分组不能为空")
private String group;
@ApiModelProperty(value = "错误码备注", example = "我就是一个备注")
private String memo;
}

View File

@ -1,28 +0,0 @@
package cn.iocoder.mall.managementweb.controller.errorcode.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
@ApiModel("错误码 VO")
@Data
public class ErrorCodeVO {
@ApiModelProperty(value = "错误码编号", required = true, example = "1")
private Integer id;
@ApiModelProperty(value = "错误码编码", required = true, example = "10086")
private Integer code;
@ApiModelProperty(value = "错误码错误提示", required = true, example = "艿艿长的丑")
private String message;
@ApiModelProperty(value = "错误码类型", required = true, notes = "见 ErrorCodeTypeEnum 枚举", example = "1")
private Integer type;
@ApiModelProperty(value = "错误码分组", required = true, example = "user-service")
private String group;
@ApiModelProperty(value = "错误码备注", example = "我就是一个备注")
private String memo;
@ApiModelProperty(value = "创建时间", required = true)
private Date createTime;
}

View File

@ -1,34 +0,0 @@
### /passport/login 成功
POST http://127.0.0.1:18083/management-api/passport/login
Content-Type: application/x-www-form-urlencoded
username=admin&password=buzhidao
### /passport/login 密码不正确
POST http://127.0.0.1:18083/management-api/passport/login
Content-Type: application/x-www-form-urlencoded
username=admin&password=1024
### /passport/login 少传参数
POST http://127.0.0.1:18083/management-api/passport/login
Content-Type: application/x-www-form-urlencoded
username=admin
### /passport/info 成功
GET http://127.0.0.1:18083/management-api/passport/info
Authorization: Bearer yudaoyuanma
### /passport/tree-admin-menu 成功
GET http://127.0.0.1:18083/management-api/passport/tree-admin-menu
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer yudaoyuanma
### /passport/list-admin-permission 成功
GET http://127.0.0.1:18083/management-api/passport/list-admin-permission
Content-Type: application/x-www-form-urlencoded
#Authorization: Bearer yudaoyuanma
Authorization: Bearer 36dce986276b4d6c8f9f4f3b89b22810
###

View File

@ -1,67 +0,0 @@
package cn.iocoder.mall.managementweb.controller.passport;
import cn.iocoder.common.framework.util.HttpUtil;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.managementweb.controller.passport.dto.PassportLoginDTO;
import cn.iocoder.mall.managementweb.controller.passport.vo.PassportAccessTokenVO;
import cn.iocoder.mall.managementweb.controller.passport.vo.PassportAdminMenuTreeNodeVO;
import cn.iocoder.mall.managementweb.controller.passport.vo.PassportAdminVO;
import cn.iocoder.mall.managementweb.manager.passport.PassportManager;
import cn.iocoder.mall.security.admin.core.context.AdminSecurityContextHolder;
import cn.iocoder.security.annotations.RequiresNone;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
import java.util.Set;
import static cn.iocoder.common.framework.vo.CommonResult.success;
@Api(tags = "管理员 Passport API")
@RestController
@RequestMapping("/passport")
public class PassportController {
@Autowired
private PassportManager passportManager;
@PostMapping("/login")
@ApiOperation("账号密码登陆")
@RequiresNone
public CommonResult<PassportAccessTokenVO> login(PassportLoginDTO loginDTO,
HttpServletRequest request) {
return success(passportManager.login(loginDTO, HttpUtil.getIp(request)));
}
@GetMapping("/info")
@ApiOperation(value = "获得当前管理员信息")
public CommonResult<PassportAdminVO> getInfo() {
return success(passportManager.getAdmin(AdminSecurityContextHolder.getAdminId()));
}
@PostMapping("/refresh-token")
@ApiOperation("刷新令牌")
@RequiresNone
public CommonResult<PassportAccessTokenVO> refreshToken(@RequestParam("refreshToken") String refreshToken,
HttpServletRequest request) {
return success(passportManager.refreshToken(refreshToken, HttpUtil.getIp(request)));
}
// TODO 优化点迁移到 PermissionController
@GetMapping("/tree-admin-menu")
@ApiOperation("获得当前管理员的菜单树")
public CommonResult<List<PassportAdminMenuTreeNodeVO>> treeAdminMenu() {
return success(passportManager.treeAdminMenu(AdminSecurityContextHolder.getAdminId()));
}
// TODO 优化点迁移到 PermissionController
@GetMapping("/list-admin-permission")
@ApiOperation("获得当前管理员的权限列表")
public CommonResult<Set<String>> listAdminPermission() {
return success(passportManager.listAdminPermission(AdminSecurityContextHolder.getAdminId()));
}
}

View File

@ -1,29 +0,0 @@
package cn.iocoder.mall.managementweb.controller.passport.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Pattern;
import java.io.Serializable;
@ApiModel("管理登录 DTO")
@Data
@Accessors(chain = true)
public class PassportLoginDTO implements Serializable {
@ApiModelProperty(value = "用户名", required = true, example = "yudaoyuanma")
@NotEmpty(message = "登陆账号不能为空")
@Length(min = 5, max = 16, message = "账号长度为 5-16 位")
@Pattern(regexp = "^[A-Za-z0-9]+$", message = "账号格式为数字以及字母")
private String username;
@ApiModelProperty(value = "密码", required = true, example = "buzhidao")
@NotEmpty(message = "密码不能为空")
@Length(min = 4, max = 16, message = "密码长度为 4-16 位")
private String password;
}

View File

@ -1,22 +0,0 @@
package cn.iocoder.mall.managementweb.controller.passport.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.Date;
@ApiModel("访问令牌信息 VO")
@Data
@Accessors(chain = true)
public class PassportAccessTokenVO {
@ApiModelProperty(value = "访问令牌", required = true, example = "001e8f49b20e47f7b3a2de774497cd50")
private String accessToken;
@ApiModelProperty(value = "刷新令牌", required = true, example = "001e8f49b20e47f7b3a2de774497cd50")
private String refreshToken;
@ApiModelProperty(value = "过期时间", required = true)
private Date expiresTime;
}

View File

@ -1,33 +0,0 @@
package cn.iocoder.mall.managementweb.controller.passport.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
@ApiModel(value = "管理员拥有的菜单树", description = "一般用于首页菜单")
@Data
@Accessors(chain = true)
public class PassportAdminMenuTreeNodeVO {
@ApiModelProperty(value = "菜单编号", required = true, example = "1")
private Integer id;
@ApiModelProperty(value = "菜单名", required = true, example = "商品管理")
private String name;
@ApiModelProperty(value = "前端路由", required = true, example = "/order/list")
private String route;
@ApiModelProperty(value = "菜单图标", required = true, example = "user")
private String icon;
@ApiModelProperty(value = "前端界面", example = "@/views/example/edit")
private String view;
@ApiModelProperty(value = "父级资源编号", required = true, example = "1", notes = "如果无父资源,则值为 0")
private Integer pid;
/**
* 子节点数组
*/
private List<PassportAdminMenuTreeNodeVO> children;
}

View File

@ -1,18 +0,0 @@
package cn.iocoder.mall.managementweb.controller.passport.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
@ApiModel("管理员信息 VO")
@Data
@Accessors(chain = true)
public class PassportAdminVO {
@ApiModelProperty(value = "真实名字", required = true, example = "小王")
private String name;
@ApiModelProperty(value = "头像", required = true, example = "http://www.iocoder.cn/xxx.jpg")
private String avatar;
}

View File

@ -1,7 +0,0 @@
### /product-spu/page 成功(全部)
GET http://127.0.0.1:18083/management-api/pay/transaction/page?pageNo=1&pageSize=10
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer yudaoyuanma
dubbo-tag: {{dubboTag}}
###

View File

@ -1,38 +0,0 @@
package cn.iocoder.mall.managementweb.controller.pay;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.managementweb.controller.pay.vo.transaction.PayTransactionPageReqVO;
import cn.iocoder.mall.managementweb.controller.pay.vo.transaction.PayTransactionRespVO;
import cn.iocoder.mall.managementweb.service.pay.transaction.PayTransactionService;
import cn.iocoder.security.annotations.RequiresPermissions;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import static cn.iocoder.common.framework.vo.CommonResult.success;
@Api("支付交易单 API")
@RestController
@RequestMapping("/pay/transaction")
@Validated
@Slf4j
public class PayTransactionController {
@Autowired
private PayTransactionService payTransactionService;
@GetMapping("/page")
@RequiresPermissions("pay:transaction:page")
@ApiOperation("获得交易支付单分页")
public CommonResult<PageResult<PayTransactionRespVO>> pagePayTransaction(PayTransactionPageReqVO pageReqVO) {
// 执行查询
return success(payTransactionService.pagePayTransaction(pageReqVO));
}
}

View File

@ -1,44 +0,0 @@
package cn.iocoder.mall.managementweb.controller.pay.vo.transaction;
import cn.iocoder.common.framework.vo.PageParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
@ApiModel("支付交易分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
public class PayTransactionPageReqVO extends PageParam {
@ApiModelProperty(value = "创建时间(开始)", example = "2019-10-10 11:12:13")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createBeginTime;
@ApiModelProperty(value = "创建时间(结束)", example = "2019-10-10 11:12:13")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createEndTime;
@ApiModelProperty(value = "创建时间()", example = "2019-10-10 11:12:13")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date paymentBeginTime;
@ApiModelProperty(value = "创建时间()", example = "2019-10-10 11:12:13")
private Date paymentEndTime;
@ApiModelProperty(value = "支付状态", example = "1", notes = "参见 PayTransactionStatusEnum 枚举")
private Integer status;
@ApiModelProperty(value = "是否退款", example = "true")
private Boolean hasRefund;
@ApiModelProperty(value = "支付渠道", example = "1", notes = "参见 PayChannelEnum 枚举")
private Integer payChannel;
@ApiModelProperty(value = "商品标题", example = "芋头")
private String orderSubject;
}

View File

@ -1,74 +0,0 @@
package cn.iocoder.mall.managementweb.controller.pay.vo.transaction;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.Date;
@ApiModel("支付交易单 Response VO")
@Data
@Accessors(chain = true)
public class PayTransactionRespVO {
@ApiModelProperty(value = "交易编号", required = true, example = "POd4RC6a")
private Integer id;
@ApiModelProperty(value = "用户编号", required = true, example = "1024")
private Integer userId;
@ApiModelProperty(value = "应用编号", required = true, example = "POd4RC6a")
private String appId;
@ApiModelProperty(value = "发起交易的 IP", required = true, example = "192.168.10.1")
private String createIp;
@ApiModelProperty(value = "订单号不能为空", required = true, example = "1024")
private String orderId;
@ApiModelProperty(value = "商品名", required = true, example = "芋道源码")
private String orderSubject;
@ApiModelProperty(value = "订单商品描述", required = true, example = "绵啾啾的")
private String orderDescription;
@ApiModelProperty(value = "订单商品备注", example = "绵啾啾的")
private String orderMemo;
@ApiModelProperty(value = "支付金额,单位:分。", required = true, example = "10")
private Integer price;
@ApiModelProperty(value = "订单状态", required = true, example = "1", notes = "参见 PayTransactionStatusEnum 枚举")
private Integer status;
@ApiModelProperty(value = "交易过期时间", required = true)
private Date expireTime;
@ApiModelProperty(value = "回调业务线完成时间")
private Date finishTime;
@ApiModelProperty(value = "成功支付的交易拓展编号", example = "1024")
private Integer extensionId;
@ApiModelProperty(value = "支付成功的支付渠道", example = "1", notes = "参见 PayChannelEnum 枚举")
private Integer payChannel;
@ApiModelProperty(value = "第三方支付成功的时间")
private Date paymentTime;
@ApiModelProperty(value = "收到第三方系统通知的时间")
private Date notifyTime;
@ApiModelProperty(value = "第三方的流水号", example = "11122233344444")
private String tradeNo;
@ApiModelProperty(value = "添加时间", required = true)
private Date createTime;
// ========== 退款相关 ==========
@ApiModelProperty(value = "退款总金额,单位:分", example = "100")
private Integer refundTotal;
}

View File

@ -1,11 +0,0 @@
### /permission/list 成功
GET http://127.0.0.1:18083/management-api/permission/list-role-resource?roleId=1
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer yudaoyuanma
### /permission/list-admin-roles 成功
GET http://127.0.0.1:18083/management-api/permission/list-admin-roles?adminId=1
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer yudaoyuanma
###

View File

@ -1,66 +0,0 @@
package cn.iocoder.mall.managementweb.controller.permission;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.managementweb.controller.permission.dto.PermissionAssignAdminRoleDTO;
import cn.iocoder.mall.managementweb.controller.permission.dto.PermissionAssignRoleResourceDTO;
import cn.iocoder.mall.managementweb.manager.permission.PermissionManager;
import cn.iocoder.security.annotations.RequiresPermissions;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Set;
import static cn.iocoder.common.framework.vo.CommonResult.success;
/**
* 权限 Controller
*/
@RestController
@RequestMapping("/permission")
@Api(tags = "权限")
@Validated
public class PermissionController {
@Autowired
private PermissionManager permissionManager;
@GetMapping("/list-role-resources")
@ApiOperation("获得角色拥有的资源编号")
@ApiImplicitParam(name = "roleId", value = "角色编号", required = true)
@RequiresPermissions("system:permission:assign-role-resource")
public CommonResult<Set<Integer>> listRoleResources(Integer roleId) {
return success(permissionManager.listRoleResources(roleId));
}
@PostMapping("/assign-role-resource")
@ApiOperation("赋予角色资源")
@RequiresPermissions("system:permission:assign-role-resource")
public CommonResult<Boolean> assignRoleResource(PermissionAssignRoleResourceDTO assignRoleResourceDTO) {
permissionManager.assignRoleResource(assignRoleResourceDTO);
return success(true);
}
@GetMapping("/list-admin-roles")
@ApiOperation("获得管理员拥有的角色编号列表")
@RequiresPermissions("system:permission:assign-admin-role")
@ApiImplicitParam(name = "adminId", value = "管理员编号", required = true)
public CommonResult<Set<Integer>> listAdminRoles(Integer adminId) {
return success(permissionManager.listAdminRoles(adminId));
}
@PostMapping("/assign-admin-role")
@ApiOperation("赋予用户角色")
@RequiresPermissions("system:permission:assign-admin-role")
public CommonResult<Boolean> assignAdminRole(PermissionAssignAdminRoleDTO assignAdminRoleDTO) {
permissionManager.assignAdminRole(assignAdminRoleDTO);
return success(true);
}
}

View File

@ -1,37 +0,0 @@
### /resource/create 成功
POST http://127.0.0.1:18083/management-api/resource/create
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer yudaoyuanma
name=测试菜单&permission=resource:add&type=1&sort=1&pid=0&route=/resource/list&icon=test
### /admin/update 成功
POST http://127.0.0.1:18083/management-api/resource/update
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer yudaoyuanma
id=61&name=测试菜单2&permission=resource:add&type=1&sort=1&pid=0&route=/resource/list&icon=test
### /resource/delete 成功
POST http://127.0.0.1:18083/management-api/resource/delete
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer yudaoyuanma
resourceId=61
### /resource/get 成功
GET http://127.0.0.1:18083/management-api/resource/get?resourceId=61
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer yudaoyuanma
### /resource/list 成功
GET http://127.0.0.1:18083/management-api/resource/list?resourceIds=61,63
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer yudaoyuanma
### /resource/tree 成功
GET http://127.0.0.1:18083/management-api/resource/tree
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer yudaoyuanma
###

View File

@ -1,81 +0,0 @@
package cn.iocoder.mall.managementweb.controller.permission;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.managementweb.controller.permission.dto.ResourceCreateDTO;
import cn.iocoder.mall.managementweb.controller.permission.dto.ResourceUpdateDTO;
import cn.iocoder.mall.managementweb.controller.permission.vo.ResourceTreeNodeVO;
import cn.iocoder.mall.managementweb.controller.permission.vo.ResourceVO;
import cn.iocoder.mall.managementweb.manager.permission.ResourceManager;
import cn.iocoder.mall.security.admin.core.context.AdminSecurityContextHolder;
import cn.iocoder.security.annotations.RequiresPermissions;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.List;
import static cn.iocoder.common.framework.vo.CommonResult.success;
/**
* 资源 Controller
*/
@RestController
@RequestMapping("/resource")
@Api(tags = "资源")
@Validated
public class ResourceController {
@Autowired
private ResourceManager resourceManager;
@PostMapping("/create")
@ApiOperation("创建资源")
@RequiresPermissions("system:resource:create")
public CommonResult<Integer> createResource(@Valid ResourceCreateDTO createDTO) {
return success(resourceManager.createResource(createDTO, AdminSecurityContextHolder.getAdminId()));
}
@PostMapping("/update")
@ApiOperation("更新资源")
@RequiresPermissions("system:resource:update")
public CommonResult<Boolean> updateResource(@Valid ResourceUpdateDTO updateDTO) {
resourceManager.updateResource(updateDTO);
return success(true);
}
@PostMapping("/delete")
@ApiOperation("删除资源")
@ApiImplicitParam(name = "resourceId", value = "资源编号", required = true)
@RequiresPermissions("system:resource:delete")
public CommonResult<Boolean> deleteResource(@RequestParam("resourceId") Integer resourceId) {
resourceManager.deleteResource(resourceId);
return success(true);
}
@GetMapping("/get")
@ApiOperation("获得资源")
@RequiresPermissions("system:resource:tree")
public CommonResult<ResourceVO> getResource(@RequestParam("resourceId") Integer resourceId) {
return success(resourceManager.getResource(resourceId));
}
@GetMapping("/list")
@ApiOperation("获得资源列表")
@ApiImplicitParam(name = "resourceIds", value = "资源编号列表", required = true)
@RequiresPermissions("system:resource:tree")
public CommonResult<List<ResourceVO>> listResources(@RequestParam("resourceIds") List<Integer> resourceIds) {
return success(resourceManager.listResources(resourceIds));
}
@GetMapping("/tree")
@ApiOperation("获得资源树")
@RequiresPermissions("system:resource:tree")
public CommonResult<List<ResourceTreeNodeVO>> treeResource() {
return success(resourceManager.treeResource());
}
}

View File

@ -1,44 +0,0 @@
### /role/create 成功
POST http://127.0.0.1:18083/management-api/role/create
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer yudaoyuanma
#Authorization: Bearer 9d250d9b6c034a6c88bf4034cdf1d4cc
name=测试角色
### /role/update 成功
POST http://127.0.0.1:18083/management-api/role/update
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer yudaoyuanma
id=14&name=test
### /resource/delete 成功
POST http://127.0.0.1:18083/management-api/role/delete
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer yudaoyuanma
roleId=14
### /role/get 成功
GET http://127.0.0.1:18083/management-api/role/get?roleId=13
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer yudaoyuanma
### /role/list-all 成功
GET http://127.0.0.1:18083/management-api/role/list-all
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer yudaoyuanma
### /role/list 成功
GET http://127.0.0.1:18083/management-api/role/list?roleIds=1,13
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer yudaoyuanma
### /role/page 成功
GET http://127.0.0.1:18083/management-api/role/page?pageNo=1&pageSize=10
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer yudaoyuanma
###

View File

@ -1,90 +0,0 @@
package cn.iocoder.mall.managementweb.controller.permission;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.managementweb.controller.permission.dto.RoleCreateDTO;
import cn.iocoder.mall.managementweb.controller.permission.dto.RolePageDTO;
import cn.iocoder.mall.managementweb.controller.permission.dto.RoleUpdateDTO;
import cn.iocoder.mall.managementweb.controller.permission.vo.RoleVO;
import cn.iocoder.mall.managementweb.manager.permission.RoleManager;
import cn.iocoder.mall.security.admin.core.context.AdminSecurityContextHolder;
import cn.iocoder.security.annotations.RequiresPermissions;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.List;
import static cn.iocoder.common.framework.vo.CommonResult.success;
/**
* 角色 Controller
*/
@RestController
@RequestMapping("/role")
@Api(tags = "角色")
@Validated
public class RoleController {
@Autowired
private RoleManager roleManager;
@PostMapping("/create")
@ApiOperation("创建角色")
@RequiresPermissions("system:role:create")
public CommonResult<Integer> createRole(@Valid RoleCreateDTO createDTO) {
return success(roleManager.createRole(createDTO, AdminSecurityContextHolder.getAdminId()));
}
@PostMapping("/update")
@ApiOperation("更新角色")
@RequiresPermissions("system:role:update")
public CommonResult<Boolean> updateRole(@Valid RoleUpdateDTO updateDTO) {
roleManager.updateRole(updateDTO);
return success(true);
}
@PostMapping("/delete")
@ApiOperation("删除角色")
@ApiImplicitParam(name = "roleId", value = "角色编号", required = true)
@RequiresPermissions("system:role:delete")
public CommonResult<Boolean> deleteRole(@RequestParam("roleId") Integer roleId) {
roleManager.deleteRole(roleId);
return success(true);
}
@GetMapping("/get")
@ApiOperation("获得角色")
@ApiImplicitParam(name = "roleId", value = "角色编号", required = true)
@RequiresPermissions("system:admin:page")
public CommonResult<RoleVO> role(@RequestParam("roleId") Integer roleId) {
return success(roleManager.getRole(roleId));
}
@GetMapping("/list-all")
@ApiOperation("获得所有角色列表")
@RequiresPermissions("system:role:page")
public CommonResult<List<RoleVO>> listAllRoles() {
return success(roleManager.listAllRoles());
}
@GetMapping("/list")
@ApiOperation("获得角色列表")
@ApiImplicitParam(name = "roleIds", value = "角色编号列表", required = true)
@RequiresPermissions("system:role:page")
public CommonResult<List<RoleVO>> listRoles(@RequestParam("roleIds") List<Integer> roleIds) {
return success(roleManager.listRoles(roleIds));
}
@GetMapping("/page")
@ApiOperation("获得角色分页")
@RequiresPermissions("system:role:page")
public CommonResult<PageResult<RoleVO>> pageRole(RolePageDTO pageDTO) {
return success(roleManager.pageRole(pageDTO));
}
}

View File

@ -1,20 +0,0 @@
package cn.iocoder.mall.managementweb.controller.permission.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.Set;
@ApiModel("赋予用户角色 DTO")
@Data
public class PermissionAssignAdminRoleDTO {
@ApiModelProperty(value = "管理员编号", required = true, example = "1")
@NotNull(message = "管理员编号不能为空")
private Integer adminId;
@ApiModelProperty(value = "角色编号列表", example = "1,3,5")
private Set<Integer> roleIds;
}

View File

@ -1,20 +0,0 @@
package cn.iocoder.mall.managementweb.controller.permission.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.Set;
@ApiModel("赋予角色资源 DTO")
@Data
public class PermissionAssignRoleResourceDTO {
@ApiModelProperty(value = "角色名", required = true, example = "1")
@NotNull(message = "角色编号不能为空")
private Integer roleId;
@ApiModelProperty(value = "资源编号列表", example = "1,3,5")
private Set<Integer> resourceIds;
}

View File

@ -1,38 +0,0 @@
package cn.iocoder.mall.managementweb.controller.permission.dto;
import cn.iocoder.common.framework.validator.InEnum;
import cn.iocoder.mall.systemservice.enums.permission.ResourceTypeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
@ApiModel("资源创建 DTO")
@Data
public class ResourceCreateDTO {
@ApiModelProperty(value = "菜单名", required = true, example = "商品管理")
@NotEmpty(message = "菜单名不能为空")
private String name;
@ApiModelProperty(value = "权限标识", example = "resource:add")
private String permission;
@ApiModelProperty(value = "资源类型", required = true, example = "1")
@NotNull(message = "资源类型不能为空")
@InEnum(value = ResourceTypeEnum.class, message = "资源类型必须是 {value}")
private Integer type;
@ApiModelProperty(value = "排序", required = true, example = "1")
@NotNull(message = "排序不能为空")
private Integer sort;
@ApiModelProperty(value = "父级资源编号", required = true, example = "1", notes = "如果无父资源,则值为 0")
@NotNull(message = "父级资源编号不能为空")
private Integer pid;
@ApiModelProperty(value = "前端路由", example = "/resource/list")
private String route;
@ApiModelProperty(value = "菜单图标", example = "add")
private String icon;
@ApiModelProperty(value = "前端界面", example = "@/views/example/edit")
private String view;
}

View File

@ -1,41 +0,0 @@
package cn.iocoder.mall.managementweb.controller.permission.dto;
import cn.iocoder.common.framework.validator.InEnum;
import cn.iocoder.mall.systemservice.enums.permission.ResourceTypeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
@ApiModel("资源创建 DTO")
@Data
public class ResourceUpdateDTO {
@ApiModelProperty(value = "资源编号", required = true, example = "1")
@NotNull(message = "资源编号不能为空")
private Integer id;
@ApiModelProperty(value = "菜单名", required = true, example = "商品管理")
@NotEmpty(message = "菜单名不能为空")
private String name;
@ApiModelProperty(value = "权限标识", example = "resource:add")
private String permission;
@ApiModelProperty(value = "资源类型", required = true, example = "1")
@NotNull(message = "资源类型不能为空")
@InEnum(value = ResourceTypeEnum.class, message = "资源类型必须是 {value}")
private Integer type;
@ApiModelProperty(value = "排序", required = true, example = "1")
@NotNull(message = "排序不能为空")
private Integer sort;
@ApiModelProperty(value = "父级资源编号", required = true, example = "1", notes = "如果无父资源,则值为 0")
@NotNull(message = "父级资源编号不能为空")
private Integer pid;
@ApiModelProperty(value = "前端路由", example = "/resource/list")
private String route;
@ApiModelProperty(value = "菜单图标", example = "add")
private String icon;
@ApiModelProperty(value = "前端界面", example = "@/views/example/edit")
private String view;
}

View File

@ -1,19 +0,0 @@
package cn.iocoder.mall.managementweb.controller.permission.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
@ApiModel("角色创建 DTO")
@Data
public class RoleCreateDTO {
@ApiModelProperty(value = "角色名", required = true, example = "管理员")
@NotEmpty(message = "角色名不能为空")
private String name;
@ApiModelProperty(value = "角色编码", example = "ADMIN")
private String code;
}

View File

@ -1,15 +0,0 @@
package cn.iocoder.mall.managementweb.controller.permission.dto;
import cn.iocoder.common.framework.vo.PageParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ApiModel("角色分页 DTO")
@Data
public class RolePageDTO extends PageParam {
@ApiModelProperty(value = "角色名", example = "管理", notes = "模糊匹配")
private String name;
}

View File

@ -1,23 +0,0 @@
package cn.iocoder.mall.managementweb.controller.permission.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
@ApiModel("角色更新 DTO")
@Data
public class RoleUpdateDTO {
@ApiModelProperty(value = "角色编号", required = true, example = "1")
@NotNull(message = "角色编号不能为空")
private Integer id;
@ApiModelProperty(value = "角色名", required = true, example = "管理员")
@NotEmpty(message = "角色名不能为空")
private String name;
@ApiModelProperty(value = "角色编码", example = "ADMIN")
private String code;
}

View File

@ -1,50 +0,0 @@
package cn.iocoder.mall.managementweb.controller.permission.vo;
import cn.iocoder.common.framework.validator.InEnum;
import cn.iocoder.mall.systemservice.enums.permission.ResourceTypeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.Date;
import java.util.List;
@ApiModel("资源树节点 VO")
@Data
public class ResourceTreeNodeVO {
@ApiModelProperty(value = "资源编号", required = true, example = "1")
@NotNull(message = "资源编号不能为空")
private Integer id;
@ApiModelProperty(value = "菜单名", required = true, example = "商品管理")
@NotEmpty(message = "菜单名不能为空")
private String name;
@ApiModelProperty(value = "权限标识", example = "resource:add")
private String permission;
@ApiModelProperty(value = "资源类型", required = true, example = "1")
@NotNull(message = "资源类型不能为空")
@InEnum(value = ResourceTypeEnum.class, message = "资源类型必须是 {value}")
private Integer type;
@ApiModelProperty(value = "排序", required = true, example = "1")
@NotNull(message = "排序不能为空")
private Integer sort;
@ApiModelProperty(value = "父级资源编号", required = true, example = "1", notes = "如果无父资源,则值为 0")
@NotNull(message = "父级资源编号不能为空")
private Integer pid;
@ApiModelProperty(value = "前端路由", example = "/resource/list")
private String route;
@ApiModelProperty(value = "菜单图标", example = "add")
private String icon;
@ApiModelProperty(value = "前端界面", example = "@/views/example/edit")
private String view;
@ApiModelProperty(value = "添加时间", required = true)
private Date createTime;
/**
* 子节点
*/
private List<ResourceTreeNodeVO> children;
}

View File

@ -1,43 +0,0 @@
package cn.iocoder.mall.managementweb.controller.permission.vo;
import cn.iocoder.common.framework.validator.InEnum;
import cn.iocoder.mall.systemservice.enums.permission.ResourceTypeEnum;
import lombok.*;
import io.swagger.annotations.*;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.*;
@ApiModel("资源 VO")
@Data
public class ResourceVO {
@ApiModelProperty(value = "资源编号", required = true, example = "1")
@NotNull(message = "资源编号不能为空")
private Integer id;
@ApiModelProperty(value = "菜单名", required = true, example = "商品管理")
@NotEmpty(message = "菜单名不能为空")
private String name;
@ApiModelProperty(value = "权限标识", example = "resource:add")
private String permission;
@ApiModelProperty(value = "资源类型", required = true, example = "1")
@NotNull(message = "资源类型不能为空")
@InEnum(value = ResourceTypeEnum.class, message = "资源类型必须是 {value}")
private Integer type;
@ApiModelProperty(value = "排序", required = true, example = "1")
@NotNull(message = "排序不能为空")
private Integer sort;
@ApiModelProperty(value = "父级资源编号", required = true, example = "1", notes = "如果无父资源,则值为 0")
@NotNull(message = "父级资源编号不能为空")
private Integer pid;
@ApiModelProperty(value = "前端路由", example = "/resource/list")
private String route;
@ApiModelProperty(value = "菜单图标", example = "add")
private String icon;
@ApiModelProperty(value = "前端界面", example = "@/views/example/edit")
private String view;
@ApiModelProperty(value = "添加时间", required = true)
private Date createTime;
}

View File

@ -1,26 +0,0 @@
package cn.iocoder.mall.managementweb.controller.permission.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
@ApiModel("角色 VO")
@Data
public class RoleVO {
@ApiModelProperty(value = "角色编号", required = true, example = "1")
private Integer id;
@ApiModelProperty(value = "角色名", required = true, example = "管理员")
private String name;
@ApiModelProperty(value = "角色编码", example = "ADMIN")
private String code;
@ApiModelProperty(value = "角色类型", required = true, example = "1", notes = "见 RoleTypeEnum 枚举")
private Integer type;
@ApiModelProperty(value = "创建管理员编号", required = true, example = "1")
private Integer createAdminId;
@ApiModelProperty(value = "创建时间", required = true)
private Date createTime;
}

View File

@ -1,7 +0,0 @@
### /system-access-log/page 成功
GET http://127.0.0.1:18083/management-api/system-access-log/page?pageNo=1&pageSize=10
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer yudaoyuanma
###

View File

@ -1,38 +0,0 @@
package cn.iocoder.mall.managementweb.controller.systemlog;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.managementweb.controller.systemlog.dto.SystemAccessLogPageDTO;
import cn.iocoder.mall.managementweb.controller.systemlog.vo.SystemAccessLogVO;
import cn.iocoder.mall.managementweb.manager.systemlog.SystemAccessLogManager;
import cn.iocoder.security.annotations.RequiresPermissions;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import static cn.iocoder.common.framework.vo.CommonResult.success;
/**
* 系统访问日志 Controller
*/
@RestController
@RequestMapping("/system-access-log")
@Api(tags = "系统访问日志")
@Validated
public class SystemAccessLogController {
@Autowired
private SystemAccessLogManager systemAccessLogManager;
@GetMapping("/page")
@ApiOperation("获得系统访问日志分页")
@RequiresPermissions("system:system-access-log:page")
public CommonResult<PageResult<SystemAccessLogVO>> pageSystemAccessLog(SystemAccessLogPageDTO pageDTO) {
return success(systemAccessLogManager.pageSystemAccessLog(pageDTO));
}
}

View File

@ -1,56 +0,0 @@
package cn.iocoder.mall.managementweb.controller.systemlog;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.managementweb.controller.systemlog.dto.SystemExceptionLogPageDTO;
import cn.iocoder.mall.managementweb.controller.systemlog.dto.SystemExceptionLogProcessDTO;
import cn.iocoder.mall.managementweb.controller.systemlog.vo.SystemExceptionLogDetailVO;
import cn.iocoder.mall.managementweb.controller.systemlog.vo.SystemExceptionLogVO;
import cn.iocoder.mall.managementweb.manager.systemlog.SystemExceptionLogManager;
import cn.iocoder.mall.security.admin.core.context.AdminSecurityContextHolder;
import cn.iocoder.security.annotations.RequiresPermissions;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import static cn.iocoder.common.framework.vo.CommonResult.success;
/**
* 系统异常日志 Controller
*/
@RestController
@RequestMapping("/system-exception-log")
@Api(tags = "系统异常日志")
@Validated
public class SystemExceptionLogController {
@Autowired
private SystemExceptionLogManager systemExceptionLogManager;
@GetMapping("/get")
@ApiOperation("获得系统异常日志明细")
@ApiImplicitParam(name = "logId", value = "系统异常日志编号", required = true)
@RequiresPermissions("system:system-exception-log:page")
public CommonResult<SystemExceptionLogDetailVO> getSystemExceptionLogDetail(@RequestParam("logId") Integer logId) {
return success(systemExceptionLogManager.getSystemExceptionLogDetail(logId));
}
@GetMapping("/page")
@ApiOperation("获得系统异常日志分页")
@RequiresPermissions("system:system-exception-log:page")
public CommonResult<PageResult<SystemExceptionLogVO>> pageSystemExceptionLog(SystemExceptionLogPageDTO pageDTO) {
return success(systemExceptionLogManager.pageSystemExceptionLog(pageDTO));
}
@PostMapping("/process")
@ApiOperation("处理系统异常日志")
@RequiresPermissions("system:system-exception-log:process")
public CommonResult<Boolean> processSystemExceptionLog(SystemExceptionLogProcessDTO processDTO) {
systemExceptionLogManager.processSystemExceptionLog(AdminSecurityContextHolder.getAdminId(), processDTO);
return CommonResult.success(true);
}
}

View File

@ -1,19 +0,0 @@
package cn.iocoder.mall.managementweb.controller.systemlog.dto;
import cn.iocoder.common.framework.vo.PageParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ApiModel("系统访问日志分页 DTO")
@Data
public class SystemAccessLogPageDTO extends PageParam {
@ApiModelProperty(value = "用户编号", example = "1")
private Integer userId;
@ApiModelProperty(value = "用户类型", example = "2")
private Integer userType;
@ApiModelProperty(value = "应用名", example = "xxx-service-application")
private String applicationName;
}

View File

@ -1,21 +0,0 @@
package cn.iocoder.mall.managementweb.controller.systemlog.dto;
import cn.iocoder.common.framework.vo.PageParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ApiModel("系统异常日志分页 DTO")
@Data
public class SystemExceptionLogPageDTO extends PageParam {
@ApiModelProperty(value = "用户编号", example = "1")
private Integer userId;
@ApiModelProperty(value = "用户类型", example = "2")
private Integer userType;
@ApiModelProperty(value = "应用名", example = "xxx-service-application")
private String applicationName;
@ApiModelProperty(value = "处理状态", notes = "对应 SystemExceptionLogProcessStatusEnum 枚举类", example = "1")
private Integer processStatus;
}

View File

@ -1,19 +0,0 @@
package cn.iocoder.mall.managementweb.controller.systemlog.dto;
import cn.iocoder.common.framework.vo.PageParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ApiModel("系统异常日志处理 DTO")
@Data
@EqualsAndHashCode(callSuper = true)
public class SystemExceptionLogProcessDTO extends PageParam {
@ApiModelProperty(value = "系统异常日志编号", required = true, example = "1")
private Integer logId;
@ApiModelProperty(value = "处理状态", required = true, notes = "对应 SystemExceptionLogProcessStatusEnum 枚举类", example = "1")
private Integer processStatus;
}

View File

@ -1,40 +0,0 @@
package cn.iocoder.mall.managementweb.controller.systemlog.vo;
import lombok.*;
import io.swagger.annotations.*;
import java.util.*;
@ApiModel("系统访问日志 VO")
@Data
public class SystemAccessLogVO {
@ApiModelProperty(value = "编号", required = true, example = "1")
private Integer id;
@ApiModelProperty(value = "用户编号", example = "1024")
private Integer userId;
@ApiModelProperty(value = "用户类型", example = "1")
private Integer userType;
@ApiModelProperty(value = "链路追踪编号", example = "89aca178-a370-411c-ae02-3f0d672be4ab")
private String traceId;
@ApiModelProperty(value = "应用名", required = true, example = "user-shop-application")
private String applicationName;
@ApiModelProperty(value = "访问地址", required = true, example = "/management-api/system-access-log/page")
private String uri;
@ApiModelProperty(value = "参数", required = true, example = "pageNo=1&pageSize=10")
private String queryString;
@ApiModelProperty(value = "http 方法", required = true, example = "GET")
private String method;
@ApiModelProperty(value = "userAgent", required = true, example = "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0")
private String userAgent;
@ApiModelProperty(value = "ip", required = true, example = "127.0.0.1")
private String ip;
@ApiModelProperty(value = "请求时间", required = true)
private Date startTime;
@ApiModelProperty(value = "响应时长 -- 毫秒级", required = true, example = "1024")
private Integer responseTime;
@ApiModelProperty(value = "错误码", required = true, example = "0")
private Integer errorCode;
@ApiModelProperty(value = "错误提示", example = "你的昵称过长~")
private String errorMessage;
}

View File

@ -1,76 +0,0 @@
package cn.iocoder.mall.managementweb.controller.systemlog.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.Date;
@ApiModel("系统异常日志明细 DTO")
@Data
public class SystemExceptionLogDetailVO {
@ApiModel("管理员")
@Data
@Accessors(chain = true)
public static class Admin {
@ApiModelProperty(value = "管理员编号", required = true, example = "1")
private Integer id;
@ApiModelProperty(value = "真实名字", required = true, example = "小王")
private String name;
}
@ApiModelProperty(value = "编号", required = true, example = "1")
private Integer id;
@ApiModelProperty(value = "用户编号", example = "1024")
private Integer userId;
@ApiModelProperty(value = "用户类型", example = "1")
private Integer userType;
@ApiModelProperty(value = "链路追踪编号", example = "89aca178-a370-411c-ae02-3f0d672be4ab")
private String traceId;
@ApiModelProperty(value = "应用名", required = true, example = "user-shop-application")
private String applicationName;
@ApiModelProperty(value = "访问地址", required = true, example = "/management-api/system-access-log/page")
private String uri;
@ApiModelProperty(value = "参数", required = true, example = "pageNo=1&pageSize=10")
private String queryString;
@ApiModelProperty(value = "http 方法", required = true, example = "GET")
private String method;
@ApiModelProperty(value = "userAgent", required = true, example = "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0")
private String userAgent;
@ApiModelProperty(value = "ip", required = true, example = "127.0.0.1")
private String ip;
@ApiModelProperty(value = "异常发生时间", required = true)
private Date exceptionTime;
@ApiModelProperty(value = "异常名, {@link Throwable#getClass()} 的类全名", required = true)
private String exceptionName;
@ApiModelProperty(value = "异常导致的消息, {@link cn.iocoder.common.framework.util.ExceptionUtil#getMessage(Throwable)}", required = true)
private String exceptionMessage;
@ApiModelProperty(value = "异常导致的根消息, {@link cn.iocoder.common.framework.util.ExceptionUtil#getRootCauseMessage(Throwable)}", required = true)
private String exceptionRootCauseMessage;
@ApiModelProperty(value = "异常的栈轨迹, {@link cn.iocoder.common.framework.util.ExceptionUtil#getServiceException(Exception)}", required = true)
private String exceptionStackTrace;
@ApiModelProperty(value = "异常发生的类全名, {@link StackTraceElement#getClassName()}", required = true)
private String exceptionClassName;
@ApiModelProperty(value = "异常发生的类文件, {@link StackTraceElement#getFileName()}", required = true)
private String exceptionFileName;
@ApiModelProperty(value = "异常发生的方法名, {@link StackTraceElement#getMethodName()}", required = true)
private String exceptionMethodName;
@ApiModelProperty(value = "异常发生的方法所在行, {@link StackTraceElement#getLineNumber()}", required = true)
private Integer exceptionLineNumber;
@ApiModelProperty(value = "处理状态", required = true, notes = "对应 SystemExceptionLogProcessStatusEnum 枚举类", example = "1")
private Integer processStatus;
@ApiModelProperty(value = "处理时间")
private Date processTime;
@ApiModelProperty(value = "创建时间", required = true)
private Date createTime;
/**
* 处理的管理员信息
*/
private Admin processAdmin;
}

View File

@ -1,58 +0,0 @@
package cn.iocoder.mall.managementweb.controller.systemlog.vo;
import lombok.*;
import io.swagger.annotations.*;
import java.util.*;
@ApiModel("系统异常日志 VO")
@Data
public class SystemExceptionLogVO {
@ApiModelProperty(value = "编号", required = true, example = "1")
private Integer id;
@ApiModelProperty(value = "用户编号", example = "1024")
private Integer userId;
@ApiModelProperty(value = "用户类型", example = "1")
private Integer userType;
@ApiModelProperty(value = "链路追踪编号", example = "89aca178-a370-411c-ae02-3f0d672be4ab")
private String traceId;
@ApiModelProperty(value = "应用名", required = true, example = "user-shop-application")
private String applicationName;
@ApiModelProperty(value = "访问地址", required = true, example = "/management-api/system-access-log/page")
private String uri;
@ApiModelProperty(value = "参数", required = true, example = "pageNo=1&pageSize=10")
private String queryString;
@ApiModelProperty(value = "http 方法", required = true, example = "GET")
private String method;
@ApiModelProperty(value = "userAgent", required = true, example = "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0")
private String userAgent;
@ApiModelProperty(value = "ip", required = true, example = "127.0.0.1")
private String ip;
@ApiModelProperty(value = "异常发生时间", required = true)
private Date exceptionTime;
@ApiModelProperty(value = "异常名, {@link Throwable#getClass()} 的类全名", required = true)
private String exceptionName;
@ApiModelProperty(value = "异常导致的消息, {@link cn.iocoder.common.framework.util.ExceptionUtil#getMessage(Throwable)}", required = true)
private String exceptionMessage;
@ApiModelProperty(value = "异常导致的根消息, {@link cn.iocoder.common.framework.util.ExceptionUtil#getRootCauseMessage(Throwable)}", required = true)
private String exceptionRootCauseMessage;
@ApiModelProperty(value = "异常的栈轨迹, {@link cn.iocoder.common.framework.util.ExceptionUtil#getServiceException(Exception)}", required = true)
private String exceptionStackTrace;
@ApiModelProperty(value = "异常发生的类全名, {@link StackTraceElement#getClassName()}", required = true)
private String exceptionClassName;
@ApiModelProperty(value = "异常发生的类文件, {@link StackTraceElement#getFileName()}", required = true)
private String exceptionFileName;
@ApiModelProperty(value = "异常发生的方法名, {@link StackTraceElement#getMethodName()}", required = true)
private String exceptionMethodName;
@ApiModelProperty(value = "异常发生的方法所在行, {@link StackTraceElement#getLineNumber()}", required = true)
private Integer exceptionLineNumber;
@ApiModelProperty(value = "处理状态", required = true, notes = "对应 SystemExceptionLogProcessStatusEnum 枚举类", example = "1")
private Integer processStatus;
@ApiModelProperty(value = "处理时间")
private Date processTime;
@ApiModelProperty(value = "处理管理员编号", example = "1024")
private Integer processAdminId;
@ApiModelProperty(value = "创建时间", required = true)
private Date createTime;
}

View File

@ -1,41 +0,0 @@
package cn.iocoder.mall.managementweb.convert.admin;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.managementweb.controller.admin.dto.AdminUpdateInfoDTO;
import cn.iocoder.mall.managementweb.controller.admin.dto.AdminUpdateStatusDTO;
import cn.iocoder.mall.managementweb.controller.admin.vo.AdminPageItemVO;
import cn.iocoder.mall.systemservice.rpc.admin.dto.AdminCreateDTO;
import cn.iocoder.mall.systemservice.rpc.admin.dto.AdminPageDTO;
import cn.iocoder.mall.systemservice.rpc.admin.dto.AdminUpdateDTO;
import cn.iocoder.mall.systemservice.rpc.admin.vo.AdminVO;
import cn.iocoder.mall.systemservice.rpc.admin.vo.DepartmentVO;
import cn.iocoder.mall.systemservice.rpc.permission.vo.RoleVO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper
public interface AdminConvert {
AdminConvert INSTANCE = Mappers.getMapper(AdminConvert.class);
AdminCreateDTO convert(cn.iocoder.mall.managementweb.controller.admin.dto.AdminCreateDTO bean);
AdminUpdateDTO convert(AdminUpdateInfoDTO bean);
@Mapping(source = "adminId", target = "id")
AdminUpdateDTO convert(AdminUpdateStatusDTO bean);
AdminPageDTO convert(cn.iocoder.mall.managementweb.controller.admin.dto.AdminPageDTO bean);
PageResult<AdminPageItemVO> convert(PageResult<AdminVO> pageResultData);
cn.iocoder.mall.managementweb.controller.admin.vo.AdminVO convert(AdminVO bean);
AdminPageItemVO convert02(AdminVO adminVO);
AdminPageItemVO.Department convert(DepartmentVO bean);
List<AdminPageItemVO.Role> convertList(List<RoleVO> list);
}

View File

@ -1,27 +0,0 @@
package cn.iocoder.mall.managementweb.convert.admin;
import cn.iocoder.mall.managementweb.controller.admin.vo.DepartmentTreeNodeVO;
import cn.iocoder.mall.managementweb.controller.admin.vo.DepartmentVO;
import cn.iocoder.mall.systemservice.rpc.admin.dto.DepartmentCreateDTO;
import cn.iocoder.mall.systemservice.rpc.admin.dto.DepartmentUpdateDTO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper
public interface DepartmentConvert {
DepartmentConvert INSTANCE = Mappers.getMapper(DepartmentConvert.class);
DepartmentCreateDTO convert(cn.iocoder.mall.managementweb.controller.admin.dto.DepartmentCreateDTO bean);
DepartmentUpdateDTO convert(cn.iocoder.mall.managementweb.controller.admin.dto.DepartmentUpdateDTO bean);
List<DepartmentVO> convertList(List<cn.iocoder.mall.systemservice.rpc.admin.vo.DepartmentVO> list);
DepartmentVO convert(cn.iocoder.mall.systemservice.rpc.admin.vo.DepartmentVO bean);
DepartmentTreeNodeVO convertTreeNode(cn.iocoder.mall.systemservice.rpc.admin.vo.DepartmentVO bean);
}

View File

@ -1,27 +0,0 @@
package cn.iocoder.mall.managementweb.convert.datadict;
import cn.iocoder.mall.managementweb.controller.datadict.vo.DataDictSimpleVO;
import cn.iocoder.mall.managementweb.controller.datadict.vo.DataDictVO;
import cn.iocoder.mall.systemservice.rpc.datadict.dto.DataDictCreateDTO;
import cn.iocoder.mall.systemservice.rpc.datadict.dto.DataDictUpdateDTO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper
public interface DataDictConvert {
DataDictConvert INSTANCE = Mappers.getMapper(DataDictConvert.class);
DataDictCreateDTO convert(cn.iocoder.mall.managementweb.controller.datadict.dto.DataDictCreateDTO bean);
DataDictUpdateDTO convert(cn.iocoder.mall.managementweb.controller.datadict.dto.DataDictUpdateDTO bean);
DataDictVO convert(cn.iocoder.mall.systemservice.rpc.datadict.vo.DataDictVO bean);
List<DataDictVO> convertList(List<cn.iocoder.mall.systemservice.rpc.datadict.vo.DataDictVO> list);
List<DataDictSimpleVO> convertList02(List<cn.iocoder.mall.systemservice.rpc.datadict.vo.DataDictVO> list);
}

View File

@ -1,23 +0,0 @@
package cn.iocoder.mall.managementweb.convert.passport;
import cn.iocoder.mall.managementweb.controller.passport.dto.PassportLoginDTO;
import cn.iocoder.mall.managementweb.controller.passport.vo.PassportAccessTokenVO;
import cn.iocoder.mall.managementweb.controller.passport.vo.PassportAdminVO;
import cn.iocoder.mall.systemservice.rpc.admin.dto.AdminVerifyPasswordDTO;
import cn.iocoder.mall.systemservice.rpc.admin.vo.AdminVO;
import cn.iocoder.mall.systemservice.rpc.oauth.dto.OAuth2AccessTokenRespDTO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper
public interface AdminPassportConvert {
AdminPassportConvert INSTANCE = Mappers.getMapper(AdminPassportConvert.class);
AdminVerifyPasswordDTO convert(PassportLoginDTO bean);
PassportAccessTokenVO convert(OAuth2AccessTokenRespDTO bean);
PassportAdminVO convert(AdminVO bean);
}

View File

@ -1,20 +0,0 @@
package cn.iocoder.mall.managementweb.convert.pay.transaction;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.managementweb.controller.pay.vo.transaction.PayTransactionPageReqVO;
import cn.iocoder.mall.managementweb.controller.pay.vo.transaction.PayTransactionRespVO;
import cn.iocoder.mall.payservice.rpc.transaction.dto.PayTransactionPageReqDTO;
import cn.iocoder.mall.payservice.rpc.transaction.dto.PayTransactionRespDTO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper
public interface PayTransactionConvert {
PayTransactionConvert INSTANCE = Mappers.getMapper(PayTransactionConvert.class);
PayTransactionPageReqDTO convert(PayTransactionPageReqVO bean);
PageResult<PayTransactionRespVO> convertPage(PageResult<PayTransactionRespDTO> bean);
}

View File

@ -1,17 +0,0 @@
package cn.iocoder.mall.managementweb.convert.permission;
import cn.iocoder.mall.systemservice.rpc.permission.dto.PermissionAssignAdminRoleDTO;
import cn.iocoder.mall.systemservice.rpc.permission.dto.PermissionAssignRoleResourceDTO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper
public interface PermissionConvert {
PermissionConvert INSTANCE = Mappers.getMapper(PermissionConvert.class);
PermissionAssignRoleResourceDTO convert(cn.iocoder.mall.managementweb.controller.permission.dto.PermissionAssignRoleResourceDTO bean);
PermissionAssignAdminRoleDTO convert(cn.iocoder.mall.managementweb.controller.permission.dto.PermissionAssignAdminRoleDTO bean);
}

View File

@ -1,30 +0,0 @@
package cn.iocoder.mall.managementweb.convert.permission;
import cn.iocoder.mall.managementweb.controller.passport.vo.PassportAdminMenuTreeNodeVO;
import cn.iocoder.mall.managementweb.controller.permission.vo.ResourceTreeNodeVO;
import cn.iocoder.mall.managementweb.controller.permission.vo.ResourceVO;
import cn.iocoder.mall.systemservice.rpc.permission.dto.ResourceCreateDTO;
import cn.iocoder.mall.systemservice.rpc.permission.dto.ResourceUpdateDTO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper
public interface ResourceConvert {
ResourceConvert INSTANCE = Mappers.getMapper(ResourceConvert.class);
ResourceCreateDTO convert(cn.iocoder.mall.managementweb.controller.permission.dto.ResourceCreateDTO bean);
ResourceUpdateDTO convert(cn.iocoder.mall.managementweb.controller.permission.dto.ResourceUpdateDTO bean);
ResourceVO convert(cn.iocoder.mall.systemservice.rpc.permission.vo.ResourceVO bean);
List<ResourceVO> convertList(List<cn.iocoder.mall.systemservice.rpc.permission.vo.ResourceVO> list);
ResourceTreeNodeVO convertTreeNode(cn.iocoder.mall.systemservice.rpc.permission.vo.ResourceVO bean);
List<PassportAdminMenuTreeNodeVO> convert(List<ResourceTreeNodeVO> list);
}

View File

@ -1,30 +0,0 @@
package cn.iocoder.mall.managementweb.convert.permission;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.managementweb.controller.permission.vo.RoleVO;
import cn.iocoder.mall.systemservice.rpc.permission.dto.RolePageDTO;
import cn.iocoder.mall.systemservice.rpc.permission.dto.RoleUpdateDTO;
import cn.iocoder.mall.systemservice.rpc.permission.vo.RoleCreateDTO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper
public interface RoleConvert {
RoleConvert INSTANCE = Mappers.getMapper(RoleConvert.class);
RoleCreateDTO convert(cn.iocoder.mall.managementweb.controller.permission.dto.RoleCreateDTO bean);
RoleUpdateDTO convert(cn.iocoder.mall.managementweb.controller.permission.dto.RoleUpdateDTO bean);
RoleVO convert(cn.iocoder.mall.systemservice.rpc.permission.vo.RoleVO bean);
List<RoleVO> convertList(List<cn.iocoder.mall.systemservice.rpc.permission.vo.RoleVO> list);
RolePageDTO convert(cn.iocoder.mall.managementweb.controller.permission.dto.RolePageDTO bean);
PageResult<RoleVO> convertPage(PageResult<cn.iocoder.mall.systemservice.rpc.permission.vo.RoleVO> page);
}

View File

@ -1,18 +0,0 @@
package cn.iocoder.mall.managementweb.convert.systemlog;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.managementweb.controller.systemlog.vo.SystemAccessLogVO;
import cn.iocoder.mall.systemservice.rpc.systemlog.vo.SystemAccessLogPageDTO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper
public interface SystemAccessLogConvert {
SystemAccessLogConvert INSTANCE = Mappers.getMapper(SystemAccessLogConvert.class);
SystemAccessLogPageDTO convert(cn.iocoder.mall.managementweb.controller.systemlog.dto.SystemAccessLogPageDTO bean);
PageResult<SystemAccessLogVO> convertPage(PageResult<cn.iocoder.mall.systemservice.rpc.systemlog.vo.SystemAccessLogVO> page);
}

View File

@ -1,27 +0,0 @@
package cn.iocoder.mall.managementweb.convert.systemlog;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.managementweb.controller.systemlog.vo.SystemExceptionLogDetailVO;
import cn.iocoder.mall.managementweb.controller.systemlog.vo.SystemExceptionLogVO;
import cn.iocoder.mall.systemservice.rpc.admin.vo.AdminVO;
import cn.iocoder.mall.systemservice.rpc.systemlog.dto.SystemExceptionLogPageDTO;
import cn.iocoder.mall.systemservice.rpc.systemlog.dto.SystemExceptionLogProcessDTO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper
public interface SystemExceptionLogConvert {
SystemExceptionLogConvert INSTANCE = Mappers.getMapper(SystemExceptionLogConvert.class);
SystemExceptionLogPageDTO convert(cn.iocoder.mall.managementweb.controller.systemlog.dto.SystemExceptionLogPageDTO bean);
PageResult<SystemExceptionLogVO> convertPage(PageResult<cn.iocoder.mall.systemservice.rpc.systemlog.vo.SystemExceptionLogVO> page);
SystemExceptionLogDetailVO convert(cn.iocoder.mall.systemservice.rpc.systemlog.vo.SystemExceptionLogVO bean);
SystemExceptionLogDetailVO.Admin convert(AdminVO bean);
SystemExceptionLogProcessDTO convert(cn.iocoder.mall.managementweb.controller.systemlog.dto.SystemExceptionLogProcessDTO bean);
}

View File

@ -1,121 +0,0 @@
package cn.iocoder.mall.managementweb.manager.admin;
import cn.iocoder.common.framework.util.CollectionUtils;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.managementweb.controller.admin.dto.AdminCreateDTO;
import cn.iocoder.mall.managementweb.controller.admin.dto.AdminPageDTO;
import cn.iocoder.mall.managementweb.controller.admin.dto.AdminUpdateInfoDTO;
import cn.iocoder.mall.managementweb.controller.admin.dto.AdminUpdateStatusDTO;
import cn.iocoder.mall.managementweb.controller.admin.vo.AdminPageItemVO;
import cn.iocoder.mall.managementweb.controller.admin.vo.AdminVO;
import cn.iocoder.mall.managementweb.convert.admin.AdminConvert;
import cn.iocoder.mall.systemservice.rpc.admin.AdminFeign;
import cn.iocoder.mall.systemservice.rpc.admin.DepartmentFeign;
import cn.iocoder.mall.systemservice.rpc.admin.vo.DepartmentVO;
import cn.iocoder.mall.systemservice.rpc.permission.PermissionFeign;
import cn.iocoder.mall.systemservice.rpc.permission.RoleFeign;
import cn.iocoder.mall.systemservice.rpc.permission.vo.RoleVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.validation.Valid;
import java.util.*;
@Service
@Validated
public class AdminManager {
@Autowired
private AdminFeign adminFeign;
@Autowired
private RoleFeign roleFeign;
@Autowired
private DepartmentFeign departmentFeign;
@Autowired
private PermissionFeign permissionFeign;
public PageResult<AdminPageItemVO> pageAdmin(AdminPageDTO pageDTO) {
CommonResult<PageResult<cn.iocoder.mall.systemservice.rpc.admin.vo.AdminVO>> pageResult =
adminFeign.pageAdmin(AdminConvert.INSTANCE.convert(pageDTO));
pageResult.checkError();
// 转换结果
PageResult<AdminPageItemVO> adminPageVO = new PageResult<>();
adminPageVO.setTotal(pageResult.getData().getTotal());
adminPageVO.setList(new ArrayList<>(pageResult.getData().getList().size()));
// 拼接结果
if (!pageResult.getData().getList().isEmpty()) {
// 查询角色数组
Map<Integer, List<RoleVO>> adminRoleMap = this.listAdminRoles(CollectionUtils.convertList(pageResult.getData().getList(),
cn.iocoder.mall.systemservice.rpc.admin.vo.AdminVO::getId));
// 查询部门
CommonResult<List<DepartmentVO>> listDepartmentsResult = departmentFeign.listDepartments(
CollectionUtils.convertSet(pageResult.getData().getList(),
cn.iocoder.mall.systemservice.rpc.admin.vo.AdminVO::getDepartmentId));
listDepartmentsResult.checkError();
Map<Integer, DepartmentVO> departmentMap = CollectionUtils.convertMap(listDepartmentsResult.getData(), DepartmentVO::getId);
// 拼接数据
for (cn.iocoder.mall.systemservice.rpc.admin.vo.AdminVO adminVO : pageResult.getData().getList()) {
AdminPageItemVO adminPageItemVO = AdminConvert.INSTANCE.convert02(adminVO);
adminPageVO.getList().add(adminPageItemVO);
// 拼接部门
adminPageItemVO.setDepartment(AdminConvert.INSTANCE.convert(departmentMap.get(adminVO.getDepartmentId())));
// 拼接角色
adminPageItemVO.setRoles( AdminConvert.INSTANCE.convertList(adminRoleMap.get(adminVO.getId())));
}
} else {
adminPageVO.setList(Collections.emptyList());
}
return adminPageVO;
}
private Map<Integer, List<RoleVO>> listAdminRoles(List<Integer> adminIds) {
// 获得管理员拥有的角色
CommonResult<Map<Integer, Set<Integer>>> mapAdminRoleIdsResult = permissionFeign.mapAdminRoleIds(adminIds);
mapAdminRoleIdsResult.checkError();
// 获得角色列表
Set<Integer> roleIds = new HashSet<>();
mapAdminRoleIdsResult.getData().values().forEach(roleIds::addAll);
CommonResult<List<RoleVO>> listRolesResult = roleFeign.listRoles(roleIds);
listRolesResult.checkError();
Map<Integer, RoleVO> roleVOMap = CollectionUtils.convertMap(listRolesResult.getData(), RoleVO::getId);
// 拼接结果
Map<Integer, List<RoleVO>> adminRoleVOMap = new HashMap<>();
mapAdminRoleIdsResult.getData().forEach((adminId, adminRoleIds) -> {
List<RoleVO> roleVOs = new ArrayList<>(adminRoleIds.size());
adminRoleIds.forEach(roleId -> {
RoleVO roleVO = roleVOMap.get(roleId);
if (roleVO != null) {
roleVOs.add(roleVO);
}
});
adminRoleVOMap.put(adminId, roleVOs);
});
return adminRoleVOMap;
}
public Integer createAdmin(AdminCreateDTO createDTO, Integer createAdminId, String createIp) {
CommonResult<Integer> createAdminResult = adminFeign.createAdmin(AdminConvert.INSTANCE.convert(createDTO)
.setCreateAdminId(createAdminId).setCreateIp(createIp));
createAdminResult.checkError();
return createAdminResult.getData();
}
public void updateAdmin(AdminUpdateInfoDTO updateInfoDTO) {
CommonResult<Boolean> updateAdminResult = adminFeign.updateAdmin(AdminConvert.INSTANCE.convert(updateInfoDTO));
updateAdminResult.checkError();
}
public void updateAdminStatus(@Valid AdminUpdateStatusDTO updateStatusDTO) {
CommonResult<Boolean> updateAdminResult = adminFeign.updateAdmin(AdminConvert.INSTANCE.convert(updateStatusDTO));
updateAdminResult.checkError();
}
public AdminVO getAdmin(Integer adminId) {
CommonResult<cn.iocoder.mall.systemservice.rpc.admin.vo.AdminVO> getAdminResult = adminFeign.getAdmin(adminId);
getAdminResult.checkError();
return AdminConvert.INSTANCE.convert(getAdminResult.getData());
}
}

View File

@ -1,127 +0,0 @@
package cn.iocoder.mall.managementweb.manager.admin;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.managementweb.controller.admin.dto.DepartmentCreateDTO;
import cn.iocoder.mall.managementweb.controller.admin.dto.DepartmentUpdateDTO;
import cn.iocoder.mall.managementweb.controller.admin.vo.DepartmentTreeNodeVO;
import cn.iocoder.mall.managementweb.controller.admin.vo.DepartmentVO;
import cn.iocoder.mall.managementweb.convert.admin.DepartmentConvert;
import cn.iocoder.mall.systemservice.enums.admin.DepartmentIdEnum;
import cn.iocoder.mall.systemservice.rpc.admin.DepartmentFeign;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.stream.Collectors;
/**
* 部门 Manager
*/
@Service
@Slf4j
public class DepartmentManager {
@Autowired
private DepartmentFeign departmentFeign;
/**
* 创建部门
*
* @param createDTO 创建部门 DTO
* @return 部门
*/
public Integer createDepartment(DepartmentCreateDTO createDTO) {
CommonResult<Integer> createDepartmentResult = departmentFeign.createDepartment(DepartmentConvert.INSTANCE.convert(createDTO));
createDepartmentResult.checkError();
return createDepartmentResult.getData();
}
/**
* 更新部门
*
* @param updateDTO 更新部门 DTO
*/
public void updateDepartment(DepartmentUpdateDTO updateDTO) {
CommonResult<Boolean> updateDepartmentResult = departmentFeign.updateDepartment(DepartmentConvert.INSTANCE.convert(updateDTO));
updateDepartmentResult.checkError();
}
/**
* 删除部门
*
* @param departmentId 部门编号
*/
public void deleteDepartment(Integer departmentId) {
CommonResult<Boolean> deleteDepartmentResult = departmentFeign.deleteDepartment(departmentId);
deleteDepartmentResult.checkError();
}
/**
* 获得部门
*
* @param departmentId 部门编号
* @return 部门
*/
public DepartmentVO getDepartment(Integer departmentId) {
CommonResult<cn.iocoder.mall.systemservice.rpc.admin.vo.DepartmentVO> getDepartmentResult = departmentFeign.getDepartment(departmentId);
getDepartmentResult.checkError();
return DepartmentConvert.INSTANCE.convert(getDepartmentResult.getData());
}
/**
* 获得部门列表
*
* @param departmentIds 部门编号列表
* @return 部门列表
*/
public List<DepartmentVO> listDepartments(List<Integer> departmentIds) {
CommonResult<List<cn.iocoder.mall.systemservice.rpc.admin.vo.DepartmentVO>> listDepartmentResult = departmentFeign.listDepartments(departmentIds);
listDepartmentResult.checkError();
return DepartmentConvert.INSTANCE.convertList(listDepartmentResult.getData());
}
/**
* 获得部门树结构
*
* @return 部门树结构
*/
public List<DepartmentTreeNodeVO> treeDepartment() {
// 获得资源全列表
CommonResult<List<cn.iocoder.mall.systemservice.rpc.admin.vo.DepartmentVO>> listDepartmentResult = departmentFeign.listDepartments();
listDepartmentResult.checkError();
// 构建菜单树
return buildDepartmentTree(listDepartmentResult.getData());
}
/**
* 构建部门树
*
* @param departmentVOs 部门列表
* @return 部门树
*/
public static List<DepartmentTreeNodeVO> buildDepartmentTree(List<cn.iocoder.mall.systemservice.rpc.admin.vo.DepartmentVO> departmentVOs) {
// 排序保证菜单的有序性
departmentVOs.sort(Comparator.comparing(cn.iocoder.mall.systemservice.rpc.admin.vo.DepartmentVO::getSort));
// 构建菜单树
// 使用 LinkedHashMap 的原因是为了排序 实际也可以用 Stream API 就是太丑了
Map<Integer, DepartmentTreeNodeVO> treeNodeMap = new LinkedHashMap<>();
departmentVOs.forEach(departmentVO -> treeNodeMap.put(departmentVO.getId(), DepartmentConvert.INSTANCE.convertTreeNode(departmentVO)));
// 处理父子关系
treeNodeMap.values().stream().filter(node -> !node.getPid().equals(DepartmentIdEnum.ROOT.getId())).forEach((childNode) -> {
// 获得父节点
DepartmentTreeNodeVO parentNode = treeNodeMap.get(childNode.getPid());
if (parentNode == null) {
log.error("[buildDepartmentTree][department({}) 找不到父部门({})]", childNode.getId(), childNode.getPid());
return;
}
// 将自己添加到父节点中
if (parentNode.getChildren() == null) {
parentNode.setChildren(new ArrayList<>());
}
parentNode.getChildren().add(childNode);
});
// 获得到所有的根节点
return treeNodeMap.values().stream().filter(node -> node.getPid().equals(DepartmentIdEnum.ROOT.getId())).collect(Collectors.toList());
}
}

View File

@ -1,112 +0,0 @@
package cn.iocoder.mall.managementweb.manager.datadict;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.managementweb.controller.datadict.dto.DataDictCreateDTO;
import cn.iocoder.mall.managementweb.controller.datadict.dto.DataDictUpdateDTO;
import cn.iocoder.mall.managementweb.controller.datadict.vo.DataDictSimpleVO;
import cn.iocoder.mall.managementweb.controller.datadict.vo.DataDictVO;
import cn.iocoder.mall.managementweb.convert.datadict.DataDictConvert;
import cn.iocoder.mall.systemservice.rpc.datadict.DataDictFeign;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Comparator;
import java.util.List;
/**
* 数据字典 Manager
*/
@Service
public class DataDictManager {
private static final Comparator<cn.iocoder.mall.systemservice.rpc.datadict.vo.DataDictVO> COMPARATOR_ENUM_VALUE_SORT = Comparator
.comparing(cn.iocoder.mall.systemservice.rpc.datadict.vo.DataDictVO::getEnumValue)
.thenComparingInt(cn.iocoder.mall.systemservice.rpc.datadict.vo.DataDictVO::getSort);
@Autowired
private DataDictFeign dataDictFeign;
/**
* 创建数据字典
*
* @param createDTO 创建数据字典 DTO
* @return 数据字典
*/
public Integer createDataDict(DataDictCreateDTO createDTO) {
CommonResult<Integer> createDataDictResult = dataDictFeign.createDataDict(DataDictConvert.INSTANCE.convert(createDTO));
createDataDictResult.checkError();
return createDataDictResult.getData();
}
/**
* 更新数据字典
*
* @param updateDTO 更新数据字典 DTO
*/
public void updateDataDict(DataDictUpdateDTO updateDTO) {
CommonResult<Boolean> updateDataDictResult = dataDictFeign.updateDataDict(DataDictConvert.INSTANCE.convert(updateDTO));
updateDataDictResult.checkError();
}
/**
* 删除数据字典
*
* @param dataDictId 数据字典编号
*/
public void deleteDataDict(Integer dataDictId) {
CommonResult<Boolean> deleteDataDictResult = dataDictFeign.deleteDataDict(dataDictId);
deleteDataDictResult.checkError();
}
/**
* 获得数据字典
*
* @param dataDictId 数据字典编号
* @return 数据字典
*/
public DataDictVO getDataDict(Integer dataDictId) {
CommonResult<cn.iocoder.mall.systemservice.rpc.datadict.vo.DataDictVO> getDataDictResult = dataDictFeign.getDataDict(dataDictId);
getDataDictResult.checkError();
return DataDictConvert.INSTANCE.convert(getDataDictResult.getData());
}
/**
* 获得数据字典列表
*
* @param dataDictIds 数据字典编号列表
* @return 数据字典列表
*/
public List<DataDictVO> listDataDicts(List<Integer> dataDictIds) {
CommonResult<List<cn.iocoder.mall.systemservice.rpc.datadict.vo.DataDictVO>> listDataDictResult = dataDictFeign.listDataDicts(dataDictIds);
listDataDictResult.checkError();
return DataDictConvert.INSTANCE.convertList(listDataDictResult.getData());
}
/**
* 获得全部数据字典
*
* @return 数据字典列表
*/
public List<DataDictVO> listDataDicts() {
CommonResult<List<cn.iocoder.mall.systemservice.rpc.datadict.vo.DataDictVO>> listDataDictResult = dataDictFeign.listDataDicts();
listDataDictResult.checkError();
// 按照 enumValue sort 排序
listDataDictResult.getData().sort(COMPARATOR_ENUM_VALUE_SORT);
return DataDictConvert.INSTANCE.convertList(listDataDictResult.getData());
}
/**
* 获得全部数据字典
*
* 精简返回字段
*
* @return 数据字典列表
*/
public List<DataDictSimpleVO> listSimpleDataDicts() {
CommonResult<List<cn.iocoder.mall.systemservice.rpc.datadict.vo.DataDictVO>> listDataDictResult = dataDictFeign.listDataDicts();
listDataDictResult.checkError();
// 按照 enumValue sort 排序
listDataDictResult.getData().sort(COMPARATOR_ENUM_VALUE_SORT);
return DataDictConvert.INSTANCE.convertList02(listDataDictResult.getData());
}
}

View File

@ -1,96 +0,0 @@
package cn.iocoder.mall.managementweb.manager.errorcode;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.managementweb.controller.errorcode.dto.ErrorCodeCreateDTO;
import cn.iocoder.mall.managementweb.controller.errorcode.dto.ErrorCodePageDTO;
import cn.iocoder.mall.managementweb.controller.errorcode.dto.ErrorCodeUpdateDTO;
import cn.iocoder.mall.managementweb.controller.errorcode.vo.ErrorCodeVO;
import cn.iocoder.mall.managementweb.convert.errorcode.ErrorCodeConvert;
import cn.iocoder.mall.systemservice.enums.errorcode.ErrorCodeTypeEnum;
import cn.iocoder.mall.systemservice.rpc.errorcode.ErrorCodeFeign;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 错误码 Manager
*/
@Service
public class ErrorCodeManager {
@Autowired
private ErrorCodeFeign errorCodeFeign;
/**
* 创建错误码
*
* @param createDTO 创建错误码 DTO
* @return 错误码
*/
public Integer createErrorCode(ErrorCodeCreateDTO createDTO) {
CommonResult<Integer> createErrorCodeResult = errorCodeFeign.createErrorCode(ErrorCodeConvert.INSTANCE.convert(createDTO)
.setType(ErrorCodeTypeEnum.MANUAL_OPERATION.getType()));
createErrorCodeResult.checkError();
return createErrorCodeResult.getData();
}
/**
* 更新错误码
*
* @param updateDTO 更新错误码 DTO
*/
public void updateErrorCode(ErrorCodeUpdateDTO updateDTO) {
CommonResult<Boolean> updateErrorCodeResult = errorCodeFeign.updateErrorCode(ErrorCodeConvert.INSTANCE.convert(updateDTO)
.setType(ErrorCodeTypeEnum.MANUAL_OPERATION.getType()));
updateErrorCodeResult.checkError();
}
/**
* 删除错误码
*
* @param errorCodeId 错误码编号
*/
public void deleteErrorCode(Integer errorCodeId) {
CommonResult<Boolean> deleteErrorCodeResult = errorCodeFeign.deleteErrorCode(errorCodeId);
deleteErrorCodeResult.checkError();
}
/**
* 获得错误码
*
* @param errorCodeId 错误码编号
* @return 错误码
*/
public ErrorCodeVO getErrorCode(Integer errorCodeId) {
CommonResult<cn.iocoder.mall.systemservice.rpc.errorcode.vo.ErrorCodeVO> getErrorCodeResult = errorCodeFeign.getErrorCode(errorCodeId);
getErrorCodeResult.checkError();
return ErrorCodeConvert.INSTANCE.convert(getErrorCodeResult.getData());
}
/**
* 获得错误码列表
*
* @param errorCodeIds 错误码编号列表
* @return 错误码列表
*/
public List<ErrorCodeVO> listErrorCodes(List<Integer> errorCodeIds) {
CommonResult<List<cn.iocoder.mall.systemservice.rpc.errorcode.vo.ErrorCodeVO>> listErrorCodeResult = errorCodeFeign.listErrorCodes(errorCodeIds);
listErrorCodeResult.checkError();
return ErrorCodeConvert.INSTANCE.convertList(listErrorCodeResult.getData());
}
/**
* 获得错误码分页
*
* @param pageDTO 错误码分页查询
* @return 错误码分页结果
*/
public PageResult<ErrorCodeVO> pageErrorCode(ErrorCodePageDTO pageDTO) {
CommonResult<PageResult<cn.iocoder.mall.systemservice.rpc.errorcode.vo.ErrorCodeVO>> pageErrorCodeResult
= errorCodeFeign.pageErrorCode(ErrorCodeConvert.INSTANCE.convert(pageDTO));
pageErrorCodeResult.checkError();
return ErrorCodeConvert.INSTANCE.convertPage(pageErrorCodeResult.getData());
}
}

View File

@ -1,123 +0,0 @@
package cn.iocoder.mall.managementweb.manager.passport;
import cn.iocoder.common.framework.enums.UserTypeEnum;
import cn.iocoder.common.framework.util.CollectionUtils;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.managementweb.controller.passport.dto.PassportLoginDTO;
import cn.iocoder.mall.managementweb.controller.passport.vo.PassportAccessTokenVO;
import cn.iocoder.mall.managementweb.controller.passport.vo.PassportAdminMenuTreeNodeVO;
import cn.iocoder.mall.managementweb.controller.passport.vo.PassportAdminVO;
import cn.iocoder.mall.managementweb.controller.permission.vo.ResourceTreeNodeVO;
import cn.iocoder.mall.managementweb.convert.passport.AdminPassportConvert;
import cn.iocoder.mall.managementweb.convert.permission.ResourceConvert;
import cn.iocoder.mall.managementweb.manager.permission.ResourceManager;
import cn.iocoder.mall.systemservice.enums.permission.ResourceTypeEnum;
import cn.iocoder.mall.systemservice.rpc.admin.AdminFeign;
import cn.iocoder.mall.systemservice.rpc.admin.vo.AdminVO;
import cn.iocoder.mall.systemservice.rpc.oauth.OAuthFeign;
import cn.iocoder.mall.systemservice.rpc.oauth.dto.OAuth2AccessTokenRespDTO;
import cn.iocoder.mall.systemservice.rpc.oauth.dto.OAuth2CreateAccessTokenReqDTO;
import cn.iocoder.mall.systemservice.rpc.oauth.dto.OAuth2RefreshAccessTokenReqDTO;
import cn.iocoder.mall.systemservice.rpc.permission.ResourceFeign;
import cn.iocoder.mall.systemservice.rpc.permission.RoleFeign;
import cn.iocoder.mall.systemservice.rpc.permission.vo.ResourceVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List;
import java.util.Set;
@Service
public class PassportManager {
@Autowired
private AdminFeign adminFeign;
@Autowired
private OAuthFeign oAuthFeign;
@Autowired
private RoleFeign roleFeign;
@Autowired
private ResourceFeign resourceFeign;
public PassportAccessTokenVO login(PassportLoginDTO loginDTO, String ip) {
// 校验管理员密码
// CommonResult<AdminVO> verifyPasswordResult = adminFeign.verifyPassword(AdminPassportConvert.INSTANCE.convert(loginDTO).setIp(ip));
CommonResult<AdminVO> verifyPasswordResult = adminFeign.verifyPassword(AdminPassportConvert.INSTANCE.convert(loginDTO).setIp(ip));
verifyPasswordResult.checkError();
// 创建访问令牌
CommonResult<OAuth2AccessTokenRespDTO> createAccessTokenResult = oAuthFeign.createAccessToken(
new OAuth2CreateAccessTokenReqDTO().setUserId(verifyPasswordResult.getData().getId())
.setUserType(UserTypeEnum.ADMIN.getValue()).setCreateIp(ip));
createAccessTokenResult.checkError();
// 返回
return AdminPassportConvert.INSTANCE.convert(createAccessTokenResult.getData());
}
public PassportAdminVO getAdmin(Integer adminId) {
CommonResult<AdminVO> getAdminResult = adminFeign.getAdmin(adminId);
getAdminResult.checkError();
return AdminPassportConvert.INSTANCE.convert(getAdminResult.getData());
}
public PassportAccessTokenVO refreshToken(String refreshToken, String ip) {
CommonResult<OAuth2AccessTokenRespDTO> refreshAccessTokenResult = oAuthFeign.refreshAccessToken(
new OAuth2RefreshAccessTokenReqDTO().setRefreshToken(refreshToken).setCreateIp(ip));
refreshAccessTokenResult.checkError();
return AdminPassportConvert.INSTANCE.convert(refreshAccessTokenResult.getData());
}
/**
* 获得指定管理员的权限列表
*
* @param adminId 管理员编号
* @return 权限列表
*/
public Set<String> listAdminPermission(Integer adminId) {
// 获得管理员拥有的角色编号列表
CommonResult<Set<Integer>> listAdminRoleIdsResult = roleFeign.listAdminRoleIds(adminId);
listAdminRoleIdsResult.checkError();
if (CollectionUtils.isEmpty(listAdminRoleIdsResult.getData())) {
return Collections.emptySet();
}
// 获得角色拥有的资源列表
CommonResult<List<ResourceVO>> resourceVOResult = resourceFeign.listRoleResource(
listAdminRoleIdsResult.getData(), null);
resourceVOResult.checkError();
return CollectionUtils.convertSet(resourceVOResult.getData(), cn.iocoder.mall.systemservice.rpc.permission.vo.ResourceVO::getPermission);
}
/**
* 获得管理员的菜单树
*
* @param adminId 管理员编号
* @return 菜单树
*/
public List<PassportAdminMenuTreeNodeVO> treeAdminMenu(Integer adminId) {
// 获得管理员拥有的角色编号列表
CommonResult<Set<Integer>> listAdminRoleIdsResult = roleFeign.listAdminRoleIds(adminId);
listAdminRoleIdsResult.checkError();
if (CollectionUtils.isEmpty(listAdminRoleIdsResult.getData())) {
return Collections.emptyList();
}
// 获得角色拥有的资源菜单列表
CommonResult<List<cn.iocoder.mall.systemservice.rpc.permission.vo.ResourceVO>> resourceVOResult = resourceFeign.listRoleResource(
listAdminRoleIdsResult.getData(), ResourceTypeEnum.MENU.getType());
resourceVOResult.checkError();
// 构建菜单树
return this.buildAdminMenuTree(resourceVOResult.getData());
}
/**
* 构建菜单树
*
* @param resourceVOs 资源都是菜单列表
* @return 菜单树
*/
private List<PassportAdminMenuTreeNodeVO> buildAdminMenuTree(List<cn.iocoder.mall.systemservice.rpc.permission.vo.ResourceVO> resourceVOs) {
List<ResourceTreeNodeVO> treeNodeVOS = ResourceManager.buildResourceTree(resourceVOs);
// 虽然多了一层转换但是可维护性更好
return ResourceConvert.INSTANCE.convert(treeNodeVOS);
}
}

View File

@ -1,68 +0,0 @@
package cn.iocoder.mall.managementweb.manager.permission;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.managementweb.controller.permission.dto.PermissionAssignAdminRoleDTO;
import cn.iocoder.mall.managementweb.controller.permission.dto.PermissionAssignRoleResourceDTO;
import cn.iocoder.mall.managementweb.convert.permission.PermissionConvert;
import cn.iocoder.mall.systemservice.rpc.permission.PermissionFeign;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Set;
/**
* 权限 Manager
*/
@Service
public class PermissionManager {
@Autowired
private PermissionFeign permissionFeign;
/**
* 获得角色拥有的资源编号列表
*
* @param roleId 角色编号
* @return 资源编号列表
*/
public Set<Integer> listRoleResources(Integer roleId) {
CommonResult<Set<Integer>> listRoleResourceIdsResult = permissionFeign.listRoleResourceIds(roleId);
listRoleResourceIdsResult.checkError();
return listRoleResourceIdsResult.getData();
}
/**
* 赋予角色资源
*
* @param assignRoleResourceDTO 赋予角色资源 DTO
*/
public void assignRoleResource(PermissionAssignRoleResourceDTO assignRoleResourceDTO) {
CommonResult<Boolean> assignRoleResourceResult = permissionFeign.assignRoleResource(
PermissionConvert.INSTANCE.convert(assignRoleResourceDTO));
assignRoleResourceResult.checkError();
}
/**
* 赋予用户角色
*
* @param assignAdminRoleDTO 赋予用户角色 DTO
*/
public void assignAdminRole(PermissionAssignAdminRoleDTO assignAdminRoleDTO) {
CommonResult<Boolean> assignAdminRoleResult = permissionFeign.assignAdminRole(
PermissionConvert.INSTANCE.convert(assignAdminRoleDTO));
assignAdminRoleResult.checkError();
}
/**
* 获得用户拥有的角色编号列表
*
* @param adminId 管理员编号
* @return 角色编号列表
*/
public Set<Integer> listAdminRoles(Integer adminId) {
CommonResult<Set<Integer>> listAdminRoleIdsResult = permissionFeign.listAdminRoleIds(adminId);
listAdminRoleIdsResult.checkError();
return listAdminRoleIdsResult.getData();
}
}

Some files were not shown because too many files have changed in this diff Show More