This commit is contained in:
xueque
2025-05-16 23:03:47 +08:00
parent 069bbede0e
commit 70c56f8192
25 changed files with 186 additions and 66 deletions

View File

@@ -3,16 +3,89 @@ package mvc.services
import shared.exceptions.NotFoundException
import mvc.dao.UserRepository
import mvc.entities.User
import mvc.entities.UserRankEnum
import mvc.entities.UserStatusEnum
import shared.dto.ChangeUsernameDto
import shared.exceptions.ChangeUsernameException
import java.time.Clock
import java.time.Duration
import java.time.LocalDateTime
class UserComplexService(
val repository: UserRepository
val repository: UserRepository,
) : UserService {
// 用户
override fun changeUsername(user: User): User {
val findUser = repository.findById(user.id) ?: throw NotFoundException("User ${user.id} not found")
val copy = findUser.copy(firstName = user.firstName, lastName = user.lastName)
repository.update(copy)
return copy
override fun changeUsername(userDto: ChangeUsernameDto): User {
val user = repository.findById(userDto.id) ?: throw NotFoundException("用户${userDto.id}不存在")
// 判断用户状态
if (user.status != UserStatusEnum.ACTIVE) throw ChangeUsernameException("用户未激活")
// 用户名长度
if( !(user.firstName.length + user.lastName.length in 4..20)) {
throw ChangeUsernameException("用户名长度需在4-20之间")
}
// 检测非法字符
val regex = Regex("^[a-zA-Z0-9_]+$")
if(!regex.matches(userDto.firstName) || !regex.matches(userDto.lastName)) {
throw ChangeUsernameException("包含非法字符")
}
// 检测权限
var canChangeUsername = false
var requiresEmailVerification = false
var maxChangeIntervalDays = 0
when (user.rank) {
UserRankEnum.REGULAR -> {
canChangeUsername = false
requiresEmailVerification = false
maxChangeIntervalDays = 0
}
UserRankEnum.VIP -> {
canChangeUsername = true
requiresEmailVerification = true
maxChangeIntervalDays = 30
}
UserRankEnum.INTERNAL -> {
canChangeUsername = true
requiresEmailVerification = false
maxChangeIntervalDays = 0
}
}
if (!canChangeUsername) throw ChangeUsernameException("用户没有权限修改用户名")
if (requiresEmailVerification) {
val emailVerified = VerificationService().isVerified(user.id, userDto.verificationCode)
if (!emailVerified) {
throw ChangeUsernameException("验证码错误")
}
}
user.lastUsernameChange?.let{
val daysBetween =
Duration.between(user.lastUsernameChange, LocalDateTime.now(Clock.systemDefaultZone())).toDays()
if (daysBetween < maxChangeIntervalDays) {
throw ChangeUsernameException("30天内禁止重复修改")
}
}
// 检测相同名
if(user.firstName == userDto.firstName && user.lastName == userDto.lastName) {
throw ChangeUsernameException("不能修改为当前用户名")
}
val findByUsername = repository.findByUsername(userDto.firstName, userDto.lastName)
if(findByUsername != null) {
throw ChangeUsernameException("用户名已存在")
}
user.firstName = userDto.firstName
user.lastName = userDto.lastName
user.lastUsernameChange = LocalDateTime.now(Clock.systemDefaultZone())
repository.update(user)
return user
}
}

View File

@@ -1,7 +1,8 @@
package mvc.services
import mvc.entities.User
import shared.dto.ChangeUsernameDto
interface UserService {
fun changeUsername(user: User): User
fun changeUsername(userDto: ChangeUsernameDto): User
}

View File

@@ -3,12 +3,14 @@ package mvc.services
import shared.exceptions.NotFoundException
import mvc.dao.UserRepository
import mvc.entities.User
import shared.dto.ChangeUsernameDto
class UserSimpleService(val repository: UserRepository) : UserService {
override fun changeUsername(user: User): User {
val findUser = repository.findById(user.id) ?: throw NotFoundException("User ${user.id} not found")
val copy = findUser.copy(firstName = user.firstName, lastName = user.lastName)
repository.update(copy)
return copy
override fun changeUsername(userDto: ChangeUsernameDto): User {
val findUser = repository.findById(userDto.id) ?: throw NotFoundException("用户${userDto.id}不存在")
findUser.firstName = userDto.firstName
findUser.lastName = userDto.lastName
repository.update(findUser)
return findUser
}
}

View File

@@ -0,0 +1,7 @@
package mvc.services
class VerificationService {
fun isVerified(userId: Long, code: String): Boolean {
return "1234" == code
}
}