diff --git a/code/link56/link56-backend-old/.gitignore b/code/link56/link56-backend-old/.gitignore new file mode 100644 index 00000000..5ff6309b --- /dev/null +++ b/code/link56/link56-backend-old/.gitignore @@ -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 \ No newline at end of file diff --git a/code/link56/link56-backend-old/.idea/.gitignore b/code/link56/link56-backend-old/.idea/.gitignore new file mode 100644 index 00000000..13566b81 --- /dev/null +++ b/code/link56/link56-backend-old/.idea/.gitignore @@ -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 diff --git a/code/link56/link56-backend-old/.idea/encodings.xml b/code/link56/link56-backend-old/.idea/encodings.xml new file mode 100644 index 00000000..aa00ffab --- /dev/null +++ b/code/link56/link56-backend-old/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/code/link56/link56-backend-old/.idea/inspectionProfiles/Project_Default.xml b/code/link56/link56-backend-old/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 00000000..8662c472 --- /dev/null +++ b/code/link56/link56-backend-old/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/code/link56/link56-backend-old/.idea/misc.xml b/code/link56/link56-backend-old/.idea/misc.xml new file mode 100644 index 00000000..132404bc --- /dev/null +++ b/code/link56/link56-backend-old/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/code/link56/link56-backend-old/.idea/uiDesigner.xml b/code/link56/link56-backend-old/.idea/uiDesigner.xml new file mode 100644 index 00000000..2b63946d --- /dev/null +++ b/code/link56/link56-backend-old/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/code/link56/link56-backend-old/.idea/vcs.xml b/code/link56/link56-backend-old/.idea/vcs.xml new file mode 100644 index 00000000..ba43f699 --- /dev/null +++ b/code/link56/link56-backend-old/.idea/vcs.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/code/link56/link56-backend-old/pom.xml b/code/link56/link56-backend-old/pom.xml new file mode 100644 index 00000000..1336e5ab --- /dev/null +++ b/code/link56/link56-backend-old/pom.xml @@ -0,0 +1,225 @@ + + + 4.0.0 + + cn.sslog + link56-backend + 1.0-SNAPSHOT + + + 1.8 + UTF-8 + UTF-8 + 3.1.1 + 2.5.15 + 1.2.23 + 3.10.3 + 1.3.1 + 3.5.10.1 + 3.9.1 + 3.12.0 + + + 9.0.96 + 1.2.13 + 5.3.39 + + + + + + org.springframework.boot + spring-boot-dependencies + ${spring-boot.version} + pom + import + + + + org.springframework + spring-framework-bom + ${spring-framework.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-aop + + + + + org.projectlombok + lombok + + + + + org.springframework.boot + spring-boot-starter-validation + + + + + ch.qos.logback + logback-core + ${logback.version} + + + + ch.qos.logback + logback-classic + ${logback.version} + + + + + org.apache.tomcat.embed + tomcat-embed-core + ${tomcat.version} + + + + org.apache.tomcat.embed + tomcat-embed-el + ${tomcat.version} + + + + org.apache.tomcat.embed + tomcat-embed-websocket + ${tomcat.version} + + + + + com.alibaba + druid-spring-boot-starter + ${druid.version} + + + + + com.auth0 + java-jwt + ${jwt.version} + + + + net.sourceforge.jtds + jtds + ${jtds.version} + + + + com.mysql + mysql-connector-j + 8.0.33 + runtime + + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus.version} + + + + com.baomidou + mybatis-plus-jsqlparser-4.9 + ${mybatis-plus.version} + + + + org.apache.commons + commons-lang3 + ${commons.version} + + + + + org.springframework.boot + spring-boot-starter-websocket + + + + + + org.springframework.boot + spring-boot-starter-mail + + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + + + jar + + + + public + aliyun nexus + https://maven.aliyun.com/repository/public + + true + + + + + + + public + aliyun nexus + https://maven.aliyun.com/repository/public + + true + + + false + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + 2.5.15 + + true + + + + + repackage + + + + + + + \ No newline at end of file diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/SSlogUserApiApplication.java b/code/link56/link56-backend-old/src/main/java/cn/link56/SSlogUserApiApplication.java new file mode 100644 index 00000000..66ff46b1 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/SSlogUserApiApplication.java @@ -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); + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/common/BasePageDTO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/common/BasePageDTO.java new file mode 100644 index 00000000..c453af11 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/common/BasePageDTO.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/common/BasePageVO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/common/BasePageVO.java new file mode 100644 index 00000000..f12bb3b5 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/common/BasePageVO.java @@ -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 { + private long total; + private List record; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/common/Result.java b/code/link56/link56-backend-old/src/main/java/cn/link56/common/Result.java new file mode 100644 index 00000000..4a64c9ea --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/common/Result.java @@ -0,0 +1,53 @@ +package cn.link56.common; + +import cn.link56.constants.ResponseStatusConstants; +import lombok.Data; +import lombok.NonNull; + +@Data +public class Result { + 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 Result success() { + return new Result<>(ResponseStatusConstants.SUCCESS,"请求成功", null); + } + + public static Result success(String message) { + return new Result<>(ResponseStatusConstants.SUCCESS, message, null); + } + + // 成功响应(带数据) + public static Result success(@NonNull T data) { + return new Result<>(ResponseStatusConstants.SUCCESS,"请求成功", data); + } + + // 成功响应(带数据) + public static Result success(@NonNull T data,String message) { + return new Result<>(ResponseStatusConstants.SUCCESS, message, data); + } + + + public static Result error(Integer code,String message){ + return new Result<>(code, message, null); + } + + public static Result error(String message){ + return new Result<>(ResponseStatusConstants.ERROR, message, null); + } + + public static Result error(){ + return new Result<>(ResponseStatusConstants.ERROR, null,null); + } + +} \ No newline at end of file diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/config/AutoFillMetaObjectHandler.java b/code/link56/link56-backend-old/src/main/java/cn/link56/config/AutoFillMetaObjectHandler.java new file mode 100644 index 00000000..c4883654 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/config/AutoFillMetaObjectHandler.java @@ -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); // 使用字符串类型保存 + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/config/IdGeneratorInitializer.java b/code/link56/link56-backend-old/src/main/java/cn/link56/config/IdGeneratorInitializer.java new file mode 100644 index 00000000..b25564dc --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/config/IdGeneratorInitializer.java @@ -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); + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/config/MybatisPlusConfig.java b/code/link56/link56-backend-old/src/main/java/cn/link56/config/MybatisPlusConfig.java new file mode 100644 index 00000000..affe8a97 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/config/MybatisPlusConfig.java @@ -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; + } +} \ No newline at end of file diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/config/RemoveMillisSerializer.java b/code/link56/link56-backend-old/src/main/java/cn/link56/config/RemoveMillisSerializer.java new file mode 100644 index 00000000..ecd208bf --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/config/RemoveMillisSerializer.java @@ -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 { + @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); + } + } +} \ No newline at end of file diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/config/WebCorsConfig.java b/code/link56/link56-backend-old/src/main/java/cn/link56/config/WebCorsConfig.java new file mode 100644 index 00000000..882863ff --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/config/WebCorsConfig.java @@ -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); +// } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/config/WebMvcConfig.java b/code/link56/link56-backend-old/src/main/java/cn/link56/config/WebMvcConfig.java new file mode 100644 index 00000000..75b21088 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/config/WebMvcConfig.java @@ -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/**" + ); + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/config/WebSocketConfig.java b/code/link56/link56-backend-old/src/main/java/cn/link56/config/WebSocketConfig.java new file mode 100644 index 00000000..73a489ea --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/config/WebSocketConfig.java @@ -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(); + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/constants/ResponseStatusConstants.java b/code/link56/link56-backend-old/src/main/java/cn/link56/constants/ResponseStatusConstants.java new file mode 100644 index 00000000..6833dade --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/constants/ResponseStatusConstants.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/context/UserContext.java b/code/link56/link56-backend-old/src/main/java/cn/link56/context/UserContext.java new file mode 100644 index 00000000..fad224fd --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/context/UserContext.java @@ -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 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(); + } + } +} \ No newline at end of file diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/controller/AuthController.java b/code/link56/link56-backend-old/src/main/java/cn/link56/controller/AuthController.java new file mode 100644 index 00000000..f44decc7 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/controller/AuthController.java @@ -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 register(@RequestBody @Validated RegisterDTO registerDTO){ + return authService.register(registerDTO); + } + + @PostMapping("/login") + public Result login(@RequestBody @Validated LoginDTO loginDTO) { + return authService.login(loginDTO); + } + + @PostMapping({"/forget"}) + public Result forget(@RequestBody @Validated ForgetDTO forgetDTO) { + return authService.forget(forgetDTO); + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/controller/FileController.java b/code/link56/link56-backend-old/src/main/java/cn/link56/controller/FileController.java new file mode 100644 index 00000000..a6416dbe --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/controller/FileController.java @@ -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 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 insertFile(@RequestBody @Validated InsertFileDTO insertFileDTO) { + boolean flag = slFileService.insertFile(insertFileDTO); + return flag ? Result.success() : Result.error(); + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/controller/ImMessageController.java b/code/link56/link56-backend-old/src/main/java/cn/link56/controller/ImMessageController.java new file mode 100644 index 00000000..35a00fb4 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/controller/ImMessageController.java @@ -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> getChats(){ + List list = imMessageService.getChats(); + return Result.success(list); + } + + @PostMapping("/history") + public Result> getMessageHistory(@RequestBody @Validated ImMessageHistoryDTO imMessageHistoryDTO){ + List list = imMessageService.getMessageHistory(imMessageHistoryDTO); + return Result.success(list); + } + + @PostMapping("/updateIsRead") + public Result updateIsRead(@RequestBody @Validated ImMessageUpdateIsReadDTO imMessageUpdateIsReadDTO){ + imMessageService.updateIsRead(imMessageUpdateIsReadDTO); + return Result.success(); + } + + @PostMapping("/getAllNoReadNumber") + public Result getAllNoReadNumber(){ + AllNoReadNumberVO allNoReadNumberVO = imMessageService.getAllNoReadNumber(); + return Result.success(allNoReadNumberVO); + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/controller/SlCompanyController.java b/code/link56/link56-backend-old/src/main/java/cn/link56/controller/SlCompanyController.java new file mode 100644 index 00000000..243b1c64 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/controller/SlCompanyController.java @@ -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> getCompanyPage(@RequestBody @Validated CompanyPageDTO companyPageDTO){ + BasePageVO list = slCompanyService.getCompanyPage(companyPageDTO); + return Result.success(list); + } + + @GetMapping("/getPrivateDetail") + public Result getPrivateDetail(){ + CompanyPrivateDetailVO companyPrivateDetailVO = slCompanyService.getPrivateDetail(); + return Result.success(companyPrivateDetailVO); + } + + @PostMapping("/getPublicDetail") + public Result 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 update(@RequestBody @Validated CompanyUpdateDetailDTO companyUpdateDetailDTO){ + return slCompanyService.updateDetail(companyUpdateDetailDTO); + } + + @GetMapping("/getRecommendList") + public Result> getRecommendList(){ + List list = slCompanyService.getRecommendList(); + return Result.success(list); + } + + @GetMapping("/getRecommendRightList") + public Result> getRecommendRightList(){ + List list = slCompanyService.getRecommendRightList(); + return Result.success(list); + } +} + diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/controller/SlNotificationController.java b/code/link56/link56-backend-old/src/main/java/cn/link56/controller/SlNotificationController.java new file mode 100644 index 00000000..0f85e19e --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/controller/SlNotificationController.java @@ -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> likePage(@RequestBody BasePageDTO basePageDTO){ + BasePageVO result = slNotificationService.getLikeFavoritePage(basePageDTO); + return Result.success(result); + } + + @PostMapping("/comment") + public Result> commentPage(@RequestBody BasePageDTO basePageDTO){ + BasePageVO result = slNotificationService.getCommentPage(basePageDTO); + return Result.success(result); + } + + @PostMapping("/delete/{notificationId}") + public Result delete(@PathVariable @NotBlank(message = "通知ID不能为空") String notificationId) { + boolean flag = slNotificationService.removeById(notificationId); + return flag ? Result.success() : Result.error(); + } + + @PostMapping("/likeAndFavorite/deleteAll") + public Result deleteAllLikeAndFavorite() { + boolean deleteFlag = slNotificationService.deleteAllLikeAndFavorite(); + return deleteFlag ? Result.success() : Result.error(); + } + + + @PostMapping("/comment/deleteAll") + public Result deleteAllComment() { + boolean deleteFlag = slNotificationService.deleteAllComment(); + return deleteFlag ? Result.success() : Result.error(); + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/controller/WebAreaController.java b/code/link56/link56-backend-old/src/main/java/cn/link56/controller/WebAreaController.java new file mode 100644 index 00000000..2ea7ffd7 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/controller/WebAreaController.java @@ -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(){ + List result = webAreaService.getList(); + return Result.success(result); + } + +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/controller/WebPropertyController.java b/code/link56/link56-backend-old/src/main/java/cn/link56/controller/WebPropertyController.java new file mode 100644 index 00000000..b432c533 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/controller/WebPropertyController.java @@ -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(){ + List result = webPropertyService.getList(); + return Result.success(result); + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/controller/WebSocketApplication.java b/code/link56/link56-backend-old/src/main/java/cn/link56/controller/WebSocketApplication.java new file mode 100644 index 00000000..7f4f1490 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/controller/WebSocketApplication.java @@ -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> 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 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 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 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 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)); + } + } + } + + +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/controller/forum/ForumPostCommentController.java b/code/link56/link56-backend-old/src/main/java/cn/link56/controller/forum/ForumPostCommentController.java new file mode 100644 index 00000000..cae81d77 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/controller/forum/ForumPostCommentController.java @@ -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 add(@RequestBody @Validated ForumCommentAddDTO forumCommentAddDTO){ + return forumPostCommentService.add(forumCommentAddDTO); + } + + @GetMapping("/list") + public Result> getPostComments(@RequestParam("forumPostId") @NotBlank(message = "帖子ID不能为空") String forumPostId){ + List forumPostCommentVOS = forumPostCommentService.getPostComments(forumPostId); + return Result.success(forumPostCommentVOS); + } + + @PostMapping("/delete/{forumPostCommentId}") + public Result delete(@PathVariable("forumPostCommentId") @NotBlank(message = "帖子ID不能为空") String forumPostCommentId) { + boolean removeFlag = forumPostCommentService.deletePostComment(forumPostCommentId); + return removeFlag ? Result.success() : Result.error(); + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/controller/forum/ForumPostController.java b/code/link56/link56-backend-old/src/main/java/cn/link56/controller/forum/ForumPostController.java new file mode 100644 index 00000000..6958850a --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/controller/forum/ForumPostController.java @@ -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 add(@RequestBody @Validated ForumPostAddDTO forumPostAddDTO){ + return forumPostService.add(forumPostAddDTO); + } + + @PostMapping("/update") + public Result update(@RequestBody @Validated ForumPostUpdateDTO forumPostUpdateDTO){ + return forumPostService.updateDetail(forumPostUpdateDTO); + } + + @PostMapping("/delete") + public Result deleteUserByPost(@RequestBody @Validated ForumPostDeleteDTO forumPostDeleteDTO) { + return forumPostService.delete(forumPostDeleteDTO); + } + + @PostMapping("/page") + public Result> getPostPage(@RequestBody @Validated ForumPostCompanyPageDTO forumPostCompanyPageDTO){ + return forumPostService.getPostPage(forumPostCompanyPageDTO); + } + @GetMapping("/getPostStatusCount") + public Result getPostStatusCount(){ + ForumPostStatusCountVO forumPostStatusCountVO = forumPostService.getPostStatusCount(); + return Result.success(forumPostStatusCountVO); + } + + @PostMapping("/detail") + public Result 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> getRecommendList(){ + List list = forumPostService.getRecommendList(); + return Result.success(list); + } + + @GetMapping("/getHotList") + public Result> getHotList(){ + List list = forumPostService.getHotList(); + return Result.success(list); + } + + @GetMapping("/getDashboardData") + public Result getDashBoardData(){ + ForumDashboardVO forumDashboardVO = forumPostService.getDashBoardData(); + return Result.success(forumDashboardVO); + } + + @GetMapping("/getChartView") + public Result> getChartViewData(){ + List list = forumPostService.getChartViewData(); + return Result.success(list); + } + + @GetMapping("/getChartNumber") + public Result> getChartNumberData(){ + List list = forumPostService.getChartNumberData(); + return Result.success(list); + } + + @GetMapping("/getChartType") + public Result> getChartTypeData(){ + List list = forumPostService.getChartTypeData(); + return Result.success(list); + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/controller/forum/ForumPostFavoriteController.java b/code/link56/link56-backend-old/src/main/java/cn/link56/controller/forum/ForumPostFavoriteController.java new file mode 100644 index 00000000..5efc9964 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/controller/forum/ForumPostFavoriteController.java @@ -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 favorite(@PathVariable @NotBlank(message = "帖子ID不能为空") String postId){ + forumPostFavoriteService.favorite(postId); + return Result.success(); + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/controller/forum/ForumPostLikeController.java b/code/link56/link56-backend-old/src/main/java/cn/link56/controller/forum/ForumPostLikeController.java new file mode 100644 index 00000000..43147182 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/controller/forum/ForumPostLikeController.java @@ -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 like(@PathVariable @NotBlank(message = "帖子ID不能为空") String postId){ + forumPostLikeService.like(postId); + return Result.success(); + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/controller/forum/ForumPostViewController.java b/code/link56/link56-backend-old/src/main/java/cn/link56/controller/forum/ForumPostViewController.java new file mode 100644 index 00000000..d6a23729 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/controller/forum/ForumPostViewController.java @@ -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 view(@PathVariable @NotBlank(message = "帖子ID不能为空") String postId){ + forumPostViewService.view(postId); + return Result.success(); + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/ForgetDTO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/ForgetDTO.java new file mode 100644 index 00000000..79d446de --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/ForgetDTO.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/LoginDTO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/LoginDTO.java new file mode 100644 index 00000000..b93e81f0 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/LoginDTO.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/RegisterDTO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/RegisterDTO.java new file mode 100644 index 00000000..78c9c2ef --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/RegisterDTO.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/company/CompanyPageDTO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/company/CompanyPageDTO.java new file mode 100644 index 00000000..67ce5e45 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/company/CompanyPageDTO.java @@ -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 area; + private List industry; + private String name; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/company/CompanyPublicDetailDTO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/company/CompanyPublicDetailDTO.java new file mode 100644 index 00000000..fa37c8f9 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/company/CompanyPublicDetailDTO.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/company/CompanyUpdateDetailDTO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/company/CompanyUpdateDetailDTO.java new file mode 100644 index 00000000..f2bee61f --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/company/CompanyUpdateDetailDTO.java @@ -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 address; + private List industry; + private String establishedDate; + private String profile; + private String avatar; + private String description; + private String shortName; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/file/InsertFileDTO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/file/InsertFileDTO.java new file mode 100644 index 00000000..0dd2996f --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/file/InsertFileDTO.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/forum/comment/ForumCommentAddDTO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/forum/comment/ForumCommentAddDTO.java new file mode 100644 index 00000000..77cb1021 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/forum/comment/ForumCommentAddDTO.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/forum/post/ForumPostAddDTO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/forum/post/ForumPostAddDTO.java new file mode 100644 index 00000000..73250a83 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/forum/post/ForumPostAddDTO.java @@ -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 tags; + @NotBlank(message = "公司id不能为空") + private String companyId; + + @NotNull(message = "帖子状态不能为空") + @Min(value = 0, message = "帖子状态无效") + private Integer status; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/forum/post/ForumPostCompanyPageDTO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/forum/post/ForumPostCompanyPageDTO.java new file mode 100644 index 00000000..bbe1a928 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/forum/post/ForumPostCompanyPageDTO.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/forum/post/ForumPostDeleteDTO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/forum/post/ForumPostDeleteDTO.java new file mode 100644 index 00000000..562feec2 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/forum/post/ForumPostDeleteDTO.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/forum/post/ForumPostDetailDTO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/forum/post/ForumPostDetailDTO.java new file mode 100644 index 00000000..ef888e8f --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/forum/post/ForumPostDetailDTO.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/forum/post/ForumPostPublicPageDTO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/forum/post/ForumPostPublicPageDTO.java new file mode 100644 index 00000000..1514745c --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/forum/post/ForumPostPublicPageDTO.java @@ -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 { +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/forum/post/ForumPostUpdateDTO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/forum/post/ForumPostUpdateDTO.java new file mode 100644 index 00000000..18b52f4e --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/forum/post/ForumPostUpdateDTO.java @@ -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 tags; + + @NotNull(message = "帖子状态不能为空") + @Min(value = 0, message = "帖子状态无效") + private Integer status; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/im/ImMessageHistoryDTO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/im/ImMessageHistoryDTO.java new file mode 100644 index 00000000..d96459cc --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/im/ImMessageHistoryDTO.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/im/ImMessageUpdateIsReadDTO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/im/ImMessageUpdateIsReadDTO.java new file mode 100644 index 00000000..fb1046ac --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/dto/im/ImMessageUpdateIsReadDTO.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/entity/ImMessage.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/entity/ImMessage.java new file mode 100644 index 00000000..d3e87ece --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/entity/ImMessage.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/entity/SlCompany.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/entity/SlCompany.java new file mode 100644 index 00000000..ff956b02 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/entity/SlCompany.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/entity/SlFile.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/entity/SlFile.java new file mode 100644 index 00000000..f74aba25 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/entity/SlFile.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/entity/SlNotification.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/entity/SlNotification.java new file mode 100644 index 00000000..35c78529 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/entity/SlNotification.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/entity/WebArea.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/entity/WebArea.java new file mode 100644 index 00000000..d2271ce9 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/entity/WebArea.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/entity/WebProperty.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/entity/WebProperty.java new file mode 100644 index 00000000..84c64856 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/entity/WebProperty.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/entity/forum/ForumPost.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/entity/forum/ForumPost.java new file mode 100644 index 00000000..e128c442 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/entity/forum/ForumPost.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/entity/forum/ForumPostComment.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/entity/forum/ForumPostComment.java new file mode 100644 index 00000000..f30e9d40 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/entity/forum/ForumPostComment.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/entity/forum/ForumPostFavorite.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/entity/forum/ForumPostFavorite.java new file mode 100644 index 00000000..87b7f5b2 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/entity/forum/ForumPostFavorite.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/entity/forum/ForumPostLike.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/entity/forum/ForumPostLike.java new file mode 100644 index 00000000..97494263 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/entity/forum/ForumPostLike.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/entity/forum/ForumPostView.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/entity/forum/ForumPostView.java new file mode 100644 index 00000000..54d07b68 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/entity/forum/ForumPostView.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/im/dto/ImAcceptCheckOneOnlineDTO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/im/dto/ImAcceptCheckOneOnlineDTO.java new file mode 100644 index 00000000..962bf314 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/im/dto/ImAcceptCheckOneOnlineDTO.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/im/dto/ImAcceptMessageDTO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/im/dto/ImAcceptMessageDTO.java new file mode 100644 index 00000000..592b482e --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/im/dto/ImAcceptMessageDTO.java @@ -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; +} \ No newline at end of file diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/im/dto/ImAcceptOneDTO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/im/dto/ImAcceptOneDTO.java new file mode 100644 index 00000000..b662645b --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/im/dto/ImAcceptOneDTO.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/im/dto/ImAcceptRollbackDTO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/im/dto/ImAcceptRollbackDTO.java new file mode 100644 index 00000000..5efd3bbe --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/im/dto/ImAcceptRollbackDTO.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/im/vo/ImSendCheckOneOnlineVO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/im/vo/ImSendCheckOneOnlineVO.java new file mode 100644 index 00000000..15cfb7b9 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/im/vo/ImSendCheckOneOnlineVO.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/im/vo/ImSendMessageVO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/im/vo/ImSendMessageVO.java new file mode 100644 index 00000000..c9d6361d --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/im/vo/ImSendMessageVO.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/im/vo/ImSendNormalVO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/im/vo/ImSendNormalVO.java new file mode 100644 index 00000000..2a19c3b8 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/im/vo/ImSendNormalVO.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/im/vo/ImSendRollbackVO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/im/vo/ImSendRollbackVO.java new file mode 100644 index 00000000..a245fe02 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/im/vo/ImSendRollbackVO.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/LoginVO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/LoginVO.java new file mode 100644 index 00000000..cd140d09 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/LoginVO.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/aliyun/AliyunKeyVO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/aliyun/AliyunKeyVO.java new file mode 100644 index 00000000..927f1f5d --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/aliyun/AliyunKeyVO.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/area/AreaCompanyVO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/area/AreaCompanyVO.java new file mode 100644 index 00000000..34f78ba1 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/area/AreaCompanyVO.java @@ -0,0 +1,6 @@ +package cn.link56.domain.vo.area; + + +public class AreaCompanyVO { + +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/area/AreaVO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/area/AreaVO.java new file mode 100644 index 00000000..9f92b91c --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/area/AreaVO.java @@ -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 children; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/company/CompanyAreaVO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/company/CompanyAreaVO.java new file mode 100644 index 00000000..48e56428 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/company/CompanyAreaVO.java @@ -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 companies; // 用于存放该地区的公司信息 + + // 内部类,用于表示公司信息 + @Data + @AllArgsConstructor + @NoArgsConstructor + public static class CompanyInfo { + private String companyId; + private String companyName; + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/company/CompanyPageVO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/company/CompanyPageVO.java new file mode 100644 index 00000000..d609e053 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/company/CompanyPageVO.java @@ -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 address; + private String avatar; + @JsonSerialize(using = RemoveMillisSerializer.class) + private String establishedDate; + private List industry; + private String name; + private String profile; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/company/CompanyPrivateDetailVO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/company/CompanyPrivateDetailVO.java new file mode 100644 index 00000000..2f66eb46 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/company/CompanyPrivateDetailVO.java @@ -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 address; + private List industry; + @JsonSerialize(using = RemoveMillisSerializer.class) + private String establishedDate; + private String profile; + private String avatar; + private String description; + private String shortName; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/company/CompanyPublicDetailVO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/company/CompanyPublicDetailVO.java new file mode 100644 index 00000000..14907299 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/company/CompanyPublicDetailVO.java @@ -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 address; + private List industry; + @JsonSerialize(using = RemoveMillisSerializer.class) + private String establishedDate; + private String profile; + private String avatar; + private String description; + private String shortName; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/company/CompanyRecommendRightVO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/company/CompanyRecommendRightVO.java new file mode 100644 index 00000000..ea0cc962 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/company/CompanyRecommendRightVO.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/company/CompanyRecommendVO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/company/CompanyRecommendVO.java new file mode 100644 index 00000000..2d0a33ab --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/company/CompanyRecommendVO.java @@ -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 companies; // 用于存放该地区的公司信息 + + // 内部类,用于表示公司信息 + @Data + @AllArgsConstructor + @NoArgsConstructor + public static class CompanyInfo { + private String id; // 公司ID + private String name; // 公司名称 + private String color; + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/forum/ForumDashboardVO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/forum/ForumDashboardVO.java new file mode 100644 index 00000000..603bff70 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/forum/ForumDashboardVO.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/forum/comment/ForumPostCommentVO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/forum/comment/ForumPostCommentVO.java new file mode 100644 index 00000000..6bf71708 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/forum/comment/ForumPostCommentVO.java @@ -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 children; + + // 发布公司对象 + @AllArgsConstructor + @NoArgsConstructor + @Data + public static class Company { + private String companyId; + private String name; + private String avatar; + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/forum/post/ForumPostAddVO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/forum/post/ForumPostAddVO.java new file mode 100644 index 00000000..ba7b8694 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/forum/post/ForumPostAddVO.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/forum/post/ForumPostDetailVO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/forum/post/ForumPostDetailVO.java new file mode 100644 index 00000000..895494a4 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/forum/post/ForumPostDetailVO.java @@ -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 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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/forum/post/ForumPostPageVO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/forum/post/ForumPostPageVO.java new file mode 100644 index 00000000..8e765bd9 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/forum/post/ForumPostPageVO.java @@ -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 tags; + @JsonSerialize(using = RemoveMillisSerializer.class) + private String publishTime; + private String companyName; + + private Integer viewCount; + private Integer likeCount; + private Integer favoriteCount; + private Integer commentCount; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/forum/post/ForumPostStatusCountVO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/forum/post/ForumPostStatusCountVO.java new file mode 100644 index 00000000..a72c1aed --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/forum/post/ForumPostStatusCountVO.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/forum/post/chart/ForumPostChartNumberVO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/forum/post/chart/ForumPostChartNumberVO.java new file mode 100644 index 00000000..e32add72 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/forum/post/chart/ForumPostChartNumberVO.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/forum/post/chart/ForumPostChartTypeVO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/forum/post/chart/ForumPostChartTypeVO.java new file mode 100644 index 00000000..712be853 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/forum/post/chart/ForumPostChartTypeVO.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/forum/post/chart/ForumPostChartViewVO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/forum/post/chart/ForumPostChartViewVO.java new file mode 100644 index 00000000..2ef97269 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/forum/post/chart/ForumPostChartViewVO.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/im/AllNoReadNumberVO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/im/AllNoReadNumberVO.java new file mode 100644 index 00000000..f70e38d6 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/im/AllNoReadNumberVO.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/im/ChatCompanyVO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/im/ChatCompanyVO.java new file mode 100644 index 00000000..7cc9fcb9 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/im/ChatCompanyVO.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/im/ImMessageHistoryVO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/im/ImMessageHistoryVO.java new file mode 100644 index 00000000..8260c1ca --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/im/ImMessageHistoryVO.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/notification/NotificationVO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/notification/NotificationVO.java new file mode 100644 index 00000000..13a83006 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/notification/NotificationVO.java @@ -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; + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/property/WebPropertyVO.java b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/property/WebPropertyVO.java new file mode 100644 index 00000000..f1fc2389 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/domain/vo/property/WebPropertyVO.java @@ -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; +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/enums/ForumPostStatusEnum.java b/code/link56/link56-backend-old/src/main/java/cn/link56/enums/ForumPostStatusEnum.java new file mode 100644 index 00000000..1955e0f0 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/enums/ForumPostStatusEnum.java @@ -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; + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/enums/ImAcceptMessageEnum.java b/code/link56/link56-backend-old/src/main/java/cn/link56/enums/ImAcceptMessageEnum.java new file mode 100644 index 00000000..f2df4fa9 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/enums/ImAcceptMessageEnum.java @@ -0,0 +1,8 @@ +package cn.link56.enums; + +public enum ImAcceptMessageEnum { + PING, + CHECK_ONE_ONLINE, + ONE, + ROLLBACK +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/enums/ImSendMessageEnum.java b/code/link56/link56-backend-old/src/main/java/cn/link56/enums/ImSendMessageEnum.java new file mode 100644 index 00000000..aaf08fed --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/enums/ImSendMessageEnum.java @@ -0,0 +1,9 @@ +package cn.link56.enums; + +public enum ImSendMessageEnum { + CHECK_ONE_ONLINE, + ONE, + ROLLBACK, + PONG, + ERROR +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/enums/NotificationTypeEnum.java b/code/link56/link56-backend-old/src/main/java/cn/link56/enums/NotificationTypeEnum.java new file mode 100644 index 00000000..dbf473db --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/enums/NotificationTypeEnum.java @@ -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; + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/enums/ResponseEnum.java b/code/link56/link56-backend-old/src/main/java/cn/link56/enums/ResponseEnum.java new file mode 100644 index 00000000..4cf67174 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/enums/ResponseEnum.java @@ -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; //相应信息 +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/exception/BaseException.java b/code/link56/link56-backend-old/src/main/java/cn/link56/exception/BaseException.java new file mode 100644 index 00000000..ea495f37 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/exception/BaseException.java @@ -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(); + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/exception/GlobalExceptionHandler.java b/code/link56/link56-backend-old/src/main/java/cn/link56/exception/GlobalExceptionHandler.java new file mode 100644 index 00000000..1476adc4 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/exception/GlobalExceptionHandler.java @@ -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 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 handleMissingPathVariableException(MissingPathVariableException e, HttpServletRequest request) + { + return Result.error(ResponseStatusConstants.BAD_REQUEST,String.format("请求路径中缺少必需的路径变量[%s]", e.getVariableName())); + } + + /** + * 自定义验证异常 + */ + @ExceptionHandler(BindException.class) + public Result handleBindException(BindException e) { + log.error(e.getMessage(), e); + return Result.error(ResponseStatusConstants.BAD_REQUEST,"自定义校验异常"); + } + + /** + * 自定义验证异常 + */ + @ExceptionHandler(MethodArgumentNotValidException.class) + public Result handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { + String message = Objects.requireNonNull(e.getBindingResult().getFieldError()).getDefaultMessage(); + return Result.error(ResponseStatusConstants.BAD_REQUEST,message); + } + + /** + * 缺少参数异常 + */ + @ExceptionHandler(HttpMessageNotReadableException.class) + public Result handleHttpMessageNotReadableException(HttpMessageNotReadableException e) { + return Result.error(ResponseStatusConstants.BAD_REQUEST,"缺少请求体:" + e.getMessage()); + } + + /** + * 缺少参数异常 + */ + @ExceptionHandler(MissingServletRequestParameterException.class) + public Result handleMissingServletRequestParameterException(MissingServletRequestParameterException e) { + return Result.error(ResponseStatusConstants.BAD_REQUEST,"缺少参数:" + e.getMessage()); + } + + /** + * 缺少参数异常 + */ + @ExceptionHandler(ConstraintViolationException.class) + public Result handleConstraintViolationException(ConstraintViolationException e) { + return Result.error(ResponseStatusConstants.BAD_REQUEST,e.getMessage()); + } + + /** + * 处理系统异常 + */ + @ExceptionHandler(value = Exception.class) + public Result handleSystemException(Exception e) { + e.printStackTrace(); + log.error("捕获到全局异常:{}",e.getMessage()); + return Result.error(); + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/exception/LoginException.java b/code/link56/link56-backend-old/src/main/java/cn/link56/exception/LoginException.java new file mode 100644 index 00000000..a16ff87b --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/exception/LoginException.java @@ -0,0 +1,5 @@ +package cn.link56.exception; + +public class LoginException extends BaseException{ + +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/interceptor/LoginInterceptor.java b/code/link56/link56-backend-old/src/main/java/cn/link56/interceptor/LoginInterceptor.java new file mode 100644 index 00000000..8378b5c5 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/interceptor/LoginInterceptor.java @@ -0,0 +1,90 @@ +package cn.link56.interceptor; + +import cn.link56.common.Result; +import cn.link56.constants.ResponseStatusConstants; +import cn.link56.context.UserContext; +import cn.link56.utils.JsonUtils; +import cn.link56.utils.JwtUtils; +import com.auth0.jwt.interfaces.Claim; +import org.apache.commons.lang3.StringUtils; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.PrintWriter; +import java.util.Map; + +public class LoginInterceptor implements HandlerInterceptor { + + /*** + * 在请求处理之前进行调用(Controller方法调用之前) + */ + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + //OPTIONS方法是HTTP协议中定义的一种请求方法。它用于在客户端和服务器之间发起一个预检请求(Preflight Request),以确定实际的请求是否被服务器接受。 + String method = request.getMethod(); + if("OPTIONS".equalsIgnoreCase(method)){ + return true; + } + + boolean flag = false; + + try { + String id = request.getHeader("id"); + String token = request.getHeader("Authorization"); + if (token.startsWith("Bearer ")) { + // 去掉 "Bearer " 前缀,获取 token 部分 + token = token.substring(7); // "Bearer ".length() == 7 + // 继续处理 token,例如验证、解码等操作 + } + + if(!StringUtils.isAllEmpty(id,token)){ + // 验证token + JwtUtils.verify(token); + + Map tokenInfo = JwtUtils.getTokenInfo(token); + + Claim claim = tokenInfo.get("id"); + + String tokenId = claim.asString(); + + if(tokenId.equals(id)){ + flag = true; + UserContext.setUserId(id); + } + } + }catch (Exception e){ +// e.printStackTrace(); + } + + if(!flag){ + Result result = Result.error(ResponseStatusConstants.UNAUTHORIZED,"登录过期"); + String jsonString = JsonUtils.toJson(result); + response.setContentType("application/json;charset=utf-8"); + PrintWriter out = response.getWriter(); + out.println(jsonString); + out.flush(); + out.close(); + } + + return flag; + } + + /*** + * 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后) + */ + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { +// System.out.println("执行了拦截器的postHandle方法"); + } + + /*** + * 整个请求结束之后被调用,也就是在DispatchServlet渲染了对应的视图之后执行(主要用于进行资源清理工作) + */ + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { +// UserContext.removeUserContext(); + UserContext.removeUserId(); + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/mapper/ImMessageMapper.java b/code/link56/link56-backend-old/src/main/java/cn/link56/mapper/ImMessageMapper.java new file mode 100644 index 00000000..278ca347 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/mapper/ImMessageMapper.java @@ -0,0 +1,37 @@ +package cn.link56.mapper; + +import cn.link56.domain.entity.ImMessage; +import cn.link56.domain.vo.im.ChatCompanyVO; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface ImMessageMapper extends BaseMapper { + + /** + * 获取用户的聊天列表 + * @param userId 用户ID,用于查询该用户的聊天记录 + * @return 用户的聊天列表,包含每个聊天的公司信息 + */ + List getChats(@Param("userId") String userId); + + /** + * 获取某个聊天的未读消息数量 + * @param sendId 发送者的ID + * @param acceptId 接受者的ID + * @return 未读消息的数量 + */ + int getNoReadNumber(@Param("sendId") String sendId, @Param("acceptId") String acceptId); + + /** + * 获取某个用户所有未读消息的总数 + * @param acceptId 接受者的ID + * @return 所有未读消息的总数 + */ + Integer getAllNoReadNumber(@Param("acceptId") String acceptId); + + +} \ No newline at end of file diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/mapper/SlCompanyMapper.java b/code/link56/link56-backend-old/src/main/java/cn/link56/mapper/SlCompanyMapper.java new file mode 100644 index 00000000..7ea06122 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/mapper/SlCompanyMapper.java @@ -0,0 +1,43 @@ +package cn.link56.mapper; + +import cn.link56.domain.entity.SlCompany; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +@Mapper +public interface SlCompanyMapper extends BaseMapper { + + /** + * 根据账号查找公司 + * @param account 公司账号 + * @return 匹配的公司,如果没有找到返回 null + */ + SlCompany selectByAccount(@Param("account") String account); + + /** + * 根据邮箱查找公司 + * @param email 公司邮箱 + * @return 匹配的公司,如果没有找到返回 null + */ + SlCompany selectByEmail(@Param("email") String email); + + /** + * 查找是否有相同账号但不是当前公司(排除给定的公司ID) + * @param account 公司账号 + * @param companyId 当前公司的ID,用于排除 + * @return 如果存在其他公司使用相同账号,则返回计数(1),否则返回 0 + */ + @Select("SELECT COUNT(1) FROM sl_company WHERE b_account = #{account} AND b_id != #{companyId}") + int selectByAccountExcludeId(@Param("account") String account, @Param("companyId") String companyId); + + /** + * 查找是否有相同邮箱但不是当前公司(排除给定的公司ID) + * @param email 公司邮箱 + * @param companyId 当前公司的ID,用于排除 + * @return 如果存在其他公司使用相同邮箱,则返回计数(1),否则返回 0 + */ + @Select("SELECT COUNT(1) FROM sl_company WHERE b_email = #{email} AND b_id != #{companyId}") + int selectByEmailExcludeId(@Param("email") String email, @Param("companyId") String companyId); +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/mapper/SlFileMapper.java b/code/link56/link56-backend-old/src/main/java/cn/link56/mapper/SlFileMapper.java new file mode 100644 index 00000000..e7faeac5 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/mapper/SlFileMapper.java @@ -0,0 +1,9 @@ +package cn.link56.mapper; + +import cn.link56.domain.entity.SlFile; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface SlFileMapper extends BaseMapper { +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/mapper/SlNotificationMapper.java b/code/link56/link56-backend-old/src/main/java/cn/link56/mapper/SlNotificationMapper.java new file mode 100644 index 00000000..8370fd64 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/mapper/SlNotificationMapper.java @@ -0,0 +1,20 @@ +package cn.link56.mapper; + +import cn.link56.domain.entity.SlNotification; +import cn.link56.domain.vo.notification.NotificationVO; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface SlNotificationMapper extends BaseMapper { + List getLikeFavoritePage(@Param("acceptId") String acceptId, + @Param("startRow") int startRow, + @Param("endRow") int endRow); + + List getCommentPage(@Param("acceptId") String acceptId, + @Param("startRow") int startRow, + @Param("endRow") int endRow); +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/mapper/WebAreaMapper.java b/code/link56/link56-backend-old/src/main/java/cn/link56/mapper/WebAreaMapper.java new file mode 100644 index 00000000..d70fc693 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/mapper/WebAreaMapper.java @@ -0,0 +1,35 @@ +package cn.link56.mapper; + +import cn.link56.domain.entity.WebArea; +import cn.link56.domain.vo.company.CompanyRecommendVO; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface WebAreaMapper { + + /** + * 获取所有省级地区信息 + * @return 省级地区列表 + */ + List getShengAreas(); + + /** + * 获取所有市级地区信息 + * @return 市级地区列表 + */ + List getShiAreas(); + + /** + * 获取所有区县级地区信息 + * @return 区县级地区列表 + */ + List getQuAreas(); + + /** + * 获取所有可见的市级公司推荐列表 + * @return 市级公司推荐列表 + */ + List getShiVisibleList(); +} \ No newline at end of file diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/mapper/WebPropertyMapper.java b/code/link56/link56-backend-old/src/main/java/cn/link56/mapper/WebPropertyMapper.java new file mode 100644 index 00000000..36333471 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/mapper/WebPropertyMapper.java @@ -0,0 +1,21 @@ +package cn.link56.mapper; + +import cn.link56.domain.entity.WebProperty; +import cn.link56.domain.vo.property.WebPropertyVO; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +@Mapper +public interface WebPropertyMapper extends BaseMapper { + + /** + * 获取所有可用的Web属性列表 + * 只查询 `b_canuse = '1'` 的属性 + * @return 包含属性名称和属性值的 WebPropertyVO 列表 + */ + @Select("select b_name as label, b_name as value from web_property where b_canuse = '1'") + List getList(); +} \ No newline at end of file diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/mapper/forum/ForumPostCommentMapper.java b/code/link56/link56-backend-old/src/main/java/cn/link56/mapper/forum/ForumPostCommentMapper.java new file mode 100644 index 00000000..49539de7 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/mapper/forum/ForumPostCommentMapper.java @@ -0,0 +1,36 @@ +package cn.link56.mapper.forum; + +import cn.link56.domain.entity.forum.ForumPostComment; +import cn.link56.domain.entity.SlCompany; +import cn.link56.domain.vo.forum.comment.ForumPostCommentVO; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface ForumPostCommentMapper extends BaseMapper { + + /** + * 获取指定论坛帖子的评论列表 + * @param forumPostId 论坛帖子ID + * @return 评论列表 + */ + List getPostComments(@Param("forumPostId") String forumPostId); + + /** + * 根据评论ID获取关联的公司信息 + * @param commentId 评论ID + * @return 评论的公司信息 + */ + SlCompany getCompanyByCommentId(@Param("commentId") String commentId); + + /** + * 查询所有子评论的ID + * 递归查找指定评论及其所有子评论的ID列表 + * @param rootId 根评论ID + * @return 子评论ID列表 + */ + List getCommentIdsByRootId(@Param("rootId") String rootId); +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/mapper/forum/ForumPostFavoriteMapper.java b/code/link56/link56-backend-old/src/main/java/cn/link56/mapper/forum/ForumPostFavoriteMapper.java new file mode 100644 index 00000000..9ee6715f --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/mapper/forum/ForumPostFavoriteMapper.java @@ -0,0 +1,9 @@ +package cn.link56.mapper.forum; + +import cn.link56.domain.entity.forum.ForumPostFavorite; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ForumPostFavoriteMapper extends BaseMapper { +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/mapper/forum/ForumPostLikeMapper.java b/code/link56/link56-backend-old/src/main/java/cn/link56/mapper/forum/ForumPostLikeMapper.java new file mode 100644 index 00000000..b1a910ff --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/mapper/forum/ForumPostLikeMapper.java @@ -0,0 +1,9 @@ +package cn.link56.mapper.forum; + +import cn.link56.domain.entity.forum.ForumPostLike; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ForumPostLikeMapper extends BaseMapper { +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/mapper/forum/ForumPostMapper.java b/code/link56/link56-backend-old/src/main/java/cn/link56/mapper/forum/ForumPostMapper.java new file mode 100644 index 00000000..9acadc14 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/mapper/forum/ForumPostMapper.java @@ -0,0 +1,74 @@ +package cn.link56.mapper.forum; + +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.chart.ForumPostChartNumberVO; +import cn.link56.domain.vo.forum.post.chart.ForumPostChartViewVO; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; + +@Mapper +public interface ForumPostMapper extends BaseMapper { + + /** + * 分页获取论坛帖子列表 + * @param offset 偏移量,用于分页 + * @param limit 每页显示的帖子数 + * @param companyId 企业ID,用于筛选特定公司的帖子 + * @param postTitle 帖子标题,用于搜索匹配的帖子 + * @return 论坛帖子页面列表 + */ + List getPostPage( + @Param("offset") int offset, + @Param("limit") int limit, + @Param("companyId") String companyId, + @Param("postTitle") String postTitle, + @Param("postStatus") Integer postStatus + ); + + /** + * 获取论坛帖子的总数(根据公司和标题筛选) + * @param companyId 企业ID,用于筛选特定公司的帖子 + * @param postTitle 帖子标题,用于搜索匹配的帖子 + * @return 符合条件的论坛帖子总数 + */ + int countPosts( + @Param("companyId") String companyId, + @Param("postTitle") String postTitle, + @Param("postStatus") Integer postStatus + ); + + /** + * 获取推荐的论坛帖子列表 + * @return 推荐的论坛帖子列表 + */ + List getRecommendList(); + + /** + * 获取热门的论坛帖子列表 + * @return 热门的论坛帖子列表 + */ + List getHotList(); + + /** + * 根据 postId 获取 companyId + * @param postId 帖子ID + * @return 对应的公司ID + */ + @Select("SELECT b_company_id FROM forum_post WHERE b_id = #{postId}") + String getCompanyIdByPostId(@Param("postId") String postId); + + ForumPostDetailVO getPostDetail(@Param("forumPostId")String forumPostId,@Param("loginCompanyId")String loginCompanyId); + + ForumDashboardVO getDashboardCountData(@Param("companyId") String companyId); + + List getChartViewData(@Param("companyId") String companyId); + + List getChartNumberData(@Param("companyId") String companyId); +} \ No newline at end of file diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/mapper/forum/ForumPostViewMapper.java b/code/link56/link56-backend-old/src/main/java/cn/link56/mapper/forum/ForumPostViewMapper.java new file mode 100644 index 00000000..71968541 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/mapper/forum/ForumPostViewMapper.java @@ -0,0 +1,9 @@ +package cn.link56.mapper.forum; + +import cn.link56.domain.entity.forum.ForumPostView; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ForumPostViewMapper extends BaseMapper { +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/service/AuthService.java b/code/link56/link56-backend-old/src/main/java/cn/link56/service/AuthService.java new file mode 100644 index 00000000..4f817b21 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/service/AuthService.java @@ -0,0 +1,15 @@ +package cn.link56.service; + +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; + +public interface AuthService { + Result register(RegisterDTO registerDTO); + + Result login(LoginDTO loginDTO); + + Result forget(ForgetDTO forgetDTO); +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/service/ImMessageService.java b/code/link56/link56-backend-old/src/main/java/cn/link56/service/ImMessageService.java new file mode 100644 index 00000000..6afe61b9 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/service/ImMessageService.java @@ -0,0 +1,27 @@ +package cn.link56.service; + +import cn.link56.domain.dto.im.ImMessageHistoryDTO; +import cn.link56.domain.dto.im.ImMessageUpdateIsReadDTO; +import cn.link56.domain.entity.ImMessage; +import cn.link56.domain.im.dto.ImAcceptOneDTO; +import cn.link56.domain.im.dto.ImAcceptRollbackDTO; +import cn.link56.domain.vo.im.AllNoReadNumberVO; +import cn.link56.domain.vo.im.ChatCompanyVO; +import cn.link56.domain.vo.im.ImMessageHistoryVO; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +public interface ImMessageService extends IService { + List getChats(); + + List getMessageHistory(ImMessageHistoryDTO imMessageHistoryDTO); + + ImMessage insertOne(ImAcceptOneDTO imAcceptOneDTO); + + void updateIsRead(ImMessageUpdateIsReadDTO imMessageUpdateIsReadDTO); + + void updateIsRollback(ImAcceptRollbackDTO imAcceptRollbackDTO); + + AllNoReadNumberVO getAllNoReadNumber(); +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/service/SlCompanyService.java b/code/link56/link56-backend-old/src/main/java/cn/link56/service/SlCompanyService.java new file mode 100644 index 00000000..cd700224 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/service/SlCompanyService.java @@ -0,0 +1,27 @@ +package cn.link56.service; + +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.entity.SlCompany; +import cn.link56.domain.vo.company.*; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +public interface SlCompanyService extends IService { + BasePageVO getCompanyPage(CompanyPageDTO companyPageDTO); + + CompanyPrivateDetailVO getPrivateDetail(); + + Result updateDetail(CompanyUpdateDetailDTO companyUpdateDetailDTO); + + CompanyPublicDetailVO getPublicDetail(CompanyPublicDetailDTO companyPublicDetailDTO); + + List getRecommendList(); + + List getRecommendRightList(); + +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/service/SlFileService.java b/code/link56/link56-backend-old/src/main/java/cn/link56/service/SlFileService.java new file mode 100644 index 00000000..1352b32a --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/service/SlFileService.java @@ -0,0 +1,9 @@ +package cn.link56.service; + +import cn.link56.domain.dto.file.InsertFileDTO; +import cn.link56.domain.entity.SlFile; +import com.baomidou.mybatisplus.extension.service.IService; + +public interface SlFileService extends IService { + boolean insertFile(InsertFileDTO insertFileDTO); +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/service/SlNotificationService.java b/code/link56/link56-backend-old/src/main/java/cn/link56/service/SlNotificationService.java new file mode 100644 index 00000000..954a9a10 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/service/SlNotificationService.java @@ -0,0 +1,17 @@ +package cn.link56.service; + +import cn.link56.common.BasePageDTO; +import cn.link56.common.BasePageVO; +import cn.link56.domain.entity.SlNotification; +import cn.link56.domain.vo.notification.NotificationVO; +import com.baomidou.mybatisplus.extension.service.IService; + +public interface SlNotificationService extends IService { + BasePageVO getLikeFavoritePage(BasePageDTO basePageDTO); + + boolean deleteAllLikeAndFavorite(); + + BasePageVO getCommentPage(BasePageDTO basePageDTO); + + boolean deleteAllComment(); +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/service/WebAreaService.java b/code/link56/link56-backend-old/src/main/java/cn/link56/service/WebAreaService.java new file mode 100644 index 00000000..7df773f8 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/service/WebAreaService.java @@ -0,0 +1,9 @@ +package cn.link56.service; + +import cn.link56.domain.vo.area.AreaVO; + +import java.util.List; + +public interface WebAreaService { + List getList(); +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/service/WebPropertyService.java b/code/link56/link56-backend-old/src/main/java/cn/link56/service/WebPropertyService.java new file mode 100644 index 00000000..fb1abad1 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/service/WebPropertyService.java @@ -0,0 +1,11 @@ +package cn.link56.service; + +import cn.link56.domain.entity.WebProperty; +import cn.link56.domain.vo.property.WebPropertyVO; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +public interface WebPropertyService extends IService { + List getList(); +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/service/forum/ForumPostCommentService.java b/code/link56/link56-backend-old/src/main/java/cn/link56/service/forum/ForumPostCommentService.java new file mode 100644 index 00000000..bc4889bd --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/service/forum/ForumPostCommentService.java @@ -0,0 +1,17 @@ +package cn.link56.service.forum; + +import cn.link56.common.Result; +import cn.link56.domain.dto.forum.comment.ForumCommentAddDTO; +import cn.link56.domain.entity.forum.ForumPostComment; +import cn.link56.domain.vo.forum.comment.ForumPostCommentVO; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +public interface ForumPostCommentService extends IService { + Result add(ForumCommentAddDTO forumCommentAddDTO); + + List getPostComments(String forumPostId); + + boolean deletePostComment(String forumPostCommentId); +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/service/forum/ForumPostFavoriteService.java b/code/link56/link56-backend-old/src/main/java/cn/link56/service/forum/ForumPostFavoriteService.java new file mode 100644 index 00000000..71439623 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/service/forum/ForumPostFavoriteService.java @@ -0,0 +1,8 @@ +package cn.link56.service.forum; + +import cn.link56.domain.entity.forum.ForumPostFavorite; +import com.baomidou.mybatisplus.extension.service.IService; + +public interface ForumPostFavoriteService extends IService { + void favorite(String postId); +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/service/forum/ForumPostLikeService.java b/code/link56/link56-backend-old/src/main/java/cn/link56/service/forum/ForumPostLikeService.java new file mode 100644 index 00000000..23d25347 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/service/forum/ForumPostLikeService.java @@ -0,0 +1,8 @@ +package cn.link56.service.forum; + +import cn.link56.domain.entity.forum.ForumPostLike; +import com.baomidou.mybatisplus.extension.service.IService; + +public interface ForumPostLikeService extends IService { + void like(String postId); +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/service/forum/ForumPostService.java b/code/link56/link56-backend-old/src/main/java/cn/link56/service/forum/ForumPostService.java new file mode 100644 index 00000000..d8ad61e5 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/service/forum/ForumPostService.java @@ -0,0 +1,42 @@ +package cn.link56.service.forum; + +import cn.link56.common.BasePageVO; +import cn.link56.common.Result; +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 com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +public interface ForumPostService extends IService { + Result add(ForumPostAddDTO forumPostAddDTO); + + Result updateDetail(ForumPostUpdateDTO forumPostUpdateDTO); + + Result delete(ForumPostDeleteDTO forumPostDeleteDTO); + + Result> getPostPage(ForumPostCompanyPageDTO forumPostCompanyPageDTO); + + ForumPostDetailVO getDetail(ForumPostDetailDTO forumPostDetailDTO); + + List getRecommendList(); + + List getHotList(); + + ForumPostStatusCountVO getPostStatusCount(); + + ForumDashboardVO getDashBoardData(); + + List getChartViewData(); + + List getChartNumberData(); + + List getChartTypeData(); +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/service/forum/ForumPostViewService.java b/code/link56/link56-backend-old/src/main/java/cn/link56/service/forum/ForumPostViewService.java new file mode 100644 index 00000000..8f62ac86 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/service/forum/ForumPostViewService.java @@ -0,0 +1,8 @@ +package cn.link56.service.forum; + +import cn.link56.domain.entity.forum.ForumPostView; +import com.baomidou.mybatisplus.extension.service.IService; + +public interface ForumPostViewService extends IService { + void view(String postId); +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/service/forum/impl/ForumPostCommentServiceImpl.java b/code/link56/link56-backend-old/src/main/java/cn/link56/service/forum/impl/ForumPostCommentServiceImpl.java new file mode 100644 index 00000000..c4da7662 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/service/forum/impl/ForumPostCommentServiceImpl.java @@ -0,0 +1,187 @@ +package cn.link56.service.forum.impl; + +import cn.link56.common.Result; +import cn.link56.domain.dto.forum.comment.ForumCommentAddDTO; +import cn.link56.domain.entity.SlNotification; +import cn.link56.domain.entity.forum.ForumPost; +import cn.link56.domain.entity.forum.ForumPostComment; +import cn.link56.domain.entity.SlCompany; +import cn.link56.domain.vo.forum.comment.ForumPostCommentVO; +import cn.link56.enums.NotificationTypeEnum; +import cn.link56.mapper.SlNotificationMapper; +import cn.link56.mapper.forum.ForumPostCommentMapper; +import cn.link56.mapper.SlCompanyMapper; +import cn.link56.mapper.forum.ForumPostMapper; +import cn.link56.service.forum.ForumPostCommentService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.*; + +@Service +public class ForumPostCommentServiceImpl extends ServiceImpl implements ForumPostCommentService { + @Resource + private ForumPostCommentMapper forumPostCommentMapper; + @Resource + private SlCompanyMapper slCompanyMapper; + @Resource + private ForumPostMapper forumPostMapper; + @Autowired + private SlNotificationMapper slNotificationMapper; + + @Override + public Result add(ForumCommentAddDTO forumCommentAddDTO) { + ForumPostComment forumPostComment = new ForumPostComment(); + + BeanUtils.copyProperties(forumCommentAddDTO, forumPostComment); + + String fatherId = forumPostComment.getFatherId(); + + if(StringUtils.isEmpty(fatherId)){ + forumPostComment.setFatherId(""); + } + + boolean flag = forumPostCommentMapper.insert(forumPostComment) > 0; + + + if(!flag){ + return Result.error("评论失败,请刷新后重试!"); + } + + ForumPostCommentVO forumPostCommentVO = new ForumPostCommentVO(); + BeanUtils.copyProperties(forumPostComment,forumPostCommentVO); + forumPostCommentVO.setCommentId(forumPostComment.getId()); + + // 发布人 + SlCompany publishCompany = slCompanyMapper.selectById(forumPostComment.getCompanyId()); + forumPostCommentVO.setPublishCompany(new ForumPostCommentVO.Company(publishCompany.getId(),publishCompany.getName(),publishCompany.getAvatar())); + + if(!StringUtils.isEmpty(fatherId)){ + SlCompany replyCompany = forumPostCommentMapper.getCompanyByCommentId(fatherId); + forumPostCommentVO.setReplyCompany(new ForumPostCommentVO.Company(replyCompany.getId(),replyCompany.getName(),replyCompany.getAvatar())); + } + + handleAddCommentNotification(forumPostCommentVO); + + return Result.success(forumPostCommentVO,"评论成功"); + } + public List getPostComments(String forumPostId) { + // 1. 查询所有评论 + List list = forumPostCommentMapper.getPostComments(forumPostId); + + // 2. 构建扁平化树形结构(所有子评论提升到根评论层级) + List rootComments = new ArrayList<>(); + Map commentMap = new HashMap<>(); + + // 2.1 初始化映射并收集根评论 + for (ForumPostCommentVO comment : list) { + commentMap.put(comment.getCommentId(), comment); + if (StringUtils.isBlank(comment.getFatherId())) { + rootComments.add(comment); + comment.setChildren(new ArrayList<>()); // 提前初始化children + } + } + + // 2.2 遍历所有评论,将子评论挂到根祖先的children中 + for (ForumPostCommentVO comment : list) { + if (StringUtils.isBlank(comment.getFatherId())) { + continue; // 跳过根评论 + } + + // 查找当前评论的根祖先(追溯到没有fatherId的祖先) + ForumPostCommentVO rootAncestor = null; + String currentFatherId = comment.getFatherId(); + while (true) { + ForumPostCommentVO parent = commentMap.get(currentFatherId); + if (parent == null) break; // 父节点不存在,终止循环 + + if (StringUtils.isBlank(parent.getFatherId())) { + rootAncestor = parent; // 找到根祖先 + break; + } else { + currentFatherId = parent.getFatherId(); // 继续向上查找 + } + } + + // 挂载到根祖先的children中 + if (rootAncestor != null && rootAncestor.getChildren() != null) { + rootAncestor.getChildren().add(comment); + } + } + + // 3. 按原始顺序排序(可选) + rootComments.forEach(root -> { + if (root.getChildren() != null) { + // 根据需求排序,例如按创建时间升序 + root.getChildren().sort(Comparator.comparing(ForumPostCommentVO::getCreateTime)); + } + }); + + return rootComments; + } + + @Override + @Transactional + public boolean deletePostComment(String forumPostCommentId) { + ForumPostComment forumPostComment = forumPostCommentMapper.selectById(forumPostCommentId); + if (forumPostComment == null) { + return false; + } + + String fatherId = forumPostComment.getFatherId(); + + if (StringUtils.isBlank(fatherId)) { + // 父评论,需要递归删除自己和子评论 + List commentIdsByRootId = forumPostCommentMapper.getCommentIdsByRootId(forumPostCommentId); + return forumPostCommentMapper.deleteByIds(commentIdsByRootId) > 0; + } else { + // 子评论,直接删自己 + return forumPostCommentMapper.deleteById(forumPostCommentId) > 0; + } + } + @Async + public void handleAddCommentNotification(ForumPostCommentVO forumPostCommentVO){ + String postId = forumPostCommentVO.getPostId(); + ForumPost forumPost = forumPostMapper.selectById(postId); + String postCompanyId = forumPost.getCompanyId(); + + ForumPostCommentVO.Company publishCompany = forumPostCommentVO.getPublishCompany(); + String publishCompanyId = publishCompany.getCompanyId(); + + ForumPostCommentVO.Company replyCompany = forumPostCommentVO.getReplyCompany(); + String replyCompanyId = replyCompany != null ? replyCompany.getCompanyId() : null; // 防止为空 + + // 如果是根节点,通知帖子作者 + if (StringUtils.isEmpty(forumPostCommentVO.getFatherId())) { + // 如果发布评论的人,并不是帖子作者本人才通知 + if (!postCompanyId.equals(publishCompanyId)) { + SlNotification slNotification = new SlNotification(); + slNotification + .setPostId(postId) + .setSendId(publishCompanyId) + .setAcceptId(postCompanyId) + .setType(NotificationTypeEnum.COMMENT.getCode()) + .setContent(forumPostCommentVO.getContent()); + slNotificationMapper.insert(slNotification); + } + } + + // 如果不是根节点,通知接受者即可 + if (replyCompanyId != null && !replyCompanyId.equals(publishCompanyId)) { + SlNotification slNotification = new SlNotification(); + slNotification + .setPostId(postId) + .setSendId(publishCompanyId) + .setAcceptId(replyCompanyId) + .setType(NotificationTypeEnum.COMMENT.getCode()) + .setContent(forumPostCommentVO.getContent()); + slNotificationMapper.insert(slNotification); + } + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/service/forum/impl/ForumPostFavoriteServiceImpl.java b/code/link56/link56-backend-old/src/main/java/cn/link56/service/forum/impl/ForumPostFavoriteServiceImpl.java new file mode 100644 index 00000000..010e5f9e --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/service/forum/impl/ForumPostFavoriteServiceImpl.java @@ -0,0 +1,73 @@ +package cn.link56.service.forum.impl; + +import cn.link56.context.UserContext; +import cn.link56.domain.entity.SlNotification; +import cn.link56.domain.entity.forum.ForumPost; +import cn.link56.domain.entity.forum.ForumPostFavorite; +import cn.link56.enums.NotificationTypeEnum; +import cn.link56.mapper.SlNotificationMapper; +import cn.link56.mapper.forum.ForumPostFavoriteMapper; +import cn.link56.mapper.forum.ForumPostMapper; +import cn.link56.service.forum.ForumPostFavoriteService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +@Service +public class ForumPostFavoriteServiceImpl extends ServiceImpl implements ForumPostFavoriteService { + @Resource + private ForumPostFavoriteMapper forumPostFavoriteMapper; + @Resource + private SlNotificationMapper slNotificationMapper; + @Resource + private ForumPostMapper forumPostMapper; + @Override + public void favorite(String postId) { + String companyId = UserContext.getUserId(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ForumPostFavorite::getPostId,postId) + .eq(ForumPostFavorite::getCompanyId,companyId); + + List forumPostFavorites = forumPostFavoriteMapper.selectList(queryWrapper); + + if(forumPostFavorites.isEmpty()){ + handleFavorite(postId,companyId); + } else { + handleUnFavorite(forumPostFavorites); + } + } + private void handleFavorite(String postId,String companyId){ + ForumPostFavorite forumPostFavorite = new ForumPostFavorite(); + forumPostFavorite.setPostId(postId) + .setCompanyId(companyId); + + boolean insertFlag = forumPostFavoriteMapper.insert(forumPostFavorite) > 0; + + if(insertFlag){ + ForumPost forumPost = forumPostMapper.selectById(postId); + if(!forumPost.getCompanyId().equals(companyId)){ + SlNotification slNotification = new SlNotification(); + + slNotification.setPostId(postId) + .setSendId(companyId) + .setType(NotificationTypeEnum.FAVORITE.getCode()) + .setAcceptId(forumPostMapper.getCompanyIdByPostId(postId)); + + slNotificationMapper.insert(slNotification); + } + } + } + + private void handleUnFavorite(List forumPostFavorites) { + // 收集所有的 id + List idsToDelete = forumPostFavorites.stream() + .map(ForumPostFavorite::getId) // 获取每个 ForumPostLike 的 id + .collect(Collectors.toList()); // 收集到一个 List + + forumPostFavoriteMapper.deleteByIds(idsToDelete); + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/service/forum/impl/ForumPostLikeServiceImpl.java b/code/link56/link56-backend-old/src/main/java/cn/link56/service/forum/impl/ForumPostLikeServiceImpl.java new file mode 100644 index 00000000..ef95608c --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/service/forum/impl/ForumPostLikeServiceImpl.java @@ -0,0 +1,74 @@ +package cn.link56.service.forum.impl; + +import cn.link56.context.UserContext; +import cn.link56.domain.entity.SlNotification; +import cn.link56.domain.entity.forum.ForumPost; +import cn.link56.domain.entity.forum.ForumPostLike; +import cn.link56.enums.NotificationTypeEnum; +import cn.link56.mapper.SlNotificationMapper; +import cn.link56.mapper.forum.ForumPostLikeMapper; +import cn.link56.mapper.forum.ForumPostMapper; +import cn.link56.service.forum.ForumPostLikeService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; +import java.util.stream.Collectors; + +@Service +public class ForumPostLikeServiceImpl extends ServiceImpl implements ForumPostLikeService { + @Resource + private ForumPostLikeMapper forumPostLikeMapper; + @Resource + private SlNotificationMapper slNotificationMapper; + @Resource + private ForumPostMapper forumPostMapper; + @Override + public void like(String postId) { + String companyId = UserContext.getUserId(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ForumPostLike::getPostId,postId) + .eq(ForumPostLike::getCompanyId,companyId); + + List forumPostLikes = forumPostLikeMapper.selectList(queryWrapper); + + if(forumPostLikes.isEmpty()){ + handleLike(postId,companyId); + } else { + handleUnLike(forumPostLikes); + } + } + + private void handleLike(String postId,String companyId){ + ForumPostLike forumPostLike = new ForumPostLike(); + ForumPost forumPost = forumPostMapper.selectById(postId); + forumPostLike.setPostId(postId) + .setCompanyId(companyId); + + boolean insertFlag = forumPostLikeMapper.insert(forumPostLike) > 0; + + if(insertFlag){ + if(!forumPost.getCompanyId().equals(companyId)){ + SlNotification slNotification = new SlNotification(); + + slNotification.setPostId(postId) + .setSendId(companyId) + .setType(NotificationTypeEnum.LIKE.getCode()) + .setAcceptId(forumPostMapper.getCompanyIdByPostId(postId)); + + slNotificationMapper.insert(slNotification); + } + } + } + + private void handleUnLike(List forumPostLikes) { + // 收集所有的 id + List idsToDelete = forumPostLikes.stream() + .map(ForumPostLike::getId) // 获取每个 ForumPostLike 的 id + .collect(Collectors.toList()); // 收集到一个 List + + forumPostLikeMapper.deleteByIds(idsToDelete); + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/service/forum/impl/ForumPostServiceImpl.java b/code/link56/link56-backend-old/src/main/java/cn/link56/service/forum/impl/ForumPostServiceImpl.java new file mode 100644 index 00000000..d1ac5638 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/service/forum/impl/ForumPostServiceImpl.java @@ -0,0 +1,286 @@ +package cn.link56.service.forum.impl; + +import cn.link56.common.BasePageVO; +import cn.link56.common.Result; +import cn.link56.context.UserContext; +import cn.link56.domain.dto.forum.post.*; +import cn.link56.domain.entity.forum.ForumPost; +import cn.link56.domain.entity.forum.ForumPostComment; +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.domain.vo.property.WebPropertyVO; +import cn.link56.enums.ForumPostStatusEnum; +import cn.link56.mapper.WebPropertyMapper; +import cn.link56.mapper.forum.ForumPostCommentMapper; +import cn.link56.mapper.forum.ForumPostMapper; +import cn.link56.service.forum.ForumPostService; +import cn.link56.utils.ConvertUtils; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.time.LocalDate; +import java.util.*; +import java.util.stream.Collectors; + +@Service +public class ForumPostServiceImpl extends ServiceImpl implements ForumPostService { + @Resource + private ForumPostMapper forumPostMapper; + @Resource + private ForumPostCommentMapper forumPostCommentMapper; + @Resource + private WebPropertyMapper webPropertyMapper; + + @Override + public Result add(ForumPostAddDTO forumPostAddDTO) { + + ForumPost forumPost = new ForumPost(); + BeanUtils.copyProperties(forumPostAddDTO,forumPost); + forumPost.setTags(ConvertUtils.formatTags(forumPostAddDTO.getTags())); + + boolean flag = forumPostMapper.insert(forumPost) > 0; + + if(flag){ + return Result.success(transDetailVO(forumPost)); + } + + return Result.error(); + } + + @Override + public Result updateDetail(ForumPostUpdateDTO forumPostUpdateDTO) { + String forumPostId = forumPostUpdateDTO.getForumPostId(); + ForumPost forumPost = new ForumPost(); + + BeanUtils.copyProperties(forumPostUpdateDTO,forumPost); + + forumPost.setId(forumPostId); + forumPost.setTags(ConvertUtils.formatTags(forumPostUpdateDTO.getTags())); + + return forumPostMapper.updateById(forumPost) > 0 ? Result.success(transDetailVO(forumPost)) : Result.error(); + } + + @Override + @Transactional + public Result delete(ForumPostDeleteDTO forumPostDeleteDTO) { + String forumPostId = forumPostDeleteDTO.getForumPostId(); + + // 查询帖子是否存在 + ForumPost forumPost = forumPostMapper.selectById(forumPostId); + if (forumPost == null) { + // 帖子不存在,返回成功 + return Result.success(); + } + + // 删除与该帖子相关的评论 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ForumPostComment::getPostId, forumPostId); + List forumPostComments = forumPostCommentMapper.selectList(queryWrapper); + + // 如果有评论,删除评论 + if (!forumPostComments.isEmpty()) { + List commentIds = forumPostComments.stream() + .map(ForumPostComment::getId) + .collect(Collectors.toList()); + + forumPostCommentMapper.delete(new LambdaQueryWrapper().in(ForumPostComment::getId, commentIds)); + } + + // 删除帖子 + boolean deleteFlag = forumPostMapper.deleteById(forumPostId) > 0; + + // 根据删除结果返回 + return deleteFlag ? Result.success() : Result.error(); + } + + @Override + public Result> getPostPage(ForumPostCompanyPageDTO dto) { + String companyId = dto.getCompanyId(); + String postTitle = dto.getPostTitle(); + Integer status = dto.getStatus(); + + int page = dto.getPage(); + int size = dto.getPageSize(); + int offset = (page - 1) * size + 1; + int limit = page * size; + + List list = forumPostMapper.getPostPage(offset, limit, companyId,postTitle,status); + int total = forumPostMapper.countPosts(companyId,postTitle,status); + list.forEach(item -> { + item.setTags(ConvertUtils.parseTags(item.getTagsString())); + }); + BasePageVO result = new BasePageVO<>(); + result.setRecord(list); + result.setTotal(total); + + return Result.success(result); + } + + @Override + public ForumPostDetailVO getDetail(ForumPostDetailDTO forumPostDetailDTO) { + ForumPostDetailVO postDetail = forumPostMapper.getPostDetail(forumPostDetailDTO.getForumPostId(), forumPostDetailDTO.getCompanyId()); + postDetail.setTags(ConvertUtils.parseTags(postDetail.getTagsString())); + if(ObjectUtils.isEmpty(postDetail.getIsFavorite())){ + postDetail.setIsFavorite(false); + } + if(ObjectUtils.isEmpty(postDetail.getIsLike())){ + postDetail.setIsLike(false); + } + return postDetail; + } + + @Override + public List getRecommendList() { + return forumPostMapper.getRecommendList(); + } + + @Override + public List getHotList() { + return forumPostMapper.getHotList(); + } + + @Override + public ForumPostStatusCountVO getPostStatusCount() { + String companyId = UserContext.getUserId(); + + // 全部 + LambdaQueryWrapper allWrapper = new LambdaQueryWrapper<>(); + allWrapper.eq(ForumPost::getCompanyId, companyId); + Long all = forumPostMapper.selectCount(allWrapper); + + // 草稿 + LambdaQueryWrapper draftWrapper = new LambdaQueryWrapper<>(); + draftWrapper.eq(ForumPost::getCompanyId, companyId) + .eq(ForumPost::getStatus, ForumPostStatusEnum.DRAFT.getCode()); + Long draft = forumPostMapper.selectCount(draftWrapper); + + // 正常 + LambdaQueryWrapper normalWrapper = new LambdaQueryWrapper<>(); + normalWrapper.eq(ForumPost::getCompanyId, companyId) + .eq(ForumPost::getStatus, ForumPostStatusEnum.NORMAL.getCode()); + Long normal = forumPostMapper.selectCount(normalWrapper); + + ForumPostStatusCountVO vo = new ForumPostStatusCountVO(); + vo.setAll(all); + vo.setDraft(draft); + vo.setNormal(normal); + return vo; + } + + @Override + public ForumDashboardVO getDashBoardData() { + String companyId = UserContext.getUserId(); + + return forumPostMapper.getDashboardCountData(companyId); + } + + @Override + public List getChartViewData() { + String companyId = UserContext.getUserId(); + + List list = forumPostMapper.getChartViewData(companyId); + + Map map = list.stream() + .collect(Collectors.toMap(ForumPostChartViewVO::getLabel, ForumPostChartViewVO::getValue)); + + List resData = new ArrayList<>(); + for (int i = 6; i >= 0; i--) { + String date = LocalDate.now().minusDays(i).toString(); // yyyy-MM-dd + resData.add(new ForumPostChartViewVO(date, map.getOrDefault(date, 0))); + } + + return resData; + } + + @Override + public List getChartNumberData() { + String companyId = UserContext.getUserId(); + List list = forumPostMapper.getChartNumberData(companyId); + + Map map = list.stream() + .collect(Collectors.toMap(ForumPostChartNumberVO::getLabel, ForumPostChartNumberVO::getValue)); + + List resData = new ArrayList<>(); + for (int i = 6; i >= 0; i--) { + String date = LocalDate.now().minusDays(i).toString(); // yyyy-MM-dd + resData.add(new ForumPostChartNumberVO(date, map.getOrDefault(date, 0))); + } + + return resData; + } + + @Override + public List getChartTypeData() { + String companyId = UserContext.getUserId(); + + // 查询符合条件的论坛帖子 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ForumPost::getCompanyId, companyId) + .eq(ForumPost::getStatus, ForumPostStatusEnum.NORMAL.getCode()); + List forumPosts = forumPostMapper.selectList(queryWrapper); + + // 获取 WebProperty 的列表 + List list = webPropertyMapper.getList(); + List propertys = list.stream() + .map(WebPropertyVO::getValue) + .collect(Collectors.toList()); + + // 用来存储结果的列表,使用 Map 存储标签及其对应的总值 + Map tagCountMap = new HashMap<>(); + + // 遍历论坛帖子 + forumPosts.forEach(item -> { + String tags = item.getTags(); // 获取标签字符串 + if (StringUtils.isNotEmpty(tags)) { + // 将 tags 字符串拆分成标签列表 + List tagArray = ConvertUtils.parseTags(tags); + + // 检查每个标签是否在 propertys 中 + for (String tag : tagArray) { + if (propertys.contains(tag.trim())) { + // 累加标签的计数值 + tagCountMap.put(tag.trim(), tagCountMap.getOrDefault(tag.trim(), 0) + 1); + } + } + } + }); + + // 将 Map 转换为 ForumPostChartTypeVO 列表 + List chartData = tagCountMap.entrySet().stream() + .map(entry -> { + ForumPostChartTypeVO chartTypeVO = new ForumPostChartTypeVO(); + chartTypeVO.setLabel(entry.getKey()); + chartTypeVO.setValue(entry.getValue()); + return chartTypeVO; + }) + .collect(Collectors.toList()); + + return chartData; // 返回最终的列表 + } + + + + public ForumPostDetailVO transDetailVO(ForumPost forumPost) { + if (forumPost == null) { + return null; + } + + ForumPostDetailVO vo = new ForumPostDetailVO(); + BeanUtils.copyProperties(forumPost, vo); + vo.setForumPostId(forumPost.getId()); + vo.setTags(ConvertUtils.parseTags(forumPost.getTags())); + vo.setPublishTime(forumPost.getUpdateTime()); + return vo; + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/service/forum/impl/ForumPostViewServiceImpl.java b/code/link56/link56-backend-old/src/main/java/cn/link56/service/forum/impl/ForumPostViewServiceImpl.java new file mode 100644 index 00000000..751012cb --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/service/forum/impl/ForumPostViewServiceImpl.java @@ -0,0 +1,24 @@ +package cn.link56.service.forum.impl; + +import cn.link56.domain.entity.forum.ForumPostView; +import cn.link56.mapper.forum.ForumPostViewMapper; +import cn.link56.service.forum.ForumPostViewService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +@Service +public class ForumPostViewServiceImpl extends ServiceImpl implements ForumPostViewService { + @Resource + private ForumPostViewMapper forumPostViewMapper; + + @Override + @Async + public void view(String postId) { + ForumPostView forumPostView = new ForumPostView(); + forumPostView.setPostId(postId); + forumPostViewMapper.insert(forumPostView); + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/service/impl/AuthServiceImpl.java b/code/link56/link56-backend-old/src/main/java/cn/link56/service/impl/AuthServiceImpl.java new file mode 100644 index 00000000..43e7ac0e --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/service/impl/AuthServiceImpl.java @@ -0,0 +1,108 @@ +package cn.link56.service.impl; + +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.entity.SlCompany; +import cn.link56.domain.vo.LoginVO; +import cn.link56.mapper.SlCompanyMapper; +import cn.link56.service.AuthService; +import cn.link56.utils.EmailUtils; +import cn.link56.utils.JwtUtils; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import org.apache.commons.lang3.ObjectUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.Map; + +@Service +public class AuthServiceImpl implements AuthService { + @Resource + private SlCompanyMapper slCompanyMapper; + @Resource + private EmailUtils emailUtils; + @Override + public Result register(RegisterDTO registerDTO) { + String account = registerDTO.getAccount(); + String name = registerDTO.getName(); + String password = registerDTO.getPassword(); + String email = registerDTO.getEmail(); + + SlCompany slCompanyByAccount = slCompanyMapper.selectByAccount(account); + + if(ObjectUtils.isNotEmpty(slCompanyByAccount)){ + return Result.error("该账号已被注册,请尝试其他账号"); + } + + SlCompany slCompanyByEmail = slCompanyMapper.selectByEmail(email); + + if(ObjectUtils.isNotEmpty(slCompanyByEmail)){ + return Result.error("该邮箱已被使用,请更换邮箱"); + } + + SlCompany slCompany = new SlCompany(); + slCompany.setAccount(account) + .setName(name) + .setEmail(email) + .setPassword(password); + + int insert = slCompanyMapper.insert(slCompany); + + if(insert > 0){ + return Result.success("注册成功"); + } + + return Result.error("注册失败,请稍后重试"); + } + + @Override + public Result login(LoginDTO loginDTO) { + String loginCredential = loginDTO.getLoginCredential(); + String password = loginDTO.getPassword(); + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SlCompany::getEmail,loginCredential) + .eq(SlCompany::getPassword,password); + + SlCompany slCompany = slCompanyMapper.selectOne(queryWrapper); + + if(ObjectUtils.isEmpty(slCompany)){ + return Result.error("密码错误"); + } + + String token = JwtUtils.createToken(slCompany.getId()); + + LoginVO loginVO = new LoginVO(); + + BeanUtils.copyProperties(slCompany,loginVO); + + loginVO.setId(slCompany.getId()); + loginVO.setToken(token); + loginVO.setAvatar(slCompany.getAvatar()); + + return Result.success(loginVO); + } + + @Override + public Result forget(ForgetDTO forgetDTO) { + String forgetCredential = forgetDTO.getForgetCredential(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SlCompany::getEmail,forgetCredential) + .or() + .eq(SlCompany::getAccount,forgetCredential); + SlCompany slCompany = slCompanyMapper.selectOne(queryWrapper); + if (ObjectUtils.isEmpty(slCompany)) { + return Result.error("找回失败,该邮箱或账户不存在!"); + } else { + Map map = new HashMap<>(); + map.put("account", slCompany.getAccount()); + map.put("password", slCompany.getPassword()); + boolean sendFlag = emailUtils.sendEmail("ForgetPassword.html", "找回密码", map, slCompany.getEmail()); + return sendFlag ? Result.success("找回密码成功,请查看邮箱!") : Result.error("找回密码失败,请稍后再试!"); + } + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/service/impl/ImMessageServiceImpl.java b/code/link56/link56-backend-old/src/main/java/cn/link56/service/impl/ImMessageServiceImpl.java new file mode 100644 index 00000000..4f288357 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/service/impl/ImMessageServiceImpl.java @@ -0,0 +1,129 @@ +package cn.link56.service.impl; + +import cn.link56.context.UserContext; +import cn.link56.domain.dto.im.ImMessageHistoryDTO; +import cn.link56.domain.dto.im.ImMessageUpdateIsReadDTO; +import cn.link56.domain.entity.ImMessage; +import cn.link56.domain.im.dto.ImAcceptOneDTO; +import cn.link56.domain.im.dto.ImAcceptRollbackDTO; +import cn.link56.domain.vo.im.AllNoReadNumberVO; +import cn.link56.domain.vo.im.ChatCompanyVO; +import cn.link56.domain.vo.im.ImMessageHistoryVO; +import cn.link56.mapper.ImMessageMapper; +import cn.link56.service.ImMessageService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.apache.commons.lang3.ObjectUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +@Service +public class ImMessageServiceImpl extends ServiceImpl implements ImMessageService { + @Resource + private ImMessageMapper imMessageMapper; + + @Override + public List getChats() { + String acceptId = UserContext.getUserId(); + List list = imMessageMapper.getChats(acceptId); + + list.forEach(item -> { + String sendId = item.getCompanyId(); + Integer noReadNumber = imMessageMapper.getNoReadNumber(sendId,acceptId); + item.setNoReadNumber(noReadNumber); + if(ObjectUtils.isNotEmpty(item.getIsRollback()) && item.getIsRollback() == 1){ + item.setLastContent(""); + } + }); + return list; + } + + @Override + public List getMessageHistory(ImMessageHistoryDTO imMessageHistoryDTO) { + String chatId = imMessageHistoryDTO.getChatCompanyId(); + String userId = UserContext.getUserId(); + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.and(wrapper -> wrapper.eq(ImMessage::getSendId, userId) + .eq(ImMessage::getAcceptId, chatId)) + .or(wrapper -> wrapper.eq(ImMessage::getSendId, chatId) + .eq(ImMessage::getAcceptId, userId)); + + // 添加排序,例如根据消息的时间戳降序排列 + queryWrapper.orderByAsc(ImMessage::getCreateTime); + + List list = imMessageMapper.selectList(queryWrapper); + List result = new ArrayList<>(); + + list.forEach(item -> { + ImMessageHistoryVO imMessageHistoryVO = new ImMessageHistoryVO(); + imMessageHistoryVO.setMessageId(item.getId()) + .setMessageContent(item.getContent()) + .setMessageContentType(item.getContentType()) + .setSendId(item.getSendId()) + .setAcceptId(item.getAcceptId()) + .setQuoteMessageId(item.getQuoteId()) + .setIsRollback(item.getIsRollback()) + .setSendMessageTime(item.getCreateTime()); + if(ObjectUtils.isNotEmpty(item.getIsRollback()) && item.getIsRollback() == 1){ + imMessageHistoryVO.setMessageContent(""); + } + result.add(imMessageHistoryVO); + }); + + return result; + } + + @Override + public ImMessage insertOne(ImAcceptOneDTO imAcceptOneDTO) { + ImMessage imMessage = new ImMessage(); + + BeanUtils.copyProperties(imAcceptOneDTO,imMessage); + int insert = imMessageMapper.insert(imMessage); + + if(insert > 0){ + return imMessage; + } + return null; + } + + @Override + public void updateIsRead(ImMessageUpdateIsReadDTO imMessageUpdateIsReadDTO) { + String companyId = imMessageUpdateIsReadDTO.getCompanyId(); + String userId = UserContext.getUserId(); + + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.set(ImMessage::getIsRead,1) + .eq(ImMessage::getSendId,companyId) + .eq(ImMessage::getAcceptId,userId); + + imMessageMapper.update(updateWrapper); + } + + @Override + public void updateIsRollback(ImAcceptRollbackDTO imAcceptRollbackDTO) { + String messageId = imAcceptRollbackDTO.getMessageId(); + + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.set(ImMessage::getIsRollback,1) + .eq(ImMessage::getId,messageId); + + imMessageMapper.update(updateWrapper); + } + + @Override + public AllNoReadNumberVO getAllNoReadNumber() { + AllNoReadNumberVO allNoReadNumberVO = new AllNoReadNumberVO(); + String userId = UserContext.getUserId(); + Integer number = imMessageMapper.getAllNoReadNumber(userId); + + allNoReadNumberVO.setNoReadNumber(number); + return allNoReadNumberVO; + } + +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/service/impl/SlCompanyServiceImpl.java b/code/link56/link56-backend-old/src/main/java/cn/link56/service/impl/SlCompanyServiceImpl.java new file mode 100644 index 00000000..ab4827a6 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/service/impl/SlCompanyServiceImpl.java @@ -0,0 +1,211 @@ +package cn.link56.service.impl; + +import cn.link56.common.BasePageVO; +import cn.link56.common.Result; +import cn.link56.context.UserContext; +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.entity.SlCompany; +import cn.link56.domain.vo.company.*; +import cn.link56.mapper.SlCompanyMapper; +import cn.link56.mapper.WebAreaMapper; +import cn.link56.service.SlCompanyService; +import cn.link56.utils.ConvertUtils; +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 org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +@Service +public class SlCompanyServiceImpl extends ServiceImpl implements SlCompanyService { + @Resource + private SlCompanyMapper slCompanyMapper; + @Resource + private WebAreaMapper webAreaMapper; + @Override + public BasePageVO getCompanyPage(CompanyPageDTO companyPageDTO) { + int page = companyPageDTO.getPage(); + int pageSize = companyPageDTO.getPageSize(); + + Page companyPage = new Page<>(page, pageSize); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + // 模糊匹配公司名 + String name = companyPageDTO.getName(); + if (StringUtils.isNotBlank(name)) { + queryWrapper.like(SlCompany::getName, name); + } + + // 多个地区模糊匹配 address + List areaList = companyPageDTO.getArea(); + if (!CollectionUtils.isEmpty(areaList)) { + queryWrapper.and(wrapper -> { + for (String area : areaList) { + wrapper.or(w -> w.like(SlCompany::getAddress, area)); + } + }); + } + + // 多个行业模糊匹配 industry + List industryList = companyPageDTO.getIndustry(); + if (!CollectionUtils.isEmpty(industryList)) { + queryWrapper.and(wrapper -> { + for (String industry : industryList) { + wrapper.or(w -> w.like(SlCompany::getIndustry, industry)); + } + }); + } + + queryWrapper.orderByDesc(SlCompany::getCreateTime); + + List slCompanyList = slCompanyMapper.selectList(companyPage, queryWrapper); + + List result = slCompanyList.stream() + .map(item -> { + CompanyPageVO vo = new CompanyPageVO(); + BeanUtils.copyProperties(item, vo); + vo.setIndustry(ConvertUtils.parseTags(item.getIndustry())); + vo.setAddress(ConvertUtils.parseTags(item.getAddress())); + vo.setCompanyId(item.getId()); + return vo; + }) + .collect(Collectors.toList()); + + + return new BasePageVO() + .setRecord(result) + .setTotal(companyPage.getTotal()); + } + + @Override + public CompanyPrivateDetailVO getPrivateDetail() { + String companyId = UserContext.getUserId(); + if(StringUtils.isEmpty(companyId)){ + return null; + } + SlCompany slCompany = slCompanyMapper.selectById(companyId); + + CompanyPrivateDetailVO companyPrivateDetailVO = new CompanyPrivateDetailVO(); + + BeanUtils.copyProperties(slCompany,companyPrivateDetailVO); + + companyPrivateDetailVO.setIndustry(ConvertUtils.parseTags(slCompany.getIndustry())); + companyPrivateDetailVO.setAddress(ConvertUtils.parseTags(slCompany.getAddress())); + companyPrivateDetailVO.setCompanyId(slCompany.getId()); + return companyPrivateDetailVO; + } + + @Override + public Result updateDetail(CompanyUpdateDetailDTO companyUpdateDetailDTO) { + String email = companyUpdateDetailDTO.getEmail(); + String account = companyUpdateDetailDTO.getAccount(); + String companyId = companyUpdateDetailDTO.getCompanyId(); + + boolean isExistsAccount = slCompanyMapper.selectByAccountExcludeId(account,companyId) > 0; + boolean isExistsEmail = slCompanyMapper.selectByEmailExcludeId(email,companyId) > 0; + + if(isExistsAccount){ + return Result.error("该账号已被注册"); + } + + if(isExistsEmail){ + return Result.error("该邮箱已被注册"); + } + + SlCompany slCompany = new SlCompany(); + BeanUtils.copyProperties(companyUpdateDetailDTO,slCompany); + slCompany.setId(companyUpdateDetailDTO.getCompanyId()); + + slCompany.setAddress(ConvertUtils.formatTags(companyUpdateDetailDTO.getAddress())); + slCompany.setIndustry(ConvertUtils.formatTags(companyUpdateDetailDTO.getIndustry())); + + return slCompanyMapper.updateById(slCompany) > 0 ? Result.success() : Result.error(); + } + + @Override + public CompanyPublicDetailVO getPublicDetail(CompanyPublicDetailDTO companyPublicDetailDTO) { + String companyId = companyPublicDetailDTO.getCompanyId(); + + SlCompany slCompany = slCompanyMapper.selectById(companyId); + + if(ObjectUtils.isEmpty(slCompany)){ + return null; + } + + CompanyPublicDetailVO companyPublicDetailVO = new CompanyPublicDetailVO(); + + BeanUtils.copyProperties(slCompany,companyPublicDetailVO); + + companyPublicDetailVO.setCompanyId(slCompany.getId()); + + companyPublicDetailVO.setAddress(ConvertUtils.parseTags(slCompany.getAddress())); + companyPublicDetailVO.setIndustry(ConvertUtils.parseTags(slCompany.getIndustry())); + + return companyPublicDetailVO; + } + + @Override + public List getRecommendList() { + List result = webAreaMapper.getShiVisibleList(); + result.forEach(item -> { + String shiName = item.getShiName(); + LambdaQueryWrapper companyLambdaQueryWrapper = new LambdaQueryWrapper<>(); + + companyLambdaQueryWrapper.like(SlCompany::getAddress,shiName) + .eq(SlCompany::getVisible,"1") + .orderByAsc(SlCompany::getBOrder); + + List slCompanies = slCompanyMapper.selectList(companyLambdaQueryWrapper); + + List filtered = slCompanies.stream() + .filter(company -> isSecondEqualsTarget(company.getAddress(), shiName)) + .map(company -> new CompanyRecommendVO.CompanyInfo( + company.getId(), + company.getName(), + company.getColor() + )) + .collect(Collectors.toList()); + + item.setCompanies(filtered); + }); + return result; + } + + @Override + public List getRecommendRightList() { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SlCompany::getRightVisible,"1") + .orderByAsc(SlCompany::getBOrder); + + List slCompanies = slCompanyMapper.selectList(queryWrapper); + + + List result = new ArrayList<>(); + slCompanies.forEach(item -> { + CompanyRecommendRightVO companyRecommendRightVO = new CompanyRecommendRightVO(); + BeanUtils.copyProperties(item, companyRecommendRightVO); + companyRecommendRightVO.setCompanyId(item.getId()); + + result.add(companyRecommendRightVO); + }); + + return result; + } + public boolean isSecondEqualsTarget(String address, String target) { + if (address == null || target == null) { + return false; + } + String[] parts = address.split(","); + return parts.length >= 2 && parts[1].trim().equals(target); // 第二个元素是下标 1 + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/service/impl/SlFileServiceImpl.java b/code/link56/link56-backend-old/src/main/java/cn/link56/service/impl/SlFileServiceImpl.java new file mode 100644 index 00000000..8b3a3a11 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/service/impl/SlFileServiceImpl.java @@ -0,0 +1,34 @@ +package cn.link56.service.impl; + +import cn.link56.domain.dto.file.InsertFileDTO; +import cn.link56.domain.entity.SlFile; +import cn.link56.mapper.SlFileMapper; +import cn.link56.service.SlFileService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +@Service +public class SlFileServiceImpl extends ServiceImpl implements SlFileService { + @Resource + private SlFileMapper slFileMapper; + @Override + public boolean insertFile(InsertFileDTO insertFileDTO) { + String fileSize = insertFileDTO.getFileSize(); + String fileName = insertFileDTO.getFileName(); + String fileMapName = insertFileDTO.getFileMapName(); + String suffix = ""; + if (StringUtils.isNotEmpty(fileName)) { + int lastDotIndex = fileName.lastIndexOf(46); + if (lastDotIndex != -1 && lastDotIndex < fileName.length() - 1) { + suffix = fileName.substring(lastDotIndex + 1); + } + } + + SlFile slFile = new SlFile(); + slFile.setExt(suffix).setName(fileName).setMapName(fileMapName).setSize(fileSize); + return this.slFileMapper.insert(slFile) > 0; + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/service/impl/SlNotificationServiceImpl.java b/code/link56/link56-backend-old/src/main/java/cn/link56/service/impl/SlNotificationServiceImpl.java new file mode 100644 index 00000000..e8ac9d42 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/service/impl/SlNotificationServiceImpl.java @@ -0,0 +1,95 @@ +package cn.link56.service.impl; + +import cn.link56.common.BasePageDTO; +import cn.link56.common.BasePageVO; +import cn.link56.context.UserContext; +import cn.link56.domain.entity.SlNotification; +import cn.link56.domain.vo.notification.NotificationVO; +import cn.link56.enums.NotificationTypeEnum; +import cn.link56.mapper.SlNotificationMapper; +import cn.link56.service.SlNotificationService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +@Service +public class SlNotificationServiceImpl extends ServiceImpl implements SlNotificationService { + @Resource + private SlNotificationMapper slNotificationMapper; + @Override + public BasePageVO getLikeFavoritePage(BasePageDTO basePageDTO) { + int[] rows = getStartEndRow(basePageDTO); // AaaDTO extends BasePageDTO + int startRow = rows[0]; + int endRow = rows[1]; + + List datas = slNotificationMapper.getLikeFavoritePage(UserContext.getUserId(), startRow, endRow); + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SlNotification::getAcceptId, UserContext.getUserId()) + .and(qw -> qw.eq(SlNotification::getType, NotificationTypeEnum.LIKE.getCode()) + .or() + .eq(SlNotification::getType, NotificationTypeEnum.FAVORITE.getCode())); + Long total = slNotificationMapper.selectCount(queryWrapper); + + return new BasePageVO(total, datas); + } + + @Override + public boolean deleteAllLikeAndFavorite() { + String companyId = UserContext.getUserId(); + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SlNotification::getAcceptId, companyId) // 根据公司 ID 查询 + .and(wrapper -> wrapper + .eq(SlNotification::getType, NotificationTypeEnum.LIKE.getCode()) // 类型为 LIKE + .or() // 或者 + .eq(SlNotification::getType, NotificationTypeEnum.FAVORITE.getCode())); // 类型为 FAVORITE + + // 执行删除操作 + int deletedCount = slNotificationMapper.delete(queryWrapper); + + return deletedCount > 0; // 返回是否删除成功 + } + + @Override + public BasePageVO getCommentPage(BasePageDTO basePageDTO) { + int[] rows = getStartEndRow(basePageDTO); + int startRow = rows[0]; + int endRow = rows[1]; + List datas = slNotificationMapper.getCommentPage(UserContext.getUserId(), startRow, endRow); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SlNotification::getAcceptId, UserContext.getUserId()) + .eq(SlNotification::getType, NotificationTypeEnum.COMMENT.getCode()); + Long total = slNotificationMapper.selectCount(queryWrapper); + + return new BasePageVO(total, datas); + } + + @Override + public boolean deleteAllComment() { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SlNotification::getType, NotificationTypeEnum.COMMENT.getCode()) + .eq(SlNotification::getAcceptId,UserContext.getUserId()); + + // 执行删除操作 + int deletedCount = slNotificationMapper.delete(queryWrapper); + + return deletedCount > 0; // 返回是否删除成功 + } + + private int[] getStartEndRow(BasePageDTO dto) { + Integer page = dto.getPage(); + Integer pageSize = dto.getPageSize(); + + if (page == null || page <= 0) page = 1; + if (pageSize == null || pageSize <= 0) pageSize = 10; + + int startRow = (page - 1) * pageSize + 1; + int endRow = page * pageSize; + return new int[]{startRow, endRow}; + } + +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/service/impl/WebAreaServiceImpl.java b/code/link56/link56-backend-old/src/main/java/cn/link56/service/impl/WebAreaServiceImpl.java new file mode 100644 index 00000000..6453778e --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/service/impl/WebAreaServiceImpl.java @@ -0,0 +1,68 @@ +package cn.link56.service.impl; + +import cn.link56.domain.entity.WebArea; +import cn.link56.domain.vo.area.AreaVO; +import cn.link56.mapper.SlCompanyMapper; +import cn.link56.mapper.WebAreaMapper; +import cn.link56.service.WebAreaService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +@Service +public class WebAreaServiceImpl implements WebAreaService { + @Resource + private WebAreaMapper webAreaMapper; + @Resource + private SlCompanyMapper slCompanyMapper; + + @Override + public List getList() { + List shengAreas = webAreaMapper.getShengAreas(); // 省 + List shiAreas = webAreaMapper.getShiAreas(); // 市 + List quAreas = webAreaMapper.getQuAreas(); // 区 + + // 将市按照省分组 + Map> shiGroupByFather = shiAreas.stream() + .collect(Collectors.groupingBy(WebArea::getFatherId)); + + // 将区按照市分组 + Map> quGroupByFather = quAreas.stream() + .collect(Collectors.groupingBy(WebArea::getFatherId)); + + List result = new ArrayList<>(); + + for (WebArea sheng : shengAreas) { + AreaVO shengVO = new AreaVO(); + shengVO.setLabel(sheng.getName()); + shengVO.setValue(sheng.getName()); + + List shiVOList = new ArrayList<>(); + List subShiList = shiGroupByFather.getOrDefault(sheng.getId(), Collections.emptyList()); + + for (WebArea shi : subShiList) { + AreaVO shiVO = new AreaVO(); + shiVO.setLabel(shi.getName()); + shiVO.setValue(shi.getName()); + + List quVOList = new ArrayList<>(); + List subQuList = quGroupByFather.getOrDefault(shi.getId(), Collections.emptyList()); + + for (WebArea qu : subQuList) { + quVOList.add(new AreaVO(qu.getName(), qu.getName(), null)); + } + + shiVO.setChildren(quVOList.isEmpty() ? null : quVOList); + shiVOList.add(shiVO); + } + + shengVO.setChildren(shiVOList.isEmpty() ? null : shiVOList); + result.add(shengVO); + } + + return result; + } + +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/service/impl/WebPropertyServiceImpl.java b/code/link56/link56-backend-old/src/main/java/cn/link56/service/impl/WebPropertyServiceImpl.java new file mode 100644 index 00000000..27a2a0ab --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/service/impl/WebPropertyServiceImpl.java @@ -0,0 +1,21 @@ +package cn.link56.service.impl; + +import cn.link56.domain.entity.WebProperty; +import cn.link56.domain.vo.property.WebPropertyVO; +import cn.link56.mapper.WebPropertyMapper; +import cn.link56.service.WebPropertyService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +@Service +public class WebPropertyServiceImpl extends ServiceImpl implements WebPropertyService { + @Resource + private WebPropertyMapper webPropertyMapper; + @Override + public List getList() { + return webPropertyMapper.getList(); + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/utils/ConvertUtils.java b/code/link56/link56-backend-old/src/main/java/cn/link56/utils/ConvertUtils.java new file mode 100644 index 00000000..95bebe72 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/utils/ConvertUtils.java @@ -0,0 +1,30 @@ +package cn.link56.utils; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +public class ConvertUtils { + public static List parseTags(String input) { + if (input == null || input.trim().isEmpty()) { + return new ArrayList<>(); + } + + return Arrays.stream(input.split(",")) + .map(String::trim) + .filter(s -> !s.isEmpty()) + .collect(Collectors.toList()); + } + + public static String formatTags(List list) { + if (list == null || list.isEmpty()) { + return ""; + } + + return list.stream() + .filter(s -> s != null && !s.trim().isEmpty()) + .map(String::trim) + .collect(Collectors.joining(",")); + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/utils/EmailUtils.java b/code/link56/link56-backend-old/src/main/java/cn/link56/utils/EmailUtils.java new file mode 100644 index 00000000..e43fa64b --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/utils/EmailUtils.java @@ -0,0 +1,65 @@ +package cn.link56.utils; + +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import javax.annotation.Resource; +import javax.mail.MessagingException; +import javax.mail.internet.MimeMessage; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; +import org.thymeleaf.TemplateEngine; +import org.thymeleaf.context.Context; + +@Component +public class EmailUtils { + @Value("${spring.mail.username}") + private String fromEmail; + @Resource + private JavaMailSender mailSender; + @Resource + private TemplateEngine templateEngine; + + @Async + public CompletableFuture send(String templateHtml, String subject, Map mapValue, String toEmail) { + Context context = new Context(); + + for(Map.Entry entry : mapValue.entrySet()) { + String key = (String)entry.getKey(); + Object value = entry.getValue(); + context.setVariable(key, value); + } + + String emailContent = this.templateEngine.process(templateHtml, context); + MimeMessage message = this.mailSender.createMimeMessage(); + + try { + MimeMessageHelper helper = new MimeMessageHelper(message, true); + helper.setFrom(this.fromEmail); + helper.setTo(toEmail); + helper.setSubject(subject); + helper.setText(emailContent, true); + this.mailSender.send(message); + return CompletableFuture.completedFuture(true); + } catch (MessagingException e) { + System.err.println("Error sending email: " + e.getMessage()); + return CompletableFuture.completedFuture(false); + } catch (Exception e) { + System.err.println("Unexpected error: " + e.getMessage()); + return CompletableFuture.completedFuture(false); + } + } + + public boolean sendEmail(String templateHtml, String subject, Map mapValue, String toEmail) { + CompletableFuture futureResult = this.send(templateHtml, subject, mapValue, toEmail); + + try { + return (Boolean)futureResult.get(); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/utils/HttpUtils.java b/code/link56/link56-backend-old/src/main/java/cn/link56/utils/HttpUtils.java new file mode 100644 index 00000000..ec5293ec --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/utils/HttpUtils.java @@ -0,0 +1,207 @@ +package cn.link56.utils; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.net.ConnectException; +import java.net.SocketTimeoutException; +import java.net.URL; +import java.net.URLConnection; +import java.nio.charset.StandardCharsets; +import java.security.SecureRandom; +import java.security.cert.X509Certificate; +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.KeyManager; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; + +@Slf4j +public class HttpUtils { + + public static String sendGet(String url) { + return sendGet(url, ""); + } + + public static String sendGet(String url, String param) { + return sendGet(url, param, "UTF-8"); + } + + public static String sendGet(String url, String param, String contentType) { + StringBuilder result = new StringBuilder(); + BufferedReader in = null; + + try { + String urlNameString = StringUtils.isNotBlank(param) ? url + "?" + param : url; + URL realUrl = new URL(urlNameString); + URLConnection connection = realUrl.openConnection(); + connection.setRequestProperty("accept", "*/*"); + connection.setRequestProperty("connection", "Keep-Alive"); + connection.setRequestProperty("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"); + connection.connect(); + in = new BufferedReader(new InputStreamReader(connection.getInputStream(), contentType)); + + String line; + while((line = in.readLine()) != null) { + result.append(line); + } + } catch (ConnectException e) { + log.error("调用HttpUtils.sendGet ConnectException, url=" + url + ",param=" + param, e); + } catch (SocketTimeoutException e) { + log.error("调用HttpUtils.sendGet SocketTimeoutException, url=" + url + ",param=" + param, e); + } catch (IOException e) { + log.error("调用HttpUtils.sendGet IOException, url=" + url + ",param=" + param, e); + } catch (Exception e) { + log.error("调用HttpsUtil.sendGet Exception, url=" + url + ",param=" + param, e); + } finally { + try { + if (in != null) { + in.close(); + } + } catch (Exception ex) { + log.error("调用in.close Exception, url=" + url + ",param=" + param, ex); + } + + } + + return result.toString(); + } + + public static String sendPost(String url, String param) { + return sendPost(url, param, "application/x-www-form-urlencoded"); + } + + public static String sendPost(String url, String param, String contentType) { + PrintWriter out = null; + BufferedReader in = null; + StringBuilder result = new StringBuilder(); + + try { + log.info("sendPost - {}", url); + URL realUrl = new URL(url); + URLConnection conn = realUrl.openConnection(); + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("connection", "Keep-Alive"); + conn.setRequestProperty("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"); + conn.setRequestProperty("Accept-Charset", "utf-8"); + conn.setRequestProperty("Content-Type", contentType); + conn.setDoOutput(true); + conn.setDoInput(true); + out = new PrintWriter(conn.getOutputStream()); + out.print(param); + out.flush(); + in = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8)); + + String line; + while((line = in.readLine()) != null) { + result.append(line); + } + + log.info("recv - {}", result); + } catch (ConnectException e) { + log.error("调用HttpUtils.sendPost ConnectException, url=" + url + ",param=" + param, e); + } catch (SocketTimeoutException e) { + log.error("调用HttpUtils.sendPost SocketTimeoutException, url=" + url + ",param=" + param, e); + } catch (IOException e) { + log.error("调用HttpUtils.sendPost IOException, url=" + url + ",param=" + param, e); + } catch (Exception e) { + log.error("调用HttpsUtil.sendPost Exception, url=" + url + ",param=" + param, e); + } finally { + try { + if (out != null) { + out.close(); + } + + if (in != null) { + in.close(); + } + } catch (IOException ex) { + log.error("调用in.close Exception, url=" + url + ",param=" + param, ex); + } + + } + + return result.toString(); + } + + public static String sendSSLPost(String url, String param) { + return sendSSLPost(url, param, "application/x-www-form-urlencoded"); + } + + public static String sendSSLPost(String url, String param, String contentType) { + StringBuilder result = new StringBuilder(); + String urlNameString = url + "?" + param; + + try { + log.info("sendSSLPost - {}", urlNameString); + SSLContext sc = SSLContext.getInstance("SSL"); + sc.init((KeyManager[])null, new TrustManager[]{new TrustAnyTrustManager()}, new SecureRandom()); + URL console = new URL(urlNameString); + HttpsURLConnection conn = (HttpsURLConnection)console.openConnection(); + conn.setRequestProperty("accept", "*/*"); + conn.setRequestProperty("connection", "Keep-Alive"); + conn.setRequestProperty("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"); + conn.setRequestProperty("Accept-Charset", "utf-8"); + conn.setRequestProperty("Content-Type", contentType); + conn.setDoOutput(true); + conn.setDoInput(true); + conn.setSSLSocketFactory(sc.getSocketFactory()); + conn.setHostnameVerifier(new TrustAnyHostnameVerifier()); + conn.connect(); + InputStream is = conn.getInputStream(); + BufferedReader br = new BufferedReader(new InputStreamReader(is)); + String ret = ""; + + while((ret = br.readLine()) != null) { + if (ret != null && !"".equals(ret.trim())) { + result.append(new String(ret.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8)); + } + } + + log.info("recv - {}", result); + conn.disconnect(); + br.close(); + } catch (ConnectException e) { + log.error("调用HttpUtils.sendSSLPost ConnectException, url=" + url + ",param=" + param, e); + } catch (SocketTimeoutException e) { + log.error("调用HttpUtils.sendSSLPost SocketTimeoutException, url=" + url + ",param=" + param, e); + } catch (IOException e) { + log.error("调用HttpUtils.sendSSLPost IOException, url=" + url + ",param=" + param, e); + } catch (Exception e) { + log.error("调用HttpsUtil.sendSSLPost Exception, url=" + url + ",param=" + param, e); + } + + return result.toString(); + } + + private static class TrustAnyTrustManager implements X509TrustManager { + private TrustAnyTrustManager() { + } + + public void checkClientTrusted(X509Certificate[] chain, String authType) { + } + + public void checkServerTrusted(X509Certificate[] chain, String authType) { + } + + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[0]; + } + } + + private static class TrustAnyHostnameVerifier implements HostnameVerifier { + private TrustAnyHostnameVerifier() { + } + + public boolean verify(String hostname, SSLSession session) { + return true; + } + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/utils/JsonUtils.java b/code/link56/link56-backend-old/src/main/java/cn/link56/utils/JsonUtils.java new file mode 100644 index 00000000..bb1e102c --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/utils/JsonUtils.java @@ -0,0 +1,40 @@ +package cn.link56.utils; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class JsonUtils { + private static final ObjectMapper objectMapper = new ObjectMapper(); + // 判断字符串是否为有效的 JSON 格式 + public static boolean isTypeJSON(String msgText) { + try { + // 尝试将字符串解析为 JsonNode,如果能解析,说明是有效的 JSON + JsonNode node = objectMapper.readTree(msgText); + return node != null; + } catch (Exception e) { + return false; // 如果抛出异常,说明不是有效的 JSON + } + } + + // 将 JSON 字符串转换为指定类型的 Java 对象 + public static T toBean(String json, Class clazz) { + try { + // 使用 ObjectMapper 将 JSON 字符串转换为指定类型的对象 + return objectMapper.readValue(json, clazz); + } catch (JsonProcessingException e) { + e.printStackTrace(); // 打印异常信息 + return null; // 如果转换失败,返回 null + } + } + + // 将对象转换为 JSON 字符串 + public static String toJson(Object obj) { + try { + return objectMapper.writeValueAsString(obj); // 将对象转换为 JSON 字符串 + } catch (JsonProcessingException e) { + System.out.println(e.getMessage()); + return null; // 如果出现异常,返回 null + } + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/utils/JwtUtils.java b/code/link56/link56-backend-old/src/main/java/cn/link56/utils/JwtUtils.java new file mode 100644 index 00000000..71c37696 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/utils/JwtUtils.java @@ -0,0 +1,47 @@ +package cn.link56.utils; + +import com.auth0.jwt.JWT; +import com.auth0.jwt.JWTCreator; +import com.auth0.jwt.algorithms.Algorithm; +import com.auth0.jwt.interfaces.Claim; +import com.auth0.jwt.interfaces.DecodedJWT; + +import java.util.Map; + +public class JwtUtils { + // 秘钥 + private static final String SECRET = "SLLOG-USER-API"; + // 过期时间,7天。 + private static final Integer EXPIRE_TIME = 7; + // 用户ID字段 + private static final String SL_COMPANY_ID = "id"; + + /** + * 创建TOKEN + * @param slCompanyId 公司id + * @return 返回token + */ + public static String createToken(String slCompanyId){ + JWTCreator.Builder builder = JWT.create(); + builder.withClaim(SL_COMPANY_ID,slCompanyId); +// Calendar instance = Calendar.getInstance(); +// instance.add(Calendar.DATE, EXPIRE_TIME); //默认30天过期 +// builder.withExpiresAt(instance.getTime());//指定令牌的过期时间 + return builder.sign(Algorithm.HMAC256(SECRET)); + } + + /** + * 验证token 合法性 + */ + public static DecodedJWT verify(String token) { + //如果有任何验证异常,此处都会抛出异常 + return JWT.require(Algorithm.HMAC256(SECRET)).build().verify(token); + } + + /** + * 获取token信息方法 + */ + public static Map getTokenInfo(String token) { + return JWT.require(Algorithm.HMAC256(SECRET)).build().verify(token).getClaims(); + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/utils/MD5Utils.java b/code/link56/link56-backend-old/src/main/java/cn/link56/utils/MD5Utils.java new file mode 100644 index 00000000..864cd699 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/utils/MD5Utils.java @@ -0,0 +1,13 @@ +package cn.link56.utils; + +import org.springframework.util.DigestUtils; + +import java.nio.charset.StandardCharsets; + +public class MD5Utils { + public static final String SALT = "sllog-user-api"; + + public static String encrypt(String password){ + return DigestUtils.md5DigestAsHex((SALT + password).getBytes(StandardCharsets.UTF_8)); + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/utils/MessageConverterUtils.java b/code/link56/link56-backend-old/src/main/java/cn/link56/utils/MessageConverterUtils.java new file mode 100644 index 00000000..f8c79409 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/utils/MessageConverterUtils.java @@ -0,0 +1,12 @@ +package cn.link56.utils; + +import com.fasterxml.jackson.databind.ObjectMapper; + +public class MessageConverterUtils { + private static final ObjectMapper objectMapper = new ObjectMapper(); + + // 安全类型转换方法 + public static T convertData(Object data, Class targetType) { + return objectMapper.convertValue(data, targetType); + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/utils/SpringUtils.java b/code/link56/link56-backend-old/src/main/java/cn/link56/utils/SpringUtils.java new file mode 100644 index 00000000..abcff5c6 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/utils/SpringUtils.java @@ -0,0 +1,52 @@ +package cn.link56.utils; + +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +@Component +public class SpringUtils implements BeanFactoryPostProcessor, ApplicationContextAware { + /** Spring应用上下文环境 */ + private static ConfigurableListableBeanFactory beanFactory; + + private static ApplicationContext applicationContext; + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { + SpringUtils.beanFactory = beanFactory; + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + SpringUtils.applicationContext = applicationContext; + } + + /** + * 获取对象 + * + * @param name + * @return Object 一个以所给名字注册的bean的实例 + * @throws BeansException + * + */ + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException + { + return (T) beanFactory.getBean(name); + } + + /** + * 获取类型为requiredType的对象 + * + * @param clz + * @return + * @throws BeansException + * + */ + public static T getBean(Class clz) throws BeansException + { + return (T) beanFactory.getBean(clz); + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/utils/snowflake/contract/IIdGenerator.java b/code/link56/link56-backend-old/src/main/java/cn/link56/utils/snowflake/contract/IIdGenerator.java new file mode 100644 index 00000000..a2df8449 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/utils/snowflake/contract/IIdGenerator.java @@ -0,0 +1,5 @@ +package cn.link56.utils.snowflake.contract; + +public interface IIdGenerator { + long newLong() throws IdGeneratorException; +} \ No newline at end of file diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/utils/snowflake/contract/ISnowWorker.java b/code/link56/link56-backend-old/src/main/java/cn/link56/utils/snowflake/contract/ISnowWorker.java new file mode 100644 index 00000000..efc963ea --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/utils/snowflake/contract/ISnowWorker.java @@ -0,0 +1,5 @@ +package cn.link56.utils.snowflake.contract; + +public interface ISnowWorker { + long nextId() throws IdGeneratorException; +} \ No newline at end of file diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/utils/snowflake/contract/IdGeneratorException.java b/code/link56/link56-backend-old/src/main/java/cn/link56/utils/snowflake/contract/IdGeneratorException.java new file mode 100644 index 00000000..fc02fd4f --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/utils/snowflake/contract/IdGeneratorException.java @@ -0,0 +1,25 @@ +package cn.link56.utils.snowflake.contract; + +public class IdGeneratorException extends RuntimeException { + + public IdGeneratorException() { + super(); + } + + public IdGeneratorException(String message) { + super(message); + } + + public IdGeneratorException(Throwable cause) { + super(cause); + } + + public IdGeneratorException(String message, Throwable cause) { + super(message, cause); + } + + public IdGeneratorException(String msgFormat, Object... args) { + super(String.format(msgFormat, args)); + } + +} \ No newline at end of file diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/utils/snowflake/contract/IdGeneratorOptions.java b/code/link56/link56-backend-old/src/main/java/cn/link56/utils/snowflake/contract/IdGeneratorOptions.java new file mode 100644 index 00000000..921d5339 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/utils/snowflake/contract/IdGeneratorOptions.java @@ -0,0 +1,59 @@ +package cn.link56.utils.snowflake.contract; + +public class IdGeneratorOptions { + /** + * 雪花计算方法 + * (1-漂移算法|2-传统算法),默认1 + */ + public short Method = 1; + + /** + * 基础时间(ms单位) + * 不能超过当前系统时间 + */ + public long BaseTime = 1582136402000L; + + /** + * 机器码 + * 必须由外部设定,最大值 2^WorkerIdBitLength-1 + */ + public short WorkerId = 0; + + /** + * 机器码位长 + * 默认值6,取值范围 [1, 15](要求:序列数位长+机器码位长不超过22) + */ + public byte WorkerIdBitLength = 6; + + /** + * 序列数位长 + * 默认值6,取值范围 [3, 21](要求:序列数位长+机器码位长不超过22) + */ + public byte SeqBitLength = 6; + + /** + * 最大序列数(含) + * 设置范围 [MinSeqNumber, 2^SeqBitLength-1],默认值0,表示最大序列数取最大值(2^SeqBitLength-1]) + */ + public short MaxSeqNumber = 0; + + /** + * 最小序列数(含) + * 默认值5,取值范围 [5, MaxSeqNumber],每毫秒的前5个序列数对应编号是0-4是保留位,其中1-4是时间回拨相应预留位,0是手工新值预留位 + */ + public short MinSeqNumber = 5; + + /** + * 最大漂移次数(含) + * 默认2000,推荐范围500-10000(与计算能力有关) + */ + public short TopOverCostCount = 2000; + + public IdGeneratorOptions() { + + } + + public IdGeneratorOptions(short workerId) { + WorkerId = workerId; + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/utils/snowflake/contract/OverCostActionArg.java b/code/link56/link56-backend-old/src/main/java/cn/link56/utils/snowflake/contract/OverCostActionArg.java new file mode 100644 index 00000000..ecf9078d --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/utils/snowflake/contract/OverCostActionArg.java @@ -0,0 +1,45 @@ +package cn.link56.utils.snowflake.contract; +/** + * Id生成时回调参数 + */ +public class OverCostActionArg { + /** + * 事件类型 + * 1-开始,2-结束,8-漂移 + */ + public int ActionType = 0; + + /** + * 时间戳 + */ + public long TimeTick = 0; + + /** + * 机器码 + */ + public short WorkerId = 0; + + /** + * + */ + public int OverCostCountInOneTerm = 0; + + /** + * 漂移期间生产ID个数 + */ + public int GenCountInOneTerm = 0; + + /** + * 漂移周期 + */ + public int TermIndex = 0; + + public OverCostActionArg(short workerId, long timeTick, int actionType, int overCostCountInOneTerm, int genCountWhenOverCost, int index) { + ActionType = actionType; + TimeTick = timeTick; + WorkerId = workerId; + OverCostCountInOneTerm = overCostCountInOneTerm; + GenCountInOneTerm = genCountWhenOverCost; + TermIndex = index; + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/utils/snowflake/core/SnowWorkerM1.java b/code/link56/link56-backend-old/src/main/java/cn/link56/utils/snowflake/core/SnowWorkerM1.java new file mode 100644 index 00000000..dfb75da3 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/utils/snowflake/core/SnowWorkerM1.java @@ -0,0 +1,229 @@ +package cn.link56.utils.snowflake.core; + +import cn.link56.utils.snowflake.contract.ISnowWorker; +import cn.link56.utils.snowflake.contract.IdGeneratorException; +import cn.link56.utils.snowflake.contract.IdGeneratorOptions; +import cn.link56.utils.snowflake.contract.OverCostActionArg; + +public class SnowWorkerM1 implements ISnowWorker { + /** + * 基础时间 + */ + protected final long BaseTime; + + /** + * 机器码 + */ + protected final short WorkerId; + + /** + * 机器码位长 + */ + protected final byte WorkerIdBitLength; + + /** + * 自增序列数位长 + */ + protected final byte SeqBitLength; + + /** + * 最大序列数(含) + */ + protected final int MaxSeqNumber; + + /** + * 最小序列数(含) + */ + protected final short MinSeqNumber; + + /** + * 最大漂移次数(含) + */ + protected final int TopOverCostCount; + + protected final byte _TimestampShift; + protected final static byte[] _SyncLock = new byte[0]; + + protected short _CurrentSeqNumber; + protected long _LastTimeTick = 0; + protected long _TurnBackTimeTick = 0; + protected byte _TurnBackIndex = 0; + + protected boolean _IsOverCost = false; + protected int _OverCostCountInOneTerm = 0; + protected int _GenCountInOneTerm = 0; + protected int _TermIndex = 0; + + public SnowWorkerM1(IdGeneratorOptions options) { + BaseTime = options.BaseTime != 0 ? options.BaseTime : 1582136402000L; + WorkerIdBitLength = options.WorkerIdBitLength == 0 ? 6 : options.WorkerIdBitLength; + WorkerId = options.WorkerId; + SeqBitLength = options.SeqBitLength == 0 ? 6 : options.SeqBitLength; + MaxSeqNumber = options.MaxSeqNumber <= 0 ? (1 << SeqBitLength) - 1 : options.MaxSeqNumber; + MinSeqNumber = options.MinSeqNumber; + // TopOverCostCount = options.TopOverCostCount == 0 ? 2000 : options.TopOverCostCount; + TopOverCostCount = options.TopOverCostCount; + _TimestampShift = (byte) (WorkerIdBitLength + SeqBitLength); + _CurrentSeqNumber = MinSeqNumber; + } + + private void DoGenIdAction(OverCostActionArg arg) { + + } + + private void BeginOverCostAction(long useTimeTick) { + + } + + private void EndOverCostAction(long useTimeTick) { + // if (_TermIndex > 10000) { + // _TermIndex = 0; + // } + } + + private void BeginTurnBackAction(long useTimeTick) { + + } + + private void EndTurnBackAction(long useTimeTick) { + + } + + private long NextOverCostId() { + long currentTimeTick = GetCurrentTimeTick(); + + if (currentTimeTick > _LastTimeTick) { + EndOverCostAction(currentTimeTick); + + _LastTimeTick = currentTimeTick; + _CurrentSeqNumber = MinSeqNumber; + _IsOverCost = false; + _OverCostCountInOneTerm = 0; + _GenCountInOneTerm = 0; + + return CalcId(_LastTimeTick); + } + + if (_OverCostCountInOneTerm >= TopOverCostCount) { + EndOverCostAction(currentTimeTick); + + _LastTimeTick = GetNextTimeTick(); + _CurrentSeqNumber = MinSeqNumber; + _IsOverCost = false; + _OverCostCountInOneTerm = 0; + _GenCountInOneTerm = 0; + + return CalcId(_LastTimeTick); + } + + if (_CurrentSeqNumber > MaxSeqNumber) { + _LastTimeTick++; + _CurrentSeqNumber = MinSeqNumber; + _IsOverCost = true; + _OverCostCountInOneTerm++; + _GenCountInOneTerm++; + + return CalcId(_LastTimeTick); + } + + _GenCountInOneTerm++; + return CalcId(_LastTimeTick); + } + + private long NextNormalId() throws IdGeneratorException { + long currentTimeTick = GetCurrentTimeTick(); + + if (currentTimeTick < _LastTimeTick) { + if (_TurnBackTimeTick < 1) { + _TurnBackTimeTick = _LastTimeTick - 1; + _TurnBackIndex++; + // 每毫秒序列数的前5位是预留位,0用于手工新值,1-4是时间回拨次序 + // 支持4次回拨次序(避免回拨重叠导致ID重复),可无限次回拨(次序循环使用)。 + if (_TurnBackIndex > 4) { + _TurnBackIndex = 1; + } + //BeginTurnBackAction(_TurnBackTimeTick); + } + + // try { + // Thread.sleep(1); + // } catch (InterruptedException e) { + // e.printStackTrace(); + // } + + return CalcTurnBackId(_TurnBackTimeTick); + } + + // 时间追平时,_TurnBackTimeTick清零 + if (_TurnBackTimeTick > 0) { + EndTurnBackAction(_TurnBackTimeTick); + _TurnBackTimeTick = 0; + } + + if (currentTimeTick > _LastTimeTick) { + _LastTimeTick = currentTimeTick; + _CurrentSeqNumber = MinSeqNumber; + + return CalcId(_LastTimeTick); + } + + if (_CurrentSeqNumber > MaxSeqNumber) { + BeginOverCostAction(currentTimeTick); + + _TermIndex++; + _LastTimeTick++; + _CurrentSeqNumber = MinSeqNumber; + _IsOverCost = true; + _OverCostCountInOneTerm = 1; + _GenCountInOneTerm = 1; + + return CalcId(_LastTimeTick); + } + + return CalcId(_LastTimeTick); + } + + private long CalcId(long useTimeTick) { + long result = ((useTimeTick << _TimestampShift) + + ((long) WorkerId << SeqBitLength) + + (int) _CurrentSeqNumber); + + _CurrentSeqNumber++; + return result; + } + + private long CalcTurnBackId(long useTimeTick) { + long result = ((useTimeTick << _TimestampShift) + + ((long) WorkerId << SeqBitLength) + _TurnBackIndex); + + _TurnBackTimeTick--; + return result; + } + + protected long GetCurrentTimeTick() { + long millis = System.currentTimeMillis(); + return millis - BaseTime; + } + + protected long GetNextTimeTick() { + long tempTimeTicker = GetCurrentTimeTick(); + + while (tempTimeTicker <= _LastTimeTick) { + try { + Thread.sleep(1); + } catch (InterruptedException e) { + e.printStackTrace(); + } + tempTimeTicker = GetCurrentTimeTick(); + } + + return tempTimeTicker; + } + + @Override + public long nextId() { + synchronized (_SyncLock) { + return _IsOverCost ? NextOverCostId() : NextNormalId(); + } + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/utils/snowflake/core/SnowWorkerM2.java b/code/link56/link56-backend-old/src/main/java/cn/link56/utils/snowflake/core/SnowWorkerM2.java new file mode 100644 index 00000000..62b17369 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/utils/snowflake/core/SnowWorkerM2.java @@ -0,0 +1,36 @@ +package cn.link56.utils.snowflake.core; + +import cn.link56.utils.snowflake.contract.IdGeneratorException; +import cn.link56.utils.snowflake.contract.IdGeneratorOptions; + +public class SnowWorkerM2 extends SnowWorkerM1 { + public SnowWorkerM2(IdGeneratorOptions options) { + super(options); + } + + @Override + public long nextId() { + synchronized (_SyncLock) { + long currentTimeTick = GetCurrentTimeTick(); + + if (_LastTimeTick == currentTimeTick) { + if (_CurrentSeqNumber++ > MaxSeqNumber) { + _CurrentSeqNumber = MinSeqNumber; + currentTimeTick = GetNextTimeTick(); + } + } else { + _CurrentSeqNumber = MinSeqNumber; + } + + if (currentTimeTick < _LastTimeTick) { + throw new IdGeneratorException("Time error for {0} milliseconds", _LastTimeTick - currentTimeTick); + } + + _LastTimeTick = currentTimeTick; + long result = ((currentTimeTick << _TimestampShift) + ((long) WorkerId << SeqBitLength) + (int) _CurrentSeqNumber); + + return result; + } + + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/utils/snowflake/idgen/DefaultIdGenerator.java b/code/link56/link56-backend-old/src/main/java/cn/link56/utils/snowflake/idgen/DefaultIdGenerator.java new file mode 100644 index 00000000..4994fb48 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/utils/snowflake/idgen/DefaultIdGenerator.java @@ -0,0 +1,88 @@ +package cn.link56.utils.snowflake.idgen; + +import cn.link56.utils.snowflake.contract.IIdGenerator; +import cn.link56.utils.snowflake.contract.ISnowWorker; +import cn.link56.utils.snowflake.contract.IdGeneratorException; +import cn.link56.utils.snowflake.contract.IdGeneratorOptions; +import cn.link56.utils.snowflake.core.SnowWorkerM1; +import cn.link56.utils.snowflake.core.SnowWorkerM2; + +public class DefaultIdGenerator implements IIdGenerator { + private static ISnowWorker _SnowWorker = null; + + public DefaultIdGenerator(IdGeneratorOptions options) throws IdGeneratorException { + if (options == null) { + throw new IdGeneratorException("options error."); + } + + // 1.BaseTime + if (options.BaseTime < 315504000000L || options.BaseTime > System.currentTimeMillis()) { + throw new IdGeneratorException("BaseTime error."); + } + + // 2.WorkerIdBitLength + if (options.WorkerIdBitLength <= 0) { + throw new IdGeneratorException("WorkerIdBitLength error.(range:[1, 21])"); + } + if (options.WorkerIdBitLength + options.SeqBitLength > 22) { + throw new IdGeneratorException("error:WorkerIdBitLength + SeqBitLength <= 22"); + } + + // 3.WorkerId + int maxWorkerIdNumber = (1 << options.WorkerIdBitLength) - 1; + if (maxWorkerIdNumber == 0) { + maxWorkerIdNumber = 63; + } + if (options.WorkerId < 0 || options.WorkerId > maxWorkerIdNumber) { + throw new IdGeneratorException( + "WorkerId error. (range:[0, " + (maxWorkerIdNumber > 0 ? maxWorkerIdNumber : 63) + "]"); + } + + // 4.SeqBitLength + if (options.SeqBitLength < 2 || options.SeqBitLength > 21) { + throw new IdGeneratorException("SeqBitLength error. (range:[2, 21])"); + } + + // 5.MaxSeqNumber + int maxSeqNumber = (1 << options.SeqBitLength) - 1; + if (maxSeqNumber == 0) { + maxSeqNumber = 63; + } + if (options.MaxSeqNumber < 0 || options.MaxSeqNumber > maxSeqNumber) { + throw new IdGeneratorException("MaxSeqNumber error. (range:[1, " + maxSeqNumber + "]"); + } + + // 6.MinSeqNumber + if (options.MinSeqNumber < 5 || options.MinSeqNumber > maxSeqNumber) { + throw new IdGeneratorException("MinSeqNumber error. (range:[5, " + maxSeqNumber + "]"); + } + + // 7.TopOverCostCount + if (options.TopOverCostCount < 0 || options.TopOverCostCount > 10000) { + throw new IdGeneratorException("TopOverCostCount error. (range:[0, 10000]"); + } + + switch (options.Method) { + case 2: + _SnowWorker = new SnowWorkerM2(options); + break; + case 1: + default: + _SnowWorker = new SnowWorkerM1(options); + break; + } + + if (options.Method == 1) { + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + + @Override + public long newLong() { + return _SnowWorker.nextId(); + } +} diff --git a/code/link56/link56-backend-old/src/main/java/cn/link56/utils/snowflake/idgen/IdGenerator.java b/code/link56/link56-backend-old/src/main/java/cn/link56/utils/snowflake/idgen/IdGenerator.java new file mode 100644 index 00000000..01a2b41f --- /dev/null +++ b/code/link56/link56-backend-old/src/main/java/cn/link56/utils/snowflake/idgen/IdGenerator.java @@ -0,0 +1,34 @@ +package cn.link56.utils.snowflake.idgen; + +import cn.link56.utils.snowflake.contract.IIdGenerator; +import cn.link56.utils.snowflake.contract.IdGeneratorException; +import cn.link56.utils.snowflake.contract.IdGeneratorOptions; +import lombok.Getter; + +public class IdGenerator { + @Getter + private static IIdGenerator idGenInstance = null; + + /** + * 设置参数,建议程序初始化时执行一次 + */ + public static void setIdGenerator(IdGeneratorOptions options) throws IdGeneratorException { + idGenInstance = new DefaultIdGenerator(options); + } + + /** + * 生成新的Id + * 调用本方法前,请确保调用了 SetIdGenerator 方法做初始化。 + * + */ + public static long nextId() throws IdGeneratorException { + // if (idGenInstance == null) { + // idGenInstance = new DefaultIdGenerator(new IdGeneratorOptions((short) 1)); + // } + + if (idGenInstance == null) + throw new IdGeneratorException("Please initialize Yitter.IdGeneratorOptions first."); + + return idGenInstance.newLong(); + } +} diff --git a/code/link56/link56-backend-old/src/main/resources/application-dev.yml b/code/link56/link56-backend-old/src/main/resources/application-dev.yml new file mode 100644 index 00000000..4dd9c68e --- /dev/null +++ b/code/link56/link56-backend-old/src/main/resources/application-dev.yml @@ -0,0 +1,55 @@ +server: + port: 8083 +spring: + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driver-class-name: net.sourceforge.jtds.jdbc.Driver + url: jdbc:jtds:sqlserver://192.168.1.189:1433;databaseName=G3-Link + username: sa + password: "g3soft" + # druid 连接池管理 + druid: + # 初始化时建立物理连接的个数 + initial-size: 5 + # 连接池的最小空闲数量 + min-idle: 5 + # 连接池最大连接数量 + max-active: 20 + # 获取连接时最大等待时间,单位毫秒 + max-wait: 60000 + # 申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 + test-while-idle: true + # 既作为检测的间隔时间又作为testWhileIdel执行的依据 + time-between-eviction-runs-millis: 60000 + # 销毁线程时检测当前连接的最后活动时间和当前时间差大于该值时,关闭当前连接(配置连接在池中的最小生存时间) + min-evictable-idle-time-millis: 30000 + # 用来检测数据库连接是否有效的sql 必须是一个查询语句(oracle中为 select 1 from dual) validation-query: select 'x' + # 申请连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true + test-on-borrow: false + # 归还连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true + test-on-return: false + # 是否缓存preparedStatement, 也就是PSCache,PSCache对支持游标的数据库性能提升巨大,比如说oracle,在mysql下建议关闭。 + pool-prepared-statements: false + # 置监控统计拦截的filters,去掉后监控界面sql无法统计,stat: 监控统计、Slf4j:日志记录、waLL: 防御sqL注入 + filters: stat,wall,slf4j + # 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100 + max-pool-prepared-statement-per-connection-size: -1 + # 合并多个DruidDataSource的监控数据 + use-global-data-source-stat: true + # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 + connect-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 + + stat-view-servlet: + # 是否启用StatViewServlet默认值true + enabled: true + # 访问路径为/druid时,跳转到StatViewServlet + url-pattern: /druid/* + # 是否能够重置数据 + reset-enable: false + # 需要账号密码才能访问控制台,默认为root + login-username: root + login-password: root + # IP白名单 + allow: 127.0.0.1 + # IP黑名单(共同存在时,deny优先于allow) + deny: \ No newline at end of file diff --git a/code/link56/link56-backend-old/src/main/resources/application-prod.yml b/code/link56/link56-backend-old/src/main/resources/application-prod.yml new file mode 100644 index 00000000..e45de8c4 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/resources/application-prod.yml @@ -0,0 +1,55 @@ +server: + port: 8080 +spring: + datasource: + type: com.alibaba.druid.pool.DruidDataSource + driver-class-name: net.sourceforge.jtds.jdbc.Driver + url: jdbc:jtds:sqlserver://127.0.0.1:1433;databaseName=G3-Website + username: sa + password: 123456@aaa + # druid 连接池管理 + druid: + # 初始化时建立物理连接的个数 + initial-size: 5 + # 连接池的最小空闲数量 + min-idle: 5 + # 连接池最大连接数量 + max-active: 20 + # 获取连接时最大等待时间,单位毫秒 + max-wait: 60000 + # 申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 + test-while-idle: true + # 既作为检测的间隔时间又作为testWhileIdel执行的依据 + time-between-eviction-runs-millis: 60000 + # 销毁线程时检测当前连接的最后活动时间和当前时间差大于该值时,关闭当前连接(配置连接在池中的最小生存时间) + min-evictable-idle-time-millis: 30000 + # 用来检测数据库连接是否有效的sql 必须是一个查询语句(oracle中为 select 1 from dual) validation-query: select 'x' + # 申请连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true + test-on-borrow: false + # 归还连接时会执行validationQuery检测连接是否有效,开启会降低性能,默认为true + test-on-return: false + # 是否缓存preparedStatement, 也就是PSCache,PSCache对支持游标的数据库性能提升巨大,比如说oracle,在mysql下建议关闭。 + pool-prepared-statements: false + # 置监控统计拦截的filters,去掉后监控界面sql无法统计,stat: 监控统计、Slf4j:日志记录、waLL: 防御sqL注入 + filters: stat,wall,slf4j + # 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100 + max-pool-prepared-statement-per-connection-size: -1 + # 合并多个DruidDataSource的监控数据 + use-global-data-source-stat: true + # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 + connect-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 + + stat-view-servlet: + # 是否启用StatViewServlet默认值true + enabled: true + # 访问路径为/druid时,跳转到StatViewServlet + url-pattern: /druid/* + # 是否能够重置数据 + reset-enable: false + # 需要账号密码才能访问控制台,默认为root + login-username: root + login-password: root + # IP白名单 + allow: 127.0.0.1 + # IP黑名单(共同存在时,deny优先于allow) + deny: \ No newline at end of file diff --git a/code/link56/link56-backend-old/src/main/resources/application.yml b/code/link56/link56-backend-old/src/main/resources/application.yml new file mode 100644 index 00000000..0db83cca --- /dev/null +++ b/code/link56/link56-backend-old/src/main/resources/application.yml @@ -0,0 +1,41 @@ +server: + servlet: + context-path: / # 应用的访问路径 + tomcat: + uri-encoding: UTF-8 # URI编码 + accept-count: 1000 # 连接数满后的排队数 + threads: + max: 800 # 最大线程数 + min-spare: 100 # 初始化的线程数 + max-http-header-size: 64KB +logging: + level: + com.client: debug # 调试级别的日志 + org.springframework: warn # 仅显示警告级别及以上的Spring日志 + +spring: + profiles: + active: dev + mail: + host: smtp.163.com #邮箱服务器地址 + username: hi_itao@163.com #邮箱账号 + password: GVdEzKAee9MByXdy #邮箱授权码 + default-encoding: utf-8 #默认编码 + +mybatis-plus: + # 对应的 XML 文件位置 + mapperLocations: classpath*:mapper/**/*Mapper.xml + # 实体扫描,多个package用逗号或者分号分隔 + typeAliasesPackage: cn.link56.domain + # 主键类型 0:"数据库ID自增",1:"该类型为未设置主键类型", 2:"用户输入ID",3:"全局唯一ID (数字类型唯一ID)", 4:"全局唯一ID UUID",5:"字符串全局唯一ID (idWorker 的字符串表示)"; + global-config: + db-config: + id-type: ASSIGN_UUID + # 加载全局的配置文件 + # configLocation: classpath:mybatis/mybatis-config.xml + configuration: + cache-enabled: true + use-generated-keys: true + default-executor-type: simple + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + map-underscore-to-camel-case: true diff --git a/code/link56/link56-backend-old/src/main/resources/cn/link56/mapper/ImMessageMapper.xml b/code/link56/link56-backend-old/src/main/resources/cn/link56/mapper/ImMessageMapper.xml new file mode 100644 index 00000000..82630693 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/resources/cn/link56/mapper/ImMessageMapper.xml @@ -0,0 +1,48 @@ + + + + + + + + + + \ No newline at end of file diff --git a/code/link56/link56-backend-old/src/main/resources/cn/link56/mapper/SlCompanyMapper.xml b/code/link56/link56-backend-old/src/main/resources/cn/link56/mapper/SlCompanyMapper.xml new file mode 100644 index 00000000..83fe1f1f --- /dev/null +++ b/code/link56/link56-backend-old/src/main/resources/cn/link56/mapper/SlCompanyMapper.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/code/link56/link56-backend-old/src/main/resources/cn/link56/mapper/SlNotificationMapper.xml b/code/link56/link56-backend-old/src/main/resources/cn/link56/mapper/SlNotificationMapper.xml new file mode 100644 index 00000000..ae58abd7 --- /dev/null +++ b/code/link56/link56-backend-old/src/main/resources/cn/link56/mapper/SlNotificationMapper.xml @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/code/link56/link56-backend-old/src/main/resources/cn/link56/mapper/WebAreaMapper.xml b/code/link56/link56-backend-old/src/main/resources/cn/link56/mapper/WebAreaMapper.xml new file mode 100644 index 00000000..fe5b09cd --- /dev/null +++ b/code/link56/link56-backend-old/src/main/resources/cn/link56/mapper/WebAreaMapper.xml @@ -0,0 +1,62 @@ + + + + + + + + + + diff --git a/code/link56/link56-backend-old/src/main/resources/cn/link56/mapper/forum/ForumPostCommentMapper.xml b/code/link56/link56-backend-old/src/main/resources/cn/link56/mapper/forum/ForumPostCommentMapper.xml new file mode 100644 index 00000000..4c18459a --- /dev/null +++ b/code/link56/link56-backend-old/src/main/resources/cn/link56/mapper/forum/ForumPostCommentMapper.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/code/link56/link56-backend-old/src/main/resources/cn/link56/mapper/forum/ForumPostMapper.xml b/code/link56/link56-backend-old/src/main/resources/cn/link56/mapper/forum/ForumPostMapper.xml new file mode 100644 index 00000000..ede3a3da --- /dev/null +++ b/code/link56/link56-backend-old/src/main/resources/cn/link56/mapper/forum/ForumPostMapper.xml @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/code/link56/link56-backend-old/src/main/resources/logback.xml b/code/link56/link56-backend-old/src/main/resources/logback.xml new file mode 100644 index 00000000..c1c64c8d --- /dev/null +++ b/code/link56/link56-backend-old/src/main/resources/logback.xml @@ -0,0 +1,94 @@ + + + + + + + + + + + ${log.pattern} + + + + + + ${log.path}/sys-info.log + + + + ${log.path}/sys-info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/sys-error.log + + + + ${log.path}/sys-error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + ${log.path}/sys-user.log + + + ${log.path}/sys-user.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/code/link56/link56-backend-old/src/main/resources/templates/ForgetPassword.html b/code/link56/link56-backend-old/src/main/resources/templates/ForgetPassword.html new file mode 100644 index 00000000..d93928cf --- /dev/null +++ b/code/link56/link56-backend-old/src/main/resources/templates/ForgetPassword.html @@ -0,0 +1,536 @@ + + + + + + + + + + + + + + + +Use this link to reset your password. The link is only valid for 24 hours. + + + + + + + + \ No newline at end of file diff --git a/code/link56/link56-backend-old/src/main/resources/templates/RegisterAccount.html b/code/link56/link56-backend-old/src/main/resources/templates/RegisterAccount.html new file mode 100644 index 00000000..32c0dd6c --- /dev/null +++ b/code/link56/link56-backend-old/src/main/resources/templates/RegisterAccount.html @@ -0,0 +1,522 @@ + + + + + + + + + + + + + + + +Use this link to reset your password. The link is only valid for 24 hours. + + + + + + + + \ No newline at end of file diff --git a/code/link56/link56-backend-old/src/test/java/cn/link56/test/GenTest.java b/code/link56/link56-backend-old/src/test/java/cn/link56/test/GenTest.java new file mode 100644 index 00000000..15ca18de --- /dev/null +++ b/code/link56/link56-backend-old/src/test/java/cn/link56/test/GenTest.java @@ -0,0 +1,34 @@ +package cn.link56.test; + +import cn.link56.utils.snowflake.idgen.IdGenerator; + +import java.util.HashSet; +import java.util.Set; + +public class GenTest { + private int GenIdCount; + private int WorkerId; + private Set IdSet = new HashSet(); + + public GenTest(int genIdCount, int workerId) { + GenIdCount = genIdCount; + WorkerId = workerId; + } + + public void GenStart() { + long start = System.currentTimeMillis(); + long id = 0; + + for (int i = 0; i < GenIdCount; i++) { + id = IdGenerator.nextId(); + } + + long end = System.currentTimeMillis(); + long time = end - start; + + // System.out.println(id); + System.out.println("++++++++++++++++++++++++++++++++++++++++WorkerId: " + + WorkerId + ", total: " + time + " ms"); + + } +} diff --git a/code/link56/link56-backend-old/src/test/java/cn/link56/test/Test.java b/code/link56/link56-backend-old/src/test/java/cn/link56/test/Test.java new file mode 100644 index 00000000..fcfffb09 --- /dev/null +++ b/code/link56/link56-backend-old/src/test/java/cn/link56/test/Test.java @@ -0,0 +1,29 @@ +package cn.link56.test; + +import cn.link56.utils.snowflake.contract.IdGeneratorOptions; +import cn.link56.utils.snowflake.idgen.IdGenerator; + +public class Test { + + /** + * 测试结果: + * (1):1W并发,方法 1只要 1ms.而方法 2 要 180ms。 + * (2):5W并发,方法 1只要 3ms.而方法 2 要 900ms。 + * [不同CPU可能结果有差异,但相对大小不变] + * 默认配置下,最佳性能是5W/s-8W/s + */ + final static int genIdCount = 500000; + + //1-漂移算法,2-传统算法 + final static short method = 1; + + + public static void main(String[] args) { + IdGeneratorOptions options = new IdGeneratorOptions(); + options.WorkerId = 1; + IdGenerator.setIdGenerator(options); + + long l = IdGenerator.nextId(); + System.out.println(l); + } +} diff --git a/code/link56/link56-backend/src/main/java/cn/link56/auth/code/controller/AuthCodeController.java b/code/link56/link56-backend/src/main/java/cn/link56/auth/code/controller/AuthCodeController.java index f52690ea..f7975c54 100644 --- a/code/link56/link56-backend/src/main/java/cn/link56/auth/code/controller/AuthCodeController.java +++ b/code/link56/link56-backend/src/main/java/cn/link56/auth/code/controller/AuthCodeController.java @@ -4,7 +4,7 @@ import cn.link56.auth.code.model.AuthCodeChannel; import cn.link56.auth.code.model.AuthCodePurpose; import cn.link56.auth.code.model.dto.AuthCodeSendDTO; import cn.link56.auth.code.model.dto.AuthCodeVerifyDTO; -import cn.link56.auth.code.service.VerificationCodeService; +import cn.link56.auth.code.service.AuthVerificationCodeService; import cn.link56.common.Result; import org.springframework.web.bind.annotation.*; @@ -14,7 +14,7 @@ import javax.annotation.Resource; @RequestMapping("/auth/code") public class AuthCodeController { @Resource - private VerificationCodeService verificationCodeService; + private AuthVerificationCodeService authVerificationCodeService; @PostMapping("/send") public Result send(@RequestBody AuthCodeSendDTO authCodeSendDTO) { @@ -22,7 +22,7 @@ public class AuthCodeController { AuthCodeChannel channel = authCodeSendDTO.getChannel(); String target = authCodeSendDTO.getTarget(); - boolean flag = verificationCodeService.sendCode(purpose, channel, target); + boolean flag = authVerificationCodeService.sendCode(purpose, channel, target); return flag ? Result.success() : Result.error(); } @@ -34,7 +34,7 @@ public class AuthCodeController { String target = authCodeVerifyDTO.getTarget(); String code = authCodeVerifyDTO.getCode(); - boolean flag = verificationCodeService.verifyCode(purpose, channel, target, code); + boolean flag = authVerificationCodeService.verifyCode(purpose, channel, target, code); return flag ? Result.success() : Result.error(); } diff --git a/code/link56/link56-backend/src/main/java/cn/link56/auth/code/sender/EmailAuthCodeSender.java b/code/link56/link56-backend/src/main/java/cn/link56/auth/code/sender/EmailAuthCodeSender.java index 049fa8bf..0209d6ed 100644 --- a/code/link56/link56-backend/src/main/java/cn/link56/auth/code/sender/EmailAuthCodeSender.java +++ b/code/link56/link56-backend/src/main/java/cn/link56/auth/code/sender/EmailAuthCodeSender.java @@ -22,6 +22,7 @@ public class EmailAuthCodeSender { if (purpose.equals(AuthCodePurpose.LOGIN)){ subject = "登录"; + templateHtml = "Login.html"; }else if(purpose.equals(AuthCodePurpose.REGISTER)){ subject = "注册"; templateHtml = "Register.html"; diff --git a/code/link56/link56-backend/src/main/java/cn/link56/auth/code/service/VerificationCodeService.java b/code/link56/link56-backend/src/main/java/cn/link56/auth/code/service/AuthVerificationCodeService.java similarity index 97% rename from code/link56/link56-backend/src/main/java/cn/link56/auth/code/service/VerificationCodeService.java rename to code/link56/link56-backend/src/main/java/cn/link56/auth/code/service/AuthVerificationCodeService.java index 82e78f2f..ecd3da2d 100644 --- a/code/link56/link56-backend/src/main/java/cn/link56/auth/code/service/VerificationCodeService.java +++ b/code/link56/link56-backend/src/main/java/cn/link56/auth/code/service/AuthVerificationCodeService.java @@ -11,7 +11,7 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; @Service -public class VerificationCodeService { +public class AuthVerificationCodeService { @Resource private AuthCodeStore codeStore; diff --git a/code/link56/link56-backend/src/main/java/cn/link56/auth/code/store/AuthCodeStore.java b/code/link56/link56-backend/src/main/java/cn/link56/auth/code/store/AuthCodeStore.java index 5964b8a1..7ef3bd63 100644 --- a/code/link56/link56-backend/src/main/java/cn/link56/auth/code/store/AuthCodeStore.java +++ b/code/link56/link56-backend/src/main/java/cn/link56/auth/code/store/AuthCodeStore.java @@ -3,7 +3,7 @@ package cn.link56.auth.code.store; import cn.link56.auth.code.model.AuthCodeChannel; import cn.link56.auth.code.model.AuthCode; import cn.link56.auth.code.model.AuthCodePurpose; -import cn.link56.common.exception.OperationTooFrequentException; +import cn.link56.common.exception.BusinessException; import org.springframework.stereotype.Component; import javax.naming.OperationNotSupportedException; @@ -29,7 +29,7 @@ public class AuthCodeStore { AuthCode existing = store.get(key); if (existing != null && existing.getLastSentAt().plusSeconds(MIN_INTERVAL_SECONDS).isAfter(now)) { - throw new OperationTooFrequentException("验证码发送过于频繁,请稍后再试"); + throw new BusinessException("验证码发送过于频繁,请稍后再试"); } AuthCode code = new AuthCode( diff --git a/code/link56/link56-backend/src/main/java/cn/link56/auth/identity/controller/AuthIdentityController.java b/code/link56/link56-backend/src/main/java/cn/link56/auth/identity/controller/AuthIdentityController.java new file mode 100644 index 00000000..be84fe42 --- /dev/null +++ b/code/link56/link56-backend/src/main/java/cn/link56/auth/identity/controller/AuthIdentityController.java @@ -0,0 +1,41 @@ +package cn.link56.auth.identity.controller; + +import cn.link56.auth.identity.model.dto.AuthLoginEmailCodeDTO; +import cn.link56.auth.identity.model.dto.AuthLoginPasswordDTO; +import cn.link56.auth.identity.model.dto.AuthRegisterDTO; +import cn.link56.auth.identity.model.vo.AuthLoginVO; +import cn.link56.auth.identity.service.AuthIdentityService; +import cn.link56.common.Result; +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/identity") +public class AuthIdentityController { + @Resource + private AuthIdentityService authIdentityService; + + @PostMapping("/register") + public Result register(@RequestBody AuthRegisterDTO authRegisterDTO){ + authIdentityService.register(authRegisterDTO); + + return Result.success(); + } + + @PostMapping("/login/password") + public Result loginByPassword(@RequestBody @Validated AuthLoginPasswordDTO loginPasswordDTO){ + AuthLoginVO authLoginVO = authIdentityService.loginByPassword(loginPasswordDTO); + return Result.success(authLoginVO); + } + + @PostMapping("/login/emailCode") + public Result loginByEmailCode(@RequestBody @Validated AuthLoginEmailCodeDTO loginEmailCodeDTO){ + AuthLoginVO authLoginVO = authIdentityService.loginByEmailCode(loginEmailCodeDTO); + return Result.success(authLoginVO); + } +} diff --git a/code/link56/link56-backend/src/main/java/cn/link56/auth/identity/model/dto/AuthLoginEmailCodeDTO.java b/code/link56/link56-backend/src/main/java/cn/link56/auth/identity/model/dto/AuthLoginEmailCodeDTO.java new file mode 100644 index 00000000..91746bbf --- /dev/null +++ b/code/link56/link56-backend/src/main/java/cn/link56/auth/identity/model/dto/AuthLoginEmailCodeDTO.java @@ -0,0 +1,20 @@ +package cn.link56.auth.identity.model.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 AuthLoginEmailCodeDTO { + @NotBlank(message = "邮箱不能为空") + @Email(message = "邮箱格式有误") + private String email; + + @NotBlank(message = "验证码不能为空") + private String code; +} diff --git a/code/link56/link56-backend/src/main/java/cn/link56/auth/identity/model/dto/AuthLoginPasswordDTO.java b/code/link56/link56-backend/src/main/java/cn/link56/auth/identity/model/dto/AuthLoginPasswordDTO.java new file mode 100644 index 00000000..5d840842 --- /dev/null +++ b/code/link56/link56-backend/src/main/java/cn/link56/auth/identity/model/dto/AuthLoginPasswordDTO.java @@ -0,0 +1,20 @@ +package cn.link56.auth.identity.model.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 AuthLoginPasswordDTO { + @NotBlank(message = "邮箱不能为空") + @Email(message = "邮箱格式有误") + private String email; + + @NotBlank(message = "密码不能为空") + private String password; +} diff --git a/code/link56/link56-backend/src/main/java/cn/link56/auth/identity/model/vo/AuthLoginVO.java b/code/link56/link56-backend/src/main/java/cn/link56/auth/identity/model/vo/AuthLoginVO.java new file mode 100644 index 00000000..f3d08c57 --- /dev/null +++ b/code/link56/link56-backend/src/main/java/cn/link56/auth/identity/model/vo/AuthLoginVO.java @@ -0,0 +1,21 @@ +package cn.link56.auth.identity.model.vo; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class AuthLoginVO { + private Long companyId; + private String companyLogo; + private String companyName; + + private Long userId; + private Integer userRole; + private String userName; + private String userPosition; + + private String token; +} diff --git a/code/link56/link56-backend/src/main/java/cn/link56/auth/identity/service/AuthIdentityService.java b/code/link56/link56-backend/src/main/java/cn/link56/auth/identity/service/AuthIdentityService.java new file mode 100644 index 00000000..1296d6e9 --- /dev/null +++ b/code/link56/link56-backend/src/main/java/cn/link56/auth/identity/service/AuthIdentityService.java @@ -0,0 +1,135 @@ +package cn.link56.auth.identity.service; + +import cn.link56.auth.code.model.AuthCodeChannel; +import cn.link56.auth.code.model.AuthCodePurpose; +import cn.link56.auth.code.service.AuthVerificationCodeService; +import cn.link56.auth.identity.model.dto.AuthLoginEmailCodeDTO; +import cn.link56.auth.identity.model.dto.AuthLoginPasswordDTO; +import cn.link56.auth.identity.model.vo.AuthLoginVO; +import cn.link56.auth.token.model.AuthToken; +import cn.link56.auth.token.model.TokenPayload; +import cn.link56.auth.token.service.AuthTokenService; +import cn.link56.entity.BCompany; +import cn.link56.entity.BCompanyUser; +import cn.link56.auth.identity.model.dto.AuthRegisterDTO; +import cn.link56.base.service.BCompanyService; +import cn.link56.base.service.BCompanyUserService; +import cn.link56.common.exception.BusinessException; +import cn.link56.common.utils.snowflake.idgen.IdGenerator; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; + +@Service +public class AuthIdentityService { + @Resource + private BCompanyService companyService; + @Resource + private BCompanyUserService companyUserService; + @Resource + private AuthTokenService tokenService; + @Resource + private AuthVerificationCodeService authVerificationCodeService; + + @Transactional + public void register(AuthRegisterDTO registerDTO) { + AuthRegisterDTO.Company company = registerDTO.getCompany(); + AuthRegisterDTO.Admin admin = registerDTO.getAdmin(); + + if (companyService.isNameExists(company.getName())) { + throw new BusinessException("公司名称已存在"); + } + + if(StringUtils.isNotBlank(company.getPhone()) && companyService.isPhoneExists(company.getPhone())){ + throw new BusinessException("公司邮箱已被注册"); + } + + if (companyUserService.isEmailExists(admin.getEmail())) { + throw new BusinessException("管理员邮箱已被注册"); + } + + if (StringUtils.isNotBlank(admin.getPhone()) && companyUserService.isPhoneExists(admin.getPhone())) { + throw new BusinessException("管理员手机号已被注册"); + } + + long companyId = IdGenerator.nextId(); + + companyService.save( + new BCompany() + .setId(companyId) + .setName(company.getName()) + .setIndustry(company.getIndustry()) + .setAddress(company.getAddress()) + .setPhone(company.getPhone()) + .setEmail(company.getEmail()) + .setProfile(company.getProfile()) + ); + + companyUserService.save( + new BCompanyUser() + .setId(IdGenerator.nextId()) + .setCompanyId(companyId) + .setName(admin.getName()) + .setEmail(admin.getEmail()) + .setPassword(admin.getPassword()) + .setPhone(admin.getPhone()) + .setPosition(admin.getPosition()) + .setRole(0) + ); + } + + public AuthLoginVO loginByPassword(AuthLoginPasswordDTO dto) { + BCompanyUser user = companyUserService.loginByEmailAndPassword(dto.getEmail(), dto.getPassword()); + if (user == null) { + throw new BusinessException("邮箱或密码错误"); + } + return buildLoginVO(user); + } + + public AuthLoginVO loginByEmailCode(AuthLoginEmailCodeDTO dto) { + String email = dto.getEmail(); + String code = dto.getCode(); + + boolean valid = authVerificationCodeService.verifyCode( + AuthCodePurpose.LOGIN, + AuthCodeChannel.EMAIL, + email, + code + ); + + if (!valid) { + throw new BusinessException("邮箱或验证码失效"); + } + + BCompanyUser user = companyUserService.loginByEmail(email); + if (user == null) { + throw new BusinessException("邮箱不存在"); + } + + return buildLoginVO(user); + } + + /** + * 公共逻辑:根据用户生成 LoginVO + */ + private AuthLoginVO buildLoginVO(BCompanyUser user) { + BCompany company = companyService.getById(user.getCompanyId()); + AuthToken authToken = tokenService.generateToken(new TokenPayload(user.getCompanyId(), user.getId())); + + return new AuthLoginVO( + company.getId(), + company.getLogo(), + company.getName(), + + user.getId(), + user.getRole(), + user.getName(), + user.getPosition(), + + authToken.getToken() + ); + } + +} diff --git a/code/link56/link56-backend/src/main/java/cn/link56/base/controller/BaseDataController.java b/code/link56/link56-backend/src/main/java/cn/link56/base/controller/BaseDataController.java index d7923490..1776fa5b 100644 --- a/code/link56/link56-backend/src/main/java/cn/link56/base/controller/BaseDataController.java +++ b/code/link56/link56-backend/src/main/java/cn/link56/base/controller/BaseDataController.java @@ -2,6 +2,7 @@ package cn.link56.base.controller; import cn.link56.base.model.vo.BaseDataVO; import cn.link56.base.service.BaseDataService; +import cn.link56.common.Result; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -9,14 +10,13 @@ import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; @RestController -@RequestMapping("/api/base") +@RequestMapping("/base") public class BaseDataController { @Resource private BaseDataService baseDataService; - @GetMapping("/init") - public BaseDataVO initBaseData() { - return baseDataService.getBaseData(); + public Result initBaseData() { + return Result.success(baseDataService.getBaseData()); } } diff --git a/code/link56/link56-backend/src/main/java/cn/link56/base/mapper/AreaMapper.java b/code/link56/link56-backend/src/main/java/cn/link56/base/mapper/AreaMapper.java new file mode 100644 index 00000000..de60ac26 --- /dev/null +++ b/code/link56/link56-backend/src/main/java/cn/link56/base/mapper/AreaMapper.java @@ -0,0 +1,15 @@ +package cn.link56.base.mapper; + +import cn.link56.entity.BArea; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface AreaMapper { + /** + * 获取所有区域信息 + * @return 区域集合 + */ + List listAllArea(); +} diff --git a/code/link56/link56-backend/src/main/java/cn/link56/base/mapper/BCompanyMapper.java b/code/link56/link56-backend/src/main/java/cn/link56/base/mapper/BCompanyMapper.java new file mode 100644 index 00000000..8fb22fe5 --- /dev/null +++ b/code/link56/link56-backend/src/main/java/cn/link56/base/mapper/BCompanyMapper.java @@ -0,0 +1,9 @@ +package cn.link56.base.mapper; + +import cn.link56.entity.BCompany; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface BCompanyMapper extends BaseMapper { +} diff --git a/code/link56/link56-backend/src/main/java/cn/link56/base/mapper/BCompanyUserMapper.java b/code/link56/link56-backend/src/main/java/cn/link56/base/mapper/BCompanyUserMapper.java new file mode 100644 index 00000000..aeb6f995 --- /dev/null +++ b/code/link56/link56-backend/src/main/java/cn/link56/base/mapper/BCompanyUserMapper.java @@ -0,0 +1,9 @@ +package cn.link56.base.mapper; + +import cn.link56.entity.BCompanyUser; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface BCompanyUserMapper extends BaseMapper { +} diff --git a/code/link56/link56-backend/src/main/java/cn/link56/base/mapper/IndustryMapper.java b/code/link56/link56-backend/src/main/java/cn/link56/base/mapper/IndustryMapper.java index 11cf0873..0b64e997 100644 --- a/code/link56/link56-backend/src/main/java/cn/link56/base/mapper/IndustryMapper.java +++ b/code/link56/link56-backend/src/main/java/cn/link56/base/mapper/IndustryMapper.java @@ -1,6 +1,6 @@ package cn.link56.base.mapper; -import cn.link56.base.model.BIndustry; +import cn.link56.entity.BIndustry; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; diff --git a/code/link56/link56-backend/src/main/java/cn/link56/base/model/vo/BaseDataVO.java b/code/link56/link56-backend/src/main/java/cn/link56/base/model/vo/BaseDataVO.java index 9cb822cb..0c94fdd0 100644 --- a/code/link56/link56-backend/src/main/java/cn/link56/base/model/vo/BaseDataVO.java +++ b/code/link56/link56-backend/src/main/java/cn/link56/base/model/vo/BaseDataVO.java @@ -30,5 +30,6 @@ public class BaseDataVO { private Integer xh; private String name; private String fatherId; + private List children; } } diff --git a/code/link56/link56-backend/src/main/java/cn/link56/base/service/BCompanyService.java b/code/link56/link56-backend/src/main/java/cn/link56/base/service/BCompanyService.java new file mode 100644 index 00000000..35ae35df --- /dev/null +++ b/code/link56/link56-backend/src/main/java/cn/link56/base/service/BCompanyService.java @@ -0,0 +1,39 @@ +package cn.link56.base.service; + +import cn.link56.base.mapper.BCompanyMapper; +import cn.link56.entity.BCompany; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +@Service +public class BCompanyService extends ServiceImpl { + @Resource + private BCompanyMapper companyMapper; + + /** + * 检查公司名称是否重复 + */ + public boolean isNameExists(String name) { + Long count = companyMapper.selectCount( + new LambdaQueryWrapper() + .eq(BCompany::getName, name) + ); + return count > 0; + } + + /** + * 检查公司手机号是否重复 + */ + public boolean isPhoneExists(String phone) { + Long count = companyMapper.selectCount( + new LambdaQueryWrapper() + .eq(BCompany::getPhone, phone) + ); + return count > 0; + } + + +} diff --git a/code/link56/link56-backend/src/main/java/cn/link56/base/service/BCompanyUserService.java b/code/link56/link56-backend/src/main/java/cn/link56/base/service/BCompanyUserService.java new file mode 100644 index 00000000..18763826 --- /dev/null +++ b/code/link56/link56-backend/src/main/java/cn/link56/base/service/BCompanyUserService.java @@ -0,0 +1,59 @@ +package cn.link56.base.service; + +import cn.link56.base.mapper.BCompanyUserMapper; +import cn.link56.entity.BCompanyUser; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +@Service +public class BCompanyUserService extends ServiceImpl { + + @Resource + private BCompanyUserMapper companyUserMapper; + + /** + * 判断邮箱是否重复 + * @param email 用户邮箱 + * @return true 表示邮箱已存在,false 表示可用 + */ + public boolean isEmailExists(String email) { + long count = companyUserMapper.selectCount( + new LambdaQueryWrapper() + .eq(BCompanyUser::getEmail, email) + ); + return count > 0; + } + + /** + * 判断手机号是否重复 + * @param phone 用户手机号 + * @return true 表示手机号已存在,false 表示可用 + */ + public boolean isPhoneExists(String phone) { + long count = companyUserMapper.selectCount( + new LambdaQueryWrapper() + .eq(BCompanyUser::getPhone, phone) + ); + return count > 0; + } + + + public BCompanyUser loginByEmailAndPassword(String email, String password){ + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(BCompanyUser::getEmail,email) + .eq(BCompanyUser::getPassword,password); + + return companyUserMapper.selectOne(queryWrapper); + } + + public BCompanyUser loginByEmail(String email){ + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(BCompanyUser::getEmail,email); + + return companyUserMapper.selectOne(queryWrapper); + } + +} diff --git a/code/link56/link56-backend/src/main/java/cn/link56/base/service/BaseDataService.java b/code/link56/link56-backend/src/main/java/cn/link56/base/service/BaseDataService.java index b88456aa..e2d109b0 100644 --- a/code/link56/link56-backend/src/main/java/cn/link56/base/service/BaseDataService.java +++ b/code/link56/link56-backend/src/main/java/cn/link56/base/service/BaseDataService.java @@ -1,19 +1,23 @@ package cn.link56.base.service; +import cn.link56.base.mapper.AreaMapper; import cn.link56.base.mapper.IndustryMapper; -import cn.link56.base.model.BIndustry; +import cn.link56.entity.BArea; +import cn.link56.entity.BIndustry; import cn.link56.base.model.vo.BaseDataVO; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import org.springframework.stereotype.Service; import javax.annotation.Resource; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; @Service public class BaseDataService { @Resource private IndustryMapper industryMapper; + @Resource + private AreaMapper areaMapper; public BaseDataVO getBaseData() { BaseDataVO baseDataVO = new BaseDataVO(); @@ -30,9 +34,75 @@ public class BaseDataService { )) .collect(Collectors.toList()); - baseDataVO.setIndustries(industries); + // 地区 + List allAreas = areaMapper.listAllArea(); + List areaTree = buildAreaTree(allAreas); + + baseDataVO.setAreas(areaTree); return baseDataVO; } + + /** + * BArea → BaseDataVO.Area 树 + */ + private List buildAreaTree(List areas) { + if (areas == null || areas.isEmpty()) { + return Collections.emptyList(); + } + + // id -> VO + Map map = new HashMap<>(areas.size()); + + // 1️⃣ 先全部转 VO + for (BArea a : areas) { + BaseDataVO.Area vo = new BaseDataVO.Area( + a.getId(), + a.getXh(), + a.getName(), + a.getFatherId(), + new ArrayList<>() + ); + map.put(vo.getId(), vo); + } + + // 2️⃣ 组装父子关系 + List roots = new ArrayList<>(); + + for (BaseDataVO.Area area : map.values()) { + String parentId = area.getFatherId(); + if (parentId == null || "0".equals(parentId)) { + roots.add(area); + } else { + BaseDataVO.Area parent = map.get(parentId); + if (parent != null) { + parent.getChildren().add(area); + } + } + } + + // 3️⃣ 可选排序 + sortTree(roots); + + return roots; + } + + /** + * 按 xh 排序(如果你用 order,也可以换) + */ + private void sortTree(List nodes) { + if (nodes == null || nodes.isEmpty()) { + return; + } + + nodes.sort(Comparator.comparing( + BaseDataVO.Area::getXh, + Comparator.nullsLast(Integer::compareTo) + )); + + for (BaseDataVO.Area node : nodes) { + sortTree(node.getChildren()); + } + } } \ No newline at end of file diff --git a/code/link56/link56-backend/src/main/java/cn/link56/common/Result.java b/code/link56/link56-backend/src/main/java/cn/link56/common/Result.java index 1f0b41d3..4ee2866c 100644 --- a/code/link56/link56-backend/src/main/java/cn/link56/common/Result.java +++ b/code/link56/link56-backend/src/main/java/cn/link56/common/Result.java @@ -42,10 +42,10 @@ public class Result { } public static Result error(String message){ - return new Result<>(ResponseStatusConstants.ERROR, message, null); + return new Result<>(ResponseStatusConstants.BUSINESS_ERROR, message, null); } public static Result error(){ - return new Result<>(ResponseStatusConstants.ERROR, null,null); + return new Result<>(ResponseStatusConstants.BUSINESS_ERROR, null,null); } } diff --git a/code/link56/link56-backend/src/main/java/cn/link56/common/config/AutoMetaObjectHandler.java b/code/link56/link56-backend/src/main/java/cn/link56/common/config/AutoMetaObjectHandler.java new file mode 100644 index 00000000..7a9f0fd9 --- /dev/null +++ b/code/link56/link56-backend/src/main/java/cn/link56/common/config/AutoMetaObjectHandler.java @@ -0,0 +1,37 @@ +package cn.link56.common.config; + +import cn.link56.common.context.UserContext; +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.ibatis.reflection.MetaObject; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.Date; + +@Component +public class AutoMetaObjectHandler implements MetaObjectHandler { + @Override + public void insertFill(MetaObject metaObject) { + Long userId = UserContext.getUserId(); + + if (ObjectUtils.isNotEmpty(userId) && userId > 0){ + this.strictInsertFill(metaObject, "createBy", Long.class, userId); + } + + Date date = new Date(); + + this.strictInsertFill(metaObject, "createTime", Date.class, date); + this.strictInsertFill(metaObject, "updateTime", Date.class, date); + } + + @Override + public void updateFill(MetaObject metaObject) { + Long userId = UserContext.getUserId(); + + if (ObjectUtils.isNotEmpty(userId) && userId > 0){ + this.strictUpdateFill(metaObject, "updateBy", Long.class, userId); + } + this.strictUpdateFill(metaObject, "updateTime", Date.class, new Date()); + } +} diff --git a/code/link56/link56-backend/src/main/java/cn/link56/common/constants/ResponseStatusConstants.java b/code/link56/link56-backend/src/main/java/cn/link56/common/constants/ResponseStatusConstants.java index 2ffee1d0..3559c7d1 100644 --- a/code/link56/link56-backend/src/main/java/cn/link56/common/constants/ResponseStatusConstants.java +++ b/code/link56/link56-backend/src/main/java/cn/link56/common/constants/ResponseStatusConstants.java @@ -6,10 +6,15 @@ public class ResponseStatusConstants { */ public static final Integer SUCCESS = 200; - /** - * 系统内部错误 + /** + * 系统业务错误 */ - public static final Integer ERROR = 500; + public static final Integer BUSINESS_ERROR = 450; + + /** + * 系统服务器错误 + */ + public static final Integer SERVER_ERROR = 500; /** * 缺少参数,参数格式有误,请求路径有误等 diff --git a/code/link56/link56-backend/src/main/java/cn/link56/common/exception/BusinessException.java b/code/link56/link56-backend/src/main/java/cn/link56/common/exception/BusinessException.java index dd9ad87a..b9ba4839 100644 --- a/code/link56/link56-backend/src/main/java/cn/link56/common/exception/BusinessException.java +++ b/code/link56/link56-backend/src/main/java/cn/link56/common/exception/BusinessException.java @@ -4,4 +4,7 @@ public class BusinessException extends RuntimeException { public BusinessException(String message) { super(message); } + public BusinessException(String message, Throwable cause) { + super(message, cause); + } } diff --git a/code/link56/link56-backend/src/main/java/cn/link56/common/exception/GlobalExceptionHandler.java b/code/link56/link56-backend/src/main/java/cn/link56/common/exception/GlobalExceptionHandler.java index 965904b1..423377a7 100644 --- a/code/link56/link56-backend/src/main/java/cn/link56/common/exception/GlobalExceptionHandler.java +++ b/code/link56/link56-backend/src/main/java/cn/link56/common/exception/GlobalExceptionHandler.java @@ -82,8 +82,8 @@ public class GlobalExceptionHandler { } // 自定义异常 - @ExceptionHandler(OperationTooFrequentException.class) - public Result handleOperationTooFrequentException(OperationTooFrequentException e) { + @ExceptionHandler(BusinessException.class) + public Result handleOperationTooFrequentException(BusinessException e) { return Result.error(e.getMessage()); } @@ -92,8 +92,7 @@ public class GlobalExceptionHandler { */ @ExceptionHandler(value = Exception.class) public Result handleSystemException(Exception e) { - e.printStackTrace(); - log.error("捕获到全局异常:{}",e.getMessage()); - return Result.error(e.getMessage()); + log.error("系统异常", e ); + return Result.error(ResponseStatusConstants.SERVER_ERROR,"系统异常"); } } diff --git a/code/link56/link56-backend/src/main/java/cn/link56/common/exception/OperationTooFrequentException.java b/code/link56/link56-backend/src/main/java/cn/link56/common/exception/OperationTooFrequentException.java deleted file mode 100644 index bb24d3a3..00000000 --- a/code/link56/link56-backend/src/main/java/cn/link56/common/exception/OperationTooFrequentException.java +++ /dev/null @@ -1,11 +0,0 @@ -package cn.link56.common.exception; - -public class OperationTooFrequentException extends BusinessException { - public OperationTooFrequentException(String message) { - super(message); - } - - public OperationTooFrequentException() { - super("操作过于频繁,请稍后再试"); - } -} diff --git a/code/link56/link56-backend/src/main/java/cn/link56/entity/BArea.java b/code/link56/link56-backend/src/main/java/cn/link56/entity/BArea.java new file mode 100644 index 00000000..8180510c --- /dev/null +++ b/code/link56/link56-backend/src/main/java/cn/link56/entity/BArea.java @@ -0,0 +1,20 @@ +package cn.link56.entity; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class BArea { + 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; +} diff --git a/code/link56/link56-backend/src/main/java/cn/link56/auth/identity/model/BCompany.java b/code/link56/link56-backend/src/main/java/cn/link56/entity/BCompany.java similarity index 73% rename from code/link56/link56-backend/src/main/java/cn/link56/auth/identity/model/BCompany.java rename to code/link56/link56-backend/src/main/java/cn/link56/entity/BCompany.java index f8924c54..5e0c1534 100644 --- a/code/link56/link56-backend/src/main/java/cn/link56/auth/identity/model/BCompany.java +++ b/code/link56/link56-backend/src/main/java/cn/link56/entity/BCompany.java @@ -1,5 +1,6 @@ -package cn.link56.auth.identity.model; +package cn.link56.entity; +import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; @@ -19,32 +20,45 @@ import java.util.Date; public class BCompany { @TableId(value = "b_id") private Long id; + @TableField("b_name") private String name; + @TableField("b_email") private String email; + @TableField("b_phone") private String phone; + @TableField("b_address") private String address; + @TableField("b_industry") private String industry; + @TableField("b_logo") private String logo; + @TableField("b_profile") private String profile; + @TableField("b_description") private String description; - @TableField("b_create_by") - private Long createBy; - @TableField("b_create_time") + + @TableField(value = "b_create_time",fill = FieldFill.INSERT) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime; - @TableField("b_update_by") - private Long updateBy; - @TableField("b_update_time") + + @TableField(value = "b_update_time",fill = FieldFill.INSERT_UPDATE) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date updateTime; - @TableField("b_status") - private Integer status; + + @TableField("b_canuse") + private String canuse; + + @TableField("b_recommend") + private String recommend; + + @TableField("b_hot_recommend") + private String hotRecommend; } diff --git a/code/link56/link56-backend/src/main/java/cn/link56/auth/identity/model/BCompanyUser.java b/code/link56/link56-backend/src/main/java/cn/link56/entity/BCompanyUser.java similarity index 76% rename from code/link56/link56-backend/src/main/java/cn/link56/auth/identity/model/BCompanyUser.java rename to code/link56/link56-backend/src/main/java/cn/link56/entity/BCompanyUser.java index 2e362d3b..f25f4681 100644 --- a/code/link56/link56-backend/src/main/java/cn/link56/auth/identity/model/BCompanyUser.java +++ b/code/link56/link56-backend/src/main/java/cn/link56/entity/BCompanyUser.java @@ -1,5 +1,6 @@ -package cn.link56.auth.identity.model; +package cn.link56.entity; +import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; @@ -19,26 +20,33 @@ import java.util.Date; public class BCompanyUser { @TableId(value = "b_id") private Long id; - @TableId(value = "b_company_id") + + @TableField("b_company_id") private Long companyId; + @TableField("b_email") private String email; + @TableField("b_password") private String password; + + @TableField("b_name") + private String name; + @TableField("b_phone") private String phone; + @TableField("b_role") private Integer role; + @TableField("b_position") private String position; - @TableField("b_create_by") - private Long createBy; - @TableField("b_create_time") + + @TableField(value = "b_create_time",fill = FieldFill.INSERT) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime; - @TableField("b_update_by") - private Long updateBy; - @TableField("b_update_time") + + @TableField(value = "b_update_time",fill = FieldFill.INSERT_UPDATE) @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date updateTime; } diff --git a/code/link56/link56-backend/src/main/java/cn/link56/base/model/BIndustry.java b/code/link56/link56-backend/src/main/java/cn/link56/entity/BIndustry.java similarity index 95% rename from code/link56/link56-backend/src/main/java/cn/link56/base/model/BIndustry.java rename to code/link56/link56-backend/src/main/java/cn/link56/entity/BIndustry.java index cdf47a09..bac63ba4 100644 --- a/code/link56/link56-backend/src/main/java/cn/link56/base/model/BIndustry.java +++ b/code/link56/link56-backend/src/main/java/cn/link56/entity/BIndustry.java @@ -1,4 +1,4 @@ -package cn.link56.base.model; +package cn.link56.entity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; diff --git a/code/link56/link56-backend/src/main/resources/application-dev.yml b/code/link56/link56-backend/src/main/resources/application-dev.yml index 69a48fc9..e61485cb 100644 --- a/code/link56/link56-backend/src/main/resources/application-dev.yml +++ b/code/link56/link56-backend/src/main/resources/application-dev.yml @@ -4,9 +4,11 @@ spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: net.sourceforge.jtds.jdbc.Driver - url: jdbc:jtds:sqlserver://192.168.1.189:1433;databaseName=G3-Link +# url: jdbc:jtds:sqlserver://192.168.1.189:1433;databaseName=G3-Link + url: jdbc:jtds:sqlserver://117.72.182.135:1433;databaseName=G3-Link username: sa - password: "g3soft" +# password: "g3soft" + password: "zhang520.." # druid 连接池管理 druid: # 初始化时建立物理连接的个数 diff --git a/code/link56/link56-backend/src/main/resources/cn/link56/base/mapper/AreaMapper.xml b/code/link56/link56-backend/src/main/resources/cn/link56/base/mapper/AreaMapper.xml new file mode 100644 index 00000000..2fe42f35 --- /dev/null +++ b/code/link56/link56-backend/src/main/resources/cn/link56/base/mapper/AreaMapper.xml @@ -0,0 +1,27 @@ + + + + + + b_id AS id, + b_xh AS xh, + b_name AS name, + b_father_id AS fatherId, + b_canuse AS canuse, + b_bz AS bz, + b_field AS field, + b_order AS [order] + + + + + diff --git a/code/link56/link56-backend/src/main/resources/templates/Login.html b/code/link56/link56-backend/src/main/resources/templates/Login.html new file mode 100644 index 00000000..769bc125 --- /dev/null +++ b/code/link56/link56-backend/src/main/resources/templates/Login.html @@ -0,0 +1,522 @@ + + + + + + + + + + + + + + + +Use this link to reset your password. The link is only valid for 24 hours. + + + + + + + + \ No newline at end of file diff --git a/code/link56/link56-frontend-new/src/App.vue b/code/link56/link56-frontend-new/src/App.vue index b3d0cf28..9d1105c2 100644 --- a/code/link56/link56-frontend-new/src/App.vue +++ b/code/link56/link56-frontend-new/src/App.vue @@ -1,8 +1,8 @@ diff --git a/code/link56/link56-frontend-new/src/components/AreaSelect.vue b/code/link56/link56-frontend-new/src/components/AreaSelect.vue new file mode 100644 index 00000000..010298db --- /dev/null +++ b/code/link56/link56-frontend-new/src/components/AreaSelect.vue @@ -0,0 +1,39 @@ + + + + + diff --git a/code/link56/link56-frontend-new/src/components/IndustrySelect.vue b/code/link56/link56-frontend-new/src/components/IndustrySelect.vue new file mode 100644 index 00000000..009ebd3b --- /dev/null +++ b/code/link56/link56-frontend-new/src/components/IndustrySelect.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/code/link56/link56-frontend-new/src/components/QueryCompany.vue b/code/link56/link56-frontend-new/src/components/QueryCompany.vue index 942bab15..e440e30e 100644 --- a/code/link56/link56-frontend-new/src/components/QueryCompany.vue +++ b/code/link56/link56-frontend-new/src/components/QueryCompany.vue @@ -1,7 +1,9 @@ @@ -33,24 +72,51 @@ function handleSubmit() { 公司信息 - + - 公司全称:- +
+ 公司全称 + {{ company.name || '-' }} +
+ - 所属行业:- +
+ 所属行业 + + {{ company.industry?.join(',') || '-' }} + +
+ - 公司地址:- +
+ 公司地址 + + {{ company.address?.join('/') || '-' }} + +
+ - 联系电话:- +
+ 联系电话 + {{ company.phone || '-' }} +
+ - 公司邮箱:- +
+ 公司邮箱 + {{ company.email || '-' }} +
+ - 公司简介:- +
+ 公司简介 + {{ company.profile || '-' }} +
@@ -58,21 +124,45 @@ function handleSubmit() { 管理员信息 - + - 管理员名称:- +
+ 管理员名称 + {{ admin.name || '-' }} +
+ - 管理员电话:- +
+ 管理员电话 + {{ admin.phone || '-' }} +
+ - 管理员邮箱:- +
+ 管理员邮箱 + {{ admin.email || '-' }} +
+ - 登录密码:- +
+ 登录密码 + {{ showPassword ? admin.password : '******' }} + + + + + +
+ - 所属职务:- +
+ 所属职务 + {{ admin.position || '-' }} +
@@ -96,7 +186,7 @@ function handleSubmit() { > 上一步 - + 确认提交 @@ -113,6 +203,24 @@ function handleSubmit() { flex-direction: column; height: 100%; + .info-item { + display: flex; + font-size: 14px; + padding: 6px 0px; + } + + .info-label { + color: #71717a; + white-space: nowrap; + } + + .info-value { + color: #111827; + font-weight: 500; + word-break: break-all; + margin-left: 8px; + } + :deep(.el-col) { word-break: break-all; padding: 3px 0px; @@ -125,7 +233,7 @@ function handleSubmit() { .section-title { font-size: 17px; font-weight: 600; - padding-bottom: 6px; + padding: 16px 0px; border-bottom: 1px solid #e4e4e7; } .section-subtitle { @@ -134,6 +242,12 @@ function handleSubmit() { margin-bottom: 10px; } + .password { + margin-left: 6px; + cursor: pointer; + color: var(--el-color-primary); + } + .terms { display: flex; font-size: 14px; diff --git a/code/link56/link56-frontend-new/src/views/auth/register/index.vue b/code/link56/link56-frontend-new/src/views/auth/register/index.vue index ce84cedf..1932a574 100644 --- a/code/link56/link56-frontend-new/src/views/auth/register/index.vue +++ b/code/link56/link56-frontend-new/src/views/auth/register/index.vue @@ -1,7 +1,6 @@