diff --git a/src/main/kotlin/top/fatweb/api/config/InitConfig.kt b/src/main/kotlin/top/fatweb/api/config/InitConfig.kt index d902e38..9eab4ca 100644 --- a/src/main/kotlin/top/fatweb/api/config/InitConfig.kt +++ b/src/main/kotlin/top/fatweb/api/config/InitConfig.kt @@ -43,7 +43,7 @@ class InitConfig( } val userInfo = UserInfo().apply { userId = 0 - nickName = AdminProperties.nickName + nickname = AdminProperties.nickname email = AdminProperties.email } diff --git a/src/main/kotlin/top/fatweb/api/controller/permission/UserController.kt b/src/main/kotlin/top/fatweb/api/controller/permission/UserController.kt index eff2ae6..7892f00 100644 --- a/src/main/kotlin/top/fatweb/api/controller/permission/UserController.kt +++ b/src/main/kotlin/top/fatweb/api/controller/permission/UserController.kt @@ -6,7 +6,8 @@ import org.springframework.web.bind.annotation.RestController import top.fatweb.api.converter.permission.UserConverter import top.fatweb.api.entity.common.ResponseResult import top.fatweb.api.service.permission.IUserService -import top.fatweb.api.vo.permission.UserWithInfoVo +import top.fatweb.api.vo.permission.UserWithPowerInfoVo +import top.fatweb.api.vo.permission.UserWithRoleInfoVo /** *

@@ -22,10 +23,16 @@ class UserController( private val userService: IUserService ) { @GetMapping("info") - fun getInfo(): ResponseResult { + fun getInfo(): ResponseResult { userService.getInfo()?.let { - return ResponseResult.databaseSuccess(data = UserConverter.userToUserInfoVo(it)) + return ResponseResult.databaseSuccess(data = UserConverter.userToUserWithPowerInfoVo(it)) } ?: let { return ResponseResult.databaseFail() } } + + @GetMapping + fun get(): ResponseResult> { + return ResponseResult.databaseSuccess( + data = userService.getList().map { UserConverter.userToUserWithRoleInfoVo(it) }) + } } diff --git a/src/main/kotlin/top/fatweb/api/converter/permission/UserConverter.kt b/src/main/kotlin/top/fatweb/api/converter/permission/UserConverter.kt index d2a3c23..4453481 100644 --- a/src/main/kotlin/top/fatweb/api/converter/permission/UserConverter.kt +++ b/src/main/kotlin/top/fatweb/api/converter/permission/UserConverter.kt @@ -14,7 +14,7 @@ object UserConverter { return user } - fun userToUserInfoVo(user: User) = UserWithInfoVo( + fun userToUserWithPowerInfoVo(user: User) = UserWithPowerInfoVo( id = user.id, username = user.username, locking = user.locking?.let { it == 1 }, @@ -30,7 +30,7 @@ object UserConverter { userInfo = user.userInfo?.let { UserInfoVo( id = it.id, userId = it.userId, - nickName = it.nickName, + nickname = it.nickname, avatar = it.avatar, email = it.email, createTime = it.createTime, @@ -71,4 +71,42 @@ object UserConverter { ) } ) + + fun userToUserWithRoleInfoVo(user: User) = UserWithRoleInfoVo( + id = user.id, + username = user.username, + locking = user.locking?.let { it == 1 }, + expiration = user.expiration, + credentialsExpiration = user.credentialsExpiration, + enable = user.enable?.let { it == 1 }, + currentLoginTime = user.currentLoginTime, + currentLoginIp = user.currentLoginIp, + lastLoginTime = user.lastLoginTime, + lastLoginIp = user.lastLoginIp, + createTime = user.createTime, + updateTime = user.updateTime, + userInfo = user.userInfo?.let { UserInfoVo( + id = it.id, + userId = it.userId, + nickname = it.nickname, + avatar = it.avatar, + email = it.email, + createTime = it.createTime, + updateTime = it.updateTime + ) }, + roles = user.roles?.map { + RoleVo( + id = it.id, + name = it.name, + enable = it.enable == 1 + ) + }, + groups = user.groups?.map { + GroupVo( + id = it.id, + name = it.name, + enable = it.enable == 1 + ) + } + ) } \ No newline at end of file diff --git a/src/main/kotlin/top/fatweb/api/entity/permission/UserInfo.kt b/src/main/kotlin/top/fatweb/api/entity/permission/UserInfo.kt index 6030c50..dfe59f4 100644 --- a/src/main/kotlin/top/fatweb/api/entity/permission/UserInfo.kt +++ b/src/main/kotlin/top/fatweb/api/entity/permission/UserInfo.kt @@ -24,8 +24,8 @@ class UserInfo : Serializable { /** * 昵称 */ - @TableField("nick_name") - var nickName: String? = null + @TableField("nickname") + var nickname: String? = null /** * 头像 @@ -60,6 +60,6 @@ class UserInfo : Serializable { var version: Int? = null override fun toString(): String { - return "UserInfo(id=$id, userId=$userId, nickName=$nickName, avatar=$avatar, email=$email, createTime=$createTime, updateTime=$updateTime, deleted=$deleted, version=$version)" + return "UserInfo(id=$id, userId=$userId, nickname=$nickname, avatar=$avatar, email=$email, createTime=$createTime, updateTime=$updateTime, deleted=$deleted, version=$version)" } } diff --git a/src/main/kotlin/top/fatweb/api/mapper/permission/UserMapper.kt b/src/main/kotlin/top/fatweb/api/mapper/permission/UserMapper.kt index fd2cd6c..4d237cc 100644 --- a/src/main/kotlin/top/fatweb/api/mapper/permission/UserMapper.kt +++ b/src/main/kotlin/top/fatweb/api/mapper/permission/UserMapper.kt @@ -15,5 +15,7 @@ import top.fatweb.api.entity.permission.User */ @Mapper interface UserMapper : BaseMapper { - fun getOneWithPowerByUsername(@Param("username")username: String): User? + fun getOneWithPowerInfoByUsername(@Param("username")username: String): User? + + fun getListWithRoleInfo(): List } diff --git a/src/main/kotlin/top/fatweb/api/properties/AdminProperties.kt b/src/main/kotlin/top/fatweb/api/properties/AdminProperties.kt index 1ac9989..a14e079 100644 --- a/src/main/kotlin/top/fatweb/api/properties/AdminProperties.kt +++ b/src/main/kotlin/top/fatweb/api/properties/AdminProperties.kt @@ -8,6 +8,6 @@ import org.springframework.stereotype.Component object AdminProperties { var username = "admin" var password: String? = null - var nickName = "Administrator" + var nickname = "Administrator" var email = "admin@fatweb.top" } \ No newline at end of file diff --git a/src/main/kotlin/top/fatweb/api/service/permission/IUserService.kt b/src/main/kotlin/top/fatweb/api/service/permission/IUserService.kt index 0a7ce40..a0b29c3 100644 --- a/src/main/kotlin/top/fatweb/api/service/permission/IUserService.kt +++ b/src/main/kotlin/top/fatweb/api/service/permission/IUserService.kt @@ -15,4 +15,6 @@ interface IUserService : IService { fun getUserWithPower(username: String): User? fun getInfo(): User? + + fun getList(): List } diff --git a/src/main/kotlin/top/fatweb/api/service/permission/impl/UserServiceImpl.kt b/src/main/kotlin/top/fatweb/api/service/permission/impl/UserServiceImpl.kt index c78179a..34e4b43 100644 --- a/src/main/kotlin/top/fatweb/api/service/permission/impl/UserServiceImpl.kt +++ b/src/main/kotlin/top/fatweb/api/service/permission/impl/UserServiceImpl.kt @@ -23,7 +23,7 @@ class UserServiceImpl( private val operationService: IOperationService ) : ServiceImpl(), IUserService { override fun getUserWithPower(username: String): User? { - val user = baseMapper.getOneWithPowerByUsername(username) + val user = baseMapper.getOneWithPowerInfoByUsername(username) user ?: let { return null } if (user.id == 0L) { @@ -38,4 +38,5 @@ class UserServiceImpl( override fun getInfo() = WebUtil.getLoginUsername()?.let { getUserWithPower(it) } ?: let { null } + override fun getList() = baseMapper.getListWithRoleInfo() } diff --git a/src/main/kotlin/top/fatweb/api/vo/permission/GroupVo.kt b/src/main/kotlin/top/fatweb/api/vo/permission/GroupVo.kt new file mode 100644 index 0000000..9f4b666 --- /dev/null +++ b/src/main/kotlin/top/fatweb/api/vo/permission/GroupVo.kt @@ -0,0 +1,17 @@ +package top.fatweb.api.vo.permission + +import com.fasterxml.jackson.databind.annotation.JsonSerialize +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer +import io.swagger.v3.oas.annotations.media.Schema + +@Schema(description = "用户组返回参数") +data class GroupVo( + @JsonSerialize(using = ToStringSerializer::class) + val id: Long?, + + @Schema(description = "用户组名", example = "Group") + val name: String?, + + @Schema(description = "启用", example = "true") + val enable: Boolean? +) diff --git a/src/main/kotlin/top/fatweb/api/vo/permission/RoleVo.kt b/src/main/kotlin/top/fatweb/api/vo/permission/RoleVo.kt new file mode 100644 index 0000000..2b89961 --- /dev/null +++ b/src/main/kotlin/top/fatweb/api/vo/permission/RoleVo.kt @@ -0,0 +1,17 @@ +package top.fatweb.api.vo.permission + +import com.fasterxml.jackson.databind.annotation.JsonSerialize +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer +import io.swagger.v3.oas.annotations.media.Schema + +@Schema(description = "角色返回参数") +data class RoleVo( + @JsonSerialize(using = ToStringSerializer::class) + val id: Long?, + + @Schema(description = "角色名", example = "Role") + val name: String?, + + @Schema(description = "启用", example = "true") + val enable: Boolean? +) diff --git a/src/main/kotlin/top/fatweb/api/vo/permission/TokenVo.kt b/src/main/kotlin/top/fatweb/api/vo/permission/TokenVo.kt index 94668b9..05e8dbe 100644 --- a/src/main/kotlin/top/fatweb/api/vo/permission/TokenVo.kt +++ b/src/main/kotlin/top/fatweb/api/vo/permission/TokenVo.kt @@ -2,7 +2,7 @@ package top.fatweb.api.vo.permission import io.swagger.v3.oas.annotations.media.Schema -@Schema(description = "Token") +@Schema(description = "Token 返回参数") data class TokenVo( @Schema( description = "Token", diff --git a/src/main/kotlin/top/fatweb/api/vo/permission/UserInfoVo.kt b/src/main/kotlin/top/fatweb/api/vo/permission/UserInfoVo.kt index b66de9b..d78c21f 100644 --- a/src/main/kotlin/top/fatweb/api/vo/permission/UserInfoVo.kt +++ b/src/main/kotlin/top/fatweb/api/vo/permission/UserInfoVo.kt @@ -15,7 +15,7 @@ data class UserInfoVo( val userId: Long?, @Schema(description = "昵称", example = "User") - val nickName: String?, + val nickname: String?, @Schema(description = "头像") val avatar: String?, diff --git a/src/main/kotlin/top/fatweb/api/vo/permission/UserWithInfoVo.kt b/src/main/kotlin/top/fatweb/api/vo/permission/UserWithPowerInfoVo.kt similarity index 95% rename from src/main/kotlin/top/fatweb/api/vo/permission/UserWithInfoVo.kt rename to src/main/kotlin/top/fatweb/api/vo/permission/UserWithPowerInfoVo.kt index 170f27b..010c446 100644 --- a/src/main/kotlin/top/fatweb/api/vo/permission/UserWithInfoVo.kt +++ b/src/main/kotlin/top/fatweb/api/vo/permission/UserWithPowerInfoVo.kt @@ -5,8 +5,8 @@ import com.fasterxml.jackson.databind.ser.std.ToStringSerializer import io.swagger.v3.oas.annotations.media.Schema import java.time.LocalDateTime -@Schema(description = "获取用户信息返回参数") -data class UserWithInfoVo( +@Schema(description = "用户权限信息返回参数") +data class UserWithPowerInfoVo( @JsonSerialize(using = ToStringSerializer::class) val id: Long?, diff --git a/src/main/kotlin/top/fatweb/api/vo/permission/UserWithRoleInfoVo.kt b/src/main/kotlin/top/fatweb/api/vo/permission/UserWithRoleInfoVo.kt new file mode 100644 index 0000000..87369b0 --- /dev/null +++ b/src/main/kotlin/top/fatweb/api/vo/permission/UserWithRoleInfoVo.kt @@ -0,0 +1,54 @@ +package top.fatweb.api.vo.permission + +import com.fasterxml.jackson.databind.annotation.JsonSerialize +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer +import io.swagger.v3.oas.annotations.media.Schema +import java.time.LocalDateTime + +@Schema(description = "用户角色信息返回参数") +data class UserWithRoleInfoVo( + @JsonSerialize(using = ToStringSerializer::class) + val id: Long?, + + @Schema(description = "用户名", example = "User") + val username: String?, + + @Schema(description = "是否锁定", example = "false") + val locking: Boolean?, + + @Schema(description = "过期时间", example = "1900-01-01T00:00:00.000Z") + val expiration: LocalDateTime?, + + @Schema(description = "认证过期时间", example = "1900-01-01T00:00:00.000Z") + val credentialsExpiration: LocalDateTime?, + + @Schema(description = "是否启用", example = "true") + val enable: Boolean?, + + @Schema(description = "当前登录时间", example = "1900-01-01T00:00:00.000Z") + val currentLoginTime: LocalDateTime?, + + @Schema(description = "当前登录 IP", example = "1.1.1.1") + val currentLoginIp: String?, + + @Schema(description = "最后登录时间", example = "1900-01-01T00:00:00.000Z") + val lastLoginTime: LocalDateTime?, + + @Schema(description = "最后登录 IP", example = "1.1.1.1") + val lastLoginIp: String?, + + @Schema(description = "创建时间", example = "1900-01-01T00:00:00.000Z") + val createTime: LocalDateTime?, + + @Schema(description = "修改时间", example = "1900-01-01T00:00:00.000Z") + val updateTime: LocalDateTime?, + + @Schema(description = "用户资料") + val userInfo: UserInfoVo?, + + @Schema(description = "角色列表") + val roles: List?, + + @Schema(description = "用户组列表") + val groups: List? +) \ No newline at end of file diff --git a/src/main/resources/application-config-template.yml b/src/main/resources/application-config-template.yml index d589902..3b7ddd0 100644 --- a/src/main/resources/application-config-template.yml +++ b/src/main/resources/application-config-template.yml @@ -2,7 +2,7 @@ app: admin: # username: admin # Username of administrator # password: admin # Default password of administrator -# nick-name: Administrator # Nickname of administrator +# nickname: Administrator # Nickname of administrator # email: admin@fatweb.top # Email of administrator security: # header-string: "Authorization" # The key of head to get token diff --git a/src/main/resources/db/migration/V1_0_0_231104__Add_table_'t_user_info'.sql b/src/main/resources/db/migration/V1_0_0_231104__Add_table_'t_user_info'.sql index 6a329de..0231a70 100644 --- a/src/main/resources/db/migration/V1_0_0_231104__Add_table_'t_user_info'.sql +++ b/src/main/resources/db/migration/V1_0_0_231104__Add_table_'t_user_info'.sql @@ -4,8 +4,8 @@ create table if not exists t_user_info ( id bigint not null primary key, user_id bigint not null comment '用户ID', - nick_name varchar(50) null comment '昵称', - avatar varchar(500) null comment '头像', + nickname varchar(50) null comment '昵称', + avatar text null comment '头像', email varchar(100) null comment '邮箱', create_time datetime not null default (utc_timestamp()) comment '创建时间', update_time datetime not null default (utc_timestamp()) comment '修改时间', diff --git a/src/main/resources/mapper/permission/UserMapper.xml b/src/main/resources/mapper/permission/UserMapper.xml index 11d27ff..1102e10 100644 --- a/src/main/resources/mapper/permission/UserMapper.xml +++ b/src/main/resources/mapper/permission/UserMapper.xml @@ -1,7 +1,7 @@ - select t_user.id as user_id, t_user.username as user_username, t_user.password as user_password, @@ -19,7 +19,7 @@ t_user.version as user_version, tui.id as user_info_id, tui.user_id as user_info_user_id, - tui.nick_name as user_info_nick_name, + tui.nickname as user_info_nickname, tui.avatar as user_info_avatar, tui.email as user_info_email, tui.create_time as user_info_create_time, @@ -62,6 +62,52 @@ and t_user.username = #{username}; + + @@ -82,7 +128,7 @@ - + @@ -91,7 +137,7 @@ - + @@ -122,4 +168,22 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/test/kotlin/top/fatweb/api/FatWebApiApplicationTests.kt b/src/test/kotlin/top/fatweb/api/FatWebApiApplicationTests.kt index 1b203ca..9b97a3b 100644 --- a/src/test/kotlin/top/fatweb/api/FatWebApiApplicationTests.kt +++ b/src/test/kotlin/top/fatweb/api/FatWebApiApplicationTests.kt @@ -1,5 +1,6 @@ package top.fatweb.api +import com.talanlabs.avatargenerator.GitHubAvatar import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith @@ -9,6 +10,9 @@ import org.springframework.test.context.junit.jupiter.SpringExtension import top.fatweb.api.properties.SecurityProperties import top.fatweb.api.util.ByteUtil import top.fatweb.api.util.JwtUtil +import kotlin.io.encoding.Base64 +import kotlin.io.encoding.ExperimentalEncodingApi + @ExtendWith(SpringExtension::class) class FatWebApiApplicationTests { @@ -39,4 +43,12 @@ class FatWebApiApplicationTests { assertEquals("512KiB", ByteUtil.formatByteSize(512 * 1024)) assertEquals("1.5MiB", ByteUtil.formatByteSize(1 * 1024 * 1024 + 512 * 1024)) } + + @OptIn(ExperimentalEncodingApi::class) + @Test + fun name() { + val avatar = GitHubAvatar.newAvatarBuilder(396, 5).build() + val bytes = avatar.createAsPngBytes(1232132134543L) + logger.info(Base64.encode(bytes)) + } }