Optimize SysLogController
This commit is contained in:
@@ -30,12 +30,10 @@ class SysLogController(
|
|||||||
) {
|
) {
|
||||||
@Operation(summary = "获取")
|
@Operation(summary = "获取")
|
||||||
@GetMapping
|
@GetMapping
|
||||||
fun get(@Valid sysLogGetParam: SysLogGetParam): ResponseResult<PageVo<SysLogGetVo>> {
|
fun get(@Valid sysLogGetParam: SysLogGetParam?): ResponseResult<PageVo<SysLogGetVo>> {
|
||||||
return ResponseResult.success(
|
return ResponseResult.success(
|
||||||
ResponseCode.DATABASE_SELECT_SUCCESS, data = SysLogConverter.sysLogPageToSysLogPageVo(
|
ResponseCode.DATABASE_SELECT_SUCCESS, data = SysLogConverter.sysLogPageToSysLogPageVo(
|
||||||
sysLogService.getPage(
|
sysLogService.getPage(sysLogGetParam)
|
||||||
sysLogGetParam.currentPage, sysLogGetParam.pageSize
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,7 +27,8 @@ enum class ResponseCode(val code: Int) {
|
|||||||
DATABASE_UPDATE_SUCCESS(BusinessCode.DATABASE, 20),
|
DATABASE_UPDATE_SUCCESS(BusinessCode.DATABASE, 20),
|
||||||
DATABASE_UPDATE_FILED(BusinessCode.DATABASE, 25),
|
DATABASE_UPDATE_FILED(BusinessCode.DATABASE, 25),
|
||||||
DATABASE_DELETE_SUCCESS(BusinessCode.DATABASE, 30),
|
DATABASE_DELETE_SUCCESS(BusinessCode.DATABASE, 30),
|
||||||
DATABASE_DELETE_FILED(BusinessCode.DATABASE, 35);
|
DATABASE_DELETE_FILED(BusinessCode.DATABASE, 35),
|
||||||
|
DATABASE_EXECUTE_ERROR(BusinessCode.DATABASE, 40);
|
||||||
|
|
||||||
constructor(businessCode: BusinessCode, code: Int) : this(businessCode.code * 100 + code)
|
constructor(businessCode: BusinessCode, code: Int) : this(businessCode.code * 100 + code)
|
||||||
}
|
}
|
||||||
@@ -6,6 +6,7 @@ import com.auth0.jwt.exceptions.TokenExpiredException
|
|||||||
import org.slf4j.Logger
|
import org.slf4j.Logger
|
||||||
import org.slf4j.LoggerFactory
|
import org.slf4j.LoggerFactory
|
||||||
import org.springframework.http.converter.HttpMessageNotReadableException
|
import org.springframework.http.converter.HttpMessageNotReadableException
|
||||||
|
import org.springframework.jdbc.BadSqlGrammarException
|
||||||
import org.springframework.security.authentication.BadCredentialsException
|
import org.springframework.security.authentication.BadCredentialsException
|
||||||
import org.springframework.security.authentication.InsufficientAuthenticationException
|
import org.springframework.security.authentication.InsufficientAuthenticationException
|
||||||
import org.springframework.security.authentication.InternalAuthenticationServiceException
|
import org.springframework.security.authentication.InternalAuthenticationServiceException
|
||||||
@@ -70,6 +71,11 @@ class ExceptionHandler {
|
|||||||
ResponseResult.fail(ResponseCode.SYSTEM_TOKEN_HAS_EXPIRED, e.localizedMessage, null)
|
ResponseResult.fail(ResponseCode.SYSTEM_TOKEN_HAS_EXPIRED, e.localizedMessage, null)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
is BadSqlGrammarException -> {
|
||||||
|
logger.debug(e.localizedMessage, e)
|
||||||
|
ResponseResult.fail(ResponseCode.DATABASE_EXECUTE_ERROR, "Incorrect SQL syntax", null)
|
||||||
|
}
|
||||||
|
|
||||||
else -> {
|
else -> {
|
||||||
logger.error(e.localizedMessage, e)
|
logger.error(e.localizedMessage, e)
|
||||||
ResponseResult.fail(ResponseCode.SYSTEM_ERROR, data = null)
|
ResponseResult.fail(ResponseCode.SYSTEM_ERROR, data = null)
|
||||||
|
|||||||
@@ -15,5 +15,5 @@ import org.apache.ibatis.annotations.Mapper
|
|||||||
*/
|
*/
|
||||||
@Mapper
|
@Mapper
|
||||||
interface SysLogMapper : BaseMapper<SysLog> {
|
interface SysLogMapper : BaseMapper<SysLog> {
|
||||||
fun selectPage(page: IPage<SysLog>): IPage<SysLog>
|
fun selectPage(page: IPage<SysLog>, logType: List<String>?, requestMethod: List<String>?): IPage<SysLog>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,5 +5,19 @@ import top.fatweb.api.param.PageParam
|
|||||||
|
|
||||||
@Schema(description = "获取系统日志请求参数")
|
@Schema(description = "获取系统日志请求参数")
|
||||||
data class SysLogGetParam(
|
data class SysLogGetParam(
|
||||||
val logType: String? = null
|
@Schema(description = "排序字段", example = "id")
|
||||||
|
val sortField: String? = null,
|
||||||
|
|
||||||
|
@Schema(description = "排序方式", example = "desc", allowableValues = ["desc", "asc"])
|
||||||
|
val sortOrder: String? = null,
|
||||||
|
|
||||||
|
@Schema(description = "类型过滤(多个使用逗号分隔)", example = "INFO", allowableValues = ["INFO", "ERROR"])
|
||||||
|
val logType: String? = null,
|
||||||
|
|
||||||
|
@Schema(
|
||||||
|
description = "请求方式过滤(多个使用逗号分隔)",
|
||||||
|
example = "GET,POST",
|
||||||
|
allowableValues = ["GET", "POST", "PUT", "PATCH", "DELETE", "DELETE", "OPTIONS"]
|
||||||
|
)
|
||||||
|
val requestMethod: String? = null
|
||||||
) : PageParam()
|
) : PageParam()
|
||||||
@@ -3,6 +3,7 @@ package top.fatweb.api.service.system
|
|||||||
import com.baomidou.mybatisplus.core.metadata.IPage
|
import com.baomidou.mybatisplus.core.metadata.IPage
|
||||||
import com.baomidou.mybatisplus.extension.service.IService
|
import com.baomidou.mybatisplus.extension.service.IService
|
||||||
import top.fatweb.api.entity.system.SysLog
|
import top.fatweb.api.entity.system.SysLog
|
||||||
|
import top.fatweb.api.param.system.SysLogGetParam
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
@@ -13,5 +14,5 @@ import top.fatweb.api.entity.system.SysLog
|
|||||||
* @since 2023-10-18
|
* @since 2023-10-18
|
||||||
*/
|
*/
|
||||||
interface ISysLogService : IService<SysLog> {
|
interface ISysLogService : IService<SysLog> {
|
||||||
fun getPage(page: Long, pageSize: Long): IPage<SysLog>
|
fun getPage(sysLogGetParam: SysLogGetParam?): IPage<SysLog>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,9 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl
|
|||||||
import org.springframework.stereotype.Service
|
import org.springframework.stereotype.Service
|
||||||
import top.fatweb.api.entity.system.SysLog
|
import top.fatweb.api.entity.system.SysLog
|
||||||
import top.fatweb.api.mapper.system.SysLogMapper
|
import top.fatweb.api.mapper.system.SysLogMapper
|
||||||
|
import top.fatweb.api.param.system.SysLogGetParam
|
||||||
import top.fatweb.api.service.system.ISysLogService
|
import top.fatweb.api.service.system.ISysLogService
|
||||||
|
import top.fatweb.api.util.StrUtil
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
@@ -19,10 +21,24 @@ import top.fatweb.api.service.system.ISysLogService
|
|||||||
*/
|
*/
|
||||||
@Service
|
@Service
|
||||||
class SysLogServiceImpl : ServiceImpl<SysLogMapper, SysLog>(), ISysLogService {
|
class SysLogServiceImpl : ServiceImpl<SysLogMapper, SysLog>(), ISysLogService {
|
||||||
override fun getPage(page: Long, pageSize: Long): IPage<SysLog> {
|
override fun getPage(sysLogGetParam: SysLogGetParam?): IPage<SysLog> {
|
||||||
val sysLogPage = Page<SysLog>(page, pageSize)
|
val sysLogPage = Page<SysLog>(sysLogGetParam?.currentPage ?: 1, sysLogGetParam?.pageSize ?: 20)
|
||||||
sysLogPage.addOrder(OrderItem.desc("start_time"))
|
|
||||||
|
|
||||||
return baseMapper.selectPage(sysLogPage)
|
if (sysLogGetParam?.sortField == null && sysLogGetParam?.sortOrder == null) {
|
||||||
|
sysLogPage.addOrder(OrderItem.desc("start_time"))
|
||||||
|
} else {
|
||||||
|
sysLogPage.addOrder(
|
||||||
|
if (sysLogGetParam.sortOrder?.startsWith(
|
||||||
|
"desc", true
|
||||||
|
) == true
|
||||||
|
) OrderItem.desc(StrUtil.upperToUnderLetter(sysLogGetParam.sortField)) else OrderItem.asc(
|
||||||
|
StrUtil.upperToUnderLetter(
|
||||||
|
sysLogGetParam.sortField
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return baseMapper.selectPage(sysLogPage, sysLogGetParam?.logType?.split(","), sysLogGetParam?.requestMethod?.split(","))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
35
src/main/kotlin/top/fatweb/api/util/StrUtil.kt
Normal file
35
src/main/kotlin/top/fatweb/api/util/StrUtil.kt
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
package top.fatweb.api.util
|
||||||
|
|
||||||
|
import java.util.regex.Pattern
|
||||||
|
|
||||||
|
object StrUtil {
|
||||||
|
fun upperToUnderLetter(str: String?): String {
|
||||||
|
str ?: let { return "" }
|
||||||
|
|
||||||
|
val matcher = Pattern.compile("([A-Z])").matcher(str)
|
||||||
|
val stringBuilder = StringBuilder()
|
||||||
|
|
||||||
|
while (matcher.find()) {
|
||||||
|
matcher.appendReplacement(stringBuilder, "_" + matcher.group().lowercase())
|
||||||
|
}
|
||||||
|
|
||||||
|
matcher.appendTail(stringBuilder)
|
||||||
|
|
||||||
|
return stringBuilder.toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun underToUpperLetter(str: String?): String {
|
||||||
|
str ?: let { return "" }
|
||||||
|
|
||||||
|
val matcher = Pattern.compile("(_)([a-z])").matcher(str)
|
||||||
|
val stringBuilder = StringBuilder()
|
||||||
|
|
||||||
|
while (matcher.find()) {
|
||||||
|
matcher.appendReplacement(stringBuilder, matcher.group().replace("_", "").uppercase())
|
||||||
|
}
|
||||||
|
|
||||||
|
matcher.appendTail(stringBuilder)
|
||||||
|
|
||||||
|
return stringBuilder.toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,25 +2,34 @@
|
|||||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
<mapper namespace="top.fatweb.api.mapper.system.SysLogMapper">
|
<mapper namespace="top.fatweb.api.mapper.system.SysLogMapper">
|
||||||
<select id="selectPage" resultMap="sysLogMap">
|
<select id="selectPage" resultMap="sysLogMap">
|
||||||
select t_sys_log.id as sys_log_id,
|
select t_sys_log.id as sys_log_id,
|
||||||
t_sys_log.log_type as sys_log_log_type,
|
t_sys_log.log_type as sys_log_log_type,
|
||||||
t_sys_log.operate_user_id as sys_log_operate_user_id,
|
t_sys_log.operate_user_id as sys_log_operate_user_id,
|
||||||
t_sys_log.operate_time as sys_log_operate_time,
|
t_sys_log.operate_time as sys_log_operate_time,
|
||||||
t_sys_log.request_uri as sys_log_request_uri,
|
t_sys_log.request_uri as sys_log_request_uri,
|
||||||
t_sys_log.request_method as sys_log_request_method,
|
t_sys_log.request_method as sys_log_request_method,
|
||||||
t_sys_log.request_params as sys_log_request_params,
|
t_sys_log.request_params as sys_log_request_params,
|
||||||
t_sys_log.request_ip as sys_log_request_ip,
|
t_sys_log.request_ip as sys_log_request_ip,
|
||||||
t_sys_log.request_server_address as sys_log_request_server_address,
|
t_sys_log.request_server_address as sys_log_request_server_address,
|
||||||
t_sys_log.exception as sys_log_exception,
|
t_sys_log.exception as sys_log_exception,
|
||||||
t_sys_log.exception_info as sys_log_exception_info,
|
t_sys_log.exception_info as sys_log_exception_info,
|
||||||
t_sys_log.start_time as sys_log_start_time,
|
t_sys_log.start_time as sys_log_start_time,
|
||||||
t_sys_log.end_time as sys_log_end_time,
|
t_sys_log.end_time as sys_log_end_time,
|
||||||
t_sys_log.execute_time as sys_log_execute_time,
|
t_sys_log.execute_time as sys_log_execute_time,
|
||||||
t_sys_log.user_agent as sys_log_user_agent,
|
t_sys_log.user_agent as sys_log_user_agent,
|
||||||
t_user.username as sys_log_operate_username
|
t_user.username as sys_log_operate_username
|
||||||
from t_sys_log
|
from t_sys_log
|
||||||
left join t_user on t_user.id = t_sys_log.operate_user_id
|
left join t_user on t_user.id = t_sys_log.operate_user_id
|
||||||
order by create_time desc
|
<where>
|
||||||
|
<foreach collection="logType" item="item" index="index" open="and t_sys_log.log_type in (" separator=","
|
||||||
|
close=")" nullable="true">
|
||||||
|
#{item}
|
||||||
|
</foreach>
|
||||||
|
<foreach collection="requestMethod" item="item" index="index" open="and t_sys_log.request_method in ("
|
||||||
|
separator="," close=")" nullable="true">
|
||||||
|
#{item}
|
||||||
|
</foreach>
|
||||||
|
</where>
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<resultMap id="sysLogMap" type="sysLog">
|
<resultMap id="sysLogMap" type="sysLog">
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import org.springframework.test.context.junit.jupiter.SpringExtension
|
|||||||
import top.fatweb.api.properties.SecurityProperties
|
import top.fatweb.api.properties.SecurityProperties
|
||||||
import top.fatweb.api.util.ByteUtil
|
import top.fatweb.api.util.ByteUtil
|
||||||
import top.fatweb.api.util.JwtUtil
|
import top.fatweb.api.util.JwtUtil
|
||||||
|
import top.fatweb.api.util.StrUtil
|
||||||
import kotlin.io.encoding.Base64
|
import kotlin.io.encoding.Base64
|
||||||
import kotlin.io.encoding.ExperimentalEncodingApi
|
import kotlin.io.encoding.ExperimentalEncodingApi
|
||||||
|
|
||||||
@@ -51,4 +52,14 @@ class FatWebApiApplicationTests {
|
|||||||
val bytes = avatar.createAsPngBytes(1232132134543L)
|
val bytes = avatar.createAsPngBytes(1232132134543L)
|
||||||
logger.info(Base64.encode(bytes))
|
logger.info(Base64.encode(bytes))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun upperToUnderLetterTest() {
|
||||||
|
assertEquals("create_time", StrUtil.upperToUnderLetter("createTime"))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun underToUpperLetterTest() {
|
||||||
|
assertEquals("createTime", StrUtil.underToUpperLetter("create_time"))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user