From 9fb5e620b6f0d14d06f871c4b565939803ee08ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=93=86=E5=93=86=E5=92=AF=E5=93=86=E5=93=86=E5=92=AF?= <1754274446@qq.com> Date: Tue, 18 Mar 2025 17:03:43 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=8A=E4=BC=A0=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 珞珈岛-项目相关文件/luojia-island | 1 - .../luojia-island/.idea/.gitignore | 8 + .../luojia-island/.idea/compiler.xml | 22 ++ .../luojia-island/.idea/dataSources.xml | 31 +++ .../luojia-island/.idea/encodings.xml | 9 + .../luojia-island/.idea/jarRepositories.xml | 25 +++ .../luojia-island/.idea/misc.xml | 14 ++ .../luojia-island/.idea/settings.json | 17 ++ .../luojia-island/.idea/sqldialects.xml | 7 + .../luojia-island/.idea/uiDesigner.xml | 124 +++++++++++ .../luojia-island/common/pom.xml | 67 ++++++ .../common/advice/GlobalExceptionHandler.java | 22 ++ .../common/config/RedisConfig.java | 45 ++++ .../luojia_channel/common/domain/Result.java | 28 +++ .../luojia_channel/common/domain/UserDTO.java | 18 ++ .../common/exception/BaseException.java | 15 ++ .../common/exception/UserException.java | 7 + .../luojia_channel/common/utils/JWTUtil.java | 64 ++++++ .../common/utils/RedisUtil.java | 159 +++++++++++++ .../common/utils/UserContext.java | 36 +++ .../advice/GlobalExceptionHandler.class | Bin 0 -> 1705 bytes .../common/config/RedisConfig.class | Bin 0 -> 3210 bytes .../luojia_channel/common/domain/Result.class | Bin 0 -> 4201 bytes .../domain/UserDTO$UserDTOBuilder.class | Bin 0 -> 2376 bytes .../common/domain/UserDTO.class | Bin 0 -> 4329 bytes .../common/exception/BaseException.class | Bin 0 -> 813 bytes .../common/exception/UserException.class | Bin 0 -> 487 bytes .../luojia_channel/common/utils/JWTUtil.class | Bin 0 -> 4373 bytes .../common/utils/RedisUtil$ZSetItem.class | Bin 0 -> 3105 bytes .../common/utils/RedisUtil.class | Bin 0 -> 9965 bytes .../common/utils/UserContext.class | Bin 0 -> 2357 bytes .../common/target/common-1.0.0.jar | Bin 0 -> 22 bytes .../common/target/common-1.0.0.jar.original | Bin 0 -> 19401 bytes .../target/maven-archiver/pom.properties | 3 + .../compile/default-compile/createdFiles.lst | 11 + .../compile/default-compile/inputFiles.lst | 9 + .../luojia-island/pom.xml | 91 ++++++++ .../luojia-island/service/pom.xml | 85 +++++++ .../LuojiaChannelApplication.java | 15 ++ .../modules/user/Config/SecurityConfig.java | 30 +++ .../modules/user/constant/UserConstant.java | 12 + .../user/controller/UserInfoController.java | 4 + .../user/controller/UserLoginController.java | 37 ++++ .../modules/user/dto/UserLoginDTO.java | 10 + .../modules/user/dto/UserRegisterDTO.java | 10 + .../modules/user/entity/User.java | 79 +++++++ .../modules/user/mapper/UserMapper.java | 10 + .../modules/user/service/UserInfoService.java | 7 + .../user/service/UserLoginService.java | 20 ++ .../service/impl/UserInfoServiceImpl.java | 13 ++ .../service/impl/UserLoginServiceImpl.java | 209 ++++++++++++++++++ .../modules/user/utils/AnonymousUserUtil.java | 62 ++++++ .../src/main/resources/application-dev.yaml | 1 + .../src/main/resources/application-local.yaml | 29 +++ .../src/main/resources/application.yaml | 51 +++++ .../src/main/resources/db/luojia_channel.sql | 21 ++ .../main/resources/mapper/user/UserMapper.xml | 6 + .../LuojiaChannelApplicationTests.java | 14 ++ .../target/classes/application-dev.yaml | 1 + .../target/classes/application-local.yaml | 29 +++ .../service/target/classes/application.yaml | 51 +++++ .../LuojiaChannelApplication.class | Bin 0 -> 869 bytes .../modules/user/Config/SecurityConfig.class | Bin 0 -> 4173 bytes .../modules/user/constant/UserConstant.class | Bin 0 -> 578 bytes .../user/controller/UserInfoController.class | Bin 0 -> 365 bytes .../user/controller/UserLoginController.class | Bin 0 -> 2539 bytes .../modules/user/dto/UserLoginDTO.class | Bin 0 -> 2418 bytes .../modules/user/dto/UserRegisterDTO.class | Bin 0 -> 2873 bytes .../modules/user/entity/User.class | Bin 0 -> 8753 bytes .../modules/user/mapper/UserMapper.class | Bin 0 -> 413 bytes .../user/service/UserInfoService.class | Bin 0 -> 351 bytes .../user/service/UserLoginService.class | Bin 0 -> 816 bytes .../service/impl/UserInfoServiceImpl.class | Bin 0 -> 800 bytes .../service/impl/UserLoginServiceImpl.class | Bin 0 -> 9326 bytes .../user/utils/AnonymousUserUtil.class | Bin 0 -> 3249 bytes .../target/classes/db/luojia_channel.sql | 21 ++ .../target/classes/mapper/user/UserMapper.xml | 6 + .../LuojiaChannelApplicationTests.class | Bin 0 -> 576 bytes 78 files changed, 1665 insertions(+), 1 deletion(-) delete mode 160000 珞珈岛-项目相关文件/luojia-island create mode 100644 珞珈岛-项目相关文件/luojia-island/.idea/.gitignore create mode 100644 珞珈岛-项目相关文件/luojia-island/.idea/compiler.xml create mode 100644 珞珈岛-项目相关文件/luojia-island/.idea/dataSources.xml create mode 100644 珞珈岛-项目相关文件/luojia-island/.idea/encodings.xml create mode 100644 珞珈岛-项目相关文件/luojia-island/.idea/jarRepositories.xml create mode 100644 珞珈岛-项目相关文件/luojia-island/.idea/misc.xml create mode 100644 珞珈岛-项目相关文件/luojia-island/.idea/settings.json create mode 100644 珞珈岛-项目相关文件/luojia-island/.idea/sqldialects.xml create mode 100644 珞珈岛-项目相关文件/luojia-island/.idea/uiDesigner.xml create mode 100644 珞珈岛-项目相关文件/luojia-island/common/pom.xml create mode 100644 珞珈岛-项目相关文件/luojia-island/common/src/main/java/com/luojia_channel/common/advice/GlobalExceptionHandler.java create mode 100644 珞珈岛-项目相关文件/luojia-island/common/src/main/java/com/luojia_channel/common/config/RedisConfig.java create mode 100644 珞珈岛-项目相关文件/luojia-island/common/src/main/java/com/luojia_channel/common/domain/Result.java create mode 100644 珞珈岛-项目相关文件/luojia-island/common/src/main/java/com/luojia_channel/common/domain/UserDTO.java create mode 100644 珞珈岛-项目相关文件/luojia-island/common/src/main/java/com/luojia_channel/common/exception/BaseException.java create mode 100644 珞珈岛-项目相关文件/luojia-island/common/src/main/java/com/luojia_channel/common/exception/UserException.java create mode 100644 珞珈岛-项目相关文件/luojia-island/common/src/main/java/com/luojia_channel/common/utils/JWTUtil.java create mode 100644 珞珈岛-项目相关文件/luojia-island/common/src/main/java/com/luojia_channel/common/utils/RedisUtil.java create mode 100644 珞珈岛-项目相关文件/luojia-island/common/src/main/java/com/luojia_channel/common/utils/UserContext.java create mode 100644 珞珈岛-项目相关文件/luojia-island/common/target/classes/com/luojia_channel/common/advice/GlobalExceptionHandler.class create mode 100644 珞珈岛-项目相关文件/luojia-island/common/target/classes/com/luojia_channel/common/config/RedisConfig.class create mode 100644 珞珈岛-项目相关文件/luojia-island/common/target/classes/com/luojia_channel/common/domain/Result.class create mode 100644 珞珈岛-项目相关文件/luojia-island/common/target/classes/com/luojia_channel/common/domain/UserDTO$UserDTOBuilder.class create mode 100644 珞珈岛-项目相关文件/luojia-island/common/target/classes/com/luojia_channel/common/domain/UserDTO.class create mode 100644 珞珈岛-项目相关文件/luojia-island/common/target/classes/com/luojia_channel/common/exception/BaseException.class create mode 100644 珞珈岛-项目相关文件/luojia-island/common/target/classes/com/luojia_channel/common/exception/UserException.class create mode 100644 珞珈岛-项目相关文件/luojia-island/common/target/classes/com/luojia_channel/common/utils/JWTUtil.class create mode 100644 珞珈岛-项目相关文件/luojia-island/common/target/classes/com/luojia_channel/common/utils/RedisUtil$ZSetItem.class create mode 100644 珞珈岛-项目相关文件/luojia-island/common/target/classes/com/luojia_channel/common/utils/RedisUtil.class create mode 100644 珞珈岛-项目相关文件/luojia-island/common/target/classes/com/luojia_channel/common/utils/UserContext.class create mode 100644 珞珈岛-项目相关文件/luojia-island/common/target/common-1.0.0.jar create mode 100644 珞珈岛-项目相关文件/luojia-island/common/target/common-1.0.0.jar.original create mode 100644 珞珈岛-项目相关文件/luojia-island/common/target/maven-archiver/pom.properties create mode 100644 珞珈岛-项目相关文件/luojia-island/common/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 珞珈岛-项目相关文件/luojia-island/common/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 珞珈岛-项目相关文件/luojia-island/pom.xml create mode 100644 珞珈岛-项目相关文件/luojia-island/service/pom.xml create mode 100644 珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/LuojiaChannelApplication.java create mode 100644 珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/Config/SecurityConfig.java create mode 100644 珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/constant/UserConstant.java create mode 100644 珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/controller/UserInfoController.java create mode 100644 珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/controller/UserLoginController.java create mode 100644 珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/dto/UserLoginDTO.java create mode 100644 珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/dto/UserRegisterDTO.java create mode 100644 珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/entity/User.java create mode 100644 珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/mapper/UserMapper.java create mode 100644 珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/service/UserInfoService.java create mode 100644 珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/service/UserLoginService.java create mode 100644 珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/service/impl/UserInfoServiceImpl.java create mode 100644 珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/service/impl/UserLoginServiceImpl.java create mode 100644 珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/utils/AnonymousUserUtil.java create mode 100644 珞珈岛-项目相关文件/luojia-island/service/src/main/resources/application-dev.yaml create mode 100644 珞珈岛-项目相关文件/luojia-island/service/src/main/resources/application-local.yaml create mode 100644 珞珈岛-项目相关文件/luojia-island/service/src/main/resources/application.yaml create mode 100644 珞珈岛-项目相关文件/luojia-island/service/src/main/resources/db/luojia_channel.sql create mode 100644 珞珈岛-项目相关文件/luojia-island/service/src/main/resources/mapper/user/UserMapper.xml create mode 100644 珞珈岛-项目相关文件/luojia-island/service/src/test/java/com/luojia/luojia_channel/LuojiaChannelApplicationTests.java create mode 100644 珞珈岛-项目相关文件/luojia-island/service/target/classes/application-dev.yaml create mode 100644 珞珈岛-项目相关文件/luojia-island/service/target/classes/application-local.yaml create mode 100644 珞珈岛-项目相关文件/luojia-island/service/target/classes/application.yaml create mode 100644 珞珈岛-项目相关文件/luojia-island/service/target/classes/com/luojia_channel/LuojiaChannelApplication.class create mode 100644 珞珈岛-项目相关文件/luojia-island/service/target/classes/com/luojia_channel/modules/user/Config/SecurityConfig.class create mode 100644 珞珈岛-项目相关文件/luojia-island/service/target/classes/com/luojia_channel/modules/user/constant/UserConstant.class create mode 100644 珞珈岛-项目相关文件/luojia-island/service/target/classes/com/luojia_channel/modules/user/controller/UserInfoController.class create mode 100644 珞珈岛-项目相关文件/luojia-island/service/target/classes/com/luojia_channel/modules/user/controller/UserLoginController.class create mode 100644 珞珈岛-项目相关文件/luojia-island/service/target/classes/com/luojia_channel/modules/user/dto/UserLoginDTO.class create mode 100644 珞珈岛-项目相关文件/luojia-island/service/target/classes/com/luojia_channel/modules/user/dto/UserRegisterDTO.class create mode 100644 珞珈岛-项目相关文件/luojia-island/service/target/classes/com/luojia_channel/modules/user/entity/User.class create mode 100644 珞珈岛-项目相关文件/luojia-island/service/target/classes/com/luojia_channel/modules/user/mapper/UserMapper.class create mode 100644 珞珈岛-项目相关文件/luojia-island/service/target/classes/com/luojia_channel/modules/user/service/UserInfoService.class create mode 100644 珞珈岛-项目相关文件/luojia-island/service/target/classes/com/luojia_channel/modules/user/service/UserLoginService.class create mode 100644 珞珈岛-项目相关文件/luojia-island/service/target/classes/com/luojia_channel/modules/user/service/impl/UserInfoServiceImpl.class create mode 100644 珞珈岛-项目相关文件/luojia-island/service/target/classes/com/luojia_channel/modules/user/service/impl/UserLoginServiceImpl.class create mode 100644 珞珈岛-项目相关文件/luojia-island/service/target/classes/com/luojia_channel/modules/user/utils/AnonymousUserUtil.class create mode 100644 珞珈岛-项目相关文件/luojia-island/service/target/classes/db/luojia_channel.sql create mode 100644 珞珈岛-项目相关文件/luojia-island/service/target/classes/mapper/user/UserMapper.xml create mode 100644 珞珈岛-项目相关文件/luojia-island/service/target/test-classes/com/luojia/luojia_channel/LuojiaChannelApplicationTests.class diff --git a/珞珈岛-项目相关文件/luojia-island b/珞珈岛-项目相关文件/luojia-island deleted file mode 160000 index 2e2880c..0000000 --- a/珞珈岛-项目相关文件/luojia-island +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 2e2880c728025949cb342f72f73d95d2cce8fd1d diff --git a/珞珈岛-项目相关文件/luojia-island/.idea/.gitignore b/珞珈岛-项目相关文件/luojia-island/.idea/.gitignore new file mode 100644 index 0000000..35410ca --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/.idea/.gitignore @@ -0,0 +1,8 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/珞珈岛-项目相关文件/luojia-island/.idea/compiler.xml b/珞珈岛-项目相关文件/luojia-island/.idea/compiler.xml new file mode 100644 index 0000000..894b4bb --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/.idea/compiler.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/珞珈岛-项目相关文件/luojia-island/.idea/dataSources.xml b/珞珈岛-项目相关文件/luojia-island/.idea/dataSources.xml new file mode 100644 index 0000000..2cdd411 --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/.idea/dataSources.xml @@ -0,0 +1,31 @@ + + + + + mysql.8 + true + true + com.mysql.cj.jdbc.Driver + jdbc:mysql://192.168.59.129:3306/luojia_channel?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai + + + + + + $ProjectFileDir$ + + + redis + true + true + jdbc.RedisDriver + jdbc:redis://192.168.59.129:6379/0 + + + + + + $ProjectFileDir$ + + + \ No newline at end of file diff --git a/珞珈岛-项目相关文件/luojia-island/.idea/encodings.xml b/珞珈岛-项目相关文件/luojia-island/.idea/encodings.xml new file mode 100644 index 0000000..e845c72 --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/.idea/encodings.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/珞珈岛-项目相关文件/luojia-island/.idea/jarRepositories.xml b/珞珈岛-项目相关文件/luojia-island/.idea/jarRepositories.xml new file mode 100644 index 0000000..c7ea920 --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/.idea/jarRepositories.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/珞珈岛-项目相关文件/luojia-island/.idea/misc.xml b/珞珈岛-项目相关文件/luojia-island/.idea/misc.xml new file mode 100644 index 0000000..82dbec8 --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/珞珈岛-项目相关文件/luojia-island/.idea/settings.json b/珞珈岛-项目相关文件/luojia-island/.idea/settings.json new file mode 100644 index 0000000..152dce8 --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/.idea/settings.json @@ -0,0 +1,17 @@ + +{ + "luatools_path": "~/go/bin", + "dto_dir": "./ngx_conf/dto", + "swagger.docs.path": "./docs", + "swagger.excludes": "./client", + "swagger.file.type": "json", + "swagger.main.lua.path": "./main.lua", + "swagger.name": "swagger", + "swagger.search_dirs": "./ngx_conf,./config/cn/online", + "validator_dir": "./ngx_conf/validator", + "yapi.config.file": "docs/swagger-yapi.json", + "yapi.config.mode": "mergin", + "yapi.config.server": "https://api.yapi.net", + "yapi.config.token": "xxxxxxxxx" +} + \ No newline at end of file diff --git a/珞珈岛-项目相关文件/luojia-island/.idea/sqldialects.xml b/珞珈岛-项目相关文件/luojia-island/.idea/sqldialects.xml new file mode 100644 index 0000000..36966c2 --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/.idea/sqldialects.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/珞珈岛-项目相关文件/luojia-island/.idea/uiDesigner.xml b/珞珈岛-项目相关文件/luojia-island/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/珞珈岛-项目相关文件/luojia-island/common/pom.xml b/珞珈岛-项目相关文件/luojia-island/common/pom.xml new file mode 100644 index 0000000..cc28f5e --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/common/pom.xml @@ -0,0 +1,67 @@ + + + 4.0.0 + + com.luojia + luojia_channel + 1.0.0 + + + common + + + + + + org.redisson + redisson-spring-boot-starter + + + + + org.apache.commons + commons-lang3 + 3.14.0 + + + com.alibaba + transmittable-thread-local + 2.13.0 + + + + io.jsonwebtoken + jjwt-api + 0.11.5 + + + io.jsonwebtoken + jjwt-impl + 0.11.5 + runtime + + + io.jsonwebtoken + jjwt-jackson + 0.11.5 + runtime + + + + org.springframework + spring-web + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/珞珈岛-项目相关文件/luojia-island/common/src/main/java/com/luojia_channel/common/advice/GlobalExceptionHandler.java b/珞珈岛-项目相关文件/luojia-island/common/src/main/java/com/luojia_channel/common/advice/GlobalExceptionHandler.java new file mode 100644 index 0000000..7034f3b --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/common/src/main/java/com/luojia_channel/common/advice/GlobalExceptionHandler.java @@ -0,0 +1,22 @@ +package com.luojia_channel.common.advice; + + +import com.luojia_channel.common.domain.Result; +import com.luojia_channel.common.exception.BaseException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +// 全局异常处理 +@Slf4j +@RestControllerAdvice +public class GlobalExceptionHandler { + // 处理自定义业务异常 + @ExceptionHandler(BaseException.class) + public Object handleBadRequestException(BaseException e) { + log.error("自定义异常 -> {} , 异常原因:{} ",e.getClass().getName(), e.getMessage()); + log.debug("", e); + return Result.fail(e.getErrorCode(), e.getErrorMessage()); + } + +} diff --git a/珞珈岛-项目相关文件/luojia-island/common/src/main/java/com/luojia_channel/common/config/RedisConfig.java b/珞珈岛-项目相关文件/luojia-island/common/src/main/java/com/luojia_channel/common/config/RedisConfig.java new file mode 100644 index 0000000..4502db3 --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/common/src/main/java/com/luojia_channel/common/config/RedisConfig.java @@ -0,0 +1,45 @@ +package com.luojia_channel.common.config; + +import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer; +import org.redisson.Redisson; +import org.redisson.api.RedissonClient; +import org.redisson.config.Config; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +@Configuration +public class RedisConfig { + @Bean + public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { + + RedisTemplate redisTemplate = new RedisTemplate<>(); + redisTemplate.setConnectionFactory(redisConnectionFactory); + // 设置key和value的序列化规则 + redisTemplate.setKeySerializer(new StringRedisSerializer()); + redisTemplate.setValueSerializer(new GenericFastJsonRedisSerializer()); + redisTemplate.setHashKeySerializer(new StringRedisSerializer()); + redisTemplate.setHashValueSerializer(new GenericFastJsonRedisSerializer()); + + return redisTemplate; + } + + // Redisson分布式锁 + @Value("${spring.data.redis.host}") + private String host; + @Value("${spring.data.redis.port}") + private String port; + @Value("${spring.data.redis.password}") + private String password; + @Bean + public RedissonClient redissonClient(){ + //配置 + Config config=new Config(); + config.useSingleServer().setAddress("redis://"+host+":"+port).setPassword(password); + //创建对并且返回 + return Redisson.create(config); + } +} diff --git a/珞珈岛-项目相关文件/luojia-island/common/src/main/java/com/luojia_channel/common/domain/Result.java b/珞珈岛-项目相关文件/luojia-island/common/src/main/java/com/luojia_channel/common/domain/Result.java new file mode 100644 index 0000000..5c754b5 --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/common/src/main/java/com/luojia_channel/common/domain/Result.java @@ -0,0 +1,28 @@ +package com.luojia_channel.common.domain; + +import lombok.Data; + +// 统一返回前端的结果 +@Data +public class Result { + private int code; + private String msg; + private T data; + public Result(int code, String msg, T data) { + this.code = code; + this.msg = msg; + this.data = data; + } + public static Result success(T data) { + return new Result<>(200, "success", data); + } + public static Result success() { + return new Result<>(200, "success", null); + } + public static Result fail(String msg) { + return new Result<>(500, msg, null); + } + public static Result fail(int code, String msg) { + return new Result<>(code, msg, null); + } +} diff --git a/珞珈岛-项目相关文件/luojia-island/common/src/main/java/com/luojia_channel/common/domain/UserDTO.java b/珞珈岛-项目相关文件/luojia-island/common/src/main/java/com/luojia_channel/common/domain/UserDTO.java new file mode 100644 index 0000000..d50c889 --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/common/src/main/java/com/luojia_channel/common/domain/UserDTO.java @@ -0,0 +1,18 @@ +package com.luojia_channel.common.domain; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Builder +public class UserDTO { + private Long userId; + private String username; + private String email; + private String studentId; + private String token; +} diff --git a/珞珈岛-项目相关文件/luojia-island/common/src/main/java/com/luojia_channel/common/exception/BaseException.java b/珞珈岛-项目相关文件/luojia-island/common/src/main/java/com/luojia_channel/common/exception/BaseException.java new file mode 100644 index 0000000..76fc30a --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/common/src/main/java/com/luojia_channel/common/exception/BaseException.java @@ -0,0 +1,15 @@ +package com.luojia_channel.common.exception; + +import lombok.Getter; + +@Getter +public class BaseException extends RuntimeException { + private final int errorCode; + private final String errorMessage; + + public BaseException(int errorCode, String errorMessage) { + super(errorMessage); + this.errorCode = errorCode; + this.errorMessage = errorMessage; + } +} \ No newline at end of file diff --git a/珞珈岛-项目相关文件/luojia-island/common/src/main/java/com/luojia_channel/common/exception/UserException.java b/珞珈岛-项目相关文件/luojia-island/common/src/main/java/com/luojia_channel/common/exception/UserException.java new file mode 100644 index 0000000..b243e3e --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/common/src/main/java/com/luojia_channel/common/exception/UserException.java @@ -0,0 +1,7 @@ +package com.luojia_channel.common.exception; + +public class UserException extends BaseException{ + public UserException(String msg){ + super(500, msg); + } +} diff --git a/珞珈岛-项目相关文件/luojia-island/common/src/main/java/com/luojia_channel/common/utils/JWTUtil.java b/珞珈岛-项目相关文件/luojia-island/common/src/main/java/com/luojia_channel/common/utils/JWTUtil.java new file mode 100644 index 0000000..a29793f --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/common/src/main/java/com/luojia_channel/common/utils/JWTUtil.java @@ -0,0 +1,64 @@ +package com.luojia_channel.common.utils; + +import com.alibaba.fastjson.JSON; +import com.luojia_channel.common.domain.UserDTO; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.ExpiredJwtException; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.StringUtils; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +@Slf4j +public final class JWTUtil { + + private static final long EXPIRATION = 86400L; + private static final String USER_ID_KEY = "userId"; + private static final String USER_NAME_KEY = "username"; + public static final String TOKEN_PREFIX = "Bearer "; + public static final String ISS = "luojiachannel"; + //后缀加了点字符保证密钥>=512位,其他无更改 + public static final String SECRET = "SecretKeyCreatedByForely0234523935489354315795647652568575435297576extrastringluojiachannel"; + + /** + * 生成用户 Token + */ + public static String generateAccessToken(UserDTO userInfo) { + Map customerUserMap = new HashMap<>(); + customerUserMap.put(USER_ID_KEY, userInfo.getUserId()); + customerUserMap.put(USER_NAME_KEY, userInfo.getUsername()); + String jwtToken = Jwts.builder() + .signWith(SignatureAlgorithm.HS512, SECRET) + .setIssuedAt(new Date()) + .setIssuer(ISS) + .setSubject(JSON.toJSONString(customerUserMap)) + .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION * 1000)) + .compact(); + return TOKEN_PREFIX + jwtToken; + } + + /** + * 解析用户 Token + */ + public static UserDTO parseJwtToken(String jwtToken) { + if (StringUtils.hasText(jwtToken)) { + String actualJwtToken = jwtToken.replace(TOKEN_PREFIX, ""); + try { + Claims claims = Jwts.parser().setSigningKey(SECRET).parseClaimsJws(actualJwtToken).getBody(); + Date expiration = claims.getExpiration(); + if (expiration.after(new Date())) { + String subject = claims.getSubject(); + return JSON.parseObject(subject, UserDTO.class); + } + } catch (ExpiredJwtException ignored) { + } catch (Exception ex) { + log.error("JWT Token解析失败,请检查", ex); + } + } + return null; + } +} \ No newline at end of file diff --git a/珞珈岛-项目相关文件/luojia-island/common/src/main/java/com/luojia_channel/common/utils/RedisUtil.java b/珞珈岛-项目相关文件/luojia-island/common/src/main/java/com/luojia_channel/common/utils/RedisUtil.java new file mode 100644 index 0000000..70b00f4 --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/common/src/main/java/com/luojia_channel/common/utils/RedisUtil.java @@ -0,0 +1,159 @@ +package com.luojia_channel.common.utils; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.RequiredArgsConstructor; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ZSetOperations; +import org.springframework.stereotype.Component; + +import java.util.Collections; +import java.util.List; +import java.util.Set; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +@Component +@RequiredArgsConstructor +public class RedisUtil { + + private final RedisTemplate redisTemplate; + private static final Long DEFAULT_TIMEOUT = 30000L; + private static final TimeUnit DEFAULT_TIME_UNIT = TimeUnit.MILLISECONDS; + + /** + * redis基础操作 + */ + + public T get(String key, Class type) { + Object value = redisTemplate.opsForValue().get(key); + return value != null ? type.cast(value) : null; + } + + public void set(String key, Object value) { + redisTemplate.opsForValue().set(key, value, DEFAULT_TIMEOUT, DEFAULT_TIME_UNIT); + } + + public void set(String key, Object value, long timeout, TimeUnit unit) { + redisTemplate.opsForValue().set(key, value, timeout, unit); + } + + public void expire(String key, long time, TimeUnit timeUnit) { + redisTemplate.expire(key, time, timeUnit); + } + + public void delete(String key) { + redisTemplate.delete(key); + } + + /** + * set操作 + */ + private List convertSetToList(Set set) { + if(set == null || set.isEmpty()){ + return Collections.emptyList(); + } + return set.stream().map(obj -> (T) obj).collect(Collectors.toList()); + } + + public void sAdd(String key, Object... values) { + redisTemplate.opsForSet().add(key, values); + } + + public void sRemove(String key, Object... values) { + redisTemplate.opsForSet().remove(key, values); + } + + public List sGet(String key) { + Set members = redisTemplate.opsForSet().members(key); + return convertSetToList(members); + } + + public Boolean sIsMember(String key, Object value){ + return redisTemplate.opsForSet().isMember(key, value); + } + + public List sCommon(String key, String otherKey){ + Set intersect = redisTemplate.opsForSet().intersect(key, otherKey); + return convertSetToList(intersect); + } + + + /** + * zSet操作 + */ + // 带分数的结果包装类 + @Data + @AllArgsConstructor + public static class ZSetItem { + private T value; + private Double score; + } + private List> convertTuples(Set> tuples) { + if(tuples == null || tuples.isEmpty()){ + return Collections.emptyList(); + } + return tuples.stream() + .map(tuple -> new ZSetItem( + (T) tuple.getValue(), + tuple.getScore() != null ? tuple.getScore() : 0.0 + )) + .collect(Collectors.toList()); + } + + // 添加元素 + public Boolean zAdd(String key, Object value, double score) { + return redisTemplate.opsForZSet().add(key, value, score); + } + + public Boolean zAdd(String key, Object value, double score, long timeout, TimeUnit unit) { + Boolean result = redisTemplate.opsForZSet().add(key, value, score); + if (Boolean.TRUE.equals(result)) { + redisTemplate.expire(key, timeout, unit); + } + return result; + } + + // 获取范围 + public List zRange(String key, long start, long end) { + Set values = redisTemplate.opsForZSet().range(key, start, end); + return convertSetToList(values); + } + + public List zRevRange(String key, long start, long end) { + Set values = redisTemplate.opsForZSet().reverseRange(key, start, end); + return convertSetToList(values); + } + + // 带分数查询(用于热度计算) + public List> zRangeWithScores(String key, long start, long end) { + Set> typedTuples = redisTemplate.opsForZSet().rangeWithScores(key, start, end); + return convertTuples(typedTuples); + } + + // 增减分数(用于点赞数统计) + public Double zIncrScore(String key, Object value, double delta) { + return redisTemplate.opsForZSet().incrementScore(key, value, delta); + } + + // 删除元素 + public Long zRemove(String key, Object... values) { + return redisTemplate.opsForZSet().remove(key, values); + } + + // 获取排名(用于热榜) + public Long zRank(String key, Object value) { + return redisTemplate.opsForZSet().rank(key, value); + } + + public Long zRevRank(String key, Object value) { + return redisTemplate.opsForZSet().reverseRank(key, value); + } + + // 获取集合大小 + public Long zCard(String key) { + return redisTemplate.opsForZSet().zCard(key); + } + + +} \ No newline at end of file diff --git a/珞珈岛-项目相关文件/luojia-island/common/src/main/java/com/luojia_channel/common/utils/UserContext.java b/珞珈岛-项目相关文件/luojia-island/common/src/main/java/com/luojia_channel/common/utils/UserContext.java new file mode 100644 index 0000000..64d92fc --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/common/src/main/java/com/luojia_channel/common/utils/UserContext.java @@ -0,0 +1,36 @@ +package com.luojia_channel.common.utils; + +import com.alibaba.ttl.TransmittableThreadLocal; +import com.luojia_channel.common.domain.UserDTO; + +import java.util.Optional; + +// 用户上下文 +public final class UserContext { + + private static final ThreadLocal USER_THREAD_LOCAL = new TransmittableThreadLocal<>(); + void setUser(UserDTO user) { + USER_THREAD_LOCAL.set(user); + } + + public static Long getUserId() { + UserDTO userInfoDTO = USER_THREAD_LOCAL.get(); + return Optional.ofNullable(userInfoDTO).map(UserDTO::getUserId).orElse(null); + } + + + public static String getUsername() { + UserDTO userInfoDTO = USER_THREAD_LOCAL.get(); + return Optional.ofNullable(userInfoDTO).map(UserDTO::getUsername).orElse(null); + } + + + public static String getToken() { + UserDTO userInfoDTO = USER_THREAD_LOCAL.get(); + return Optional.ofNullable(userInfoDTO).map(UserDTO::getToken).orElse(null); + } + + public static void removeUser() { + USER_THREAD_LOCAL.remove(); + } +} diff --git a/珞珈岛-项目相关文件/luojia-island/common/target/classes/com/luojia_channel/common/advice/GlobalExceptionHandler.class b/珞珈岛-项目相关文件/luojia-island/common/target/classes/com/luojia_channel/common/advice/GlobalExceptionHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..e387a870ad639b75a6af312888c514043c3c6a74 GIT binary patch literal 1705 zcmbVMU2hvj6g`vJS;yHX#pwqjKpmjePSP%=g_1fABx#ZcoU}?Szwm&@yAylU^-fu@ z6A7H~s)D z6SVY}FF$hYG7MGV(AChPBfV|kRnAJFt1?*n#8vlVUxznj=mjcbvOw1aa%COWoMy0j zdCMv5T1`cz42A`!9)03nzD{`%YYH{bpB@IHNc zgW$N0=a3V~)Kt6}$YxVuv`{Sn3#Q{NWpM&0Eu6A(8qW)i9M~7I7{4wXO5ntQ!f(fs zAJ!QE0>&-8XyYXlfAMhi>M>wvK{nMse1R-0tf^*G*3=NrAa7y9#w&Q0)E}fmAg!WE zldPFS50vCAJ)Z7Om7eqzD;b;>;9Z@;IU5BOnbT9%7O9^+I_I5wq<3UBP^DtUz@D-( zjq?IF&%b0&wWvMPL`|%kZO6tN9ZDZ>Cm6GM6PGMpw(%C;7C3h}W1enEKXf)!vlUQv zsZHqz0&|7c9#{$VV)+@<@WS4~jD@QBc(xRA7+j?g~)gY%eoi;S`_L zslfO~D~$byS`D}TrcbKo!%)Z4$ejAil>^buU03RNUy<&}u4%i2iU57m0BQB~0$ z!*Qn(Tp3hkwPqF+;SU3<4=#IB1~M7U!Kt(B*cdbN8G_e?i#nvfkG-F0?U)v5ZS=WqZe z7vSvUOePMwNN>xa#gk@c-5?oh+1t7mxoX)rcQF3+S#`lo2`cfKOH;z}q7LIo2OM?t zojF*-1Se-7XRctkaCXvO<7$9*j<%nc1DNl3xpHXPwn$I@3h@*F^x-|e%{Fih^L(2G z`~VABq!qZ1B_=V!b)-6lrhkT&J2v$IBM&f2Gq#79Q!vigruOi9Kj@p}b72=3e`H*@ z#xS#h!}KI_$YZoq>r^*iQVSde%UEH}8~idYxByo94Ab>KpASBSaQQ(7<$XjG^qb#c cF0+d(zrZr6L=UPV)>xyj59^&|2J21WA1vqA9{>OV literal 0 HcmV?d00001 diff --git a/珞珈岛-项目相关文件/luojia-island/common/target/classes/com/luojia_channel/common/config/RedisConfig.class b/珞珈岛-项目相关文件/luojia-island/common/target/classes/com/luojia_channel/common/config/RedisConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..658a2e96ea2d913cc01a876cecd52e9debafbb07 GIT binary patch literal 3210 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 CjxX5& literal 0 HcmV?d00001 diff --git a/珞珈岛-项目相关文件/luojia-island/common/target/classes/com/luojia_channel/common/domain/UserDTO$UserDTOBuilder.class b/珞珈岛-项目相关文件/luojia-island/common/target/classes/com/luojia_channel/common/domain/UserDTO$UserDTOBuilder.class new file mode 100644 index 0000000000000000000000000000000000000000..d8feba1ba2232aebbee18d5c8cb52f0f75c09059 GIT binary patch literal 2376 zcmcJR|85gU5XZmkB(~!o#DtJECZ*5@YKN5TZ%R#|#8JSifr_N5D*ixg--=vv-i_|o zk$96nMk`SvQK=8mhpIZ`+cxL;gsh_eaksm3v!9urnH}Aqf4%+#zy`J|C}66DX%90f z3RDl|vGgOUpZkxy2dZZUinl`@+B*VM^~T;T%9t&o;^7^50ylf6??(f35Xxu0eW|sI zd=mAI_5;(Gq4s}BRJ^tOc-4)YgD?tIOw<8=Xa{7mb7Hb%^z$a0IO|~!Re>^VY1vl- z^BKJz8;4GF-ots;oKa*h;=LC%U1Fd-If%%O0-a1A(Q!JX9^Cd(!?G+I^ZOR%)9FME{=$6Qs7V{@HQt4D)=SH-)M zHnO(q$!Jf;A+Mcq+U|!$y49I99j9uE41PBjlEz!mst=XjH^KKZroyu-Cg&bz4Y(}7 zjft5q-vfd5`s5TkXW5$6xWEGKJh?c|C4tJ08N@xc9dfumcj<1hBJF;p68pd;bf>GE z#@NKh@+duPGFQY`72L$vCEVf){6=8)1Rv^Sx;1`kB`wNr*|R2oA@FlHG)^&vK9D+y zRI=JJ=5TP-9CtS(8QHk|;z;GFKh5Z;&8eA2V z*bwWNdBz=v=ffVtlYd(WFNPgsLo_I$ZR&7wE0Rf~s4C8mLQD8o;Obb^@`6#qrog2) zt5T0lBS+~dQKU#`5m>N)?QMIU*Zfs=jd6WXXzDI@{^v{&q{9n z`1r)}x2VFHUnABS`!(JN-bAnE&}Z-|@e25CFrWi@<3W0@>|Nl%mhlz@5CEz_^S N9n9h`?xBU{zX1fg{e=Jk literal 0 HcmV?d00001 diff --git a/珞珈岛-项目相关文件/luojia-island/common/target/classes/com/luojia_channel/common/domain/UserDTO.class b/珞珈岛-项目相关文件/luojia-island/common/target/classes/com/luojia_channel/common/domain/UserDTO.class new file mode 100644 index 0000000000000000000000000000000000000000..27bd2fabcb34fccb3894a4c36e951a419cd4bb35 GIT binary patch literal 4329 zcmbVQU2_{(8Geqvt6jzJ zmh;d5zW-MMm+{ELh{8+Nuu-nJ!w0_mR&~z}07!ba9Y&cPTQg@u#ylcvo#t=AN$HXgVS-E!Rx z?w2>h;Qp#`PB@svl!7g&z-@R6Gb!A5)burS#=$d!G(FzGE@x*QoEA;C6}4+#5Utll z`>ca}jElm3FUV1I&cS(nhVQ7l!Hsv?Ze3w^A@!15yAQl-w7U4FfIsVC4$qVHz88sa z$RA#)}TV*g@|kCeP!`4!(kyNU`U(_SV80-O4Dg&oD(^c2L2p z!kLD<@2!PF)s0^FBZ7if zz-zjZS0mTVMp$+0cipBh6q?6~_Iw^Fp7@R=%C>sB^vn_GF5YGSY~rT4%$S;Il|1K*v*V&C(Z{274}z^PI%T*80~pYzDtZMbPCmpwcX`- zcQd)lL~lD$ei>iWU`&oB&XwI?Vi@F@$Ja1?r*vW+V|$|JL{V_ zXwN#!tLe4c^@y3%y=XR;k~?Jz`Ubf|>Rp+FX11d+aiYS#BLVqzxqbAM#3#2MwwqP& zrY||@NJC-MU6F1yrXbQdto8Tx65j2P9%w&$Z_06=*CSJaojGeMLKbv)2z8xcUvuw zZky0-dVpDIE4*;TO~b6W@B@YC{y&s?mbePfv(?VCeVQ1N5lCr7CRhCAT#BEZM)8yL zhtFwbIghUp_cgBO_>_P4pP}A(52L@QtnhXI&hQCxUe)q7K9vk1eX`7zAk5;QV9BwO z)Uk1_QR5^4T*nQr`iVGsh7gSp5=|US#F;dNXnK%n@>n9yu^~jK28pJQCF0y0LUd-3 zX!=;9n|KAIahNJ3lt5*Qr9)VM81S|oGo4Nl+S?L9NeG2ki8fi*jDCLz*71#D^y4R` zmptpz%c7tDo5Sg+Pf9Q8+ohL9KmEpV`co&Rm#XN}%c7rtb2$B(lhRAEb?If%PtUJs ziSN}14BI$E^iiq!TbRa^(%)eJ2IlCK(g(0Nmx@nuHeOPAZfl9ZD#r3ZFqSty#Pnl0 z%X#A|KG#89sF;LYsATe{U@{+K<}t?eW|En~2%t#ZG~34FuVculKsZ zUZ!nQzotZ2T#{~<>GCzZE-~o{afvS9+XL)MzDbjYO@m8k0#cWDWU94E~ z786OIvf{1t!^3_jxu&*p6hFgv@Lk$y;-~l?r4a_|$9Ri&k8-N*;cZF=XVoTLN+tvN zB6cZd5aA4}l&m<2|3dB)Dhvy@QVblF`h*m{^@u2DVRir=jM1;suuKZpLk?;+*y;!O z@IyBA5&OuI-l^exJUGxmYTY4oosLnA{#gmU1eu=_KP&uPd>>y01}9IFaLIH&tAo+s zo=nzKGI@T)pk&BCS9}kb;^|XdI>dN!`4H2^ym5$A#k_flBYiO&&!j8K*=|zL>6t{n z_-l&P#GL#A&9{jpeb|U4X_;o6{Ig~}yJWx!P#{P9DgSFADF*bum+-=a-8y&7%r)?R nzI_DunS9_)#F`KL_kGzzh-mO9m}=mL3d7b3KjU%A)g*pB zQ&wi;@IxX_t<;L4@=z*iA2V!p2G{3~t&wVS&>dE>jB1ElgcU>#`-#rtbf!-vf0sFM zc}{E$q!KS@*+`f-e3W{OPIx-xM!J2GEZeEf86FJ&yMY6S=8>>dJ$}Uv&x93*K+#0l z!|T3Eoo=6@U5vM{&SWmh{E1T9ayMv_v<9ipM*4mHLMUOl6=Om-t~fuZu-@q|Hq1~v z)-#ic=hCi;%Y!?kO*XZ3%3i~n0D^y sQtuPOj}!!OUKO7VJwKWsDEM1NwM{F-9o+p3sDAzjX!)O@dtR~q1Fz_*r~m)} literal 0 HcmV?d00001 diff --git a/珞珈岛-项目相关文件/luojia-island/common/target/classes/com/luojia_channel/common/exception/UserException.class b/珞珈岛-项目相关文件/luojia-island/common/target/classes/com/luojia_channel/common/exception/UserException.class new file mode 100644 index 0000000000000000000000000000000000000000..d98b1d1b0e17711ce91bf2f20f248a59a001ca7d GIT binary patch literal 487 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 literal 0 HcmV?d00001 diff --git a/珞珈岛-项目相关文件/luojia-island/common/target/classes/com/luojia_channel/common/utils/RedisUtil$ZSetItem.class b/珞珈岛-项目相关文件/luojia-island/common/target/classes/com/luojia_channel/common/utils/RedisUtil$ZSetItem.class new file mode 100644 index 0000000000000000000000000000000000000000..24ed7b98c0b1586eccc302fb77c138116f7799f4 GIT binary patch literal 3105 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 literal 0 HcmV?d00001 diff --git a/珞珈岛-项目相关文件/luojia-island/common/target/maven-archiver/pom.properties b/珞珈岛-项目相关文件/luojia-island/common/target/maven-archiver/pom.properties new file mode 100644 index 0000000..189506b --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/common/target/maven-archiver/pom.properties @@ -0,0 +1,3 @@ +artifactId=common +groupId=com.luojia +version=1.0.0 diff --git a/珞珈岛-项目相关文件/luojia-island/common/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/珞珈岛-项目相关文件/luojia-island/common/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..017e0fe --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/common/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,11 @@ +com\luojia\luojia_channel\advice\GlobalExceptionHandler.class +com\luojia\luojia_channel\domain\UserDTO.class +com\luojia\luojia_channel\utils\UserContext.class +com\luojia\luojia_channel\utils\JWTUtil.class +com\luojia\luojia_channel\config\RedisConfig.class +com\luojia\luojia_channel\utils\RedisUtil$ZSetItem.class +com\luojia\luojia_channel\domain\UserDTO$UserDTOBuilder.class +com\luojia\luojia_channel\exception\BaseException.class +com\luojia\luojia_channel\utils\RedisUtil.class +com\luojia\luojia_channel\domain\Result.class +com\luojia\luojia_channel\exception\UserException.class diff --git a/珞珈岛-项目相关文件/luojia-island/common/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/珞珈岛-项目相关文件/luojia-island/common/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..4ae004b --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/common/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,9 @@ +D:\javaCode\luojia_channel\common\src\main\java\com\luojia\luojia_channel\advice\GlobalExceptionHandler.java +D:\javaCode\luojia_channel\common\src\main\java\com\luojia\luojia_channel\config\RedisConfig.java +D:\javaCode\luojia_channel\common\src\main\java\com\luojia\luojia_channel\domain\Result.java +D:\javaCode\luojia_channel\common\src\main\java\com\luojia\luojia_channel\domain\UserDTO.java +D:\javaCode\luojia_channel\common\src\main\java\com\luojia\luojia_channel\exception\BaseException.java +D:\javaCode\luojia_channel\common\src\main\java\com\luojia\luojia_channel\exception\UserException.java +D:\javaCode\luojia_channel\common\src\main\java\com\luojia\luojia_channel\utils\JWTUtil.java +D:\javaCode\luojia_channel\common\src\main\java\com\luojia\luojia_channel\utils\RedisUtil.java +D:\javaCode\luojia_channel\common\src\main\java\com\luojia\luojia_channel\utils\UserContext.java diff --git a/珞珈岛-项目相关文件/luojia-island/pom.xml b/珞珈岛-项目相关文件/luojia-island/pom.xml new file mode 100644 index 0000000..19da1b9 --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/pom.xml @@ -0,0 +1,91 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.4.3 + + + + com.luojia + luojia_channel + pom + 1.0.0 + + common + service + + + + 17 + 2024.0.0 + 3.5.7 + 3.29.0 + 8.0.33 + + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + + + + org.redisson + redisson-spring-boot-starter + ${redisson.version} + + + + + mysql + mysql-connector-java + ${mysql.version} + + + + + + + + org.projectlombok + lombok + provided + + + + + com.alibaba + fastjson + 1.2.83 + + + + + cn.hutool + hutool-all + 5.8.24 + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/珞珈岛-项目相关文件/luojia-island/service/pom.xml b/珞珈岛-项目相关文件/luojia-island/service/pom.xml new file mode 100644 index 0000000..1192981 --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/service/pom.xml @@ -0,0 +1,85 @@ + + + 4.0.0 + + com.luojia + luojia_channel + 1.0.0 + + + service + + + + + com.luojia + common + 1.0.0 + + + + + org.springframework.boot + spring-boot-starter-web + + + + + com.baomidou + mybatis-plus-spring-boot3-starter + 3.5.7 + + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + + org.springframework.boot + spring-boot-starter-amqp + + + + + mysql + mysql-connector-java + + + + org.springframework.boot + spring-boot-starter-security + + + + + org.springframework.cloud + spring-cloud-starter-bootstrap + + + org.springframework.cloud + spring-cloud-starter-loadbalancer + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + \ No newline at end of file diff --git a/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/LuojiaChannelApplication.java b/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/LuojiaChannelApplication.java new file mode 100644 index 0000000..f5b5747 --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/LuojiaChannelApplication.java @@ -0,0 +1,15 @@ +package com.luojia_channel; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; + +@SpringBootApplication +@ComponentScan(basePackages = {"com.luojia_channel"}) +public class LuojiaChannelApplication { + + public static void main(String[] args) { + SpringApplication.run(LuojiaChannelApplication.class, args); + } + +} diff --git a/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/Config/SecurityConfig.java b/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/Config/SecurityConfig.java new file mode 100644 index 0000000..726d3cf --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/Config/SecurityConfig.java @@ -0,0 +1,30 @@ +package com.luojia_channel.modules.user.Config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.SecurityFilterChain; + +@Configuration +public class SecurityConfig { + @Bean + public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + http + .csrf(csrf -> csrf.disable()) //禁用CSRF保护 + .cors(cors -> cors.disable()) //禁用CORS测试,似乎需要,没有详细测试过 + .authorizeHttpRequests(auth -> auth + .requestMatchers("/user/login", + "/user/register", + "/user/hello").permitAll() //允许所有用户访问登录和注册接口 + .anyRequest().authenticated() //其他请求需要认证 + ); + return http.build(); + } + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } +} diff --git a/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/constant/UserConstant.java b/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/constant/UserConstant.java new file mode 100644 index 0000000..fdcbac7 --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/constant/UserConstant.java @@ -0,0 +1,12 @@ +package com.luojia_channel.modules.user.constant; + +public class UserConstant { + // 匿名用户前缀 + public static final String ANONYMOUS_USER_PREFIX = "luojia_"; + // 匿名用户key前缀 + public static final String ANONYMOUS_KEY_PREFIX = "anon:user:"; + // 过期时间 + public static final long EXPIRE_TIME_MINUTES = 30L; + // 过期时间 + public static final long EXPIRE_TIME = 7L; +} diff --git a/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/controller/UserInfoController.java b/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/controller/UserInfoController.java new file mode 100644 index 0000000..21fd36a --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/controller/UserInfoController.java @@ -0,0 +1,4 @@ +package com.luojia_channel.modules.user.controller; + +public class UserInfoController { +} diff --git a/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/controller/UserLoginController.java b/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/controller/UserLoginController.java new file mode 100644 index 0000000..ce7d605 --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/controller/UserLoginController.java @@ -0,0 +1,37 @@ +package com.luojia_channel.modules.user.controller; + +import com.luojia_channel.common.domain.Result; +import com.luojia_channel.common.domain.UserDTO; +import com.luojia_channel.modules.user.dto.UserLoginDTO; +import com.luojia_channel.modules.user.dto.UserRegisterDTO; +import com.luojia_channel.modules.user.service.UserLoginService; +import lombok.RequiredArgsConstructor; +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; + +@RestController +@RequestMapping("/user") +@RequiredArgsConstructor +public class UserLoginController { + private final UserLoginService userLoginService; + //登录 + @PostMapping("/login") + public Result login(@RequestBody UserLoginDTO userLoginDTO){ + return Result.success(userLoginService.login(userLoginDTO)); + } + + //注册 + @PostMapping("/register") + public Result register(@RequestBody UserRegisterDTO userRegisterDTO){ + return Result.success(userLoginService.register(userRegisterDTO)); + } + + //测试接口 + @PostMapping("/hello") + public Result hello() { + return Result.success("hello"); + } + +} diff --git a/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/dto/UserLoginDTO.java b/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/dto/UserLoginDTO.java new file mode 100644 index 0000000..7021946 --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/dto/UserLoginDTO.java @@ -0,0 +1,10 @@ +package com.luojia_channel.modules.user.dto; + +import lombok.Data; + +@Data +public class UserLoginDTO { + // 用户标志,支持学号,手机号,邮箱 + private String userFlag; + private String password; +} diff --git a/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/dto/UserRegisterDTO.java b/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/dto/UserRegisterDTO.java new file mode 100644 index 0000000..e2474de --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/dto/UserRegisterDTO.java @@ -0,0 +1,10 @@ +package com.luojia_channel.modules.user.dto; + +import lombok.Data; + +@Data +public class UserRegisterDTO { + private String username; + private String password; + private String email; +} diff --git a/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/entity/User.java b/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/entity/User.java new file mode 100644 index 0000000..76fa2b0 --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/entity/User.java @@ -0,0 +1,79 @@ +package com.luojia_channel.modules.user.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchConnectionDetails; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +@TableName("user") +public class User implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + private Long id; + /** + * 用户名 + */ + private String username; + + /** + * 实名 + */ + private String realName; + + /** + * 密码 + */ + private String password; + + /** + * 注册手机号 + */ + private String phone; + + /** + * 邮箱 + */ + private String email; + + /** + * 学号 + */ + private String studentId; + + /** + * 性别(0未知,1男,2女) + */ + private Integer gender; + + /** + * 创建时间 + */ + private LocalDateTime createTime; + + private LocalDateTime updateTime; + + /** + * 使用状态(1正常 2冻结) + */ + private Integer status; + + /** + * 身份(1普通用户 2管理员 3超级管理员) + */ + private Integer role; + + /** + * 用户积分 + */ + private Integer integral; + + /** + * 所属学院 + */ + private String college; +} diff --git a/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/mapper/UserMapper.java b/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/mapper/UserMapper.java new file mode 100644 index 0000000..fdd724e --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/mapper/UserMapper.java @@ -0,0 +1,10 @@ +package com.luojia_channel.modules.user.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.luojia_channel.modules.user.entity.User; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface UserMapper extends BaseMapper { + +} diff --git a/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/service/UserInfoService.java b/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/service/UserInfoService.java new file mode 100644 index 0000000..6982d38 --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/service/UserInfoService.java @@ -0,0 +1,7 @@ +package com.luojia_channel.modules.user.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.luojia_channel.modules.user.entity.User; + +public interface UserInfoService extends IService { +} diff --git a/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/service/UserLoginService.java b/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/service/UserLoginService.java new file mode 100644 index 0000000..9182f46 --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/service/UserLoginService.java @@ -0,0 +1,20 @@ +package com.luojia_channel.modules.user.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.luojia_channel.common.domain.UserDTO; +import com.luojia_channel.modules.user.dto.UserLoginDTO; +import com.luojia_channel.modules.user.dto.UserRegisterDTO; +import com.luojia_channel.modules.user.entity.User; + +public interface UserLoginService extends IService { + + //登录 + UserDTO login(UserLoginDTO userLoginDTO); + + UserDTO checkLogin(String token); + + void logout(String token); + + //注册 + UserDTO register(UserRegisterDTO userRegisterDTO); +} diff --git a/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/service/impl/UserInfoServiceImpl.java b/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/service/impl/UserInfoServiceImpl.java new file mode 100644 index 0000000..d72f795 --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/service/impl/UserInfoServiceImpl.java @@ -0,0 +1,13 @@ +package com.luojia_channel.modules.user.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.luojia_channel.modules.user.entity.User; +import com.luojia_channel.modules.user.mapper.UserMapper; +import com.luojia_channel.modules.user.service.UserInfoService; + +import org.springframework.stereotype.Service; + +@Service +public class UserInfoServiceImpl extends ServiceImpl implements UserInfoService { + +} diff --git a/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/service/impl/UserLoginServiceImpl.java b/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/service/impl/UserLoginServiceImpl.java new file mode 100644 index 0000000..8faabba --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/service/impl/UserLoginServiceImpl.java @@ -0,0 +1,209 @@ +package com.luojia_channel.modules.user.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.luojia_channel.common.domain.UserDTO; +import com.luojia_channel.common.exception.UserException; +import com.luojia_channel.modules.user.dto.UserLoginDTO; +import com.luojia_channel.modules.user.dto.UserRegisterDTO; +import com.luojia_channel.modules.user.entity.User; +import com.luojia_channel.modules.user.mapper.UserMapper; +import com.luojia_channel.modules.user.service.UserLoginService; +import com.luojia_channel.common.utils.JWTUtil; +import com.luojia_channel.common.utils.RedisUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; + +import java.util.concurrent.TimeUnit; + +import static com.luojia_channel.modules.user.constant.UserConstant.EXPIRE_TIME; + +@Service +@RequiredArgsConstructor +public class UserLoginServiceImpl extends ServiceImpl implements UserLoginService { + + private final UserMapper userMapper; + private PasswordEncoder passwordEncoder; + private final RedisUtil redisUtil; + + @Autowired + public void setPasswordEncoder(PasswordEncoder passwordEncoder) { + this.passwordEncoder = passwordEncoder; + } + + /** + * 根据用户标志获得用户学号,用于登录 + * @param userFlag + * @return + */ + private User getUserByFlag(String userFlag){ + User user; + boolean mailFlag = false; + for(char c : userFlag.toCharArray()){ + if(c == '@'){ + mailFlag = true; + break; + } + } + // 邮箱登录 + if(mailFlag){ + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(User.class) + .eq(User::getEmail, userFlag); + user = userMapper.selectOne(wrapper); + if(user == null){ + throw new UserException("用户邮箱不存在"); + } + return user; + } + // 手机号登录 + if(userFlag.length() == 11){ + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(User.class) + .eq(User::getPhone, userFlag); + user = userMapper.selectOne(wrapper); + if(user == null){ + throw new UserException("用户手机号不存在"); + } + return user; + } + // 剩下的就是学号登录了 + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(User.class) + .eq(User::getStudentId, userFlag); + user = userMapper.selectOne(wrapper); + if(user == null){ + throw new UserException("用户学号不存在"); + } + return user; + } + + /** + * 用户登录,支持学号,手机,邮箱登录 + * @param userLoginDTO + * @return + */ + @Override + public UserDTO login(UserLoginDTO userLoginDTO) { + String userFlag = userLoginDTO.getUserFlag(); + String password = userLoginDTO.getPassword(); + //验证密码 + User user = getUserByFlag(userFlag); + if(!passwordEncoder.matches(password, user.getPassword())) { + throw new UserException("密码错误"); + } + UserDTO userDTO = UserDTO.builder() + .userId(user.getId()) + .username(user.getUsername()) + .studentId(user.getStudentId()) + .build(); + String jwtToken = JWTUtil.generateAccessToken(userDTO); + userDTO.setToken(jwtToken); + // 存储用户至redis + // 当jwt过期时,若redis仍存在,则刷新jwt + redisUtil.set(jwtToken, userDTO, EXPIRE_TIME, TimeUnit.DAYS); + return userDTO; + } + + /** + * 检查登录,包括刷新jwt + * @param token + * @return + */ + @Override + public UserDTO checkLogin(String token) { + // 解析JWT,若有效则刷新redis过期时间 + UserDTO user = JWTUtil.parseJwtToken(token); + if (user != null) { + redisUtil.expire(token, EXPIRE_TIME, TimeUnit.DAYS); + return user; + } + // 若JWT过期,检查Redis中是否存在该token对应的用户信息 + UserDTO cachedUser = redisUtil.get(token, UserDTO.class); + if (cachedUser != null) { + String newToken = JWTUtil.generateAccessToken(cachedUser); + redisUtil.delete(token); + redisUtil.set(newToken, cachedUser, EXPIRE_TIME, TimeUnit.DAYS); + return cachedUser; + } + throw new UserException("登录失效"); + } + + @Override + public void logout(String token){ + if (StrUtil.isNotBlank(token)) { + redisUtil.delete(token); + } + } + + /** + * 用户注册,支持用户名、邮箱注册 + * @param userRegisterDTO + * @return + */ + @Override + public UserDTO register(UserRegisterDTO userRegisterDTO) { + //检查注册信息是否完整 + if (StrUtil.hasBlank(userRegisterDTO.getUsername(), + userRegisterDTO.getPassword(), + userRegisterDTO.getEmail())) { + throw new UserException("注册信息不能为空"); + } + + //检查用户名、邮箱是否已存在 + LambdaQueryWrapper usernameWrapper = Wrappers.lambdaQuery(User.class) + .eq(User::getUsername, userRegisterDTO.getUsername()); + if (userMapper.selectOne(usernameWrapper) != null) { + throw new UserException("用户名已存在"); + } + + LambdaQueryWrapper emailWrapper = Wrappers.lambdaQuery(User.class) + .eq(User::getEmail, userRegisterDTO.getEmail()); + if (userMapper.selectOne(emailWrapper) != null) { + throw new UserException("邮箱已存在"); + } + + //TODO 邮箱格式校验,前端完成 + //if (!userRegisterDTO.getEmail().matches("^\\w+@[a-zA-Z_]+?\\.[a-zA-Z]{2,3}$")) { + //throw new UserException("邮箱格式不正确"); + //} + + //检查密码长度,不知道是不是前端做的 + if (userRegisterDTO.getPassword().length() < 6) { + throw new UserException("密码长度不能小于6位"); + } + + //TODO 检查密码是否一致,前端完成 + //if (!userRegisterDTO.getPassword().equals(userRegisterDTO.getConfirmPassword())) { + //throw new UserException("两次密码不一致"); + //} + + //加密密码 + String encodedPassword = passwordEncoder.encode(userRegisterDTO.getPassword()); + + //保存用户信息至mysql + User newuser = new User(); + newuser.setUsername(userRegisterDTO.getUsername()); + newuser.setPassword(encodedPassword); + newuser.setEmail(userRegisterDTO.getEmail()); + + if(!save(newuser)){ + throw new UserException("注册失败"); + } + + //生成JWT + UserDTO userDTO = UserDTO.builder() + .userId(newuser.getId()) + .username(newuser.getUsername()) + .email(newuser.getEmail()) + .build(); + //生成token + String jwtToken = JWTUtil.generateAccessToken(userDTO); + userDTO.setToken(jwtToken); + //存储用户信息至redis + redisUtil.set(jwtToken, userDTO, EXPIRE_TIME, TimeUnit.DAYS); + + return userDTO; + } +} diff --git a/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/utils/AnonymousUserUtil.java b/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/utils/AnonymousUserUtil.java new file mode 100644 index 0000000..ca1f438 --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/service/src/main/java/com/luojia_channel/modules/user/utils/AnonymousUserUtil.java @@ -0,0 +1,62 @@ +package com.luojia_channel.modules.user.utils; + +import cn.hutool.core.lang.UUID; +import com.luojia_channel.common.domain.UserDTO; +import com.luojia_channel.common.exception.UserException; +import com.luojia_channel.common.utils.RedisUtil; +import lombok.RequiredArgsConstructor; +import org.redisson.api.RLock; +import org.redisson.api.RedissonClient; +import org.springframework.stereotype.Component; + +import java.util.concurrent.TimeUnit; + +import static com.luojia_channel.modules.user.constant.UserConstant.*; + +/** + * 这是生成匿名用户的工具类,用于前端展示,并支持后端校验 + */ +@Component +@RequiredArgsConstructor +public class AnonymousUserUtil { + private final RedisUtil redisUtil; + private final RedissonClient redissonClient; + + /** + * 生成匿名用户id + * @param userDTO + * @return + */ + public String generateAnonymousId(UserDTO userDTO){ + String anonymousId = ANONYMOUS_USER_PREFIX + UUID.randomUUID().toString().replace("-", ""); + String cacheKey = ANONYMOUS_KEY_PREFIX + anonymousId; + String lockKey = ANONYMOUS_KEY_PREFIX + userDTO.getUserId(); + RLock lock = redissonClient.getLock(lockKey); + boolean tryLock = lock.tryLock(); + if(!tryLock){ + throw new UserException("匿名频繁,请稍后重试"); + } + try { + redisUtil.set(cacheKey, userDTO, EXPIRE_TIME_MINUTES, TimeUnit.MINUTES); + }finally { + lock.unlock(); + } + return anonymousId; + } + + /** + * 解析匿名用户 + * @param anonymousId + * @return + */ + public UserDTO getRealUser(String anonymousId){ + String cacheKey = ANONYMOUS_KEY_PREFIX + anonymousId; + UserDTO user = redisUtil.get(cacheKey, UserDTO.class); + if(user == null){ + throw new UserException("匿名用户不存在或已过期"); + } + return user; + } + + +} diff --git a/珞珈岛-项目相关文件/luojia-island/service/src/main/resources/application-dev.yaml b/珞珈岛-项目相关文件/luojia-island/service/src/main/resources/application-dev.yaml new file mode 100644 index 0000000..09c5e58 --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/service/src/main/resources/application-dev.yaml @@ -0,0 +1 @@ +lj: diff --git a/珞珈岛-项目相关文件/luojia-island/service/src/main/resources/application-local.yaml b/珞珈岛-项目相关文件/luojia-island/service/src/main/resources/application-local.yaml new file mode 100644 index 0000000..28c511b --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/service/src/main/resources/application-local.yaml @@ -0,0 +1,29 @@ +# 本地开发环境 +lj: + db: + host: 192.168.59.129 + password: Forely123! + redis: + host: 192.168.59.129 + port: 6379 + password: Forely123! + rabbitmq: + host: 192.168.59.129 + port: 5672 + username: admin + password: Forely123! + +# 本地开发环境,cf的配置 +#lj: +# db: +# host: localhost +# password: 123456 +# redis: +# host: localhost +# port: 6379 +# password: 123456 +# rabbitmq: +# host: localhost +# port: 15672 +# username: root +# password: 123456 diff --git a/珞珈岛-项目相关文件/luojia-island/service/src/main/resources/application.yaml b/珞珈岛-项目相关文件/luojia-island/service/src/main/resources/application.yaml new file mode 100644 index 0000000..9b4645d --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/service/src/main/resources/application.yaml @@ -0,0 +1,51 @@ +server: + port: 8081 +spring: + application: + name: service + profiles: + active: local + # 数据库 + datasource: + url: jdbc:mysql://${lj.db.host}:3306/luojia_channel?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai + driver-class-name: com.mysql.cj.jdbc.Driver + username: root + password: ${lj.db.password} + # redis配置 + data: + redis: + host: ${lj.redis.host} + port: ${lj.redis.port} + password: ${lj.redis.password} + lettuce: + pool: + max-active: 10 + max-idle: 10 + min-idle: 1 + time-between-eviction-runs: 10s + # rabbitmq配置 + rabbitmq: + host: ${lj.rabbitmq.host} + port: ${lj.rabbitmq.port} + username: ${lj.rabbitmq.username} + password: ${lj.rabbitmq.password} + virtual-host: / + listener: + simple: + acknowledge-mode: manual + concurrency: 5 + max-concurrency: 10 + prefetch: 1 + +mybatis-plus: + configuration: + default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler + global-config: + db-config: + update-strategy: not_null + id-type: auto + mapper-locations: classpath*:mapper/**/*.xml + type-aliases-package: com.luojia.luojia_channel.modules.*.entity + + + diff --git a/珞珈岛-项目相关文件/luojia-island/service/src/main/resources/db/luojia_channel.sql b/珞珈岛-项目相关文件/luojia-island/service/src/main/resources/db/luojia_channel.sql new file mode 100644 index 0000000..94bfe34 --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/service/src/main/resources/db/luojia_channel.sql @@ -0,0 +1,21 @@ + +CREATE TABLE `user` ( + `id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', + `username` VARCHAR(50) NOT NULL COMMENT '用户名', + `real_name` VARCHAR(50) COMMENT '实名', + `password` VARCHAR(100) NOT NULL COMMENT '密码', + `phone` VARCHAR(20) UNIQUE COMMENT '注册手机号', + `email` VARCHAR(100) UNIQUE COMMENT '邮箱', + `student_id` VARCHAR(20) UNIQUE COMMENT '学号', + `gender` TINYINT DEFAULT 0 COMMENT '性别(0未知,1男,2女)', + `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `status` INT DEFAULT 1 COMMENT '状态(1正常 2冻结)', + `role` INT DEFAULT 1 COMMENT '身份(1普通用户 2管理员 3超级管理员)', + `integral` INT DEFAULT 0 COMMENT '用户积分', + `college` VARCHAR(100) COMMENT '所属学院', + INDEX `idx_username` (`username`), + UNIQUE INDEX `uk_phone` (`phone`), + UNIQUE INDEX `uk_email` (`email`), + UNIQUE INDEX `uk_student_id` (`student_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表'; \ No newline at end of file diff --git a/珞珈岛-项目相关文件/luojia-island/service/src/main/resources/mapper/user/UserMapper.xml b/珞珈岛-项目相关文件/luojia-island/service/src/main/resources/mapper/user/UserMapper.xml new file mode 100644 index 0000000..52fee41 --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/service/src/main/resources/mapper/user/UserMapper.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/珞珈岛-项目相关文件/luojia-island/service/src/test/java/com/luojia/luojia_channel/LuojiaChannelApplicationTests.java b/珞珈岛-项目相关文件/luojia-island/service/src/test/java/com/luojia/luojia_channel/LuojiaChannelApplicationTests.java new file mode 100644 index 0000000..79abf19 --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/service/src/test/java/com/luojia/luojia_channel/LuojiaChannelApplicationTests.java @@ -0,0 +1,14 @@ +package com.luojia.luojia_channel; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class LuojiaChannelApplicationTests { + + @Test + void contextLoads() { + + } + +} diff --git a/珞珈岛-项目相关文件/luojia-island/service/target/classes/application-dev.yaml b/珞珈岛-项目相关文件/luojia-island/service/target/classes/application-dev.yaml new file mode 100644 index 0000000..09c5e58 --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/service/target/classes/application-dev.yaml @@ -0,0 +1 @@ +lj: diff --git a/珞珈岛-项目相关文件/luojia-island/service/target/classes/application-local.yaml b/珞珈岛-项目相关文件/luojia-island/service/target/classes/application-local.yaml new file mode 100644 index 0000000..28c511b --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/service/target/classes/application-local.yaml @@ -0,0 +1,29 @@ +# 本地开发环境 +lj: + db: + host: 192.168.59.129 + password: Forely123! + redis: + host: 192.168.59.129 + port: 6379 + password: Forely123! + rabbitmq: + host: 192.168.59.129 + port: 5672 + username: admin + password: Forely123! + +# 本地开发环境,cf的配置 +#lj: +# db: +# host: localhost +# password: 123456 +# redis: +# host: localhost +# port: 6379 +# password: 123456 +# rabbitmq: +# host: localhost +# port: 15672 +# username: root +# password: 123456 diff --git a/珞珈岛-项目相关文件/luojia-island/service/target/classes/application.yaml b/珞珈岛-项目相关文件/luojia-island/service/target/classes/application.yaml new file mode 100644 index 0000000..9b4645d --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/service/target/classes/application.yaml @@ -0,0 +1,51 @@ +server: + port: 8081 +spring: + application: + name: service + profiles: + active: local + # 数据库 + datasource: + url: jdbc:mysql://${lj.db.host}:3306/luojia_channel?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai + driver-class-name: com.mysql.cj.jdbc.Driver + username: root + password: ${lj.db.password} + # redis配置 + data: + redis: + host: ${lj.redis.host} + port: ${lj.redis.port} + password: ${lj.redis.password} + lettuce: + pool: + max-active: 10 + max-idle: 10 + min-idle: 1 + time-between-eviction-runs: 10s + # rabbitmq配置 + rabbitmq: + host: ${lj.rabbitmq.host} + port: ${lj.rabbitmq.port} + username: ${lj.rabbitmq.username} + password: ${lj.rabbitmq.password} + virtual-host: / + listener: + simple: + acknowledge-mode: manual + concurrency: 5 + max-concurrency: 10 + prefetch: 1 + +mybatis-plus: + configuration: + default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler + global-config: + db-config: + update-strategy: not_null + id-type: auto + mapper-locations: classpath*:mapper/**/*.xml + type-aliases-package: com.luojia.luojia_channel.modules.*.entity + + + diff --git a/珞珈岛-项目相关文件/luojia-island/service/target/classes/com/luojia_channel/LuojiaChannelApplication.class b/珞珈岛-项目相关文件/luojia-island/service/target/classes/com/luojia_channel/LuojiaChannelApplication.class new file mode 100644 index 0000000000000000000000000000000000000000..756bc6cb1182cae99eb199343d0485b144e81a0b GIT binary patch literal 869 zcmb7DO>fgc5Ph2_bs7vUE))usk6W6m^{tmcC5XhyKt)hE^nljet+T1U8?D#C-{J(~ zzz^U@A!gm61j!t*h-&YSUj;yP|H z42;d)=WyHMEsxNc+ihs8P<#a(K2989NU)+)tX2h0#ua zcJavQ3zb!tr@35dL1CXBGPFnLTrzAXO3T+(kxKi{-(`prBX~aHR(XFBY`du{84i>G zAi_5(xS|i*={L0)neDl6nm3K7srBYCwfymE$Etl5(bkzSBqD=gBN9XA5}VV^c+(TjvA=0;2H z#)4}q3{zgpQ!XxfCTWm}2tE3Hv+x7~?WliRV17&K+$1k1%gA;HU%|fA=`A{a8rZ;1 zI>W0Ah_GG9Zs9h8_~PRl4CqF|;2SpHFYEme;VT1L*d<06JGevfyYzNQLNYDv*5^Ik SCmWIffb1T%e0T;{;?Zy5I_!l2 literal 0 HcmV?d00001 diff --git a/珞珈岛-项目相关文件/luojia-island/service/target/classes/com/luojia_channel/modules/user/Config/SecurityConfig.class b/珞珈岛-项目相关文件/luojia-island/service/target/classes/com/luojia_channel/modules/user/Config/SecurityConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..c4cf038b69dcd3839c4f37b634177c9b8b7321d2 GIT binary patch literal 4173 zcmcgvZFdtz6n>^nlaMYXhEfE1w@BIwTPrVW5NRV=Fa>O&Sdo{>W}0lf*$w*w6j2oQ zgU6%4MZc7D>e0hzkH5*|o!w2dDKQqPd`Mc#Sc&|HT2N!`@lQw+Vi;n^%{B^7K!ieZ!HIj&XL?+b?U+;Gvd ztE$tmb+bBe^SZce*^8yT3-z7aU!1uLsEvgRl$IaFQ!?xlO?qM z)$Iyim8;vh=hiHnFq9$8h})iUTu18dRPY*hG4%OCG7J#HYm<{tU=PF5uESsn+Y6Na0DvD58WLMYHCeBf=csj zSr-$X&@K3CQede0-Y=pk-`|>R&W%@s7)KfuIuiEVKDr(&Nh81kP-uo;)H^CWSOV9xfCKVoqtb3 zUOK;7_J=TCUE{8(q=>OjCGdfQ)0kkGenChJ)RC=XU`SMShnEeav-8h~Q117;|enmHUa}b6LwXY;7I`5dva(v_5`bQ;QurpSrGV zE&K}!l54RV@h&C2yS~;m3~HHG^p0O(Gb|dikH+>JB0u6f-Xj zVmq(-KwNxL1lH`?J&LgniK30}HYkerJ*ibomS<~%c!}t6YxAB|@Z0@}Y+Huo9ii*c zc!8E@`9Yz{_o@=fp zZyx=`53Si>xyYp>R0<4CakE0qKUB1=MX!;Mh=q5P$V!{y<)wy*im(4=V6wYz^hOl! zT;PUL(p{0yz@$rXG@{_MgVIfCHBvZ(+X`;tRtC3d!IcZ1g3ob1gX^?#PcAGe_!M&) z%rPkE=nS+A263Mt^8J$GM%RNOX!0n1K4a@Mj6BOFa&uGIzosSd4a32wN}y9V6Zn>4 zPj^xJRtr*({e(&neX0R*`VOHlJNo~KW-5)0#=eoqV87Bs52ivPpdaVxSqTJi9v{<; zp@?b3eC2tPmYW_JT|oj^M*j+4kz;lR+vGTSb#xg!o?!PcBo*vDNXCIJ>SMGFT&ACl;tGunv$#siGNN%BWkku}uy^h; z_P0z+X<%0*sAOm=vR5W0ONS)oUN^{DsgoOt|BeH5z1gACTrB%WX|6AuD=lN>3C5N& zzKrAk!@E~o0A|Ty5C{XvQg{Q{P0uYbbNCF`0J24O8`>J9QQC@+EaPNkr@-q>L_1FV z-SD-k4LWE~KBb**(@ukvofyjW-vezG$qLN{{q~_3^Yp93f*n3NxD!6z#eIB1Qaedv V6c6wfC2)+!hvdoEc!ck;;~!;k7>@t| literal 0 HcmV?d00001 diff --git a/珞珈岛-项目相关文件/luojia-island/service/target/classes/com/luojia_channel/modules/user/constant/UserConstant.class b/珞珈岛-项目相关文件/luojia-island/service/target/classes/com/luojia_channel/modules/user/constant/UserConstant.class new file mode 100644 index 0000000000000000000000000000000000000000..08b54cb1b1a80a43c04266d6b50c4fc467b63a50 GIT binary patch literal 578 zcmbV}Nl(H+6vzLM#Ug?%E)f@uH}zmo#srtdn3A9@h5~_8Gt`Nclxb30zn3Qy4}JhY zl<}2Ra=YDndf#tNZ06)!?}g?iRIGDUH+6(%PlQs^)o0#Q=*qbs&ZV#0o|*?j1$v+9E(XHZZM)MRwK{#% z>YGN_dh8nY#*k2M{$(`--%-z(g#6FHfp9~aL7t$+ISHG8ksgdu94Lb#AuE)pYEcz6 z!iF(?Y;+B)*Jv45tI_WF43j|jY3@BbRl?fRlOMB2NZol)l2B+mO18tC-pR>mp=@HF5( DUOIrQ literal 0 HcmV?d00001 diff --git a/珞珈岛-项目相关文件/luojia-island/service/target/classes/com/luojia_channel/modules/user/controller/UserInfoController.class b/珞珈岛-项目相关文件/luojia-island/service/target/classes/com/luojia_channel/modules/user/controller/UserInfoController.class new file mode 100644 index 0000000000000000000000000000000000000000..90238f06f0005d1bbffcbe40ce20042c31e40aa1 GIT binary patch literal 365 zcmbu5Jx&8L5QX3DPZpLyqBPWWK!Fbcfg%zT(h7<|TI6*M@ycsU-Zl54LZaXR911ZT zAsR|->CJp^if7N~*ZT*6Ii@8Nqy@4ua*PPmM!ra4rF#~4b)!{J7+n}=`b$E3e6lLA zLzpYy3LAZ61#7Y9sYgT+3uwWA6#mAE?Zk0O>QWkRZ3%7TBrU_eKoUa%fshFYg!7IVpd-CZin{NQP_m z{fv@|6YW_{br&ZvhVddwWlW&VaOI$e81kV*%J8VVFPf$`JtVi+A1uygsSuR5(Y$He zLTNAWL`yh?$s(r8_!Jd}*$lwD6<1}PgqEQgCqW?Nm|?kE-x525heEgbgT|H&>>vm_ zhCE}3%lI5e7{(&mQn8g0gBU#Q)l_N7$j2~EEN{v%G$kCv@gh!?aS~rrO1vKqLt#m2 zWory0)wvCZUk69$Q)@tIDJ2Y}w@i}~ak8$oyq~liGFlgnkWMOf6Nqp_M9S^c!%@4b z=pAlkz4{Qfu*gvE76Tz>IKQvO4^ofVTak9tG#`pcv?aYIAsb&)EiG&kQ3NkOCUr|$ zfOqGwYXa^$Y839#)kIs>mK!QoMCVUh8!N0bnlN9go2bR(?MUg?Z!VN)CVI-B$p&vI z-Q?71Qd$1c#CAn&Z<8R|%{4=laOtJK-neF6GWpCa zaNl@*^W2ZjJ%^3!M90(Yx~F$ClDJY2O}k;9^1D*YNLbmVXDF?iBnspmPgs|Vks zdPDJy>wh%72Ce`i#`e_7#W1Qqo%`y?k8PZyF@KCEKD9hI=xH@d>j`{CyRT_?lkRi$ ze`x+S*utME=I{=m{6Qx<(gkTS`X0fI|9VNB#y7Mh9ej)L=zf;gc}5$cO1~WDFz>G! z7U=r>U%+DgfHQPfWOTr3!Dv#Q-2=mCnHWy&f#Dp^_b{9z(;W;KGB8|xAHy^*VZ`%r zmTb643zaW2;-B%p%N>a{{*If=8E$?gxs$k(TCSxGm*(H%=={PPuvg@#pWUgx$Vy#y kOa8sO?B+3rs}3L;zvc}r`tOnlP$7fMw6D=^hwtnE0dp1L`2YX_ literal 0 HcmV?d00001 diff --git a/珞珈岛-项目相关文件/luojia-island/service/target/classes/com/luojia_channel/modules/user/dto/UserLoginDTO.class b/珞珈岛-项目相关文件/luojia-island/service/target/classes/com/luojia_channel/modules/user/dto/UserLoginDTO.class new file mode 100644 index 0000000000000000000000000000000000000000..37e04d01248e02f2d9f8d7539e3295def0e5ef7e GIT binary patch literal 2418 zcmb7FTXWk~5dMxW*|MV~PH57agpyJh;y9_(3y|7Lpmnarxl9wn3_QSzeI`~SOF@#u z^q(;N0P>Otn1L|U2L@is48MV&!6T*Yv1D6uJQT*4vuCyE+ud(>kADCA+0OtLu$@E% z(Kr+xDq;+&Lw>^ZCbtgqTl)<88-t4C|mM@dtDa zN^tF%yY5%EQ%#a`NXIZv79-8Ro(P2mUWd)FVg+#rHK>HY~B(sP7ABm+zb8eYk8_xVgt2 zL+%5m;?)fDcenh1%Tr_+d(yBxqb}C16T>wK^Py$g9`_8&L%K8V`o4XXUlo>cxF@P~ zq|Xi0e4#8smf1aOtqtMT?CLgmcwKnHAvAfg#V!N0FSbNbQU=xbYQkaYmuY1>{WH+i zhZMd+t8EwpgN~wq$K#cw4SpODrEWi2-&iKs>r{P5xDAsUJ`qApWIBg6&-T+{NbcAT zry^DiS%RT(gWr}dP02p8ZO`=_e(Y!M4#rSQVhPJ}tjI=LWyo~8->^>XBa!#v{oYyO z70-5_GJGBGn!wNpUE@}jCM{F8?W4wV@p3DLG#3u;K0Ova%s&g+x8^CN3Lr|{G4_F`3oOf^uhZS&luQ~W;l@#BxOFM}UP;BV$#DJOO{sJ~1Gqtx z8=+B*(1-4)rbJf>tqD*YAx8SQX_u!Rqg9>y3GDl(**o+f^Ocw+Sr6narf8Q7o=(%s z+(xvST7dv11+l5zkBIlqZPd4bpPS5E zlEsJ?qJ*Xrsjh@)d&BqtS9n>2HvHfvc)EOp=>Me1;uJ+KH}x%4IMMEW1n@q3yF|_%q;STOn0wdVLJ?e)D&F>QKlP*fTMZ8Orf>mn2_efH)fib*K zQVes1KS3`{?Jo?(p}oLp91;3z>;#VVr?s(P;royiv&!N_^|gI1N+LaI2gEHud-PZeuKt(MB2B0h7D>t9IySV55w z(n|0|lZ4Zw@!mw<_fdn8qD0CA6euK>C@Yc_K@zi=r!b?qNwcs(lF}sYF_f32P>3|f zh$t}jl8ie0h*XR~Z5gy|l#41d>+0pj_RP&mSju`pCM=VChPQz3;q%G$uY-XglkjyA d#RtuDe29m%YJ~WRertG4yCg{;Q9EoQ{SS8|&|?4q literal 0 HcmV?d00001 diff --git a/珞珈岛-项目相关文件/luojia-island/service/target/classes/com/luojia_channel/modules/user/dto/UserRegisterDTO.class b/珞珈岛-项目相关文件/luojia-island/service/target/classes/com/luojia_channel/modules/user/dto/UserRegisterDTO.class new file mode 100644 index 0000000000000000000000000000000000000000..caed68dfc06bbb29ea237174f7edd8ed72bf0beb GIT binary patch literal 2873 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 uD<4{9&B084-DZn>D$AS+4 literal 0 HcmV?d00001 diff --git a/珞珈岛-项目相关文件/luojia-island/service/target/classes/com/luojia_channel/modules/user/service/UserInfoService.class b/珞珈岛-项目相关文件/luojia-island/service/target/classes/com/luojia_channel/modules/user/service/UserInfoService.class new file mode 100644 index 0000000000000000000000000000000000000000..5f195b196a3c80baaa4903ea5950336a8d9fcb75 GIT binary patch literal 351 zcmbV|J#GRq5QU!!WCJuQI7gRI8=mLq7)Pq z6mNct`Sji#f4_eKykVT7Coog4CKFwy<)_+7YuQlk*3q!1=((Y!Rx75DG%W1K6_-6j zU*Nfttt2DumR4oODr9&Rn4XcPbhTc)NcEwVLHjQgJ@G!U_1f8g>f#S4Ff8=e$`BhC zXqVUEe0c}-wL7{Mj&0E4&}GZtbAeIeVxxGjO>!~0iu`gmmGTKZBn{FNfgZB1K4IAP F(FtN)aTEXm literal 0 HcmV?d00001 diff --git a/珞珈岛-项目相关文件/luojia-island/service/target/classes/com/luojia_channel/modules/user/service/UserLoginService.class b/珞珈岛-项目相关文件/luojia-island/service/target/classes/com/luojia_channel/modules/user/service/UserLoginService.class new file mode 100644 index 0000000000000000000000000000000000000000..5e419a2e5d2fb030680dd7e240c31c5cca4793cb GIT binary patch literal 816 zcmb7CO;5r=5S>Lz0a5S+{R?<;4_-`APR7IpgR$ySv$T`4(C(UcOXRP4@CW##jMIf! zBqYjV+ntx0xAW%B=hyoO09?Yc3nd2UzK(g6>9G_q{zxc=5s!6{MVRs|#e~zDN+0y-vSS>6t{TaI^OuqbEqhDkM;6hCzEB;}e5wf}u>QBL?FCL%3fQ zZ9Io&E_$h&LCuq)5++NK!E{OW+}o}l@`k=%taIkqf}t|f%&b4%9@$g(be8ydEhFlp zy}EX%xfir!47TVvw8>@KLl>$P)hKd^fG`Hz&?ulC3++O46>7m=0qs+L2@dS{5Zd;C F^bOJ_`2zp| literal 0 HcmV?d00001 diff --git a/珞珈岛-项目相关文件/luojia-island/service/target/classes/com/luojia_channel/modules/user/service/impl/UserInfoServiceImpl.class b/珞珈岛-项目相关文件/luojia-island/service/target/classes/com/luojia_channel/modules/user/service/impl/UserInfoServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..ff6e50ae8730d528897b24b042b8ae82fdc167fb GIT binary patch literal 800 zcmbVKO-~y!5Pi-Ep=sI_3aCBy1{~@mhouNwsS;Akfk3Xv*_beNZLj$? zzo5US>g+-#noAH`X*_Q{eq+CVcYkhw0r-TCE*fZd(CVR$C4nq=Mvj#;G;v9q*;qvi zWs!o^H&NR_&dQ+u73ErzDGNEg2Zx*sEbWq|xF^uu+!}STEU;hk70F$aI?FGVwYreT zO;VwQOic7Y*(p~J?YVnI+Cf)f=cz1n1OlxuZlVSH1G4%knX&dKYFuz-b>MPUjFhJe zKNMT>f`Y*3!Bgke63h*)q{swb3~6drOrD4Rt_hzh>+Zta7*&=mWp$5lb($?aqHUx& ztB+)Ri`$vG{^fH|F8N%4rApLybNiJPA1~FF5_o@{c%;!I3dDjRSnDEt%URZY zbKv|`hSHOro_l5Vwe#O)h}vrxXQlpUvJ4;4VZXAtY+k`1dzRx%MzY30d;2HE4=yy& j<5+Ej8(wkj)p;AQ(Pz}e8;%XEV6|S~VvX0Te;xP>Y`6Li literal 0 HcmV?d00001 diff --git a/珞珈岛-项目相关文件/luojia-island/service/target/classes/com/luojia_channel/modules/user/service/impl/UserLoginServiceImpl.class b/珞珈岛-项目相关文件/luojia-island/service/target/classes/com/luojia_channel/modules/user/service/impl/UserLoginServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..af9581d3deaf6e1301cce1226cda4ff1fef3156d GIT binary patch literal 9326 zcmbtZ3w%`7o&L^bW^OXMkT?i++&m?+6r3h?}(6K&);7c zKmer*R25?|R-n8`+pdMPCQUu2^stdk#(QH%_@;|A zk)lB%0M5@v_lbf&*QnKHtyD>I3Rq(s$D!ej+gR7}M*+x!<6dK4TAc=X!@7P-Y= z*V&^-j5?P>?3s%5r=&k#p<)KE6bMMSZ87yLaILAmi}`n-32EBW+EiDHt1wH!Y!wx# z6u5dMZ#WNwKuKDUllgTCU0~(x(Ob|lSOF0gR2Sxj?DZuRVg2@q-Y>0Vin78P6=ROT z_%plqoqpiRTlXF~bKtpCgAWhy|H|-V`vR!KToqU28Ug>}SR!WB6Vz=2D^ThxHp*C< zr(!-95HzkQx{PjtqS+NqK?qz{jO+Mo(K!9!r%yjNH2lbsESVrY5@d0fjp6-Ixz_`z z$Mp)9s%XG6fw?28JIbJ!k!Plm|7ApB1j_3RjiN{B)F3- z0(6{JDsDiNz!)3NvYi&9hC-?s(VtwofpJoX<)vswi-NT()?vNC;t!M51e89_h;-}B z95rtCWFBkPnE(qJQR3MmVyXIt~ zi(p%@Rl%()G;|6q94(t4AVC@bjPoxj0u)1$#s{CZo~wN zC1E)!(BdZT*rt$6jaq}fD&ms3N)5IenJC?_DJrQaR3s(!lC*pFHWew*d3>e`1*+{T zFdEruiVU_Z*rDQfu!79GuqiS|ES?UpzNxL9F9PGb^n{+$480)|(bMU+WUroJeYX6{mH>#3~EH-6}qgPf+rd9*w0f4yrDqWQ*Ai4se~1)l&XbO7JQC ziGur7+>ZwYCYxDBLd&LzT}X<`4!6bn^mgV>HW14jI$8y$TG{79aMa>M__Tu0sCXEk z6{r|Vi&@5)aVe(2ssc{r%6N8_Ts;CCGO1_qITfGB7nu9{wNzSPy~EO?X`AzM=;))w zlyR4e-S`sYPQSfBmZI~|FTnR`xO@m-QLzV)Qhqu)Q$PVcF8Q6dDaXI95vlmcRD8{> zcTpB-LodcR7&>S6934Kkd-%!cPVasofXDHKf^VvL65kS-7)gY?GqMx18aUIc4BU3p zuLH64+N80JO=T}Z-E8IMK*_3O@ahR3-^b7lj@B7TD z^?p`^pu5f_|PM#hCaLC)Uk(Ubv&lxWgM5DVz&M=D_xL9*Fv_mm*IP|jrmivC81lF z;rl9nAkAFLfXSugGQ6td&z$*O3s8pFRQ%A%BewFq_>qdg#9uM4)7o~rZ(e8Qw4&75 zkLf{{#^^z34}VM2-!C)pPgVSl%)ma~GRM#GJq3Tq&Rd$fV7si}Zs>`$?BQ53atEf? z+&L+LH}G=>|DfU@rLm{yTq>5>&a@gPY)p&C?$D#wIY8hNSzCF;YSE4EWOS`roC5fT zihq{fob-(DMjp6|@k`5j)^{fptX~0~QZX#$_p`6i;^|_rbxH7d(hh zX-aIT^`q0QQ{}X%PDe8Rf#=X1 zr&g}Z)Mc%UO?1hlld{Nh8F4Nsoiu5Mey+N*-YK~;_`M$ zU`xRUGtW7kis~FD?dz6N^`wkwsdQ(nz%?UEa2`2oxZl3FqEAS4<_W8^5GIDKJm}}2 z#-t5DtZCu#mU~?c~}<$xTf1WM$u*&?087%?`_~jw0&hE9#g^k@QC;>UlRib%hwU z?IK&lbU53sn<;IgokWI)hp51e*3yC~`J zW>Bq`}v=HO@^vH`zq9O^;W-=og zc)h5;Y5*m*-jMg@1-_yM{_+0tz9%p#Q4B;aH_f9;4Nwwa}!CQIXOmcpJJ5i8v5a>bjl6tVj&EQk9;XVQ#cCYJ8oa{O=BsGIkFn0Q$2MAM z3RE#ce1ythg{k5)5u)`s@-xuoVj}stH#_(F>>Q1dwczVwl9^{9-auNh^aK! zVP~(HMyaN8#-bqo%fc()EGWK-D+pzv_~4Z^7PhkPOb0Pdh4-WB5D zQrz=AJ~@B~L%u^KS!DV{Eo5|cFn%^s88_n++`@R=LJzqW*FdB7J8A6*!z4

b%k3 z#tY>buS9!H``%!&pS4y}%o4MyGG-XlZXROQMFj;dBJM4w&Ar5Qg{Tx&glfY?Q7zSA z+GZ@od#EwhZ(6{LS~1JiS`EHnX$@~uYw`}Uy=oATv{awOI4NV5Bj6XS51Hd&+W@|N z0&Qz+PGUxlREdnqyQt-_nmX~;I6EG!Ib??B*QIu|x|xGgzGp~kJ4&#F!F@Zw@ZHIH z`4~U!+{LK5n-TJHdjBWr`S+Uom`CWV`4w;uW%5cEvzloaVa`d-tfv;L==rnwqMx0o>r7eSQeQ@ci7Yv;tJ)HHLVnCw4>r#gzLx_zx3UOt{_?eOvOZ0jHn z?y-II1*ttdH@#@)rhQf}Y$21=tIbS!(uN&y!CFc4SqpZpgssVg9h9(=rp%cBCu|Hu za+bi7sb^locRi@}9z|Kl5uA__z*$m%g)zX$IBAYa;m<2Wz5)D&6HR|DamZ-mq!~?o zn$g7PPX_S1j3$4`FI`7r2q{i9agcSLkY7fVm0j=V=UQMFV`?|QR)2}!vWqic=4Z~Y zGP6F$D)u#c%Gc4(oOvsrKo7o2zj_k)U_bAw4-oPQp283g;wT33T^z?TUZ)*rHa&r# z$ z^#!qzZ$+fFLo6~q^&k@BI_6^^aaytICuS=)6)}x?r3+a&re|?Xw|zGRU&T38F=1N2 zZ(L%L~MWDC z%lH2Y{-622mG5r{-!b1?`Tp)W!F>c;SvkO-M$ol6xNe9A8;7_qaaHl@;F`*J2iG{h zJGd0SJGk(B7cTs2h$-K}g;hCRsLSC(IEM=}+_)yVag~_;kj)pq=)!fs3)h`4TuC>s zPB*UhJX{}|FQ%tMM}@CroKTL4l3dESye?#Vohm)dQzot#OKB?EI!s3CyO>AE7GuVY z2~2qhYqI};$GG;11_F7+GSO&0muFke6-2O-bG6J9s|dGNtP|_S2GMGd+VVy><&8dS Xk2<(te(B%B+OP>FVzanKY(?k~qJO2T literal 0 HcmV?d00001 diff --git a/珞珈岛-项目相关文件/luojia-island/service/target/classes/com/luojia_channel/modules/user/utils/AnonymousUserUtil.class b/珞珈岛-项目相关文件/luojia-island/service/target/classes/com/luojia_channel/modules/user/utils/AnonymousUserUtil.class new file mode 100644 index 0000000000000000000000000000000000000000..99b79711c3237aeed30cfe9c990b4382a54e0dfd GIT binary patch literal 3249 zcma)8YjfPx8Gep;ZLQav*xg)+15QX22YYR!l9mL#kPw`k!`gxP0s#t@<%3sQtb^8x%bPQ&rbdqlWPQtTLPhWp&J=LPNna!aC zIe|>5CPLrw<^(qLo3qw=D>fQSiy3Sb5JMSs2_TC+HW}EQ!xn56=(<%~!0=_wwQMPH zq_4r)NZIlyY!=#*xWW0_}4$)R`Hb709ols-(QRVjcp!HPk%< zdl~^nZ=1kr$6nlLpf87h6a)@5L9(Vi>Y?KX=3!5H^Ho(3G?Xcd1UC9|)(HaTjku2V zLV;Z+<^%^OSq`g~#e@9!+X%jdr=FMV?3+Qo0)eJ_jW@lyjY=rj{d!<35c2yB{@p7gCy zu6C1d>VtiE$n4r_um)Yy1On+1HOtA@S#mr%Ua!tbf6|(9Dao_8EqB`T9lcJ3>9Fi@ zcs<Gx^;BFm)C`j3WFp_!GWU2cIc&|$3%k!Y4RWP3G~jBVLv`GlOO6P?QFDIF(u zTa)p^04oF}n4k?4p=DRbtXdSOfpg^h=0-7D_SJ=$m98-vmeuT&mTy&MD1DOA!TLBY zEm!w-l#rVru8x}ZEBv-V)0!WFQ+G=2tu5OmxV5vhe_G(~({(Row~l(}oxovE4||>p zEj^PMMZV;!>Wr$G$CEOfB{kUzRrhUq%+Uq0b+zzxq54*3?Ij<{R!DX+J5-cvjiyojIijRlBU@F{w`(^oLig5lQg)+=~GV1L_|w!dP-7dUVx z|L_uu*Qj)8Xkar&KEcsNJfYQ|68IZBhmGX9+qgFP5doaU8Q64gLq_)$X1Lmq4ZQBe zCZ2}2Gmu{T-iO^NVhLmL3U4bDC@T&q`-WAUd+R_Q0NEr-fX;J^q;U&y5;7xb| zWjOS?okRaDpHj3`LWNIhT0cZ9RkYH_ex3?ElA`$aE~NfPcZPwz26_zSSN`_#-1&@w zS_gcpwF-J6mk1EXwBj=Drzz_lh&UY6oDAlB7BTfTdd7$Tk??g!^ELDl730vi5&{Uo zAdD?M6?Eev20k2xR)`I*hSnPe#8HSHQ9v#Hq6>9~n~K19K>P>0Bg8!`Fv}6lM{%Ay z%s$2lH^qBrVF}L_20p`~!r*7<{g|SbC>L#v3fLS0xHnc^1<)B4mVVzEl~zmSrM-pX yE(*GEfv>cImw8WPp4S%q9KT4UzvTT_{NG6Fuc`HVbp1Wvpe)PvoA?73(EWeyJdbw( literal 0 HcmV?d00001 diff --git a/珞珈岛-项目相关文件/luojia-island/service/target/classes/db/luojia_channel.sql b/珞珈岛-项目相关文件/luojia-island/service/target/classes/db/luojia_channel.sql new file mode 100644 index 0000000..94bfe34 --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/service/target/classes/db/luojia_channel.sql @@ -0,0 +1,21 @@ + +CREATE TABLE `user` ( + `id` BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', + `username` VARCHAR(50) NOT NULL COMMENT '用户名', + `real_name` VARCHAR(50) COMMENT '实名', + `password` VARCHAR(100) NOT NULL COMMENT '密码', + `phone` VARCHAR(20) UNIQUE COMMENT '注册手机号', + `email` VARCHAR(100) UNIQUE COMMENT '邮箱', + `student_id` VARCHAR(20) UNIQUE COMMENT '学号', + `gender` TINYINT DEFAULT 0 COMMENT '性别(0未知,1男,2女)', + `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + `status` INT DEFAULT 1 COMMENT '状态(1正常 2冻结)', + `role` INT DEFAULT 1 COMMENT '身份(1普通用户 2管理员 3超级管理员)', + `integral` INT DEFAULT 0 COMMENT '用户积分', + `college` VARCHAR(100) COMMENT '所属学院', + INDEX `idx_username` (`username`), + UNIQUE INDEX `uk_phone` (`phone`), + UNIQUE INDEX `uk_email` (`email`), + UNIQUE INDEX `uk_student_id` (`student_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表'; \ No newline at end of file diff --git a/珞珈岛-项目相关文件/luojia-island/service/target/classes/mapper/user/UserMapper.xml b/珞珈岛-项目相关文件/luojia-island/service/target/classes/mapper/user/UserMapper.xml new file mode 100644 index 0000000..52fee41 --- /dev/null +++ b/珞珈岛-项目相关文件/luojia-island/service/target/classes/mapper/user/UserMapper.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/珞珈岛-项目相关文件/luojia-island/service/target/test-classes/com/luojia/luojia_channel/LuojiaChannelApplicationTests.class b/珞珈岛-项目相关文件/luojia-island/service/target/test-classes/com/luojia/luojia_channel/LuojiaChannelApplicationTests.class new file mode 100644 index 0000000000000000000000000000000000000000..f5626a91612ad33288d0d289224624f85c33555d GIT binary patch literal 576 zcmbVJO-lnY5S_HOt97-tdJ#N`CqKa46!8OU!PBB(ORtjM#&*`-WXWdLzvW5r;1BRe ziIcQ~Ab4;OGdpkIdoxKsKHuH};2btuP=k5^jSv=~$)J;pN5M0pCj2H&WnvjL&rqSg zU{K%P8wIe);5gAa&nlfFQGL2gra~#1@yM6`S=B3w3=?5dtD!7y$)M5KW67W$p_12C z9!oP6aYjft(uv4M!l0|?V8c$4L?_Wd=bbVL6RoU#wviTNvf8|@l*L?*utb{EQ%YOE zAN95(Z6-Xe=&%$Ew9;@iQ){3rlgKM{>+bw{&O>*J434~ESr}B4dn0oBq|F15 zwYJ=nC!epz2cB_BxE}@E5YVHz&qaC`V6a4goHBFB{wuH--)>QKZ6L`q#c)QTyh0Vg kDs^jKd_a}s{St;hgmhnC*e0U0?NF}4nvY%hM%Mwp0E)?ucK`qY literal 0 HcmV?d00001