管理面板功能完善,注册需要手机号
This commit is contained in:
@@ -124,6 +124,7 @@ public class AdminService {
|
||||
user.getId(),
|
||||
user.getUsername(),
|
||||
user.getEmail(),
|
||||
user.getPhoneNumber(),
|
||||
user.getCreatedAt(),
|
||||
user.getLastSchoolStudentId(),
|
||||
user.getLastSchoolSemester(),
|
||||
|
||||
@@ -8,6 +8,7 @@ public record AdminUserResponse(
|
||||
Long id,
|
||||
String username,
|
||||
String email,
|
||||
String phoneNumber,
|
||||
LocalDateTime createdAt,
|
||||
String lastSchoolStudentId,
|
||||
String lastSchoolSemester,
|
||||
|
||||
@@ -55,11 +55,15 @@ public class AuthService {
|
||||
if (userRepository.existsByEmail(request.email())) {
|
||||
throw new BusinessException(ErrorCode.UNKNOWN, "邮箱已存在");
|
||||
}
|
||||
if (userRepository.existsByPhoneNumber(request.phoneNumber())) {
|
||||
throw new BusinessException(ErrorCode.UNKNOWN, "手机号已存在");
|
||||
}
|
||||
|
||||
User user = new User();
|
||||
user.setUsername(request.username());
|
||||
user.setDisplayName(request.username());
|
||||
user.setEmail(request.email());
|
||||
user.setPhoneNumber(request.phoneNumber());
|
||||
user.setPasswordHash(passwordEncoder.encode(request.password()));
|
||||
user.setRole(UserRole.USER);
|
||||
user.setPreferredLanguage("zh-CN");
|
||||
@@ -127,9 +131,14 @@ public class AuthService {
|
||||
if (!user.getEmail().equalsIgnoreCase(nextEmail) && userRepository.existsByEmail(nextEmail)) {
|
||||
throw new BusinessException(ErrorCode.UNKNOWN, "邮箱已存在");
|
||||
}
|
||||
String nextPhoneNumber = request.phoneNumber().trim();
|
||||
if (!nextPhoneNumber.equals(user.getPhoneNumber()) && userRepository.existsByPhoneNumber(nextPhoneNumber)) {
|
||||
throw new BusinessException(ErrorCode.UNKNOWN, "手机号已存在");
|
||||
}
|
||||
|
||||
user.setDisplayName(request.displayName().trim());
|
||||
user.setEmail(nextEmail);
|
||||
user.setPhoneNumber(nextPhoneNumber);
|
||||
user.setBio(normalizeOptionalText(request.bio()));
|
||||
user.setPreferredLanguage(normalizePreferredLanguage(request.preferredLanguage()));
|
||||
return toProfile(userRepository.save(user));
|
||||
@@ -245,6 +254,7 @@ public class AuthService {
|
||||
user.getUsername(),
|
||||
user.getDisplayName(),
|
||||
user.getEmail(),
|
||||
user.getPhoneNumber(),
|
||||
user.getBio(),
|
||||
user.getPreferredLanguage(),
|
||||
buildAvatarUrl(user),
|
||||
|
||||
@@ -31,6 +31,9 @@ public class User {
|
||||
@Column(nullable = false, length = 128, unique = true)
|
||||
private String email;
|
||||
|
||||
@Column(name = "phone_number", length = 32, unique = true)
|
||||
private String phoneNumber;
|
||||
|
||||
@Column(name = "password_hash", nullable = false, length = 255)
|
||||
private String passwordHash;
|
||||
|
||||
@@ -108,6 +111,14 @@ public class User {
|
||||
this.email = email;
|
||||
}
|
||||
|
||||
public String getPhoneNumber() {
|
||||
return phoneNumber;
|
||||
}
|
||||
|
||||
public void setPhoneNumber(String phoneNumber) {
|
||||
this.phoneNumber = phoneNumber;
|
||||
}
|
||||
|
||||
public String getPasswordHash() {
|
||||
return passwordHash;
|
||||
}
|
||||
|
||||
@@ -13,6 +13,8 @@ public interface UserRepository extends JpaRepository<User, Long> {
|
||||
|
||||
boolean existsByEmail(String email);
|
||||
|
||||
boolean existsByPhoneNumber(String phoneNumber);
|
||||
|
||||
Optional<User> findByUsername(String username);
|
||||
|
||||
long countByLastSchoolStudentIdIsNotNull();
|
||||
@@ -23,7 +25,8 @@ public interface UserRepository extends JpaRepository<User, Long> {
|
||||
select u from User u
|
||||
where (:query is null or :query = ''
|
||||
or lower(u.username) like lower(concat('%', :query, '%'))
|
||||
or lower(u.email) like lower(concat('%', :query, '%')))
|
||||
or lower(u.email) like lower(concat('%', :query, '%'))
|
||||
or u.phoneNumber like concat('%', :query, '%'))
|
||||
""")
|
||||
Page<User> searchByUsernameOrEmail(@Param("query") String query, Pageable pageable);
|
||||
}
|
||||
|
||||
@@ -4,11 +4,15 @@ import com.yoyuzh.auth.PasswordPolicy;
|
||||
import jakarta.validation.constraints.Email;
|
||||
import jakarta.validation.constraints.AssertTrue;
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import jakarta.validation.constraints.Pattern;
|
||||
import jakarta.validation.constraints.Size;
|
||||
|
||||
public record RegisterRequest(
|
||||
@NotBlank @Size(min = 3, max = 64) String username,
|
||||
@NotBlank @Email @Size(max = 128) String email,
|
||||
@NotBlank
|
||||
@Pattern(regexp = "^1\\d{10}$", message = "请输入有效的11位手机号")
|
||||
String phoneNumber,
|
||||
@NotBlank @Size(min = 10, max = 64, message = "密码至少10位,且必须包含大写字母、小写字母、数字和特殊字符") String password
|
||||
) {
|
||||
|
||||
|
||||
@@ -2,11 +2,15 @@ package com.yoyuzh.auth.dto;
|
||||
|
||||
import jakarta.validation.constraints.Email;
|
||||
import jakarta.validation.constraints.NotBlank;
|
||||
import jakarta.validation.constraints.Pattern;
|
||||
import jakarta.validation.constraints.Size;
|
||||
|
||||
public record UpdateUserProfileRequest(
|
||||
@NotBlank @Size(min = 2, max = 64) String displayName,
|
||||
@NotBlank @Email @Size(max = 128) String email,
|
||||
@NotBlank
|
||||
@Pattern(regexp = "^1\\d{10}$", message = "请输入有效的11位手机号")
|
||||
String phoneNumber,
|
||||
@Size(max = 280) String bio,
|
||||
@Size(min = 2, max = 16) String preferredLanguage
|
||||
) {
|
||||
|
||||
@@ -9,6 +9,7 @@ public record UserProfileResponse(
|
||||
String username,
|
||||
String displayName,
|
||||
String email,
|
||||
String phoneNumber,
|
||||
String bio,
|
||||
String preferredLanguage,
|
||||
String avatarUrl,
|
||||
@@ -16,6 +17,6 @@ public record UserProfileResponse(
|
||||
LocalDateTime createdAt
|
||||
) {
|
||||
public UserProfileResponse(Long id, String username, String email, LocalDateTime createdAt) {
|
||||
this(id, username, username, email, null, "zh-CN", null, UserRole.USER, createdAt);
|
||||
this(id, username, username, email, null, null, "zh-CN", null, UserRole.USER, createdAt);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user