提交 9ffc3622 作者: 方治民

feat: 变更主键 id 类型为 string 适配前端 ts 传参问题、增加 tag 默认排序及描述文字兼容(Pont)

上级 2ac056c0
......@@ -27,7 +27,7 @@ dependencies {
// Optional: Doc
implementation project(":basic-common:doc")
implementation "io.swagger:swagger-annotations:${swaggerAnnotationsVersion}"
implementation "com.github.xiaoymin:knife4j-spring-boot-starter:${knife4jVersion}"
// Optional: Auth
implementation project(":basic-auth")
......
/* (C) 2021 YiRing, Inc. */
package com.yiring.app.web;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.yiring.app.constant.Code;
import com.yiring.app.domain.TestTable;
import com.yiring.app.exception.CodeException;
......@@ -27,6 +28,8 @@ import org.springframework.web.bind.annotation.RestController;
@Slf4j
@Validated
@SuppressWarnings({ "deprecation" })
@ApiSupport(order = 0)
@Api(tags = "示例", description = "Example")
@RequestMapping("/example/")
@RestController
......
......@@ -35,7 +35,7 @@ knife4j:
username: admin
password: 123456
setting:
enableOpenApi: false
enableOpenApi: true
enableDebug: true
# minio
......
......@@ -13,7 +13,7 @@ spring:
name: "basic-api-app"
profiles:
include: auth, conf-patch
active: test
active: mock
# DEBUG
debug: false
......@@ -8,8 +8,8 @@ dependencies {
// 本地依赖
implementation fileTree(dir: project.rootDir.getPath() + '\\libs', includes: ['*jar'])
// swagger annotations
implementation "io.swagger:swagger-annotations:${swaggerAnnotationsVersion}"
// swagger(knife4j)
implementation "com.github.xiaoymin:knife4j-spring-boot-starter:${knife4jVersion}"
// sa-token
implementation "cn.dev33:sa-token-spring-boot-starter:${saTokenVersion}"
......
......@@ -34,11 +34,11 @@ public class SaTokenConfigure implements WebMvcConfigurer {
// TODO
// .notMatch("/**")
// 示例接口
.notMatch("/hello/**")
.notMatch("/example/**")
// 授权相关接口(登录、登出、注册等)
.notMatch("/auth/**")
.notMatch("/favicon.ico", "/**/*.html", "/**/*.js", "/**/*.css")
.notMatch("/v2/api-docs", "/v3/api-docs", "/swagger-resources/**")
.notMatch("/v2/api-docs/**", "/v3/api-docs/**", "/swagger-resources/**")
.check(r -> StpUtil.checkLogin());
})
)
......
......@@ -52,7 +52,7 @@ public class StpInterfaceImpl implements StpInterface {
* @return 用户信息
*/
private User getUser(Object loginId) {
Long id = Long.parseLong(Objects.toString(loginId));
String id = Objects.toString(loginId);
Optional<User> optional = userRepository.findById(id);
if (optional.isEmpty()) {
throw new RuntimeException("用户不存在");
......
......@@ -81,7 +81,7 @@ public class Permission extends BasicEntity implements Serializable {
Boolean enable;
@Comment("权限父级ID")
Long pid;
String pid;
@Comment("树节点标识")
String tree;
......
......@@ -66,11 +66,8 @@ public class PermissionParam implements Serializable {
@ApiModelProperty(value = "父级ID", example = "0")
@Builder.Default
Long pid = 0L;
String pid = "0";
@ApiModelProperty(
value = "元数据",
example = "{\"title\": \"routes.dashboard.dashboard\", \"hideChildrenInMenu\": true}"
)
@ApiModelProperty(value = "元数据", example = "{\"title\": \"routes.dashboard.dashboard\"}")
String meta;
}
......@@ -59,7 +59,7 @@ public class Permissions {
ArrayList<MenuVo> roots = new ArrayList<>();
// 将数据添加到 Map
Map<Long, MenuVo> map = list.stream().collect(Collectors.toMap(MenuVo::getId, Function.identity()));
Map<String, MenuVo> map = list.stream().collect(Collectors.toMap(MenuVo::getId, Function.identity()));
list.forEach(entity -> {
MenuVo menu = map.get(entity.getPid());
......@@ -115,7 +115,7 @@ public class Permissions {
* @param pid 权限父级 ID
* @return 树状权限集合
*/
public List<PermissionVo> toTree(List<Permission> permissions, @NonNull Long pid) {
public List<PermissionVo> toTree(List<Permission> permissions, @NonNull String pid) {
return permissions
.stream()
.filter(permission -> pid.equals(permission.getPid()))
......
/* (C) 2021 YiRing, Inc. */
package com.yiring.auth.vo.auth;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
......@@ -29,9 +27,8 @@ public class LoginVo implements Serializable {
@Serial
private static final long serialVersionUID = -8690942241103456896L;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "主键", example = "1")
Long userId;
@ApiModelProperty(value = "用户 ID", example = "1")
String userId;
@ApiModelProperty(value = "token", example = "c68ca9c8c04b4a59afeafd2fb7c04741")
String token;
......
......@@ -32,10 +32,10 @@ public class MenuVo implements Serializable {
private static final long serialVersionUID = -9139328772148985141L;
@JsonIgnore
Long id;
String id;
@JsonIgnore
Long pid;
String pid;
@ApiModelProperty(value = "名称", example = "Dashboard")
String name;
......@@ -49,10 +49,7 @@ public class MenuVo implements Serializable {
@ApiModelProperty(value = "组件", example = "LAYOUT")
String component;
@ApiModelProperty(
value = "元数据",
example = "{\"title\": \"routes.dashboard.dashboard\", \"hideChildrenInMenu\": true}"
)
@ApiModelProperty(value = "元数据", example = "{\"title\": \"routes.dashboard.dashboard\"}")
JSONObject meta;
@ApiModelProperty(value = "子权限")
......
......@@ -3,8 +3,6 @@ package com.yiring.auth.vo.permission;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.yiring.auth.domain.permission.Permission;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
......@@ -33,9 +31,8 @@ public class PermissionVo implements Serializable {
@Serial
private static final long serialVersionUID = -9139328772148985141L;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "主键", example = "1")
Long id;
String id;
@ApiModelProperty(value = "权限类型", example = "MENU")
Permission.Type type;
......@@ -65,7 +62,7 @@ public class PermissionVo implements Serializable {
Boolean enable;
@ApiModelProperty(value = "父级ID", example = "0")
Long pid;
String pid;
@ApiModelProperty(value = "元数据", example = "{}")
JSONObject meta;
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.auth.vo.role;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.yiring.auth.vo.permission.PermissionVo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
......@@ -30,9 +28,8 @@ public class RoleVo implements Serializable {
@Serial
private static final long serialVersionUID = -9154497137563970840L;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "主键", example = "1")
Long id;
String id;
@ApiModelProperty(value = "标识", example = "admin")
String uid;
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.auth.vo.user;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.yiring.auth.vo.role.RoleVo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
......@@ -30,9 +28,8 @@ public class UserInfoVo implements Serializable {
@Serial
private static final long serialVersionUID = -5319037883240327088L;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "主键", example = "1")
Long userId;
String userId;
@ApiModelProperty(value = "真实姓名", example = "超级用户")
String realName;
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.auth.vo.user;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.yiring.auth.vo.role.RoleVo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
......@@ -30,9 +28,8 @@ public class UserMenuListVo implements Serializable {
@Serial
private static final long serialVersionUID = -5319037883240327088L;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "主键", example = "1")
Long userId;
String userId;
@ApiModelProperty(value = "真实姓名", example = "超级用户")
String realName;
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.auth.vo.user;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
......@@ -28,9 +26,8 @@ public class UserVo implements Serializable {
@Serial
private static final long serialVersionUID = -2184378273450466835L;
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "主键", example = "1")
Long id;
String id;
@ApiModelProperty(value = "真实姓名", example = "超级用户")
String realName;
......
......@@ -4,6 +4,7 @@ package com.yiring.auth.web.auth;
import cn.dev33.satoken.secure.SaSecureUtil;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.StrUtil;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.yiring.auth.domain.user.User;
import com.yiring.auth.domain.user.UserRepository;
import com.yiring.auth.param.auth.LoginParam;
......@@ -36,7 +37,9 @@ import org.springframework.web.bind.annotation.RestController;
@Slf4j
@Validated
@Api(tags = "Auth")
@SuppressWarnings({ "deprecation" })
@ApiSupport(order = -99)
@Api(tags = "身份认证", description = "Auth")
@RestController
@RequestMapping("/auth/")
public class AuthController {
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.auth.web.permission;
import cn.hutool.core.util.StrUtil;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.yiring.auth.domain.permission.Permission;
import com.yiring.auth.domain.permission.PermissionRepository;
import com.yiring.auth.param.permission.PermissionParam;
......@@ -10,13 +12,12 @@ import com.yiring.common.core.Result;
import com.yiring.common.core.Status;
import com.yiring.common.param.IdParam;
import com.yiring.common.param.PageParam;
import com.yiring.common.param.PidParam;
import com.yiring.common.vo.PageVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import javax.annotation.Resource;
import javax.validation.Valid;
......@@ -26,7 +27,10 @@ import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page;
import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 系统权限管理控制器
......@@ -38,7 +42,9 @@ import org.springframework.web.bind.annotation.*;
@Slf4j
@Validated
@Api(tags = "Permission")
@SuppressWarnings({ "deprecation" })
@ApiSupport(order = -97)
@Api(tags = "权限管理", description = "Permission")
@RestController
@RequestMapping("/manage/permission/")
public class PermissionController {
......@@ -119,11 +125,12 @@ public class PermissionController {
@ApiOperation(value = "树结构查询")
@GetMapping(value = "tree", headers = "Content-Type=" + MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public Result<ArrayList<PermissionVo>> tree(
@ApiParam(value = "父级 id", example = "0") @RequestParam(required = false) Long pid
) {
public Result<ArrayList<PermissionVo>> tree(@Valid PidParam param) {
List<Permission> permissions = permissionRepository.findAll();
List<PermissionVo> vos = Permissions.toTree(permissions, Objects.isNull(pid) ? 0L : pid);
List<PermissionVo> vos = Permissions.toTree(
permissions,
StrUtil.isEmpty(param.getPid()) ? "0" : param.getPid()
);
return Result.ok((ArrayList<PermissionVo>) vos);
}
......@@ -132,10 +139,10 @@ public class PermissionController {
* @param pid 父级 ID
* @return 树节点标识
*/
private String getTreeNode(Long pid) {
private String getTreeNode(String pid) {
Optional<Permission> parent = permissionRepository.findById(pid);
if (parent.isEmpty()) {
return String.valueOf(pid);
return pid;
} else {
return String.format("%s.%s", parent.get().getTree(), pid);
}
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.auth.web.role;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.yiring.auth.domain.permission.Permission;
import com.yiring.auth.domain.permission.PermissionRepository;
import com.yiring.auth.domain.role.Role;
import com.yiring.auth.domain.role.RoleRepository;
import com.yiring.auth.param.IdsParam;
import com.yiring.auth.param.role.RoleParam;
import com.yiring.auth.util.Permissions;
import com.yiring.auth.vo.role.RoleVo;
import com.yiring.common.core.Result;
import com.yiring.common.core.Status;
import com.yiring.common.param.IdParam;
import com.yiring.common.param.IdsParam;
import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo;
import io.swagger.annotations.Api;
......@@ -40,7 +41,9 @@ import org.springframework.web.bind.annotation.RestController;
@Slf4j
@Validated
@Api(tags = "Role")
@SuppressWarnings({ "deprecation" })
@ApiSupport(order = -96)
@Api(tags = "角色管理", description = "Role")
@RestController
@RequestMapping("/manage/role/")
public class RoleController {
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.auth.web.user;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.yiring.auth.domain.permission.Permission;
import com.yiring.auth.domain.role.Role;
import com.yiring.auth.domain.role.RoleRepository;
import com.yiring.auth.domain.user.User;
import com.yiring.auth.domain.user.UserRepository;
import com.yiring.auth.param.IdsParam;
import com.yiring.auth.util.Auths;
import com.yiring.auth.util.Permissions;
import com.yiring.auth.vo.permission.MenuVo;
......@@ -15,6 +15,7 @@ import com.yiring.auth.vo.user.UserVo;
import com.yiring.common.core.Result;
import com.yiring.common.core.Status;
import com.yiring.common.param.IdParam;
import com.yiring.common.param.IdsParam;
import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo;
import io.swagger.annotations.Api;
......@@ -45,7 +46,9 @@ import org.springframework.web.bind.annotation.RestController;
@Slf4j
@Validated
@Api(tags = "User")
@SuppressWarnings({ "deprecation" })
@ApiSupport(order = -95)
@Api(tags = "用户管理", description = "User")
@RestController
@RequestMapping("/user/")
public class UserController {
......
......@@ -9,8 +9,8 @@ dependencies {
// 本地依赖
implementation fileTree(dir: project.rootDir.getPath() + '\\libs', includes: ['*jar'])
// swagger annotations
implementation "io.swagger:swagger-annotations:${swaggerAnnotationsVersion}"
// swagger(knife4j)
implementation "com.github.xiaoymin:knife4j-spring-boot-starter:${knife4jVersion}"
// hutool-extra
implementation "cn.hutool:hutool-extra:${hutoolVersion}"
......
......@@ -40,8 +40,8 @@ public abstract class BasicEntity {
@Comment("主键")
@Id
@GeneratedValue(generator = SnowflakeId.GENERATOR)
@GenericGenerator(name = SnowflakeId.GENERATOR, strategy = SnowflakeId.Strategy.LONG)
Long id;
@GenericGenerator(name = SnowflakeId.GENERATOR, strategy = SnowflakeId.Strategy.STRING)
String id;
@Comment("创建时间")
@Column(nullable = false)
......
......@@ -17,7 +17,7 @@ import lombok.experimental.FieldDefaults;
* @version 0.1
* 2019/5/28 22:11
*/
@ApiModel("IdParam")
@ApiModel(value = "IdParam", description = "公共的 ID 查询参数")
@Valid
@Data
@Builder
......@@ -31,5 +31,5 @@ public class IdParam implements Serializable {
@ApiModelProperty(value = "id", example = "1", required = true)
@NotNull(message = "id 不能为空")
Long id;
String id;
}
/* (C) 2021 YiRing, Inc. */
package com.yiring.auth.param;
package com.yiring.common.param;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
......
......@@ -16,7 +16,7 @@ import lombok.experimental.FieldDefaults;
* @version 0.1
* 2022/4/27 08:53
*/
@ApiModel("KeywordParam")
@ApiModel(value = "KeywordParam", description = "公共的关键字查询参数")
@Valid
@Data
@Builder
......
......@@ -19,13 +19,12 @@ import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
/**
* 分页查询参数公共类
* 公共的分页排序查询参数
*
* @author ifzm
* @version 0.1 2019/3/10 16:29
*/
@SuppressWarnings({ "unused" })
@ApiModel("分页查询参数公共类")
@ApiModel(value = "PageParam", description = "公共的分页排序查询参数")
@Data
@SuperBuilder
@NoArgsConstructor
......@@ -58,6 +57,7 @@ public class PageParam implements Serializable {
* @param param {@link PageParam}
* @return Pageable
*/
@SuppressWarnings({ "unused" })
public static Pageable toPageable(PageParam param) {
if (param == null) {
return Pageable.unpaged();
......
/* (C) 2021 YiRing, Inc. */
package com.yiring.common.param;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.io.Serial;
import java.io.Serializable;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import lombok.*;
import lombok.experimental.FieldDefaults;
/**
* 公共的父级 ID 查询参数类
*
* @author ifzm
* @version 0.1
* 2019/5/28 22:11
*/
@ApiModel(value = "PidParam", description = "公共的父级 ID 查询参数")
@Valid
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class PidParam implements Serializable {
@Serial
private static final long serialVersionUID = -8690942241103456893L;
@ApiModelProperty(value = "pid", example = "1", required = true)
@NotNull(message = "pid 不能为空")
String pid;
}
......@@ -16,7 +16,7 @@ import lombok.experimental.FieldDefaults;
* @version 0.1
* 2022/3/23 16:47
*/
@ApiModel("DataVo")
@ApiModel(value = "DataVo", description = "公共数据响应输出")
@Data
@NoArgsConstructor
@AllArgsConstructor
......
......@@ -16,7 +16,7 @@ import lombok.experimental.FieldDefaults;
* 2022/3/24 17:29
*/
@ApiModel("KeyValueVo")
@ApiModel(value = "KeyValueVo", description = "键值对响应输出")
@Data
@Builder
@NoArgsConstructor
......
......@@ -16,7 +16,7 @@ import lombok.experimental.FieldDefaults;
* @author ifzm
* @version 0.1 2019/3/10 16:29
*/
@ApiModel("PageVo")
@ApiModel(value = "PageVo", description = "公共分页查询响应输出")
@Data
@NoArgsConstructor
@AllArgsConstructor
......@@ -26,10 +26,10 @@ public class PageVo<T extends Serializable> implements Serializable {
@Serial
private static final long serialVersionUID = 6103761701912769946L;
@ApiModelProperty(value = "数据")
@ApiModelProperty(value = "数据", required = true)
List<T> data;
@ApiModelProperty(value = "数据总数", example = "100")
@ApiModelProperty(value = "数据总数", example = "100", required = true)
Long total;
/**
......
......@@ -3,8 +3,8 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
// swagger
implementation "io.swagger:swagger-annotations:${swaggerAnnotationsVersion}"
// swagger(knife4j)
implementation "com.github.xiaoymin:knife4j-spring-boot-starter:${knife4jVersion}"
// minio
implementation "io.minio:minio:${minioVersion}"
......
......@@ -3,6 +3,7 @@ package com.yiring.common.web;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.IdUtil;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import com.yiring.common.core.Minio;
import com.yiring.common.core.Result;
import com.yiring.common.core.Status;
......@@ -29,9 +30,11 @@ import org.springframework.web.multipart.MultipartFile;
@Slf4j
@Validated
@Api(tags = "Minio")
@SuppressWarnings({ "deprecation" })
@ApiSupport(order = -98)
@Api(tags = "文件管理", description = "file")
@RestController
@RequestMapping("/common/minio/")
@RequestMapping("/common/file/")
public class MinioController {
@Resource
......@@ -48,8 +51,8 @@ public class MinioController {
long uuid = snowflake.nextId();
// 文件上传
String folder =
"upload/" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy/M/d")) + "/" + uuid;
String date = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy/M/d"));
String folder = "upload/" + date + "/" + uuid;
ObjectWriteResponse response = minio.putObject(file, folder);
String uri = minio.getURI(response.object());
return Result.ok(uri);
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论