From b1252b991d9bf1e02ace9b2eb49baa724d37643a Mon Sep 17 00:00:00 2001 From: "nmbh1122@126.com" Date: Mon, 13 Jul 2026 09:41:15 +0800 Subject: [PATCH] Initialize patbond microservice modules --- patbond-auth/pom.xml | 36 ++++++ .../patbond/patbond/auth/AuthApplication.java | 14 ++ .../patbond/auth/client/UserClient.java | 20 +++ .../auth/controller/AuthController.java | 33 +++++ .../patbond/auth/dto/AuthTokenResponse.java | 47 +++++++ .../patbond/auth/dto/LoginRequest.java | 28 ++++ .../patbond/auth/dto/RegisterRequest.java | 53 ++++++++ .../patbond/auth/service/AuthService.java | 65 ++++++++++ .../src/main/resources/application.yml | 12 ++ patbond-auth/target/classes/application.yml | 12 ++ .../patbond/auth/AuthApplication.class | Bin 0 -> 782 bytes .../patbond/auth/client/UserClient.class | Bin 0 -> 1134 bytes .../auth/controller/AuthController.class | Bin 0 -> 2226 bytes .../patbond/auth/dto/AuthTokenResponse.class | Bin 0 -> 1346 bytes .../patbond/auth/dto/LoginRequest.class | Bin 0 -> 1004 bytes .../patbond/auth/dto/RegisterRequest.class | Bin 0 -> 1787 bytes .../patbond/auth/service/AuthService.class | Bin 0 -> 4451 bytes .../compile/default-compile/createdFiles.lst | 7 + .../compile/default-compile/inputFiles.lst | 7 + patbond-common/pom.xml | 55 ++++++++ .../patbond/patbond/common/package-info.java | 4 + .../patbond/common/response/ApiResponse.java | 53 ++++++++ .../common/user/CreateUserRequest.java | 63 +++++++++ .../patbond/common/user/UserProfile.java | 63 +++++++++ .../common/user/VerifyPasswordRequest.java | 36 ++++++ .../common/user/VerifyPasswordResponse.java | 41 ++++++ .../patbond/patbond/common/package-info.class | Bin 0 -> 132 bytes .../patbond/common/response/ApiResponse.class | Bin 0 -> 2484 bytes .../common/user/CreateUserRequest.class | Bin 0 -> 2023 bytes .../patbond/common/user/UserProfile.class | Bin 0 -> 1754 bytes .../common/user/VerifyPasswordRequest.class | Bin 0 -> 1186 bytes .../common/user/VerifyPasswordResponse.class | Bin 0 -> 1245 bytes .../compile/default-compile/createdFiles.lst | 6 + .../compile/default-compile/inputFiles.lst | 6 + patbond-user/pom.xml | 40 ++++++ .../patbond/patbond/user/UserApplication.java | 12 ++ .../user/controller/UserController.java | 46 +++++++ .../patbond/user/service/UserService.java | 120 ++++++++++++++++++ .../src/main/resources/application.yml | 12 ++ patbond-user/target/classes/application.yml | 12 ++ .../patbond/user/UserApplication.class | Bin 0 -> 719 bytes .../user/controller/UserController.class | Bin 0 -> 3313 bytes .../patbond/user/service/UserService$1.class | Bin 0 -> 247 bytes .../user/service/UserService$UserRecord.class | Bin 0 -> 2650 bytes .../patbond/user/service/UserService.class | Bin 0 -> 5175 bytes .../compile/default-compile/createdFiles.lst | 5 + .../compile/default-compile/inputFiles.lst | 3 + pom.xml | 91 +++++++++++++ 48 files changed, 1002 insertions(+) create mode 100644 patbond-auth/pom.xml create mode 100644 patbond-auth/src/main/java/com/patbond/patbond/auth/AuthApplication.java create mode 100644 patbond-auth/src/main/java/com/patbond/patbond/auth/client/UserClient.java create mode 100644 patbond-auth/src/main/java/com/patbond/patbond/auth/controller/AuthController.java create mode 100644 patbond-auth/src/main/java/com/patbond/patbond/auth/dto/AuthTokenResponse.java create mode 100644 patbond-auth/src/main/java/com/patbond/patbond/auth/dto/LoginRequest.java create mode 100644 patbond-auth/src/main/java/com/patbond/patbond/auth/dto/RegisterRequest.java create mode 100644 patbond-auth/src/main/java/com/patbond/patbond/auth/service/AuthService.java create mode 100644 patbond-auth/src/main/resources/application.yml create mode 100644 patbond-auth/target/classes/application.yml create mode 100644 patbond-auth/target/classes/com/patbond/patbond/auth/AuthApplication.class create mode 100644 patbond-auth/target/classes/com/patbond/patbond/auth/client/UserClient.class create mode 100644 patbond-auth/target/classes/com/patbond/patbond/auth/controller/AuthController.class create mode 100644 patbond-auth/target/classes/com/patbond/patbond/auth/dto/AuthTokenResponse.class create mode 100644 patbond-auth/target/classes/com/patbond/patbond/auth/dto/LoginRequest.class create mode 100644 patbond-auth/target/classes/com/patbond/patbond/auth/dto/RegisterRequest.class create mode 100644 patbond-auth/target/classes/com/patbond/patbond/auth/service/AuthService.class create mode 100644 patbond-auth/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 patbond-auth/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 patbond-common/pom.xml create mode 100644 patbond-common/src/main/java/com/patbond/patbond/common/package-info.java create mode 100644 patbond-common/src/main/java/com/patbond/patbond/common/response/ApiResponse.java create mode 100644 patbond-common/src/main/java/com/patbond/patbond/common/user/CreateUserRequest.java create mode 100644 patbond-common/src/main/java/com/patbond/patbond/common/user/UserProfile.java create mode 100644 patbond-common/src/main/java/com/patbond/patbond/common/user/VerifyPasswordRequest.java create mode 100644 patbond-common/src/main/java/com/patbond/patbond/common/user/VerifyPasswordResponse.java create mode 100644 patbond-common/target/classes/com/patbond/patbond/common/package-info.class create mode 100644 patbond-common/target/classes/com/patbond/patbond/common/response/ApiResponse.class create mode 100644 patbond-common/target/classes/com/patbond/patbond/common/user/CreateUserRequest.class create mode 100644 patbond-common/target/classes/com/patbond/patbond/common/user/UserProfile.class create mode 100644 patbond-common/target/classes/com/patbond/patbond/common/user/VerifyPasswordRequest.class create mode 100644 patbond-common/target/classes/com/patbond/patbond/common/user/VerifyPasswordResponse.class create mode 100644 patbond-common/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 patbond-common/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 patbond-user/pom.xml create mode 100644 patbond-user/src/main/java/com/patbond/patbond/user/UserApplication.java create mode 100644 patbond-user/src/main/java/com/patbond/patbond/user/controller/UserController.java create mode 100644 patbond-user/src/main/java/com/patbond/patbond/user/service/UserService.java create mode 100644 patbond-user/src/main/resources/application.yml create mode 100644 patbond-user/target/classes/application.yml create mode 100644 patbond-user/target/classes/com/patbond/patbond/user/UserApplication.class create mode 100644 patbond-user/target/classes/com/patbond/patbond/user/controller/UserController.class create mode 100644 patbond-user/target/classes/com/patbond/patbond/user/service/UserService$1.class create mode 100644 patbond-user/target/classes/com/patbond/patbond/user/service/UserService$UserRecord.class create mode 100644 patbond-user/target/classes/com/patbond/patbond/user/service/UserService.class create mode 100644 patbond-user/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 patbond-user/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 pom.xml diff --git a/patbond-auth/pom.xml b/patbond-auth/pom.xml new file mode 100644 index 0000000..e53822f --- /dev/null +++ b/patbond-auth/pom.xml @@ -0,0 +1,36 @@ + + + 4.0.0 + + + com.patbond.patbond + patbond-api + 1.0.0-SNAPSHOT + ../pom.xml + + + patbond-auth + jar + + patbond-auth + Authentication service for Patbond + + + + com.patbond.patbond + patbond-common + ${project.version} + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/patbond-auth/src/main/java/com/patbond/patbond/auth/AuthApplication.java b/patbond-auth/src/main/java/com/patbond/patbond/auth/AuthApplication.java new file mode 100644 index 0000000..7ac9bba --- /dev/null +++ b/patbond-auth/src/main/java/com/patbond/patbond/auth/AuthApplication.java @@ -0,0 +1,14 @@ +package com.patbond.patbond.auth; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.openfeign.EnableFeignClients; + +@EnableFeignClients +@SpringBootApplication +public class AuthApplication { + + public static void main(String[] args) { + SpringApplication.run(AuthApplication.class, args); + } +} diff --git a/patbond-auth/src/main/java/com/patbond/patbond/auth/client/UserClient.java b/patbond-auth/src/main/java/com/patbond/patbond/auth/client/UserClient.java new file mode 100644 index 0000000..5da2ec0 --- /dev/null +++ b/patbond-auth/src/main/java/com/patbond/patbond/auth/client/UserClient.java @@ -0,0 +1,20 @@ +package com.patbond.patbond.auth.client; + +import com.patbond.patbond.common.response.ApiResponse; +import com.patbond.patbond.common.user.CreateUserRequest; +import com.patbond.patbond.common.user.UserProfile; +import com.patbond.patbond.common.user.VerifyPasswordRequest; +import com.patbond.patbond.common.user.VerifyPasswordResponse; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +@FeignClient(name = "patbond-user") +public interface UserClient { + + @PostMapping("/internal/users") + ApiResponse createUser(@RequestBody CreateUserRequest request); + + @PostMapping("/internal/users/verify-password") + ApiResponse verifyPassword(@RequestBody VerifyPasswordRequest request); +} diff --git a/patbond-auth/src/main/java/com/patbond/patbond/auth/controller/AuthController.java b/patbond-auth/src/main/java/com/patbond/patbond/auth/controller/AuthController.java new file mode 100644 index 0000000..752d6da --- /dev/null +++ b/patbond-auth/src/main/java/com/patbond/patbond/auth/controller/AuthController.java @@ -0,0 +1,33 @@ +package com.patbond.patbond.auth.controller; + +import com.patbond.patbond.auth.dto.AuthTokenResponse; +import com.patbond.patbond.auth.dto.LoginRequest; +import com.patbond.patbond.auth.dto.RegisterRequest; +import com.patbond.patbond.auth.service.AuthService; +import com.patbond.patbond.common.response.ApiResponse; +import javax.validation.Valid; +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("/auth") +public class AuthController { + + private final AuthService authService; + + public AuthController(AuthService authService) { + this.authService = authService; + } + + @PostMapping("/register") + public ApiResponse register(@Valid @RequestBody RegisterRequest request) { + return ApiResponse.success(authService.register(request)); + } + + @PostMapping("/login") + public ApiResponse login(@Valid @RequestBody LoginRequest request) { + return ApiResponse.success(authService.login(request)); + } +} diff --git a/patbond-auth/src/main/java/com/patbond/patbond/auth/dto/AuthTokenResponse.java b/patbond-auth/src/main/java/com/patbond/patbond/auth/dto/AuthTokenResponse.java new file mode 100644 index 0000000..a9ca6df --- /dev/null +++ b/patbond-auth/src/main/java/com/patbond/patbond/auth/dto/AuthTokenResponse.java @@ -0,0 +1,47 @@ +package com.patbond.patbond.auth.dto; + +import java.time.LocalDateTime; + +public class AuthTokenResponse { + + private String tokenType; + private String accessToken; + private LocalDateTime expiresAt; + private Long userId; + private String username; + private String nickname; + + public AuthTokenResponse(String tokenType, String accessToken, LocalDateTime expiresAt, + Long userId, String username, String nickname) { + this.tokenType = tokenType; + this.accessToken = accessToken; + this.expiresAt = expiresAt; + this.userId = userId; + this.username = username; + this.nickname = nickname; + } + + public String getTokenType() { + return tokenType; + } + + public String getAccessToken() { + return accessToken; + } + + public LocalDateTime getExpiresAt() { + return expiresAt; + } + + public Long getUserId() { + return userId; + } + + public String getUsername() { + return username; + } + + public String getNickname() { + return nickname; + } +} diff --git a/patbond-auth/src/main/java/com/patbond/patbond/auth/dto/LoginRequest.java b/patbond-auth/src/main/java/com/patbond/patbond/auth/dto/LoginRequest.java new file mode 100644 index 0000000..cc00075 --- /dev/null +++ b/patbond-auth/src/main/java/com/patbond/patbond/auth/dto/LoginRequest.java @@ -0,0 +1,28 @@ +package com.patbond.patbond.auth.dto; + +import javax.validation.constraints.NotBlank; + +public class LoginRequest { + + @NotBlank(message = "用户名不能为空") + private String username; + + @NotBlank(message = "密码不能为空") + private String password; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} diff --git a/patbond-auth/src/main/java/com/patbond/patbond/auth/dto/RegisterRequest.java b/patbond-auth/src/main/java/com/patbond/patbond/auth/dto/RegisterRequest.java new file mode 100644 index 0000000..17fa243 --- /dev/null +++ b/patbond-auth/src/main/java/com/patbond/patbond/auth/dto/RegisterRequest.java @@ -0,0 +1,53 @@ +package com.patbond.patbond.auth.dto; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; + +public class RegisterRequest { + + @NotBlank(message = "用户名不能为空") + @Size(min = 3, max = 32, message = "用户名长度必须在3到32位之间") + private String username; + + @NotBlank(message = "密码不能为空") + @Size(min = 6, max = 64, message = "密码长度必须在6到64位之间") + private String password; + + @Size(max = 32, message = "昵称长度不能超过32位") + private String nickname; + + @Size(max = 20, message = "手机号长度不能超过20位") + private String phone; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } +} diff --git a/patbond-auth/src/main/java/com/patbond/patbond/auth/service/AuthService.java b/patbond-auth/src/main/java/com/patbond/patbond/auth/service/AuthService.java new file mode 100644 index 0000000..a2a1d37 --- /dev/null +++ b/patbond-auth/src/main/java/com/patbond/patbond/auth/service/AuthService.java @@ -0,0 +1,65 @@ +package com.patbond.patbond.auth.service; + +import com.patbond.patbond.auth.client.UserClient; +import com.patbond.patbond.auth.dto.AuthTokenResponse; +import com.patbond.patbond.auth.dto.LoginRequest; +import com.patbond.patbond.auth.dto.RegisterRequest; +import com.patbond.patbond.common.response.ApiResponse; +import com.patbond.patbond.common.user.CreateUserRequest; +import com.patbond.patbond.common.user.UserProfile; +import com.patbond.patbond.common.user.VerifyPasswordRequest; +import com.patbond.patbond.common.user.VerifyPasswordResponse; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Service; +import org.springframework.web.server.ResponseStatusException; + +import java.time.LocalDateTime; +import java.util.UUID; + +@Service +public class AuthService { + + private final UserClient userClient; + + public AuthService(UserClient userClient) { + this.userClient = userClient; + } + + public AuthTokenResponse register(RegisterRequest request) { + ApiResponse response = userClient.createUser(new CreateUserRequest( + request.getUsername(), + request.getPassword(), + request.getNickname(), + request.getPhone() + )); + UserProfile user = requireData(response, "注册失败"); + return buildToken(user.getId(), user.getUsername(), user.getNickname()); + } + + public AuthTokenResponse login(LoginRequest request) { + ApiResponse response = userClient.verifyPassword( + new VerifyPasswordRequest(request.getUsername(), request.getPassword()) + ); + VerifyPasswordResponse user = requireData(response, "登录失败"); + return buildToken(user.getUserId(), user.getUsername(), user.getNickname()); + } + + private AuthTokenResponse buildToken(Long userId, String username, String nickname) { + return new AuthTokenResponse( + "Bearer", + UUID.randomUUID().toString().replace("-", ""), + LocalDateTime.now().plusHours(2), + userId, + username, + nickname + ); + } + + private T requireData(ApiResponse response, String defaultMessage) { + if (response == null || !response.isSuccess() || response.getData() == null) { + String message = response == null || response.getMessage() == null ? defaultMessage : response.getMessage(); + throw new ResponseStatusException(HttpStatus.BAD_REQUEST, message); + } + return response.getData(); + } +} diff --git a/patbond-auth/src/main/resources/application.yml b/patbond-auth/src/main/resources/application.yml new file mode 100644 index 0000000..fbdcf39 --- /dev/null +++ b/patbond-auth/src/main/resources/application.yml @@ -0,0 +1,12 @@ +server: + port: 8081 + +spring: + application: + name: patbond-auth + cloud: + nacos: + discovery: + server-addr: ${NACOS_SERVER_ADDR:127.0.0.1:8848} + config: + server-addr: ${NACOS_SERVER_ADDR:127.0.0.1:8848} diff --git a/patbond-auth/target/classes/application.yml b/patbond-auth/target/classes/application.yml new file mode 100644 index 0000000..fbdcf39 --- /dev/null +++ b/patbond-auth/target/classes/application.yml @@ -0,0 +1,12 @@ +server: + port: 8081 + +spring: + application: + name: patbond-auth + cloud: + nacos: + discovery: + server-addr: ${NACOS_SERVER_ADDR:127.0.0.1:8848} + config: + server-addr: ${NACOS_SERVER_ADDR:127.0.0.1:8848} diff --git a/patbond-auth/target/classes/com/patbond/patbond/auth/AuthApplication.class b/patbond-auth/target/classes/com/patbond/patbond/auth/AuthApplication.class new file mode 100644 index 0000000000000000000000000000000000000000..a9a811ccd39ec4b5d69936932c394bf6f656b036 GIT binary patch literal 782 zcma)4O;6iE5Pcg04sKd#pcMLX=q=>HUQksj6;c|NlSL&`rH7u@&c-a*yViQ$_HS_l zap(`=MWU!q6e*KU#D2JQg`2GV>0 literal 0 HcmV?d00001 diff --git a/patbond-auth/target/classes/com/patbond/patbond/auth/client/UserClient.class b/patbond-auth/target/classes/com/patbond/patbond/auth/client/UserClient.class new file mode 100644 index 0000000000000000000000000000000000000000..a9b266385042b0fc4ee8f19e293efd897b22c394 GIT binary patch literal 1134 zcmcgr%}N6?5T4X(wQB4C&q?s4LJfkRDuN0~c*<^PYw9*xlWfHY@eO@@wH&N7$omF`!)uF%L9kQxb(=@Rd0I94 zJDs();xS?Pc^_WKhZwCZ@BYLwXd|sG^3zDxd+%iiGgq>ygo_O_c>WjB!7*mq*TI71_*St~YX}q!StJjhaFcyF2cug8W;X!9t?W zL!p}d(rcmbrWi2D(3k^cvJ565OKURuf+@(+UZDTev}SIBS;)gIo#hhJ8~_pK3GhWI Zjvy=y5Gd+m8ha^)&Qh3VS}PV-KLMCPZu|fM literal 0 HcmV?d00001 diff --git a/patbond-auth/target/classes/com/patbond/patbond/auth/controller/AuthController.class b/patbond-auth/target/classes/com/patbond/patbond/auth/controller/AuthController.class new file mode 100644 index 0000000000000000000000000000000000000000..452589f39d004883d265b060fe7d67ffa060bb60 GIT binary patch literal 2226 zcmcIl>rPWa5dO9lO3P7hil8Ebx6&dj2#SFak;t#Aq>%nG8n>rwS!mDJa{+k^6JJCV zZ}Eo@;6oW_54F&w7r>B{J-f5{X6Bon+1cNJe*OY5herv-Fd0V|QVFCnmB3w0n-!1Y zUJNq~JtFY8Hl(|&Y{@X4v2~eOgrC<=p*9-`_YN?8H<0K%_v7c56XGzZi;+~b_O!q7NwkUm65BPQGZK$40Fx>*xK=3T`Ea8WVu=siD;9CKXBKP!%-ec>xQ28Q{J zc8lDrxXLNMbwye3X?KV3$vn?1Dk)LJ@^$U`&qSp{K(g7nD@p-H9H$fgm#EQtKb!lN zdSAntZLurfb5d1>kO0q_C7GM3S6vr|3T6M4T&tzKlA*OD$Ohv9Xb>|_k=f2t_m zIy-gt89tmTol{jx7q1>wVnYY6E!UK}-h-yB4sYkQ$s)tTu`7p)(LYqDgq%b*ywgYO zj+Y#N3J@mIoT0?|BAd&hGmP&s`teQ0ogXE8qKZ72^ zC7REZJWONcC74HgS7`DjRvFIz21aLX9Ffm`pTaa-%Ji V2yPOe2yTVi1GKtL@|{{N$-h2wj&A?} literal 0 HcmV?d00001 diff --git a/patbond-auth/target/classes/com/patbond/patbond/auth/dto/AuthTokenResponse.class b/patbond-auth/target/classes/com/patbond/patbond/auth/dto/AuthTokenResponse.class new file mode 100644 index 0000000000000000000000000000000000000000..5ae6bdd85df52170479dbdd2d8b2c1cb0dd62cfa GIT binary patch literal 1346 zcmb7CU2hUm5Iq-`+m_JngOJR}-8pm4ojZU2{`w8zDeMCBsO6DEoy}u54K__S7Mp`C4zp+p z=$Sy#aa|dPJuahi`FZNiWY~!W%w>7xO{Coo zTxa~siDZv5Lh18R&fX0LHdlIf1JyCd-+X66j5*(P&z7P7-1EKYg+SC;fy6SdJ4xVP zDOG$c`L)fOeF5!dFeF7AUC)Zyinjt*9|82)QJXx zKfLhHJUX$5QDAo{P=os*!)f4$JQ-soBXzc%`F5juRiQwMsyeHKXV~k@+3%dg5+*>e zM8zND2PmIcs%MR#pcoe{N6*>O#X}U1gZa#rZ#=$y<;oS>ydws-&^Ay&(SX6`21*7t zuxa2Xr)3lc+W$8j+Lg=odp|gpF6~&l(d?s23!A6S){$aLic-v~JP|8T+{zQZ@}z)# z7J`&+lf6aRSHfk<*R7ur*1-ZP>u`az)mlKaOl^UTWo8!8EmL10`(5>^kliPK(Cswh z$kPQ&biXb7o78!aI@eIaZK`;??2bG1g@1LWR;Y;erc}g=(<)-knu=I;Mn$Y!C%t#E z6RWn#bB~Pm1F3Hmq==4(!H1?IHkJi3vB14VaC#lQn+V>;eQL+^T4mPO!PP|Y9v&os fGwa}5BDk6;TVDq^6T$n5;OsiMl?Z;Q#`@?V(x>;2 literal 0 HcmV?d00001 diff --git a/patbond-auth/target/classes/com/patbond/patbond/auth/dto/LoginRequest.class b/patbond-auth/target/classes/com/patbond/patbond/auth/dto/LoginRequest.class new file mode 100644 index 0000000000000000000000000000000000000000..632663e49bfb1393b9e6d3dd97e3ad82267dafe3 GIT binary patch literal 1004 zcma))&2G~`5XWbo52s0*rfCysOM$|Hq?Pc68>kW>af%9ROYR$c#GM zN*s6qj&K4bP^(Dr06a%acnZX<8zoI*BxHHkGoG3MZ+7?RpWY7uxCPhqkb%oHkcKP9 zT(x1%hHC_Jkz%2s0V7ap?$ZP6bg1y19UXGv-zKoM9SO|?*5Zn{JM69yQd7;PPy}wo z1<#!W+TmUtbX@$QL&}9#&X&~ou-OyrVh2nq>Z3@t|L()DH%F&$4^NH{f4};Ea@^~G z>=9TU*V%p19oNcrsZ!5m=ppCnr`P@WFURY%cevnslR&E8Xc0)?mmaFkHMwA0QP5`L zE=7DZq;zSgMMG}st(>aFLw0bn0&(w^({Em!5mp$Nye*QeeO>3uFOCAR)9*&7uGR literal 0 HcmV?d00001 diff --git a/patbond-auth/target/classes/com/patbond/patbond/auth/dto/RegisterRequest.class b/patbond-auth/target/classes/com/patbond/patbond/auth/dto/RegisterRequest.class new file mode 100644 index 0000000000000000000000000000000000000000..83118d0ed88d6fcd3954e2e51ee9483a31efc271 GIT binary patch literal 1787 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 literal 0 HcmV?d00001 diff --git a/patbond-auth/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/patbond-auth/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..99973a7 --- /dev/null +++ b/patbond-auth/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,7 @@ +com/patbond/patbond/auth/dto/RegisterRequest.class +com/patbond/patbond/auth/AuthApplication.class +com/patbond/patbond/auth/dto/AuthTokenResponse.class +com/patbond/patbond/auth/client/UserClient.class +com/patbond/patbond/auth/controller/AuthController.class +com/patbond/patbond/auth/dto/LoginRequest.class +com/patbond/patbond/auth/service/AuthService.class diff --git a/patbond-auth/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/patbond-auth/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..730c492 --- /dev/null +++ b/patbond-auth/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,7 @@ +/home/zyx/workspace/duoduo/patbond/patbond-api/patbond-auth/src/main/java/com/patbond/patbond/auth/AuthApplication.java +/home/zyx/workspace/duoduo/patbond/patbond-api/patbond-auth/src/main/java/com/patbond/patbond/auth/client/UserClient.java +/home/zyx/workspace/duoduo/patbond/patbond-api/patbond-auth/src/main/java/com/patbond/patbond/auth/controller/AuthController.java +/home/zyx/workspace/duoduo/patbond/patbond-api/patbond-auth/src/main/java/com/patbond/patbond/auth/dto/AuthTokenResponse.java +/home/zyx/workspace/duoduo/patbond/patbond-api/patbond-auth/src/main/java/com/patbond/patbond/auth/dto/LoginRequest.java +/home/zyx/workspace/duoduo/patbond/patbond-api/patbond-auth/src/main/java/com/patbond/patbond/auth/dto/RegisterRequest.java +/home/zyx/workspace/duoduo/patbond/patbond-api/patbond-auth/src/main/java/com/patbond/patbond/auth/service/AuthService.java diff --git a/patbond-common/pom.xml b/patbond-common/pom.xml new file mode 100644 index 0000000..6ce33f9 --- /dev/null +++ b/patbond-common/pom.xml @@ -0,0 +1,55 @@ + + + 4.0.0 + + + com.patbond.patbond + patbond-api + 1.0.0-SNAPSHOT + ../pom.xml + + + patbond-common + jar + + patbond-common + Common dependencies and shared code for Patbond services + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-validation + + + org.springframework.boot + spring-boot-starter-amqp + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + cn.hutool + hutool-all + + + org.projectlombok + lombok + true + + + diff --git a/patbond-common/src/main/java/com/patbond/patbond/common/package-info.java b/patbond-common/src/main/java/com/patbond/patbond/common/package-info.java new file mode 100644 index 0000000..33ca819 --- /dev/null +++ b/patbond-common/src/main/java/com/patbond/patbond/common/package-info.java @@ -0,0 +1,4 @@ +/** + * Shared code for Patbond microservices. + */ +package com.patbond.patbond.common; diff --git a/patbond-common/src/main/java/com/patbond/patbond/common/response/ApiResponse.java b/patbond-common/src/main/java/com/patbond/patbond/common/response/ApiResponse.java new file mode 100644 index 0000000..21dd907 --- /dev/null +++ b/patbond-common/src/main/java/com/patbond/patbond/common/response/ApiResponse.java @@ -0,0 +1,53 @@ +package com.patbond.patbond.common.response; + +public class ApiResponse { + + private Integer code; + private String message; + private T data; + + public ApiResponse() { + } + + public ApiResponse(Integer code, String message, T data) { + this.code = code; + this.message = message; + this.data = data; + } + + public static ApiResponse success(T data) { + return new ApiResponse<>(0, "success", data); + } + + public static ApiResponse failure(Integer code, String message) { + return new ApiResponse<>(code, message, null); + } + + public boolean isSuccess() { + return Integer.valueOf(0).equals(code); + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } +} diff --git a/patbond-common/src/main/java/com/patbond/patbond/common/user/CreateUserRequest.java b/patbond-common/src/main/java/com/patbond/patbond/common/user/CreateUserRequest.java new file mode 100644 index 0000000..587bf5a --- /dev/null +++ b/patbond-common/src/main/java/com/patbond/patbond/common/user/CreateUserRequest.java @@ -0,0 +1,63 @@ +package com.patbond.patbond.common.user; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; + +public class CreateUserRequest { + + @NotBlank(message = "用户名不能为空") + @Size(min = 3, max = 32, message = "用户名长度必须在3到32位之间") + private String username; + + @NotBlank(message = "密码不能为空") + @Size(min = 6, max = 64, message = "密码长度必须在6到64位之间") + private String password; + + @Size(max = 32, message = "昵称长度不能超过32位") + private String nickname; + + @Size(max = 20, message = "手机号长度不能超过20位") + private String phone; + + public CreateUserRequest() { + } + + public CreateUserRequest(String username, String password, String nickname, String phone) { + this.username = username; + this.password = password; + this.nickname = nickname; + this.phone = phone; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } +} diff --git a/patbond-common/src/main/java/com/patbond/patbond/common/user/UserProfile.java b/patbond-common/src/main/java/com/patbond/patbond/common/user/UserProfile.java new file mode 100644 index 0000000..ddc9c8a --- /dev/null +++ b/patbond-common/src/main/java/com/patbond/patbond/common/user/UserProfile.java @@ -0,0 +1,63 @@ +package com.patbond.patbond.common.user; + +import java.time.LocalDateTime; + +public class UserProfile { + + private Long id; + private String username; + private String nickname; + private String phone; + private LocalDateTime createdAt; + + public UserProfile() { + } + + public UserProfile(Long id, String username, String nickname, String phone, LocalDateTime createdAt) { + this.id = id; + this.username = username; + this.nickname = nickname; + this.phone = phone; + this.createdAt = createdAt; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(LocalDateTime createdAt) { + this.createdAt = createdAt; + } +} diff --git a/patbond-common/src/main/java/com/patbond/patbond/common/user/VerifyPasswordRequest.java b/patbond-common/src/main/java/com/patbond/patbond/common/user/VerifyPasswordRequest.java new file mode 100644 index 0000000..40f2a80 --- /dev/null +++ b/patbond-common/src/main/java/com/patbond/patbond/common/user/VerifyPasswordRequest.java @@ -0,0 +1,36 @@ +package com.patbond.patbond.common.user; + +import javax.validation.constraints.NotBlank; + +public class VerifyPasswordRequest { + + @NotBlank(message = "用户名不能为空") + private String username; + + @NotBlank(message = "密码不能为空") + private String password; + + public VerifyPasswordRequest() { + } + + public VerifyPasswordRequest(String username, String password) { + this.username = username; + this.password = password; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} diff --git a/patbond-common/src/main/java/com/patbond/patbond/common/user/VerifyPasswordResponse.java b/patbond-common/src/main/java/com/patbond/patbond/common/user/VerifyPasswordResponse.java new file mode 100644 index 0000000..e204b3b --- /dev/null +++ b/patbond-common/src/main/java/com/patbond/patbond/common/user/VerifyPasswordResponse.java @@ -0,0 +1,41 @@ +package com.patbond.patbond.common.user; + +public class VerifyPasswordResponse { + + private Long userId; + private String username; + private String nickname; + + public VerifyPasswordResponse() { + } + + public VerifyPasswordResponse(Long userId, String username, String nickname) { + this.userId = userId; + this.username = username; + this.nickname = nickname; + } + + public Long getUserId() { + return userId; + } + + public void setUserId(Long userId) { + this.userId = userId; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } +} diff --git a/patbond-common/target/classes/com/patbond/patbond/common/package-info.class b/patbond-common/target/classes/com/patbond/patbond/common/package-info.class new file mode 100644 index 0000000000000000000000000000000000000000..678ef13784f203661fafeda8b0293ae27dfe9a1a GIT binary patch literal 132 zcmX^0Z`VEs1_l!bc18yE}85sn! z63Y_xa}x8?_5G8wQj<&A8JHOv1d-M0fs`;Za0Ta=7A2>;W#*)cF)%POumJ4?0Y(Nk JAj!nQ3IN(6BW3^q literal 0 HcmV?d00001 diff --git a/patbond-common/target/classes/com/patbond/patbond/common/response/ApiResponse.class b/patbond-common/target/classes/com/patbond/patbond/common/response/ApiResponse.class new file mode 100644 index 0000000000000000000000000000000000000000..e265d3a8fbc204f0b658468c85bd96afbb44678b GIT binary patch literal 2484 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 + + 4.0.0 + + + com.patbond.patbond + patbond-api + 1.0.0-SNAPSHOT + ../pom.xml + + + patbond-user + jar + + patbond-user + User service for Patbond + + + + com.patbond.patbond + patbond-common + ${project.version} + + + org.springframework.security + spring-security-crypto + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/patbond-user/src/main/java/com/patbond/patbond/user/UserApplication.java b/patbond-user/src/main/java/com/patbond/patbond/user/UserApplication.java new file mode 100644 index 0000000..3142542 --- /dev/null +++ b/patbond-user/src/main/java/com/patbond/patbond/user/UserApplication.java @@ -0,0 +1,12 @@ +package com.patbond.patbond.user; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class UserApplication { + + public static void main(String[] args) { + SpringApplication.run(UserApplication.class, args); + } +} diff --git a/patbond-user/src/main/java/com/patbond/patbond/user/controller/UserController.java b/patbond-user/src/main/java/com/patbond/patbond/user/controller/UserController.java new file mode 100644 index 0000000..ebc71d5 --- /dev/null +++ b/patbond-user/src/main/java/com/patbond/patbond/user/controller/UserController.java @@ -0,0 +1,46 @@ +package com.patbond.patbond.user.controller; + +import com.patbond.patbond.common.response.ApiResponse; +import com.patbond.patbond.common.user.CreateUserRequest; +import com.patbond.patbond.common.user.UserProfile; +import com.patbond.patbond.common.user.VerifyPasswordRequest; +import com.patbond.patbond.common.user.VerifyPasswordResponse; +import com.patbond.patbond.user.service.UserService; +import javax.validation.Valid; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +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("/internal/users") +public class UserController { + + private final UserService userService; + + public UserController(UserService userService) { + this.userService = userService; + } + + @PostMapping + public ApiResponse createUser(@Valid @RequestBody CreateUserRequest request) { + return ApiResponse.success(userService.createUser(request)); + } + + @PostMapping("/verify-password") + public ApiResponse verifyPassword(@Valid @RequestBody VerifyPasswordRequest request) { + return ApiResponse.success(userService.verifyPassword(request)); + } + + @GetMapping("/{id}") + public ApiResponse getById(@PathVariable Long id) { + return ApiResponse.success(userService.getById(id)); + } + + @GetMapping("/by-username/{username}") + public ApiResponse getByUsername(@PathVariable String username) { + return ApiResponse.success(userService.getByUsername(username)); + } +} diff --git a/patbond-user/src/main/java/com/patbond/patbond/user/service/UserService.java b/patbond-user/src/main/java/com/patbond/patbond/user/service/UserService.java new file mode 100644 index 0000000..2bedd31 --- /dev/null +++ b/patbond-user/src/main/java/com/patbond/patbond/user/service/UserService.java @@ -0,0 +1,120 @@ +package com.patbond.patbond.user.service; + +import com.patbond.patbond.common.user.CreateUserRequest; +import com.patbond.patbond.common.user.UserProfile; +import com.patbond.patbond.common.user.VerifyPasswordRequest; +import com.patbond.patbond.common.user.VerifyPasswordResponse; +import org.springframework.http.HttpStatus; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.stereotype.Service; +import org.springframework.web.server.ResponseStatusException; + +import java.time.LocalDateTime; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicLong; + +@Service +public class UserService { + + private final AtomicLong idGenerator = new AtomicLong(1); + private final Map usersById = new ConcurrentHashMap<>(); + private final Map usersByUsername = new ConcurrentHashMap<>(); + private final PasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); + + public synchronized UserProfile createUser(CreateUserRequest request) { + String username = request.getUsername().trim(); + if (usersByUsername.containsKey(username)) { + throw new ResponseStatusException(HttpStatus.CONFLICT, "用户名已存在"); + } + + UserRecord user = new UserRecord( + idGenerator.getAndIncrement(), + username, + passwordEncoder.encode(request.getPassword()), + normalizeBlank(request.getNickname()), + normalizeBlank(request.getPhone()), + LocalDateTime.now() + ); + usersById.put(user.getId(), user); + usersByUsername.put(user.getUsername(), user); + return toProfile(user); + } + + public VerifyPasswordResponse verifyPassword(VerifyPasswordRequest request) { + UserRecord user = usersByUsername.get(request.getUsername().trim()); + if (user == null || !passwordEncoder.matches(request.getPassword(), user.getPasswordHash())) { + throw new ResponseStatusException(HttpStatus.UNAUTHORIZED, "用户名或密码错误"); + } + return new VerifyPasswordResponse(user.getId(), user.getUsername(), user.getNickname()); + } + + public UserProfile getById(Long id) { + UserRecord user = usersById.get(id); + if (user == null) { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "用户不存在"); + } + return toProfile(user); + } + + public UserProfile getByUsername(String username) { + UserRecord user = usersByUsername.get(username.trim()); + if (user == null) { + throw new ResponseStatusException(HttpStatus.NOT_FOUND, "用户不存在"); + } + return toProfile(user); + } + + private UserProfile toProfile(UserRecord user) { + return new UserProfile(user.getId(), user.getUsername(), user.getNickname(), user.getPhone(), user.getCreatedAt()); + } + + private String normalizeBlank(String value) { + return value == null || value.trim().isEmpty() ? null : value.trim(); + } + + private static class UserRecord { + + private final Long id; + private final String username; + private final String passwordHash; + private final String nickname; + private final String phone; + private final LocalDateTime createdAt; + + private UserRecord(Long id, String username, String passwordHash, String nickname, String phone, + LocalDateTime createdAt) { + this.id = id; + this.username = username; + this.passwordHash = passwordHash; + this.nickname = nickname; + this.phone = phone; + this.createdAt = createdAt; + } + + private Long getId() { + return id; + } + + private String getUsername() { + return username; + } + + private String getPasswordHash() { + return passwordHash; + } + + private String getNickname() { + return nickname; + } + + private String getPhone() { + return phone; + } + + private LocalDateTime getCreatedAt() { + return createdAt; + } + } +} diff --git a/patbond-user/src/main/resources/application.yml b/patbond-user/src/main/resources/application.yml new file mode 100644 index 0000000..7af11bc --- /dev/null +++ b/patbond-user/src/main/resources/application.yml @@ -0,0 +1,12 @@ +server: + port: 8082 + +spring: + application: + name: patbond-user + cloud: + nacos: + discovery: + server-addr: ${NACOS_SERVER_ADDR:127.0.0.1:8848} + config: + server-addr: ${NACOS_SERVER_ADDR:127.0.0.1:8848} diff --git a/patbond-user/target/classes/application.yml b/patbond-user/target/classes/application.yml new file mode 100644 index 0000000..7af11bc --- /dev/null +++ b/patbond-user/target/classes/application.yml @@ -0,0 +1,12 @@ +server: + port: 8082 + +spring: + application: + name: patbond-user + cloud: + nacos: + discovery: + server-addr: ${NACOS_SERVER_ADDR:127.0.0.1:8848} + config: + server-addr: ${NACOS_SERVER_ADDR:127.0.0.1:8848} diff --git a/patbond-user/target/classes/com/patbond/patbond/user/UserApplication.class b/patbond-user/target/classes/com/patbond/patbond/user/UserApplication.class new file mode 100644 index 0000000000000000000000000000000000000000..ff9917d6e46ab7711f45b2df357f4834ee012f02 GIT binary patch literal 719 zcma)4%TD7k6g@75lu%yfF~iJk*p)8u2C*qZf=a9+kmyWV%*qKSV@T}Eae&`q1!BPm z@KK2CfM|s}5?S1<`#R^I>pZ_aJ^|RluMl;t23QNRj&A|JGtBHMt=vAtRC{Z{Q16*@ z$*>qHEsx7QmiD)ZGs?6glZb2}tn%@DvhMz=f}s;7Cg(%pVx!MLd|61#|ByKt4l|Vq zr;P3rLoSqNSa1K0F2%Lrnb0ZkJF9fstu_!gCCrrxWrnbCN}I?d2!_r9WNqi|2M_2prDsSXt#PmA0q@%^{v77ZWQ54+?XWE)5lC(K_ z>v->7qkqOR3QGHO7n`WjPvXBCnAb}-poo)aGFXw^Com^vHHhg1Pg1T-_kXkY=0l&@i_vdd_Z_gpK$D=C`1oB#j- literal 0 HcmV?d00001 diff --git a/patbond-user/target/classes/com/patbond/patbond/user/controller/UserController.class b/patbond-user/target/classes/com/patbond/patbond/user/controller/UserController.class new file mode 100644 index 0000000000000000000000000000000000000000..c74532e9b76bb365eccd18d30640adfeb4907a06 GIT binary patch literal 3313 zcmcgv+j1L45IrMb6v-Rg*pN7YAu)vbKDjs-uyJB5aR>-d*+DNnjij+Mj&wRk?c^hYjq3!XIOkO;=tN$*@~dXOB=uuas?nRNyjK>rqR`6D+b@UB6Xi3k zCC4dyuF+ntMrFez_Ek-;Z_*ks>^5Da z>awVOMZ2}-x}Fh6ks1s)^PaA9zoC^|-PfWnpL_Z#e=bYBr09T&$d(s8-+U<=4KgIm z*>23otwuNQO#VO|itqTLsHsX2j2G>YT<5x73&MsqQlFAnd-u1!N{hh952aT7t%C4< zT1kcBp#P>6yIfx7G~MpIH}SC;etc~-`=6g)j$z^iM`?uivq?vNl7~94G$NtXRcW?c zk4W;|e6abvCfq8|dvsn-lbI<+P?Nn#4Eoj4`%BQ9LTdx3$wS$ZB_sTWs(jCIYhd?+ zFi(!kDjnyufvA>^OG(1;pmXti#%ArQ#64pRS_nDSA#od#!TcX_PA>C#UTUozQR6R; zMx#8Zz}`zgaFzpE^_5Q4g1Ts-ym_|3Z5U z-TqL9z05e;15K>gLn`hkfuv*sfjdgALqdb_$YCE5wGqtGc4@P zvak2!31EY%gp`;FL}%C5hW1580`bLDeWtoA3?-%Rw7`64P33%H^CLA^mq|ndiE%e| z*G=kd_SKfXiqV_ZPtbBLFgsXF^|sR9ljl2qwyLzv)hR8>Gyc3B^$^&b^eBLP=>8>ZBz}%bgiT)+8#i9BifV#Mkh^ zBh28*3=jQ)eiXynN3x^3=fS274_fDJoxS$id#^1$`TMWO0G4sThzZ;f_(Wh`;HJQ* z0=EQi7g54SfxAtC&jjuW)CIN#wsW|b!{-K4e#1bi{?K{k)Q+6spjK}M2WtlMCmpXH zI8Dz$IdQrhwtaPO9y^`RPpx)i!|5E-J@DNhBKOSkVJjf5;I=&{^cpup1C=O5=r=uH z;5tV)d9p`~H)XH+fgfHs5LOcxsWcLHeDU+V(cC`uz(9Jv)nK|4bwBX7Pn!E)d(YWF zQgutF51h6ycKk9O9{L>v#rtf}j_0xg2F%SM@Y?G~?1;y+t97^4tQ|Yyek*A7SLtVs z&m-UUYQo-)_LFCk*o@497j80SxjL07HP&RDhvFUe`TSEZePJf(bnhu`gtpz6Cokub zLMFHCXChtb1=KVuhaCgI{{I4v*2;x75j6GlyugCMqQH{CvcQVKs)6}Y<5F?Qb-hk! za$%m)?^H(%kkDA8YcKSogx>mZLigvP7ko*A_l)JFv63`a#n^l995f@u+jm_>Qa|Dosd-!(TAE9+D% zOI0hYY7VU6^(y)5STvlI_C!gPtk8 zLA-=K@e8E!B?|b8QNQN>-|&WS@fNT%zbO4A;|oc ZKB8JFe2llbmbsh2U0g&FGql;ze*m*u4F&)J literal 0 HcmV?d00001 diff --git a/patbond-user/target/classes/com/patbond/patbond/user/service/UserService.class b/patbond-user/target/classes/com/patbond/patbond/user/service/UserService.class new file mode 100644 index 0000000000000000000000000000000000000000..1540ef207b139f8a58c3dbd827ccb75616de05a1 GIT binary patch literal 5175 zcmb_g`F|958GdFHn9VRGbU8u=TtuDH@ELqo)}CH~&*4#NJ*H9EJVd{0673DdQXj!%0{!SP#j z)qlg5x$`x1UpnR3X`yaMQJV_gGjnU;B332xK5TkHp57PccRu%S*M|{{>At9d{jeG= z^mT~80|&JfY6?AcySmCeCk!41BgILdi&t+~ZMp5ZNn^}9W$qzQqY5?@wZ$)#K9RWq zoOi+)%P>#19w*}_%>4{|k|m_{1cA3vHYvEfJ7arR((Jd=78AL}wjIy#Ec#k1aM5Do znXc)0<0&&9ifY!;f;|K`w}LIJzprBl?z!2P)?B$iV5CQw0y^%+P8}b`P6hWD1vR6> z4f>TXzNb|R-gLf%RZ_=&xL?H&bi9BUnO8b~DDNNXcnLpNu)Uc4ljfj*0W;jRZ-D` zcXa$oR8#~i{yA|rAVop_tt3mlhIyys&m!(!{6%E`Rmb1(cLfc_B-|_$nE?4r=^8v{ zCOjTiwrIVgwa=3=5acJp(KcODiiu`(!COKNHh>RB$COLe+gf`SR2NPA z89R6o>?~d%W-gp6o`J^lnKi!_c^=kcTj|3#^FYhv)!lYv-`+ek zTSe-QLRoW;G;w}eXIJmT`@8x&3q)=ck<(GJT{^vY%zTkp^}iKngv@Ny=RQ(Ig;=Os z>3zwR#}dnLq9a(#&*Lrpa4$tn?l5e{fqn%GJL=v*v|$qE5uC@ODO3zx z!lKw+S;XF+!r}qWmR`Y<2`p`3a{)Ikn?z*X;VM{W-w6; zkF#Q3U0^|I9c{ru9HMoJ1RD6tUy3rFd@iO@<;jGU9 z%~(q|Cb2HUE7IbQhO4Ly4PM_cfvQPVm*BZ+f;PlH5)f1~z{yp7R`aRNqAqV-%m=v< zOAto`HZe?^eDG@mr8)2&1m8lJK1 z4^?@EPGB$Z^g!^z0>PCz!Ik(lV^awuvZTDERU)zkh7W5H3BG0j5Z~MQ#HeyB-&ho7 KmNzjgwEqGdS>Txf literal 0 HcmV?d00001 diff --git a/patbond-user/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/patbond-user/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..5b7238b --- /dev/null +++ b/patbond-user/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,5 @@ +com/patbond/patbond/user/service/UserService$1.class +com/patbond/patbond/user/UserApplication.class +com/patbond/patbond/user/service/UserService$UserRecord.class +com/patbond/patbond/user/controller/UserController.class +com/patbond/patbond/user/service/UserService.class diff --git a/patbond-user/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/patbond-user/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..938c75c --- /dev/null +++ b/patbond-user/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,3 @@ +/home/zyx/workspace/duoduo/patbond/patbond-api/patbond-user/src/main/java/com/patbond/patbond/user/UserApplication.java +/home/zyx/workspace/duoduo/patbond/patbond-api/patbond-user/src/main/java/com/patbond/patbond/user/controller/UserController.java +/home/zyx/workspace/duoduo/patbond/patbond-api/patbond-user/src/main/java/com/patbond/patbond/user/service/UserService.java diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..1639262 --- /dev/null +++ b/pom.xml @@ -0,0 +1,91 @@ + + + 4.0.0 + + com.patbond.patbond + patbond-api + 1.0.0-SNAPSHOT + pom + + patbond-api + Patbond microservice parent project + + + patbond-common + patbond-user + patbond-auth + + + + 1.8 + UTF-8 + UTF-8 + + 2.7.18 + 2021.0.9 + 2021.0.6.0 + 1.18.36 + 5.8.35 + + + + + + org.springframework.boot + spring-boot-dependencies + ${spring-boot.version} + pom + import + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + com.alibaba.cloud + spring-cloud-alibaba-dependencies + ${spring-cloud-alibaba.version} + pom + import + + + cn.hutool + hutool-all + ${hutool.version} + + + org.projectlombok + lombok + ${lombok.version} + true + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.13.0 + + ${java.version} + ${java.version} + ${project.build.sourceEncoding} + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + + + +