移动一些文件位置,增加knife4j的依赖,并配置knife4j,

master
GPU is all you need 4 years ago
parent 86b40e1fe5
commit 579d8f2479
  1. 33
      awardBE/pom.xml
  2. 50
      awardBE/src/main/java/edu/ncst/award/config/JacksonConfig.java
  3. 43
      awardBE/src/main/java/edu/ncst/award/config/swaggerConfig.java
  4. 2
      awardBE/src/main/java/edu/ncst/award/controller/LoginController.java
  5. 2
      awardBE/src/main/java/edu/ncst/award/controller/RoleController.java
  6. 15
      awardBE/src/main/java/edu/ncst/award/controller/UserController.java
  7. 47
      awardBE/src/main/java/edu/ncst/award/framework/config/JacksonConfig.java
  8. 158
      awardBE/src/main/java/edu/ncst/award/framework/config/SwaggerConfig.java
  9. 92
      awardBE/src/main/java/edu/ncst/award/framework/config/properties/SwaggerProperties.java
  10. 2
      awardBE/src/main/java/edu/ncst/award/framework/config/security/CustomAccessDeniedHandler.java
  11. 2
      awardBE/src/main/java/edu/ncst/award/framework/config/security/CustomDelegatingPasswordEncoder.java
  12. 5
      awardBE/src/main/java/edu/ncst/award/framework/config/security/CustomUserCache.java
  13. 9
      awardBE/src/main/java/edu/ncst/award/framework/config/security/DataBaseUrlVoter.java
  14. 29
      awardBE/src/main/java/edu/ncst/award/framework/config/security/SecurityConfig.java
  15. 4
      awardBE/src/main/java/edu/ncst/award/framework/config/security/filter/AuthCheckFilter.java
  16. 4
      awardBE/src/main/java/edu/ncst/award/framework/config/security/filter/LoginFilter.java
  17. 2
      awardBE/src/main/java/edu/ncst/award/framework/config/security/token/JwtAuthenticationToken.java
  18. 2
      awardBE/src/main/java/edu/ncst/award/framework/config/security/token/MobileCaptchaAuthenticationToken.java
  19. 2
      awardBE/src/main/java/edu/ncst/award/mapper/RoleMapper.java
  20. 8
      awardBE/src/main/java/edu/ncst/award/model/system/Menu.java
  21. 4
      awardBE/src/main/java/edu/ncst/award/service/impl/system/UserServiceImpl.java
  22. 60
      awardBE/src/main/resources/application.yml
  23. 18
      awardBE/src/main/resources/mapper/RoleMapper.xml

@ -5,7 +5,7 @@
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.1</version>
<version>2.6.6</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>edu.ncst</groupId>
@ -126,32 +126,13 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- swagger -->
<!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
<!-- <dependency>-->
<!-- <groupId>io.springfox</groupId>-->
<!-- <artifactId>springfox-swagger2</artifactId>-->
<!-- <version>2.9.2</version>-->
<!-- </dependency>-->
<!-- &lt;!&ndash; https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui &ndash;&gt;-->
<!-- <dependency>-->
<!-- <groupId>io.springfox</groupId>-->
<!-- <artifactId>springfox-swagger-ui</artifactId>-->
<!-- <version>2.9.2</version>-->
<!-- </dependency>-->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>3.0.0</version>
</dependency>
<!--swagger3-->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<!-- 这个是swagger2的依赖 -->
<!-- <dependency>-->
<!-- <groupId>com.spring4all</groupId>-->
<!-- <artifactId>swagger-spring-boot-starter</artifactId>-->
<!-- <version>1.9.1.RELEASE</version>-->
<!-- </dependency>-->
<!-- 这个是一个google推出的java开发工具包但是我不熟悉 -->
<dependency>
<groupId>com.google.guava</groupId>

@ -1,50 +0,0 @@
package edu.ncst.award.config;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
@Configuration
public class JacksonConfig {
@Bean
@Order(Ordered.HIGHEST_PRECEDENCE)
public Jackson2ObjectMapperBuilderCustomizer customJackson() {
return new Jackson2ObjectMapperBuilderCustomizer() {
@Override
public void customize(Jackson2ObjectMapperBuilder builder) {
builder.serializerByType(LocalDateTime.class,
new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
builder.serializerByType(LocalDate.class,
new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
builder.serializerByType(LocalTime.class,
new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
builder.deserializerByType(LocalDateTime.class,
new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
builder.deserializerByType(LocalDate.class,
new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
builder.deserializerByType(LocalTime.class,
new LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
builder.serializationInclusion(JsonInclude.Include.NON_NULL);
builder.failOnUnknownProperties(false);
builder.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
}
};
}
}

@ -1,43 +0,0 @@
package edu.ncst.award.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.oas.annotations.EnableOpenApi;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
@EnableOpenApi
@Configuration
public class swaggerConfig implements WebMvcConfigurer {
@Bean
public Docket createRestApi() {
//返回文档摘要信息
return new Docket(DocumentationType.OAS_30)
.apiInfo(apiInfo())
.select()
//.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
//配合@EnableOpenApi 找到API位置,不需要再在启动类上配置
.apis(RequestHandlerSelectors.basePackage("edu.ncst.award.controller"))
.paths(PathSelectors.any())
.build();
}
//生成接口信息,包括标题、联系人等
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("Swagger3接口文档")
.description("Rabbit用Swagger3.0。")
.contact(new Contact("Rabbit", "https://swagger.io/", "362250024@qq.com"))
.version("1.0")
.build();
}
}

@ -1,7 +1,7 @@
package edu.ncst.award.controller;
import edu.ncst.award.config.security.CustomUserCache;
import edu.ncst.award.framework.config.security.CustomUserCache;
import edu.ncst.award.domain.vo.R;
import edu.ncst.award.domain.vo.RouterVo;
import edu.ncst.award.domain.vo.result.UserInfoVO;

@ -6,7 +6,7 @@ import edu.ncst.award.common.annotation.enums.BusinessType;
import edu.ncst.award.common.constant.UserConstants;
import edu.ncst.award.common.core.controller.BaseController;
import edu.ncst.award.common.core.page.TableDataInfo;
import edu.ncst.award.config.security.CustomUserCache;
import edu.ncst.award.framework.config.security.CustomUserCache;
import edu.ncst.award.domain.UserRole;
import edu.ncst.award.domain.vo.R;
import edu.ncst.award.domain.vo.param.query.PageQuery;

@ -15,7 +15,9 @@ import edu.ncst.award.model.system.User;
import edu.ncst.award.service.IRoleService;
import edu.ncst.award.service.IUserService;
import edu.ncst.award.utils.StringUtils;
import io.swagger.annotations.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.crypto.bcrypt.BCrypt;
@ -56,14 +58,13 @@ public class UserController extends BaseController {
@ApiOperation("根据用户编号获取详细信息")
@GetMapping(value = {"/", "/{id}"})
public R<Map<String, Object>> getInfo(@ApiParam("用户ID") @PathVariable(value = "id", required = false) Long userId) {
// admin 具有超级权限你不能修改他
Map<String, Object> ajax = new HashMap<>();
List<Role> roles = roleService.selectRoleAll();
ajax.put("roles", UserConstants.ADMIN_ID.equals(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
if (ObjectUtil.isNotNull(userId)) {
User sysUser = userService.selectUserById(userId);
ajax.put("user", sysUser);
ajax.put("roleIds", sysUser.getRoles().stream().map(Role::getRoleId).collect(Collectors.toList()));
List<Role> roles = roleService.selectRolesByUserId(userId);
User user = userService.selectUserById(userId);
ajax.put("roles", roles);
ajax.put("user", user);
ajax.put("roleIds", roles.stream().map(Role::getRoleId).collect(Collectors.toList()));
}
return R.ok(ajax);
}

@ -0,0 +1,47 @@
package edu.ncst.award.framework.config;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
@Configuration
public class JacksonConfig {
@Bean
@Order(Ordered.HIGHEST_PRECEDENCE)
public Jackson2ObjectMapperBuilderCustomizer customJackson() {
return builder -> {
builder.serializerByType(LocalDateTime.class,
new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
builder.serializerByType(LocalDate.class,
new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
builder.serializerByType(LocalTime.class,
new LocalTimeSerializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
builder.deserializerByType(LocalDateTime.class,
new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
builder.deserializerByType(LocalDate.class,
new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
builder.deserializerByType(LocalTime.class,
new LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss")));
builder.serializationInclusion(JsonInclude.Include.NON_NULL);
builder.failOnUnknownProperties(false);
builder.featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
};
}
}

@ -0,0 +1,158 @@
package edu.ncst.award.framework.config;
import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import com.github.xiaoymin.knife4j.spring.extension.OpenApiExtensionResolver;
import edu.ncst.award.common.util.spring.SpringUtils;
import edu.ncst.award.framework.config.properties.SwaggerProperties;
import io.swagger.models.auth.In;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.ReflectionUtils;
import org.springframework.web.servlet.mvc.method.RequestMappingInfoHandlerMapping;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.spring.web.plugins.WebFluxRequestHandlerProvider;
import springfox.documentation.spring.web.plugins.WebMvcRequestHandlerProvider;
import javax.annotation.PostConstruct;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
/**
* Swagger 文档配置
*
* @author Lion Li
*/
@RequiredArgsConstructor
@Configuration
//@EnableKnife4j 2.06 之后在yml中配置之后可以不写
public class SwaggerConfig {
private final SwaggerProperties swaggerProperties;
private final OpenApiExtensionResolver openApiExtensionResolver;
/**
* 用于适配springboot 2.6
*/
@Bean
@SuppressWarnings("all")
public BeanPostProcessor springfoxHandlerProviderBeanPostProcessor() {
return new BeanPostProcessor() {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof WebMvcRequestHandlerProvider || bean instanceof WebFluxRequestHandlerProvider) {
customizeSpringfoxHandlerMappings(getHandlerMappings(bean));
}
return bean;
}
private <T extends RequestMappingInfoHandlerMapping> void customizeSpringfoxHandlerMappings(List<T> mappings) {
mappings.removeIf(mapping -> mapping.getPatternParser() != null);
}
private List<RequestMappingInfoHandlerMapping> getHandlerMappings(Object bean) {
try {
Field field = ReflectionUtils.findField(bean.getClass(), "handlerMappings");
field.setAccessible(true);
return (List<RequestMappingInfoHandlerMapping>) field.get(bean);
} catch (IllegalArgumentException | IllegalAccessException e) {
throw new IllegalStateException(e);
}
}
};
}
/**
* 创建API
*/
@PostConstruct
public void createRestApi() {
for (SwaggerProperties.Groups group : swaggerProperties.getGroups()) {
String basePackage = group.getBasePackage();
Docket docket = new Docket(DocumentationType.OAS_30)
.enable(swaggerProperties.getEnabled())
// 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息)
.apiInfo(apiInfo())
// 设置哪些接口暴露给Swagger展示
.select()
// 扫描所有有注解的api,用这种方式更灵活
//.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
// 扫描指定包中的swagger注解
.apis(RequestHandlerSelectors.basePackage(basePackage))
// 扫描所有 .apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any())
.build()
.groupName(group.getName())
// 设置安全模式,swagger可以设置访问token
.securitySchemes(securitySchemes())
.securityContexts(securityContexts())
.extensions(openApiExtensionResolver.buildExtensions(group.getName()))
.pathMapping(swaggerProperties.getPathMapping());
String beanName = StringUtils.substringAfterLast(basePackage, ".") + "Docket";
SpringUtils.registerBean(beanName, docket);
}
}
/**
* 安全模式这里指定token通过Authorization头请求头传递
*/
private List<SecurityScheme> securitySchemes() {
List<SecurityScheme> apiKeyList = new ArrayList<>();
String header = "Authorization"; // 和AuthCheckFilter对应
apiKeyList.add(new ApiKey(header, header, In.HEADER.toValue()));
return apiKeyList;
}
/**
* 安全上下文
*/
private List<SecurityContext> securityContexts() {
List<SecurityContext> securityContexts = new ArrayList<>();
securityContexts.add(
SecurityContext.builder()
.securityReferences(defaultAuth())
.operationSelector(o -> o.requestMappingPattern().matches("/.*"))
.build());
return securityContexts;
}
/**
* 默认的安全上引用
*/
private List<SecurityReference> defaultAuth() {
AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
authorizationScopes[0] = authorizationScope;
List<SecurityReference> securityReferences = new ArrayList<>();
securityReferences.add(new SecurityReference("Authorization", authorizationScopes));
return securityReferences;
}
/**
* 添加摘要信息
*/
private ApiInfo apiInfo() {
// 用ApiInfoBuilder进行定制
SwaggerProperties.Contact contact = swaggerProperties.getContact();
return new ApiInfoBuilder()
// 设置标题
.title(swaggerProperties.getTitle())
// 描述
.description(swaggerProperties.getDescription())
// 作者信息
.contact(new Contact(contact.getName(), contact.getUrl(), contact.getEmail()))
// 版本
.version(swaggerProperties.getVersion())
.build();
}
}

@ -0,0 +1,92 @@
package edu.ncst.award.framework.config.properties;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* swagger 配置属性
*
* @author Lion Li
*/
@Data
@Component
@ConfigurationProperties(prefix = "swagger")
public class SwaggerProperties {
/**
* 文档开关
*/
private Boolean enabled;
/**
* 设置请求的统一前缀
*/
private String pathMapping;
/**
* 标头
*/
private String title;
/**
* 描述
*/
private String description;
/**
* 项目版本
*/
private String version;
/**
* 联系方式
*/
private Contact contact;
/**
* 组配置
*/
private List<Groups> groups;
@Data
@NoArgsConstructor
public static class Contact {
/**
* 联系人
*/
private String name;
/**
* 联系人url
*/
private String url;
/**
* 联系人email
*/
private String email;
}
@Data
@NoArgsConstructor
public static class Groups {
/**
* 组名
*/
private String name;
/**
* 基础包路径
*/
private String basePackage;
}
}

@ -1,4 +1,4 @@
package edu.ncst.award.config.security;
package edu.ncst.award.framework.config.security;
import com.fasterxml.jackson.databind.ObjectMapper;

@ -1,4 +1,4 @@
package edu.ncst.award.config.security;
package edu.ncst.award.framework.config.security;
import org.springframework.security.crypto.argon2.Argon2PasswordEncoder;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

@ -1,4 +1,4 @@
package edu.ncst.award.config.security;
package edu.ncst.award.framework.config.security;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
@ -6,7 +6,6 @@ import cn.hutool.extra.spring.SpringUtil;
import cn.hutool.json.JSONUtil;
import edu.ncst.award.model.system.User;
import edu.ncst.award.domain.vo.result.UserInfoVO;
import edu.ncst.award.service.IUserService;
import edu.ncst.award.service.impl.system.UserServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
@ -15,8 +14,6 @@ import org.springframework.security.core.userdetails.UserCache;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Slf4j
@Component

@ -1,21 +1,14 @@
package edu.ncst.award.config.security;
package edu.ncst.award.framework.config.security;
import edu.ncst.award.model.system.Resource;
import edu.ncst.award.model.system.Role;
import edu.ncst.award.service.IResourceService;
import edu.ncst.award.utils.URLUtils;
import edu.ncst.award.domain.vo.result.UserInfoVO;
import org.springframework.security.access.AccessDecisionVoter;
import org.springframework.security.access.ConfigAttribute;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.web.FilterInvocation;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
/**
* URL 鉴权投票器

@ -1,8 +1,8 @@
package edu.ncst.award.config.security;
package edu.ncst.award.framework.config.security;
import com.fasterxml.jackson.databind.ObjectMapper;
import edu.ncst.award.config.security.filter.AuthCheckFilter;
import edu.ncst.award.config.security.filter.LoginFilter;
import edu.ncst.award.framework.config.security.filter.AuthCheckFilter;
import edu.ncst.award.framework.config.security.filter.LoginFilter;
import edu.ncst.award.domain.vo.R;
import edu.ncst.award.exception.CodeMsg;
import edu.ncst.award.service.ILoginLogService;
@ -77,18 +77,18 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
"/configuration/ui",
"/swagger-resources/**",
"/configuration/**",
"/swagger-ui.html",
"/webjars/**",
// "/swagger-ui/index.html",
// "/webjars/**",
"/api/captcha.jpg",
"/websocket/**",
"/api/image/get/**",
"/common/download/**",
"/test/**",
"/*.html",
"/**/*.html",
"/**/*.css",
"/**/*.js",
"/error*"
// "/websocket/**",
// "/api/image/get/**",
// "/common/download/**",
// "/test/**",
// "/*.html",
// "/**/*.html",
// "/**/*.css",
// "/**/*.js",
// "/error*"
};
@ -146,6 +146,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
.httpBasic().disable()
.authorizeRequests()
.accessDecisionManager(accessDecisionManager())//访问决策管理器
.antMatchers("/swagger-ui/*").permitAll()
.antMatchers("/api/login").permitAll()
.antMatchers("/system/init").permitAll()
// 除上面外的所有请求全部需要鉴权认证

@ -1,7 +1,7 @@
package edu.ncst.award.config.security.filter;
package edu.ncst.award.framework.config.security.filter;
import com.fasterxml.jackson.databind.ObjectMapper;
import edu.ncst.award.config.security.token.JwtAuthenticationToken;
import edu.ncst.award.framework.config.security.token.JwtAuthenticationToken;
import edu.ncst.award.exception.CodeMsg;
import edu.ncst.award.model.system.Role;
import edu.ncst.award.utils.ResponseUtils;

@ -1,7 +1,7 @@
package edu.ncst.award.config.security.filter;
package edu.ncst.award.framework.config.security.filter;
import com.fasterxml.jackson.databind.ObjectMapper;
import edu.ncst.award.config.security.token.MobileCaptchaAuthenticationToken;
import edu.ncst.award.framework.config.security.token.MobileCaptchaAuthenticationToken;
import edu.ncst.award.exception.BusinessException;
import edu.ncst.award.exception.CodeMsg;
import edu.ncst.award.model.system.Role;

@ -1,4 +1,4 @@
package edu.ncst.award.config.security.token;
package edu.ncst.award.framework.config.security.token;
import edu.ncst.award.domain.vo.result.UserInfoVO;
import org.springframework.security.authentication.AbstractAuthenticationToken;

@ -1,4 +1,4 @@
package edu.ncst.award.config.security.token;
package edu.ncst.award.framework.config.security.token;
import org.springframework.security.authentication.AbstractAuthenticationToken;
import org.springframework.security.core.GrantedAuthority;

@ -25,7 +25,7 @@ public interface RoleMapper extends BaseMapperPlus<RoleMapper, Role, Role> {
Page<Role> selectPageRoleList(@Param("page") Page<Role> page, @Param("role") Role role);
List<Role> getUserRolesById(long id);
List<Role> getUserRolesById(@Param("userId") long userId);
//

@ -17,7 +17,7 @@ import java.util.Objects;
@ApiModel(value="Menu", description="菜单")
@Data
@TableName("sys_menu")
public class Menu extends TreeNode implements Serializable {
public class Menu implements Serializable {
private static final long serialVersionUID=1L;
@ -55,9 +55,9 @@ public class Menu extends TreeNode implements Serializable {
@ApiModelProperty(value = "上级菜单")
private Integer parentId;
// @ApiModelProperty(value = "下级菜单")
// @TableField(exist = false)
// private List<Menu> children;
@ApiModelProperty(value = "下级菜单")
@TableField(exist = false)
private List<Menu> children;
@ApiModelProperty(value = "是否显示在菜单上")
private Boolean showInMenu = true;

@ -8,10 +8,9 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import edu.ncst.award.common.constant.UserConstants;
import edu.ncst.award.common.core.exception.ServiceException;
import edu.ncst.award.common.core.page.TableDataInfo;
import edu.ncst.award.config.security.CustomUserCache;
import edu.ncst.award.framework.config.security.CustomUserCache;
import edu.ncst.award.domain.UserRole;
import edu.ncst.award.domain.vo.ListResultVO;
import edu.ncst.award.domain.vo.param.CurrentUserDTO;
import edu.ncst.award.domain.vo.param.query.PageQuery;
import edu.ncst.award.domain.vo.param.query.UserQuery;
import edu.ncst.award.domain.vo.result.UserInfoVO;
@ -21,7 +20,6 @@ import edu.ncst.award.model.system.Role;
import edu.ncst.award.model.system.User;
import edu.ncst.award.service.IUserService;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;

@ -37,17 +37,61 @@ server:
# mapper-locations: classpath:mapping/*.xml
# type-aliases-package: edu.ncst.award.model
#swagger:
# enabled: true
# title: API文档
# description: 科技奖申报系统API文档
# base-package: edu.ncst.award.controller
# exclude-path: /error/**
# termsOfServiceUrl: https://meander.net.cn
# contact:
# name: sage
# url: www.meander.net.cn
# email: sage@meander.net.cn
# Swagger配置
swagger:
# 是否开启swagger
enabled: true
title: API文档
description: 科技奖申报系统API文档
base-package: edu.ncst.award.controller
exclude-path: /error/**
termsOfServiceUrl: https://meander.net.cn
# 请求前缀
# pathMapping:
# 标题
title: '标题:YLY后台管理系统_接口文档'
# 描述
description: '描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...'
# 版本
version: '版本号: no'
# 作者信息
contact:
name: sage
url: www.meander.net.cn
email: sage@meander.net.cn
name: Gpu is all you need
email: 2778335106@qq.com
# url: https://gitee.com/JavaLionLi/RuoYi-Vue-Plus
groups:
# - name: 1.演示案例
# basePackage:
- name: 2.系统模块
basePackage: edu.ncst.award.controller
# - name: 3.代码生成模块
# basePackage:
knife4j:
# 是否开启Knife4j增强模式
enable: true
# 是否开启生产环境保护策略
production: false
basic:
enable: true
username: ruoyi
password: 123456
# 前端Ui的个性化配置属性
setting:
# 默认语言
language: zh-CN
# 是否显示Footer
enableFooter: false
# 是否开启动态参数调试功能
enableDynamicParameter: true
# 是否在每个Debug调试栏后显示刷新变量按钮
enableReloadCacheParameter: true

@ -64,13 +64,17 @@
</if>
</select>
<select id="getUserRolesById" resultType="Role">
SELECT *
FROM sys_role
WHERE id in (
SELECT `role_id`
FROM sys_user_role
LEFT JOIN sys_user ON sys_user_role.user_id = sys_user.id
AND sys_user.id = #{id})
select distinct sr.*
from sys_user su
left join sys_user_role sur on su.id = sur.user_id and user_id = #{userId}
right join sys_role sr on sr.id = su.id
</select>
<!-- # FROM sys_role-->
<!-- # SELECT *-->
<!-- # WHERE id in (-->
<!-- # SELECT `role_id`-->
<!-- # FROM sys_user_role-->
<!-- # LEFT JOIN sys_user ON sys_user_role.user_id = sys_user.id-->
<!-- # AND sys_user.id = #{id})-->
</mapper>

Loading…
Cancel
Save