Add user management change password api

This commit is contained in:
2023-11-29 18:00:40 +08:00
parent 6915a39d07
commit 6d88a7fb98
6 changed files with 92 additions and 19 deletions

View File

@@ -6,10 +6,8 @@ import jakarta.validation.Valid
import org.springframework.web.bind.annotation.* import org.springframework.web.bind.annotation.*
import top.fatweb.api.entity.common.ResponseCode import top.fatweb.api.entity.common.ResponseCode
import top.fatweb.api.entity.common.ResponseResult import top.fatweb.api.entity.common.ResponseResult
import top.fatweb.api.param.permission.user.UserAddParam import top.fatweb.api.exception.NoRecordFoundException
import top.fatweb.api.param.permission.user.UserDeleteParam import top.fatweb.api.param.permission.user.*
import top.fatweb.api.param.permission.user.UserGetParam
import top.fatweb.api.param.permission.user.UserUpdateParam
import top.fatweb.api.service.permission.IUserService import top.fatweb.api.service.permission.IUserService
import top.fatweb.api.vo.PageVo import top.fatweb.api.vo.PageVo
import top.fatweb.api.vo.permission.UserWithPasswordRoleInfoVo import top.fatweb.api.vo.permission.UserWithPasswordRoleInfoVo
@@ -50,7 +48,7 @@ class UserController(
return userService.getOne(id)?.let { return userService.getOne(id)?.let {
ResponseResult.databaseSuccess(data = it) ResponseResult.databaseSuccess(data = it)
} ?: let { } ?: let {
ResponseResult.databaseFail(ResponseCode.DATABASE_NO_RECORD_FOUND) throw NoRecordFoundException()
} }
} }
@@ -74,6 +72,13 @@ class UserController(
} ?: let { ResponseResult.databaseFail(ResponseCode.DATABASE_UPDATE_FILED) } } ?: let { ResponseResult.databaseFail(ResponseCode.DATABASE_UPDATE_FILED) }
} }
@Operation(summary = "修改密码")
@PatchMapping
fun changePassword(@Valid @RequestBody userChangePasswordParam: UserChangePasswordParam): ResponseResult<Nothing> {
userService.changePassword(userChangePasswordParam)
return ResponseResult.databaseSuccess(ResponseCode.DATABASE_UPDATE_SUCCESS)
}
@Operation(summary = "删除用户") @Operation(summary = "删除用户")
@DeleteMapping("/{id}") @DeleteMapping("/{id}")
fun delete(@PathVariable id: Long): ResponseResult<Nothing> { fun delete(@PathVariable id: Long): ResponseResult<Nothing> {

View File

@@ -0,0 +1,9 @@
package top.fatweb.api.exception
/**
* No record found exception
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
class NoRecordFoundException : RuntimeException("No record found")

View File

@@ -15,6 +15,7 @@ import org.springframework.web.bind.annotation.ExceptionHandler
import org.springframework.web.bind.annotation.RestControllerAdvice import org.springframework.web.bind.annotation.RestControllerAdvice
import top.fatweb.api.entity.common.ResponseCode import top.fatweb.api.entity.common.ResponseCode
import top.fatweb.api.entity.common.ResponseResult import top.fatweb.api.entity.common.ResponseResult
import top.fatweb.api.exception.NoRecordFoundException
import top.fatweb.api.exception.TokenHasExpiredException import top.fatweb.api.exception.TokenHasExpiredException
import top.fatweb.avatargenerator.AvatarException import top.fatweb.avatargenerator.AvatarException
@@ -64,7 +65,11 @@ class ExceptionHandler {
is CredentialsExpiredException -> { is CredentialsExpiredException -> {
logger.debug(e.localizedMessage, e) logger.debug(e.localizedMessage, e)
ResponseResult.fail(ResponseCode.PERMISSION_USER_CREDENTIALS_EXPIRED, "User credentials have expired", null) ResponseResult.fail(
ResponseCode.PERMISSION_USER_CREDENTIALS_EXPIRED,
"User credentials have expired",
null
)
} }
is DisabledException -> { is DisabledException -> {
@@ -84,7 +89,11 @@ class ExceptionHandler {
is BadCredentialsException -> { is BadCredentialsException -> {
logger.debug(e.localizedMessage, e) logger.debug(e.localizedMessage, e)
ResponseResult.fail(ResponseCode.PERMISSION_LOGIN_USERNAME_PASSWORD_ERROR, "Wrong user name or password", null) ResponseResult.fail(
ResponseCode.PERMISSION_LOGIN_USERNAME_PASSWORD_ERROR,
"Wrong user name or password",
null
)
} }
is SignatureVerificationException, is JWTDecodeException -> { is SignatureVerificationException, is JWTDecodeException -> {
@@ -107,6 +116,11 @@ class ExceptionHandler {
ResponseResult.fail(ResponseCode.DATABASE_DUPLICATE_KEY, "Duplicate key", null) ResponseResult.fail(ResponseCode.DATABASE_DUPLICATE_KEY, "Duplicate key", null)
} }
is NoRecordFoundException -> {
logger.debug(e.localizedMessage, e)
ResponseResult.fail(ResponseCode.DATABASE_NO_RECORD_FOUND, e.localizedMessage, null)
}
is AvatarException -> { is AvatarException -> {
logger.debug(e.localizedMessage, e) logger.debug(e.localizedMessage, e)
ResponseResult.fail(ResponseCode.API_AVATAR_ERROR, e.localizedMessage, null) ResponseResult.fail(ResponseCode.API_AVATAR_ERROR, e.localizedMessage, null)

View File

@@ -0,0 +1,20 @@
package top.fatweb.api.param.permission.user
import io.swagger.v3.oas.annotations.media.Schema
import jakarta.validation.constraints.NotBlank
import jakarta.validation.constraints.NotNull
import java.time.LocalDateTime
@Schema(description = "用户更改密码请求参数")
data class UserChangePasswordParam(
@Schema(description = "用户 ID")
@field:NotNull(message = "ID can not be null")
val id: Long?,
@Schema(description = "新密码")
@field:NotBlank(message = "Password can not be blank")
val password: String?,
@Schema(description = "认证过期时间")
val credentialsExpiration: LocalDateTime?
)

View File

@@ -2,10 +2,7 @@ package top.fatweb.api.service.permission
import com.baomidou.mybatisplus.extension.service.IService import com.baomidou.mybatisplus.extension.service.IService
import top.fatweb.api.entity.permission.User import top.fatweb.api.entity.permission.User
import top.fatweb.api.param.permission.user.UserAddParam import top.fatweb.api.param.permission.user.*
import top.fatweb.api.param.permission.user.UserDeleteParam
import top.fatweb.api.param.permission.user.UserGetParam
import top.fatweb.api.param.permission.user.UserUpdateParam
import top.fatweb.api.vo.PageVo import top.fatweb.api.vo.PageVo
import top.fatweb.api.vo.permission.UserWithInfoVo import top.fatweb.api.vo.permission.UserWithInfoVo
import top.fatweb.api.vo.permission.UserWithPasswordRoleInfoVo import top.fatweb.api.vo.permission.UserWithPasswordRoleInfoVo
@@ -33,6 +30,8 @@ interface IUserService : IService<User> {
fun update(userUpdateParam: UserUpdateParam): UserWithRoleInfoVo? fun update(userUpdateParam: UserUpdateParam): UserWithRoleInfoVo?
fun changePassword(userChangePasswordParam: UserChangePasswordParam)
fun deleteOne(id: Long) fun deleteOne(id: Long)
fun delete(userDeleteParam: UserDeleteParam) fun delete(userDeleteParam: UserDeleteParam)

View File

@@ -1,6 +1,7 @@
package top.fatweb.api.service.permission.impl package top.fatweb.api.service.permission.impl
import com.baomidou.mybatisplus.extension.kotlin.KtQueryWrapper import com.baomidou.mybatisplus.extension.kotlin.KtQueryWrapper
import com.baomidou.mybatisplus.extension.kotlin.KtUpdateWrapper
import com.baomidou.mybatisplus.extension.plugins.pagination.Page import com.baomidou.mybatisplus.extension.plugins.pagination.Page
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
import org.springframework.security.crypto.password.PasswordEncoder import org.springframework.security.crypto.password.PasswordEncoder
@@ -11,11 +12,9 @@ import top.fatweb.api.entity.permission.User
import top.fatweb.api.entity.permission.UserGroup import top.fatweb.api.entity.permission.UserGroup
import top.fatweb.api.entity.permission.UserInfo import top.fatweb.api.entity.permission.UserInfo
import top.fatweb.api.entity.permission.UserRole import top.fatweb.api.entity.permission.UserRole
import top.fatweb.api.exception.NoRecordFoundException
import top.fatweb.api.mapper.permission.UserMapper import top.fatweb.api.mapper.permission.UserMapper
import top.fatweb.api.param.permission.user.UserAddParam import top.fatweb.api.param.permission.user.*
import top.fatweb.api.param.permission.user.UserDeleteParam
import top.fatweb.api.param.permission.user.UserGetParam
import top.fatweb.api.param.permission.user.UserUpdateParam
import top.fatweb.api.service.permission.* import top.fatweb.api.service.permission.*
import top.fatweb.api.util.PageUtil import top.fatweb.api.util.PageUtil
import top.fatweb.api.util.StrUtil import top.fatweb.api.util.StrUtil
@@ -23,6 +22,8 @@ import top.fatweb.api.util.WebUtil
import top.fatweb.api.vo.PageVo import top.fatweb.api.vo.PageVo
import top.fatweb.api.vo.permission.UserWithPasswordRoleInfoVo import top.fatweb.api.vo.permission.UserWithPasswordRoleInfoVo
import top.fatweb.api.vo.permission.UserWithRoleInfoVo import top.fatweb.api.vo.permission.UserWithRoleInfoVo
import java.time.LocalDateTime
import java.time.ZoneOffset
/** /**
* User service implement * User service implement
@@ -120,6 +121,7 @@ class UserServiceImpl(
@Transactional @Transactional
override fun update(userUpdateParam: UserUpdateParam): UserWithRoleInfoVo? { override fun update(userUpdateParam: UserUpdateParam): UserWithRoleInfoVo? {
val user = UserConverter.userUpdateParamToUser(userUpdateParam) val user = UserConverter.userUpdateParamToUser(userUpdateParam)
user.updateTime = LocalDateTime.now(ZoneOffset.UTC)
val oldRoleList = userRoleService.list( val oldRoleList = userRoleService.list(
KtQueryWrapper(UserRole()).select(UserRole::roleId).eq(UserRole::userId, userUpdateParam.id) KtQueryWrapper(UserRole()).select(UserRole::roleId).eq(UserRole::userId, userUpdateParam.id)
@@ -193,14 +195,38 @@ class UserServiceImpl(
return UserConverter.userToUserWithRoleInfoVo(user) return UserConverter.userToUserWithRoleInfoVo(user)
} }
override fun changePassword(userChangePasswordParam: UserChangePasswordParam) {
val user = baseMapper.selectById(userChangePasswordParam.id)
user?.let {
val wrapper = KtUpdateWrapper(User())
wrapper.eq(User::id, user.id)
.set(User::password, passwordEncoder.encode(userChangePasswordParam.password))
.set(User::credentialsExpiration, userChangePasswordParam.credentialsExpiration)
.set(User::updateTime, LocalDateTime.now(ZoneOffset.UTC))
this.update(wrapper)
} ?: let {
throw NoRecordFoundException()
}
}
override fun deleteOne(id: Long) { override fun deleteOne(id: Long) {
if (id == 0L) {
return
}
this.delete(UserDeleteParam(listOf(id))) this.delete(UserDeleteParam(listOf(id)))
} }
override fun delete(userDeleteParam: UserDeleteParam) { override fun delete(userDeleteParam: UserDeleteParam) {
baseMapper.deleteBatchIds(userDeleteParam.ids) val ids = userDeleteParam.ids.filter { it != 0L }
userInfoService.remove(KtQueryWrapper(UserInfo()).`in`(UserInfo::userId, userDeleteParam.ids)) if (ids.isEmpty()) {
userRoleService.remove(KtQueryWrapper(UserRole()).`in`(UserRole::userId, userDeleteParam.ids)) return
userGroupService.remove(KtQueryWrapper(UserGroup()).`in`(UserGroup::userId, userDeleteParam.ids)) }
baseMapper.deleteBatchIds(ids)
userInfoService.remove(KtQueryWrapper(UserInfo()).`in`(UserInfo::userId, ids))
userRoleService.remove(KtQueryWrapper(UserRole()).`in`(UserRole::userId, ids))
userGroupService.remove(KtQueryWrapper(UserGroup()).`in`(UserGroup::userId, ids))
} }
} }