commit b1252b991d9bf1e02ace9b2eb49baa724d37643a Author: nmbh1122@126.com Date: Mon Jul 13 09:41:15 2026 +0800 Initialize patbond microservice modules 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 0000000..a9a811c Binary files /dev/null and b/patbond-auth/target/classes/com/patbond/patbond/auth/AuthApplication.class differ 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 0000000..a9b2663 Binary files /dev/null and b/patbond-auth/target/classes/com/patbond/patbond/auth/client/UserClient.class differ 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 0000000..452589f Binary files /dev/null and b/patbond-auth/target/classes/com/patbond/patbond/auth/controller/AuthController.class differ 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 0000000..5ae6bdd Binary files /dev/null and b/patbond-auth/target/classes/com/patbond/patbond/auth/dto/AuthTokenResponse.class differ 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 0000000..632663e Binary files /dev/null and b/patbond-auth/target/classes/com/patbond/patbond/auth/dto/LoginRequest.class differ 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 0000000..83118d0 Binary files /dev/null and b/patbond-auth/target/classes/com/patbond/patbond/auth/dto/RegisterRequest.class differ diff --git a/patbond-auth/target/classes/com/patbond/patbond/auth/service/AuthService.class b/patbond-auth/target/classes/com/patbond/patbond/auth/service/AuthService.class new file mode 100644 index 0000000..33f7129 Binary files /dev/null and b/patbond-auth/target/classes/com/patbond/patbond/auth/service/AuthService.class differ 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 0000000..678ef13 Binary files /dev/null and b/patbond-common/target/classes/com/patbond/patbond/common/package-info.class differ 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 0000000..e265d3a Binary files /dev/null and b/patbond-common/target/classes/com/patbond/patbond/common/response/ApiResponse.class differ diff --git a/patbond-common/target/classes/com/patbond/patbond/common/user/CreateUserRequest.class b/patbond-common/target/classes/com/patbond/patbond/common/user/CreateUserRequest.class new file mode 100644 index 0000000..f04d198 Binary files /dev/null and b/patbond-common/target/classes/com/patbond/patbond/common/user/CreateUserRequest.class differ diff --git a/patbond-common/target/classes/com/patbond/patbond/common/user/UserProfile.class b/patbond-common/target/classes/com/patbond/patbond/common/user/UserProfile.class new file mode 100644 index 0000000..3d9014d Binary files /dev/null and b/patbond-common/target/classes/com/patbond/patbond/common/user/UserProfile.class differ diff --git a/patbond-common/target/classes/com/patbond/patbond/common/user/VerifyPasswordRequest.class b/patbond-common/target/classes/com/patbond/patbond/common/user/VerifyPasswordRequest.class new file mode 100644 index 0000000..1c66cee Binary files /dev/null and b/patbond-common/target/classes/com/patbond/patbond/common/user/VerifyPasswordRequest.class differ diff --git a/patbond-common/target/classes/com/patbond/patbond/common/user/VerifyPasswordResponse.class b/patbond-common/target/classes/com/patbond/patbond/common/user/VerifyPasswordResponse.class new file mode 100644 index 0000000..cf02534 Binary files /dev/null and b/patbond-common/target/classes/com/patbond/patbond/common/user/VerifyPasswordResponse.class differ diff --git a/patbond-common/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/patbond-common/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..3629ba9 --- /dev/null +++ b/patbond-common/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,6 @@ +com/patbond/patbond/common/user/CreateUserRequest.class +com/patbond/patbond/common/user/VerifyPasswordRequest.class +com/patbond/patbond/common/package-info.class +com/patbond/patbond/common/user/UserProfile.class +com/patbond/patbond/common/response/ApiResponse.class +com/patbond/patbond/common/user/VerifyPasswordResponse.class diff --git a/patbond-common/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/patbond-common/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..23d09e7 --- /dev/null +++ b/patbond-common/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,6 @@ +/home/zyx/workspace/duoduo/patbond/patbond-api/patbond-common/src/main/java/com/patbond/patbond/common/package-info.java +/home/zyx/workspace/duoduo/patbond/patbond-api/patbond-common/src/main/java/com/patbond/patbond/common/response/ApiResponse.java +/home/zyx/workspace/duoduo/patbond/patbond-api/patbond-common/src/main/java/com/patbond/patbond/common/user/CreateUserRequest.java +/home/zyx/workspace/duoduo/patbond/patbond-api/patbond-common/src/main/java/com/patbond/patbond/common/user/UserProfile.java +/home/zyx/workspace/duoduo/patbond/patbond-api/patbond-common/src/main/java/com/patbond/patbond/common/user/VerifyPasswordRequest.java +/home/zyx/workspace/duoduo/patbond/patbond-api/patbond-common/src/main/java/com/patbond/patbond/common/user/VerifyPasswordResponse.java diff --git a/patbond-user/pom.xml b/patbond-user/pom.xml new file mode 100644 index 0000000..0fc7531 --- /dev/null +++ b/patbond-user/pom.xml @@ -0,0 +1,40 @@ + + + 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 0000000..ff9917d Binary files /dev/null and b/patbond-user/target/classes/com/patbond/patbond/user/UserApplication.class differ 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 0000000..c74532e Binary files /dev/null and b/patbond-user/target/classes/com/patbond/patbond/user/controller/UserController.class differ diff --git a/patbond-user/target/classes/com/patbond/patbond/user/service/UserService$1.class b/patbond-user/target/classes/com/patbond/patbond/user/service/UserService$1.class new file mode 100644 index 0000000..7a10d67 Binary files /dev/null and b/patbond-user/target/classes/com/patbond/patbond/user/service/UserService$1.class differ diff --git a/patbond-user/target/classes/com/patbond/patbond/user/service/UserService$UserRecord.class b/patbond-user/target/classes/com/patbond/patbond/user/service/UserService$UserRecord.class new file mode 100644 index 0000000..2d3597f Binary files /dev/null and b/patbond-user/target/classes/com/patbond/patbond/user/service/UserService$UserRecord.class differ 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 0000000..1540ef2 Binary files /dev/null and b/patbond-user/target/classes/com/patbond/patbond/user/service/UserService.class differ 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} + + + + +