commit 8c936791c34963c410831202ad4ff7861746fff7 Author: yovinchen Date: Wed Jun 14 20:12:48 2023 +0800 Changes diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..afa4cd3 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,10 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Zeppelin 忽略的文件 +/ZeppelinRemoteNotebooks/ diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..deb76fb --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml new file mode 100644 index 0000000..3c9668d --- /dev/null +++ b/.idea/dataSources.xml @@ -0,0 +1,12 @@ + + + + + mysql.8 + true + com.mysql.cj.jdbc.Driver + jdbc:mysql://localhost:3306/ + $ProjectFileDir$ + + + \ No newline at end of file diff --git a/.idea/dictionaries/yovinchen.xml b/.idea/dictionaries/yovinchen.xml new file mode 100644 index 0000000..c29a336 --- /dev/null +++ b/.idea/dictionaries/yovinchen.xml @@ -0,0 +1,7 @@ + + + + doubao + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/intellij-javadocs-4.0.1.xml b/.idea/intellij-javadocs-4.0.1.xml new file mode 100644 index 0000000..7e79ed1 --- /dev/null +++ b/.idea/intellij-javadocs-4.0.1.xml @@ -0,0 +1,204 @@ + + + + + UPDATE + false + true + + TYPE + METHOD + FIELD + + + PUBLIC + DEFAULT + PROTECTED + + + + + + ^.*(public|protected|private)*.+interface\s+\w+.* + /**\n + * The interface ${name}.\n +<#if element.typeParameters?has_content> * \n +</#if> +<#list element.typeParameters as typeParameter> + * @param <${typeParameter.name}> the type parameter\n +</#list> + */ + + + ^.*(public|protected|private)*.+enum\s+\w+.* + /**\n + * The enum ${name}.\n + */ + + + ^.*(public|protected|private)*.+class\s+\w+.* + /**\n + * The type ${name}.\n +<#if element.typeParameters?has_content> * \n +</#if> +<#list element.typeParameters as typeParameter> + * @param <${typeParameter.name}> the type parameter\n +</#list> + */ + + + .+ + /**\n + * The type ${name}.\n + */ + + + + + .+ + /**\n + * Instantiates a new ${name}.\n +<#if element.parameterList.parameters?has_content> + *\n +</#if> +<#list element.parameterList.parameters as parameter> + * @param ${parameter.name} the ${paramNames[parameter.name]}\n +</#list> +<#if element.throwsList.referenceElements?has_content> + *\n +</#if> +<#list element.throwsList.referenceElements as exception> + * @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n +</#list> + */ + + + + + ^.*(public|protected|private)*\s*.*(\w(\s*<.+>)*)+\s+get\w+\s*\(.*\).+ + /**\n + * Gets ${partName}.\n +<#if element.typeParameters?has_content> * \n +</#if> +<#list element.typeParameters as typeParameter> + * @param <${typeParameter.name}> the type parameter\n +</#list> +<#if element.parameterList.parameters?has_content> + *\n +</#if> +<#list element.parameterList.parameters as parameter> + * @param ${parameter.name} the ${paramNames[parameter.name]}\n +</#list> +<#if isNotVoid> + *\n + * @return the ${partName}\n +</#if> +<#if element.throwsList.referenceElements?has_content> + *\n +</#if> +<#list element.throwsList.referenceElements as exception> + * @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n +</#list> + */ + + + ^.*(public|protected|private)*\s*.*(void|\w(\s*<.+>)*)+\s+set\w+\s*\(.*\).+ + /**\n + * Sets ${partName}.\n +<#if element.typeParameters?has_content> * \n +</#if> +<#list element.typeParameters as typeParameter> + * @param <${typeParameter.name}> the type parameter\n +</#list> +<#if element.parameterList.parameters?has_content> + *\n +</#if> +<#list element.parameterList.parameters as parameter> + * @param ${parameter.name} the ${paramNames[parameter.name]}\n +</#list> +<#if isNotVoid> + *\n + * @return the ${partName}\n +</#if> +<#if element.throwsList.referenceElements?has_content> + *\n +</#if> +<#list element.throwsList.referenceElements as exception> + * @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n +</#list> + */ + + + ^.*((public\s+static)|(static\s+public))\s+void\s+main\s*\(\s*String\s*(\[\s*\]|\.\.\.)\s+\w+\s*\).+ + /**\n + * The entry point of application.\n + + <#if element.parameterList.parameters?has_content> + *\n +</#if> + * @param ${element.parameterList.parameters[0].name} the input arguments\n +<#if element.throwsList.referenceElements?has_content> + *\n +</#if> +<#list element.throwsList.referenceElements as exception> + * @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n +</#list> + */ + + + .+ + /**\n + * ${name}<#if isNotVoid> ${return}</#if>.\n +<#if element.typeParameters?has_content> * \n +</#if> +<#list element.typeParameters as typeParameter> + * @param <${typeParameter.name}> the type parameter\n +</#list> +<#if element.parameterList.parameters?has_content> + *\n +</#if> +<#list element.parameterList.parameters as parameter> + * @param ${parameter.name} the ${paramNames[parameter.name]}\n +</#list> +<#if isNotVoid> + *\n + * @return the ${return}\n +</#if> +<#if element.throwsList.referenceElements?has_content> + *\n +</#if> +<#list element.throwsList.referenceElements as exception> + * @throws ${exception.referenceName} the ${exceptionNames[exception.referenceName]}\n +</#list> + */ + + + + + ^.*(public|protected|private)*.+static.*(\w\s\w)+.+ + /**\n + * The constant ${element.getName()}.\n + */ + + + ^.*(public|protected|private)*.*(\w\s\w)+.+ + /**\n + <#if element.parent.isInterface()> + * The constant ${element.getName()}.\n +<#else> + * The ${name}.\n +</#if> */ + + + .+ + /**\n + <#if element.parent.isEnum()> + *${name} ${typeName}.\n +<#else> + * The ${name}.\n +</#if>*/ + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..22e83c6 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/jpa-buddy.xml b/.idea/jpa-buddy.xml new file mode 100644 index 0000000..966d5f5 --- /dev/null +++ b/.idea/jpa-buddy.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..47988e6 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/qaplug_profiles.xml b/.idea/qaplug_profiles.xml new file mode 100644 index 0000000..3dfd21f --- /dev/null +++ b/.idea/qaplug_profiles.xml @@ -0,0 +1,465 @@ + + + + + \ No newline at end of file diff --git a/.idea/sqldialects.xml b/.idea/sqldialects.xml new file mode 100644 index 0000000..56782ca --- /dev/null +++ b/.idea/sqldialects.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..f9516a6 --- /dev/null +++ b/pom.xml @@ -0,0 +1,133 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.3.8.RELEASE + + + com.yovinchen + forum + 0.0.1-SNAPSHOT + doubao + Demo project for Spring Boot + + 1.8 + UTF-8 + UTF-8 + 3.4.2 + 1.2.75 + 5.5.7 + 0.9.1 + 5.1.1 + + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + true + + + + + io.jsonwebtoken + jjwt + ${jwt.version} + + + + com.vdurmont + emoji-java + ${emoji-java.version} + + + + org.apache.commons + commons-pool2 + + + + cn.hutool + hutool-all + ${hutool.version} + + + + mysql + mysql-connector-java + runtime + + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus.version} + + + + com.alibaba + fastjson + ${fastjson.version} + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + + org.hibernate.validator + hibernate-validator + + + + com.github.xiaoymin + knife4j-spring-boot-starter + 3.0.3 + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + + diff --git a/src/main/java/com/yovinchen/forum/DoubaoApplication.java b/src/main/java/com/yovinchen/forum/DoubaoApplication.java new file mode 100644 index 0000000..bfd2df0 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/DoubaoApplication.java @@ -0,0 +1,31 @@ +package com.yovinchen.forum; + +import com.yovinchen.forum.jwt.JwtAuthenticationFilter; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import org.springframework.context.annotation.Bean; + +@MapperScan("com.yovinchen.forum.mapper") +@SpringBootApplication +public class DoubaoApplication extends SpringBootServletInitializer { + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { + return builder.sources(DoubaoApplication.class); + } + @Bean + public FilterRegistrationBean jwtFilter() { + final FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + JwtAuthenticationFilter filter = new JwtAuthenticationFilter(); + registrationBean.setFilter(filter); + return registrationBean; + } + + public static void main(String[] args) { + SpringApplication.run(DoubaoApplication.class, args); + } +} + diff --git a/src/main/java/com/yovinchen/forum/common/api/ApiErrorCode.java b/src/main/java/com/yovinchen/forum/common/api/ApiErrorCode.java new file mode 100644 index 0000000..7fd6f58 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/common/api/ApiErrorCode.java @@ -0,0 +1,52 @@ +package com.yovinchen.forum.common.api; + + +public enum ApiErrorCode implements IErrorCode { + + /** + * 成功 + */ + SUCCESS(200, "操作成功"), + /** + * 失败 + */ + FAILED(-1, "操作失败"), + /** + * 未登录,Token过期 + */ + UNAUTHORIZED(401, "暂未登录或token已经过期"), + /** + * 权限不足 + */ + FORBIDDEN(403, "权限不足"), + /** + * 参数校验错误 + */ + VALIDATE_FAILED(404, "参数检验失败"); + + private final Integer code; + private final String message; + + ApiErrorCode(int code, String message) { + this.code = code; + this.message = message; + } + + @Override + public Integer getCode() { + return code; + } + + @Override + public String getMessage() { + return message; + } + + @Override + public String toString() { + return "ApiErrorCode{" + + "code=" + code + + ", message='" + message + '\'' + + '}'; + } +} diff --git a/src/main/java/com/yovinchen/forum/common/api/ApiResult.java b/src/main/java/com/yovinchen/forum/common/api/ApiResult.java new file mode 100644 index 0000000..ed31a49 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/common/api/ApiResult.java @@ -0,0 +1,152 @@ +package com.yovinchen.forum.common.api; + + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Optional; + + +@Data +@NoArgsConstructor +@ApiModel(value = "API 接口返回结果", description = "用于封装 API 接口返回的结果") +public class ApiResult implements Serializable { + + private static final long serialVersionUID = -4153430394359594346L; + /** + * 业务状态码 + */ + @ApiModelProperty(value = "业务状态码") + private long code; + /** + * 结果集 + */ + @ApiModelProperty(value = "结果集") + private T data; + /** + * 接口描述 + */ + @ApiModelProperty(value = "接口描述") + private String message; + + /** + * 全参 + * + * @param code 业务状态码 + * @param message 描述 + * @param data 结果集 + */ + public ApiResult(long code, String message, T data) { + this.code = code; + this.message = message; + this.data = data; + } + + public ApiResult(IErrorCode errorCode) { + errorCode = Optional.ofNullable(errorCode).orElse(ApiErrorCode.FAILED); + this.code = errorCode.getCode(); + this.message = errorCode.getMessage(); + } + + /** + * 成功 + * + * @param data 结果集 + * @return {code:200,message:操作成功,data:自定义} + */ + public static ApiResult success() { + return new ApiResult(ApiErrorCode.SUCCESS.getCode(), ApiErrorCode.SUCCESS.getMessage(), null); + } + + /** + * 成功 + * + * @param data 结果集 + * @return {code:200,message:操作成功,data:自定义} + */ + public static ApiResult success(T data) { + return new ApiResult(ApiErrorCode.SUCCESS.getCode(), ApiErrorCode.SUCCESS.getMessage(), data); + } + + /** + * 成功 + * + * @param data 结果集 + * @param message 自定义提示信息 + * @return {code:200,message:自定义,data:自定义} + */ + public static ApiResult success(T data, String message) { + return new ApiResult(ApiErrorCode.SUCCESS.getCode(), message, data); + } + + /** + * 失败返回结果 + */ + public static ApiResult failed() { + return failed(ApiErrorCode.FAILED); + } + + /** + * 失败返回结果 + * + * @param message 提示信息 + * @return {code:枚举ApiErrorCode取,message:自定义,data:null} + */ + public static ApiResult failed(String message) { + return new ApiResult(ApiErrorCode.FAILED.getCode(), message, null); + } + + /** + * 失败 + * + * @param errorCode 错误码 + * @return {code:封装接口取,message:封装接口取,data:null} + */ + public static ApiResult failed(IErrorCode errorCode) { + return new ApiResult(errorCode.getCode(), errorCode.getMessage(), null); + } + + /** + * 失败返回结果 + * + * @param errorCode 错误码 + * @param message 错误信息 + * @return {code:枚举ApiErrorCode取,message:自定义,data:null} + */ + public static ApiResult failed(IErrorCode errorCode, String message) { + return new ApiResult(errorCode.getCode(), message, null); + } + + /** + * 参数验证失败返回结果 + */ + public static ApiResult validateFailed() { + return failed(ApiErrorCode.VALIDATE_FAILED); + } + + /** + * 参数验证失败返回结果 + * + * @param message 提示信息 + */ + public static ApiResult validateFailed(String message) { + return new ApiResult(ApiErrorCode.VALIDATE_FAILED.getCode(), message, null); + } + + /** + * 未登录返回结果 + */ + public static ApiResult unauthorized(T data) { + return new ApiResult(ApiErrorCode.UNAUTHORIZED.getCode(), ApiErrorCode.UNAUTHORIZED.getMessage(), data); + } + + /** + * 未授权返回结果 + */ + public static ApiResult forbidden(T data) { + return new ApiResult(ApiErrorCode.FORBIDDEN.getCode(), ApiErrorCode.FORBIDDEN.getMessage(), data); + } +} diff --git a/src/main/java/com/yovinchen/forum/common/api/IErrorCode.java b/src/main/java/com/yovinchen/forum/common/api/IErrorCode.java new file mode 100644 index 0000000..d602d66 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/common/api/IErrorCode.java @@ -0,0 +1,18 @@ +package com.yovinchen.forum.common.api; + + +public interface IErrorCode { + /** + * 错误编码: -1失败;200成功 + * + * @return 错误编码 + */ + Integer getCode(); + + /** + * 错误描述 + * + * @return 错误描述 + */ + String getMessage(); +} diff --git a/src/main/java/com/yovinchen/forum/common/exception/ApiAsserts.java b/src/main/java/com/yovinchen/forum/common/exception/ApiAsserts.java new file mode 100644 index 0000000..87c2357 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/common/exception/ApiAsserts.java @@ -0,0 +1,24 @@ +package com.yovinchen.forum.common.exception; + +import com.yovinchen.forum.common.api.IErrorCode; + + +public class ApiAsserts { + /** + * 抛失败异常 + * + * @param message 说明 + */ + public static void fail(String message) { + throw new ApiException(message); + } + + /** + * 抛失败异常 + * + * @param errorCode 状态码 + */ + public static void fail(IErrorCode errorCode) { + throw new ApiException(errorCode); + } +} diff --git a/src/main/java/com/yovinchen/forum/common/exception/ApiException.java b/src/main/java/com/yovinchen/forum/common/exception/ApiException.java new file mode 100644 index 0000000..1acc58e --- /dev/null +++ b/src/main/java/com/yovinchen/forum/common/exception/ApiException.java @@ -0,0 +1,21 @@ +package com.yovinchen.forum.common.exception; + +import com.yovinchen.forum.common.api.IErrorCode; + + +public class ApiException extends RuntimeException { + private IErrorCode errorCode; + + public ApiException(IErrorCode errorCode) { + super(errorCode.getMessage()); + this.errorCode = errorCode; + } + + public ApiException(String message) { + super(message); + } + + public IErrorCode getErrorCode() { + return errorCode; + } +} diff --git a/src/main/java/com/yovinchen/forum/common/exception/GlobalExceptionHandler.java b/src/main/java/com/yovinchen/forum/common/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..2681f11 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/common/exception/GlobalExceptionHandler.java @@ -0,0 +1,23 @@ +package com.yovinchen.forum.common.exception;//package com.knox.aurora.common.exception; + +import com.yovinchen.forum.common.api.ApiResult; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.Map; + +@ControllerAdvice +public class GlobalExceptionHandler { + /** + * 捕获自定义异常 + */ + @ResponseBody + @ExceptionHandler(value = ApiException.class) + public ApiResult> handle(ApiException e) { + if (e.getErrorCode() != null) { + return ApiResult.failed(e.getErrorCode()); + } + return ApiResult.failed(e.getMessage()); + } +} diff --git a/src/main/java/com/yovinchen/forum/common/mybatisplus/MybatisPlusConfig.java b/src/main/java/com/yovinchen/forum/common/mybatisplus/MybatisPlusConfig.java new file mode 100644 index 0000000..52d433d --- /dev/null +++ b/src/main/java/com/yovinchen/forum/common/mybatisplus/MybatisPlusConfig.java @@ -0,0 +1,31 @@ +package com.yovinchen.forum.common.mybatisplus; + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + + +@Configuration +@MapperScan("com.yovinchen.forum.mapper") +public class MybatisPlusConfig { + + /** + * 新的分页插件,一缓和二缓遵循mybatis的规则, + * 需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除) + */ + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); + return interceptor; + } + + @Bean + public ConfigurationCustomizer configurationCustomizer() { + return configuration -> configuration.setUseDeprecatedExecutor(false); + } +} diff --git a/src/main/java/com/yovinchen/forum/config/GlobalWebMvcConfigurer.java b/src/main/java/com/yovinchen/forum/config/GlobalWebMvcConfigurer.java new file mode 100644 index 0000000..b284b83 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/config/GlobalWebMvcConfigurer.java @@ -0,0 +1,43 @@ +package com.yovinchen.forum.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + + +@Configuration +public class GlobalWebMvcConfigurer implements WebMvcConfigurer { + + /** + * 跨域 + */ + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedOrigins("*") + .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS") + .allowCredentials(true) + .maxAge(3600) + .allowedHeaders("*"); + } + + @Bean + public CorsFilter corsFilter() { + CorsConfiguration config = new CorsConfiguration(); + //允许所有域名进行跨域调用 + config.addAllowedOrigin("*"); + //允许跨越发送cookie + config.setAllowCredentials(true); + //放行全部原始头信息 + config.addAllowedHeader("*"); + //允许所有请求方法跨域调用 + config.addAllowedMethod("*"); + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + source.registerCorsConfiguration("/**", config); + return new CorsFilter(source); + } +} diff --git a/src/main/java/com/yovinchen/forum/config/Knife4jConfig.java b/src/main/java/com/yovinchen/forum/config/Knife4jConfig.java new file mode 100644 index 0000000..5486a42 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/config/Knife4jConfig.java @@ -0,0 +1,49 @@ +package com.yovinchen.forum.config; + +/** + * ClassName: config + * Package: com.yovinchen.forum.config + * + * @author yovinchen + * @Create 2023/6/14 16:51 + */ + +import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.Contact; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +@Configuration +@EnableSwagger2 +@EnableKnife4j +public class Knife4jConfig { + + @Bean + public Docket createRestApi() { + return new Docket(DocumentationType.SWAGGER_2) + .useDefaultResponseMessages(false) + .apiInfo(apiInfo()) + .select() + .apis(RequestHandlerSelectors.basePackage("com.yovinchen.forum.controller")) + .paths(PathSelectors.any()) + .build(); + + } + + private ApiInfo apiInfo() { + return new ApiInfoBuilder() + .description("论坛接口测试文档") + .contact(new Contact("测试", "https://github.com", "123@qq.com")) + .version("v1.0.1") + .title("API测试文档") + .build(); + } + +} diff --git a/src/main/java/com/yovinchen/forum/controller/BaseController.java b/src/main/java/com/yovinchen/forum/controller/BaseController.java new file mode 100644 index 0000000..4092f05 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/controller/BaseController.java @@ -0,0 +1,4 @@ +package com.yovinchen.forum.controller; + +public class BaseController { +} diff --git a/src/main/java/com/yovinchen/forum/controller/BmsBillboardController.java b/src/main/java/com/yovinchen/forum/controller/BmsBillboardController.java new file mode 100644 index 0000000..9cc5108 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/controller/BmsBillboardController.java @@ -0,0 +1,32 @@ +package com.yovinchen.forum.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.yovinchen.forum.common.api.ApiResult; +import com.yovinchen.forum.model.entity.BmsBillboard; +import com.yovinchen.forum.service.IBmsBillboardService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.List; + +@Api(tags = "公告牌管理接口") +@RestController +@RequestMapping("/billboard") +public class BmsBillboardController extends BaseController { + + @Resource + private IBmsBillboardService bmsBillboardService; + + @ApiOperation(value = "展示公告牌", notes = "获取最近一条展示中的公告牌信息") + @GetMapping("/show") + public ApiResult getNotices(){ + List list = bmsBillboardService.list(new + LambdaQueryWrapper().eq(BmsBillboard::isShow,true)); + return ApiResult.success(list.get(list.size()- 1)); + } +} diff --git a/src/main/java/com/yovinchen/forum/controller/BmsCommentController.java b/src/main/java/com/yovinchen/forum/controller/BmsCommentController.java new file mode 100644 index 0000000..c114e0e --- /dev/null +++ b/src/main/java/com/yovinchen/forum/controller/BmsCommentController.java @@ -0,0 +1,44 @@ +package com.yovinchen.forum.controller; + +import com.yovinchen.forum.common.api.ApiResult; +import com.yovinchen.forum.jwt.JwtUtil; +import com.yovinchen.forum.model.dto.CommentDTO; +import com.yovinchen.forum.model.entity.BmsComment; +import com.yovinchen.forum.model.entity.UmsUser; +import com.yovinchen.forum.model.vo.CommentVO; +import com.yovinchen.forum.service.IBmsCommentService; +import com.yovinchen.forum.service.IUmsUserService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +@Api(tags = "评论管理接口") +@RestController +@RequestMapping("/comment") +public class BmsCommentController extends BaseController { + + @Resource + private IBmsCommentService bmsCommentService; + @Resource + private IUmsUserService umsUserService; + + @ApiOperation(value = "根据话题ID获取评论列表", notes = "根据话题ID获取评论列表") + @GetMapping("/get_comments") + public ApiResult> getCommentsByTopicID(@ApiParam(value = "话题ID", required = true) @RequestParam(value = "topicid", defaultValue = "1") String topicid) { + List lstBmsComment = bmsCommentService.getCommentsByTopicID(topicid); + return ApiResult.success(lstBmsComment); + } + + @ApiOperation(value = "添加评论", notes = "添加评论") + @PostMapping("/add_comment") + public ApiResult create(@ApiParam(value = "当前用户名称", required = true) @RequestHeader(value = JwtUtil.USER_NAME) String userName, @ApiParam(value = "评论内容相关信息", required = true) @RequestBody CommentDTO dto) { + UmsUser user = umsUserService.getUserByUsername(userName); + BmsComment comment = bmsCommentService.create(dto, user); + return ApiResult.success(comment); + } + +} diff --git a/src/main/java/com/yovinchen/forum/controller/BmsPostController.java b/src/main/java/com/yovinchen/forum/controller/BmsPostController.java new file mode 100644 index 0000000..c628b17 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/controller/BmsPostController.java @@ -0,0 +1,91 @@ +package com.yovinchen.forum.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.vdurmont.emoji.EmojiParser; +import com.yovinchen.forum.common.api.ApiResult; +import com.yovinchen.forum.jwt.JwtUtil; +import com.yovinchen.forum.model.dto.CreateTopicDTO; +import com.yovinchen.forum.model.entity.BmsPost; +import com.yovinchen.forum.model.entity.UmsUser; +import com.yovinchen.forum.model.vo.PostVO; +import com.yovinchen.forum.service.IBmsPostService; +import com.yovinchen.forum.service.IUmsUserService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.Date; +import java.util.List; +import java.util.Map; + +@Api(tags = "帖子管理接口") +@RestController +@RequestMapping("/post") +public class BmsPostController extends BaseController { + + @Resource + private IBmsPostService iBmsPostService; + @Resource + private IUmsUserService umsUserService; + + @ApiOperation(value = "获取帖子列表", notes = "根据标签类型获取帖子列表") + @GetMapping("/list") + public ApiResult> list(@ApiParam(name = "tab", value = "标签类型", defaultValue = "latest") @RequestParam(value = "tab", defaultValue = "latest") String tab, @ApiParam(name = "pageNo", value = "页码", defaultValue = "1") @RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo, @ApiParam(name = "pageSize", value = "每页显示数量", defaultValue = "10") @RequestParam(value = "size", defaultValue = "10") Integer pageSize) { + Page list = iBmsPostService.getList(new Page<>(pageNo, pageSize), tab); + return ApiResult.success(list); + } + + + @ApiOperation(value = "创建帖子", notes = "通过传入参数来创建一个新的帖子") + @RequestMapping(value = "/create", method = RequestMethod.POST) + public ApiResult create(@RequestHeader(value = JwtUtil.USER_NAME) String userName, @ApiParam(name = "dto", value = "帖子内容", required = true) @RequestBody CreateTopicDTO dto) { + UmsUser user = umsUserService.getUserByUsername(userName); + BmsPost topic = iBmsPostService.create(dto, user); + return ApiResult.success(topic); + } + + + @ApiOperation(value = "查看帖子详情", notes = "通过ID查看帖子详情") + @GetMapping() + public ApiResult> view(@ApiParam(name = "id", value = "帖子ID", required = true) @RequestParam("id") String id) { + Map map = iBmsPostService.viewTopic(id); + return ApiResult.success(map); + } + + + @ApiOperation(value = "获取帖子推荐列表", notes = "通过当前帖子 ID 获取相关的推荐帖子列表") + @GetMapping("/recommend") + public ApiResult> getRecommend(@ApiParam(name = "id", value = "当前帖子ID", required = true) @RequestParam("topicId") String id) { + List topics = iBmsPostService.getRecommend(id); + return ApiResult.success(topics); + } + + + @ApiOperation(value = "更新帖子信息", notes = "用户可以通过该接口修改自己的帖子信息") + @PostMapping("/update") + public ApiResult update(@ApiParam(name = "userName", value = "用户名", required = true) @RequestHeader(value = JwtUtil.USER_NAME) String userName, @Valid @RequestBody BmsPost post) { + UmsUser umsUser = umsUserService.getUserByUsername(userName); + Assert.isTrue(umsUser.getId().equals(post.getUserId()), "非本人无权修改"); + post.setModifyTime(new Date()); + post.setContent(EmojiParser.parseToAliases(post.getContent())); + iBmsPostService.updateById(post); + return ApiResult.success(post); + } + + + @ApiOperation(value = "删除帖子", notes = "用户可以通过该接口删除自己的帖子") + @DeleteMapping("/delete/{id}") + public ApiResult delete(@ApiParam(name = "userName", value = "用户名", required = true) @RequestHeader(value = JwtUtil.USER_NAME) String userName, @ApiParam(name = "id", value = "帖子ID", required = true) @PathVariable("id") String id) { + UmsUser umsUser = umsUserService.getUserByUsername(userName); + BmsPost byId = iBmsPostService.getById(id); + Assert.notNull(byId, "来晚一步,话题已不存在"); + Assert.isTrue(byId.getUserId().equals(umsUser.getId()), "你为什么可以删除别人的话题???"); + iBmsPostService.removeById(id); + return ApiResult.success(null, "删除成功"); + } + +} diff --git a/src/main/java/com/yovinchen/forum/controller/BmsPromotionController.java b/src/main/java/com/yovinchen/forum/controller/BmsPromotionController.java new file mode 100644 index 0000000..3743770 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/controller/BmsPromotionController.java @@ -0,0 +1,33 @@ +package com.yovinchen.forum.controller; + +import com.yovinchen.forum.common.api.ApiResult; +import com.yovinchen.forum.model.entity.BmsPromotion; +import com.yovinchen.forum.service.IBmsPromotionService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.List; + + +@Api(tags = "推广管理接口") +@RestController +@RequestMapping("/promotion") +public class BmsPromotionController extends BaseController { + + @Resource + private IBmsPromotionService bmsPromotionService; + + @ApiOperation(value = "获取所有推广信息", notes = "获取所有推广信息列表") + @GetMapping("/all") + public ApiResult> list() { + List list = bmsPromotionService.list(); + return ApiResult.success(list); + } + +} + + diff --git a/src/main/java/com/yovinchen/forum/controller/BmsRelationshipController.java b/src/main/java/com/yovinchen/forum/controller/BmsRelationshipController.java new file mode 100644 index 0000000..0dbd7eb --- /dev/null +++ b/src/main/java/com/yovinchen/forum/controller/BmsRelationshipController.java @@ -0,0 +1,77 @@ +package com.yovinchen.forum.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.yovinchen.forum.common.api.ApiResult; +import com.yovinchen.forum.common.exception.ApiAsserts; +import com.yovinchen.forum.jwt.JwtUtil; +import com.yovinchen.forum.model.entity.BmsFollow; +import com.yovinchen.forum.model.entity.UmsUser; +import com.yovinchen.forum.service.IBmsFollowService; +import com.yovinchen.forum.service.IUmsUserService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.springframework.util.ObjectUtils; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.Map; + +@Api(tags = "关注管理接口") +@RestController +@RequestMapping("/relationship") +public class BmsRelationshipController extends BaseController { + + @Resource + private IBmsFollowService bmsFollowService; + + @Resource + private IUmsUserService umsUserService; + + @GetMapping("/subscribe/{userId}") + @ApiOperation(value = "关注用户", notes = "通过传入用户ID,让当前用户关注该用户") + public ApiResult handleFollow(@RequestHeader(value = JwtUtil.USER_NAME) String userName, @PathVariable("userId") @ApiParam(name = "userId", value = "用户ID", required = true, example = "12345") String parentId) { + UmsUser umsUser = umsUserService.getUserByUsername(userName); + if (parentId.equals(umsUser.getId())) { + ApiAsserts.fail("您脸皮太厚了,怎么可以关注自己呢 😮"); + } + BmsFollow one = bmsFollowService.getOne(new LambdaQueryWrapper().eq(BmsFollow::getParentId, parentId).eq(BmsFollow::getFollowerId, umsUser.getId())); + if (!ObjectUtils.isEmpty(one)) { + ApiAsserts.fail("已关注"); + } + + BmsFollow follow = new BmsFollow(); + follow.setParentId(parentId); + follow.setFollowerId(umsUser.getId()); + bmsFollowService.save(follow); + return ApiResult.success(null, "关注成功"); + } + + @GetMapping("/unsubscribe/{userId}") + @ApiOperation(value = "取消关注用户", notes = "通过传入用户ID,让当前用户取消关注该用户") + public ApiResult handleUnFollow(@RequestHeader(value = JwtUtil.USER_NAME) String userName, @PathVariable("userId") @ApiParam(name = "userId", value = "用户ID", required = true, example = "12345") String parentId) { + UmsUser umsUser = umsUserService.getUserByUsername(userName); + BmsFollow one = bmsFollowService.getOne(new LambdaQueryWrapper().eq(BmsFollow::getParentId, parentId).eq(BmsFollow::getFollowerId, umsUser.getId())); + if (ObjectUtils.isEmpty(one)) { + ApiAsserts.fail("未关注!"); + } + bmsFollowService.remove(new LambdaQueryWrapper().eq(BmsFollow::getParentId, parentId).eq(BmsFollow::getFollowerId, umsUser.getId())); + return ApiResult.success(null, "取关成功"); + } + + @GetMapping("/validate/{topicUserId}") + @ApiOperation(value = "查询是否关注该用户", notes = "通过传入用户ID,查询当前用户是否已经关注该用户,返回结果为布尔类型") + public ApiResult> isFollow(@RequestHeader(value = JwtUtil.USER_NAME) String userName, @PathVariable("topicUserId") @ApiParam(name = "topicUserId", value = "用户ID", required = true, example = "12345") String topicUserId) { + UmsUser umsUser = umsUserService.getUserByUsername(userName); + Map map = new HashMap<>(16); + map.put("hasFollow", false); + if (!ObjectUtils.isEmpty(umsUser)) { + BmsFollow one = bmsFollowService.getOne(new LambdaQueryWrapper().eq(BmsFollow::getParentId, topicUserId).eq(BmsFollow::getFollowerId, umsUser.getId())); + if (!ObjectUtils.isEmpty(one)) { + map.put("hasFollow", true); + } + } + return ApiResult.success(map); + } +} diff --git a/src/main/java/com/yovinchen/forum/controller/BmsSearchController.java b/src/main/java/com/yovinchen/forum/controller/BmsSearchController.java new file mode 100644 index 0000000..ae9897d --- /dev/null +++ b/src/main/java/com/yovinchen/forum/controller/BmsSearchController.java @@ -0,0 +1,31 @@ +package com.yovinchen.forum.controller; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yovinchen.forum.common.api.ApiResult; +import com.yovinchen.forum.model.vo.PostVO; +import com.yovinchen.forum.service.IBmsPostService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +@Api(tags = "搜索管理接口") +@RestController +@RequestMapping("/search") +public class BmsSearchController extends BaseController { + + @Resource + private IBmsPostService postService; + + @GetMapping + @ApiOperation(value = "根据关键字搜索帖子列表", notes = "根据指定关键字,分页查询帖子列表") + public ApiResult> searchList(@ApiParam(name = "keyword", value = "搜索关键字", required = true) @RequestParam("keyword") String keyword, @ApiParam(name = "pageNum", value = "页码", defaultValue = "1") @RequestParam("pageNum") Integer pageNum, @ApiParam(name = "pageSize", value = "每页显示条数", defaultValue = "10") @RequestParam("pageSize") Integer pageSize) { + Page results = postService.searchByKey(keyword, new Page<>(pageNum, pageSize)); + return ApiResult.success(results); + } +} diff --git a/src/main/java/com/yovinchen/forum/controller/BmsTagController.java b/src/main/java/com/yovinchen/forum/controller/BmsTagController.java new file mode 100644 index 0000000..892ffb5 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/controller/BmsTagController.java @@ -0,0 +1,46 @@ +package com.yovinchen.forum.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yovinchen.forum.common.api.ApiResult; +import com.yovinchen.forum.model.entity.BmsPost; +import com.yovinchen.forum.model.entity.BmsTag; +import com.yovinchen.forum.service.IBmsTagService; +import io.swagger.annotations.*; +import org.springframework.util.Assert; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.Map; + +@Api(tags = "标签管理接口") +@RestController +@RequestMapping("/tag") +public class BmsTagController extends BaseController { + + @Resource + private IBmsTagService bmsTagService; + + @ApiOperation(value = "根据标签名获取帖子列表", notes = "通过标签名获取帖子列表") + @ApiImplicitParams({@ApiImplicitParam(name = "name", value = "标签名", required = true, dataType = "String", paramType = "path"), @ApiImplicitParam(name = "page", value = "页码", defaultValue = "1", dataType = "Integer", paramType = "query"), @ApiImplicitParam(name = "size", value = "每页大小", defaultValue = "10", dataType = "Integer", paramType = "query")}) + @GetMapping("/{name}") + public ApiResult> getTopicsByTag(@ApiParam(name = "name", value = "标签名", required = true) @PathVariable("name") String tagName, @ApiParam(name = "page", value = "页码", defaultValue = "1") @RequestParam(value = "page", defaultValue = "1") Integer page, @ApiParam(name = "size", value = "每页大小", defaultValue = "10") @RequestParam(value = "size", defaultValue = "10") Integer size) { + + Map map = new HashMap<>(16); + + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(BmsTag::getName, tagName); + BmsTag one = bmsTagService.getOne(wrapper); + Assert.notNull(one, "话题不存在,或已被管理员删除"); + Page topics = bmsTagService.selectTopicsByTagId(new Page<>(page, size), one.getId()); + // 其他热门标签 + Page hotTags = bmsTagService.page(new Page<>(1, 10), new LambdaQueryWrapper().notIn(BmsTag::getName, tagName).orderByDesc(BmsTag::getTopicCount)); + + map.put("topics", topics); + map.put("hotTags", hotTags); + + return ApiResult.success(map); + } + +} diff --git a/src/main/java/com/yovinchen/forum/controller/BmsTipController.java b/src/main/java/com/yovinchen/forum/controller/BmsTipController.java new file mode 100644 index 0000000..ed11444 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/controller/BmsTipController.java @@ -0,0 +1,34 @@ +package com.yovinchen.forum.controller; + +import com.yovinchen.forum.common.api.ApiResult; +import com.yovinchen.forum.model.entity.BmsTip; +import com.yovinchen.forum.service.IBmsTipService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +@Api(tags = "每日一言管理接口") +@RestController +@RequestMapping("/tip") +public class BmsTipController extends BaseController { + + @Resource + private IBmsTipService bmsTipService; + + /** + * 获取一条随机的每日一言 + * + * @return 随机获取到的每日一言信息 + */ + @ApiOperation(value = "获取一条随机的每日一言", notes = "获取一条随机的每日一言") + @GetMapping("/today") + public ApiResult getRandomTip() { + BmsTip tip = bmsTipService.getRandomTip(); + return ApiResult.success(tip); + } +} + diff --git a/src/main/java/com/yovinchen/forum/controller/GiteeLogin.java b/src/main/java/com/yovinchen/forum/controller/GiteeLogin.java new file mode 100644 index 0000000..52d1c61 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/controller/GiteeLogin.java @@ -0,0 +1,11 @@ +package com.yovinchen.forum.controller; + +/** + * ClassName: GiteeLogin + * Package: com.yovinchen.forum.controller + * /oauth/callback + * @author yovinchen + * @Create 2023/6/14 20:11 + */ +public class GiteeLogin { +} diff --git a/src/main/java/com/yovinchen/forum/controller/UmsUserController.java b/src/main/java/com/yovinchen/forum/controller/UmsUserController.java new file mode 100644 index 0000000..458b34f --- /dev/null +++ b/src/main/java/com/yovinchen/forum/controller/UmsUserController.java @@ -0,0 +1,91 @@ +package com.yovinchen.forum.controller; + + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yovinchen.forum.common.api.ApiResult; +import com.yovinchen.forum.jwt.JwtUtil; +import com.yovinchen.forum.model.dto.LoginDTO; +import com.yovinchen.forum.model.dto.RegisterDTO; +import com.yovinchen.forum.model.entity.BmsPost; +import com.yovinchen.forum.model.entity.UmsUser; +import com.yovinchen.forum.service.IBmsPostService; +import com.yovinchen.forum.service.IUmsUserService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.springframework.util.Assert; +import org.springframework.util.ObjectUtils; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; +import java.util.HashMap; +import java.util.Map; + +@Api(tags = "用户管理接口") +@RestController +@RequestMapping("/ums/user") +public class UmsUserController extends BaseController { + @Resource + private IUmsUserService iUmsUserService; + @Resource + private IBmsPostService iBmsPostService; + + @ApiOperation(value = "用户注册", notes = "用户注册接口") + @PostMapping("/register") + public ApiResult> register(@ApiParam(name = "dto", value = "注册信息", required = true) @Valid @RequestBody RegisterDTO dto) { + UmsUser user = iUmsUserService.executeRegister(dto); + if (ObjectUtils.isEmpty(user)) { + return ApiResult.failed("账号注册失败"); + } + Map map = new HashMap<>(16); + map.put("user", user); + return ApiResult.success(map); + } + + @ApiOperation(value = "用户登陆", notes = "用户登陆接口") + @RequestMapping(value = "/login", method = RequestMethod.POST) + public ApiResult> login(@ApiParam(name = "dto", value = "登陆信息", required = true) @Valid @RequestBody LoginDTO dto) { + String token = iUmsUserService.executeLogin(dto); + if (ObjectUtils.isEmpty(token)) { + return ApiResult.failed("账号密码错误"); + } + Map map = new HashMap<>(16); + map.put("token", token); + return ApiResult.success(map, "登录成功"); + } + + @ApiOperation(value = "获取当前用户登陆信息", notes = "获取当前用户登陆信息接口") + @RequestMapping(value = "/info", method = RequestMethod.GET) + public ApiResult getUser(@ApiParam(name = "userName", value = "用户名", required = true) @RequestHeader(value = JwtUtil.USER_NAME) String userName) { + UmsUser user = iUmsUserService.getUserByUsername(userName); + return ApiResult.success(user); + } + + @ApiOperation(value = "登出", notes = "用户登出接口") + @RequestMapping(value = "/logout", method = RequestMethod.GET) + public ApiResult logOut() { + return ApiResult.success(null, "注销成功"); + } + + @ApiOperation(value = "根据用户名获取该用户发布的帖子列表", notes = "通过用户名获取帖子列表") + @GetMapping("/{username}") + public ApiResult> getUserByName(@ApiParam(name = "username", value = "用户名", required = true) @PathVariable("username") String username, @ApiParam(name = "pageNo", value = "页码", defaultValue = "1") @RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo, @ApiParam(name = "size", value = "每页大小", defaultValue = "10") @RequestParam(value = "size", defaultValue = "10") Integer size) { + Map map = new HashMap<>(16); + UmsUser user = iUmsUserService.getUserByUsername(username); + Assert.notNull(user, "用户不存在"); + Page page = iBmsPostService.page(new Page<>(pageNo, size), new LambdaQueryWrapper().eq(BmsPost::getUserId, user.getId())); + map.put("user", user); + map.put("topics", page); + return ApiResult.success(map); + } + + @ApiOperation(value = "修改用户信息", notes = "修改用户信息接口") + @PostMapping("/update") + public ApiResult updateUser(@ApiParam(name = "umsUser", value = "用户信息", required = true) @RequestBody UmsUser umsUser) { + iUmsUserService.updateById(umsUser); + return ApiResult.success(umsUser); + } +} + diff --git a/src/main/java/com/yovinchen/forum/jwt/JwtAuthenticationFilter.java b/src/main/java/com/yovinchen/forum/jwt/JwtAuthenticationFilter.java new file mode 100644 index 0000000..7927fc2 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/jwt/JwtAuthenticationFilter.java @@ -0,0 +1,57 @@ +package com.yovinchen.forum.jwt; + +import org.springframework.util.AntPathMatcher; +import org.springframework.util.PathMatcher; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + + +public class JwtAuthenticationFilter extends OncePerRequestFilter { + private static final PathMatcher pathMatcher = new AntPathMatcher(); + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + + try { + if(isProtectedUrl(request)) { +// System.out.println(request.getMethod()); + if(!request.getMethod().equals("OPTIONS")) + request = JwtUtil.validateTokenAndAddUserIdToHeader(request); + } + } catch (Exception e) { + response.sendError(HttpServletResponse.SC_UNAUTHORIZED, e.getMessage()); + return; + } + filterChain.doFilter(request, response); + } + + private boolean isProtectedUrl(HttpServletRequest request) { + List protectedPaths = new ArrayList(); + protectedPaths.add("/ums/user/info"); + protectedPaths.add("/ums/user/update"); + protectedPaths.add("/post/create"); + protectedPaths.add("/post/update"); + protectedPaths.add("/post/delete/*"); + protectedPaths.add("/comment/add_comment"); + protectedPaths.add("/relationship/subscribe/*"); + protectedPaths.add("/relationship/unsubscribe/*"); + protectedPaths.add("/relationship/validate/*"); + + boolean bFind = false; + for( String passedPath : protectedPaths ) { + bFind = pathMatcher.match(passedPath, request.getServletPath()); + if( bFind ) { + break; + } + } + return bFind; + } + +} diff --git a/src/main/java/com/yovinchen/forum/jwt/JwtUtil.java b/src/main/java/com/yovinchen/forum/jwt/JwtUtil.java new file mode 100644 index 0000000..01f13a1 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/jwt/JwtUtil.java @@ -0,0 +1,75 @@ +package com.yovinchen.forum.jwt; + +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import java.util.*; + +public class JwtUtil { + private static final Logger logger = LoggerFactory.getLogger(JwtUtil.class); + public static final long EXPIRATION_TIME = 3600_000_000L; // 1000 hour + public static final String SECRET = "ThisIsASecret";//please change to your own encryption secret. + public static final String TOKEN_PREFIX = "Bearer "; + public static final String HEADER_STRING = "Authorization"; + public static final String USER_NAME = "userName"; + + public static String generateToken(String userId) { + HashMap map = new HashMap<>(); + //you can put any data in the map + map.put(USER_NAME, userId); + String jwt = Jwts.builder() + .setClaims(map) + .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) + .signWith(SignatureAlgorithm.HS512, SECRET) + .compact(); + return jwt; //jwt前面一般都会加Bearer + } + + public static HttpServletRequest validateTokenAndAddUserIdToHeader(HttpServletRequest request) { + String token = request.getHeader(HEADER_STRING); + if (token != null) { + // parse the token. + try { + Map body = Jwts.parser() + .setSigningKey(SECRET) + .parseClaimsJws(token.replace(TOKEN_PREFIX, "")) + .getBody(); + return new CustomHttpServletRequest(request, body); + } catch (Exception e) { + logger.info(e.getMessage()); + throw new TokenValidationException(e.getMessage()); + } + } else { + throw new TokenValidationException("Missing token"); + } + } + + public static class CustomHttpServletRequest extends HttpServletRequestWrapper { + private Map claims; + + public CustomHttpServletRequest(HttpServletRequest request, Map claims) { + super(request); + this.claims = new HashMap<>(); + claims.forEach((k, v) -> this.claims.put(k, String.valueOf(v))); + } + + @Override + public Enumeration getHeaders(String name) { + if (claims != null && claims.containsKey(name)) { + return Collections.enumeration(Arrays.asList(claims.get(name))); + } + return super.getHeaders(name); + } + + } + + static class TokenValidationException extends RuntimeException { + public TokenValidationException(String msg) { + super(msg); + } + } +} diff --git a/src/main/java/com/yovinchen/forum/mapper/BmsBillboardMapper.java b/src/main/java/com/yovinchen/forum/mapper/BmsBillboardMapper.java new file mode 100644 index 0000000..0550557 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/mapper/BmsBillboardMapper.java @@ -0,0 +1,9 @@ +package com.yovinchen.forum.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yovinchen.forum.model.entity.BmsBillboard; +import org.springframework.stereotype.Repository; + +@Repository +public interface BmsBillboardMapper extends BaseMapper { +} diff --git a/src/main/java/com/yovinchen/forum/mapper/BmsCommentMapper.java b/src/main/java/com/yovinchen/forum/mapper/BmsCommentMapper.java new file mode 100644 index 0000000..0ac24ea --- /dev/null +++ b/src/main/java/com/yovinchen/forum/mapper/BmsCommentMapper.java @@ -0,0 +1,22 @@ +package com.yovinchen.forum.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yovinchen.forum.model.entity.BmsComment; +import com.yovinchen.forum.model.vo.CommentVO; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + + +@Repository +public interface BmsCommentMapper extends BaseMapper { + + /** + * getCommentsByTopicID + * + * @param topicid + * @return + */ + List getCommentsByTopicID(@Param("topicid") String topicid); +} diff --git a/src/main/java/com/yovinchen/forum/mapper/BmsFollowMapper.java b/src/main/java/com/yovinchen/forum/mapper/BmsFollowMapper.java new file mode 100644 index 0000000..b01e03d --- /dev/null +++ b/src/main/java/com/yovinchen/forum/mapper/BmsFollowMapper.java @@ -0,0 +1,9 @@ +package com.yovinchen.forum.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yovinchen.forum.model.entity.BmsFollow; +import org.springframework.stereotype.Repository; + +@Repository +public interface BmsFollowMapper extends BaseMapper { +} diff --git a/src/main/java/com/yovinchen/forum/mapper/BmsPromotionMapper.java b/src/main/java/com/yovinchen/forum/mapper/BmsPromotionMapper.java new file mode 100644 index 0000000..ffe4349 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/mapper/BmsPromotionMapper.java @@ -0,0 +1,10 @@ +package com.yovinchen.forum.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yovinchen.forum.model.entity.BmsPromotion; +import org.springframework.stereotype.Repository; + + +@Repository +public interface BmsPromotionMapper extends BaseMapper { +} diff --git a/src/main/java/com/yovinchen/forum/mapper/BmsTagMapper.java b/src/main/java/com/yovinchen/forum/mapper/BmsTagMapper.java new file mode 100644 index 0000000..a4dacca --- /dev/null +++ b/src/main/java/com/yovinchen/forum/mapper/BmsTagMapper.java @@ -0,0 +1,11 @@ +package com.yovinchen.forum.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yovinchen.forum.model.entity.BmsTag; +import org.springframework.stereotype.Repository; + + +@Repository +public interface BmsTagMapper extends BaseMapper { + +} diff --git a/src/main/java/com/yovinchen/forum/mapper/BmsTipMapper.java b/src/main/java/com/yovinchen/forum/mapper/BmsTipMapper.java new file mode 100644 index 0000000..c6026ce --- /dev/null +++ b/src/main/java/com/yovinchen/forum/mapper/BmsTipMapper.java @@ -0,0 +1,10 @@ +package com.yovinchen.forum.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yovinchen.forum.model.entity.BmsTip; +import org.springframework.stereotype.Repository; + +@Repository +public interface BmsTipMapper extends BaseMapper { + BmsTip getRandomTip(); +} diff --git a/src/main/java/com/yovinchen/forum/mapper/BmsTopicMapper.java b/src/main/java/com/yovinchen/forum/mapper/BmsTopicMapper.java new file mode 100644 index 0000000..149315d --- /dev/null +++ b/src/main/java/com/yovinchen/forum/mapper/BmsTopicMapper.java @@ -0,0 +1,39 @@ +package com.yovinchen.forum.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.yovinchen.forum.model.entity.BmsPost; +import com.yovinchen.forum.model.vo.PostVO; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +public interface BmsTopicMapper extends BaseMapper { + /** + * 分页查询首页话题列表 + *

+ * + * @param page + * @param tab + * @return + */ + Page selectListAndPage(@Param("page") Page page, @Param("tab") String tab); + + /** + * 获取详情页推荐 + * + * @param id + * @return + */ + List selectRecommend(@Param("id") String id); + /** + * 全文检索 + * + * @param page + * @param keyword + * @return + */ + Page searchByKey(@Param("page") Page page, @Param("keyword") String keyword); +} diff --git a/src/main/java/com/yovinchen/forum/mapper/BmsTopicTagMapper.java b/src/main/java/com/yovinchen/forum/mapper/BmsTopicTagMapper.java new file mode 100644 index 0000000..518169e --- /dev/null +++ b/src/main/java/com/yovinchen/forum/mapper/BmsTopicTagMapper.java @@ -0,0 +1,20 @@ +package com.yovinchen.forum.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yovinchen.forum.model.entity.BmsTopicTag; +import org.apache.ibatis.annotations.Param; +import org.springframework.stereotype.Repository; + +import java.util.Set; + + +@Repository +public interface BmsTopicTagMapper extends BaseMapper { + /** + * 根据标签获取话题ID集合 + * + * @param id + * @return + */ + Set getTopicIdsByTagId(@Param("id") String id); +} diff --git a/src/main/java/com/yovinchen/forum/mapper/UmsUserMapper.java b/src/main/java/com/yovinchen/forum/mapper/UmsUserMapper.java new file mode 100644 index 0000000..cefe498 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/mapper/UmsUserMapper.java @@ -0,0 +1,15 @@ +package com.yovinchen.forum.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.yovinchen.forum.model.entity.UmsUser; +import org.springframework.stereotype.Repository; + +/** + * 用户 + * + * @author Knox 2020/11/7 + */ +@Repository +public interface UmsUserMapper extends BaseMapper { + +} diff --git a/src/main/java/com/yovinchen/forum/model/dto/CommentDTO.java b/src/main/java/com/yovinchen/forum/model/dto/CommentDTO.java new file mode 100644 index 0000000..44e9c43 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/model/dto/CommentDTO.java @@ -0,0 +1,25 @@ +package com.yovinchen.forum.model.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + + +@Data +@ApiModel(description = "评论DTO") +public class CommentDTO implements Serializable { + + private static final long serialVersionUID = -5957433707110390852L; + + @ApiModelProperty(value = "话题id", required = true) + private String topic_id; + + /** + * 内容 + */ + @ApiModelProperty(value = "评论内容", required = true) + private String content; + +} diff --git a/src/main/java/com/yovinchen/forum/model/dto/CreateTopicDTO.java b/src/main/java/com/yovinchen/forum/model/dto/CreateTopicDTO.java new file mode 100644 index 0000000..e230f80 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/model/dto/CreateTopicDTO.java @@ -0,0 +1,33 @@ +package com.yovinchen.forum.model.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +@ApiModel(description = "创建话题DTO") +public class CreateTopicDTO implements Serializable { + private static final long serialVersionUID = -5957433707110390852L; + + /** + * 标题 + */ + @ApiModelProperty(value = "话题标题", required = true) + private String title; + + /** + * 内容 + */ + @ApiModelProperty(value = "话题内容", required = true) + private String content; + + /** + * 标签 + */ + @ApiModelProperty(value = "话题标签列表", required = true) + private List tags; + +} diff --git a/src/main/java/com/yovinchen/forum/model/dto/LoginDTO.java b/src/main/java/com/yovinchen/forum/model/dto/LoginDTO.java new file mode 100644 index 0000000..7dc3719 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/model/dto/LoginDTO.java @@ -0,0 +1,30 @@ +package com.yovinchen.forum.model.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; +import java.io.Serializable; + + +@Data +@ApiModel(description = "登录DTO") +public class LoginDTO implements Serializable { + + private static final long serialVersionUID = 602891322506543807L; + + @NotBlank(message = "用户名不能为空") + @Size(min = 2, max = 15, message = "登录用户名长度在2-15") + @ApiModelProperty(value = "用户名", required = true) + private String username; + + @NotBlank(message = "密码不能为空") + @Size(min = 6, max = 20, message = "登录密码长度在6-20") + @ApiModelProperty(value = "密码", required = true) + private String password; + + @ApiModelProperty(value = "记住我", example = "true") + private Boolean rememberMe; +} diff --git a/src/main/java/com/yovinchen/forum/model/dto/RegisterDTO.java b/src/main/java/com/yovinchen/forum/model/dto/RegisterDTO.java new file mode 100644 index 0000000..464fe50 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/model/dto/RegisterDTO.java @@ -0,0 +1,38 @@ +package com.yovinchen.forum.model.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.Email; +import javax.validation.constraints.NotEmpty; +import java.io.Serializable; + + +@Data +@ApiModel(description = "注册DTO") +public class RegisterDTO implements Serializable { + + private static final long serialVersionUID = 602891322506543807L; + + @NotEmpty(message = "请输入账号") + @Length(min = 2, max = 15, message = "长度在2-15") + @ApiModelProperty(value = "用户名", required = true) + private String name; + + @NotEmpty(message = "请输入密码") + @Length(min = 6, max = 20, message = "长度在6-20") + @ApiModelProperty(value = "密码", required = true) + private String pass; + + @NotEmpty(message = "请再次输入密码") + @Length(min = 6, max = 20, message = "长度在6-20") + @ApiModelProperty(value = "确认密码", required = true) + private String checkPass; + + @NotEmpty(message = "请输入电子邮箱") + @Email(message = "邮箱格式不正确") + @ApiModelProperty(value = "电子邮箱", required = true) + private String email; +} diff --git a/src/main/java/com/yovinchen/forum/model/entity/BmsBillboard.java b/src/main/java/com/yovinchen/forum/model/entity/BmsBillboard.java new file mode 100644 index 0000000..45f8dc1 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/model/entity/BmsBillboard.java @@ -0,0 +1,56 @@ +package com.yovinchen.forum.model.entity; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + + +@Data +@Builder +@ApiModel("公告牌") +@Accessors(chain = true) +@TableName("bms_billboard") +@NoArgsConstructor +@AllArgsConstructor +public class BmsBillboard implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ApiModelProperty("主键") + @TableId(type = IdType.AUTO) + private Integer id; + + /** + * 公告牌 + */ + @ApiModelProperty("公告内容") + @TableField("content") + private String content; + + /** + * 公告时间 + */ + @ApiModelProperty("公告时间") + @TableField(value = "create_time", fill = FieldFill.INSERT) + private Date createTime; + + /** + * 1:展示中,0:过期 + */ + @ApiModelProperty("展示状态,false:过期,true:展示中") + @Builder.Default + @TableField("`show`") + private boolean show = false; + +} diff --git a/src/main/java/com/yovinchen/forum/model/entity/BmsComment.java b/src/main/java/com/yovinchen/forum/model/entity/BmsComment.java new file mode 100644 index 0000000..cf4c084 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/model/entity/BmsComment.java @@ -0,0 +1,68 @@ +package com.yovinchen.forum.model.entity; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.Date; + + +@Data +@Builder +@ApiModel("帖子评论") +@TableName("bms_comment") +@AllArgsConstructor +@NoArgsConstructor +public class BmsComment implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ApiModelProperty("主键") + @TableId(value = "id", type = IdType.ASSIGN_ID) + private String id; + /** + * 内容 + */ + @ApiModelProperty("内容") + @NotBlank(message = "内容不可以为空") + @TableField(value = "content") + private String content; + + + /** + * 作者ID + */ + @ApiModelProperty("作者ID") + @TableField("user_id") + private String userId; + + /** + * topicID + */ + @ApiModelProperty("话题ID") + @TableField("topic_id") + private String topicId; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField(value = "create_time", fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改时间 + */ + @ApiModelProperty("修改时间") + @TableField(value = "modify_time", fill = FieldFill.UPDATE) + private Date modifyTime; +} diff --git a/src/main/java/com/yovinchen/forum/model/entity/BmsFollow.java b/src/main/java/com/yovinchen/forum/model/entity/BmsFollow.java new file mode 100644 index 0000000..263094e --- /dev/null +++ b/src/main/java/com/yovinchen/forum/model/entity/BmsFollow.java @@ -0,0 +1,44 @@ +package com.yovinchen.forum.model.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +@ApiModel("用户关注") +@TableName("bms_follow") +public class BmsFollow implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ApiModelProperty("主键") + @TableId(type = IdType.AUTO) + private Integer id; + + /** + * 被关注人id + */ + @ApiModelProperty("被关注人ID") + @TableField("parent_id") + private String parentId; + + /** + * 关注人id + */ + @ApiModelProperty("关注人ID") + @TableField("follower_id") + private String followerId; + + public BmsFollow() { + } + +} diff --git a/src/main/java/com/yovinchen/forum/model/entity/BmsPost.java b/src/main/java/com/yovinchen/forum/model/entity/BmsPost.java new file mode 100644 index 0000000..ae63a6d --- /dev/null +++ b/src/main/java/com/yovinchen/forum/model/entity/BmsPost.java @@ -0,0 +1,115 @@ +package com.yovinchen.forum.model.entity; + +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; +import java.io.Serializable; +import java.util.Date; + + +@Data +@Builder +@ApiModel("帖子") +@TableName("bms_post") +@AllArgsConstructor +@NoArgsConstructor +public class BmsPost implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ApiModelProperty("主键") + @TableId(value = "id", type = IdType.ASSIGN_ID) + private String id; + /** + * 标题 + */ + @ApiModelProperty("标题") + @NotBlank(message = "标题不可以为空") + @TableField(value = "title") + private String title; + /** + * markdown + */ + @ApiModelProperty("内容") + @NotBlank(message = "内容不可以为空") + @TableField("`content`") + private String content; + + /** + * 作者ID + */ + @ApiModelProperty("作者ID") + @TableField("user_id") + private String userId; + + /** + * 评论数 + */ + @ApiModelProperty("评论数") + @TableField("comments") + @Builder.Default + private Integer comments = 0; + + /** + * 收藏数 + */ + @ApiModelProperty("收藏数") + @TableField("collects") + @Builder.Default + private Integer collects = 0; + + /** + * 浏览数 + */ + @ApiModelProperty("浏览数") + @TableField("view") + @Builder.Default + private Integer view = 0; + + /** + * 专栏ID,默认不分栏 + */ + @ApiModelProperty("专栏ID,默认不分栏") + @TableField("section_id") + @Builder.Default + private Integer sectionId = 0; + + /** + * 置顶 + */ + @ApiModelProperty("置顶") + @TableField("top") + @Builder.Default + private Boolean top = false; + + /** + * 加精 + */ + @ApiModelProperty("加精") + @TableField("essence") + @Builder.Default + private Boolean essence = false; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + @TableField(value = "create_time", fill = FieldFill.INSERT) + private Date createTime; + + /** + * 修改时间 + */ + @ApiModelProperty("修改时间") + @TableField(value = "modify_time", fill = FieldFill.UPDATE) + private Date modifyTime; +} diff --git a/src/main/java/com/yovinchen/forum/model/entity/BmsPromotion.java b/src/main/java/com/yovinchen/forum/model/entity/BmsPromotion.java new file mode 100644 index 0000000..61894f1 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/model/entity/BmsPromotion.java @@ -0,0 +1,54 @@ +package com.yovinchen.forum.model.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; + + +@Data +@ApiModel("广告活动") +@TableName("bms_promotion") +@Accessors(chain = true) +public class BmsPromotion implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ApiModelProperty("主键") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + /** + * 广告标题 + */ + @ApiModelProperty("广告标题") + @TableField("title") + private String title; + + /** + * 广告链接 + */ + @ApiModelProperty("广告链接") + @TableField("link") + private String link; + + /** + * 说明 + */ + @ApiModelProperty("说明") + @TableField("`description`") + private String description; + + public BmsPromotion() { + } + +} diff --git a/src/main/java/com/yovinchen/forum/model/entity/BmsTag.java b/src/main/java/com/yovinchen/forum/model/entity/BmsTag.java new file mode 100644 index 0000000..ff90af9 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/model/entity/BmsTag.java @@ -0,0 +1,38 @@ +package com.yovinchen.forum.model.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Builder; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; + + +@Data +@Builder +@ApiModel("标签") +@TableName("bms_tag") +@Accessors(chain = true) +public class BmsTag implements Serializable { + private static final long serialVersionUID = 3257790983905872243L; + + @ApiModelProperty("主键") + @TableId(type = IdType.ASSIGN_ID) + private String id; + + @ApiModelProperty("名称") + @TableField("name") + private String name; + /** + * 当前标签下的话题个数 + */ + @ApiModelProperty("当前标签下的话题个数") + @TableField("topic_count") + @Builder.Default + private Integer topicCount = 1; +} diff --git a/src/main/java/com/yovinchen/forum/model/entity/BmsTip.java b/src/main/java/com/yovinchen/forum/model/entity/BmsTip.java new file mode 100644 index 0000000..385b0aa --- /dev/null +++ b/src/main/java/com/yovinchen/forum/model/entity/BmsTip.java @@ -0,0 +1,46 @@ +package com.yovinchen.forum.model.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + + +@Data +@ApiModel("小贴士") +@NoArgsConstructor +@TableName("bms_tip") +public class BmsTip implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ApiModelProperty("主键") + private Integer id; + + /** + * 内容 + */ + @ApiModelProperty("内容") + @TableField("`content`") + private String content; + + /** + * 作者 + */ + @ApiModelProperty("作者") + private String author; + + /** + * 1:使用,0:过期 + */ + @ApiModelProperty("状态(1-使用,0-过期)") + private boolean type; + +} diff --git a/src/main/java/com/yovinchen/forum/model/entity/BmsTopicTag.java b/src/main/java/com/yovinchen/forum/model/entity/BmsTopicTag.java new file mode 100644 index 0000000..7a88d2c --- /dev/null +++ b/src/main/java/com/yovinchen/forum/model/entity/BmsTopicTag.java @@ -0,0 +1,33 @@ +package com.yovinchen.forum.model.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; + + +@Data +@ApiModel("话题标签关联") +@TableName("bms_post_tag") +@Accessors(chain = true) +public class BmsTopicTag implements Serializable { + private static final long serialVersionUID = -5028599844989220715L; + + @ApiModelProperty("主键") + @TableId(type = IdType.AUTO) + private Integer id; + + @ApiModelProperty("标签id") + @TableField("tag_id") + private String tagId; + + @ApiModelProperty("话题id") + @TableField("topic_id") + private String topicId; +} diff --git a/src/main/java/com/yovinchen/forum/model/entity/UmsUser.java b/src/main/java/com/yovinchen/forum/model/entity/UmsUser.java new file mode 100644 index 0000000..a262d68 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/model/entity/UmsUser.java @@ -0,0 +1,99 @@ +package com.yovinchen.forum.model.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonIgnore; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + + +@Data +@Builder +@ApiModel("用户") +@TableName("ums_user") +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +public class UmsUser implements Serializable { + private static final long serialVersionUID = -5051120337175047163L; + + @ApiModelProperty("主键") + @TableId(value = "id", type = IdType.ASSIGN_ID) + private String id; + + @ApiModelProperty("用户名") + @TableField("username") + private String username; + + @ApiModelProperty("昵称") + @TableField("alias") + private String alias; + + @ApiModelProperty(hidden = true) + @JsonIgnore() + @TableField("password") + private String password; + + @ApiModelProperty("头像url") + @Builder.Default + @TableField("avatar") + private String avatar = "https://s3.ax1x.com/2020/12/01/DfHNo4.jpg"; + + @ApiModelProperty("邮箱") + @TableField("email") + private String email; + + @ApiModelProperty("手机号") + @TableField("mobile") + private String mobile; + + @ApiModelProperty("个人简介") + @Builder.Default + @TableField("bio") + private String bio = "自由职业者"; + + @ApiModelProperty("积分") + @Builder.Default + @TableField("score") + private Integer score = 0; + + @ApiModelProperty(hidden = true) + @JsonIgnore + @TableField("token") + private String token; + + @ApiModelProperty("是否激活") + @Builder.Default + @TableField("active") + private Boolean active = true; + + /** + * 状态。1:使用,0:已停用 + */ + @ApiModelProperty("状态,1:使用,0:已停用") + @Builder.Default + @TableField("`status`") + private Boolean status = true; + + /** + * 用户角色 + */ + @ApiModelProperty("用户角色") + @TableField("role_id") + private Integer roleId; + + @ApiModelProperty(hidden = true) + @TableField(value = "create_time", fill = FieldFill.INSERT) + private Date createTime; + + @ApiModelProperty(hidden = true) + @TableField(value = "modify_time", fill = FieldFill.INSERT_UPDATE) + private Date modifyTime; +} diff --git a/src/main/java/com/yovinchen/forum/model/vo/CommentVO.java b/src/main/java/com/yovinchen/forum/model/vo/CommentVO.java new file mode 100644 index 0000000..08b032d --- /dev/null +++ b/src/main/java/com/yovinchen/forum/model/vo/CommentVO.java @@ -0,0 +1,49 @@ +package com.yovinchen.forum.model.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + + +@Data +@ApiModel("评论") +public class CommentVO { + + /** + * 主键 + */ + @ApiModelProperty("主键") + private String id; + + /** + * 评论内容 + */ + @ApiModelProperty("评论内容") + private String content; + + /** + * 所属话题id + */ + @ApiModelProperty("所属话题id") + private String topicId; + + /** + * 评论用户id + */ + @ApiModelProperty("评论用户id") + private String userId; + + /** + * 评论用户名 + */ + @ApiModelProperty("评论用户名") + private String username; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + private Date createTime; +} diff --git a/src/main/java/com/yovinchen/forum/model/vo/PostVO.java b/src/main/java/com/yovinchen/forum/model/vo/PostVO.java new file mode 100644 index 0000000..de6dd21 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/model/vo/PostVO.java @@ -0,0 +1,105 @@ +package com.yovinchen.forum.model.vo; + +import com.yovinchen.forum.model.entity.BmsTag; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + + +@Data +@ApiModel("文章") +@NoArgsConstructor +@AllArgsConstructor +public class PostVO implements Serializable { + private static final long serialVersionUID = -261082150965211545L; + + /** + * 文章ID + */ + @ApiModelProperty("文章ID") + private String id; + + /** + * 用户ID + */ + @ApiModelProperty("用户ID") + private String userId; + + /** + * 头像 + */ + @ApiModelProperty("头像") + private String avatar; + + /** + * 用户昵称 + */ + @ApiModelProperty("用户昵称") + private String alias; + + /** + * 账号 + */ + @ApiModelProperty("账号") + private String username; + + /** + * 标题 + */ + @ApiModelProperty("标题") + private String title; + + /** + * 评论统计 + */ + @ApiModelProperty("评论统计") + private Integer comments; + + /** + * 是否置顶 + */ + @ApiModelProperty("是否置顶") + private Boolean top; + + /** + * 是否加精 + */ + @ApiModelProperty("是否加精") + private Boolean essence; + + /** + * 收藏次数 + */ + @ApiModelProperty("收藏次数") + private Integer collects; + + /** + * 文章关联标签 + */ + @ApiModelProperty("文章关联标签") + private List tags; + + /** + * 浏览量 + */ + @ApiModelProperty("浏览量") + private Integer view; + + /** + * 创建时间 + */ + @ApiModelProperty("创建时间") + private Date createTime; + + /** + * 修改时间 + */ + @ApiModelProperty("修改时间") + private Date modifyTime; +} diff --git a/src/main/java/com/yovinchen/forum/model/vo/ProfileVO.java b/src/main/java/com/yovinchen/forum/model/vo/ProfileVO.java new file mode 100644 index 0000000..5b55a91 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/model/vo/ProfileVO.java @@ -0,0 +1,65 @@ +package com.yovinchen.forum.model.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + + +@Data +@ApiModel("用户信息") +public class ProfileVO { + + /** + * 用户ID + */ + @ApiModelProperty("用户ID") + private String id; + + /** + * 用户名 + */ + @ApiModelProperty("用户名") + private String username; + + /** + * 别称 + */ + @ApiModelProperty("别称") + private String alias; + + /** + * 头像 + */ + @ApiModelProperty("头像") + private String avatar; + + /** + * 关注数 + */ + @ApiModelProperty("关注数") + private Integer followCount; + + /** + * 关注者数 + */ + @ApiModelProperty("关注者数") + private Integer followerCount; + + /** + * 文章数 + */ + @ApiModelProperty("文章数") + private Integer topicCount; + + /** + * 专栏数 + */ + @ApiModelProperty("专栏数") + private Integer columns; + + /** + * 评论数 + */ + @ApiModelProperty("评论数") + private Integer commentCount; +} diff --git a/src/main/java/com/yovinchen/forum/service/IBmsBillboardService.java b/src/main/java/com/yovinchen/forum/service/IBmsBillboardService.java new file mode 100644 index 0000000..69a993a --- /dev/null +++ b/src/main/java/com/yovinchen/forum/service/IBmsBillboardService.java @@ -0,0 +1,7 @@ +package com.yovinchen.forum.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yovinchen.forum.model.entity.BmsBillboard; + +public interface IBmsBillboardService extends IService { +} diff --git a/src/main/java/com/yovinchen/forum/service/IBmsCommentService.java b/src/main/java/com/yovinchen/forum/service/IBmsCommentService.java new file mode 100644 index 0000000..e25e541 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/service/IBmsCommentService.java @@ -0,0 +1,22 @@ +package com.yovinchen.forum.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yovinchen.forum.model.dto.CommentDTO; +import com.yovinchen.forum.model.entity.BmsComment; +import com.yovinchen.forum.model.entity.UmsUser; +import com.yovinchen.forum.model.vo.CommentVO; + +import java.util.List; + + +public interface IBmsCommentService extends IService { + /** + * + * + * @param topicid + * @return {@link BmsComment} + */ + List getCommentsByTopicID(String topicid); + + BmsComment create(CommentDTO dto, UmsUser principal); +} diff --git a/src/main/java/com/yovinchen/forum/service/IBmsFollowService.java b/src/main/java/com/yovinchen/forum/service/IBmsFollowService.java new file mode 100644 index 0000000..d72938d --- /dev/null +++ b/src/main/java/com/yovinchen/forum/service/IBmsFollowService.java @@ -0,0 +1,8 @@ +package com.yovinchen.forum.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yovinchen.forum.model.entity.BmsFollow; + + +public interface IBmsFollowService extends IService { +} diff --git a/src/main/java/com/yovinchen/forum/service/IBmsPostService.java b/src/main/java/com/yovinchen/forum/service/IBmsPostService.java new file mode 100644 index 0000000..0aa5c28 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/service/IBmsPostService.java @@ -0,0 +1,55 @@ +package com.yovinchen.forum.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yovinchen.forum.model.dto.CreateTopicDTO; +import com.yovinchen.forum.model.entity.BmsPost; +import com.yovinchen.forum.model.entity.UmsUser; +import com.yovinchen.forum.model.vo.PostVO; + +import java.util.List; +import java.util.Map; + + +public interface IBmsPostService extends IService { + + /** + * 获取首页话题列表 + * + * @param page + * @param tab + * @return + */ + Page getList(Page page, String tab); + /** + * 发布 + * + * @param dto + * @param principal + * @return + */ + BmsPost create(CreateTopicDTO dto, UmsUser principal); + + /** + * 查看话题详情 + * + * @param id + * @return + */ + Map viewTopic(String id); + /** + * 获取随机推荐10篇 + * + * @param id + * @return + */ + List getRecommend(String id); + /** + * 关键字检索 + * + * @param keyword + * @param page + * @return + */ + Page searchByKey(String keyword, Page page); +} diff --git a/src/main/java/com/yovinchen/forum/service/IBmsPromotionService.java b/src/main/java/com/yovinchen/forum/service/IBmsPromotionService.java new file mode 100644 index 0000000..2cff979 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/service/IBmsPromotionService.java @@ -0,0 +1,8 @@ +package com.yovinchen.forum.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yovinchen.forum.model.entity.BmsPromotion; + + +public interface IBmsPromotionService extends IService { +} diff --git a/src/main/java/com/yovinchen/forum/service/IBmsTagService.java b/src/main/java/com/yovinchen/forum/service/IBmsTagService.java new file mode 100644 index 0000000..0a131f1 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/service/IBmsTagService.java @@ -0,0 +1,27 @@ +package com.yovinchen.forum.service; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import com.yovinchen.forum.model.entity.BmsPost; +import com.yovinchen.forum.model.entity.BmsTag; + +import java.util.List; + + +public interface IBmsTagService extends IService { + /** + * 插入标签 + * + * @param tags + * @return + */ + List insertTags(List tags); + /** + * 获取标签关联话题 + * + * @param topicPage + * @param id + * @return + */ + Page selectTopicsByTagId(Page topicPage, String id); +} diff --git a/src/main/java/com/yovinchen/forum/service/IBmsTipService.java b/src/main/java/com/yovinchen/forum/service/IBmsTipService.java new file mode 100644 index 0000000..023d5a2 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/service/IBmsTipService.java @@ -0,0 +1,8 @@ +package com.yovinchen.forum.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yovinchen.forum.model.entity.BmsTip; + +public interface IBmsTipService extends IService { + BmsTip getRandomTip(); +} diff --git a/src/main/java/com/yovinchen/forum/service/IBmsTopicTagService.java b/src/main/java/com/yovinchen/forum/service/IBmsTopicTagService.java new file mode 100644 index 0000000..715d0ef --- /dev/null +++ b/src/main/java/com/yovinchen/forum/service/IBmsTopicTagService.java @@ -0,0 +1,35 @@ +package com.yovinchen.forum.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yovinchen.forum.model.entity.BmsTag; +import com.yovinchen.forum.model.entity.BmsTopicTag; + +import java.util.List; +import java.util.Set; + +public interface IBmsTopicTagService extends IService { + + /** + * 获取Topic Tag 关联记录 + * + * @param topicId TopicId + * @return + */ + List selectByTopicId(String topicId); + /** + * 创建中间关系 + * + * @param id + * @param tags + * @return + */ + void createTopicTag(String id, List tags); + /** + * 获取标签换脸话题ID集合 + * + * @param id + * @return + */ + Set selectTopicIdsByTagId(String id); + +} diff --git a/src/main/java/com/yovinchen/forum/service/IUmsUserService.java b/src/main/java/com/yovinchen/forum/service/IUmsUserService.java new file mode 100644 index 0000000..1c6a6ab --- /dev/null +++ b/src/main/java/com/yovinchen/forum/service/IUmsUserService.java @@ -0,0 +1,40 @@ +package com.yovinchen.forum.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.yovinchen.forum.model.dto.LoginDTO; +import com.yovinchen.forum.model.dto.RegisterDTO; +import com.yovinchen.forum.model.entity.UmsUser; +import com.yovinchen.forum.model.vo.ProfileVO; + + +public interface IUmsUserService extends IService { + + /** + * 注册功能 + * + * @param dto + * @return 注册对象 + */ + UmsUser executeRegister(RegisterDTO dto); + /** + * 获取用户信息 + * + * @param username + * @return dbUser + */ + UmsUser getUserByUsername(String username); + /** + * 用户登录 + * + * @param dto + * @return 生成的JWT的token + */ + String executeLogin(LoginDTO dto); + /** + * 获取用户信息 + * + * @param id 用户ID + * @return + */ + ProfileVO getUserProfile(String id); +} diff --git a/src/main/java/com/yovinchen/forum/service/impl/IBmsBillboardServiceImpl.java b/src/main/java/com/yovinchen/forum/service/impl/IBmsBillboardServiceImpl.java new file mode 100644 index 0000000..3ea9876 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/service/impl/IBmsBillboardServiceImpl.java @@ -0,0 +1,13 @@ +package com.yovinchen.forum.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yovinchen.forum.mapper.BmsBillboardMapper; +import com.yovinchen.forum.model.entity.BmsBillboard; +import com.yovinchen.forum.service.IBmsBillboardService; +import org.springframework.stereotype.Service; + +@Service +public class IBmsBillboardServiceImpl extends ServiceImpl implements IBmsBillboardService { + +} diff --git a/src/main/java/com/yovinchen/forum/service/impl/IBmsCommentServiceImpl.java b/src/main/java/com/yovinchen/forum/service/impl/IBmsCommentServiceImpl.java new file mode 100644 index 0000000..ff68e9e --- /dev/null +++ b/src/main/java/com/yovinchen/forum/service/impl/IBmsCommentServiceImpl.java @@ -0,0 +1,43 @@ +package com.yovinchen.forum.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yovinchen.forum.mapper.BmsCommentMapper; +import com.yovinchen.forum.model.dto.CommentDTO; +import com.yovinchen.forum.model.entity.BmsComment; +import com.yovinchen.forum.model.entity.UmsUser; +import com.yovinchen.forum.model.vo.CommentVO; +import com.yovinchen.forum.service.IBmsCommentService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + + +@Slf4j +@Service +public class IBmsCommentServiceImpl extends ServiceImpl implements IBmsCommentService { + @Override + public List getCommentsByTopicID(String topicid) { + List lstBmsComment = new ArrayList(); + try { + lstBmsComment = this.baseMapper.getCommentsByTopicID(topicid); + } catch (Exception e) { + log.info("lstBmsComment失败"); + } + return lstBmsComment; + } + + @Override + public BmsComment create(CommentDTO dto, UmsUser user) { + BmsComment comment = BmsComment.builder() + .userId(user.getId()) + .content(dto.getContent()) + .topicId(dto.getTopic_id()) + .createTime(new Date()) + .build(); + this.baseMapper.insert(comment); + return comment; + } +} diff --git a/src/main/java/com/yovinchen/forum/service/impl/IBmsFollowServiceImpl.java b/src/main/java/com/yovinchen/forum/service/impl/IBmsFollowServiceImpl.java new file mode 100644 index 0000000..e08f1e3 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/service/impl/IBmsFollowServiceImpl.java @@ -0,0 +1,12 @@ +package com.yovinchen.forum.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yovinchen.forum.mapper.BmsFollowMapper; +import com.yovinchen.forum.model.entity.BmsFollow; +import com.yovinchen.forum.service.IBmsFollowService; +import org.springframework.stereotype.Service; + + +@Service +public class IBmsFollowServiceImpl extends ServiceImpl implements IBmsFollowService { +} diff --git a/src/main/java/com/yovinchen/forum/service/impl/IBmsPostServiceImpl.java b/src/main/java/com/yovinchen/forum/service/impl/IBmsPostServiceImpl.java new file mode 100644 index 0000000..84fea8c --- /dev/null +++ b/src/main/java/com/yovinchen/forum/service/impl/IBmsPostServiceImpl.java @@ -0,0 +1,140 @@ +package com.yovinchen.forum.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yovinchen.forum.mapper.BmsTagMapper; +import com.yovinchen.forum.mapper.BmsTopicMapper; +import com.yovinchen.forum.mapper.UmsUserMapper; +import com.yovinchen.forum.model.dto.CreateTopicDTO; +import com.yovinchen.forum.model.entity.BmsPost; +import com.yovinchen.forum.model.entity.BmsTag; +import com.yovinchen.forum.model.entity.BmsTopicTag; +import com.yovinchen.forum.model.entity.UmsUser; +import com.yovinchen.forum.model.vo.PostVO; +import com.yovinchen.forum.model.vo.ProfileVO; +import com.yovinchen.forum.service.IBmsPostService; +import com.yovinchen.forum.service.IBmsTagService; +import com.yovinchen.forum.service.IUmsUserService; +import com.vdurmont.emoji.EmojiParser; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.Assert; +import org.springframework.util.ObjectUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + + +@Service +public class IBmsPostServiceImpl extends ServiceImpl implements IBmsPostService { + @Resource + private BmsTagMapper bmsTagMapper; + @Resource + private UmsUserMapper umsUserMapper; + + @Autowired + @Lazy + private IBmsTagService iBmsTagService; + + @Autowired + private IUmsUserService iUmsUserService; + + @Autowired + private com.yovinchen.forum.service.IBmsTopicTagService IBmsTopicTagService; + @Override + public Page getList(Page page, String tab) { + // 查询话题 + Page iPage = this.baseMapper.selectListAndPage(page, tab); + // 查询话题的标签 + setTopicTags(iPage); + return iPage; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public BmsPost create(CreateTopicDTO dto, UmsUser user) { + BmsPost topic1 = this.baseMapper.selectOne(new LambdaQueryWrapper().eq(BmsPost::getTitle, dto.getTitle())); + Assert.isNull(topic1, "话题已存在,请修改"); + + // 封装 + BmsPost topic = BmsPost.builder() + .userId(user.getId()) + .title(dto.getTitle()) + .content(EmojiParser.parseToAliases(dto.getContent())) + .createTime(new Date()) + .build(); + this.baseMapper.insert(topic); + + // 用户积分增加 + int newScore = user.getScore() + 1; + umsUserMapper.updateById(user.setScore(newScore)); + + // 标签 + if (!ObjectUtils.isEmpty(dto.getTags())) { + // 保存标签 + List tags = iBmsTagService.insertTags(dto.getTags()); + // 处理标签与话题的关联 + IBmsTopicTagService.createTopicTag(topic.getId(), tags); + } + + return topic; + } + + @Override + public Map viewTopic(String id) { + Map map = new HashMap<>(16); + BmsPost topic = this.baseMapper.selectById(id); + Assert.notNull(topic, "当前话题不存在,或已被作者删除"); + // 查询话题详情 + topic.setView(topic.getView() + 1); + this.baseMapper.updateById(topic); + // emoji转码 + topic.setContent(EmojiParser.parseToUnicode(topic.getContent())); + map.put("topic", topic); + // 标签 + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.lambda().eq(BmsTopicTag::getTopicId, topic.getId()); + Set set = new HashSet<>(); + for (BmsTopicTag articleTag : IBmsTopicTagService.list(wrapper)) { + set.add(articleTag.getTagId()); + } + List tags = iBmsTagService.listByIds(set); + map.put("tags", tags); + + // 作者 + + ProfileVO user = iUmsUserService.getUserProfile(topic.getUserId()); + map.put("user", user); + + return map; + } + + @Override + public List getRecommend(String id) { + return this.baseMapper.selectRecommend(id); + } + @Override + public Page searchByKey(String keyword, Page page) { + // 查询话题 + Page iPage = this.baseMapper.searchByKey(page, keyword); + // 查询话题的标签 + setTopicTags(iPage); + return iPage; + } + + private void setTopicTags(Page iPage) { + iPage.getRecords().forEach(topic -> { + List topicTags = IBmsTopicTagService.selectByTopicId(topic.getId()); + if (!topicTags.isEmpty()) { + List tagIds = topicTags.stream().map(BmsTopicTag::getTagId).collect(Collectors.toList()); + List tags = bmsTagMapper.selectBatchIds(tagIds); + topic.setTags(tags); + } + }); + } +} diff --git a/src/main/java/com/yovinchen/forum/service/impl/IBmsPromotionServiceImpl.java b/src/main/java/com/yovinchen/forum/service/impl/IBmsPromotionServiceImpl.java new file mode 100644 index 0000000..0bcac8a --- /dev/null +++ b/src/main/java/com/yovinchen/forum/service/impl/IBmsPromotionServiceImpl.java @@ -0,0 +1,13 @@ +package com.yovinchen.forum.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yovinchen.forum.mapper.BmsPromotionMapper; +import com.yovinchen.forum.model.entity.BmsPromotion; +import com.yovinchen.forum.service.IBmsPromotionService; +import org.springframework.stereotype.Service; + + +@Service +public class IBmsPromotionServiceImpl extends ServiceImpl implements IBmsPromotionService { + +} diff --git a/src/main/java/com/yovinchen/forum/service/impl/IBmsTagServiceImpl.java b/src/main/java/com/yovinchen/forum/service/impl/IBmsTagServiceImpl.java new file mode 100644 index 0000000..7d3ba54 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/service/impl/IBmsTagServiceImpl.java @@ -0,0 +1,60 @@ +package com.yovinchen.forum.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yovinchen.forum.mapper.BmsTagMapper; +import com.yovinchen.forum.model.entity.BmsPost; +import com.yovinchen.forum.model.entity.BmsTag; +import com.yovinchen.forum.service.IBmsTagService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +/** + * Tag 实现类 + * + * @author Knox 2020/11/7 + */ +@Service +public class IBmsTagServiceImpl extends ServiceImpl implements IBmsTagService { + + @Autowired + private com.yovinchen.forum.service.IBmsTopicTagService IBmsTopicTagService; + + @Autowired + private com.yovinchen.forum.service.IBmsPostService IBmsPostService; + + + @Override + public List insertTags(List tagNames) { + List tagList = new ArrayList<>(); + for (String tagName : tagNames) { + BmsTag tag = this.baseMapper.selectOne(new LambdaQueryWrapper().eq(BmsTag::getName, tagName)); + if (tag == null) { + tag = BmsTag.builder().name(tagName).build(); + this.baseMapper.insert(tag); + } else { + tag.setTopicCount(tag.getTopicCount() + 1); + this.baseMapper.updateById(tag); + } + tagList.add(tag); + } + return tagList; + } + + @Override + public Page selectTopicsByTagId(Page topicPage, String id) { + + // 获取关联的话题ID + Set ids = IBmsTopicTagService.selectTopicIdsByTagId(id); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(BmsPost::getId, ids); + + return IBmsPostService.page(topicPage, wrapper); + } + +} diff --git a/src/main/java/com/yovinchen/forum/service/impl/IBmsTipServiceImpl.java b/src/main/java/com/yovinchen/forum/service/impl/IBmsTipServiceImpl.java new file mode 100644 index 0000000..647c3d8 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/service/impl/IBmsTipServiceImpl.java @@ -0,0 +1,25 @@ +package com.yovinchen.forum.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yovinchen.forum.mapper.BmsTipMapper; +import com.yovinchen.forum.model.entity.BmsTip; +import com.yovinchen.forum.service.IBmsTipService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +public class IBmsTipServiceImpl extends ServiceImpl implements IBmsTipService { + + @Override + public BmsTip getRandomTip() { + BmsTip todayTip = null; + try { + todayTip = this.baseMapper.getRandomTip(); + } catch (Exception e) { + log.info("tip转化失败"); + } + return todayTip; + } +} diff --git a/src/main/java/com/yovinchen/forum/service/impl/IBmsTopicTagServiceImpl.java b/src/main/java/com/yovinchen/forum/service/impl/IBmsTopicTagServiceImpl.java new file mode 100644 index 0000000..5c11f16 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/service/impl/IBmsTopicTagServiceImpl.java @@ -0,0 +1,45 @@ +package com.yovinchen.forum.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yovinchen.forum.mapper.BmsTopicTagMapper; +import com.yovinchen.forum.model.entity.BmsTag; +import com.yovinchen.forum.model.entity.BmsTopicTag; +import com.yovinchen.forum.service.IBmsTopicTagService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Set; + + +@Service +@Transactional(rollbackFor = Exception.class) +public class IBmsTopicTagServiceImpl extends ServiceImpl implements IBmsTopicTagService { + + @Override + public List selectByTopicId(String topicId) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.lambda().eq(BmsTopicTag::getTopicId, topicId); + return this.baseMapper.selectList(wrapper); + } + @Override + public void createTopicTag(String id, List tags) { + // 先删除topicId对应的所有记录 + this.baseMapper.delete(new LambdaQueryWrapper().eq(BmsTopicTag::getTopicId, id)); + + // 循环保存对应关联 + tags.forEach(tag -> { + BmsTopicTag topicTag = new BmsTopicTag(); + topicTag.setTopicId(id); + topicTag.setTagId(tag.getId()); + this.baseMapper.insert(topicTag); + }); + } + @Override + public Set selectTopicIdsByTagId(String id) { + return this.baseMapper.getTopicIdsByTagId(id); + } + +} diff --git a/src/main/java/com/yovinchen/forum/service/impl/IUmsUserServiceImpl.java b/src/main/java/com/yovinchen/forum/service/impl/IUmsUserServiceImpl.java new file mode 100644 index 0000000..1608ef0 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/service/impl/IUmsUserServiceImpl.java @@ -0,0 +1,94 @@ +package com.yovinchen.forum.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.yovinchen.forum.common.exception.ApiAsserts; +import com.yovinchen.forum.jwt.JwtUtil; +import com.yovinchen.forum.mapper.BmsFollowMapper; +import com.yovinchen.forum.mapper.BmsTopicMapper; +import com.yovinchen.forum.mapper.UmsUserMapper; +import com.yovinchen.forum.model.dto.LoginDTO; +import com.yovinchen.forum.model.dto.RegisterDTO; +import com.yovinchen.forum.model.entity.BmsFollow; +import com.yovinchen.forum.model.entity.BmsPost; +import com.yovinchen.forum.model.entity.UmsUser; +import com.yovinchen.forum.model.vo.ProfileVO; +import com.yovinchen.forum.service.IUmsUserService; +import com.yovinchen.forum.utils.MD5Utils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.ObjectUtils; +import java.util.Date; + + + +@Slf4j +@Service +@Transactional(rollbackFor = Exception.class) +public class IUmsUserServiceImpl extends ServiceImpl implements IUmsUserService { + + @Autowired + private BmsTopicMapper bmsTopicMapper; + @Autowired + private BmsFollowMapper bmsFollowMapper; + + @Override + public UmsUser executeRegister(RegisterDTO dto) { + //查询是否有相同用户名的用户 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(UmsUser::getUsername, dto.getName()).or().eq(UmsUser::getEmail, dto.getEmail()); + UmsUser umsUser = baseMapper.selectOne(wrapper); + if (!ObjectUtils.isEmpty(umsUser)) { + ApiAsserts.fail("账号或邮箱已存在!"); + } + UmsUser addUser = UmsUser.builder() + .username(dto.getName()) + .alias(dto.getName()) + .password(MD5Utils.getPwd(dto.getPass())) + .email(dto.getEmail()) + .createTime(new Date()) + .status(true) + .build(); + baseMapper.insert(addUser); + + return addUser; + } + @Override + public UmsUser getUserByUsername(String username) { + return baseMapper.selectOne(new LambdaQueryWrapper().eq(UmsUser::getUsername, username)); + } + @Override + public String executeLogin(LoginDTO dto) { + String token = null; + try { + UmsUser user = getUserByUsername(dto.getUsername()); + String encodePwd = MD5Utils.getPwd(dto.getPassword()); + if(!encodePwd.equals(user.getPassword())) + { + throw new Exception("密码错误"); + } + token = JwtUtil.generateToken(String.valueOf(user.getUsername())); + } catch (Exception e) { + log.warn("用户不存在or密码验证失败=======>{}", dto.getUsername()); + } + return token; + } + @Override + public ProfileVO getUserProfile(String id) { + ProfileVO profile = new ProfileVO(); + UmsUser user = baseMapper.selectById(id); + BeanUtils.copyProperties(user, profile); + // 用户文章数 + int count = bmsTopicMapper.selectCount(new LambdaQueryWrapper().eq(BmsPost::getUserId, id)); + profile.setTopicCount(count); + + // 粉丝数 + int followers = bmsFollowMapper.selectCount((new LambdaQueryWrapper().eq(BmsFollow::getParentId, id))); + profile.setFollowerCount(followers); + + return profile; + } +} diff --git a/src/main/java/com/yovinchen/forum/utils/MD5Utils.java b/src/main/java/com/yovinchen/forum/utils/MD5Utils.java new file mode 100644 index 0000000..6f7d4e4 --- /dev/null +++ b/src/main/java/com/yovinchen/forum/utils/MD5Utils.java @@ -0,0 +1,56 @@ +package com.yovinchen.forum.utils; + + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + + +public class MD5Utils { + + public static String getPwd(String pwd) { + try { + // 创建加密对象 + MessageDigest digest = MessageDigest.getInstance("md5"); + + // 调用加密对象的方法,加密的动作已经完成 + byte[] bs = digest.digest(pwd.getBytes()); + // 接下来,我们要对加密后的结果,进行优化,按照mysql的优化思路走 + // mysql的优化思路: + // 第一步,将数据全部转换成正数: + String hexString = ""; + for (byte b : bs) { + // 第一步,将数据全部转换成正数: + // 解释:为什么采用b&255 + /* + * b:它本来是一个byte类型的数据(1个字节) 255:是一个int类型的数据(4个字节) + * byte类型的数据与int类型的数据进行运算,会自动类型提升为int类型 eg: b: 1001 1100(原始数据) + * 运算时: b: 0000 0000 0000 0000 0000 0000 1001 1100 255: 0000 + * 0000 0000 0000 0000 0000 1111 1111 结果:0000 0000 0000 0000 + * 0000 0000 1001 1100 此时的temp是一个int类型的整数 + */ + int temp = b & 255; + // 第二步,将所有的数据转换成16进制的形式 + // 注意:转换的时候注意if正数>=0&&<16,那么如果使用Integer.toHexString(),可能会造成缺少位数 + // 因此,需要对temp进行判断 + if (temp < 16 && temp >= 0) { + // 手动补上一个“0” + hexString = hexString + "0" + Integer.toHexString(temp); + } else { + hexString = hexString + Integer.toHexString(temp); + } + } + return hexString; + } catch (NoSuchAlgorithmException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return ""; + } + + +// public static void main(String[] args) { +// String pwd = MD5Utils.getPwd("234"); +// System.out.println(pwd); +// } + +} diff --git a/src/main/resources/application-dev.yaml b/src/main/resources/application-dev.yaml new file mode 100644 index 0000000..6c70b3d --- /dev/null +++ b/src/main/resources/application-dev.yaml @@ -0,0 +1,18 @@ +server: + port: 8080 + +web: + domain: http://localhost + +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + username: root + password: root + url: jdbc:mysql://localhost:3306/doubao?useUnicode=true&characterEncoding=utf8&autoReconnect=true&serverTimezone=GMT%2B8 + type: com.zaxxer.hikari.HikariDataSource + +logging: + level: + root: info + com.yovinchen.forum: debug diff --git a/src/main/resources/application-prod.yaml b/src/main/resources/application-prod.yaml new file mode 100644 index 0000000..8ed3284 --- /dev/null +++ b/src/main/resources/application-prod.yaml @@ -0,0 +1,18 @@ +server: + port: 8088 + +web: + domain: http://localhost + +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + username: root + password: 123456 + url: jdbc:mysql://localhost:3306/ssm_db?useUnicode=true&characterEncoding=utf8&autoReconnect=true&serverTimezone=GMT%2B8 + type: com.zaxxer.hikari.HikariDataSource + +logging: + level: + root: info + com.yovinchen.forum: info diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml new file mode 100644 index 0000000..caf4dfc --- /dev/null +++ b/src/main/resources/application.yaml @@ -0,0 +1,3 @@ +spring: + profiles: + active: dev \ No newline at end of file diff --git a/src/main/resources/mapper/BmsCommentMapper.xml b/src/main/resources/mapper/BmsCommentMapper.xml new file mode 100644 index 0000000..b15db9d --- /dev/null +++ b/src/main/resources/mapper/BmsCommentMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + diff --git a/src/main/resources/mapper/BmsPostMapper.xml b/src/main/resources/mapper/BmsPostMapper.xml new file mode 100644 index 0000000..a1538d9 --- /dev/null +++ b/src/main/resources/mapper/BmsPostMapper.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/mapper/BmsPostTagMapper.xml b/src/main/resources/mapper/BmsPostTagMapper.xml new file mode 100644 index 0000000..c2662c5 --- /dev/null +++ b/src/main/resources/mapper/BmsPostTagMapper.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/src/main/resources/mapper/BmsTipMapper.xml b/src/main/resources/mapper/BmsTipMapper.xml new file mode 100644 index 0000000..75af804 --- /dev/null +++ b/src/main/resources/mapper/BmsTipMapper.xml @@ -0,0 +1,10 @@ + + + + + diff --git a/src/test/java/com/yovinchen/forum/DoubaoApplicationTests.java b/src/test/java/com/yovinchen/forum/DoubaoApplicationTests.java new file mode 100644 index 0000000..ff04d51 --- /dev/null +++ b/src/test/java/com/yovinchen/forum/DoubaoApplicationTests.java @@ -0,0 +1,13 @@ +package com.yovinchen.forum; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class DoubaoApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/target/classes/application-dev.yaml b/target/classes/application-dev.yaml new file mode 100644 index 0000000..6c70b3d --- /dev/null +++ b/target/classes/application-dev.yaml @@ -0,0 +1,18 @@ +server: + port: 8080 + +web: + domain: http://localhost + +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + username: root + password: root + url: jdbc:mysql://localhost:3306/doubao?useUnicode=true&characterEncoding=utf8&autoReconnect=true&serverTimezone=GMT%2B8 + type: com.zaxxer.hikari.HikariDataSource + +logging: + level: + root: info + com.yovinchen.forum: debug diff --git a/target/classes/application-prod.yaml b/target/classes/application-prod.yaml new file mode 100644 index 0000000..8ed3284 --- /dev/null +++ b/target/classes/application-prod.yaml @@ -0,0 +1,18 @@ +server: + port: 8088 + +web: + domain: http://localhost + +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + username: root + password: 123456 + url: jdbc:mysql://localhost:3306/ssm_db?useUnicode=true&characterEncoding=utf8&autoReconnect=true&serverTimezone=GMT%2B8 + type: com.zaxxer.hikari.HikariDataSource + +logging: + level: + root: info + com.yovinchen.forum: info diff --git a/target/classes/application.yaml b/target/classes/application.yaml new file mode 100644 index 0000000..caf4dfc --- /dev/null +++ b/target/classes/application.yaml @@ -0,0 +1,3 @@ +spring: + profiles: + active: dev \ No newline at end of file diff --git a/target/classes/com/yovinchen/forum/DoubaoApplication.class b/target/classes/com/yovinchen/forum/DoubaoApplication.class new file mode 100644 index 0000000..e5a4f3c Binary files /dev/null and b/target/classes/com/yovinchen/forum/DoubaoApplication.class differ diff --git a/target/classes/com/yovinchen/forum/common/api/ApiErrorCode.class b/target/classes/com/yovinchen/forum/common/api/ApiErrorCode.class new file mode 100644 index 0000000..5fa1425 Binary files /dev/null and b/target/classes/com/yovinchen/forum/common/api/ApiErrorCode.class differ diff --git a/target/classes/com/yovinchen/forum/common/api/ApiResult.class b/target/classes/com/yovinchen/forum/common/api/ApiResult.class new file mode 100644 index 0000000..6f1c860 Binary files /dev/null and b/target/classes/com/yovinchen/forum/common/api/ApiResult.class differ diff --git a/target/classes/com/yovinchen/forum/common/api/IErrorCode.class b/target/classes/com/yovinchen/forum/common/api/IErrorCode.class new file mode 100644 index 0000000..ea9d35d Binary files /dev/null and b/target/classes/com/yovinchen/forum/common/api/IErrorCode.class differ diff --git a/target/classes/com/yovinchen/forum/common/exception/ApiAsserts.class b/target/classes/com/yovinchen/forum/common/exception/ApiAsserts.class new file mode 100644 index 0000000..3ed2acc Binary files /dev/null and b/target/classes/com/yovinchen/forum/common/exception/ApiAsserts.class differ diff --git a/target/classes/com/yovinchen/forum/common/exception/ApiException.class b/target/classes/com/yovinchen/forum/common/exception/ApiException.class new file mode 100644 index 0000000..0b8137f Binary files /dev/null and b/target/classes/com/yovinchen/forum/common/exception/ApiException.class differ diff --git a/target/classes/com/yovinchen/forum/common/exception/GlobalExceptionHandler.class b/target/classes/com/yovinchen/forum/common/exception/GlobalExceptionHandler.class new file mode 100644 index 0000000..c21fe42 Binary files /dev/null and b/target/classes/com/yovinchen/forum/common/exception/GlobalExceptionHandler.class differ diff --git a/target/classes/com/yovinchen/forum/common/mybatisplus/MybatisPlusConfig.class b/target/classes/com/yovinchen/forum/common/mybatisplus/MybatisPlusConfig.class new file mode 100644 index 0000000..78456fc Binary files /dev/null and b/target/classes/com/yovinchen/forum/common/mybatisplus/MybatisPlusConfig.class differ diff --git a/target/classes/com/yovinchen/forum/config/GlobalWebMvcConfigurer.class b/target/classes/com/yovinchen/forum/config/GlobalWebMvcConfigurer.class new file mode 100644 index 0000000..ec44124 Binary files /dev/null and b/target/classes/com/yovinchen/forum/config/GlobalWebMvcConfigurer.class differ diff --git a/target/classes/com/yovinchen/forum/config/Knife4jConfig.class b/target/classes/com/yovinchen/forum/config/Knife4jConfig.class new file mode 100644 index 0000000..e1b3a79 Binary files /dev/null and b/target/classes/com/yovinchen/forum/config/Knife4jConfig.class differ diff --git a/target/classes/com/yovinchen/forum/controller/BaseController.class b/target/classes/com/yovinchen/forum/controller/BaseController.class new file mode 100644 index 0000000..6d1fcc0 Binary files /dev/null and b/target/classes/com/yovinchen/forum/controller/BaseController.class differ diff --git a/target/classes/com/yovinchen/forum/controller/BmsBillboardController.class b/target/classes/com/yovinchen/forum/controller/BmsBillboardController.class new file mode 100644 index 0000000..57bbefb Binary files /dev/null and b/target/classes/com/yovinchen/forum/controller/BmsBillboardController.class differ diff --git a/target/classes/com/yovinchen/forum/controller/BmsCommentController.class b/target/classes/com/yovinchen/forum/controller/BmsCommentController.class new file mode 100644 index 0000000..f2c00d4 Binary files /dev/null and b/target/classes/com/yovinchen/forum/controller/BmsCommentController.class differ diff --git a/target/classes/com/yovinchen/forum/controller/BmsPostController.class b/target/classes/com/yovinchen/forum/controller/BmsPostController.class new file mode 100644 index 0000000..de64639 Binary files /dev/null and b/target/classes/com/yovinchen/forum/controller/BmsPostController.class differ diff --git a/target/classes/com/yovinchen/forum/controller/BmsPromotionController.class b/target/classes/com/yovinchen/forum/controller/BmsPromotionController.class new file mode 100644 index 0000000..62c3666 Binary files /dev/null and b/target/classes/com/yovinchen/forum/controller/BmsPromotionController.class differ diff --git a/target/classes/com/yovinchen/forum/controller/BmsRelationshipController.class b/target/classes/com/yovinchen/forum/controller/BmsRelationshipController.class new file mode 100644 index 0000000..e8e18fe Binary files /dev/null and b/target/classes/com/yovinchen/forum/controller/BmsRelationshipController.class differ diff --git a/target/classes/com/yovinchen/forum/controller/BmsSearchController.class b/target/classes/com/yovinchen/forum/controller/BmsSearchController.class new file mode 100644 index 0000000..dd154e0 Binary files /dev/null and b/target/classes/com/yovinchen/forum/controller/BmsSearchController.class differ diff --git a/target/classes/com/yovinchen/forum/controller/BmsTagController.class b/target/classes/com/yovinchen/forum/controller/BmsTagController.class new file mode 100644 index 0000000..9278831 Binary files /dev/null and b/target/classes/com/yovinchen/forum/controller/BmsTagController.class differ diff --git a/target/classes/com/yovinchen/forum/controller/BmsTipController.class b/target/classes/com/yovinchen/forum/controller/BmsTipController.class new file mode 100644 index 0000000..b11518b Binary files /dev/null and b/target/classes/com/yovinchen/forum/controller/BmsTipController.class differ diff --git a/target/classes/com/yovinchen/forum/controller/UmsUserController.class b/target/classes/com/yovinchen/forum/controller/UmsUserController.class new file mode 100644 index 0000000..0190396 Binary files /dev/null and b/target/classes/com/yovinchen/forum/controller/UmsUserController.class differ diff --git a/target/classes/com/yovinchen/forum/jwt/JwtAuthenticationFilter.class b/target/classes/com/yovinchen/forum/jwt/JwtAuthenticationFilter.class new file mode 100644 index 0000000..acdf17b Binary files /dev/null and b/target/classes/com/yovinchen/forum/jwt/JwtAuthenticationFilter.class differ diff --git a/target/classes/com/yovinchen/forum/jwt/JwtUtil$CustomHttpServletRequest.class b/target/classes/com/yovinchen/forum/jwt/JwtUtil$CustomHttpServletRequest.class new file mode 100644 index 0000000..d9a7178 Binary files /dev/null and b/target/classes/com/yovinchen/forum/jwt/JwtUtil$CustomHttpServletRequest.class differ diff --git a/target/classes/com/yovinchen/forum/jwt/JwtUtil$TokenValidationException.class b/target/classes/com/yovinchen/forum/jwt/JwtUtil$TokenValidationException.class new file mode 100644 index 0000000..5d4c739 Binary files /dev/null and b/target/classes/com/yovinchen/forum/jwt/JwtUtil$TokenValidationException.class differ diff --git a/target/classes/com/yovinchen/forum/jwt/JwtUtil.class b/target/classes/com/yovinchen/forum/jwt/JwtUtil.class new file mode 100644 index 0000000..8739464 Binary files /dev/null and b/target/classes/com/yovinchen/forum/jwt/JwtUtil.class differ diff --git a/target/classes/com/yovinchen/forum/mapper/BmsBillboardMapper.class b/target/classes/com/yovinchen/forum/mapper/BmsBillboardMapper.class new file mode 100644 index 0000000..d70dfcc Binary files /dev/null and b/target/classes/com/yovinchen/forum/mapper/BmsBillboardMapper.class differ diff --git a/target/classes/com/yovinchen/forum/mapper/BmsCommentMapper.class b/target/classes/com/yovinchen/forum/mapper/BmsCommentMapper.class new file mode 100644 index 0000000..958d84e Binary files /dev/null and b/target/classes/com/yovinchen/forum/mapper/BmsCommentMapper.class differ diff --git a/target/classes/com/yovinchen/forum/mapper/BmsFollowMapper.class b/target/classes/com/yovinchen/forum/mapper/BmsFollowMapper.class new file mode 100644 index 0000000..2f9ccc4 Binary files /dev/null and b/target/classes/com/yovinchen/forum/mapper/BmsFollowMapper.class differ diff --git a/target/classes/com/yovinchen/forum/mapper/BmsPromotionMapper.class b/target/classes/com/yovinchen/forum/mapper/BmsPromotionMapper.class new file mode 100644 index 0000000..abdaff1 Binary files /dev/null and b/target/classes/com/yovinchen/forum/mapper/BmsPromotionMapper.class differ diff --git a/target/classes/com/yovinchen/forum/mapper/BmsTagMapper.class b/target/classes/com/yovinchen/forum/mapper/BmsTagMapper.class new file mode 100644 index 0000000..706cdc9 Binary files /dev/null and b/target/classes/com/yovinchen/forum/mapper/BmsTagMapper.class differ diff --git a/target/classes/com/yovinchen/forum/mapper/BmsTipMapper.class b/target/classes/com/yovinchen/forum/mapper/BmsTipMapper.class new file mode 100644 index 0000000..0750b33 Binary files /dev/null and b/target/classes/com/yovinchen/forum/mapper/BmsTipMapper.class differ diff --git a/target/classes/com/yovinchen/forum/mapper/BmsTopicMapper.class b/target/classes/com/yovinchen/forum/mapper/BmsTopicMapper.class new file mode 100644 index 0000000..82e0f8e Binary files /dev/null and b/target/classes/com/yovinchen/forum/mapper/BmsTopicMapper.class differ diff --git a/target/classes/com/yovinchen/forum/mapper/BmsTopicTagMapper.class b/target/classes/com/yovinchen/forum/mapper/BmsTopicTagMapper.class new file mode 100644 index 0000000..d8834c5 Binary files /dev/null and b/target/classes/com/yovinchen/forum/mapper/BmsTopicTagMapper.class differ diff --git a/target/classes/com/yovinchen/forum/mapper/UmsUserMapper.class b/target/classes/com/yovinchen/forum/mapper/UmsUserMapper.class new file mode 100644 index 0000000..644cbe3 Binary files /dev/null and b/target/classes/com/yovinchen/forum/mapper/UmsUserMapper.class differ diff --git a/target/classes/com/yovinchen/forum/model/dto/CommentDTO.class b/target/classes/com/yovinchen/forum/model/dto/CommentDTO.class new file mode 100644 index 0000000..76fbf49 Binary files /dev/null and b/target/classes/com/yovinchen/forum/model/dto/CommentDTO.class differ diff --git a/target/classes/com/yovinchen/forum/model/dto/CreateTopicDTO.class b/target/classes/com/yovinchen/forum/model/dto/CreateTopicDTO.class new file mode 100644 index 0000000..9ec740d Binary files /dev/null and b/target/classes/com/yovinchen/forum/model/dto/CreateTopicDTO.class differ diff --git a/target/classes/com/yovinchen/forum/model/dto/LoginDTO.class b/target/classes/com/yovinchen/forum/model/dto/LoginDTO.class new file mode 100644 index 0000000..ce7bfeb Binary files /dev/null and b/target/classes/com/yovinchen/forum/model/dto/LoginDTO.class differ diff --git a/target/classes/com/yovinchen/forum/model/dto/RegisterDTO.class b/target/classes/com/yovinchen/forum/model/dto/RegisterDTO.class new file mode 100644 index 0000000..c639451 Binary files /dev/null and b/target/classes/com/yovinchen/forum/model/dto/RegisterDTO.class differ diff --git a/target/classes/com/yovinchen/forum/model/entity/BmsBillboard$BmsBillboardBuilder.class b/target/classes/com/yovinchen/forum/model/entity/BmsBillboard$BmsBillboardBuilder.class new file mode 100644 index 0000000..0ab56a7 Binary files /dev/null and b/target/classes/com/yovinchen/forum/model/entity/BmsBillboard$BmsBillboardBuilder.class differ diff --git a/target/classes/com/yovinchen/forum/model/entity/BmsBillboard.class b/target/classes/com/yovinchen/forum/model/entity/BmsBillboard.class new file mode 100644 index 0000000..44ed5de Binary files /dev/null and b/target/classes/com/yovinchen/forum/model/entity/BmsBillboard.class differ diff --git a/target/classes/com/yovinchen/forum/model/entity/BmsComment$BmsCommentBuilder.class b/target/classes/com/yovinchen/forum/model/entity/BmsComment$BmsCommentBuilder.class new file mode 100644 index 0000000..4b790a5 Binary files /dev/null and b/target/classes/com/yovinchen/forum/model/entity/BmsComment$BmsCommentBuilder.class differ diff --git a/target/classes/com/yovinchen/forum/model/entity/BmsComment.class b/target/classes/com/yovinchen/forum/model/entity/BmsComment.class new file mode 100644 index 0000000..8578425 Binary files /dev/null and b/target/classes/com/yovinchen/forum/model/entity/BmsComment.class differ diff --git a/target/classes/com/yovinchen/forum/model/entity/BmsFollow.class b/target/classes/com/yovinchen/forum/model/entity/BmsFollow.class new file mode 100644 index 0000000..3677aa4 Binary files /dev/null and b/target/classes/com/yovinchen/forum/model/entity/BmsFollow.class differ diff --git a/target/classes/com/yovinchen/forum/model/entity/BmsPost$BmsPostBuilder.class b/target/classes/com/yovinchen/forum/model/entity/BmsPost$BmsPostBuilder.class new file mode 100644 index 0000000..a189d4e Binary files /dev/null and b/target/classes/com/yovinchen/forum/model/entity/BmsPost$BmsPostBuilder.class differ diff --git a/target/classes/com/yovinchen/forum/model/entity/BmsPost.class b/target/classes/com/yovinchen/forum/model/entity/BmsPost.class new file mode 100644 index 0000000..8f52a57 Binary files /dev/null and b/target/classes/com/yovinchen/forum/model/entity/BmsPost.class differ diff --git a/target/classes/com/yovinchen/forum/model/entity/BmsPromotion.class b/target/classes/com/yovinchen/forum/model/entity/BmsPromotion.class new file mode 100644 index 0000000..e6c062c Binary files /dev/null and b/target/classes/com/yovinchen/forum/model/entity/BmsPromotion.class differ diff --git a/target/classes/com/yovinchen/forum/model/entity/BmsTag$BmsTagBuilder.class b/target/classes/com/yovinchen/forum/model/entity/BmsTag$BmsTagBuilder.class new file mode 100644 index 0000000..852c9ee Binary files /dev/null and b/target/classes/com/yovinchen/forum/model/entity/BmsTag$BmsTagBuilder.class differ diff --git a/target/classes/com/yovinchen/forum/model/entity/BmsTag.class b/target/classes/com/yovinchen/forum/model/entity/BmsTag.class new file mode 100644 index 0000000..b0820b3 Binary files /dev/null and b/target/classes/com/yovinchen/forum/model/entity/BmsTag.class differ diff --git a/target/classes/com/yovinchen/forum/model/entity/BmsTip.class b/target/classes/com/yovinchen/forum/model/entity/BmsTip.class new file mode 100644 index 0000000..46d8884 Binary files /dev/null and b/target/classes/com/yovinchen/forum/model/entity/BmsTip.class differ diff --git a/target/classes/com/yovinchen/forum/model/entity/BmsTopicTag.class b/target/classes/com/yovinchen/forum/model/entity/BmsTopicTag.class new file mode 100644 index 0000000..56f47e8 Binary files /dev/null and b/target/classes/com/yovinchen/forum/model/entity/BmsTopicTag.class differ diff --git a/target/classes/com/yovinchen/forum/model/entity/UmsUser$UmsUserBuilder.class b/target/classes/com/yovinchen/forum/model/entity/UmsUser$UmsUserBuilder.class new file mode 100644 index 0000000..2679af2 Binary files /dev/null and b/target/classes/com/yovinchen/forum/model/entity/UmsUser$UmsUserBuilder.class differ diff --git a/target/classes/com/yovinchen/forum/model/entity/UmsUser.class b/target/classes/com/yovinchen/forum/model/entity/UmsUser.class new file mode 100644 index 0000000..e3c0ca6 Binary files /dev/null and b/target/classes/com/yovinchen/forum/model/entity/UmsUser.class differ diff --git a/target/classes/com/yovinchen/forum/model/vo/CommentVO.class b/target/classes/com/yovinchen/forum/model/vo/CommentVO.class new file mode 100644 index 0000000..d2ba4c4 Binary files /dev/null and b/target/classes/com/yovinchen/forum/model/vo/CommentVO.class differ diff --git a/target/classes/com/yovinchen/forum/model/vo/PostVO.class b/target/classes/com/yovinchen/forum/model/vo/PostVO.class new file mode 100644 index 0000000..97b3a0f Binary files /dev/null and b/target/classes/com/yovinchen/forum/model/vo/PostVO.class differ diff --git a/target/classes/com/yovinchen/forum/model/vo/ProfileVO.class b/target/classes/com/yovinchen/forum/model/vo/ProfileVO.class new file mode 100644 index 0000000..56cc86f Binary files /dev/null and b/target/classes/com/yovinchen/forum/model/vo/ProfileVO.class differ diff --git a/target/classes/com/yovinchen/forum/service/IBmsBillboardService.class b/target/classes/com/yovinchen/forum/service/IBmsBillboardService.class new file mode 100644 index 0000000..cda4cd0 Binary files /dev/null and b/target/classes/com/yovinchen/forum/service/IBmsBillboardService.class differ diff --git a/target/classes/com/yovinchen/forum/service/IBmsCommentService.class b/target/classes/com/yovinchen/forum/service/IBmsCommentService.class new file mode 100644 index 0000000..c41c746 Binary files /dev/null and b/target/classes/com/yovinchen/forum/service/IBmsCommentService.class differ diff --git a/target/classes/com/yovinchen/forum/service/IBmsFollowService.class b/target/classes/com/yovinchen/forum/service/IBmsFollowService.class new file mode 100644 index 0000000..9173701 Binary files /dev/null and b/target/classes/com/yovinchen/forum/service/IBmsFollowService.class differ diff --git a/target/classes/com/yovinchen/forum/service/IBmsPostService.class b/target/classes/com/yovinchen/forum/service/IBmsPostService.class new file mode 100644 index 0000000..5896272 Binary files /dev/null and b/target/classes/com/yovinchen/forum/service/IBmsPostService.class differ diff --git a/target/classes/com/yovinchen/forum/service/IBmsPromotionService.class b/target/classes/com/yovinchen/forum/service/IBmsPromotionService.class new file mode 100644 index 0000000..b58d80d Binary files /dev/null and b/target/classes/com/yovinchen/forum/service/IBmsPromotionService.class differ diff --git a/target/classes/com/yovinchen/forum/service/IBmsTagService.class b/target/classes/com/yovinchen/forum/service/IBmsTagService.class new file mode 100644 index 0000000..18596bd Binary files /dev/null and b/target/classes/com/yovinchen/forum/service/IBmsTagService.class differ diff --git a/target/classes/com/yovinchen/forum/service/IBmsTipService.class b/target/classes/com/yovinchen/forum/service/IBmsTipService.class new file mode 100644 index 0000000..ea66edc Binary files /dev/null and b/target/classes/com/yovinchen/forum/service/IBmsTipService.class differ diff --git a/target/classes/com/yovinchen/forum/service/IBmsTopicTagService.class b/target/classes/com/yovinchen/forum/service/IBmsTopicTagService.class new file mode 100644 index 0000000..44d9795 Binary files /dev/null and b/target/classes/com/yovinchen/forum/service/IBmsTopicTagService.class differ diff --git a/target/classes/com/yovinchen/forum/service/IUmsUserService.class b/target/classes/com/yovinchen/forum/service/IUmsUserService.class new file mode 100644 index 0000000..c34c7bd Binary files /dev/null and b/target/classes/com/yovinchen/forum/service/IUmsUserService.class differ diff --git a/target/classes/com/yovinchen/forum/service/impl/IBmsBillboardServiceImpl.class b/target/classes/com/yovinchen/forum/service/impl/IBmsBillboardServiceImpl.class new file mode 100644 index 0000000..87fce00 Binary files /dev/null and b/target/classes/com/yovinchen/forum/service/impl/IBmsBillboardServiceImpl.class differ diff --git a/target/classes/com/yovinchen/forum/service/impl/IBmsCommentServiceImpl.class b/target/classes/com/yovinchen/forum/service/impl/IBmsCommentServiceImpl.class new file mode 100644 index 0000000..781f23a Binary files /dev/null and b/target/classes/com/yovinchen/forum/service/impl/IBmsCommentServiceImpl.class differ diff --git a/target/classes/com/yovinchen/forum/service/impl/IBmsFollowServiceImpl.class b/target/classes/com/yovinchen/forum/service/impl/IBmsFollowServiceImpl.class new file mode 100644 index 0000000..a981098 Binary files /dev/null and b/target/classes/com/yovinchen/forum/service/impl/IBmsFollowServiceImpl.class differ diff --git a/target/classes/com/yovinchen/forum/service/impl/IBmsPostServiceImpl.class b/target/classes/com/yovinchen/forum/service/impl/IBmsPostServiceImpl.class new file mode 100644 index 0000000..5e12451 Binary files /dev/null and b/target/classes/com/yovinchen/forum/service/impl/IBmsPostServiceImpl.class differ diff --git a/target/classes/com/yovinchen/forum/service/impl/IBmsPromotionServiceImpl.class b/target/classes/com/yovinchen/forum/service/impl/IBmsPromotionServiceImpl.class new file mode 100644 index 0000000..8c35884 Binary files /dev/null and b/target/classes/com/yovinchen/forum/service/impl/IBmsPromotionServiceImpl.class differ diff --git a/target/classes/com/yovinchen/forum/service/impl/IBmsTagServiceImpl.class b/target/classes/com/yovinchen/forum/service/impl/IBmsTagServiceImpl.class new file mode 100644 index 0000000..783dcc0 Binary files /dev/null and b/target/classes/com/yovinchen/forum/service/impl/IBmsTagServiceImpl.class differ diff --git a/target/classes/com/yovinchen/forum/service/impl/IBmsTipServiceImpl.class b/target/classes/com/yovinchen/forum/service/impl/IBmsTipServiceImpl.class new file mode 100644 index 0000000..9ce9982 Binary files /dev/null and b/target/classes/com/yovinchen/forum/service/impl/IBmsTipServiceImpl.class differ diff --git a/target/classes/com/yovinchen/forum/service/impl/IBmsTopicTagServiceImpl.class b/target/classes/com/yovinchen/forum/service/impl/IBmsTopicTagServiceImpl.class new file mode 100644 index 0000000..7badb59 Binary files /dev/null and b/target/classes/com/yovinchen/forum/service/impl/IBmsTopicTagServiceImpl.class differ diff --git a/target/classes/com/yovinchen/forum/service/impl/IUmsUserServiceImpl.class b/target/classes/com/yovinchen/forum/service/impl/IUmsUserServiceImpl.class new file mode 100644 index 0000000..e12af60 Binary files /dev/null and b/target/classes/com/yovinchen/forum/service/impl/IUmsUserServiceImpl.class differ diff --git a/target/classes/com/yovinchen/forum/utils/MD5Utils.class b/target/classes/com/yovinchen/forum/utils/MD5Utils.class new file mode 100644 index 0000000..dd1b599 Binary files /dev/null and b/target/classes/com/yovinchen/forum/utils/MD5Utils.class differ diff --git a/target/classes/mapper/BmsCommentMapper.xml b/target/classes/mapper/BmsCommentMapper.xml new file mode 100644 index 0000000..b15db9d --- /dev/null +++ b/target/classes/mapper/BmsCommentMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + diff --git a/target/classes/mapper/BmsPostMapper.xml b/target/classes/mapper/BmsPostMapper.xml new file mode 100644 index 0000000..a1538d9 --- /dev/null +++ b/target/classes/mapper/BmsPostMapper.xml @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/target/classes/mapper/BmsPostTagMapper.xml b/target/classes/mapper/BmsPostTagMapper.xml new file mode 100644 index 0000000..c2662c5 --- /dev/null +++ b/target/classes/mapper/BmsPostTagMapper.xml @@ -0,0 +1,9 @@ + + + + + diff --git a/target/classes/mapper/BmsTipMapper.xml b/target/classes/mapper/BmsTipMapper.xml new file mode 100644 index 0000000..75af804 --- /dev/null +++ b/target/classes/mapper/BmsTipMapper.xml @@ -0,0 +1,10 @@ + + + + + diff --git a/target/test-classes/com/yovinchen/forum/DoubaoApplicationTests.class b/target/test-classes/com/yovinchen/forum/DoubaoApplicationTests.class new file mode 100644 index 0000000..cb00daf Binary files /dev/null and b/target/test-classes/com/yovinchen/forum/DoubaoApplicationTests.class differ