feat: 升级SpringBoot3

This commit is contained in:
haoxr
2023-02-06 09:40:50 +08:00
parent 115de0bfcb
commit 9d73197bd8
43 changed files with 365 additions and 383 deletions

View File

@@ -1,10 +1,10 @@
# 项目简述 # 项目简述
项目基于 Spring Boot 2.7 、Spring Security 5.4 、 JWT 、 Redis 、 Mybatis-Plus 、 Knife4j 等技术栈搭建的前后端分离开源权限管理系统。 项目基于 Spring Boot 3.0 、Spring Security 6.0 、 JWT 、 Redis 、 Mybatis-Plus 、 Knife4j 等技术栈搭建的前后端分离开源权限管理系统。
## 项目特色 ## 项目特色
- Spring Boot 2.7 + Vue3 前后端分离单体应用,适合快速开发; - Spring Boot 3.0 + Vue3 前后端分离单体应用,适合快速开发;
- Spring Security + JWT 认证鉴权方案; - Spring Security + JWT 认证鉴权方案;
- 基于 RBAC 模型的权限设计,细粒度接口方法、按钮级别权限控制。 - 基于 RBAC 模型的权限设计,细粒度接口方法、按钮级别权限控制。

29
pom.xml
View File

@@ -13,7 +13,7 @@
<parent> <parent>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId> <artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.6</version> <version>3.0.2</version> <!-- lookup parent from repository -->
<relativePath/> <relativePath/>
</parent> </parent>
@@ -21,14 +21,13 @@
<maven.compiler.source>17</maven.compiler.source> <maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target> <maven.compiler.target>17</maven.compiler.target>
<lombok.version>1.18.24</lombok.version>
<hutool.version>5.7.21</hutool.version> <hutool.version>5.7.21</hutool.version>
<mysql.version>8.0.19</mysql.version> <mysql.version>8.0.19</mysql.version>
<druid.version>1.2.4</druid.version> <druid.version>1.2.4</druid.version>
<mybatis-plus.version>3.5.2</mybatis-plus.version> <mybatis-plus.version>3.5.3</mybatis-plus.version>
<knife4j.version>3.0.2</knife4j.version> <knife4j.version>4.0.0</knife4j.version>
<spring.boot.version>2.7.6</spring.boot.version> <spring.boot.version>2.7.6</spring.boot.version>
@@ -49,7 +48,7 @@
<dependency> <dependency>
<groupId>org.projectlombok</groupId> <groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId> <artifactId>lombok</artifactId>
<version>${lombok.version}</version> <optional>true</optional>
</dependency> </dependency>
<dependency> <dependency>
@@ -98,7 +97,7 @@
<dependency> <dependency>
<groupId>com.github.xiaoymin</groupId> <groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-spring-boot-starter</artifactId> <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
<version>${knife4j.version}</version> <version>${knife4j.version}</version>
</dependency> </dependency>
@@ -160,20 +159,20 @@
</dependencies> </dependencies>
<build> <build>
<finalName>${project.artifactId}</finalName>
<plugins> <plugins>
<plugin> <plugin>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId> <artifactId>spring-boot-maven-plugin</artifactId>
<version>${parent.version}</version> <configuration>
<executions> <excludes>
<execution> <exclude>
<goals> <groupId>org.projectlombok</groupId>
<goal>repackage</goal> <artifactId>lombok</artifactId>
</goals> </exclude>
</execution> </excludes>
</executions> </configuration>
</plugin> </plugin>
</plugins> </plugins>
</build> </build>
</project> </project>

View File

@@ -1,7 +1,7 @@
package com.youlai.system.common.base; package com.youlai.system.common.base;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
/** /**
@@ -11,12 +11,12 @@ import lombok.Data;
* @date 2021/2/28 * @date 2021/2/28
*/ */
@Data @Data
@ApiModel @Schema
public class BasePageQuery { public class BasePageQuery {
@ApiModelProperty(value = "页码", example = "1") @Schema(description = "页码", example = "1")
private int pageNum = 1; private int pageNum = 1;
@ApiModelProperty(value = "每页记录数", example = "10") @Schema(description = "每页记录数", example = "10")
private int pageSize = 10; private int pageSize = 10;
} }

View File

@@ -18,9 +18,9 @@ import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
import org.springframework.web.servlet.NoHandlerFoundException; import org.springframework.web.servlet.NoHandlerFoundException;
import javax.servlet.ServletException; import jakarta.servlet.ServletException;
import javax.validation.ConstraintViolation; import jakarta.validation.ConstraintViolation;
import javax.validation.ConstraintViolationException; import jakarta.validation.ConstraintViolationException;
import java.sql.SQLSyntaxErrorException; import java.sql.SQLSyntaxErrorException;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;

View File

@@ -3,10 +3,12 @@ package com.youlai.system.common.util;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.youlai.system.common.result.Result; import com.youlai.system.common.result.Result;
import com.youlai.system.common.result.ResultCode; import com.youlai.system.common.result.ResultCode;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import javax.servlet.http.HttpServletResponse; // import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
/** /**

View File

@@ -57,8 +57,10 @@ public class SecurityConfig {
@Bean @Bean
public WebSecurityCustomizer webSecurityCustomizer() { public WebSecurityCustomizer webSecurityCustomizer() {
return (web) -> web.ignoring() return (web) -> web.ignoring().requestMatchers("/api/v1/auth/login", "/webjars/**", "/doc.html",
.antMatchers("/api/v1/auth/login", "/webjars/**", "/doc.html", "/swagger-resources/**", "/v3/api-docs"); "/swagger-resources/**",
"/v3/api-docs/swagger-config",
"/v3/api-docs");
} }
@Bean @Bean

View File

@@ -1,82 +1,54 @@
package com.youlai.system.config; package com.youlai.system.config;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.RandomUtil;
import io.swagger.annotations.Api; import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import org.springdoc.core.customizers.GlobalOpenApiCustomizer;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import springfox.documentation.spi.service.contexts.SecurityContext;
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.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.ArrayList; import java.util.HashMap;
import java.util.List; import java.util.Map;
@Configuration @Configuration
@EnableSwagger2
public class SwaggerConfig { public class SwaggerConfig {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.OAS_30)
.apiInfo(apiInfo())
.groupName("权限服务")
//是否开启 (true 开启 false隐藏。生产环境建议隐藏)
//.enable(false)
.select()
//扫描的路径包,设置basePackage会将包下的所有被@Api标记类的所有方法作为api
.apis(RequestHandlerSelectors.withClassAnnotation(Api.class))
//指定路径处理PathSelectors.any()代表所有的路径
.paths(PathSelectors.any())
.build().securityContexts(CollectionUtil.newArrayList(securityContext()))
.securitySchemes(CollectionUtil.newArrayList(apiKey()));
}
/** /**
* 配置基本信息 * 根据@Tag 上的排序写入x-order
* *
* @return * @return the global open api customizer
*/ */
@Bean @Bean
public ApiInfo apiInfo() { public GlobalOpenApiCustomizer orderGlobalOpenApiCustomizer() {
return new ApiInfoBuilder() return openApi -> {
//设置文档标题(API名称) if (openApi.getTags() != null) {
.title("SpringBoot单体应用开发文档") openApi.getTags().forEach(tag -> {
//文档描述 Map<String, Object> map = new HashMap<>();
.description("快速开发文档-接口说明") map.put("x-order", RandomUtil.randomInt(0, 100));
//版本号 tag.setExtensions(map);
.version("1.0.0") });
//联系人 }
.contact(new Contact("", "http://localhost", "")) if (openApi.getPaths() != null) {
.build(); openApi.addExtension("x-test123", "333");
openApi.getPaths().addExtension("x-abb", RandomUtil.randomInt(1, 100));
}
};
} }
private List<SecurityScheme> securitySchemes() { @Bean
List<SecurityScheme> apiKeyList= new ArrayList<>(); public OpenAPI customOpenAPI() {
return new OpenAPI()
.info(new Info()
.title("XXX用户系统API")
.version("1.0")
apiKeyList.add(HttpAuthenticationScheme.JWT_BEARER_BUILDER.name("Authorization").build()); .description("Knife4j集成springdoc-openapi示例")
return apiKeyList; .termsOfService("http://doc.xiaominfo.com")
.license(new License().name("Apache 2.0")
.url("http://doc.xiaominfo.com")));
} }
private ApiKey apiKey() {
return new ApiKey("Authorization", "Authorization", "header");
}
List<SecurityReference> defaultAuth() {
AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
authorizationScopes[0] = authorizationScope;
return CollectionUtil.newArrayList(new SecurityReference("Authorization", authorizationScopes));
}
private SecurityContext securityContext() {
return SecurityContext.builder()
.securityReferences(defaultAuth())
//.forPaths(PathSelectors.regex(".*?208.*$"))
.build();
}
} }

View File

@@ -15,9 +15,9 @@ import org.springframework.http.converter.json.MappingJackson2HttpMessageConvert
import org.springframework.validation.beanvalidation.SpringConstraintValidatorFactory; import org.springframework.validation.beanvalidation.SpringConstraintValidatorFactory;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import javax.validation.Validation; import jakarta.validation.Validation;
import javax.validation.Validator; import jakarta.validation.Validator;
import javax.validation.ValidatorFactory; import jakarta.validation.ValidatorFactory;
import java.math.BigInteger; import java.math.BigInteger;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.List; import java.util.List;

View File

@@ -4,8 +4,8 @@ package com.youlai.system.controller;
import com.youlai.system.common.result.Result; import com.youlai.system.common.result.Result;
import com.youlai.system.pojo.dto.TokenResult; import com.youlai.system.pojo.dto.TokenResult;
import com.youlai.system.security.JwtTokenManager; import com.youlai.system.security.JwtTokenManager;
import io.swagger.annotations.Api; import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.annotations.ApiOperation; import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
@@ -13,7 +13,7 @@ import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@Api(tags = "认证管理") @Tag(name = "认证管理")
@RestController @RestController
@RequestMapping("/api/v1/auth") @RequestMapping("/api/v1/auth")
@RequiredArgsConstructor @RequiredArgsConstructor
@@ -21,7 +21,7 @@ public class AuthController {
private final AuthenticationManager authenticationManager; private final AuthenticationManager authenticationManager;
private final JwtTokenManager jwtTokenManager; private final JwtTokenManager jwtTokenManager;
@ApiOperation(value = "登录") @Operation(summary = "登录")
@PostMapping("/login") @PostMapping("/login")
public Result<TokenResult> login( public Result<TokenResult> login(
@RequestParam String username, @RequestParam String username,
@@ -41,7 +41,7 @@ public class AuthController {
return Result.success(tokenResult); return Result.success(tokenResult);
} }
@ApiOperation(value = "注销") @Operation(summary = "注销")
@DeleteMapping("/logout") @DeleteMapping("/logout")
public Result login() { public Result login() {
SecurityContextHolder.clearContext(); SecurityContextHolder.clearContext();

View File

@@ -3,15 +3,15 @@ package com.youlai.system.controller;
import com.youlai.system.common.result.Result; import com.youlai.system.common.result.Result;
import com.youlai.system.pojo.vo.file.FileInfo; import com.youlai.system.pojo.vo.file.FileInfo;
import com.youlai.system.service.FileService; import com.youlai.system.service.FileService;
import io.swagger.annotations.Api; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.annotations.ApiOperation; import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.annotations.ApiParam; import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@Api(tags = "文件接口") @Tag(name = "文件接口")
@RestController @RestController
@RequestMapping("/api/v1/files") @RequestMapping("/api/v1/files")
@RequiredArgsConstructor @RequiredArgsConstructor
@@ -20,19 +20,19 @@ public class FileController {
private final FileService fileService; private final FileService fileService;
@PostMapping @PostMapping
@ApiOperation(value = "文件上传") @Operation(summary = "文件上传")
public Result<FileInfo> uploadFile( public Result<FileInfo> uploadFile(
@ApiParam("表单文件对象") @RequestParam(value = "file") MultipartFile file @Parameter(name ="表单文件对象") @RequestParam(value = "file") MultipartFile file
) { ) {
FileInfo fileInfo = fileService.uploadFile(file); FileInfo fileInfo = fileService.uploadFile(file);
return Result.success(fileInfo); return Result.success(fileInfo);
} }
@DeleteMapping @DeleteMapping
@ApiOperation(value = "文件删除") @Operation(summary = "文件删除")
@SneakyThrows @SneakyThrows
public Result deleteFile( public Result deleteFile(
@ApiParam("文件路径") @RequestParam String filePath @Parameter(name ="文件路径") @RequestParam String filePath
) { ) {
boolean result = fileService.deleteFile(filePath); boolean result = fileService.deleteFile(filePath);
return Result.judge(result); return Result.judge(result);

View File

@@ -6,13 +6,14 @@ import com.youlai.system.pojo.form.DeptForm;
import com.youlai.system.pojo.query.DeptQuery; import com.youlai.system.pojo.query.DeptQuery;
import com.youlai.system.pojo.vo.dept.DeptVO; import com.youlai.system.pojo.vo.dept.DeptVO;
import com.youlai.system.service.SysDeptService; import com.youlai.system.service.SysDeptService;
import io.swagger.annotations.Api; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.annotations.ApiOperation; import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.annotations.ApiParam; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.validation.Valid; import jakarta.validation.Valid;
import java.util.List; import java.util.List;
/** /**
@@ -21,7 +22,7 @@ import java.util.List;
* @author haoxr * @author haoxr
* @date 2020/11/6 * @date 2020/11/6
*/ */
@Api(tags = "部门接口") @Tag(name = "部门接口")
@RestController @RestController
@RequestMapping("/api/v1/dept") @RequestMapping("/api/v1/dept")
@RequiredArgsConstructor @RequiredArgsConstructor
@@ -29,30 +30,30 @@ public class SysDeptController {
private final SysDeptService deptService; private final SysDeptService deptService;
@ApiOperation(value = "获取部门列表") @Operation(summary = "获取部门列表")
@GetMapping @GetMapping
public Result<List<DeptVO>> listDepartments(DeptQuery queryParams) { public Result<List<DeptVO>> listDepartments(DeptQuery queryParams) {
List<DeptVO> list = deptService.listDepartments(queryParams); List<DeptVO> list = deptService.listDepartments(queryParams);
return Result.success(list); return Result.success(list);
} }
@ApiOperation(value = "获取部门下拉选项") @Operation(summary = "获取部门下拉选项")
@GetMapping("/options") @GetMapping("/options")
public Result<List<Option>> listDeptOptions() { public Result<List<Option>> listDeptOptions() {
List<Option> list = deptService.listDeptOptions(); List<Option> list = deptService.listDeptOptions();
return Result.success(list); return Result.success(list);
} }
@ApiOperation(value = "获取部门详情") @Operation(summary = "获取部门详情")
@GetMapping("/{deptId}/form") @GetMapping("/{deptId}/form")
public Result<DeptForm> getDeptForm( public Result<DeptForm> getDeptForm(
@ApiParam("部门ID") @PathVariable Long deptId @Parameter(name ="部门ID") @PathVariable Long deptId
) { ) {
DeptForm deptForm = deptService.getDeptForm(deptId); DeptForm deptForm = deptService.getDeptForm(deptId);
return Result.success(deptForm); return Result.success(deptForm);
} }
@ApiOperation(value = "新增部门") @Operation(summary = "新增部门")
@PostMapping @PostMapping
public Result saveDept( public Result saveDept(
@Valid @RequestBody DeptForm formData @Valid @RequestBody DeptForm formData
@@ -61,7 +62,7 @@ public class SysDeptController {
return Result.success(id); return Result.success(id);
} }
@ApiOperation(value = "修改部门") @Operation(summary = "修改部门")
@PutMapping(value = "/{deptId}") @PutMapping(value = "/{deptId}")
public Result updateDept( public Result updateDept(
@PathVariable Long deptId, @PathVariable Long deptId,
@@ -71,10 +72,10 @@ public class SysDeptController {
return Result.success(deptId); return Result.success(deptId);
} }
@ApiOperation(value = "删除部门") @Operation(summary = "删除部门")
@DeleteMapping("/{ids}") @DeleteMapping("/{ids}")
public Result deleteDepartments( public Result deleteDepartments(
@ApiParam("部门ID多个以英文逗号(,)分割") @PathVariable("ids") String ids @Parameter(name ="部门ID多个以英文逗号(,)分割") @PathVariable("ids") String ids
) { ) {
boolean result = deptService.deleteByIds(ids); boolean result = deptService.deleteByIds(ids);
return Result.judge(result); return Result.judge(result);

View File

@@ -7,13 +7,14 @@ import com.youlai.system.pojo.form.DictItemForm;
import com.youlai.system.pojo.query.DictItemPageQuery; import com.youlai.system.pojo.query.DictItemPageQuery;
import com.youlai.system.pojo.vo.dict.DictItemPageVO; import com.youlai.system.pojo.vo.dict.DictItemPageVO;
import com.youlai.system.service.SysDictItemService; import com.youlai.system.service.SysDictItemService;
import io.swagger.annotations.Api; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.annotations.ApiOperation; import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.annotations.ApiParam; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@Api(tags = "字典数据接口") @Tag(name = "字典数据接口")
@RestController @RestController
@RequestMapping("/api/v1/dict/items") @RequestMapping("/api/v1/dict/items")
@RequiredArgsConstructor @RequiredArgsConstructor
@@ -21,7 +22,7 @@ public class SysDictItemController {
private final SysDictItemService dictItemService; private final SysDictItemService dictItemService;
@ApiOperation(value = "字典数据分页列表") @Operation(summary = "字典数据分页列表")
@GetMapping("/pages") @GetMapping("/pages")
public PageResult<DictItemPageVO> listDictItemPages( public PageResult<DictItemPageVO> listDictItemPages(
DictItemPageQuery queryParams DictItemPageQuery queryParams
@@ -30,16 +31,16 @@ public class SysDictItemController {
return PageResult.success(result); return PageResult.success(result);
} }
@ApiOperation(value = "字典数据表单数据") @Operation(summary = "字典数据表单数据")
@GetMapping("/{id}/form") @GetMapping("/{id}/form")
public Result<DictItemForm> getDictItemForm( public Result<DictItemForm> getDictItemForm(
@ApiParam("字典ID") @PathVariable Long id @Parameter(name ="字典ID") @PathVariable Long id
) { ) {
DictItemForm formData = dictItemService.getDictItemForm(id); DictItemForm formData = dictItemService.getDictItemForm(id);
return Result.success(formData); return Result.success(formData);
} }
@ApiOperation(value = "新增字典数据") @Operation(summary = "新增字典数据")
@PostMapping @PostMapping
public Result saveDictItem( public Result saveDictItem(
@RequestBody DictItemForm DictItemForm @RequestBody DictItemForm DictItemForm
@@ -48,7 +49,7 @@ public class SysDictItemController {
return Result.judge(result); return Result.judge(result);
} }
@ApiOperation(value = "修改字典数据") @Operation(summary = "修改字典数据")
@PutMapping("/{id}") @PutMapping("/{id}")
public Result updateDictItem( public Result updateDictItem(
@PathVariable Long id, @PathVariable Long id,
@@ -58,10 +59,10 @@ public class SysDictItemController {
return Result.judge(status); return Result.judge(status);
} }
@ApiOperation(value = "删除字典") @Operation(summary = "删除字典")
@DeleteMapping("/{ids}") @DeleteMapping("/{ids}")
public Result deleteDictItems( public Result deleteDictItems(
@ApiParam("字典ID多个以英文逗号(,)拼接") @PathVariable String ids @Parameter(name ="字典ID多个以英文逗号(,)拼接") @PathVariable String ids
) { ) {
boolean result = dictItemService.deleteDictItems(ids); boolean result = dictItemService.deleteDictItems(ids);
return Result.judge(result); return Result.judge(result);

View File

@@ -8,15 +8,16 @@ import com.youlai.system.pojo.form.DictTypeForm;
import com.youlai.system.pojo.query.DictTypePageQuery; import com.youlai.system.pojo.query.DictTypePageQuery;
import com.youlai.system.pojo.vo.dict.DictTypePageVO; import com.youlai.system.pojo.vo.dict.DictTypePageVO;
import com.youlai.system.service.SysDictTypeService; import com.youlai.system.service.SysDictTypeService;
import io.swagger.annotations.Api; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.annotations.ApiOperation; import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.annotations.ApiParam; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.List; import java.util.List;
@Api(tags = "字典类型接口") @Tag(name = "字典类型接口")
@RestController @RestController
@RequestMapping("/api/v1/dict/types") @RequestMapping("/api/v1/dict/types")
@RequiredArgsConstructor @RequiredArgsConstructor
@@ -24,49 +25,49 @@ public class SysDictTypeController {
private final SysDictTypeService dictTypeService; private final SysDictTypeService dictTypeService;
@ApiOperation(value = "字典类型分页列表") @Operation(summary = "字典类型分页列表")
@GetMapping("/pages") @GetMapping("/pages")
public PageResult<DictTypePageVO> listDictTypePages(DictTypePageQuery queryParams) { public PageResult<DictTypePageVO> listDictTypePages(DictTypePageQuery queryParams) {
Page<DictTypePageVO> result = dictTypeService.listDictTypePages(queryParams); Page<DictTypePageVO> result = dictTypeService.listDictTypePages(queryParams);
return PageResult.success(result); return PageResult.success(result);
} }
@ApiOperation(value = "字典类型表单详情") @Operation(summary = "字典类型表单详情")
@GetMapping("/{id}/form") @GetMapping("/{id}/form")
public Result<DictTypeForm> getDictTypeFormData( public Result<DictTypeForm> getDictTypeFormData(
@ApiParam("字典ID") @PathVariable Long id @Parameter(name ="字典ID") @PathVariable Long id
) { ) {
DictTypeForm dictTypeForm = dictTypeService.getDictTypeFormData(id); DictTypeForm dictTypeForm = dictTypeService.getDictTypeFormData(id);
return Result.success(dictTypeForm); return Result.success(dictTypeForm);
} }
@ApiOperation(value = "新增字典类型") @Operation(summary = "新增字典类型")
@PostMapping @PostMapping
public Result saveDictType(@RequestBody DictTypeForm dictTypeForm) { public Result saveDictType(@RequestBody DictTypeForm dictTypeForm) {
boolean result = dictTypeService.saveDictType(dictTypeForm); boolean result = dictTypeService.saveDictType(dictTypeForm);
return Result.judge(result); return Result.judge(result);
} }
@ApiOperation(value = "修改字典类型") @Operation(summary = "修改字典类型")
@PutMapping("/{id}") @PutMapping("/{id}")
public Result updateDict(@PathVariable Long id, @RequestBody DictTypeForm dictTypeForm) { public Result updateDict(@PathVariable Long id, @RequestBody DictTypeForm dictTypeForm) {
boolean status = dictTypeService.updateDictType(id, dictTypeForm); boolean status = dictTypeService.updateDictType(id, dictTypeForm);
return Result.judge(status); return Result.judge(status);
} }
@ApiOperation(value = "删除字典类型") @Operation(summary = "删除字典类型")
@DeleteMapping("/{ids}") @DeleteMapping("/{ids}")
public Result deleteDictTypes( public Result deleteDictTypes(
@ApiParam("字典类型ID多个以英文逗号(,)分割") @PathVariable String ids @Parameter(name ="字典类型ID多个以英文逗号(,)分割") @PathVariable String ids
) { ) {
boolean result = dictTypeService.deleteDictTypes(ids); boolean result = dictTypeService.deleteDictTypes(ids);
return Result.judge(result); return Result.judge(result);
} }
@ApiOperation(value = "获取字典类型的数据项") @Operation(summary = "获取字典类型的数据项")
@GetMapping("/{typeCode}/items") @GetMapping("/{typeCode}/items")
public Result<List<Option>> listDictItemsByTypeCode( public Result<List<Option>> listDictItemsByTypeCode(
@ApiParam("字典类型编码") @PathVariable String typeCode @Parameter(name ="字典类型编码") @PathVariable String typeCode
) { ) {
List<Option> list = dictTypeService.listDictItemsByTypeCode(typeCode); List<Option> list = dictTypeService.listDictItemsByTypeCode(typeCode);
return Result.success(list); return Result.success(list);

View File

@@ -8,9 +8,10 @@ import com.youlai.system.pojo.vo.menu.MenuVO;
import com.youlai.system.pojo.vo.menu.ResourceVO; import com.youlai.system.pojo.vo.menu.ResourceVO;
import com.youlai.system.pojo.vo.menu.RouteVO; import com.youlai.system.pojo.vo.menu.RouteVO;
import com.youlai.system.service.SysMenuService; import com.youlai.system.service.SysMenuService;
import io.swagger.annotations.Api; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.annotations.ApiOperation; import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.annotations.ApiParam; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CacheEvict;
@@ -25,7 +26,7 @@ import java.util.List;
* @author haoxr * @author haoxr
* @date 2020/11/06 * @date 2020/11/06
*/ */
@Api(tags = "菜单接口") @Tag(name = "菜单接口")
@RestController @RestController
@RequestMapping("/api/v1/menus") @RequestMapping("/api/v1/menus")
@RequiredArgsConstructor @RequiredArgsConstructor
@@ -34,44 +35,44 @@ public class SysMenuController {
private final SysMenuService menuService; private final SysMenuService menuService;
@ApiOperation(value = "资源(菜单+权限)列表") @Operation(summary = "资源(菜单+权限)列表")
@GetMapping("/resources") @GetMapping("/resources")
public Result<List<ResourceVO>> listResources() { public Result<List<ResourceVO>> listResources() {
List<ResourceVO> resources = menuService.listResources(); List<ResourceVO> resources = menuService.listResources();
return Result.success(resources); return Result.success(resources);
} }
@ApiOperation(value = "菜单列表") @Operation(summary = "菜单列表")
@GetMapping @GetMapping
public Result listMenus(MenuQuery queryParams) { public Result listMenus(MenuQuery queryParams) {
List<MenuVO> menuList = menuService.listMenus(queryParams); List<MenuVO> menuList = menuService.listMenus(queryParams);
return Result.success(menuList); return Result.success(menuList);
} }
@ApiOperation(value = "菜单下拉列表") @Operation(summary = "菜单下拉列表")
@GetMapping("/options") @GetMapping("/options")
public Result listMenuOptions() { public Result listMenuOptions() {
List<Option> menus = menuService.listMenuOptions(); List<Option> menus = menuService.listMenuOptions();
return Result.success(menus); return Result.success(menus);
} }
@ApiOperation(value = "路由列表") @Operation(summary = "路由列表")
@GetMapping("/routes") @GetMapping("/routes")
public Result listRoutes() { public Result listRoutes() {
List<RouteVO> routeList = menuService.listRoutes(); List<RouteVO> routeList = menuService.listRoutes();
return Result.success(routeList); return Result.success(routeList);
} }
@ApiOperation(value = "菜单详情") @Operation(summary = "菜单详情")
@GetMapping("/{id}") @GetMapping("/{id}")
public Result detail( public Result detail(
@ApiParam(value = "菜单ID") @PathVariable Long id @Parameter(name = "菜单ID") @PathVariable Long id
) { ) {
SysMenu menu = menuService.getById(id); SysMenu menu = menuService.getById(id);
return Result.success(menu); return Result.success(menu);
} }
@ApiOperation(value = "新增菜单") @Operation(summary = "新增菜单")
@PostMapping @PostMapping
@CacheEvict(cacheNames = "system", key = "'routes'") @CacheEvict(cacheNames = "system", key = "'routes'")
public Result addMenu(@RequestBody SysMenu menu) { public Result addMenu(@RequestBody SysMenu menu) {
@@ -79,7 +80,7 @@ public class SysMenuController {
return Result.judge(result); return Result.judge(result);
} }
@ApiOperation(value = "修改菜单") @Operation(summary = "修改菜单")
@PutMapping(value = "/{id}") @PutMapping(value = "/{id}")
@CacheEvict(cacheNames = "system", key = "'routes'") @CacheEvict(cacheNames = "system", key = "'routes'")
public Result updateMenu( public Result updateMenu(
@@ -89,21 +90,21 @@ public class SysMenuController {
return Result.judge(result); return Result.judge(result);
} }
@ApiOperation(value = "删除菜单") @Operation(summary = "删除菜单")
@DeleteMapping("/{ids}") @DeleteMapping("/{ids}")
@CacheEvict(cacheNames = "system", key = "'routes'") @CacheEvict(cacheNames = "system", key = "'routes'")
public Result deleteMenus( public Result deleteMenus(
@ApiParam("菜单ID多个以英文(,)分割") @PathVariable("ids") String ids @Parameter(name ="菜单ID多个以英文(,)分割") @PathVariable("ids") String ids
) { ) {
boolean result = menuService.removeByIds(Arrays.asList(ids.split(","))); boolean result = menuService.removeByIds(Arrays.asList(ids.split(",")));
return Result.judge(result); return Result.judge(result);
} }
@ApiOperation(value = "修改菜单显示状态") @Operation(summary = "修改菜单显示状态")
@PatchMapping("/{menuId}") @PatchMapping("/{menuId}")
public Result updateMenuVisible( public Result updateMenuVisible(
@ApiParam(value = "菜单ID") @PathVariable Long menuId, @Parameter(name = "菜单ID") @PathVariable Long menuId,
@ApiParam(value = "显示状态(1:显示;0:隐藏)") Integer visible @Parameter(name = "显示状态(1:显示;0:隐藏)") Integer visible
) { ) {
boolean result =menuService.updateMenuVisible(menuId, visible); boolean result =menuService.updateMenuVisible(menuId, visible);

View File

@@ -9,16 +9,17 @@ import com.youlai.system.pojo.form.RoleForm;
import com.youlai.system.pojo.query.RolePageQuery; import com.youlai.system.pojo.query.RolePageQuery;
import com.youlai.system.pojo.vo.role.RolePageVO; import com.youlai.system.pojo.vo.role.RolePageVO;
import com.youlai.system.service.SysRoleService; import com.youlai.system.service.SysRoleService;
import io.swagger.annotations.Api; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.annotations.ApiOperation; import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.annotations.ApiParam; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.validation.Valid; import jakarta.validation.Valid;
import java.util.List; import java.util.List;
@Api(tags = "角色接口") @Tag(name = "角色接口")
@RestController @RestController
@RequestMapping("/api/v1/roles") @RequestMapping("/api/v1/roles")
@RequiredArgsConstructor @RequiredArgsConstructor
@@ -26,72 +27,72 @@ public class SysRoleController {
private final SysRoleService roleService; private final SysRoleService roleService;
@ApiOperation(value = "角色分页列表") @Operation(summary = "角色分页列表")
@GetMapping("/pages") @GetMapping("/pages")
public PageResult<RolePageVO> listRolePages(RolePageQuery queryParams) { public PageResult<RolePageVO> listRolePages(RolePageQuery queryParams) {
Page<RolePageVO> result = roleService.listRolePages(queryParams); Page<RolePageVO> result = roleService.listRolePages(queryParams);
return PageResult.success(result); return PageResult.success(result);
} }
@ApiOperation(value = "角色下拉列表") @Operation(summary = "角色下拉列表")
@GetMapping("/options") @GetMapping("/options")
public Result<List<Option>> listRoleOptions() { public Result<List<Option>> listRoleOptions() {
List<Option> list = roleService.listRoleOptions(); List<Option> list = roleService.listRoleOptions();
return Result.success(list); return Result.success(list);
} }
@ApiOperation(value = "角色详情") @Operation(summary = "角色详情")
@GetMapping("/{roleId}") @GetMapping("/{roleId}")
public Result getRoleDetail( public Result getRoleDetail(
@ApiParam("角色ID") @PathVariable Long roleId @Parameter(name ="角色ID") @PathVariable Long roleId
) { ) {
SysRole role = roleService.getById(roleId); SysRole role = roleService.getById(roleId);
return Result.success(role); return Result.success(role);
} }
@ApiOperation(value = "新增角色") @Operation(summary = "新增角色")
@PostMapping @PostMapping
public Result addRole(@Valid @RequestBody RoleForm roleForm) { public Result addRole(@Valid @RequestBody RoleForm roleForm) {
boolean result = roleService.saveRole(roleForm); boolean result = roleService.saveRole(roleForm);
return Result.judge(result); return Result.judge(result);
} }
@ApiOperation(value = "修改角色") @Operation(summary = "修改角色")
@PutMapping(value = "/{id}") @PutMapping(value = "/{id}")
public Result updateRole(@Valid @RequestBody RoleForm roleForm) { public Result updateRole(@Valid @RequestBody RoleForm roleForm) {
boolean result = roleService.saveRole(roleForm); boolean result = roleService.saveRole(roleForm);
return Result.judge(result); return Result.judge(result);
} }
@ApiOperation(value = "删除角色") @Operation(summary = "删除角色")
@DeleteMapping("/{ids}") @DeleteMapping("/{ids}")
public Result deleteRoles( public Result deleteRoles(
@ApiParam("删除角色,多个以英文逗号(,)分割") @PathVariable String ids @Parameter(name ="删除角色,多个以英文逗号(,)分割") @PathVariable String ids
) { ) {
boolean result = roleService.deleteRoles(ids); boolean result = roleService.deleteRoles(ids);
return Result.judge(result); return Result.judge(result);
} }
@ApiOperation(value = "修改角色状态") @Operation(summary = "修改角色状态")
@PutMapping(value = "/{roleId}/status") @PutMapping(value = "/{roleId}/status")
public Result updateRoleStatus( public Result updateRoleStatus(
@ApiParam("角色ID") @PathVariable Long roleId, @Parameter(name ="角色ID") @PathVariable Long roleId,
@ApiParam("角色状态:1-启用0-禁用") @RequestParam Integer status @Parameter(name ="角色状态:1-启用0-禁用") @RequestParam Integer status
) { ) {
boolean result = roleService.updateRoleStatus(roleId, status); boolean result = roleService.updateRoleStatus(roleId, status);
return Result.judge(result); return Result.judge(result);
} }
@ApiOperation(value = "获取角色的菜单ID集合") @Operation(summary = "获取角色的菜单ID集合")
@GetMapping("/{roleId}/menuIds") @GetMapping("/{roleId}/menuIds")
public Result<List<Long>> getRoleMenuIds( public Result<List<Long>> getRoleMenuIds(
@ApiParam("角色ID") @PathVariable Long roleId @Parameter(name ="角色ID") @PathVariable Long roleId
) { ) {
List<Long> resourceIds = roleService.getRoleMenuIds(roleId); List<Long> resourceIds = roleService.getRoleMenuIds(roleId);
return Result.success(resourceIds); return Result.success(resourceIds);
} }
@ApiOperation(value = "分配角色的资源权限") @Operation(summary = "分配角色的资源权限")
@PutMapping("/{roleId}/menus") @PutMapping("/{roleId}/menus")
public Result updateRoleMenus( public Result updateRoleMenus(
@PathVariable Long roleId, @PathVariable Long roleId,

View File

@@ -14,17 +14,18 @@ import com.youlai.system.pojo.vo.user.UserExportVO;
import com.youlai.system.pojo.vo.user.UserLoginVO; import com.youlai.system.pojo.vo.user.UserLoginVO;
import com.youlai.system.pojo.vo.user.UserVO; import com.youlai.system.pojo.vo.user.UserVO;
import com.youlai.system.service.SysUserService; import com.youlai.system.service.SysUserService;
import io.swagger.annotations.Api; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.annotations.ApiOperation; import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.annotations.ApiParam; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.servlet.ServletOutputStream; import jakarta.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import javax.validation.Valid; import jakarta.validation.Valid;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
@@ -37,7 +38,7 @@ import java.util.List;
* @author haoxr * @author haoxr
* @date 2022/10/16 * @date 2022/10/16
*/ */
@Api(tags = "用户接口") @Tag(name = "用户接口")
@RestController @RestController
@RequestMapping("/api/v1/users") @RequestMapping("/api/v1/users")
@RequiredArgsConstructor @RequiredArgsConstructor
@@ -45,23 +46,23 @@ public class SysUserController {
private final SysUserService userService; private final SysUserService userService;
@ApiOperation(value = "用户分页列表") @Operation(summary = "用户分页列表")
@GetMapping("/pages") @GetMapping("/pages")
public PageResult<UserVO> listUserPages(UserPageQuery queryParams) { public PageResult<UserVO> listUserPages(UserPageQuery queryParams) {
IPage<UserVO> result = userService.listUserPages(queryParams); IPage<UserVO> result = userService.listUserPages(queryParams);
return PageResult.success(result); return PageResult.success(result);
} }
@ApiOperation(value = "用户表单数据") @Operation(summary = "用户表单数据")
@GetMapping("/{userId}/form") @GetMapping("/{userId}/form")
public Result<UserForm> getUserDetail( public Result<UserForm> getUserDetail(
@ApiParam(value = "用户ID") @PathVariable Long userId @Parameter(name = "用户ID") @PathVariable Long userId
) { ) {
UserForm formData = userService.getUserFormData(userId); UserForm formData = userService.getUserFormData(userId);
return Result.success(formData); return Result.success(formData);
} }
@ApiOperation(value = "新增用户") @Operation(summary = "新增用户")
@PostMapping @PostMapping
@PreAuthorize("@pms.hasPermission('sys:user:add')") @PreAuthorize("@pms.hasPermission('sys:user:add')")
public Result saveUser( public Result saveUser(
@@ -71,41 +72,41 @@ public class SysUserController {
return Result.judge(result); return Result.judge(result);
} }
@ApiOperation(value = "修改用户") @Operation(summary = "修改用户")
@PutMapping(value = "/{userId}") @PutMapping(value = "/{userId}")
@PreAuthorize("@pms.hasPermission('sys:user:edit')") @PreAuthorize("@pms.hasPermission('sys:user:edit')")
public Result updateUser( public Result updateUser(
@ApiParam("用户ID") @PathVariable Long userId, @Parameter(name ="用户ID") @PathVariable Long userId,
@RequestBody @Validated UserForm userForm) { @RequestBody @Validated UserForm userForm) {
boolean result = userService.updateUser(userId, userForm); boolean result = userService.updateUser(userId, userForm);
return Result.judge(result); return Result.judge(result);
} }
@ApiOperation(value = "删除用户") @Operation(summary = "删除用户")
@DeleteMapping("/{ids}") @DeleteMapping("/{ids}")
@PreAuthorize("@pms.hasPermission('sys:user:delete')") @PreAuthorize("@pms.hasPermission('sys:user:delete')")
public Result deleteUsers( public Result deleteUsers(
@ApiParam("用户ID多个以英文逗号(,)分割") @PathVariable String ids @Parameter(name ="用户ID多个以英文逗号(,)分割") @PathVariable String ids
) { ) {
boolean result = userService.deleteUsers(ids); boolean result = userService.deleteUsers(ids);
return Result.judge(result); return Result.judge(result);
} }
@ApiOperation(value = "修改用户密码") @Operation(summary = "修改用户密码")
@PatchMapping(value = "/{userId}/password") @PatchMapping(value = "/{userId}/password")
public Result updatePassword( public Result updatePassword(
@ApiParam("用户ID") @PathVariable Long userId, @Parameter(name ="用户ID") @PathVariable Long userId,
@RequestParam String password @RequestParam String password
) { ) {
boolean result = userService.updatePassword(userId, password); boolean result = userService.updatePassword(userId, password);
return Result.judge(result); return Result.judge(result);
} }
@ApiOperation(value = "修改用户状态") @Operation(summary = "修改用户状态")
@PatchMapping(value = "/{userId}/status") @PatchMapping(value = "/{userId}/status")
public Result updatePassword( public Result updatePassword(
@ApiParam("用户ID") @PathVariable Long userId, @Parameter(name ="用户ID") @PathVariable Long userId,
@ApiParam("用户状态(1:启用;0:禁用)") @RequestParam Integer status @Parameter(name ="用户状态(1:启用;0:禁用)") @RequestParam Integer status
) { ) {
boolean result = userService.update(new LambdaUpdateWrapper<SysUser>() boolean result = userService.update(new LambdaUpdateWrapper<SysUser>()
.eq(SysUser::getId, userId) .eq(SysUser::getId, userId)
@@ -114,14 +115,14 @@ public class SysUserController {
return Result.judge(result); return Result.judge(result);
} }
@ApiOperation(value = "获取登录用户信息") @Operation(summary = "获取登录用户信息")
@GetMapping("/me") @GetMapping("/me")
public Result<UserLoginVO> getUserLoginInfo() { public Result<UserLoginVO> getUserLoginInfo() {
UserLoginVO userLoginVO = userService.getUserLoginInfo(); UserLoginVO userLoginVO = userService.getUserLoginInfo();
return Result.success(userLoginVO); return Result.success(userLoginVO);
} }
@ApiOperation("用户导入模板下载") @Operation(summary ="用户导入模板下载")
@GetMapping("/template") @GetMapping("/template")
public void downloadTemplate(HttpServletResponse response) throws IOException { public void downloadTemplate(HttpServletResponse response) throws IOException {
String fileName = "用户导入模板.xlsx"; String fileName = "用户导入模板.xlsx";
@@ -137,14 +138,14 @@ public class SysUserController {
excelWriter.finish(); excelWriter.finish();
} }
@ApiOperation("导入用户") @Operation(summary ="导入用户")
@PostMapping("/_import") @PostMapping("/_import")
public Result importUsers(UserImportDTO userImportDTO) throws IOException { public Result importUsers(UserImportDTO userImportDTO) throws IOException {
String msg = userService.importUsers(userImportDTO); String msg = userService.importUsers(userImportDTO);
return Result.success(msg); return Result.success(msg);
} }
@ApiOperation("导出用户") @Operation(summary ="导出用户")
@GetMapping("/_export") @GetMapping("/_export")
public void exportUsers(UserPageQuery queryParams, HttpServletResponse response) throws IOException { public void exportUsers(UserPageQuery queryParams, HttpServletResponse response) throws IOException {
String fileName = "用户列表.xlsx"; String fileName = "用户列表.xlsx";

View File

@@ -1,8 +1,8 @@
package com.youlai.system.pojo; package com.youlai.system.pojo;
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@@ -14,7 +14,7 @@ import java.util.List;
* @author haoxr * @author haoxr
* @date 2022/1/22 * @date 2022/1/22
*/ */
@ApiModel("下拉选项对象") @Schema(description ="下拉选项对象")
@Data @Data
@NoArgsConstructor @NoArgsConstructor
public class Option<T> { public class Option<T> {
@@ -30,10 +30,10 @@ public class Option<T> {
this.children= children; this.children= children;
} }
@ApiModelProperty("选项的值") @Schema(description="选项的值")
private T value; private T value;
@ApiModelProperty("选项的标签") @Schema(description="选项的标签")
private String label; private String label;
@JsonInclude(value = JsonInclude.Include.NON_EMPTY) @JsonInclude(value = JsonInclude.Include.NON_EMPTY)

View File

@@ -1,30 +1,29 @@
package com.youlai.system.pojo.form; package com.youlai.system.pojo.form;
import com.youlai.system.common.base.BaseEntity; import com.youlai.system.common.base.BaseEntity;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import javax.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
@ApiModel("部门表单对象") @Schema(description = "部门表单对象")
@Data @Data
public class DeptForm extends BaseEntity { public class DeptForm extends BaseEntity {
@ApiModelProperty("部门ID(新增不填)") @Schema(description="部门ID(新增不填)")
private Long id; private Long id;
@ApiModelProperty("部门名称") @Schema(description="部门名称")
private String name; private String name;
@ApiModelProperty("父部门ID") @Schema(description="父部门ID")
@NotNull(message = "父部门ID不能为空") @NotNull(message = "父部门ID不能为空")
private Long parentId; private Long parentId;
@ApiModelProperty("状态") @Schema(description="状态")
private Integer status; private Integer status;
@ApiModelProperty("排序") @Schema(description="排序")
private Integer sort; private Integer sort;
} }

View File

@@ -1,30 +1,31 @@
package com.youlai.system.pojo.form; package com.youlai.system.pojo.form;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
@ApiModel("字典数据项") @Schema(description = "字典数据项")
@Data @Data
public class DictItemForm { public class DictItemForm {
@ApiModelProperty("数据项ID") @Schema(description="数据项ID")
private Long id; private Long id;
@ApiModelProperty("类型编码") @Schema(description="类型编码")
private String typeCode; private String typeCode;
@ApiModelProperty("数据项名称") @Schema(description="数据项名称")
private String name; private String name;
@ApiModelProperty("") @Schema(description="")
private String value; private String value;
@ApiModelProperty("状态1->启用;0->禁用") @Schema(description="状态1->启用;0->禁用")
private Integer status; private Integer status;
@ApiModelProperty("排序") @Schema(description="排序")
private Integer sort; private Integer sort;
} }

View File

@@ -1,24 +1,25 @@
package com.youlai.system.pojo.form; package com.youlai.system.pojo.form;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
@ApiModel("字典类型") @Schema(description = "字典类型")
@Data @Data
public class DictTypeForm { public class DictTypeForm {
@ApiModelProperty("字典类型ID") @Schema(description="字典类型ID")
private Long id; private Long id;
@ApiModelProperty("类型名称") @Schema(description="类型名称")
private String name; private String name;
@ApiModelProperty("类型编码") @Schema(description="类型编码")
private String code; private String code;
@ApiModelProperty("类型状态1->启用;0->禁用") @Schema(description="类型状态1->启用;0->禁用")
private Integer status; private Integer status;
} }

View File

@@ -1,33 +1,33 @@
package com.youlai.system.pojo.form; package com.youlai.system.pojo.form;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import javax.validation.constraints.NotBlank; // import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotBlank;
@ApiModel("角色表单对象") @Schema(description = "角色表单对象")
@Data @Data
public class RoleForm { public class RoleForm {
@ApiModelProperty("角色ID") @Schema(description="角色ID")
private Long id; private Long id;
@ApiModelProperty("角色名称") @Schema(description="角色名称")
@NotBlank(message = "角色名称不能为空") @NotBlank(message = "角色名称不能为空")
private String name; private String name;
@ApiModelProperty("角色编码") @Schema(description="角色编码")
@NotBlank(message = "角色编码不能为空") @NotBlank(message = "角色编码不能为空")
private String code; private String code;
@ApiModelProperty("排序") @Schema(description="排序")
private Integer sort; private Integer sort;
@ApiModelProperty("角色状态(1-正常0-停用)") @Schema(description="角色状态(1-正常0-停用)")
private Integer status; private Integer status;
@ApiModelProperty("数据权限") @Schema(description="数据权限")
private Integer dataScope; private Integer dataScope;
} }

View File

@@ -1,20 +1,20 @@
package com.youlai.system.pojo.form; package com.youlai.system.pojo.form;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import java.util.List; import java.util.List;
@ApiModel("菜单资源表单") @Schema(description ="菜单资源表单")
@Data @Data
public class RoleResourceForm { public class RoleResourceForm {
@ApiModelProperty("菜单ID集合") @Schema(description="菜单ID集合")
private List<Long> menuIds; private List<Long> menuIds;
@ApiModelProperty("权限ID集合") @Schema(description="权限ID集合")
private List<Long> permIds; private List<Long> permIds;
} }

View File

@@ -1,12 +1,12 @@
package com.youlai.system.pojo.form; package com.youlai.system.pojo.form;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import javax.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotEmpty;
import javax.validation.constraints.Pattern; import jakarta.validation.constraints.Pattern;
import java.util.List; import java.util.List;
/** /**
@@ -15,40 +15,40 @@ import java.util.List;
* @author haoxr * @author haoxr
* @date 2022/4/12 11:04 * @date 2022/4/12 11:04
*/ */
@ApiModel @Schema
@Data @Data
public class UserForm { public class UserForm {
@ApiModelProperty("用户ID") @Schema(description="用户ID")
private Long id; private Long id;
@ApiModelProperty("用户名") @Schema(description="用户名")
@NotBlank(message = "用户名不能为空") @NotBlank(message = "用户名不能为空")
private String username; private String username;
@ApiModelProperty("昵称") @Schema(description="昵称")
@NotBlank(message = "昵称不能为空") @NotBlank(message = "昵称不能为空")
private String nickname; private String nickname;
@Pattern(regexp = "^1(3\\d|4[5-9]|5[0-35-9]|6[2567]|7[0-8]|8\\d|9[0-35-9])\\d{8}$", message = "{phone.valid}") @Pattern(regexp = "^1(3\\d|4[5-9]|5[0-35-9]|6[2567]|7[0-8]|8\\d|9[0-35-9])\\d{8}$", message = "{phone.valid}")
private String mobile; private String mobile;
@ApiModelProperty("性别") @Schema(description="性别")
private Integer gender; private Integer gender;
@ApiModelProperty("用户头像") @Schema(description="用户头像")
private String avatar; private String avatar;
@ApiModelProperty("邮箱") @Schema(description="邮箱")
private String email; private String email;
@ApiModelProperty("用户状态(1:正常;0:禁用)") @Schema(description="用户状态(1:正常;0:禁用)")
private Integer status; private Integer status;
@ApiModelProperty("部门ID") @Schema(description="部门ID")
private Long deptId; private Long deptId;
@ApiModelProperty("角色ID集合") @Schema(description="角色ID集合")
@NotEmpty(message = "用户角色不能为空") @NotEmpty(message = "用户角色不能为空")
private List<Long> roleIds; private List<Long> roleIds;

View File

@@ -1,7 +1,7 @@
package com.youlai.system.pojo.query; package com.youlai.system.pojo.query;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
/** /**
@@ -10,14 +10,14 @@ import lombok.Data;
* @author haoxr * @author haoxr
* @date 2022/6/11 * @date 2022/6/11
*/ */
@ApiModel("部门分页查询对象") @Schema(description ="部门分页查询对象")
@Data @Data
public class DeptQuery { public class DeptQuery {
@ApiModelProperty("关键字(部门名称)") @Schema(description="关键字(部门名称)")
private String keywords; private String keywords;
@ApiModelProperty("状态(1->正常0->禁用)") @Schema(description="状态(1->正常0->禁用)")
private Integer status; private Integer status;
} }

View File

@@ -2,17 +2,17 @@ package com.youlai.system.pojo.query;
import com.youlai.system.common.base.BasePageQuery; import com.youlai.system.common.base.BasePageQuery;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
@ApiModel("字典数据项分页查询对象") @Schema(description ="字典数据项分页查询对象")
@Data @Data
public class DictItemPageQuery extends BasePageQuery { public class DictItemPageQuery extends BasePageQuery {
@ApiModelProperty("关键字(字典项名称)") @Schema(description="关键字(字典项名称)")
private String keywords; private String keywords;
@ApiModelProperty("字典类型编码") @Schema(description="字典类型编码")
private String typeCode; private String typeCode;
} }

View File

@@ -2,15 +2,15 @@ package com.youlai.system.pojo.query;
import com.youlai.system.common.base.BasePageQuery; import com.youlai.system.common.base.BasePageQuery;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
@ApiModel("字典类型分页查询对象") @Schema(description ="字典类型分页查询对象")
@Data @Data
public class DictTypePageQuery extends BasePageQuery { public class DictTypePageQuery extends BasePageQuery {
@ApiModelProperty("关键字(类型名称/类型编码)") @Schema(description="关键字(类型名称/类型编码)")
private String keywords; private String keywords;
} }

View File

@@ -1,7 +1,7 @@
package com.youlai.system.pojo.query; package com.youlai.system.pojo.query;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
/** /**
@@ -10,14 +10,14 @@ import lombok.Data;
* @author haoxr * @author haoxr
* @date 2022/10/28 * @date 2022/10/28
*/ */
@ApiModel("部门分页查询对象") @Schema(description ="部门分页查询对象")
@Data @Data
public class MenuQuery { public class MenuQuery {
@ApiModelProperty("关键字(菜单名称)") @Schema(description="关键字(菜单名称)")
private String keywords; private String keywords;
@ApiModelProperty("状态(1->显示0->隐藏)") @Schema(description="状态(1->显示0->隐藏)")
private Integer status; private Integer status;
} }

View File

@@ -1,8 +1,8 @@
package com.youlai.system.pojo.query; package com.youlai.system.pojo.query;
import com.youlai.system.common.base.BasePageQuery; import com.youlai.system.common.base.BasePageQuery;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
/** /**
@@ -12,13 +12,13 @@ import lombok.Data;
* @date 2022/1/14 22:22 * @date 2022/1/14 22:22
*/ */
@Data @Data
@ApiModel @Schema
public class PermPageQuery extends BasePageQuery { public class PermPageQuery extends BasePageQuery {
@ApiModelProperty("权限名称") @Schema(description="权限名称")
private String name; private String name;
@ApiModelProperty("菜单ID") @Schema(description="菜单ID")
private Long menuId; private Long menuId;
} }

View File

@@ -1,7 +1,7 @@
package com.youlai.system.pojo.query; package com.youlai.system.pojo.query;
import com.youlai.system.common.base.BasePageQuery; import com.youlai.system.common.base.BasePageQuery;
import io.swagger.annotations.ApiModelProperty; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
/** /**
@@ -14,6 +14,6 @@ import lombok.Data;
@Data @Data
public class RolePageQuery extends BasePageQuery { public class RolePageQuery extends BasePageQuery {
@ApiModelProperty("关键字(角色名称/角色编码)") @Schema(description="关键字(角色名称/角色编码)")
private String keywords; private String keywords;
} }

View File

@@ -1,8 +1,8 @@
package com.youlai.system.pojo.query; package com.youlai.system.pojo.query;
import com.youlai.system.common.base.BasePageQuery; import com.youlai.system.common.base.BasePageQuery;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
/** /**
@@ -11,17 +11,17 @@ import lombok.Data;
* @author haoxr * @author haoxr
* @date 2022/1/14 * @date 2022/1/14
*/ */
@ApiModel @Schema
@Data @Data
public class UserPageQuery extends BasePageQuery { public class UserPageQuery extends BasePageQuery {
@ApiModelProperty("关键字(用户名/昵称/手机号)") @Schema(description="关键字(用户名/昵称/手机号)")
private String keywords; private String keywords;
@ApiModelProperty("用户状态") @Schema(description="用户状态")
private Integer status; private Integer status;
@ApiModelProperty("部门ID") @Schema(description="部门ID")
private Long deptId; private Long deptId;
} }

View File

@@ -1,24 +1,24 @@
package com.youlai.system.pojo.vo.dict; package com.youlai.system.pojo.vo.dict;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
@ApiModel("字典数据项分页对象") @Schema(description ="字典数据项分页对象")
@Data @Data
public class DictItemPageVO { public class DictItemPageVO {
@ApiModelProperty("数据项ID") @Schema(description="数据项ID")
private Long id; private Long id;
@ApiModelProperty("数据项名称") @Schema(description="数据项名称")
private String name; private String name;
@ApiModelProperty("") @Schema(description="")
private String value; private String value;
@ApiModelProperty("类型状态1->启用;0->禁用") @Schema(description="类型状态1->启用;0->禁用")
private Integer status; private Integer status;
} }

View File

@@ -1,24 +1,24 @@
package com.youlai.system.pojo.vo.dict; package com.youlai.system.pojo.vo.dict;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
@ApiModel("字典类型") @Schema(description ="字典类型")
@Data @Data
public class DictTypePageVO { public class DictTypePageVO {
@ApiModelProperty("字典类型ID") @Schema(description="字典类型ID")
private Long id; private Long id;
@ApiModelProperty("类型名称") @Schema(description="类型名称")
private String name; private String name;
@ApiModelProperty("类型编码") @Schema(description="类型编码")
private String code; private String code;
@ApiModelProperty("类型状态1->启用;0->禁用") @Schema(description="类型状态1->启用;0->禁用")
private Integer status; private Integer status;
} }

View File

@@ -2,13 +2,13 @@ package com.youlai.system.pojo.vo.menu;
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude;
import com.youlai.system.common.enums.MenuTypeEnum; import com.youlai.system.common.enums.MenuTypeEnum;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import java.util.List; import java.util.List;
@ApiModel("菜单视图对象") @Schema(description ="菜单视图对象")
@Data @Data
public class MenuVO { public class MenuVO {
@@ -32,10 +32,10 @@ public class MenuVO {
private String redirect; private String redirect;
@ApiModelProperty("菜单类型") @Schema(description="菜单类型")
private MenuTypeEnum type; private MenuTypeEnum type;
@ApiModelProperty("按钮权限标识") @Schema(description="按钮权限标识")
private String perm; private String perm;
@JsonInclude(value = JsonInclude.Include.NON_NULL) @JsonInclude(value = JsonInclude.Include.NON_NULL)

View File

@@ -1,23 +1,23 @@
package com.youlai.system.pojo.vo.menu; package com.youlai.system.pojo.vo.menu;
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import java.util.List; import java.util.List;
@ApiModel("资源(菜单+权限)视图对象") @Schema(description ="资源(菜单+权限)视图对象")
@Data @Data
public class ResourceVO { public class ResourceVO {
@ApiModelProperty("选项的值") @Schema(description="选项的值")
private Long value; private Long value;
@ApiModelProperty("选项的标签") @Schema(description="选项的标签")
private String label; private String label;
@ApiModelProperty("子菜单") @Schema(description="子菜单")
@JsonInclude(value = JsonInclude.Include.NON_EMPTY) @JsonInclude(value = JsonInclude.Include.NON_EMPTY)
private List<ResourceVO> children; private List<ResourceVO> children;

View File

@@ -1,7 +1,7 @@
package com.youlai.system.pojo.vo.perm; package com.youlai.system.pojo.vo.perm;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
/** /**
@@ -10,26 +10,26 @@ import lombok.Data;
* @author haoxr * @author haoxr
* @date 2021/10/30 10:54 * @date 2021/10/30 10:54
*/ */
@ApiModel("权限视图对象") @Schema(description ="权限视图对象")
@Data @Data
public class PermPageVO { public class PermPageVO {
@ApiModelProperty("权限ID") @Schema(description="权限ID")
private Long id; private Long id;
@ApiModelProperty("权限名称") @Schema(description="权限名称")
private String name; private String name;
@ApiModelProperty("URL权限标识-服务名称") @Schema(description="URL权限标识-服务名称")
private String serviceName; private String serviceName;
@ApiModelProperty("URL权限标识-请求标识") @Schema(description="URL权限标识-请求标识")
private String requestMethod; private String requestMethod;
@ApiModelProperty("URL权限标识-请求方式") @Schema(description="URL权限标识-请求方式")
private String requestPath; private String requestPath;
@ApiModelProperty("按钮权限标识") @Schema(description="按钮权限标识")
private String btnPerm; private String btnPerm;
} }

View File

@@ -1,29 +1,29 @@
package com.youlai.system.pojo.vo.role; package com.youlai.system.pojo.vo.role;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@ApiModel("角色分页视图对象") @Schema(description ="角色分页视图对象")
@Data @Data
public class RolePageVO { public class RolePageVO {
@ApiModelProperty("角色ID") @Schema(description="角色ID")
private Long id; private Long id;
@ApiModelProperty("角色名称") @Schema(description="角色名称")
private String name; private String name;
@ApiModelProperty("角色编码") @Schema(description="角色编码")
private String code; private String code;
@ApiModelProperty("角色状态") @Schema(description="角色状态")
private Integer status; private Integer status;
@ApiModelProperty("排序") @Schema(description="排序")
private Integer sort; private Integer sort;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")

View File

@@ -1,7 +1,7 @@
package com.youlai.system.pojo.vo.user; package com.youlai.system.pojo.vo.user;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import java.util.List; import java.util.List;
@@ -12,38 +12,38 @@ import java.util.List;
* @author haoxr * @author haoxr
* @date 2022/8/25 * @date 2022/8/25
*/ */
@ApiModel @Schema
@Data @Data
public class UserDetailVO { public class UserDetailVO {
@ApiModelProperty("用户ID") @Schema(description="用户ID")
private Long id; private Long id;
@ApiModelProperty("用户名") @Schema(description="用户名")
private String username; private String username;
@ApiModelProperty("昵称") @Schema(description="昵称")
private String nickname; private String nickname;
@ApiModelProperty("") @Schema(description="")
private String mobile; private String mobile;
@ApiModelProperty("性别") @Schema(description="性别")
private Integer gender; private Integer gender;
@ApiModelProperty("用户头像") @Schema(description="用户头像")
private String avatar; private String avatar;
@ApiModelProperty("邮箱") @Schema(description="邮箱")
private String email; private String email;
@ApiModelProperty("用户状态(1:正常;0:禁用)") @Schema(description="用户状态(1:正常;0:禁用)")
private Integer status; private Integer status;
@ApiModelProperty("部门ID") @Schema(description="部门ID")
private Long deptId; private Long deptId;
@ApiModelProperty("角色ID集合") @Schema(description="角色ID集合")
private List<Long> roleIds; private List<Long> roleIds;
} }

View File

@@ -1,7 +1,7 @@
package com.youlai.system.pojo.vo.user; package com.youlai.system.pojo.vo.user;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import java.util.List; import java.util.List;
@@ -13,23 +13,23 @@ import java.util.Set;
* @author haoxr * @author haoxr
* @date 2022/1/14 * @date 2022/1/14
*/ */
@ApiModel("当前登录用户视图对象") @Schema(description ="当前登录用户视图对象")
@Data @Data
public class UserLoginVO { public class UserLoginVO {
@ApiModelProperty("用户ID") @Schema(description="用户ID")
private Long userId; private Long userId;
@ApiModelProperty("用户昵称") @Schema(description="用户昵称")
private String nickname; private String nickname;
@ApiModelProperty("头像地址") @Schema(description="头像地址")
private String avatar; private String avatar;
@ApiModelProperty("用户角色编码集合") @Schema(description="用户角色编码集合")
private Set<String> roles; private Set<String> roles;
@ApiModelProperty("用户权限标识集合") @Schema(description="用户权限标识集合")
private Set<String> perms; private Set<String> perms;
} }

View File

@@ -1,8 +1,8 @@
package com.youlai.system.pojo.vo.user; package com.youlai.system.pojo.vo.user;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.annotations.ApiModelProperty; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import java.util.Date; import java.util.Date;
@@ -13,41 +13,41 @@ import java.util.Date;
* @author haoxr * @author haoxr
* @date 2022/1/15 9:41 * @date 2022/1/15 9:41
*/ */
@ApiModel("用户分页视图对象") @Schema(description ="用户分页视图对象")
@Data @Data
public class UserVO { public class UserVO {
@ApiModelProperty("用户ID") @Schema(description="用户ID")
private Long id; private Long id;
@ApiModelProperty("用户名") @Schema(description="用户名")
private String username; private String username;
@ApiModelProperty("用户昵称") @Schema(description="用户昵称")
private String nickname; private String nickname;
@ApiModelProperty("手机号") @Schema(description="手机号")
private String mobile; private String mobile;
@ApiModelProperty("性别") @Schema(description="性别")
private String genderLabel; private String genderLabel;
@ApiModelProperty("用户头像地址") @Schema(description="用户头像地址")
private String avatar; private String avatar;
@ApiModelProperty("用户邮箱") @Schema(description="用户邮箱")
private String email; private String email;
@ApiModelProperty("用户状态(1:启用;0:禁用)") @Schema(description="用户状态(1:启用;0:禁用)")
private Integer status; private Integer status;
@ApiModelProperty("部门名称") @Schema(description="部门名称")
private String deptName; private String deptName;
@ApiModelProperty("角色名称,多个使用英文逗号(,)分割") @Schema(description="角色名称,多个使用英文逗号(,)分割")
private String roleNames; private String roleNames;
@ApiModelProperty("创建时间") @Schema(description="创建时间")
@JsonFormat(pattern = "yyyy-MM-dd") @JsonFormat(pattern = "yyyy-MM-dd")
private Date createTime; private Date createTime;

View File

@@ -16,7 +16,7 @@ import org.springframework.security.core.Authentication;
import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.annotation.Resource; import jakarta.annotation.Resource;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;

View File

@@ -6,8 +6,8 @@ import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.web.access.AccessDeniedHandler; import org.springframework.security.web.access.AccessDeniedHandler;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
/** /**

View File

@@ -6,9 +6,9 @@ import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint; import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.servlet.ServletException; import jakarta.servlet.ServletException;
import javax.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
/** /**

View File

@@ -9,10 +9,10 @@ import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.filter.OncePerRequestFilter; import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain; import jakarta.servlet.FilterChain;
import javax.servlet.ServletException; import jakarta.servlet.ServletException;
import javax.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
/** /**