提交 4190afac 作者: 方治民

feat: 同步 basic 工程最新代码,移除一些不必要的同步更新

## 0.0.1 (2022-04-27)
### Bug Fixes
* 升级 spring-boot 版本,修复 RCE 漏洞 ([dda158f](https://gitlab.yiring.com/basic/basic-api-project/commit/dda158fcb0e4b2584c1bb0044b00b3734fbb1348))
* 修复 PageVo spotbugsMain 异常检测结果 ([847c32b](https://gitlab.yiring.com/basic/basic-api-project/commit/847c32bcd5ffa133e2e8997407bbba99e0741532))
* 修复 RedisConfig Jackson 序列化配置 ([8514e93](https://gitlab.yiring.com/basic/basic-api-project/commit/8514e938783ea37d87d75c676091f260c028e802))
* 修复权限 meta JSON 数据构建空值错误、equals 代码简化 ([f5d902b](https://gitlab.yiring.com/basic/basic-api-project/commit/f5d902b4e42b533fddf4d2fed919a0290adbcf90))
### Features
* 分离用户菜单权限树查询接口、快速失败状态异常类型及全局处理、新增通用类型集合转换工具方法、hutool-json 换成 fastjson 依赖等细节优化处理 ([a62b1f2](https://gitlab.yiring.com/basic/basic-api-project/commit/a62b1f28999c127b16be776f5d5d3fd453b7823e))
* 更新 gradle 版本、新增 sourceCompatibility=17、调整全局异常配置 ([4b2b0d9](https://gitlab.yiring.com/basic/basic-api-project/commit/4b2b0d9805f28a786fc59bd305b643b51fb9be20))
* 升级到 JDK17 进行适配 ([4b8557a](https://gitlab.yiring.com/basic/basic-api-project/commit/4b8557a1707a6603353365ab1b2c3c21dcd1c5a3))
* 适配 Spring Boot 2.6.6, 更新文档 ([674dce4](https://gitlab.yiring.com/basic/basic-api-project/commit/674dce47162f558d7bbd1273c82ae22bb7080b8f))
* 新增 BasicEntity、抽离 JacksonConfig 与 DateTimeConfig、优化 Swagger 日志输出时机、封装 Auths 公共类等 ([7d3b75d](https://gitlab.yiring.com/basic/basic-api-project/commit/7d3b75d3c12507b5cf8c26305bdab0da11e76b05))
* 新增 JTS 依赖及 Jackson 序列化配置、hibernate-types 扩展自定义类型 ([0c712c1](https://gitlab.yiring.com/basic/basic-api-project/commit/0c712c1ea1e50a5ecece0eae495557d1913e31ec))
* 新增菜单路由重定向配置、新增用户权限获取接口,用于前端鉴权、新增用户 SQL 预览文件 ([9cc0e18](https://gitlab.yiring.com/basic/basic-api-project/commit/9cc0e18b847751c5d2de145a9751eee91904b83c))
* 新增快速失败业务异常实现及示例, 新增默认的用户主页地址 ([353782a](https://gitlab.yiring.com/basic/basic-api-project/commit/353782a99deda17c2d90ea7ff9ed88ad9034f995))
* 新增默认文件上传大小限制配置 ([a7ffba3](https://gitlab.yiring.com/basic/basic-api-project/commit/a7ffba39099c1d662ee653c4686bc42024696154))
* 新增通用用户及权限相关、MinIO 文件上传实现, 依赖更新等 ([7931c58](https://gitlab.yiring.com/basic/basic-api-project/commit/7931c583cc8d15936f1f756145b52c6d2b6ffc68))
* 新增文件下载示例、关键字查询 Param 类、端口变更 ([fc1405d](https://gitlab.yiring.com/basic/basic-api-project/commit/fc1405db962378884e203807e03e005812e27709))
* 优化 Swagger 文档日志输出 ([b724899](https://gitlab.yiring.com/basic/basic-api-project/commit/b7248990d38fd6845d3727b644fe419df9621802))
* 优化日志输出 ([0b79e58](https://gitlab.yiring.com/basic/basic-api-project/commit/0b79e58c1ae1b777d19970467dbf713e608228cb))
* 增加 Host 环境变量统一配置参数 ([d336c37](https://gitlab.yiring.com/basic/basic-api-project/commit/d336c3706a8a4063d8d86eb5ed827be36524698d))
* 增加 Redis 操作序列化配置、缓存配置、实用技巧文档 ([2a892bd](https://gitlab.yiring.com/basic/basic-api-project/commit/2a892bd0369d8bf44e557a50777be04355769dba))
* add cors, context-path ... ([94cb809](https://gitlab.yiring.com/basic/basic-api-project/commit/94cb809d15fc69c9c447fdd08431c0cc6c780eea))
* init ([1c5da80](https://gitlab.yiring.com/basic/basic-api-project/commit/1c5da8050f0c9e9a3e7bfbf8f6fd805f5f613588))
* redis Bean 新增 keys 方法 ([a2f9e3f](https://gitlab.yiring.com/basic/basic-api-project/commit/a2f9e3fee626480ed2a27fc4fb4a2da767fb4e2b))
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
<!-- prettier-ignore --> <!-- prettier-ignore -->
- [开发规范说明](./doc/workflow.md) - [开发规范说明](./doc/workflow.md)
- [技术栈说明](./doc/technique.md) - [技术栈说明](./doc/technique.md)
- [实用技巧](./doc/skill.md) - 👉 [实用技巧](./doc/skill.md)
--- ---
......
# 环境变量
env:
host: 192.168.0.156
spring:
servlet:
multipart:
enabled: true
max-file-size: 50MB
max-request-size: 100MB
datasource:
url: jdbc:postgresql://${env.host}:5432/kshg_app_beta
username: admin
password: 123456
jpa:
database-platform: com.yiring.app.config.dialect.PostgresDialect
open-in-view: true
hibernate:
ddl-auto: update
show-sql: false
properties:
hibernate:
format_sql: true
types.print.banner: false
redis:
database: 10
host: ${env.host}
rabbitmq:
host: ${env.host}
port: 5672
username: admin
password: 123456
virtual-host: beta
data:
redis:
repositories:
enabled: false
# 处理多网卡选举
cloud:
inetutils:
preferred-networks: 192.168.0
# knife4j(swagger)
knife4j:
enable: true
basic:
enable: false
username: admin
password: 123456
setting:
enableOpenApi: false
enableDebug: true
# minio
minio:
access-key: minioadmin
secret-key: minioadmin
end-point: "http://${env.host}:18100"
bucket: kshg
domain: ${minio.endpoint}/${minio.bucket}
# 任务调度
xxl:
job:
### 调度中心部署跟地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册;
admin-addresses: http://${env.host}:8080/xxl-job-admin
### 执行器通讯TOKEN [选填]:非空时启用;
access-token: local
### 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册
executor-app-name: kshg-app-beta
### 执行器注册 [选填]:优先使用该配置作为注册地址,为空时使用内嵌服务 ”IP:PORT“ 作为注册地址。从而更灵活的支持容器类型执行器动态IP和动态映射端口问题。
executor-address:
### 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务";
executor-ip:
### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
executor-port:
### 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
executor-log-path: /data/applogs/xxl-job/jobhandler
### 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
executor-log-retention-days: 30
# 日志
logging:
level:
# sql bind parameter
# org.hibernate.type.descriptor.sql.BasicBinder: trace
org.hibernate.type.descriptor.sql.BasicBinder: error
# 真源定位系统相关配置
zy-config:
host: project.yz-online.com
# RabbitMQ 订阅配置
rabbitmq:
mock: false
enabled: false
host: 123.60.56.5
port: 5672
username: tenant
password: tenant
virtual-host: /
queue-name: tenant_msg_${zy-config.open.client-secret}_${zy-config.open.client-id}
# 开放接口信息配置
open:
api: https://nl.yz-cloud.com/positionApi
client-id: sc22030527
grant-type: client_credentials
client-secret: C18422B9
tenant: sc22030527
# 代理接口信息配置
proxy:
api: https://nl.yz-cloud.com
tenant: sc22030527
# 应用平台账户信息
client:
username: client
password: client@yiring.com
# 管理后台账户信息
manage:
username: manage
password: manage@yiring.com
feign:
httpclient:
enabled: false
okhttp:
enabled: true
...@@ -3,6 +3,11 @@ spring: ...@@ -3,6 +3,11 @@ spring:
pathmatch: pathmatch:
# 修复 swagger 插件在 2.6.x 接口路径匹配问题 # 修复 swagger 插件在 2.6.x 接口路径匹配问题
matching-strategy: ant_path_matcher matching-strategy: ant_path_matcher
jpa:
properties:
hibernate:
# 关闭 hibernate-types banner 日志信息
types.print.banner: false
logging: logging:
level: level:
......
...@@ -33,7 +33,7 @@ knife4j: ...@@ -33,7 +33,7 @@ knife4j:
username: admin username: admin
password: 123456 password: 123456
setting: setting:
enableOpenApi: false enableOpenApi: true
enableDebug: true enableDebug: true
# minio # minio
......
/* (C) 2022 YiRing, Inc. */
package com.yiring;
/**
* @author Jim
* @version 0.1
* 2022/5/23 0:21
*/
public class Test {
public static void main(String[] args) {}
}
...@@ -28,4 +28,8 @@ dependencies { ...@@ -28,4 +28,8 @@ dependencies {
// myexcel // myexcel
implementation "com.github.liaochong:myexcel:${myexcelVersion}" implementation "com.github.liaochong:myexcel:${myexcelVersion}"
// https://github.com/vladmihalcea/hibernate-types
// hibernate-types-55
implementation "com.vladmihalcea:hibernate-types-55:${hibernateTypesVersion}"
} }
...@@ -31,9 +31,10 @@ public class SaTokenConfigure implements WebMvcConfigurer { ...@@ -31,9 +31,10 @@ public class SaTokenConfigure implements WebMvcConfigurer {
.match("/**") .match("/**")
.notMatchMethod(SaHttpMethod.OPTIONS.name()) .notMatchMethod(SaHttpMethod.OPTIONS.name())
// 实现用户权限相关后应移除下行代码 // 实现用户权限相关后应移除下行代码
// TODO
// .notMatch("/**") // .notMatch("/**")
// 示例接口 // 示例接口
.notMatch("/hello/**") .notMatch("/example/**")
// 授权相关接口(登录、登出、注册等) // 授权相关接口(登录、登出、注册等)
.notMatch("/auth/**") .notMatch("/auth/**")
.notMatch("/visitor/saveVisitor") .notMatch("/visitor/saveVisitor")
...@@ -41,7 +42,7 @@ public class SaTokenConfigure implements WebMvcConfigurer { ...@@ -41,7 +42,7 @@ public class SaTokenConfigure implements WebMvcConfigurer {
.notMatch("/Car/saveCarInfo") .notMatch("/Car/saveCarInfo")
.notMatch("/Car/getCarInfo") .notMatch("/Car/getCarInfo")
.notMatch("/favicon.ico", "/**/*.html", "/**/*.js", "/**/*.css") .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()); .check(r -> StpUtil.checkLogin());
}) })
) )
......
/* (C) 2022 YiRing, Inc. */ /* (C) 2022 YiRing, Inc. */
package com.yiring.auth.domain.permission; package com.yiring.auth.domain.permission;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.vladmihalcea.hibernate.type.json.JsonType;
import com.yiring.common.domain.BasicEntity; import com.yiring.common.domain.BasicEntity;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.util.Objects;
import javax.persistence.*; import javax.persistence.*;
import lombok.*; import lombok.*;
import lombok.experimental.FieldDefaults; import lombok.experimental.FieldDefaults;
import lombok.experimental.FieldNameConstants; import lombok.experimental.FieldNameConstants;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
import org.hibernate.Hibernate;
import org.hibernate.annotations.Comment; import org.hibernate.annotations.Comment;
import org.hibernate.annotations.TypeDef;
/** /**
* 权限 * 权限
...@@ -31,7 +30,7 @@ import org.hibernate.annotations.Comment; ...@@ -31,7 +30,7 @@ import org.hibernate.annotations.Comment;
@FieldNameConstants @FieldNameConstants
@FieldDefaults(level = AccessLevel.PRIVATE) @FieldDefaults(level = AccessLevel.PRIVATE)
@Entity @Entity
@Comment("系统权限") @TypeDef(name = "json", typeClass = JsonType.class)
@Table( @Table(
name = "SYS_PERMISSION", name = "SYS_PERMISSION",
indexes = { indexes = {
...@@ -41,6 +40,7 @@ import org.hibernate.annotations.Comment; ...@@ -41,6 +40,7 @@ import org.hibernate.annotations.Comment;
@Index(columnList = "uid", unique = true), @Index(columnList = "uid", unique = true),
} }
) )
@Comment("系统权限")
public class Permission extends BasicEntity implements Serializable { public class Permission extends BasicEntity implements Serializable {
@Serial @Serial
...@@ -88,9 +88,9 @@ public class Permission extends BasicEntity implements Serializable { ...@@ -88,9 +88,9 @@ public class Permission extends BasicEntity implements Serializable {
* 可用于扩展一些前端可能用到的路由参数 * 可用于扩展一些前端可能用到的路由参数
*/ */
@Comment("扩展元数据信息") @Comment("扩展元数据信息")
@Lob @org.hibernate.annotations.Type(type = "json")
@Column(columnDefinition = "JSON") @Column(columnDefinition = "json")
String meta; JSONObject meta;
@SuppressWarnings({ "unused" }) @SuppressWarnings({ "unused" })
public enum Type { public enum Type {
...@@ -115,30 +115,14 @@ public class Permission extends BasicEntity implements Serializable { ...@@ -115,30 +115,14 @@ public class Permission extends BasicEntity implements Serializable {
* @return JSON 格式 Meta 元数据 * @return JSON 格式 Meta 元数据
*/ */
public JSONObject getMetaJson() { public JSONObject getMetaJson() {
JSONObject meta = new JSONObject(); JSONObject meta = new JSONObject(true);
meta.put("title", this.name); meta.put("title", this.name);
meta.put("icon", this.icon); meta.put("icon", this.icon);
meta.put("orderNo", this.serial); meta.put("orderNo", this.serial);
meta.put("hideMenu", this.hidden); meta.put("hideMenu", this.hidden);
if (this.meta != null) {
try { meta.putAll(this.meta);
String raw = this.meta.replace("\\", "").replaceAll("^\"(.*)\"$", "$1");
meta.putAll(JSON.parseObject(raw));
} catch (Exception ignored) {}
return meta;
} }
return meta;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false;
Permission that = (Permission) o;
return this.getId() != null && Objects.equals(this.getId(), that.getId());
}
@Override
public int hashCode() {
return getClass().hashCode();
} }
} }
...@@ -8,14 +8,12 @@ import com.yiring.common.domain.BasicEntity; ...@@ -8,14 +8,12 @@ import com.yiring.common.domain.BasicEntity;
import java.io.Serial; import java.io.Serial;
import java.io.Serializable; import java.io.Serializable;
import java.util.HashSet; import java.util.HashSet;
import java.util.Objects;
import java.util.Set; import java.util.Set;
import javax.persistence.*; import javax.persistence.*;
import lombok.*; import lombok.*;
import lombok.experimental.FieldDefaults; import lombok.experimental.FieldDefaults;
import lombok.experimental.FieldNameConstants; import lombok.experimental.FieldNameConstants;
import lombok.experimental.SuperBuilder; import lombok.experimental.SuperBuilder;
import org.hibernate.Hibernate;
import org.hibernate.annotations.Comment; import org.hibernate.annotations.Comment;
/** /**
...@@ -67,17 +65,4 @@ public class Role extends BasicEntity implements Serializable { ...@@ -67,17 +65,4 @@ public class Role extends BasicEntity implements Serializable {
inverseJoinColumns = { @JoinColumn(name = "user_id") } inverseJoinColumns = { @JoinColumn(name = "user_id") }
) )
Set<User> users = new HashSet<>(); Set<User> users = new HashSet<>();
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false;
Role role = (Role) o;
return this.getId() != null && Objects.equals(this.getId(), role.getId());
}
@Override
public int hashCode() {
return getClass().hashCode();
}
} }
...@@ -10,14 +10,13 @@ import com.yiring.auth.vo.permission.PermissionVo; ...@@ -10,14 +10,13 @@ import com.yiring.auth.vo.permission.PermissionVo;
import com.yiring.common.core.Result; import com.yiring.common.core.Result;
import com.yiring.common.core.Status; import com.yiring.common.core.Status;
import com.yiring.common.param.IdParam; import com.yiring.common.param.IdParam;
import com.yiring.common.param.OptionalPidParam;
import com.yiring.common.param.PageParam; import com.yiring.common.param.PageParam;
import com.yiring.common.vo.PageVo; import com.yiring.common.vo.PageVo;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.validation.Valid; import javax.validation.Valid;
...@@ -25,9 +24,11 @@ import lombok.extern.slf4j.Slf4j; ...@@ -25,9 +24,11 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.data.domain.Example; import org.springframework.data.domain.Example;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated; 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;
/** /**
* 系统权限管理控制器 * 系统权限管理控制器
...@@ -121,12 +122,10 @@ public class PermissionController { ...@@ -121,12 +122,10 @@ public class PermissionController {
} }
@ApiOperation(value = "树结构查询") @ApiOperation(value = "树结构查询")
@GetMapping(value = "tree", headers = "Content-Type=" + MediaType.APPLICATION_FORM_URLENCODED_VALUE) @GetMapping(value = "tree")
public Result<ArrayList<PermissionVo>> tree( public Result<ArrayList<PermissionVo>> tree(OptionalPidParam param) {
@ApiParam(value = "父级 id", example = "0") @RequestParam(required = false) Long pid
) {
List<Permission> permissions = permissionRepository.findAll(); List<Permission> permissions = permissionRepository.findAll();
List<PermissionVo> vos = Permissions.toTree(permissions, Objects.isNull(pid) ? 0L : pid); List<PermissionVo> vos = Permissions.toTree(permissions, param.getPid() == null ? 0L : param.getPid());
return Result.ok((ArrayList<PermissionVo>) vos); return Result.ok((ArrayList<PermissionVo>) vos);
} }
......
...@@ -7,8 +7,8 @@ dependencies { ...@@ -7,8 +7,8 @@ dependencies {
// 本地依赖 // 本地依赖
implementation fileTree(dir: project.rootDir.getPath() + '\\libs', includes: ['*jar']) implementation fileTree(dir: project.rootDir.getPath() + '\\libs', includes: ['*jar'])
// swagger annotations // swagger(knife4j)
implementation "io.swagger:swagger-annotations:${swaggerAnnotationsVersion}" implementation "com.github.xiaoymin:knife4j-spring-boot-starter:${knife4jVersion}"
implementation "cn.dev33:sa-token-dao-redis-jackson:${saTokenVersion}" implementation "cn.dev33:sa-token-dao-redis-jackson:${saTokenVersion}"
...@@ -26,4 +26,15 @@ dependencies { ...@@ -26,4 +26,15 @@ dependencies {
exclude group: 'com.fasterxml.jackson.core' exclude group: 'com.fasterxml.jackson.core'
} }
// JTS 几何对象操作库
implementation "org.locationtech.jts:jts-core:${jtsVersion}"
// https://mvnrepository.com/artifact/org.n52.jackson/jackson-datatype-jts/1.2.10
implementation("org.n52.jackson:jackson-datatype-jts:1.2.10") {
exclude group: 'com.fasterxml.jackson.core', module: 'jackson-databind'
exclude group: 'com.fasterxml.jackson.core', module: 'jackson-annotations'
exclude group: 'com.fasterxml.jackson.core', module: 'jackson-core'
exclude group: 'org.locationtech.jts', module: 'jts-core'
}
} }
...@@ -17,7 +17,7 @@ import lombok.experimental.FieldDefaults; ...@@ -17,7 +17,7 @@ import lombok.experimental.FieldDefaults;
* @version 0.1 * @version 0.1
* 2019/5/28 22:11 * 2019/5/28 22:11
*/ */
@ApiModel("IdParam") @ApiModel(value = "IdParam", description = "公共的 ID 查询参数")
@Valid @Valid
@Data @Data
@Builder @Builder
......
/* (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 lombok.*;
import lombok.experimental.FieldDefaults;
/**
* 公共的关键字查询参数类
*
* @author ifzm
* @version 0.1
* 2022/4/27 08:53
*/
@ApiModel(value = "KeywordParam", description = "公共的关键字查询参数")
@Valid
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class KeywordParam implements Serializable {
@Serial
private static final long serialVersionUID = -8690942241103456894L;
@ApiModelProperty(value = "关键字", example = "hi")
String keyword;
}
/* (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 lombok.*;
import lombok.experimental.FieldDefaults;
/**
* 公共的可选父级 ID 查询参数
*
* @author ifzm
* @version 0.1
* 2019/5/28 22:11
*/
@ApiModel(value = "OptionalPidParam", description = "公共的可选父级 ID 查询参数")
@Valid
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class OptionalPidParam implements Serializable {
@Serial
private static final long serialVersionUID = -8690942241103456893L;
@ApiModelProperty(value = "pid", example = "0")
Long pid;
}
...@@ -19,13 +19,12 @@ import org.springframework.data.domain.Pageable; ...@@ -19,13 +19,12 @@ import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
/** /**
* 分页查询参数公共类 * 公共的分页排序查询参数
* *
* @author ifzm * @author ifzm
* @version 0.1 2019/3/10 16:29 * @version 0.1 2019/3/10 16:29
*/ */
@SuppressWarnings({ "unused" }) @ApiModel(value = "PageParam", description = "公共的分页排序查询参数")
@ApiModel("分页查询参数公共类")
@Data @Data
@SuperBuilder @SuperBuilder
@NoArgsConstructor @NoArgsConstructor
...@@ -58,6 +57,7 @@ public class PageParam implements Serializable { ...@@ -58,6 +57,7 @@ public class PageParam implements Serializable {
* @param param {@link PageParam} * @param param {@link PageParam}
* @return Pageable * @return Pageable
*/ */
@SuppressWarnings({ "unused" })
public static Pageable toPageable(PageParam param) { public static Pageable toPageable(PageParam param) {
if (param == null) { if (param == null) {
return Pageable.unpaged(); 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 = "0", required = true)
@NotNull(message = "pid 不能为空")
Long pid;
}
...@@ -16,7 +16,7 @@ import lombok.experimental.FieldDefaults; ...@@ -16,7 +16,7 @@ import lombok.experimental.FieldDefaults;
* @version 0.1 * @version 0.1
* 2022/3/23 16:47 * 2022/3/23 16:47
*/ */
@ApiModel("DataVo") @ApiModel(value = "DataVo", description = "公共数据响应输出")
@Data @Data
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
......
...@@ -16,7 +16,7 @@ import lombok.experimental.FieldDefaults; ...@@ -16,7 +16,7 @@ import lombok.experimental.FieldDefaults;
* 2022/3/24 17:29 * 2022/3/24 17:29
*/ */
@ApiModel("KeyValueVo") @ApiModel(value = "KeyValueVo", description = "键值对响应输出")
@Data @Data
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
......
...@@ -16,7 +16,7 @@ import lombok.experimental.FieldDefaults; ...@@ -16,7 +16,7 @@ import lombok.experimental.FieldDefaults;
* @author ifzm * @author ifzm
* @version 0.1 2019/3/10 16:29 * @version 0.1 2019/3/10 16:29
*/ */
@ApiModel("PageVo") @ApiModel(value = "PageVo", description = "公共分页查询响应输出")
@Data @Data
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
...@@ -26,10 +26,10 @@ public class PageVo<T extends Serializable> implements Serializable { ...@@ -26,10 +26,10 @@ public class PageVo<T extends Serializable> implements Serializable {
@Serial @Serial
private static final long serialVersionUID = 6103761701912769946L; private static final long serialVersionUID = 6103761701912769946L;
@ApiModelProperty(value = "数据") @ApiModelProperty(value = "数据", required = true)
List<T> data; List<T> data;
@ApiModelProperty(value = "数据总数", example = "100") @ApiModelProperty(value = "数据总数", example = "100", required = true)
Long total; Long total;
/** /**
......
...@@ -9,7 +9,6 @@ import java.io.File; ...@@ -9,7 +9,6 @@ import java.io.File;
import java.io.InputStream; import java.io.InputStream;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import javax.annotation.Resource;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
...@@ -23,14 +22,7 @@ import org.springframework.web.multipart.MultipartFile; ...@@ -23,14 +22,7 @@ import org.springframework.web.multipart.MultipartFile;
@SuppressWarnings({ "unused" }) @SuppressWarnings({ "unused" })
@Component @Component
public class Minio { public record Minio(MinioConfig config, MinioClient client) {
@Resource
public MinioConfig config;
@Resource(name = "MinioClient")
public MinioClient client;
/** /**
* 业务数据存储桶 * 业务数据存储桶
*/ */
...@@ -38,6 +30,7 @@ public class Minio { ...@@ -38,6 +30,7 @@ public class Minio {
/** /**
* 获取文件访问地址 * 获取文件访问地址
*
* @param object 文件相对地址(含路径) * @param object 文件相对地址(含路径)
* @return URI * @return URI
*/ */
...@@ -47,6 +40,7 @@ public class Minio { ...@@ -47,6 +40,7 @@ public class Minio {
/** /**
* 上传文件流 * 上传文件流
*
* @param is 文件流 * @param is 文件流
* @param contentType 文件类型 * @param contentType 文件类型
* @param object 文件存储相对地址 * @param object 文件存储相对地址
...@@ -66,6 +60,7 @@ public class Minio { ...@@ -66,6 +60,7 @@ public class Minio {
/** /**
* 将文件上传到当前日期文件夹 * 将文件上传到当前日期文件夹
*
* @param file 文件 MultipartFile * @param file 文件 MultipartFile
* @return 上传结果 * @return 上传结果
* @throws Exception 异常 * @throws Exception 异常
...@@ -82,6 +77,7 @@ public class Minio { ...@@ -82,6 +77,7 @@ public class Minio {
/** /**
* 将文件上传到当前日期文件夹 * 将文件上传到当前日期文件夹
*
* @param file 文件 MultipartFile * @param file 文件 MultipartFile
* @return 上传结果 * @return 上传结果
* @throws Exception 异常 * @throws Exception 异常
...@@ -97,6 +93,7 @@ public class Minio { ...@@ -97,6 +93,7 @@ public class Minio {
/** /**
* 删除文件 * 删除文件
*
* @param object 文件相对地址 * @param object 文件相对地址
* @throws Exception 异常 * @throws Exception 异常
*/ */
...@@ -107,6 +104,7 @@ public class Minio { ...@@ -107,6 +104,7 @@ public class Minio {
/** /**
* 获取文件 * 获取文件
*
* @param object 文件相对地址 * @param object 文件相对地址
* @return 文件流 * @return 文件流
* @throws Exception 异常 * @throws Exception 异常
...@@ -118,6 +116,7 @@ public class Minio { ...@@ -118,6 +116,7 @@ public class Minio {
/** /**
* 查询文件信息 * 查询文件信息
*
* @param object 文件相对地址 * @param object 文件相对地址
* @return 文件信息 * @return 文件信息
* @throws Exception 异常 * @throws Exception 异常
...@@ -129,6 +128,7 @@ public class Minio { ...@@ -129,6 +128,7 @@ public class Minio {
/** /**
* 查询 list * 查询 list
*
* @param prefix 文件路径前缀 * @param prefix 文件路径前缀
* @return 文件/文件夹集合 * @return 文件/文件夹集合
*/ */
...@@ -139,6 +139,7 @@ public class Minio { ...@@ -139,6 +139,7 @@ public class Minio {
/** /**
* 拷贝一个文件 * 拷贝一个文件
*
* @param source 源文件 object * @param source 源文件 object
* @param target 目标文件 object * @param target 目标文件 object
* @throws Exception 异常 * @throws Exception 异常
...@@ -158,6 +159,7 @@ public class Minio { ...@@ -158,6 +159,7 @@ public class Minio {
/** /**
* 上传业务数据文件 * 上传业务数据文件
*
* @param path 本地文件地址(通常是一个临时文件) * @param path 本地文件地址(通常是一个临时文件)
* @param object 文件 object * @param object 文件 object
* @return 上传结果 * @return 上传结果
......
...@@ -4,7 +4,8 @@ dependencies { ...@@ -4,7 +4,8 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-aop' implementation 'org.springframework.boot:spring-boot-starter-aop'
// hutool-extra // hutool
implementation "cn.hutool:hutool-core:${hutoolVersion}"
implementation "cn.hutool:hutool-extra:${hutoolVersion}" implementation "cn.hutool:hutool-extra:${hutoolVersion}"
// fastjson // fastjson
implementation "com.alibaba:fastjson:${fastJsonVersion}" implementation "com.alibaba:fastjson:${fastJsonVersion}"
......
...@@ -67,7 +67,8 @@ public class RequestAspect { ...@@ -67,7 +67,8 @@ public class RequestAspect {
} }
} }
log.info( log.info(
"[Request] URL: {}, IP: {}, Times: {}{}", "[Request] Method: {}, URL: {}, IP: {}, Times: {}{}",
request.getMethod(),
request.getRequestURL(), request.getRequestURL(),
Commons.getClientIpAddress(request), Commons.getClientIpAddress(request),
times, times,
......
...@@ -84,6 +84,27 @@ public class Commons { ...@@ -84,6 +84,27 @@ public class Commons {
} }
/** /**
* 对象 Copy
* @param source 源对象
* @param type 目标类型
* @param ignoreProperties 忽略属性
* @return 目标对象
* @param <T> 目标类型
*/
public <T> T transform(Object source, Class<T> type, String... ignoreProperties) {
try {
Constructor<T> declaredConstructor = type.getDeclaredConstructor();
// 实例化
T target = declaredConstructor.newInstance();
// 使用 BeanUtils 进行数据拷贝
BeanUtils.copyProperties(source, target, ignoreProperties);
return target;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 将集合通过 BeanUtils 反射转换成指定类型集合 * 将集合通过 BeanUtils 反射转换成指定类型集合
* @param list 原始数据集合 * @param list 原始数据集合
* @param type 目标类型 * @param type 目标类型
......
/* (C) 2022 YiRing, Inc. */
package com.yiring.common.util;
import cn.hutool.core.io.file.FileReader;
import java.io.File;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import javax.servlet.http.HttpServletResponse;
import lombok.experimental.UtilityClass;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
/**
* 文件工具类
*
* @author Jim
* @version 0.1
* 2022/4/22 13:54
*/
@UtilityClass
public class FileUtils {
/**
* 文件下载
* @param response HttpServletResponse
* @param file File
* @throws IOException IOException
*/
public void download(HttpServletResponse response, File file) throws IOException {
String filename = URLEncoder.encode(file.getName(), StandardCharsets.UTF_8);
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
response.setHeader(HttpHeaders.CONTENT_LENGTH, String.valueOf(file.length()));
response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + filename);
FileReader.create(file).writeToStream(response.getOutputStream(), true);
}
}
...@@ -11,7 +11,6 @@ ...@@ -11,7 +11,6 @@
```diff ```diff
+ @Resource + @Resource
+ Redis redis; + Redis redis;
+ Object value = redis.get(key); + Object value = redis.get(key);
``` ```
......
{ {
"name": "basic-api-project", "name": "basic-api-project",
"version": "0.0.1", "version": "0.0.1",
"scripts": {
"log": "conventional-changelog -p angular -i CHANGELOG.md -s"
},
"devDependencies": { "devDependencies": {
"cz-conventional-changelog": "^3.3.0" "cz-conventional-changelog": "^3.3.0",
"conventional-changelog-cli": "^2.2.2"
}, },
"config": { "config": {
"commitizen": { "commitizen": {
......
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论