This commit is contained in:
2023-12-04 18:05:57 +08:00
parent 902fcef9b2
commit 00964a15f3
146 changed files with 3486 additions and 205 deletions

View File

@@ -17,6 +17,13 @@ import java.util.*
@EnableTransactionManagement
class FatWebApiApplication
/**
* Main function
*
* @param args
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
fun main(args: Array<String>) {
val logger = LoggerFactory.getLogger("main")

View File

@@ -20,6 +20,9 @@ import top.fatweb.avatargenerator.GitHubAvatar
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see IUserService
* @see IUserInfoService
* @see PasswordEncoder
*/
@DependsOn("adminProperties")
@Component

View File

@@ -22,6 +22,9 @@ import top.fatweb.api.handler.JwtAuthenticationEntryPointHandler
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see JwtAuthenticationTokenFilter
* @see JwtAuthenticationEntryPointHandler
* @see JwtAccessDeniedHandler
*/
@Configuration
@EnableMethodSecurity

View File

@@ -10,6 +10,7 @@ import top.fatweb.api.interceptor.SysLogInterceptor
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see SysLogInterceptor
* @see WebMvcConfigurer
*/
@Configuration

View File

@@ -20,6 +20,7 @@ import top.fatweb.api.vo.api.v1.avatar.AvatarBase64Vo
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see IAvatarService
*/
@Tag(name = "随机头像", description = "随机头像相关接口")
@RequestMapping("/api/{apiVersion}/avatar")

View File

@@ -22,6 +22,7 @@ import top.fatweb.api.vo.permission.TokenVo
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see IAuthenticationService
*/
@Tag(name = "身份认证", description = "身份认证相关接口")
@RestController

View File

@@ -18,6 +18,7 @@ import top.fatweb.api.vo.permission.base.GroupVo
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see IGroupService
*/
@Tag(name = "用户组管理", description = "用户组管理相关接口")
@RequestMapping("/system/group")

View File

@@ -15,6 +15,7 @@ import top.fatweb.api.vo.permission.PowerSetVo
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see IPowerService
*/
@Tag(name = "权限管理", description = "权限管理相关接口")
@RequestMapping("/system/power")

View File

@@ -18,6 +18,7 @@ import top.fatweb.api.vo.permission.base.RoleVo
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see IRoleService
*/
@Tag(name = "角色管理", description = "角色管理相关接口")
@RequestMapping("/system/role")

View File

@@ -20,6 +20,7 @@ import top.fatweb.api.vo.permission.UserWithRoleInfoVo
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see IUserService
*/
@Tag(name = "用户管理", description = "用户管理相关接口")
@RequestMapping("/system/user")

View File

@@ -0,0 +1,12 @@
package top.fatweb.api.controller.system
import io.swagger.v3.oas.annotations.tags.Tag
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
@Tag(name = "邮件接口", description = "邮件发送接口")
@RequestMapping("/system/mail")
@RestController
class MailController {
}

View File

@@ -13,6 +13,7 @@ import top.fatweb.api.vo.system.SettingsVo
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see ISettingsService
*/
@Tag(name = "系统设置", description = "系统设置相关接口")
@RequestMapping("/system/settings")
@@ -20,10 +21,29 @@ import top.fatweb.api.vo.system.SettingsVo
class SettingsController(
private val settingsService: ISettingsService
) {
/**
* Get all settings
*
* @return Response object includes all settings
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see ResponseResult
* @see SettingsVo
*/
@Operation(summary = "获取全部设置")
@GetMapping
fun get(): ResponseResult<SettingsVo> = ResponseResult.success(data = settingsService.get())
/**
* Update mail settings
*
* @param mailSettingsParam Mail settings parameters
* @return Response object
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see MailSettingsParam
* @see ResponseResult
*/
@Operation(summary = "更新邮件设置")
@PutMapping("/mail")
fun updateMail(@RequestBody mailSettingsParam: MailSettingsParam): ResponseResult<Nothing> {

View File

@@ -20,6 +20,7 @@ import top.fatweb.api.vo.system.SysLogVo
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see ISysLogService
*/
@Tag(name = "系统日志", description = "系统日志相关接口")
@RequestMapping("/system/log")

View File

@@ -4,7 +4,23 @@ import top.fatweb.api.settings.MailSettings
import top.fatweb.api.settings.SystemSettings
import top.fatweb.api.vo.system.SettingsVo
/**
* Settings converter
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
object SettingsConverter {
/**
* Convert MailSettings object into MailSettingsVo object
*
* @param mailSettings MailSettings object
* @return MailSettingsVo object
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see MailSettings
* @see SettingsVo.MailSettingsVo
*/
private fun mailSettingsToMailSettingsVo(mailSettings: MailSettings) = SettingsVo.MailSettingsVo(
host = mailSettings.host,
port = mailSettings.port,
@@ -13,6 +29,16 @@ object SettingsConverter {
from = mailSettings.from
)
/**
* Convert SystemSettings object into SettingVo object
*
* @param systemSettings SystemSettings object
* @return SettingsVo object
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see SystemSettings
* @see SettingsVo
*/
fun systemSettingsToSettingsVo(systemSettings: SystemSettings) = SettingsVo(
mail = systemSettings.mail?.let { mailSettingsToMailSettingsVo(it) }
)

View File

@@ -7,8 +7,35 @@ package top.fatweb.api.entity.common
* @since 1.0.0
*/
enum class BusinessCode(val code: Int) {
/**
* System
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
SYSTEM(100),
/**
* Permission
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
PERMISSION(200),
/**
* Database
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
DATABASE(300),
/**
* Avatar API
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
API_AVATAR(501)
}

View File

@@ -19,22 +19,83 @@ class ResponseResult<T> private constructor(
@Schema(description = "数据") val data: T?
) : Serializable {
companion object {
/**
* Build response result object
*
* @param code Response code
* @param success Is successful
* @param msg Response message
* @param data Response data
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
fun <T> build(code: Int, success: Boolean, msg: String, data: T?) =
ResponseResult(code, success, msg, data)
/**
* Build response result object
*
* @param code Response code object
* @param success Is successful
* @param msg Response message
* @param data Response data
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see ResponseCode
*/
fun <T> build(code: ResponseCode, success: Boolean, msg: String, data: T?) =
build(code.code, success, msg, data)
/**
* Build successful response result object
*
* @param code Response code object
* @param msg Response message
* @param data Response data
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see ResponseCode
*/
fun <T> success(code: ResponseCode = ResponseCode.SYSTEM_OK, msg: String = "success", data: T? = null) =
build(code, true, msg, data)
/**
* Build failure response result object
*
* @param code Response code object
* @param msg Response message
* @param data Response data
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see ResponseCode
*/
fun <T> fail(code: ResponseCode = ResponseCode.SYSTEM_ERROR, msg: String = "fail", data: T? = null) =
build(code, false, msg, data)
/**
* Build database successful response result object
*
* @param code Response code object
* @param msg Response message
* @param data Response data
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see ResponseCode
*/
fun <T> databaseSuccess(
code: ResponseCode = ResponseCode.DATABASE_SELECT_SUCCESS, msg: String = "success", data: T? = null
) = build(code, true, msg, data)
/**
* Build database failure response result object
*
* @param code Response code object
* @param msg Response message
* @param data Response data
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see ResponseCode
*/
fun <T> databaseFail(
code: ResponseCode = ResponseCode.DATABASE_SELECT_FAILED, msg: String = "fail", data: T? = null
) = build(code, false, msg, data)

View File

@@ -13,24 +13,38 @@ import java.io.Serializable
*/
@TableName("t_func")
class Func : Serializable {
/**
* ID
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableId("id")
var id: Long? = null
/**
* 功能名
* Name
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("name")
var name: String? = null
/**
* ID
* Parent ID
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("parent_id")
var parentId: Long? = null
/**
* 菜单ID
* Menu ID
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("menu_id")
var menuId: Long? = null

View File

@@ -12,42 +12,80 @@ import java.time.LocalDateTime
*/
@TableName("t_group")
class Group : Serializable {
/**
* ID
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableId("id")
var id: Long? = null
/**
* 用户组名
* Name
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("name")
var name: String? = null
/**
* 启用
* Enable
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("enable")
var enable: Int? = null
/**
* 创建时间
* Create time
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see LocalDateTime
*/
@TableField("create_time", fill = FieldFill.INSERT)
var createTime: LocalDateTime? = null
/**
* 修改时间
* Update time
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see LocalDateTime
*/
@TableField("update_time", fill = FieldFill.INSERT_UPDATE)
var updateTime: LocalDateTime? = null
/**
* Deleted
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("deleted")
@TableLogic
var deleted: Long? = null
/**
* Version
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("version")
@Version
var version: Int? = null
/**
* Role list
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see Role
*/
@TableField(exist = false)
var roles: List<Role>? = null

View File

@@ -13,9 +13,17 @@ import java.time.ZoneOffset
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see UserDetails
*/
@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS)
class LoginUser() : UserDetails {
/**
* User object
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see User
*/
lateinit var user: User
@JsonIgnore

View File

@@ -13,30 +13,47 @@ import java.io.Serializable
*/
@TableName("t_menu")
class Menu : Serializable {
/**
* ID
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableId("id")
var id: Long? = null
/**
* 菜单名
* Name
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("name")
var name: String? = null
/**
* URL
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("url")
var url: String? = null
/**
* ID
* Parent ID
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("parent_id")
var parentId: Long? = null
/**
* 模块ID
* Module ID
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("module_id")
var moduleId: Long? = null

View File

@@ -13,12 +13,20 @@ import java.io.Serializable
*/
@TableName("t_module")
class Module : Serializable {
/**
* ID
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableId("id")
var id: Long? = null
/**
* 模块名
* Name
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("name")
var name: String? = null

View File

@@ -13,24 +13,38 @@ import java.io.Serializable
*/
@TableName("t_operation")
class Operation : Serializable {
/**
* ID
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableId("id")
var id: Long? = null
/**
* 操作名
* Name
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("name")
var name: String? = null
/**
* 操作编码
* Code
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("code")
var code: String? = null
/**
* 功能ID
* Function ID
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("func_id")
var funcId: Long? = null

View File

@@ -13,12 +13,20 @@ import java.io.Serializable
*/
@TableName("t_power")
class Power : Serializable {
/**
* ID
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableId("id")
var id: Long? = null
/**
* 权限类型
* Type ID
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("type_id")
var typeId: Int? = null

View File

@@ -11,26 +11,49 @@ import java.io.Serializable
*/
@TableName("t_power_role")
class PowerRole : Serializable {
/**
* ID
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableId("id")
var id: Long? = null
/**
* 权限
* Power ID
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("power_id")
var powerId: Long? = null
/**
* 角色
* Role ID
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("role_id")
var roleId: Long? = null
/**
* Deleted
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("deleted")
@TableLogic
var deleted: Long? = null
/**
* Version
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("version")
@Version
var version: Int? = null

View File

@@ -9,11 +9,39 @@ import java.io.Serializable
* @since 1.0.0
*/
class PowerSet : Serializable {
/**
* Module list
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see Module
*/
var moduleList: List<Module>? = null
/**
* Menu list
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see Menu
*/
var menuList: List<Menu>? = null
/**
* Function list
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see Func
*/
var funcList: List<Func>? = null
/**
* Operation list
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see Operation
*/
var operationList: List<Operation>? = null
}

View File

@@ -13,12 +13,20 @@ import java.io.Serializable
*/
@TableName("t_power_type")
class PowerType : Serializable {
/**
* ID
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableId("id")
var id: Long? = null
/**
* 权限类型名
* Name
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("name")
var name: String? = null

View File

@@ -12,54 +12,120 @@ import java.time.LocalDateTime
*/
@TableName("t_role")
class Role : Serializable {
/**
* ID
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableId("id")
var id: Long? = null
/**
* 角色名
* Name
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("name")
var name: String? = null
/**
* 启用
* Enable
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("enable")
var enable: Int? = null
/**
* 创建时间
* Create time
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see LocalDateTime
*/
@TableField("create_time", fill = FieldFill.INSERT)
var createTime: LocalDateTime? = null
/**
* 修改时间
* Update time
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see LocalDateTime
*/
@TableField("update_time", fill = FieldFill.INSERT_UPDATE)
var updateTime: LocalDateTime? = null
/**
* Deleted
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("deleted")
@TableLogic
var deleted: Long? = null
/**
* Version
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("version")
@Version
var version: Int? = null
/**
* Module list
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see Module
*/
@TableField(exist = false)
var modules: List<Module>? = null
/**
* Menu list
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see Menu
*/
@TableField(exist = false)
var menus: List<Menu>? = null
/**
* Function list
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see Func
*/
@TableField(exist = false)
var funcs: List<Func>? = null
/**
* Operation list
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see Operation
*/
@TableField(exist = false)
var operations: List<Operation>? = null
/**
* Power list
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see Power
*/
@TableField(exist = false)
var powers: List<Power>? = null

View File

@@ -11,26 +11,49 @@ import java.io.Serializable
*/
@TableName("t_role_group")
class RoleGroup : Serializable {
/**
* ID
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableId("id")
var id: Long? = null
/**
* 角色
* Role ID
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("role_id")
var roleId: Long? = null
/**
* 群组
* Group ID
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("group_id")
var groupId: Long? = null
/**
* Deleted
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("deleted")
@TableLogic
var deleted: Long? = null
/**
* Version
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("version")
@Version
var version: Int? = null

View File

@@ -19,107 +19,216 @@ class User() : Serializable {
this.enable = if (enable) 1 else 0
}
/**
* ID
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableId("id")
var id: Long? = null
/**
* 用户名
* Username
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("username")
var username: String? = null
/**
* 密码
* Password
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("password")
var password: String? = null
/**
* 锁定
* Locking
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("locking")
var locking: Int? = null
/**
* 过期时间
* Expiration time
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see LocalDateTime
*/
@TableField("expiration")
var expiration: LocalDateTime? = null
/**
* 认证过期时间
* Credentials expiration time
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see LocalDateTime
*/
@TableField("credentials_expiration")
var credentialsExpiration: LocalDateTime? = null
/**
* 启用
* Enable
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("enable")
var enable: Int? = null
/**
* 当前登录时间
* Current login time
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see LocalDateTime
*/
@TableField("current_login_time")
var currentLoginTime: LocalDateTime? = null
/**
* 当前登录 IP
* Current login IP
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("current_login_ip")
var currentLoginIp: String? = null
/**
* 上次登录时间
* Last login time
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see LocalDateTime
*/
@TableField("last_login_time")
var lastLoginTime: LocalDateTime? = null
/**
* 上次登录 IP
* Last login IP
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("last_login_ip")
var lastLoginIp: String? = null
/**
* 创建时间
* Create time
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see LocalDateTime
*/
@TableField("create_time")
var createTime: LocalDateTime? = null
/**
* 修改时间
* Update time
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see LocalDateTime
*/
@TableField("update_time")
var updateTime: LocalDateTime? = null
/**
* Deleted
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("deleted")
@TableLogic
var deleted: Long? = null
/**
* Version
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("version")
@Version
var version: Int? = null
/**
* User info
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see UserInfo
*/
@TableField(exist = false)
var userInfo: UserInfo? = null
/**
* Role list
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see Role
*/
@TableField(exist = false)
var roles: List<Role>? = null
/**
* Group list
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see Group
*/
@TableField(exist = false)
var groups: List<Group>? = null
/**
* Module list
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see Module
*/
@TableField(exist = false)
var modules: List<Module>? = null
/**
* Menu list
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see Menu
*/
@TableField(exist = false)
var menus: List<Menu>? = null
/**
* Function list
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see Func
*/
@TableField(exist = false)
var funcs: List<Func>? = null
/**
* Operation list
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see Operation
*/
@TableField(exist = false)
var operations: List<Operation>? = null

View File

@@ -11,26 +11,49 @@ import java.io.Serializable
*/
@TableName("t_user_group")
class UserGroup : Serializable {
/**
* ID
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableId("id")
var id: Long? = null
/**
* 用户
* User ID
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("user_id")
var userId: Long? = null
/**
* 用户组
* Group ID
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("group_id")
var groupId: Long? = null
/**
* Deleted
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("deleted")
@TableLogic
var deleted: Long? = null
/**
* Version
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("version")
@Version
var version: Int? = null

View File

@@ -12,47 +12,87 @@ import java.time.LocalDateTime
*/
@TableName("t_user_info")
class UserInfo : Serializable {
/**
* ID
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableId("id")
var id: Long? = null
/**
* User ID
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("user_id")
var userId: Long? = null
/**
* 昵称
* Nickname
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("nickname")
var nickname: String? = null
/**
* 头像
* Avatar in base64
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("avatar")
var avatar: String? = null
/**
* 邮箱
* Email
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("email")
var email: String? = null
/**
* 创建时间
* Create time
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see LocalDateTime
*/
@TableField("create_time", fill = FieldFill.INSERT)
var createTime: LocalDateTime? = null
/**
* 修改时间
* Update time
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see LocalDateTime
*/
@TableField("update_time", fill = FieldFill.INSERT_UPDATE)
var updateTime: LocalDateTime? = null
/**
* Deleted
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("deleted")
@TableLogic
var deleted: Long? = null
/**
* Version
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("version")
@Version
var version: Int? = null

View File

@@ -11,26 +11,49 @@ import java.io.Serializable
*/
@TableName("t_user_role")
class UserRole : Serializable {
/**
* ID
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableId("id")
var id: Long? = null
/**
* 用户
* User ID
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("user_id")
var userId: Long? = null
/**
* 角色
* Role ID
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("role_id")
var roleId: Long? = null
/**
* Deleted
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("deleted")
@TableLogic
var deleted: Long? = null
/**
* Version
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("version")
@Version
var version: Int? = null

View File

@@ -14,94 +14,150 @@ import java.time.LocalDateTime
*/
@TableName("t_sys_log")
class SysLog : Serializable {
/**
* ID
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableId("id")
var id: Long? = null
/**
* 日志类型
* Log type
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("log_type")
var logType: String? = null
/**
* 操作用户
* Operate user ID
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("operate_user_id")
var operateUserId: Long? = null
/**
* 操作时间
* Operate time
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see LocalDateTime
*/
@TableField("operate_time")
var operateTime: LocalDateTime? = null
/**
* 请求 URI
* Request URI
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("request_uri")
var requestUri: String? = null
/**
* 请求方式
* Request method
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("request_method")
var requestMethod: String? = null
/**
* 请求参数
* Request parameters
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("request_params")
var requestParams: String? = null
/**
* 请求 IP
* Request IP
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("request_ip")
var requestIp: String? = null
/**
* 请求服务器地址
* Request server address
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("request_server_address")
var requestServerAddress: String? = null
/**
* 是否异常
* Is exception
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("exception")
var exception: Int? = null
/**
* 异常信息
* Exception information
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("exception_info")
var exceptionInfo: String? = null
/**
* 开始时间
* Start time
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see LocalDateTime
*/
@TableField("start_time")
var startTime: LocalDateTime? = null
/**
* 结束时间
* End time
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see LocalDateTime
*/
@TableField("end_time")
var endTime: LocalDateTime? = null
/**
* 执行时间
* Execute time
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("execute_time")
var executeTime: Long? = null
/**
* 用户代理
* User agent
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField("user_agent")
var userAgent: String? = null
/**
* Operate username
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@TableField(exist = false)
var operateUsername: String? = null

View File

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

View File

@@ -5,5 +5,6 @@ package top.fatweb.api.exception
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see RuntimeException
*/
class TokenHasExpiredException : RuntimeException("Token has expired")

View File

@@ -11,6 +11,7 @@ import org.springframework.stereotype.Component
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see Filter
*/
@Component
class ExceptionFilter : Filter {

View File

@@ -20,13 +20,15 @@ import top.fatweb.api.util.WebUtil
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see RedisUtil
* @see OncePerRequestFilter
*/
@Component
class JwtAuthenticationTokenFilter(private val redisUtil: RedisUtil) : OncePerRequestFilter() {
override fun doFilterInternal(
request: HttpServletRequest, response: HttpServletResponse, filterChain: FilterChain
) {
val tokenWithPrefix = request.getHeader(SecurityProperties.headerString)
val tokenWithPrefix = request.getHeader(SecurityProperties.headerKey)
if (!StringUtils.hasText(tokenWithPrefix) || "/error/thrown" == request.servletPath) {
filterChain.doFilter(request, response)

View File

@@ -11,6 +11,7 @@ import java.time.ZoneOffset
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see MetaObjectHandler
*/
@Component
class DataMetaObjectHandler : MetaObjectHandler {

View File

@@ -30,6 +30,16 @@ import top.fatweb.avatargenerator.AvatarException
class ExceptionHandler {
private val logger: Logger = LoggerFactory.getLogger(this::class.java)
/**
* Handle all exception
*
* @param e Exception
* @return Response object
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see Exception
* @see ResponseResult
*/
@ExceptionHandler(value = [Exception::class])
fun exceptionHandler(e: Exception): ResponseResult<*> {
return when (e) {

View File

@@ -11,6 +11,7 @@ import org.springframework.stereotype.Component
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see AccessDeniedHandler
*/
@Component
class JwtAccessDeniedHandler : AccessDeniedHandler {

View File

@@ -11,6 +11,7 @@ import org.springframework.stereotype.Component
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see AuthenticationEntryPoint
*/
@Component
class JwtAuthenticationEntryPointHandler : AuthenticationEntryPoint {

View File

@@ -27,6 +27,8 @@ import java.util.concurrent.Executor
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see Executor
* @see ISysLogService
*/
@ControllerAdvice
class SysLogInterceptor(

View File

@@ -9,6 +9,8 @@ import top.fatweb.api.entity.permission.Func
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see BaseMapper
* @see Func
*/
@Mapper
interface FuncMapper : BaseMapper<Func>

View File

@@ -10,12 +10,43 @@ import top.fatweb.api.entity.permission.Group
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see BaseMapper
* @see Group
*/
@Mapper
interface GroupMapper : BaseMapper<Group> {
/**
* Select group in page
*
* @param page Pagination
* @param searchName Name to search for
* @param searchRegex Use regex
* @return Group in page
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see IPage
*/
fun selectPage(page: IPage<Long>, searchName: String?, searchRegex: Boolean): IPage<Long>
/**
* Select group with role list by list of group IDs
*
* @param groupIds List of group IDs
* @return Group with role list
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see Group
*/
fun selectListWithRoleByIds(groupIds: List<Long>): List<Group>?
/**
* Select one group by ID
*
* @param id Group ID
* @return Group object
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see Group
*/
fun selectOneById(id: Long): Group?
}

View File

@@ -9,6 +9,8 @@ import top.fatweb.api.entity.permission.Menu
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see BaseMapper
* @see Menu
*/
@Mapper
interface MenuMapper : BaseMapper<Menu>

View File

@@ -9,6 +9,8 @@ import top.fatweb.api.entity.permission.Module
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see BaseMapper
* @see Module
*/
@Mapper
interface ModuleMapper : BaseMapper<Module>

View File

@@ -9,6 +9,8 @@ import top.fatweb.api.entity.permission.Operation
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see BaseMapper
* @see Operation
*/
@Mapper
interface OperationMapper : BaseMapper<Operation>

View File

@@ -9,6 +9,8 @@ import top.fatweb.api.entity.permission.Power
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see BaseMapper
* @see Power
*/
@Mapper
interface PowerMapper : BaseMapper<Power>

View File

@@ -9,6 +9,8 @@ import top.fatweb.api.entity.permission.PowerRole
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see BaseMapper
* @see PowerRole
*/
@Mapper
interface PowerRoleMapper : BaseMapper<PowerRole>

View File

@@ -9,6 +9,8 @@ import top.fatweb.api.entity.permission.RoleGroup
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see BaseMapper
* @see RoleGroup
*/
@Mapper
interface RoleGroupMapper : BaseMapper<RoleGroup>

View File

@@ -10,12 +10,43 @@ import top.fatweb.api.entity.permission.Role
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see BaseMapper
* @see Role
*/
@Mapper
interface RoleMapper : BaseMapper<Role> {
/**
* Select role in page
*
* @param page Pagination
* @param searchName Name to search for
* @param searchRegex Use regex
* @return Role in page
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see IPage
*/
fun selectPage(page: IPage<Long>, searchName: String?, searchRegex: Boolean): IPage<Long>
/**
* Select role with power list by list of role IDs
*
* @param roleIds List of role IDs
* @return Role with power list
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see Role
*/
fun selectListWithPowerByIds(roleIds: List<Long>): List<Role>?
/**
* Select one role by ID
*
* @param id Role ID
* @return Role object
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see Role
*/
fun selectOneById(id: Long): Role?
}

View File

@@ -9,6 +9,8 @@ import top.fatweb.api.entity.permission.UserGroup
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see BaseMapper
* @see UserGroup
*/
@Mapper
interface UserGroupMapper : BaseMapper<UserGroup>

View File

@@ -9,6 +9,8 @@ import top.fatweb.api.entity.permission.UserInfo
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see BaseMapper
* @see UserInfo
*/
@Mapper
interface UserInfoMapper : BaseMapper<UserInfo>

View File

@@ -11,20 +11,85 @@ import top.fatweb.api.entity.permission.User
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see BaseMapper
* @see User
*/
@Mapper
interface UserMapper : BaseMapper<User> {
fun selectOneWithPowerInfoByUsername(@Param("username")username: String): User?
/**
* Select one user with power and information by username
*
* @param username Username
* @return User object with power and information
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see User
*/
fun selectOneWithPowerInfoByUsername(@Param("username") username: String): User?
/**
* Select user in page
*
* @param page Pagination
* @param searchType Type of search
* @param searchValue Value to search for
* @param searchRegex Use regex
* @return User in page
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see IPage
*/
fun selectPage(page: IPage<Long>, searchType: String, searchValue: String?, searchRegex: Boolean): IPage<Long>
/**
* Select user with role and information list by list of user IDs
*
* @param userIds List of user IDs
* @return User with role and information list
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see User
*/
fun selectListWithRoleInfoByIds(userIds: List<Long>): List<User>
/**
* Select one user by ID
*
* @param id User ID
* @return User object
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see User
*/
fun selectOneWithRoleInfoById(id: Long): User?
/**
* Select all user with information list
*
* @return User with information list
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see User
*/
fun selectListWithInfo(): List<User>
/**
* Select user IDs list by list of role IDs
*
* @param roleIds List of role IDs
* @return User IDs list
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
fun selectIdsWithRoleIds(roleIds: List<Long>): List<Long>
/**
* Select user IDs list by list of group IDs
*
* @param groupIds List of group IDs
* @return User IDs list
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
fun selectIdsWithGroupIds(groupIds: List<Long>): List<Long>
}

View File

@@ -9,6 +9,8 @@ import top.fatweb.api.entity.permission.UserRole
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see BaseMapper
* @see UserRole
*/
@Mapper
interface UserRoleMapper : BaseMapper<UserRole>

View File

@@ -11,9 +11,28 @@ import java.time.LocalDateTime
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see BaseMapper
* @see SysLog
*/
@Mapper
interface SysLogMapper : BaseMapper<SysLog> {
/**
* Select system log in page
*
* @param page Pagination
* @param logType List of log types
* @param requestMethod List of request methods
* @param searchRequestUrl Request URL to search for
* @param searchRegex Use regex
* @param searchStartTime Start time to search for
* @param searchEndTime end time to search for
* @return System log in page
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see IPage
* @see SysLog
* @see LocalDateTime
*/
fun selectPage(
page: IPage<SysLog>,
logType: List<String>?,

View File

@@ -4,23 +4,47 @@ import io.swagger.v3.oas.annotations.media.Schema
import jakarta.validation.constraints.Min
/**
* Page sort param
* Page sort parameters
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
open class PageSortParam {
/**
* Current page number
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "分页页码", example = "1", defaultValue = "1")
@field:Min(1, message = "Pagination page number must be a positive integer")
var currentPage: Long = 1
/**
* Size of page
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "分页大小", example = "20", defaultValue = "20")
@field:Min(1, message = "The number of data per page must be a positive integer")
var pageSize: Long = 20
/**
* Field name to sort
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "排序字段", example = "id")
var sortField: String? = null
/**
* Sort order by
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "排序方式", example = "desc", allowableValues = ["desc", "asc"])
var sortOrder: String? = null
}

View File

@@ -4,25 +4,66 @@ import io.swagger.v3.oas.annotations.media.Schema
import jakarta.validation.constraints.Max
import jakarta.validation.constraints.Pattern
/**
* Avatar base parameters
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
open class AvatarBaseParam {
/**
* Seed to generate avatar
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "种子")
var seed: Long? = null
/**
* Size of image
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "图像大小", defaultValue = "128")
@field:Max(256, message = "Size must be less than or equal to 256")
var size: Int? = null
/**
* Margin of image
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "外边距", defaultValue = "0")
var margin: Int? = null
/**
* Padding of image
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "内边距", defaultValue = "0")
var padding: Int? = null
/**
* List of colors to generate avatar
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(defaultValue = "颜色列表", example = "#FFFFFFAA")
var colors: List<String>? = null
/**
* Background of image
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(defaultValue = "背景颜色", example = "#FFFFFFAA")
@field:Pattern(regexp = "^#[0-9a-fA-F]{6}|#[0-9a-fA-F]{8}$", message = "Background color must be a hex color code")
var background: String? = null
}

View File

@@ -1,8 +0,0 @@
package top.fatweb.api.param.api.v1.avatar
import io.swagger.v3.oas.annotations.media.Schema
data class AvatarEightBitParam(
@Schema(description = "性别", defaultValue = "male", allowableValues = ["male", "female"])
val gender: String?,
) : AvatarBaseParam()

View File

@@ -3,11 +3,29 @@ package top.fatweb.api.param.api.v1.avatar
import io.swagger.v3.oas.annotations.media.Schema
import jakarta.validation.constraints.Max
/**
* GitHub style avatar parameters
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
data class AvatarGitHubParam(
/**
* Size of element
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "元素大小", defaultValue = "400")
@field:Max(1000, message = "Element size must be less than or equal to 1000")
val elementSize: Int = 400,
/**
* Precision of element
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "精确度", defaultValue = "5")
val precision: Int = 5
) : AvatarBaseParam()

View File

@@ -4,17 +4,29 @@ import io.swagger.v3.oas.annotations.media.Schema
import jakarta.validation.constraints.NotBlank
/**
* Login param
* Login parameters
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "登录请求参数")
data class LoginParam(
/**
* Username
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "用户名", example = "test", required = true)
@field:NotBlank(message = "Username can not be blank")
val username: String? = null,
/**
* Password
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "密码", example = "test123456", required = true)
@field:NotBlank(message = "Password can not be blank")
val password: String? = null

View File

@@ -4,20 +4,38 @@ import io.swagger.v3.oas.annotations.media.Schema
import jakarta.validation.constraints.NotBlank
/**
* Group add param
* Add group parameters
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "用户组添加请求参数")
data class GroupAddParam(
/**
* Name
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "用户组名称")
@field:NotBlank(message = "Name can not be blank")
val name: String?,
/**
* Enable
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "启用", allowableValues = ["true", "false"], defaultValue = "true")
val enable: Boolean = true,
/**
* List of role IDs
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "角色 ID 列表")
val roleIds: List<Long>? = null
)

View File

@@ -3,13 +3,19 @@ package top.fatweb.api.param.permission.group
import io.swagger.v3.oas.annotations.media.Schema
/**
* Group delete param
* Delete group parameters
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "用户组删除请求参数")
data class GroupDeleteParam(
/**
* List of group IDs
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "用户组 ID 列表")
val ids: List<Long>
)

View File

@@ -4,16 +4,29 @@ import io.swagger.v3.oas.annotations.media.Schema
import top.fatweb.api.param.PageSortParam
/**
* Group get param
* Get group parameters
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see PageSortParam
*/
@Schema(description = "用户组查询请求参数")
data class GroupGetParam(
/**
* Name to search for
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "用户组查询请求参数")
data class GroupGetParam(
@Schema(description = "查询用户组名称")
val searchName: String? = null,
/**
* Use regex
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "查询使用正则表达式", allowableValues = ["true", "false"], defaultValue = "false")
val searchRegex: Boolean = false,
) : PageSortParam()

View File

@@ -5,24 +5,48 @@ import jakarta.validation.constraints.NotBlank
import jakarta.validation.constraints.NotNull
/**
* Group update param
* Update group parameters
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "用户组更新请求参数")
data class GroupUpdateParam(
/**
* ID
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "用户组 ID")
@field:NotNull(message = "ID can not be null")
val id: Long?,
/**
* Name
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "用户组名称")
@field:NotBlank(message = "Name can not be blank")
val name: String?,
/**
* Enable
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "启用", allowableValues = ["true", "false"], defaultValue = "true")
val enable: Boolean = true,
/**
* List of role IDs
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "角色 ID 列表")
val roleIds: List<Long>? = null
)

View File

@@ -4,17 +4,29 @@ import io.swagger.v3.oas.annotations.media.Schema
import jakarta.validation.constraints.NotNull
/**
* Group change status param
* Update status of group parameters
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "用户组更改状态请求参数")
data class GroupUpdateStatusParam(
/**
* ID
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "用户组 ID")
@field:NotNull(message = "ID can not be null")
val id: Long?,
/**
* Enable
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "启用", allowableValues = ["true", "false"], defaultValue = "true")
val enable: Boolean = true
)

View File

@@ -4,20 +4,38 @@ import io.swagger.v3.oas.annotations.media.Schema
import jakarta.validation.constraints.NotBlank
/**
* Role add param
* Add role parameters
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "角色添加请求参数")
data class RoleAddParam(
/**
* Name
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "角色名称")
@field:NotBlank(message = "Name can not be blank")
val name: String?,
/**
* Enable
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "启用", allowableValues = ["true", "false"], defaultValue = "true")
val enable: Boolean = true,
/**
* List of power IDs
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "权限 ID 列表")
val powerIds: List<Long>? = null
)

View File

@@ -3,13 +3,19 @@ package top.fatweb.api.param.permission.role
import io.swagger.v3.oas.annotations.media.Schema
/**
* Role delete param
* Delete role parameters
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "角色删除请求参数")
data class RoleDeleteParam(
/**
* List of role IDs
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "角色 ID 列表")
val ids: List<Long>
)

View File

@@ -4,16 +4,29 @@ import io.swagger.v3.oas.annotations.media.Schema
import top.fatweb.api.param.PageSortParam
/**
* Role get param
* Get role parameters
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see PageSortParam
*/
@Schema(description = "角色查询请求参数")
data class RoleGetParam(
/**
* Name to search for
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "角色查询请求参数")
data class RoleGetParam(
@Schema(description = "查询角色名称")
val searchName: String? = null,
/**
* Use regex
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "查询使用正则表达式", allowableValues = ["true", "false"], defaultValue = "false")
val searchRegex: Boolean = false,
) : PageSortParam()

View File

@@ -5,24 +5,48 @@ import jakarta.validation.constraints.NotBlank
import jakarta.validation.constraints.NotNull
/**
* Role update param
* Update role parameters
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "角色更新请求参数")
data class RoleUpdateParam(
/**
* ID
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "角色 ID")
@field:NotNull(message = "Role id can not be null")
val id: Long?,
/**
* Name
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "角色名称")
@field:NotBlank(message = "Name can not be blank")
val name: String?,
/**
* Enable
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "启用", allowableValues = ["true", "false"], defaultValue = "true")
val enable: Boolean = true,
/**
* List of power IDs
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "权限 ID 列表")
val powerIds: List<Long>? = null
)

View File

@@ -4,17 +4,29 @@ import io.swagger.v3.oas.annotations.media.Schema
import jakarta.validation.constraints.NotNull
/**
* Role change status param
* Update status of role parameters
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "角色更改状态请求参数")
data class RoleUpdateStatusParam(
/**
* ID
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "角色 ID")
@field:NotNull(message = "Role id can not be null")
val id: Long?,
/**
* Enable
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "启用", allowableValues = ["true", "false"], defaultValue = "true")
val enable: Boolean = true
)

View File

@@ -4,39 +4,113 @@ import io.swagger.v3.oas.annotations.media.Schema
import jakarta.validation.constraints.NotBlank
import java.time.LocalDateTime
/**
* Add user parameters
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "用户添加请求参数")
data class UserAddParam(
/**
* Username
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "用户名")
@field:NotBlank(message = "Username can not be blank")
val username: String?,
/**
* Password
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "密码(为空自动生成随机密码)")
val password: String?,
/**
* Locking
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "锁定", allowableValues = ["true", "false"], defaultValue = "false")
val locking: Boolean = false,
/**
* Expiration time
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see LocalDateTime
*/
@Schema(description = "过期时间")
val expiration: LocalDateTime?,
/**
* Credentials expiration time
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see LocalDateTime
*/
@Schema(description = "认证过期时间")
val credentialsExpiration: LocalDateTime?,
/**
* Enable
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "启用", allowableValues = ["true", "false"], defaultValue = "true")
val enable: Boolean = true,
/**
* Nickname
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "昵称")
val nickname: String?,
/**
* Avatar base63
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "头像")
val avatar: String?,
/**
* Email
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "邮箱")
val email: String?,
/**
* List of role IDs
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "角色 ID 列表")
val roleIds: List<Long>?,
/**
* List of group IDs
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "用户组 ID 列表")
val groupIds: List<Long>?
)

View File

@@ -3,13 +3,19 @@ package top.fatweb.api.param.permission.user
import io.swagger.v3.oas.annotations.media.Schema
/**
* User delete param
* Delete user parameters
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "用户删除请求参数")
data class UserDeleteParam(
/**
* List of user IDs
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "用户 ID 列表")
val ids: List<Long>
)

View File

@@ -4,19 +4,38 @@ import io.swagger.v3.oas.annotations.media.Schema
import top.fatweb.api.param.PageSortParam
/**
* User get param
* Get user parameters
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see PageSortParam
*/
@Schema(description = "用户查询请求参数")
data class UserGetParam(
/**
* Type of search
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "用户查询请求参数")
data class UserGetParam(
@Schema(description = "搜索类型", allowableValues = ["ALL", "ID", "USERNAME", "NICKNAME", "EMAIL"], defaultValue = "ALL")
val searchType: String = "ALL",
/**
* Value to search for
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "查询内容")
val searchValue: String? = null,
/**
* Use regex
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "查询使用正则表达式", allowableValues = ["true", "false"], defaultValue = "false")
val searchRegex: Boolean = false,
) : PageSortParam()

View File

@@ -4,39 +4,113 @@ import io.swagger.v3.oas.annotations.media.Schema
import jakarta.validation.constraints.NotNull
import java.time.LocalDateTime
/**
* Update user parameters
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "用户更新请求参数")
data class UserUpdateParam(
/**
* ID
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "用户 ID")
@field:NotNull(message = "ID can not be null")
val id: Long?,
/**
* Username
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "用户名")
val username: String?,
/**
* Locking
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "锁定", allowableValues = ["true", "false"], defaultValue = "false")
val locking: Boolean = false,
/**
* Expiration time
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see LocalDateTime
*/
@Schema(description = "过期时间")
val expiration: LocalDateTime?,
/**
* Credentials expiration time
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see LocalDateTime
*/
@Schema(description = "认证过期时间")
val credentialsExpiration: LocalDateTime?,
/**
* Enable
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "启用", allowableValues = ["true", "false"], defaultValue = "true")
val enable: Boolean = true,
/**
* Nickname
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "昵称")
val nickname: String?,
/**
* Avatar base64
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "头像")
val avatar: String?,
/**
* Email
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "邮箱")
val email: String?,
/**
* List of role IDs
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "角色 ID 列表")
val roleIds: List<Long>?,
/**
* List of group IDs
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "用户组 ID 列表")
val groupIds: List<Long>?
)

View File

@@ -5,16 +5,41 @@ import jakarta.validation.constraints.NotBlank
import jakarta.validation.constraints.NotNull
import java.time.LocalDateTime
/**
* Update password of user parameters
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "用户更改密码请求参数")
data class UserUpdatePasswordParam(
/**
* ID
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "用户 ID")
@field:NotNull(message = "ID can not be null")
val id: Long?,
/**
* New password
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "新密码")
@field:NotBlank(message = "Password can not be blank")
val password: String?,
/**
* Credentials expiration time
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see LocalDateTime
*/
@Schema(description = "认证过期时间")
val credentialsExpiration: LocalDateTime?
)

View File

@@ -1,9 +1,57 @@
package top.fatweb.api.param.system
data class MailSettingsParam (
import io.swagger.v3.oas.annotations.media.Schema
/**
* Mail settings parameters
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "邮件设置请求参数")
data class MailSettingsParam(
/**
* Host
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "SMTP 服务器")
val host: String?,
/**
* Port
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "端口号")
val port: Int?,
/**
* Username
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "用户名")
val username: String?,
/**
* Password
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "密码")
val password: String?,
/**
* Sender
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "发送者")
val from: String?
)

View File

@@ -6,16 +6,29 @@ import top.fatweb.api.param.PageSortParam
import java.time.LocalDateTime
/**
* System log get param
* Get system log parameters
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see PageSortParam
*/
@Schema(description = "获取系统日志请求参数")
data class SysLogGetParam(
/**
* Log type
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "获取系统日志请求参数")
data class SysLogGetParam(
@Schema(description = "类型过滤(多个使用逗号分隔)", example = "INFO", allowableValues = ["INFO", "ERROR"])
val logType: String? = null,
/**
* Request method to filter
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(
description = "请求方式过滤(多个使用逗号分隔)",
example = "GET,POST",
@@ -23,16 +36,42 @@ data class SysLogGetParam(
)
val requestMethod: String? = null,
/**
* Request URL to search for
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "查询请求 Url")
val searchRequestUrl: String? = null,
/**
* Use regex
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
@Schema(description = "查询使用正则表达式", allowableValues = ["true", "false"], defaultValue = "false")
val searchRegex: Boolean = false,
/**
* Start time to search for
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see LocalDateTime
*/
@Schema(description = "查询开始时间")
@DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
val searchStartTime: LocalDateTime? = null,
/**
* End time to search for
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see LocalDateTime
*/
@Schema(description = "查询结束时间")
@DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
val searchEndTime: LocalDateTime? = null

View File

@@ -12,8 +12,35 @@ import org.springframework.stereotype.Component
@Component
@ConfigurationProperties("app.admin")
object AdminProperties {
/**
* Username
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
var username = "admin"
/**
* Password
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
var password: String? = null
/**
* Nickname
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
var nickname = "Administrator"
/**
* Email
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
var email = "admin@fatweb.top"
}

View File

@@ -13,19 +13,67 @@ import java.util.concurrent.TimeUnit
@Component
@ConfigurationProperties("app.security")
object SecurityProperties {
var headerString = "Authorization"
/**
* Key to get authentication from header
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
var headerKey = "Authorization"
/**
* Prefix of token
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
var tokenPrefix = "Bearer "
/**
* TTL of JWT
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
var jwtTtl = 2L
/**
* TTL unit of JWT
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
var jwtTtlUnit = TimeUnit.HOURS
/**
* Key of JWT
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
var jwtKey = "FatWeb"
/**
* Issuer of JWT
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
var jwtIssuer = "FatWeb"
/**
* TTL of redis
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
var redisTtl = 20L
/**
* TTL unit of redis
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
var redisTtlUnit = TimeUnit.MINUTES
}

View File

@@ -15,8 +15,20 @@ import java.time.ZonedDateTime
@Component
@ConfigurationProperties("app")
object ServerProperties {
/**
* Version
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
lateinit var version: String
/**
* Build time
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
lateinit var buildTime: String
fun buildZoneDateTime(zoneId: ZoneId = ZoneId.systemDefault()): ZonedDateTime =

View File

@@ -4,23 +4,106 @@ import top.fatweb.api.param.api.v1.avatar.AvatarBaseParam
import top.fatweb.api.param.api.v1.avatar.AvatarGitHubParam
import top.fatweb.api.vo.api.v1.avatar.AvatarBase64Vo
/**
* Avatar service interface
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
interface IAvatarService {
/**
* Generate triangle style avatar
*
* @param avatarBaseParam Avatar base parameters
* @return Avatar byte array
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see AvatarBaseParam
* @see ByteArray
*/
fun triangle(avatarBaseParam: AvatarBaseParam?): ByteArray
/**
* Generate triangle style avatar as base64
*
* @param avatarBaseParam Avatar base parameters
* @return AvatarBase64Vo object
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see AvatarBaseParam
* @see AvatarBase64Vo
*/
fun triangleBase64(avatarBaseParam: AvatarBaseParam?): AvatarBase64Vo
/**
* Generate square style avatar
*
* @param avatarBaseParam Avatar base parameters
* @return Avatar byte array
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see AvatarBaseParam
* @see ByteArray
*/
fun square(avatarBaseParam: AvatarBaseParam?): ByteArray
/**
* Generate square style avatar as base64
*
* @param avatarBaseParam Avatar base parameters
* @return AvatarBase64Vo object
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see AvatarBaseParam
* @see AvatarBase64Vo
*/
fun squareBase64(avatarBaseParam: AvatarBaseParam?): AvatarBase64Vo
/**
* Generate identicon style avatar
*
* @param avatarBaseParam Avatar base parameters
* @return Avatar byte array
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see AvatarBaseParam
* @see ByteArray
*/
fun identicon(avatarBaseParam: AvatarBaseParam?): ByteArray
/**
* Generate identicon style avatar as base64
*
* @param avatarBaseParam Avatar base parameters
* @return AvatarBase64Vo object
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see AvatarBaseParam
* @see AvatarBase64Vo
*/
fun identiconBase64(avatarBaseParam: AvatarBaseParam?): AvatarBase64Vo
/**
* Generate GitHub style avatar
*
* @param avatarGitHubParam Avatar base parameters
* @return Avatar byte array
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see AvatarBaseParam
* @see ByteArray
*/
fun github(avatarGitHubParam: AvatarGitHubParam?): ByteArray
/**
* Generate GitHub style avatar as base64
*
* @param avatarGitHubParam Avatar base parameters
* @return AvatarBase64Vo object
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see AvatarBaseParam
* @see AvatarBase64Vo
*/
fun githubBase64(avatarGitHubParam: AvatarGitHubParam?): AvatarBase64Vo
// fun eightBit(avatarEightBitParam: AvatarEightBitParam?): ByteArray
}

View File

@@ -15,6 +15,13 @@ import java.awt.Color
import kotlin.io.encoding.Base64
import kotlin.io.encoding.ExperimentalEncodingApi
/**
* Avatar service implement
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see IAvatarService
*/
@OptIn(ExperimentalEncodingApi::class)
@Service
class AvatarServiceImpl : IAvatarService {

View File

@@ -12,9 +12,38 @@ import top.fatweb.api.vo.permission.TokenVo
* @since 1.0.0
*/
interface IAuthenticationService {
/**
* Login
*
* @param request
* @param user User object
* @return LoginVo object
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see HttpServletRequest
* @see User
* @see LoginVo
*/
fun login(request: HttpServletRequest, user: User): LoginVo
/**
* Logout
*
* @param token Token
* @return Logout result
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
fun logout(token: String): Boolean
/**
* Renew token
*
* @param token Token
* @return TokenVo object
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see TokenVo
*/
fun renewToken(token: String): TokenVo
}

View File

@@ -8,5 +8,7 @@ import top.fatweb.api.entity.permission.Func
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see IService
* @see Func
*/
interface IFuncService : IService<Func>

View File

@@ -12,21 +12,95 @@ import top.fatweb.api.vo.permission.GroupWithRoleVo
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see IService
* @see Group
*/
interface IGroupService : IService<Group> {
/**
* Get group in page
*
* @param groupGetParam Get group parameters
* @return PageVo<GroupWithRoleVo> object
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see GroupGetParam
* @see PageVo
* @see GroupWithRoleVo
*/
fun getPage(groupGetParam: GroupGetParam?): PageVo<GroupWithRoleVo>
/**
* Get one group by ID
*
* @param id ID
* @return GroupWithRoleVo object
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see GroupWithRoleVo
*/
fun getOne(id: Long): GroupWithRoleVo?
/**
* Get all group in list
*
* @return List of GroupVo object
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see GroupVo
*/
fun listAll(): List<GroupVo>
/**
* Add group
*
* @param groupAddParam Add group parameters
* @return GroupVo object
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see GroupAddParam
* @see GroupVo
*/
fun add(groupAddParam: GroupAddParam): GroupVo?
/**
* Update group
*
* @param groupUpdateParam Update group parameters
* @return GroupVo object
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see GroupUpdateParam
* @see GroupVo
*/
fun update(groupUpdateParam: GroupUpdateParam): GroupVo?
/**
* Update status of group
*
* @param groupUpdateStatusParam Update status of group parameters
* @return Result
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see GroupUpdateStatusParam
*/
fun status(groupUpdateStatusParam: GroupUpdateStatusParam): Boolean
/**
* Delete group by ID
*
* @param id ID
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
fun deleteOne(id: Long)
/**
* Delete group by list
*
* @param groupDeleteParam Delete group parameters
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see GroupDeleteParam
*/
fun delete(groupDeleteParam: GroupDeleteParam)
}

View File

@@ -8,5 +8,7 @@ import top.fatweb.api.entity.permission.Menu
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see IService
* @see Menu
*/
interface IMenuService : IService<Menu>

View File

@@ -8,5 +8,7 @@ import top.fatweb.api.entity.permission.Module
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see IService
* @see Module
*/
interface IModuleService : IService<Module>

View File

@@ -8,5 +8,7 @@ import top.fatweb.api.entity.permission.Operation
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see IService
* @see Operation
*/
interface IOperationService : IService<Operation>

View File

@@ -8,5 +8,7 @@ import top.fatweb.api.entity.permission.PowerRole
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see IService
* @see PowerRole
*/
interface IPowerRoleService : IService<PowerRole>

View File

@@ -9,7 +9,17 @@ import top.fatweb.api.vo.permission.PowerSetVo
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see IService
* @see Power
*/
interface IPowerService : IService<Power> {
/**
* Get all power as list
*
* @return powerSetVo object
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see PowerSetVo
*/
fun getList(): PowerSetVo
}

View File

@@ -8,5 +8,7 @@ import top.fatweb.api.entity.permission.RoleGroup
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see IService
* @see RoleGroup
*/
interface IRoleGroupService : IService<RoleGroup>

View File

@@ -12,21 +12,95 @@ import top.fatweb.api.vo.permission.RoleWithPowerVo
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see IService
* @see Role
*/
interface IRoleService : IService<Role> {
/**
* Get role in page
*
* @param roleGetParam Get role parameters
* @return PageVo<RoleWithPowerVo> object
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see RoleGetParam
* @see PageVo
* @see RoleWithPowerVo
*/
fun getPage(roleGetParam: RoleGetParam?): PageVo<RoleWithPowerVo>
/**
* Get user by ID
*
* @param id ID
* @return RoleWithPowerVo object
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see RoleWithPowerVo
*/
fun getOne(id: Long): RoleWithPowerVo?
/**
* Get all role in list
*
* @return List of RoleVo object
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see RoleVo
*/
fun listAll(): List<RoleVo>
/**
* Add role
*
* @param roleAddParam Add role parameters
* @return RoleVo object
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see RoleAddParam
* @see RoleVo
*/
fun add(roleAddParam: RoleAddParam): RoleVo?
/**
* Update role
*
* @param roleUpdateParam Update role parameters
* @return RoleVo object
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see RoleUpdateParam
* @see RoleVo
*/
fun update(roleUpdateParam: RoleUpdateParam): RoleVo?
/**
* Update status of role
*
* @param roleUpdateStatusParam Update status of role parameters
* @return Result
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see RoleUpdateStatusParam
*/
fun status(roleUpdateStatusParam: RoleUpdateStatusParam): Boolean
/**
* Delete role by ID
*
* @param id ID
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
fun deleteOne(id: Long)
/**
* Delete role by list
*
* @param roleDeleteParam Delete role parameters
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see RoleDeleteParam
*/
fun delete(roleDeleteParam: RoleDeleteParam)
}

View File

@@ -8,5 +8,7 @@ import top.fatweb.api.entity.permission.UserGroup
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see IService
* @see UserGroup
*/
interface IUserGroupService : IService<UserGroup>

View File

@@ -8,5 +8,7 @@ import top.fatweb.api.entity.permission.UserInfo
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see IService
* @see UserInfo
*/
interface IUserInfoService : IService<UserInfo>

View File

@@ -8,5 +8,7 @@ import top.fatweb.api.entity.permission.UserRole
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see IService
* @see UserRole
*/
interface IUserRoleService : IService<UserRole>

View File

@@ -14,29 +14,135 @@ import top.fatweb.api.vo.permission.UserWithRoleInfoVo
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see IService
* @see User
*/
interface IUserService : IService<User> {
/**
* Get user with power by username
*
* @param username Username
* @return User object
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see User
*/
fun getUserWithPowerByUsername(username: String): User?
/**
* Get user information
*
* @return UserWithPowerInfoVo object
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see UserWithPowerInfoVo
*/
fun getInfo(): UserWithPowerInfoVo?
/**
* Get user in page
*
* @param userGetParam Get user parameters
* @return PageVo<UserWithRoleInfoVo> object
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see UserGetParam
* @see PageVo
* @see UserWithRoleInfoVo
*/
fun getPage(userGetParam: UserGetParam?): PageVo<UserWithRoleInfoVo>
/**
* Get one user by ID
*
* @param id ID
* @return UserWithRoleInfoVo object
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see UserWithRoleInfoVo
*/
fun getOne(id: Long): UserWithRoleInfoVo?
fun getList(): List<UserWithInfoVo>
/**
* Get all user as list
*
* @return List of UserWithInfoVo object
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see UserWithInfoVo
*/
fun listAll(): List<UserWithInfoVo>
/**
* Add user
*
* @param userAddParam Add user parameters
* @return UserWithPasswordRoleInfoVo object
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see UserAddParam
* @see UserWithPasswordRoleInfoVo
*/
fun add(userAddParam: UserAddParam): UserWithPasswordRoleInfoVo?
/**
* Update user
*
* @param userUpdateParam Update user parameters
* @return UserWithRoleInfoVo object
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see UserUpdateParam
* @see UserWithRoleInfoVo
*/
fun update(userUpdateParam: UserUpdateParam): UserWithRoleInfoVo?
/**
* Update user password
*
* @param userUpdatePasswordParam Update user password parameters
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see UserUpdatePasswordParam
*/
fun password(userUpdatePasswordParam: UserUpdatePasswordParam)
/**
* Delete user by ID
*
* @param id ID
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
fun deleteOne(id: Long)
/**
* Delete user by list
*
* @param userDeleteParam Delete user parameters
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see UserDeleteParam
*/
fun delete(userDeleteParam: UserDeleteParam)
fun selectIdsWithRoleIds(roleIds: List<Long>): List<Long>
/**
* Get user IDs list by list of role IDs
*
* @param roleIds List of role IDs
* @return User IDs list
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
fun getIdsWithRoleIds(roleIds: List<Long>): List<Long>
fun selectIdsWithGroupIds(groupIds: List<Long>): List<Long>
/**
* Get user IDs list by list of group IDs
*
* @param groupIds List of group IDs
* @return User IDs list
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
*/
fun getIdsWithGroupIds(groupIds: List<Long>): List<Long>
}

View File

@@ -26,6 +26,10 @@ import java.time.ZoneOffset
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see AuthenticationManager
* @see RedisUtil
* @see IUserService
* @see IAuthenticationService
*/
@Service
class AuthenticationServiceImpl(

View File

@@ -11,6 +11,10 @@ import top.fatweb.api.service.permission.IFuncService
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see ServiceImpl
* @see FuncMapper
* @see Func
* @see IFuncService
*/
@Service
class FuncServiceImpl : ServiceImpl<FuncMapper, Func>(), IFuncService

View File

@@ -25,6 +25,13 @@ import top.fatweb.api.vo.permission.GroupWithRoleVo
*
* @author FatttSnake, fatttsnake@gmail.com
* @since 1.0.0
* @see RedisUtil
* @see IRoleGroupService
* @see IUserService
* @see ServiceImpl
* @see GroupMapper
* @see Group
* @see IGroupService
*/
@Service
class GroupServiceImpl(
@@ -140,7 +147,7 @@ class GroupServiceImpl(
}
private fun offlineUser(vararg groupIds: Long) {
val userIds = userService.selectIdsWithGroupIds(groupIds.toList())
val userIds = userService.getIdsWithGroupIds(groupIds.toList())
WebUtil.offlineUser(redisUtil, *userIds.toLongArray())
}
}

Some files were not shown because too many files have changed in this diff Show More