This commit is contained in:
oneao committed 2025-12-16 17:21:56 +08:00
1 parent 1da52dc4f4
commit 276644f473
223 files changed
+9609 -262

No files matched your search

+38
View File
@@ -0,0 +1,38 @@
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store
+8
View File
@@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml
+7
View File
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
</component>
</project>
@@ -0,0 +1,10 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="DuplicatedCode" enabled="true" level="WEAK WARNING" enabled_by_default="true">
<Languages>
<language minSize="48" name="Java" />
</Languages>
</inspection_tool>
</profile>
</component>
+14
View File
@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>
+124
View File
@@ -0,0 +1,124 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Palette2">
<group name="Swing">
<item class="com.intellij.uiDesigner.HSpacer" tooltip-text="Horizontal Spacer" icon="/com/intellij/uiDesigner/icons/hspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="1" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="com.intellij.uiDesigner.VSpacer" tooltip-text="Vertical Spacer" icon="/com/intellij/uiDesigner/icons/vspacer.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="1" anchor="0" fill="2" />
</item>
<item class="javax.swing.JPanel" icon="/com/intellij/uiDesigner/icons/panel.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3" />
</item>
<item class="javax.swing.JScrollPane" icon="/com/intellij/uiDesigner/icons/scrollPane.svg" removable="false" auto-create-binding="false" can-attach-label="true">
<default-constraints vsize-policy="7" hsize-policy="7" anchor="0" fill="3" />
</item>
<item class="javax.swing.JButton" icon="/com/intellij/uiDesigner/icons/button.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="0" fill="1" />
<initial-values>
<property name="text" value="Button" />
</initial-values>
</item>
<item class="javax.swing.JRadioButton" icon="/com/intellij/uiDesigner/icons/radioButton.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="RadioButton" />
</initial-values>
</item>
<item class="javax.swing.JCheckBox" icon="/com/intellij/uiDesigner/icons/checkBox.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="3" anchor="8" fill="0" />
<initial-values>
<property name="text" value="CheckBox" />
</initial-values>
</item>
<item class="javax.swing.JLabel" icon="/com/intellij/uiDesigner/icons/label.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="8" fill="0" />
<initial-values>
<property name="text" value="Label" />
</initial-values>
</item>
<item class="javax.swing.JTextField" icon="/com/intellij/uiDesigner/icons/textField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JPasswordField" icon="/com/intellij/uiDesigner/icons/passwordField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JFormattedTextField" icon="/com/intellij/uiDesigner/icons/formattedTextField.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1">
<preferred-size width="150" height="-1" />
</default-constraints>
</item>
<item class="javax.swing.JTextArea" icon="/com/intellij/uiDesigner/icons/textArea.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTextPane" icon="/com/intellij/uiDesigner/icons/textPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JEditorPane" icon="/com/intellij/uiDesigner/icons/editorPane.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JComboBox" icon="/com/intellij/uiDesigner/icons/comboBox.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="2" anchor="8" fill="1" />
</item>
<item class="javax.swing.JTable" icon="/com/intellij/uiDesigner/icons/table.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JList" icon="/com/intellij/uiDesigner/icons/list.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="2" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTree" icon="/com/intellij/uiDesigner/icons/tree.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3">
<preferred-size width="150" height="50" />
</default-constraints>
</item>
<item class="javax.swing.JTabbedPane" icon="/com/intellij/uiDesigner/icons/tabbedPane.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSplitPane" icon="/com/intellij/uiDesigner/icons/splitPane.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="3" hsize-policy="3" anchor="0" fill="3">
<preferred-size width="200" height="200" />
</default-constraints>
</item>
<item class="javax.swing.JSpinner" icon="/com/intellij/uiDesigner/icons/spinner.svg" removable="false" auto-create-binding="true" can-attach-label="true">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSlider" icon="/com/intellij/uiDesigner/icons/slider.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="8" fill="1" />
</item>
<item class="javax.swing.JSeparator" icon="/com/intellij/uiDesigner/icons/separator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="6" anchor="0" fill="3" />
</item>
<item class="javax.swing.JProgressBar" icon="/com/intellij/uiDesigner/icons/progressbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1" />
</item>
<item class="javax.swing.JToolBar" icon="/com/intellij/uiDesigner/icons/toolbar.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="6" anchor="0" fill="1">
<preferred-size width="-1" height="20" />
</default-constraints>
</item>
<item class="javax.swing.JToolBar$Separator" icon="/com/intellij/uiDesigner/icons/toolbarSeparator.svg" removable="false" auto-create-binding="false" can-attach-label="false">
<default-constraints vsize-policy="0" hsize-policy="0" anchor="0" fill="1" />
</item>
<item class="javax.swing.JScrollBar" icon="/com/intellij/uiDesigner/icons/scrollbar.svg" removable="false" auto-create-binding="true" can-attach-label="false">
<default-constraints vsize-policy="6" hsize-policy="0" anchor="0" fill="2" />
</item>
</group>
</component>
</project>
+7
View File
@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/../../.." vcs="Git" />
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>
+225
View File
@@ -0,0 +1,225 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.sslog</groupId>
<artifactId>link56-backend</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
<spring-boot.version>2.5.15</spring-boot.version>
<druid.version>1.2.23</druid.version>
<jwt.version>3.10.3</jwt.version>
<jtds.version>1.3.1</jtds.version>
<mybatis-plus.version>3.5.10.1</mybatis-plus.version>
<p6spy.version>3.9.1</p6spy.version>
<commons.version>3.12.0</commons.version>
<!-- override dependency version -->
<tomcat.version>9.0.96</tomcat.version>
<logback.version>1.2.13</logback.version>
<spring-framework.version>5.3.39</spring-framework.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 覆盖SpringFramework的依赖配置-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>${spring-framework.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- SpringBoot Web容器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- SpringBoot 拦截器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!-- lombok 注解 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- validation 验证 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<!-- 覆盖logback的依赖配置-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>${logback.version}</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback.version}</version>
</dependency>
<!-- 覆盖tomcat的依赖配置-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-el</artifactId>
<version>${tomcat.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-websocket</artifactId>
<version>${tomcat.version}</version>
</dependency>
<!-- 阿里数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
</dependency>
<!-- Token生成与解析-->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>${jwt.version}</version>
</dependency>
<dependency>
<groupId>net.sourceforge.jtds</groupId>
<artifactId>jtds</artifactId>
<version>${jtds.version}</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-jsqlparser-4.9</artifactId>
<version>${mybatis-plus.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons.version}</version>
</dependency>
<!-- socket启动依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<!--邮箱-->
<!--mail依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<!--thymeleaf依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
</dependencies>
<!-- 打包格式 -->
<packaging>jar</packaging>
<repositories>
<repository>
<id>public</id>
<name>aliyun nexus</name>
<url>https://maven.aliyun.com/repository/public</url>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>public</id>
<name>aliyun nexus</name>
<url>https://maven.aliyun.com/repository/public</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.5.15</version>
<configuration>
<fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
@@ -0,0 +1,14 @@
package cn.link56;
import cn.link56.utils.snowflake.idgen.IdGenerator;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
@SpringBootApplication
@EnableAsync
public class SSlogUserApiApplication {
public static void main(String[] args) {
SpringApplication.run(SSlogUserApiApplication.class,args);
}
}
@@ -0,0 +1,13 @@
package cn.link56.common;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BasePageDTO {
private Integer page;
private Integer pageSize;
}
@@ -0,0 +1,19 @@
package cn.link56.common;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Accessors(chain = true)
public class BasePageVO<T> {
private long total;
private List<T> record;
}
@@ -0,0 +1,53 @@
package cn.link56.common;
import cn.link56.constants.ResponseStatusConstants;
import lombok.Data;
import lombok.NonNull;
@Data
public class Result<T> {
private final Integer code; // 编码(必填)
private final String message; // 国际化消息键(必填)
@NonNull
private final T data; // 数据(可空)
// 私有构造函数,强制通过静态工厂方法创建实例
private Result(Integer code, String message, T data) {
this.code = code;
this.message = message;
this.data = data;
}
// 成功响应(无数据)
public static <T> Result<T> success() {
return new Result<>(ResponseStatusConstants.SUCCESS,"请求成功", null);
}
public static <T> Result<T> success(String message) {
return new Result<>(ResponseStatusConstants.SUCCESS, message, null);
}
// 成功响应(带数据)
public static <T> Result<T> success(@NonNull T data) {
return new Result<>(ResponseStatusConstants.SUCCESS,"请求成功", data);
}
// 成功响应(带数据)
public static <T> Result<T> success(@NonNull T data,String message) {
return new Result<>(ResponseStatusConstants.SUCCESS, message, data);
}
public static <T> Result<T> error(Integer code,String message){
return new Result<>(code, message, null);
}
public static <T> Result<T> error(String message){
return new Result<>(ResponseStatusConstants.ERROR, message, null);
}
public static <T> Result<T> error(){
return new Result<>(ResponseStatusConstants.ERROR, null,null);
}
}
@@ -0,0 +1,32 @@
package cn.link56.config;
import cn.link56.context.UserContext;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@Component
public class AutoFillMetaObjectHandler implements MetaObjectHandler {
// 格式化为年月日 时分秒格式的字符串
private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@Override
public void insertFill(MetaObject metaObject) {
// 获取当前时间并格式化为字符串
String formattedDate = LocalDateTime.now().format(formatter);
String userId = UserContext.getUserId();
this.strictInsertFill(metaObject, "createId", String.class, userId); // 使用字符串类型保存
this.strictInsertFill(metaObject, "createTime", String.class, formattedDate); // 使用字符串类型保存
this.strictInsertFill(metaObject, "updateTime", String.class, formattedDate); // 同样填充 updatedAt
}
@Override
public void updateFill(MetaObject metaObject) {
// 获取当前时间并格式化为字符串
String formattedDate = LocalDateTime.now().format(formatter);
this.strictUpdateFill(metaObject, "updateTime", String.class, formattedDate); // 使用字符串类型保存
}
}
@@ -0,0 +1,19 @@
package cn.link56.config;
import cn.link56.utils.snowflake.contract.IdGeneratorOptions;
import cn.link56.utils.snowflake.idgen.IdGenerator;
import lombok.RequiredArgsConstructor;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
@Component
@RequiredArgsConstructor
public class IdGeneratorInitializer {
@EventListener(ApplicationReadyEvent.class)
public void init() {
IdGeneratorOptions options = new IdGeneratorOptions();
options.WorkerId = 1;
IdGenerator.setIdGenerator(options);
}
}
@@ -0,0 +1,24 @@
package cn.link56.config;
import com.baomidou.mybatisplus.annotation.DbType;
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("cn.link56.mapper")
public class MybatisPlusConfig {
/**
* 添加分页插件
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.SQL_SERVER2005)); // 如果配置多个插件, 切记分页最后添加
// 如果有多数据源可以不配具体类型, 否则都建议配上具体的 DbType
return interceptor;
}
}
@@ -0,0 +1,18 @@
package cn.link56.config;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
public class RemoveMillisSerializer extends JsonSerializer<String> {
@Override
public void serialize(String value, JsonGenerator gen, SerializerProvider provider) throws IOException {
if (value != null && value.length() > 19) {
gen.writeString(value.substring(0, 19)); // 去除毫秒
} else {
gen.writeString(value);
}
}
}
@@ -0,0 +1,29 @@
package cn.link56.config;
import org.springframework.context.annotation.Configuration;
@Configuration
public class WebCorsConfig {
// @Bean
// public CorsFilter corsFilter() {
// // 1.创建 CORS 配置对象
// CorsConfiguration config = new CorsConfiguration();
// // 支持域
// config.addAllowedOriginPattern("*");
// // 是否发送 Cookie
// config.setAllowCredentials(true);
// // 支持请求方式
// config.addAllowedMethod("*");
// // 允许的原始请求头部信息
// config.addAllowedHeader("*");
// // 暴露的头部信息
// config.addExposedHeader("*");
// // 有效期 1800秒,设置预检请求(OPTIONS请求)的缓存时间,1800秒意味着客户端可以缓存这个设置1800秒
// config.setMaxAge(1800L);
// // 2.添加地址映射
// UrlBasedCorsConfigurationSource corsConfigurationSource = new UrlBasedCorsConfigurationSource();
// corsConfigurationSource.registerCorsConfiguration("/**", config);
// // 3.返回 CorsFilter 对象
// return new CorsFilter(corsConfigurationSource);
// }
}
@@ -0,0 +1,31 @@
package cn.link56.config;
import cn.link56.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor()) // 注册拦截器
.addPathPatterns("/**") // 拦截所有请求
.excludePathPatterns(
"/auth/**",
"/company/getCompanyPage",
"/company/getPublicDetail",
"/company/getRecommendList",
"/company/getRecommendRightList",
"/forum/post/page",
"/forum/post/detail",
"/forum/post/getRecommendList",
"/forum/post/getHotList",
"/forum/post/comment/list",
"/webProperty/**",
"/webArea/**"
);
}
}
@@ -0,0 +1,13 @@
package cn.link56.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
@Configuration
public class WebSocketConfig {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
}
@@ -0,0 +1,28 @@
package cn.link56.constants;
public class ResponseStatusConstants {
/**
* 操作成功
*/
public static final Integer SUCCESS = 200;
/**
* 系统内部错误
*/
public static final Integer ERROR = 500;
/**
* 缺少参数,参数格式有误,请求路径有误等
*/
public static final Integer BAD_REQUEST = 400;
/**
* 未找到资源,或者该资源已丢失
*/
public static final Integer NOT_FOUND = 404;
/**
* 登录失效或已过期
*/
public static final Integer UNAUTHORIZED = 401;
}
@@ -0,0 +1,27 @@
package cn.link56.context;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.ObjectUtils;
public class UserContext {
private static final ThreadLocal<String> userIdThreadLocal = new ThreadLocal<>();
public static void setUserId(String userId) {
userIdThreadLocal.set(userId);
}
public static String getUserId() {
String userId = userIdThreadLocal.get();
if (StringUtils.isEmpty(userId)) {
userId = "";
userIdThreadLocal.set(userId);
}
return userId;
}
public static void removeUserId() {
if (ObjectUtils.isEmpty(userIdThreadLocal)) {
userIdThreadLocal.remove();
}
}
}
@@ -0,0 +1,37 @@
package cn.link56.controller;
import cn.link56.common.Result;
import cn.link56.domain.dto.ForgetDTO;
import cn.link56.domain.dto.LoginDTO;
import cn.link56.domain.dto.RegisterDTO;
import cn.link56.domain.vo.LoginVO;
import cn.link56.service.AuthService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@RequestMapping("/auth")
public class AuthController {
@Resource
private AuthService authService;
@PostMapping("/register")
public Result<Void> register(@RequestBody @Validated RegisterDTO registerDTO){
return authService.register(registerDTO);
}
@PostMapping("/login")
public Result<LoginVO> login(@RequestBody @Validated LoginDTO loginDTO) {
return authService.login(loginDTO);
}
@PostMapping({"/forget"})
public Result<Void> forget(@RequestBody @Validated ForgetDTO forgetDTO) {
return authService.forget(forgetDTO);
}
}
@@ -0,0 +1,39 @@
package cn.link56.controller;
import cn.link56.common.Result;
import cn.link56.domain.dto.file.InsertFileDTO;
import cn.link56.domain.vo.aliyun.AliyunKeyVO;
import cn.link56.service.SlFileService;
import cn.link56.utils.HttpUtils;
import cn.link56.utils.JsonUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@RequestMapping("/file")
public class FileController {
@Resource
private SlFileService slFileService;
@PostMapping("/getAliyunKey")
public Result<AliyunKeyVO> getAliyunKey() {
String requestUrl = "http://g3oss.g3soft.cn:8082/upload?orgid=sllog&bucket=g3hdzjsj";
String s = HttpUtils.sendGet(requestUrl);
AliyunKeyVO aliyunKeyVO = (AliyunKeyVO) JsonUtils.toBean(s, AliyunKeyVO.class);
assert aliyunKeyVO != null;
return Result.success(aliyunKeyVO);
}
@PostMapping("/insert")
public Result<Void> insertFile(@RequestBody @Validated InsertFileDTO insertFileDTO) {
boolean flag = slFileService.insertFile(insertFileDTO);
return flag ? Result.success() : Result.error();
}
}
@@ -0,0 +1,48 @@
package cn.link56.controller;
import cn.link56.common.Result;
import cn.link56.domain.dto.im.ImMessageHistoryDTO;
import cn.link56.domain.dto.im.ImMessageUpdateIsReadDTO;
import cn.link56.domain.vo.im.AllNoReadNumberVO;
import cn.link56.domain.vo.im.ChatCompanyVO;
import cn.link56.domain.vo.im.ImMessageHistoryVO;
import cn.link56.service.ImMessageService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
@RestController
@RequestMapping("/imMessage")
public class ImMessageController {
@Resource
private ImMessageService imMessageService;
@PostMapping("/chats")
public Result<List<ChatCompanyVO>> getChats(){
List<ChatCompanyVO> list = imMessageService.getChats();
return Result.success(list);
}
@PostMapping("/history")
public Result<List<ImMessageHistoryVO>> getMessageHistory(@RequestBody @Validated ImMessageHistoryDTO imMessageHistoryDTO){
List<ImMessageHistoryVO> list = imMessageService.getMessageHistory(imMessageHistoryDTO);
return Result.success(list);
}
@PostMapping("/updateIsRead")
public Result<Void> updateIsRead(@RequestBody @Validated ImMessageUpdateIsReadDTO imMessageUpdateIsReadDTO){
imMessageService.updateIsRead(imMessageUpdateIsReadDTO);
return Result.success();
}
@PostMapping("/getAllNoReadNumber")
public Result<AllNoReadNumberVO> getAllNoReadNumber(){
AllNoReadNumberVO allNoReadNumberVO = imMessageService.getAllNoReadNumber();
return Result.success(allNoReadNumberVO);
}
}
@@ -0,0 +1,64 @@
package cn.link56.controller;
import cn.link56.common.BasePageVO;
import cn.link56.common.Result;
import cn.link56.domain.dto.company.CompanyPageDTO;
import cn.link56.domain.dto.company.CompanyPublicDetailDTO;
import cn.link56.domain.dto.company.CompanyUpdateDetailDTO;
import cn.link56.domain.vo.company.*;
import cn.link56.service.SlCompanyService;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
@RestController
@RequestMapping("/company")
public class SlCompanyController {
@Resource
private SlCompanyService slCompanyService;
@PostMapping("/getCompanyPage")
public Result<BasePageVO<CompanyPageVO>> getCompanyPage(@RequestBody @Validated CompanyPageDTO companyPageDTO){
BasePageVO<CompanyPageVO> list = slCompanyService.getCompanyPage(companyPageDTO);
return Result.success(list);
}
@GetMapping("/getPrivateDetail")
public Result<CompanyPrivateDetailVO> getPrivateDetail(){
CompanyPrivateDetailVO companyPrivateDetailVO = slCompanyService.getPrivateDetail();
return Result.success(companyPrivateDetailVO);
}
@PostMapping("/getPublicDetail")
public Result<CompanyPublicDetailVO> getPublicDetail(@RequestBody @Validated CompanyPublicDetailDTO companyPublicDetailDTO){
CompanyPublicDetailVO companyPublicDetailVO = slCompanyService.getPublicDetail(companyPublicDetailDTO);
if(ObjectUtils.isEmpty(companyPublicDetailVO)){
return Result.error("该公司已不存在!");
}
return Result.success(companyPublicDetailVO);
}
@PostMapping("/update")
public Result<Void> update(@RequestBody @Validated CompanyUpdateDetailDTO companyUpdateDetailDTO){
return slCompanyService.updateDetail(companyUpdateDetailDTO);
}
@GetMapping("/getRecommendList")
public Result<List<CompanyRecommendVO>> getRecommendList(){
List<CompanyRecommendVO> list = slCompanyService.getRecommendList();
return Result.success(list);
}
@GetMapping("/getRecommendRightList")
public Result<List<CompanyRecommendRightVO>> getRecommendRightList(){
List<CompanyRecommendRightVO> list = slCompanyService.getRecommendRightList();
return Result.success(list);
}
}
@@ -0,0 +1,49 @@
package cn.link56.controller;
import cn.link56.common.BasePageDTO;
import cn.link56.common.BasePageVO;
import cn.link56.common.Result;
import cn.link56.domain.vo.notification.NotificationVO;
import cn.link56.service.SlNotificationService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.constraints.NotBlank;
@RestController
@RequestMapping("/notification")
public class SlNotificationController {
@Resource
private SlNotificationService slNotificationService;
@PostMapping("/likeAndFavorite")
public Result<BasePageVO<NotificationVO>> likePage(@RequestBody BasePageDTO basePageDTO){
BasePageVO<NotificationVO> result = slNotificationService.getLikeFavoritePage(basePageDTO);
return Result.success(result);
}
@PostMapping("/comment")
public Result<BasePageVO<NotificationVO>> commentPage(@RequestBody BasePageDTO basePageDTO){
BasePageVO<NotificationVO> result = slNotificationService.getCommentPage(basePageDTO);
return Result.success(result);
}
@PostMapping("/delete/{notificationId}")
public Result<Void> delete(@PathVariable @NotBlank(message = "通知ID不能为空") String notificationId) {
boolean flag = slNotificationService.removeById(notificationId);
return flag ? Result.success() : Result.error();
}
@PostMapping("/likeAndFavorite/deleteAll")
public Result<Void> deleteAllLikeAndFavorite() {
boolean deleteFlag = slNotificationService.deleteAllLikeAndFavorite();
return deleteFlag ? Result.success() : Result.error();
}
@PostMapping("/comment/deleteAll")
public Result<Void> deleteAllComment() {
boolean deleteFlag = slNotificationService.deleteAllComment();
return deleteFlag ? Result.success() : Result.error();
}
}
@@ -0,0 +1,25 @@
package cn.link56.controller;
import cn.link56.common.Result;
import cn.link56.domain.vo.area.AreaVO;
import cn.link56.service.WebAreaService;
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;
@RestController
@RequestMapping("/webArea")
public class WebAreaController {
@Resource
private WebAreaService webAreaService;
@GetMapping("/list")
public Result<List<AreaVO>> list(){
List<AreaVO> result = webAreaService.getList();
return Result.success(result);
}
}
@@ -0,0 +1,24 @@
package cn.link56.controller;
import cn.link56.common.Result;
import cn.link56.domain.vo.property.WebPropertyVO;
import cn.link56.service.WebPropertyService;
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;
@RestController
@RequestMapping("/webProperty")
public class WebPropertyController {
@Resource
private WebPropertyService webPropertyService;
@GetMapping("/list")
public Result<List<WebPropertyVO>> list(){
List<WebPropertyVO> result = webPropertyService.getList();
return Result.success(result);
}
}
@@ -0,0 +1,240 @@
package cn.link56.controller;
import cn.link56.domain.entity.ImMessage;
import cn.link56.domain.im.dto.ImAcceptCheckOneOnlineDTO;
import cn.link56.domain.im.dto.ImAcceptMessageDTO;
import cn.link56.domain.im.dto.ImAcceptOneDTO;
import cn.link56.domain.im.dto.ImAcceptRollbackDTO;
import cn.link56.domain.im.vo.ImSendCheckOneOnlineVO;
import cn.link56.domain.im.vo.ImSendMessageVO;
import cn.link56.domain.im.vo.ImSendNormalVO;
import cn.link56.domain.im.vo.ImSendRollbackVO;
import cn.link56.enums.ImAcceptMessageEnum;
import cn.link56.enums.ImSendMessageEnum;
import cn.link56.service.ImMessageService;
import cn.link56.service.SlCompanyService;
import cn.link56.utils.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import javax.websocket.*;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
@ServerEndpoint("/websocket/{token}")
@Component
@Slf4j
public class WebSocketApplication {
/**
* 存储创建连接的用户信息。
* KEY:用户、公司id
* VALUE:建立的会话session
*/
// 存储所有活跃会话(用户ID -> 会话对象)
private static final ConcurrentHashMap<String, CopyOnWriteArrayList<Session>> socketPool = new ConcurrentHashMap<>();
// WebSocket 握手时获取用户ID的参数名
private static final String COMPANY_ID_PARAM = "id";
private static final SlCompanyService slCompanyService = SpringUtils.getBean(SlCompanyService.class);
private static final ImMessageService imMessageService = SpringUtils.getBean(ImMessageService.class);
@OnOpen
public void onOpen(Session session, @PathParam("token") String token) throws IOException {
try {
if (StringUtils.isEmpty(token)) {
return;
}
// 验证token
JwtUtils.verify(token);
// 验证成功,获取用户ID
String userId = JwtUtils.getTokenInfo(token).get(COMPANY_ID_PARAM).asString();
// 将用户id存入到session属性中
session.getUserProperties().put(COMPANY_ID_PARAM, userId);
// 添加新连接
socketPool.computeIfAbsent(userId, k -> new CopyOnWriteArrayList<>()).add(session);
// 打印 userId 和当前该用户在线连接数
List<Session> currentSessions = socketPool.get(userId);
int onlineCount = (int) currentSessions.stream().filter(Session::isOpen).count();
} catch (Exception e) {
e.printStackTrace(); // 建议打日志
}
}
@OnClose
public void onClose(Session session) throws IOException {
String userId = (String) session.getUserProperties().get(COMPANY_ID_PARAM);
if (StringUtils.isNotEmpty(userId)) {
List<Session> sessions = socketPool.get(userId);
if (sessions != null) {
sessions.remove(session);
if (sessions.isEmpty()) {
socketPool.remove(userId);
}
}
}
}
@OnMessage
public void onMessage(String message, Session session) throws IOException {
ImAcceptMessageDTO baseDto = null;
try {
baseDto = JsonUtils.toBean(message, ImAcceptMessageDTO.class);
}catch (Exception e){
sendMessageBySession(session,ImSendMessageEnum.ERROR,null);
return;
}
if (ObjectUtils.isEmpty(baseDto)) {
log.warn("Received empty message from session {}", session.getId());
return;
}
String type = baseDto.getType();
if (StringUtils.isEmpty(type)) {
log.warn("Received message without type from session {}", session.getId());
return;
}
try {
ImAcceptMessageEnum enumType = ImAcceptMessageEnum.valueOf(type);
switch (enumType) {
case PING:
sendMessageBySession(session,ImSendMessageEnum.PONG,null);
break;
case CHECK_ONE_ONLINE:
ImAcceptCheckOneOnlineDTO imAcceptCheckOneOnlineDTO = MessageConverterUtils.convertData(baseDto.getData(), ImAcceptCheckOneOnlineDTO.class);
handleAcceptCheckOneOnline(imAcceptCheckOneOnlineDTO,session);
break;
case ONE:
ImAcceptOneDTO imAcceptOneDTO = MessageConverterUtils.convertData(baseDto.getData(), ImAcceptOneDTO.class);
handleAcceptOne(imAcceptOneDTO,session);
break;
case ROLLBACK:
ImAcceptRollbackDTO imAcceptRollbackDTO = MessageConverterUtils.convertData(baseDto.getData(),ImAcceptRollbackDTO.class);
handleAcceptRollback(imAcceptRollbackDTO);
break;
default:
System.out.println("未知消息类型");
break;
}
}catch (Exception e){
sendMessageBySession(session,ImSendMessageEnum.ERROR,null);
}
}
@OnError
public void onError(Session session, Throwable throwable) {
}
private void handleAcceptRollback(ImAcceptRollbackDTO imAcceptRollbackDTO) throws IOException {
String messageId = imAcceptRollbackDTO.getMessageId();
ImMessage imMessage = imMessageService.getById(messageId);
// 更新
imMessageService.updateIsRollback(imAcceptRollbackDTO);
String sendId = imMessage.getSendId();
String acceptId = imMessage.getAcceptId();
ImSendRollbackVO imSendRollbackVO = new ImSendRollbackVO();
imSendRollbackVO.setMessageId(messageId);
imSendRollbackVO.setSendId(sendId);
imSendRollbackVO.setAcceptId(acceptId);
sendMessageByCompanyId(sendId,ImSendMessageEnum.ROLLBACK,imSendRollbackVO);
sendMessageByCompanyId(acceptId,ImSendMessageEnum.ROLLBACK,imSendRollbackVO);
}
private void handleAcceptOne(ImAcceptOneDTO imAcceptOneDTO, Session session) throws IOException {
ImMessage imMessage = imMessageService.insertOne(imAcceptOneDTO);
if(ObjectUtils.isEmpty(imMessage)){
sendMessageBySession(session,ImSendMessageEnum.ERROR,null);
return;
}
ImSendNormalVO imSendNormalVO = new ImSendNormalVO();
imSendNormalVO.setMessageId(imMessage.getId())
.setMessageContent(imMessage.getContent())
.setMessageContentType(imMessage.getContentType())
.setSendId(imMessage.getSendId())
.setAcceptId(imMessage.getAcceptId())
.setQuoteMessageId(imMessage.getQuoteId())
.setIsRollback(imMessage.getIsRollback())
.setSendMessageTime(imMessage.getCreateTime());
sendMessageByCompanyId(imSendNormalVO.getSendId(),ImSendMessageEnum.ONE,imSendNormalVO);
imSendNormalVO.setSendName(slCompanyService.getById(imAcceptOneDTO.getSendId()).getName());
sendMessageByCompanyId(imSendNormalVO.getAcceptId(), ImSendMessageEnum.ONE,imSendNormalVO);
}
private void handleAcceptCheckOneOnline(ImAcceptCheckOneOnlineDTO imAcceptCheckOneOnlineDTO, Session session) throws IOException {
String companyId = imAcceptCheckOneOnlineDTO.getCompanyId();
if (StringUtils.isEmpty(companyId)) {
return;
}
ImSendCheckOneOnlineVO imSendCheckOneOnlineVO = new ImSendCheckOneOnlineVO();
imSendCheckOneOnlineVO.setCompanyId(companyId);
List<Session> sessions = socketPool.get(companyId);
boolean isOnline = false;
if (sessions != null) {
// 判断是否有至少一个打开的连接
isOnline = sessions.stream().anyMatch(Session::isOpen);
}
imSendCheckOneOnlineVO.setIsOnline(isOnline);
sendMessageBySession(session, ImSendMessageEnum.CHECK_ONE_ONLINE, imSendCheckOneOnlineVO);
}
// 给某个公司下的所有连接发送消息
private void sendMessageByCompanyId(String companyId, ImSendMessageEnum type, Object data) throws IOException {
List<Session> sessions = socketPool.get(companyId);
if (sessions != null) {
for (Session session : sessions) {
sendMessageCommon(session, type, data);
}
}
}
// 给单个会话发送消息(保持不变)
private void sendMessageBySession(Session session, ImSendMessageEnum type, Object data) throws IOException {
sendMessageCommon(session, type, data);
}
// 通用发送方法
private void sendMessageCommon(Session session, ImSendMessageEnum type, Object data) throws IOException {
if (session != null && session.isOpen()) {
final RemoteEndpoint.Basic remote = session.getBasicRemote();
synchronized (remote) {
ImSendMessageVO imSendMessageVO = new ImSendMessageVO();
imSendMessageVO.setType(type.name());
imSendMessageVO.setData(data);
remote.sendText(JsonUtils.toJson(imSendMessageVO));
}
}
}
}
@@ -0,0 +1,36 @@
package cn.link56.controller.forum;
import cn.link56.common.Result;
import cn.link56.domain.dto.forum.comment.ForumCommentAddDTO;
import cn.link56.domain.vo.forum.comment.ForumPostCommentVO;
import cn.link56.service.forum.ForumPostCommentService;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.constraints.NotBlank;
import java.util.List;
@RestController
@RequestMapping("/forum/post/comment")
public class ForumPostCommentController {
@Resource
private ForumPostCommentService forumPostCommentService;
@PostMapping("/add")
public Result<ForumPostCommentVO> add(@RequestBody @Validated ForumCommentAddDTO forumCommentAddDTO){
return forumPostCommentService.add(forumCommentAddDTO);
}
@GetMapping("/list")
public Result<List<ForumPostCommentVO>> getPostComments(@RequestParam("forumPostId") @NotBlank(message = "帖子ID不能为空") String forumPostId){
List<ForumPostCommentVO> forumPostCommentVOS = forumPostCommentService.getPostComments(forumPostId);
return Result.success(forumPostCommentVOS);
}
@PostMapping("/delete/{forumPostCommentId}")
public Result<Void> delete(@PathVariable("forumPostCommentId") @NotBlank(message = "帖子ID不能为空") String forumPostCommentId) {
boolean removeFlag = forumPostCommentService.deletePostComment(forumPostCommentId);
return removeFlag ? Result.success() : Result.error();
}
}
@@ -0,0 +1,103 @@
package cn.link56.controller.forum;
import cn.link56.common.BasePageVO;
import cn.link56.common.Result;
import cn.link56.constants.ResponseStatusConstants;
import cn.link56.domain.dto.forum.post.*;
import cn.link56.domain.entity.forum.ForumPost;
import cn.link56.domain.vo.forum.ForumDashboardVO;
import cn.link56.domain.vo.forum.post.ForumPostDetailVO;
import cn.link56.domain.vo.forum.post.ForumPostPageVO;
import cn.link56.domain.vo.forum.post.ForumPostStatusCountVO;
import cn.link56.domain.vo.forum.post.chart.ForumPostChartNumberVO;
import cn.link56.domain.vo.forum.post.chart.ForumPostChartTypeVO;
import cn.link56.domain.vo.forum.post.chart.ForumPostChartViewVO;
import cn.link56.service.forum.ForumPostService;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
@RestController
@RequestMapping("/forum/post")
public class ForumPostController {
@Resource
private ForumPostService forumPostService;
@PostMapping("/add")
public Result<ForumPostDetailVO> add(@RequestBody @Validated ForumPostAddDTO forumPostAddDTO){
return forumPostService.add(forumPostAddDTO);
}
@PostMapping("/update")
public Result<ForumPostDetailVO> update(@RequestBody @Validated ForumPostUpdateDTO forumPostUpdateDTO){
return forumPostService.updateDetail(forumPostUpdateDTO);
}
@PostMapping("/delete")
public Result<Void> deleteUserByPost(@RequestBody @Validated ForumPostDeleteDTO forumPostDeleteDTO) {
return forumPostService.delete(forumPostDeleteDTO);
}
@PostMapping("/page")
public Result<BasePageVO<ForumPostPageVO>> getPostPage(@RequestBody @Validated ForumPostCompanyPageDTO forumPostCompanyPageDTO){
return forumPostService.getPostPage(forumPostCompanyPageDTO);
}
@GetMapping("/getPostStatusCount")
public Result<ForumPostStatusCountVO> getPostStatusCount(){
ForumPostStatusCountVO forumPostStatusCountVO = forumPostService.getPostStatusCount();
return Result.success(forumPostStatusCountVO);
}
@PostMapping("/detail")
public Result<ForumPostDetailVO> getDetail(@RequestBody @Validated ForumPostDetailDTO forumPostDetailDTO) {
String forumPostId = forumPostDetailDTO.getForumPostId();
ForumPost forumPost = forumPostService.getById(forumPostId);
if(ObjectUtils.isEmpty(forumPost)){
return Result.error(ResponseStatusConstants.NOT_FOUND,"来晚了,该篇帖子已被删除!");
}
ForumPostDetailVO forumPostDetailVO = forumPostService.getDetail(forumPostDetailDTO);
return Result.success(forumPostDetailVO);
}
@GetMapping("/getRecommendList")
public Result<List<ForumPostPageVO>> getRecommendList(){
List<ForumPostPageVO> list = forumPostService.getRecommendList();
return Result.success(list);
}
@GetMapping("/getHotList")
public Result<List<ForumPostPageVO>> getHotList(){
List<ForumPostPageVO> list = forumPostService.getHotList();
return Result.success(list);
}
@GetMapping("/getDashboardData")
public Result<ForumDashboardVO> getDashBoardData(){
ForumDashboardVO forumDashboardVO = forumPostService.getDashBoardData();
return Result.success(forumDashboardVO);
}
@GetMapping("/getChartView")
public Result<List<ForumPostChartViewVO>> getChartViewData(){
List<ForumPostChartViewVO> list = forumPostService.getChartViewData();
return Result.success(list);
}
@GetMapping("/getChartNumber")
public Result<List<ForumPostChartNumberVO>> getChartNumberData(){
List<ForumPostChartNumberVO> list = forumPostService.getChartNumberData();
return Result.success(list);
}
@GetMapping("/getChartType")
public Result<List<ForumPostChartTypeVO>> getChartTypeData(){
List<ForumPostChartTypeVO> list = forumPostService.getChartTypeData();
return Result.success(list);
}
}
@@ -0,0 +1,24 @@
package cn.link56.controller.forum;
import cn.link56.common.Result;
import cn.link56.service.forum.ForumPostFavoriteService;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.validation.constraints.NotBlank;
@RestController
@RequestMapping("/forum/post/favorite")
public class ForumPostFavoriteController {
@Resource
private ForumPostFavoriteService forumPostFavoriteService;
@PostMapping("/{postId}")
public Result<Void> favorite(@PathVariable @NotBlank(message = "帖子ID不能为空") String postId){
forumPostFavoriteService.favorite(postId);
return Result.success();
}
}
@@ -0,0 +1,21 @@
package cn.link56.controller.forum;
import cn.link56.common.Result;
import cn.link56.service.forum.ForumPostLikeService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.constraints.NotBlank;
@RestController
@RequestMapping("/forum/post/like")
public class ForumPostLikeController {
@Resource
private ForumPostLikeService forumPostLikeService;
@PostMapping("/{postId}")
public Result<Void> like(@PathVariable @NotBlank(message = "帖子ID不能为空") String postId){
forumPostLikeService.like(postId);
return Result.success();
}
}
@@ -0,0 +1,24 @@
package cn.link56.controller.forum;
import cn.link56.common.Result;
import cn.link56.service.forum.ForumPostViewService;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.validation.constraints.NotBlank;
@RestController
@RequestMapping("/forum/post/view")
public class ForumPostViewController {
@Resource
private ForumPostViewService forumPostViewService;
@PostMapping("/{postId}")
public Result<Void> view(@PathVariable @NotBlank(message = "帖子ID不能为空") String postId){
forumPostViewService.view(postId);
return Result.success();
}
}
@@ -0,0 +1,17 @@
package cn.link56.domain.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ForgetDTO {
@NotBlank(
message = "邮箱号或手机号不能为空"
)
private String forgetCredential;
}
@@ -0,0 +1,17 @@
package cn.link56.domain.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class LoginDTO {
@NotBlank(message = "邮箱号不能为空")
private String loginCredential;
@NotBlank(message = "密码不能为空")
private String password;
}
@@ -0,0 +1,26 @@
package cn.link56.domain.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class RegisterDTO {
@NotBlank(message = "账号不能为空")
private String account;
@NotBlank(message = "公司名称不能为空")
private String name;
@NotBlank(message = "邮箱不能为空")
@Email(message = "邮箱格式有误")
private String email;
@NotBlank(message = "密码不能为空")
private String password;
}
@@ -0,0 +1,15 @@
package cn.link56.domain.dto.company;
import cn.link56.common.BasePageDTO;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
@EqualsAndHashCode(callSuper = true)
@Data
public class CompanyPageDTO extends BasePageDTO {
private List<String> area;
private List<String> industry;
private String name;
}
@@ -0,0 +1,15 @@
package cn.link56.domain.dto.company;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CompanyPublicDetailDTO {
@NotBlank(message = "公司id不能为空")
private String companyId;
}
@@ -0,0 +1,32 @@
package cn.link56.domain.dto.company;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CompanyUpdateDetailDTO {
@NotBlank(message = "id不能为空")
private String companyId;
@NotBlank(message = "公司名称不能为空")
private String name;
@NotBlank(message = "登录账号不能为空")
private String account;
@NotBlank(message = "登录密码不能为空")
private String password;
@NotBlank(message = "公司邮箱不能为空")
private String email;
private String phone;
private List<String> address;
private List<String> industry;
private String establishedDate;
private String profile;
private String avatar;
private String description;
private String shortName;
}
@@ -0,0 +1,27 @@
package cn.link56.domain.dto.file;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class InsertFileDTO {
@NotBlank(
message = "文件名称不能为空"
)
private String fileName;
@NotBlank(
message = "文件大小不能为空"
)
private String fileSize;
@NotBlank(
message = "文件全路径oss不能为空"
)
private String fileMapName;
}
@@ -0,0 +1,16 @@
package cn.link56.domain.dto.forum.comment;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ForumCommentAddDTO {
private String fatherId;
private String postId;
private String companyId;
private String content;
}
@@ -0,0 +1,30 @@
package cn.link56.domain.dto.forum.post;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class ForumPostAddDTO {
@NotBlank(message = "帖子标题不能为空")
private String title;
@NotBlank(message = "帖子内容不能为空")
private String content;
@NotBlank(message = "帖子摘要不能为空")
private String summary;
private String cover;
private List<String> tags;
@NotBlank(message = "公司id不能为空")
private String companyId;
@NotNull(message = "帖子状态不能为空")
@Min(value = 0, message = "帖子状态无效")
private Integer status;
}
@@ -0,0 +1,13 @@
package cn.link56.domain.dto.forum.post;
import cn.link56.common.BasePageDTO;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
public class ForumPostCompanyPageDTO extends BasePageDTO {
private String companyId;
private String postTitle;
private Integer status;
}
@@ -0,0 +1,15 @@
package cn.link56.domain.dto.forum.post;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class ForumPostDeleteDTO {
@NotBlank(message = "帖子id不能为空")
private String forumPostId;
}
@@ -0,0 +1,16 @@
package cn.link56.domain.dto.forum.post;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class ForumPostDetailDTO {
@NotBlank(message = "帖子id不能为空")
private String forumPostId;
private String companyId;
}
@@ -0,0 +1,10 @@
package cn.link56.domain.dto.forum.post;
import cn.link56.common.BasePageDTO;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
public class ForumPostPublicPageDTO extends BasePageDTO {
}
@@ -0,0 +1,30 @@
package cn.link56.domain.dto.forum.post;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class ForumPostUpdateDTO {
@NotBlank(message = "帖子id不能为空")
private String forumPostId;
@NotBlank(message = "帖子标题不能为空")
private String title;
@NotBlank(message = "帖子内容不能为空")
private String content;
@NotBlank(message = "帖子摘要不能为空")
private String summary;
private String cover;
private List<String> tags;
@NotNull(message = "帖子状态不能为空")
@Min(value = 0, message = "帖子状态无效")
private Integer status;
}
@@ -0,0 +1,15 @@
package cn.link56.domain.dto.im;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ImMessageHistoryDTO {
@NotBlank(message = "聊天者的id不能为空")
private String chatCompanyId;
}
@@ -0,0 +1,15 @@
package cn.link56.domain.dto.im;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotBlank;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ImMessageUpdateIsReadDTO {
@NotBlank(message = "id不能为空")
private String companyId;
}
@@ -0,0 +1,34 @@
package cn.link56.domain.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("im_message")
@Accessors(chain = true) // 添加这一行即可支持链式操作
public class ImMessage {
@TableId(value = "b_id", type = IdType.ASSIGN_UUID)
private String id;
@TableField("b_send_id")
private String sendId;
@TableField("b_accept_id")
private String acceptId;
@TableField("b_content")
private String content;
@TableField("b_content_type")
private String contentType;
@TableField("b_is_read")
private Integer isRead;// 是否已读
@TableField("b_is_rollback")
private Integer isRollback;// 是否撤回
@TableField("b_quote_id")
private String quoteId;// 引用id
@TableField(value = "b_create_time", fill = FieldFill.INSERT)
private String createTime;
}
@@ -0,0 +1,70 @@
package cn.link56.domain.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("sl_company")
@Accessors(chain = true) // 添加这一行即可支持链式操作
public class SlCompany {
@TableId(value = "b_id", type = IdType.ASSIGN_UUID)
private String id;
@TableField("b_name")
private String name;
@TableField("b_account")
private String account;
@TableField("b_email")
private String email;
@TableField("b_password")
private String password;
@TableField("b_profile")
private String profile;
@TableField("b_description")
private String description;
@TableField("b_address")
private String address;
@TableField("b_phone")
private String phone;
@TableField("b_established_date")
private String establishedDate;
@TableField("b_avatar")
private String avatar;
@TableField("b_industry")
private String industry;
@TableField("b_visible")
private String visible;
@TableField("b_right_visible")
private String rightVisible;
@TableField("b_order")
private Integer bOrder;
@TableField("b_color")
private String color;
@TableField("b_shortname")
private String shortName;
@TableField(value = "b_create_time", fill = FieldFill.INSERT)
private String createTime;
@TableField(value = "b_update_time", fill = FieldFill.INSERT_UPDATE)
private String updateTime;
}
@@ -0,0 +1,38 @@
package cn.link56.domain.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("sl_file")
@Accessors(chain = true)
public class SlFile {
@TableId(
value = "b_id",
type = IdType.ASSIGN_UUID
)
private String id;
@TableField("mx_filename")
private String name;
@TableField("mx_filesize")
private String size;
@TableField("mx_fileext")
private String ext;
@TableField("mx_mapfilename")
private String mapName;
@TableField(
value = "b_create_time",
fill = FieldFill.INSERT
)
private String createTime;
@TableField(
value = "b_create_id",
fill = FieldFill.INSERT
)
private String createId;
}
@@ -0,0 +1,29 @@
package cn.link56.domain.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("sl_notification")
@Accessors(chain = true)
public class SlNotification {
@TableId(value = "b_id", type = IdType.ASSIGN_UUID)
private String id;
@TableField("b_send_id")
private String sendId;
@TableField("b_accept_id")
private String acceptId;
@TableField("b_content")
private String content;
@TableField("b_post_id")
private String postId;
@TableField("b_type")
private Integer type;
@TableField(value = "b_create_time", fill = FieldFill.INSERT)
private String createTime;
}
@@ -0,0 +1,20 @@
package cn.link56.domain.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class WebArea {
private String id;
private Integer xh;
private String name;
private String fatherId;
private String canuse;
private String bz;
private String field;
private Integer order;
private String visible;
}
@@ -0,0 +1,32 @@
package cn.link56.domain.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 lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("web_property")
@Accessors(chain = true) // 添加这一行即可支持链式操作
public class WebProperty {
@TableId(value = "b_id", type = IdType.ASSIGN_UUID)
private String id;
@TableField("b_xh")
private Integer xh;
@TableField("b_name")
private String name;
@TableField("b_canuse")
private String canuse;
@TableField("b_bz")
private String bz;
@TableField("b_url")
private String url;
@TableField("b_img")
private String img;
}
@@ -0,0 +1,35 @@
package cn.link56.domain.entity.forum;
import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("forum_post")
@Accessors(chain = true)
public class ForumPost {
@TableId(value = "b_id", type = IdType.ASSIGN_UUID)
private String id;
@TableField("b_title")
private String title;
@TableField("b_content")
private String content;
@TableField("b_cover")
private String cover;
@TableField("b_tags")
private String tags;
@TableField("b_company_id")
private String companyId;
@TableField("b_summary")
private String summary;
@TableField("b_status")
private Integer status;
@TableField(value = "b_create_time", fill = FieldFill.INSERT)
private String createTime;
@TableField(value = "b_update_time", fill = FieldFill.INSERT_UPDATE)
private String updateTime;
}
@@ -0,0 +1,27 @@
package cn.link56.domain.entity.forum;
import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("forum_post_comment")
@Accessors(chain = true)
public class ForumPostComment {
@TableId(value = "b_id", type = IdType.ASSIGN_UUID)
private String id;
@TableField("b_post_id")
private String postId;
@TableField("b_content")
private String content;
@TableField("b_company_id")
private String companyId;
@TableField("b_father_id")
private String fatherId;
@TableField(value = "b_create_time", fill = FieldFill.INSERT)
private String createTime;
}
@@ -0,0 +1,23 @@
package cn.link56.domain.entity.forum;
import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("forum_post_favorite")
@Accessors(chain = true)
public class ForumPostFavorite {
@TableId(value = "b_id", type = IdType.ASSIGN_UUID)
private String id;
@TableField("b_post_id")
private String postId;
@TableField("b_company_id")
private String companyId;
@TableField(value = "b_create_time", fill = FieldFill.INSERT)
private String createTime;
}
@@ -0,0 +1,23 @@
package cn.link56.domain.entity.forum;
import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("forum_post_like")
@Accessors(chain = true)
public class ForumPostLike {
@TableId(value = "b_id", type = IdType.ASSIGN_UUID)
private String id;
@TableField("b_post_id")
private String postId;
@TableField("b_company_id")
private String companyId;
@TableField(value = "b_create_time", fill = FieldFill.INSERT)
private String createTime;
}
@@ -0,0 +1,21 @@
package cn.link56.domain.entity.forum;
import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("forum_post_view")
@Accessors(chain = true)
public class ForumPostView {
@TableId(value = "b_id", type = IdType.ASSIGN_UUID)
private String id;
@TableField("b_post_id")
private String postId;
@TableField(value = "b_create_time", fill = FieldFill.INSERT)
private String createTime;
}
@@ -0,0 +1,12 @@
package cn.link56.domain.im.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ImAcceptCheckOneOnlineDTO {
private String companyId;
}
@@ -0,0 +1,13 @@
package cn.link56.domain.im.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ImAcceptMessageDTO {
private String type;
private Object data;
}
@@ -0,0 +1,16 @@
package cn.link56.domain.im.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ImAcceptOneDTO {
private String sendId;
private String acceptId;
private String content;
private String contentType;
private String quoteId;
}
@@ -0,0 +1,13 @@
package cn.link56.domain.im.dto;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ImAcceptRollbackDTO {
private String messageId;
}
@@ -0,0 +1,13 @@
package cn.link56.domain.im.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ImSendCheckOneOnlineVO {
private String companyId;
private Boolean isOnline;
}
@@ -0,0 +1,13 @@
package cn.link56.domain.im.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ImSendMessageVO {
private String type;
private Object data;
}
@@ -0,0 +1,22 @@
package cn.link56.domain.im.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class ImSendNormalVO {
private String messageId;
private String sendId;
private String sendName;
private String acceptId;
private String messageContent;
private String messageContentType;
private Integer isRollback;// 是否撤回
private String quoteMessageId;// 引用id
private String sendMessageTime;
}
@@ -0,0 +1,14 @@
package cn.link56.domain.im.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ImSendRollbackVO {
private String messageId;
private String sendId;
private String acceptId;
}
@@ -0,0 +1,19 @@
package cn.link56.domain.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true) // 添加这一行即可支持链式操作
public class LoginVO {
private String id;
private String account;
private String name;
private String email;
private String token;
private String avatar;
}
@@ -0,0 +1,18 @@
package cn.link56.domain.vo.aliyun;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class AliyunKeyVO {
private String accessid;
private String policy;
private String signature;
private String dir;
private String host;
private String expire;
private String callback;
}
@@ -0,0 +1,6 @@
package cn.link56.domain.vo.area;
public class AreaCompanyVO {
}
@@ -0,0 +1,18 @@
package cn.link56.domain.vo.area;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class AreaVO {
private String label;
private String value;
private List<AreaVO> children;
}
@@ -0,0 +1,24 @@
package cn.link56.domain.vo.company;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CompanyAreaVO {
private String areaName;
private List<CompanyInfo> companies; // 用于存放该地区的公司信息
// 内部类,用于表示公司信息
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class CompanyInfo {
private String companyId;
private String companyName;
}
}
@@ -0,0 +1,26 @@
package cn.link56.domain.vo.company;
import cn.link56.config.RemoveMillisSerializer;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class CompanyPageVO {
private String companyId;
private List<String> address;
private String avatar;
@JsonSerialize(using = RemoveMillisSerializer.class)
private String establishedDate;
private List<String> industry;
private String name;
private String profile;
}
@@ -0,0 +1,28 @@
package cn.link56.domain.vo.company;
import cn.link56.config.RemoveMillisSerializer;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CompanyPrivateDetailVO {
private String companyId;
private String name;
private String account;
private String password;
private String email;
private String phone;
private List<String> address;
private List<String> industry;
@JsonSerialize(using = RemoveMillisSerializer.class)
private String establishedDate;
private String profile;
private String avatar;
private String description;
private String shortName;
}
@@ -0,0 +1,27 @@
package cn.link56.domain.vo.company;
import cn.link56.config.RemoveMillisSerializer;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CompanyPublicDetailVO {
private String companyId;
private String name;
private String email;
private String phone;
private List<String> address;
private List<String> industry;
@JsonSerialize(using = RemoveMillisSerializer.class)
private String establishedDate;
private String profile;
private String avatar;
private String description;
private String shortName;
}
@@ -0,0 +1,14 @@
package cn.link56.domain.vo.company;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CompanyRecommendRightVO {
private String companyId;
private String name;
private String color;
}
@@ -0,0 +1,26 @@
package cn.link56.domain.vo.company;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CompanyRecommendVO {
private String shengName; // 用于 省 名称
private String shiName; // 用于 市 名称
private List<CompanyInfo> companies; // 用于存放该地区的公司信息
// 内部类,用于表示公司信息
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class CompanyInfo {
private String id; // 公司ID
private String name; // 公司名称
private String color;
}
}
@@ -0,0 +1,15 @@
package cn.link56.domain.vo.forum;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ForumDashboardVO {
private Long postCount;
private Long viewCount;
private Long likeCount;
private Long favoriteCount;
}
@@ -0,0 +1,36 @@
package cn.link56.domain.vo.forum.comment;
import cn.link56.config.RemoveMillisSerializer;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ForumPostCommentVO {
private String commentId;
private String postId;
private String content;
@JsonSerialize(using = RemoveMillisSerializer.class) // 新增序列化器
private String createTime;
private String fatherId;
private Company publishCompany;
private Company replyCompany;
private List<ForumPostCommentVO> children;
// 发布公司对象
@AllArgsConstructor
@NoArgsConstructor
@Data
public static class Company {
private String companyId;
private String name;
private String avatar;
}
}
@@ -0,0 +1,12 @@
package cn.link56.domain.vo.forum.post;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ForumPostAddVO {
private String forumPostId;
}
@@ -0,0 +1,37 @@
package cn.link56.domain.vo.forum.post;
import cn.link56.config.RemoveMillisSerializer;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ForumPostDetailVO {
private String forumPostId;
private String title;
private String content;
private String summary;
private String cover;
private Integer status;
private List<String> tags;
private String tagsString;
@JsonSerialize(using = RemoveMillisSerializer.class)
private String publishTime;
private String companyId;
private String companyName;
private Integer viewCount;
private Integer likeCount;
private Integer favoriteCount;
private Integer commentCount;
private Boolean isLike;
private Boolean isFavorite;
}
@@ -0,0 +1,29 @@
package cn.link56.domain.vo.forum.post;
import cn.link56.config.RemoveMillisSerializer;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ForumPostPageVO {
private String forumPostId;
private String title;
private String summary;
private String cover;
private String tagsString;
private List<String> tags;
@JsonSerialize(using = RemoveMillisSerializer.class)
private String publishTime;
private String companyName;
private Integer viewCount;
private Integer likeCount;
private Integer favoriteCount;
private Integer commentCount;
}
@@ -0,0 +1,19 @@
package cn.link56.domain.vo.forum.post;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ForumPostStatusCountVO {
/** 所有状态的总数 */
private Long all;
/** 草稿状态的数量 */
private Long draft;
/** 正常(已发布)状态的数量 */
private Long normal;
}
@@ -0,0 +1,13 @@
package cn.link56.domain.vo.forum.post.chart;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ForumPostChartNumberVO {
private String label;
private Integer value;
}
@@ -0,0 +1,13 @@
package cn.link56.domain.vo.forum.post.chart;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ForumPostChartTypeVO {
private String label;
private Integer value;
}
@@ -0,0 +1,13 @@
package cn.link56.domain.vo.forum.post.chart;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ForumPostChartViewVO {
private String label;
private Integer value;
}
@@ -0,0 +1,12 @@
package cn.link56.domain.vo.im;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class AllNoReadNumberVO {
private Integer noReadNumber;
}
@@ -0,0 +1,28 @@
package cn.link56.domain.vo.im;
import cn.link56.config.RemoveMillisSerializer;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class ChatCompanyVO {
private String messageId;
@JsonSerialize(using = RemoveMillisSerializer.class)
private String lastMessageTime;
private String companyAvatar;
private String companyId;
private String companyName;
private Integer isRollback;
private Integer noReadNumber;
private String lastContent;
private String lastContentType;
}
@@ -0,0 +1,24 @@
package cn.link56.domain.vo.im;
import cn.link56.config.RemoveMillisSerializer;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class ImMessageHistoryVO {
private String messageId;
private String sendId;
private String acceptId;
private String messageContent;
private String messageContentType;
private Integer isRollback;// 是否撤回
private String quoteMessageId;// 引用id
@JsonSerialize(using = RemoveMillisSerializer.class)
private String sendMessageTime;
}
@@ -0,0 +1,38 @@
package cn.link56.domain.vo.notification;
import cn.link56.config.RemoveMillisSerializer;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class NotificationVO {
private String notificationId;
private String content;
@JsonSerialize(using = RemoveMillisSerializer.class)
private String createTime;
private Integer type;
private Post postDetail;
private Company sendCompany;
@AllArgsConstructor
@NoArgsConstructor
@Data
public static class Company {
private String companyId;
private String name;
private String avatar;
}
@AllArgsConstructor
@NoArgsConstructor
@Data
public static class Post {
private String postId;
private String title;
}
}
@@ -0,0 +1,15 @@
package cn.link56.domain.vo.property;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class WebPropertyVO {
private String label;
private String value;
}
@@ -0,0 +1,27 @@
package cn.link56.enums;
import lombok.Getter;
@Getter
public enum ForumPostStatusEnum {
DRAFT(0, "草稿"),
NORMAL(1, "正常");
private final Integer code;
private final String description;
ForumPostStatusEnum(Integer code, String description) {
this.code = code;
this.description = description;
}
// 根据 code 获取枚举
public static ForumPostStatusEnum fromCode(Integer code) {
for (ForumPostStatusEnum status : ForumPostStatusEnum.values()) {
if (status.code.equals(code)) {
return status;
}
}
return null;
}
}
@@ -0,0 +1,8 @@
package cn.link56.enums;
public enum ImAcceptMessageEnum {
PING,
CHECK_ONE_ONLINE,
ONE,
ROLLBACK
}
@@ -0,0 +1,9 @@
package cn.link56.enums;
public enum ImSendMessageEnum {
CHECK_ONE_ONLINE,
ONE,
ROLLBACK,
PONG,
ERROR
}
@@ -0,0 +1,29 @@
package cn.link56.enums;
import lombok.Getter;
@Getter
public enum NotificationTypeEnum {
SYSTEM(0, "系统"),
LIKE(1, "赞"),
FAVORITE(2,"收藏"),
COMMENT(3, "评论");
private final Integer code; // 将 code 改为 String 类型
private final String description;
NotificationTypeEnum(Integer code, String description) {
this.code = code;
this.description = description;
}
// 根据 code 获取枚举
public static NotificationTypeEnum fromCode(Integer code) {
for (NotificationTypeEnum notification : NotificationTypeEnum.values()) {
if (notification.getCode().equals(code)) { // 使用 String 的 equals 比较
return notification;
}
}
return null;
}
}
@@ -0,0 +1,39 @@
package cn.link56.enums;
import cn.link56.constants.ResponseStatusConstants;
import lombok.AllArgsConstructor;
import lombok.Getter;
@AllArgsConstructor
@Getter
public enum ResponseEnum {
SUCCESS(ResponseStatusConstants.SUCCESS,"请求成功"),
ERROR(ResponseStatusConstants.ERROR,"服务器错误,请联系管理人员"),
AUTH_SUCCESS(ResponseStatusConstants.SUCCESS,"登录成功"),
AUTH_EXPIRE(ResponseStatusConstants.UNAUTHORIZED,"尚未登录或登录已过期,请重新登录"),
AUTH_ACCOUNT_ERROR(ResponseStatusConstants.UNAUTHORIZED,"登录失败,账号或密码有误"),
AUTH_FORGET_ERROR(ResponseStatusConstants.ERROR,"账号或邮箱不存在,请检查"),
AUTH_FORGET_SUCCESS(ResponseStatusConstants.SUCCESS,"密码已成功发送至您的邮箱,请注意查收"),
SAVE_SUCCESS(ResponseStatusConstants.SUCCESS,"保存成功"),
SAVE_ERROR(ResponseStatusConstants.ERROR,"保存失败,请稍后重试!"),
UPDATE_SUCCESS(ResponseStatusConstants.SUCCESS,"更新成功"),
UPDATE_ERROR(ResponseStatusConstants.ERROR,"更新失败,请稍后重试!"),
UPDATE_ACCOUNT_ERROR(ResponseStatusConstants.ERROR,"更新失败,该账号已被注册"),
UPDATE_EMAIL_ERROR(ResponseStatusConstants.ERROR,"更新失败,该邮箱已被注册"),
DELETE_SUCCESS(ResponseStatusConstants.SUCCESS,"删除成功"),
DELETE_ERROR(ResponseStatusConstants.ERROR,"删除失败,请稍后重试!"),
REGISTER_SUCCESS(ResponseStatusConstants.SUCCESS,"注册成功"),
REGISTER_ERROR(ResponseStatusConstants.ERROR,"注册失败"),
REGISTER_ACCOUNT_ERROR(ResponseStatusConstants.ERROR,"注册失败,该账号已被注册"),
REGISTER_EMAIL_ERROR(ResponseStatusConstants.ERROR,"注册失败,该邮箱已被注册"),
RESOURCE_NOT_FOUND(ResponseStatusConstants.NOT_FOUND,"资源不存在");
private final Integer code; //响应码
private final String message; //相应信息
}
@@ -0,0 +1,22 @@
package cn.link56.exception;
import cn.link56.enums.ResponseEnum;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
public class BaseException extends RuntimeException {
private Integer code;
private String message;
public BaseException() {
super();
}
public BaseException(ResponseEnum responseEnum) {
super(responseEnum.getMessage());
this.code = responseEnum.getCode();
this.message = responseEnum.getMessage();
}
}
@@ -0,0 +1,94 @@
package cn.link56.exception;
import cn.link56.common.Result;
import cn.link56.constants.ResponseStatusConstants;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.validation.BindException;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.MissingPathVariableException;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import javax.servlet.http.HttpServletRequest;
import javax.validation.ConstraintViolationException;
import java.util.Objects;
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
/**
* 请求方式不支持
*/
@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
public Result<Void> handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e,
HttpServletRequest request)
{
String requestURI = request.getRequestURI();
String message = "请求地址 '" + requestURI + "' 不支持 '" + e.getMethod() + " ' 请求";
return Result.error(ResponseStatusConstants.BAD_REQUEST,message);
}
/**
* 请求路径中缺少必需的路径变量
*/
@ExceptionHandler(MissingPathVariableException.class)
public Result<Void> handleMissingPathVariableException(MissingPathVariableException e, HttpServletRequest request)
{
return Result.error(ResponseStatusConstants.BAD_REQUEST,String.format("请求路径中缺少必需的路径变量[%s]", e.getVariableName()));
}
/**
* 自定义验证异常
*/
@ExceptionHandler(BindException.class)
public Result<Void> handleBindException(BindException e) {
log.error(e.getMessage(), e);
return Result.error(ResponseStatusConstants.BAD_REQUEST,"自定义校验异常");
}
/**
* 自定义验证异常
*/
@ExceptionHandler(MethodArgumentNotValidException.class)
public Result<Void> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
String message = Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage();
return Result.error(ResponseStatusConstants.BAD_REQUEST,message);
}
/**
* 缺少参数异常
*/
@ExceptionHandler(HttpMessageNotReadableException.class)
public Result<Void> handleHttpMessageNotReadableException(HttpMessageNotReadableException e) {
return Result.error(ResponseStatusConstants.BAD_REQUEST,"缺少请求体:" + e.getMessage());
}
/**
* 缺少参数异常
*/
@ExceptionHandler(MissingServletRequestParameterException.class)
public Result<Void> handleMissingServletRequestParameterException(MissingServletRequestParameterException e) {
return Result.error(ResponseStatusConstants.BAD_REQUEST,"缺少参数:" + e.getMessage());
}
/**
* 缺少参数异常
*/
@ExceptionHandler(ConstraintViolationException.class)
public Result<Void> handleConstraintViolationException(ConstraintViolationException e) {
return Result.error(ResponseStatusConstants.BAD_REQUEST,e.getMessage());
}
/**
* 处理系统异常
*/
@ExceptionHandler(value = Exception.class)
public Result<Void> handleSystemException(Exception e) {
e.printStackTrace();
log.error("捕获到全局异常:{}",e.getMessage());
return Result.error();
}
}
Loaded 100 of 223 files, more files were not shown because too many files have changed in this diff. Show more