/*
* Copyright (c) 2021, Otstar Lin (syfxlin@gmail.com). All Rights Reserved.
*/
package me.ixk.hoshi.common.result;
import java.net.URI;
import java.time.Instant;
import java.time.ZonedDateTime;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.springframework.context.support.DefaultMessageSourceResolvable;
import org.springframework.data.domain.Page;
import org.springframework.http.*;
import org.springframework.util.Assert;
import org.springframework.util.MultiValueMap;
import org.springframework.util.ObjectUtils;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
/**
* 统一响应(构造器)
* <p>
* 用于构造统一响应,可以设置 HttpHeader 或响应码,响应信息等等
*
* @author Otstar Lin
* @date 2021/5/17 下午 9:46
*/
public class ApiResult<T> {
/**
* 响应状态码或者 Api 信息实体,必须不能为空
*/
@NotNull
private final Object status;
/**
* 响应信息,可以为空,若未设置则使用响应码对应的 {@link ApiMessage} 信息
*/
@Nullable
private final String message;
/**
* 响应头
*/
private final HttpHeaders headers;
/**
* 响应数据
*/
@Nullable
private final T data;
public ApiResult(@NotNull final ApiMessage status) {
this(status, null);
}
public ApiResult(@NotNull final ApiMessage status, @Nullable final String message) {
this(null, null, status, message);
}
public ApiResult(@Nullable final T data, @NotNull final ApiMessage status, @Nullable final String message) {
this(data, null, status, message);
}
public ApiResult(
final MultiValueMap<String, String> headers,
final ApiMessage status,
@Nullable final String message
) {
this(null, headers, status, message);
}
public ApiResult(
@Nullable final T data,
@Nullable final MultiValueMap<String, String> headers,
final ApiMessage status,
@Nullable final String message
) {
this(data, headers, (Object) status, message);
}
public ApiResult(
@Nullable final T data,
@Nullable final MultiValueMap<String, String> headers,
final int rawStatus,
@Nullable final String message
) {
this(data, headers, (Object) rawStatus, message);
}
private ApiResult(
@Nullable final T data,
@Nullable final MultiValueMap<String, String> headers,
@NotNull final Object status,
@Nullable final String message
) {
Assert.notNull(status, "Status 必须不为空");
this.status = status;
this.message = message;
this.data = data;
this.headers = HttpHeaders.readOnlyHttpHeaders(headers != null ? headers : new HttpHeaders());
}
/**
* 获取 {@link ApiMessage}
*
* @return {@link ApiMessage}
*/
public ApiMessage getApiMessage() {
if (this.status instanceof ApiMessage) {
return (ApiMessage) this.status;
} else {
return ApiMessage.valueOf((Integer) this.status);
}
}
/**
* 获取状态码
* <p>
* 若是 {@link ApiMessage} 则取出对应的状态码 {@link ApiMessage#value()}
* <p>
* 否则就是 {@link Integer} 类型的状态码,直接返回
*
* @return 状态码
*/
public int getStatus() {
if (this.status instanceof ApiMessage) {
return ((ApiMessage) this.status).value();
} else {
return (Integer) this.status;
}
}
/**
* 获取响应信息
* <p>
* 如果响应信息已设置,则返回设置的响应信息
* <p>
* 如果没有设置则获取对应状态码对应的响应信息
*
* @return 响应信息
*/
public String getMessage() {
return this.message == null ? this.getApiMessage().message() : this.message;
}
public HttpHeaders getHeaders() {
return this.headers;
}
@Nullable
public T getData() {
return this.data;
}
public boolean hasData() {
return (this.data != null);
}
@Override
public boolean equals(@Nullable final Object other) {
if (this == other) {
return true;
}
if (other == null || other.getClass() != this.getClass()) {
return false;
}
final ApiResult<?> otherEntity = (ApiResult<?>) other;
return (
ObjectUtils.nullSafeEquals(this.headers, otherEntity.headers) &&
ObjectUtils.nullSafeEquals(this.data, otherEntity.data) &&
ObjectUtils.nullSafeEquals(this.status, otherEntity.status)
);
}
@Override
public int hashCode() {
return (
29 *
(ObjectUtils.nullSafeHashCode(this.headers) * 29 + ObjectUtils.nullSafeHashCode(this.data)) +
ObjectUtils.nullSafeHashCode(this.status)
);
}
@Override
public String toString() {
final StringBuilder builder = new StringBuilder("<");
builder.append(this.status);
if (this.status instanceof ApiMessage) {
builder.append(' ');
builder.append(((ApiMessage) this.status).message());
}
builder.append(',');
final T data = this.getData();
final HttpHeaders headers = this.getHeaders();
if (data != null) {
builder.append(data);
builder.append(',');
}
builder.append(headers);
builder.append('>');
return builder.toString();
}
/**
* 转换为 {@link ApiEntity}
*
* @return ApiEntity
*/
public ApiEntity<T> toEntity() {
return new ApiEntity<>(this.getStatus(), this.getMessage(), this.getData());
}
// Static builder methods
public static DataBuilder status(@NotNull final ApiMessage status) {
Assert.notNull(status, "Status 必须不为空");
return new DefaultBuilder(status);
}
public static DataBuilder status(@NotNull final ApiMessage status, @Nullable final String message) {
return status(status).message(message);
}
public static DataBuilder status(final int status) {
return new DefaultBuilder(status);
}
public static DataBuilder status(final int status, @Nullable final String message) {
return status(status).message(message);
}
public static DataBuilder status(@NotNull final HttpStatus status) {
Assert.notNull(status, "Status 必须不为空");
return status(status.value());
}
public static DataBuilder status(@NotNull final HttpStatus status, @Nullable final String message) {
Assert.notNull(status, "Status 必须不为空");
return status(status).message(message);
}
public static DataBuilder ok() {
return ok(null);
}
public static DataBuilder ok(@Nullable final String message) {
return status(ApiMessage.OK, message);
}
public static <T> ApiResult<T> ok(@Nullable final T data) {
return ok().data(data);
}
public static <T> ApiResult<T> ok(@Nullable final T data, @Nullable final String message) {
return ok(message).data(data);
}
public static <T> ApiResult<ApiPage<T>> page(@NotNull final List<T> records) {
return page(records, null);
}
public static <T> ApiResult<ApiPage<T>> page(@NotNull final List<T> records, @Nullable final String message) {
Assert.notNull(records, "Records 必须不为空");
return page(new ApiPage<>(records), message);
}
public static <T> ApiResult<ApiPage<T>> page(@NotNull final Pag
没有合适的资源?快使用搜索试试~ 我知道了~
本科毕设-基于spring-boot+java实现的一个云笔记系统源码+项目说明.7z
共290个文件
java:134个
yml:63个
png:38个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 1 下载量 52 浏览量
2022-12-08
01:13:10
上传
评论 3
收藏 2.65MB 7Z 举报
温馨提示
本科毕设_基于spring-boot+java实现的一个云笔记系统源码+项目说明.7z Hoshi-Note 是一个云笔记系统,由 Hoshi-UI 模块提供前端界面。 基于 Spring Boot 与 Spring Cloud 开发,采用微服务及分布式模式部署,集群使用 Kubernetes 进行管理。 容器化部署,同时采用 Kubernetes 对容器进行编排 Spring Boot 与 Spring Cloud 开发,并集成 Spring Cloud Kubernetes,为微服务提供原生支持的服务发现与配置管理 单点登录支持 React 编写前端组件,实现前后的分离 使用 MinIO、CockroachDB、Redis、RabbitMQ 服务组件,原生支持分布式部署 Grafana、Prometheus、Loki 作为集群指标与日志收集的监控平台 使用 GitHub Actions 与 GitHub Packages 实现持续集成与持续部署
资源推荐
资源详情
资源评论
收起资源包目录
本科毕设-基于spring-boot+java实现的一个云笔记系统源码+项目说明.7z (290个子文件)
Dockerfile 600B
.editorconfig 1KB
spring.factories 111B
spring.factories 106B
spring.factories 106B
code.ftlh 12KB
.gitignore 984B
note.http 2KB
file.http 852B
ApiResult.java 21KB
ApiMessage.java 19KB
NoteController.java 18KB
UserManagerController.java 10KB
UserController.java 8KB
ModelArgumentResolver.java 8KB
FileController.java 8KB
Note.java 7KB
AuthController.java 7KB
User.java 6KB
Request.java 4KB
PexelsController.java 4KB
JsonArgumentResolver.java 4KB
Workspace.java 4KB
FollowController.java 4KB
AfterInjectResolverConfig.java 4KB
WorkspaceController.java 4KB
NoteHistory.java 4KB
ShareController.java 4KB
VerifyCodeService.java 4KB
Json.java 3KB
RoleManagerController.java 3KB
MinioService.java 3KB
MailService.java 3KB
Role.java 3KB
DefaultSecurityConfig.java 3KB
TokenController.java 3KB
AuthenticationHandler.java 3KB
UserInfo.java 3KB
DynamicFilterProvider.java 3KB
File.java 2KB
ApiResultReturnValueHandler.java 2KB
ApiResultAdvice.java 2KB
UserAttributeResolver.java 2KB
DefaultWebConfig.java 2KB
ApiResultUtil.java 2KB
Token.java 2KB
Jpa.java 2KB
CompositeSessionIdResolver.java 2KB
JsonModelDynamicFilter.java 2KB
DynamicFilterResponseBodyAdvice.java 2KB
Attachment.java 2KB
ApiEntity.java 2KB
UserDetailsManager.java 2KB
SecurityConfig.java 2KB
Collaborator.java 2KB
ApiBindException.java 2KB
RegisterUserView.java 1KB
Follow.java 1KB
UserIdArgumentResolver.java 1KB
AddUserView.java 1KB
Security.java 1KB
NoteView.java 1KB
UpdateUserInfoView.java 1KB
UpdateUserView.java 1KB
UpdateNoteView.java 1KB
JsonMode.java 1KB
UpdatingRepository.java 1KB
App.java 1KB
UserDetails.java 1KB
FollowRepository.java 1KB
JsonParam.java 1KB
UserRepository.java 1KB
NoteRepository.java 1KB
AddRoleView.java 1KB
ApiPage.java 1KB
TokenRepository.java 1KB
JsonModel.java 1KB
DefaultCorsConfig.java 1KB
CodeMail.java 1KB
UserView.java 1KB
UpdateWorkspaceView.java 1KB
ListNoteView.java 1KB
MinioConfig.java 1KB
WorkspaceRepository.java 1KB
AddWorkspaceView.java 1KB
EnableClient.java 1KB
FilterUserView.java 1KB
HoshiUmsApplication.java 1KB
DynamicFilterResolver.java 1KB
UpdateRoleView.java 1001B
DefaultJsonConfig.java 1001B
MinioProperties.java 974B
Mail.java 956B
FileView.java 945B
VerifyCode.java 929B
WorkspaceView.java 926B
AddNoteView.java 911B
FileRepository.java 908B
UpdateFile.java 895B
UpdateEmailView.java 887B
共 290 条
- 1
- 2
- 3
资源评论
- wangjineryou2023-01-19发现一个超赞的资源,赶紧学习起来,大家一起进步,支持!
onnx
- 粉丝: 9970
- 资源: 5626
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 5G SRM815模组原理框图.jpg
- T型3电平逆变器,lcl滤波器滤波器参数计算,半导体损耗计算,逆变电感参数设计损耗计算 mathcad格式输出,方便修改 同时支持plecs损耗仿真,基于plecs的闭环仿真,电压外环,电流内环
- 毒舌(解锁版).apk
- 显示HEX、S19、Bin、VBF等其他汽车制造商特定的文件格式
- 8bit逐次逼近型SAR ADC电路设计成品 入门时期的第三款sarADC,适合新手学习等 包括电路文件和详细设计文档 smic0.18工艺,单端结构,3.3V供电 整体采样率500k,可实现基
- 操作系统实验 ucorelab4内核线程管理
- 脉冲注入法,持续注入,启动低速运行过程中注入,电感法,ipd,力矩保持,无霍尔无感方案,媲美有霍尔效果 bldc控制器方案,无刷电机 提供源码,原理图
- Matlab Simulink#直驱永磁风电机组并网仿真模型 基于永磁直驱式风机并网仿真模型 采用背靠背双PWM变流器,先整流,再逆变 不仅实现电机侧的有功、无功功率的解耦控制和转速调节,而且能实
- 157389节奏盒子地狱模式第三阶段7.apk
- 操作系统实验ucore lab3
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功