From d8debf548151c158b5a323ca7a948787a7491f2e Mon Sep 17 00:00:00 2001 From: Charles7c Date: Wed, 18 Jan 2023 23:46:50 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E7=9B=91=E6=8E=A7/=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E5=8A=9F=E8=83=BD=EF=BC=8C=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E8=A1=A8=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +- .../monitor/interceptor/LogInterceptor.java | 4 +- .../cnadmin/monitor/model/entity/SysLog.java | 4 +- .../monitor/model/query/SystemLogQuery.java | 52 +++ .../monitor/model/vo/SystemLogDetailVO.java | 121 +++++ .../cnadmin/monitor/model/vo/SystemLogVO.java | 109 +++++ .../cnadmin/monitor/service/LogService.java | 23 + .../monitor/service/impl/LogServiceImpl.java | 39 +- continew-admin-ui/package.json | 1 + .../src/api/monitor/system-log.ts | 59 +++ continew-admin-ui/src/locale/en-US.ts | 6 +- continew-admin-ui/src/locale/zh-CN.ts | 6 +- .../src/router/routes/modules/monitor.ts | 18 +- .../src/views/monitor/log/login/index.vue | 3 - .../src/views/monitor/log/system/index.vue | 417 ++++++++++++++++++ .../views/monitor/log/system/locale/en-US.ts | 3 + .../views/monitor/log/system/locale/zh-CN.ts | 3 + continew-admin-ui/yarn.lock | 5 + .../monitor/SystemLogController.java | 67 +++ .../changelog/v0.0.1/continew-admin_table.sql | 4 +- 20 files changed, 926 insertions(+), 22 deletions(-) create mode 100644 continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/model/query/SystemLogQuery.java create mode 100644 continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/model/vo/SystemLogDetailVO.java create mode 100644 continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/model/vo/SystemLogVO.java create mode 100644 continew-admin-ui/src/api/monitor/system-log.ts create mode 100644 continew-admin-ui/src/views/monitor/log/system/index.vue create mode 100644 continew-admin-ui/src/views/monitor/log/system/locale/en-US.ts create mode 100644 continew-admin-ui/src/views/monitor/log/system/locale/zh-CN.ts create mode 100644 continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/monitor/SystemLogController.java diff --git a/README.md b/README.md index f32bc97b..a929c809 100644 --- a/README.md +++ b/README.md @@ -252,7 +252,9 @@ continew-admin │ │ ├─ login # 登录模块 │ │ ├─ monitor # 系统监控模块 │ │ │ └─ log # 日志管理 - │ │ │ └─ operation # 操作日志 + │ │ │ ├─ login # 登录日志 + │ │ │ ├─ operation # 操作日志 + │ │ │ └─ system # 系统日志 │ │ └─ system # 系统管理模块 │ │ └─ user # 用户模块 │ │ └─ center # 个人中心 diff --git a/continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/interceptor/LogInterceptor.java b/continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/interceptor/LogInterceptor.java index 250629a0..262c0ae3 100644 --- a/continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/interceptor/LogInterceptor.java +++ b/continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/interceptor/LogInterceptor.java @@ -175,7 +175,7 @@ public class LogInterceptor implements HandlerInterceptor { sysLog.setRequestUrl(StrUtil.isBlank(request.getQueryString()) ? request.getRequestURL().toString() : request.getRequestURL().append("?").append(request.getQueryString()).toString()); sysLog.setRequestMethod(request.getMethod()); - sysLog.setRequestHeader(this.desensitize(ServletUtil.getHeaderMap(request))); + sysLog.setRequestHeaders(this.desensitize(ServletUtil.getHeaderMap(request))); String requestBody = this.getRequestBody(request); if (StrUtil.isNotBlank(requestBody)) { sysLog.setRequestBody(this.desensitize( @@ -198,7 +198,7 @@ public class LogInterceptor implements HandlerInterceptor { private void logResponse(SysLog sysLog, HttpServletResponse response) { int status = response.getStatus(); sysLog.setStatusCode(status); - sysLog.setResponseHeader(this.desensitize(ServletUtil.getHeadersMap(response))); + sysLog.setResponseHeaders(this.desensitize(ServletUtil.getHeadersMap(response))); // 响应体(不记录非 JSON 响应数据) String responseBody = this.getResponseBody(response); if (StrUtil.isNotBlank(responseBody) && JSONUtil.isTypeJSON(responseBody)) { diff --git a/continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/model/entity/SysLog.java b/continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/model/entity/SysLog.java index a1c62c02..022d48df 100644 --- a/continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/model/entity/SysLog.java +++ b/continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/model/entity/SysLog.java @@ -62,7 +62,7 @@ public class SysLog implements Serializable { /** * 请求头 */ - private String requestHeader; + private String requestHeaders; /** * 请求体 @@ -77,7 +77,7 @@ public class SysLog implements Serializable { /** * 响应头 */ - private String responseHeader; + private String responseHeaders; /** * 响应体 diff --git a/continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/model/query/SystemLogQuery.java b/continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/model/query/SystemLogQuery.java new file mode 100644 index 00000000..a14da704 --- /dev/null +++ b/continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/model/query/SystemLogQuery.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package top.charles7c.cnadmin.monitor.model.query; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +import lombok.Data; + +import io.swagger.v3.oas.annotations.media.Schema; + +import org.springdoc.api.annotations.ParameterObject; +import org.springframework.format.annotation.DateTimeFormat; + +import top.charles7c.cnadmin.common.annotation.Query; + +/** + * 系统日志查询条件 + * + * @author Charles7c + * @since 2023/1/17 23:31 + */ +@Data +@ParameterObject +@Schema(description = "系统日志查询条件") +public class SystemLogQuery implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 创建时间 + */ + @Schema(description = "创建时间") + @Query(type = Query.Type.BETWEEN) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private List createTime; +} diff --git a/continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/model/vo/SystemLogDetailVO.java b/continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/model/vo/SystemLogDetailVO.java new file mode 100644 index 00000000..7164828b --- /dev/null +++ b/continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/model/vo/SystemLogDetailVO.java @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package top.charles7c.cnadmin.monitor.model.vo; + +import java.io.Serializable; +import java.time.LocalDateTime; + +import lombok.Data; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * 系统日志详情信息 + * + * @author Charles7c + * @since 2023/1/18 20:19 + */ +@Data +@Schema(description = "系统日志详情信息") +public class SystemLogDetailVO extends LogVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 日志ID + */ + @Schema(description = "日志ID") + private Long logId; + + /** + * 日志描述 + */ + @Schema(description = "日志描述") + private String description; + + /** + * 请求URL + */ + @Schema(description = "请求URL") + private String requestUrl; + + /** + * 请求方式 + */ + @Schema(description = "请求方式") + private String requestMethod; + + /** + * 请求头 + */ + @Schema(description = "请求头") + private String requestHeaders; + + /** + * 请求体 + */ + @Schema(description = "请求体") + private String requestBody; + + /** + * 状态码 + */ + @Schema(description = "状态码") + private Integer statusCode; + + /** + * 响应头 + */ + @Schema(description = "响应头") + private String responseHeaders; + + /** + * 响应体 + */ + @Schema(description = "响应体") + private String responseBody; + + /** + * 请求耗时(ms) + */ + @Schema(description = "请求耗时(ms)") + private Long elapsedTime; + + /** + * 客户端IP + */ + @Schema(description = "客户端IP") + private String clientIp; + + /** + * IP归属地 + */ + @Schema(description = "IP归属地") + private String location; + + /** + * 浏览器 + */ + @Schema(description = "浏览器") + private String browser; + + /** + * 创建时间 + */ + @Schema(description = "创建时间") + private LocalDateTime createTime; +} diff --git a/continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/model/vo/SystemLogVO.java b/continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/model/vo/SystemLogVO.java new file mode 100644 index 00000000..5df0b05e --- /dev/null +++ b/continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/model/vo/SystemLogVO.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package top.charles7c.cnadmin.monitor.model.vo; + +import java.io.Serializable; +import java.time.LocalDateTime; + +import lombok.Data; + +import io.swagger.v3.oas.annotations.media.Schema; + +/** + * 系统日志信息 + * + * @author Charles7c + * @since 2023/1/17 23:29 + */ +@Data +@Schema(description = "系统日志信息") +public class SystemLogVO extends LogVO implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 日志ID + */ + @Schema(description = "日志ID") + private Long logId; + + /** + * 日志描述 + */ + @Schema(description = "日志描述") + private String description; + + /** + * 状态码 + */ + @Schema(description = "状态码") + private Integer statusCode; + + /** + * 请求方式 + */ + @Schema(description = "请求方式") + private String requestMethod; + + /** + * 请求URL + */ + @Schema(description = "请求URL") + private String requestUrl; + + /** + * 请求耗时(ms) + */ + @Schema(description = "请求耗时(ms)") + private Long elapsedTime; + + /** + * 客户端IP + */ + @Schema(description = "客户端IP") + private String clientIp; + + /** + * IP归属地 + */ + @Schema(description = "IP归属地") + private String location; + + /** + * 浏览器 + */ + @Schema(description = "浏览器") + private String browser; + + /** + * 错误信息 + */ + @Schema(description = "错误信息") + private String errorMsg; + + /** + * 异常详情 + */ + @Schema(description = "异常详情") + private String exceptionDetail; + + /** + * 创建时间 + */ + @Schema(description = "创建时间") + private LocalDateTime createTime; +} diff --git a/continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/service/LogService.java b/continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/service/LogService.java index 02638e55..7d0bf7df 100644 --- a/continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/service/LogService.java +++ b/continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/service/LogService.java @@ -20,8 +20,11 @@ import top.charles7c.cnadmin.common.model.query.PageQuery; import top.charles7c.cnadmin.common.model.vo.PageInfo; import top.charles7c.cnadmin.monitor.model.query.LoginLogQuery; import top.charles7c.cnadmin.monitor.model.query.OperationLogQuery; +import top.charles7c.cnadmin.monitor.model.query.SystemLogQuery; import top.charles7c.cnadmin.monitor.model.vo.LoginLogVO; import top.charles7c.cnadmin.monitor.model.vo.OperationLogVO; +import top.charles7c.cnadmin.monitor.model.vo.SystemLogDetailVO; +import top.charles7c.cnadmin.monitor.model.vo.SystemLogVO; /** * 系统日志业务接口 @@ -52,4 +55,24 @@ public interface LogService { * @return 登录日志分页信息 */ PageInfo list(LoginLogQuery query, PageQuery pageQuery); + + /** + * 分页查询系统日志列表 + * + * @param query + * 查询条件 + * @param pageQuery + * 分页查询条件 + * @return 系统日志分页信息 + */ + PageInfo list(SystemLogQuery query, PageQuery pageQuery); + + /** + * 查看系统日志详情 + * + * @param logId + * 日志ID + * @return 系统日志详情 + */ + SystemLogDetailVO detail(Long logId); } diff --git a/continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/service/impl/LogServiceImpl.java b/continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/service/impl/LogServiceImpl.java index 936018b5..b25c5ebd 100644 --- a/continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/service/impl/LogServiceImpl.java +++ b/continew-admin-monitor/src/main/java/top/charles7c/cnadmin/monitor/service/impl/LogServiceImpl.java @@ -30,6 +30,7 @@ import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.StrUtil; import top.charles7c.cnadmin.common.model.query.PageQuery; @@ -37,13 +38,13 @@ import top.charles7c.cnadmin.common.model.vo.PageInfo; import top.charles7c.cnadmin.common.util.ExceptionUtils; import top.charles7c.cnadmin.common.util.ReflectUtils; import top.charles7c.cnadmin.common.util.helper.QueryHelper; +import top.charles7c.cnadmin.common.util.validate.ValidationUtils; import top.charles7c.cnadmin.monitor.mapper.LogMapper; import top.charles7c.cnadmin.monitor.model.entity.SysLog; import top.charles7c.cnadmin.monitor.model.query.LoginLogQuery; import top.charles7c.cnadmin.monitor.model.query.OperationLogQuery; -import top.charles7c.cnadmin.monitor.model.vo.LogVO; -import top.charles7c.cnadmin.monitor.model.vo.LoginLogVO; -import top.charles7c.cnadmin.monitor.model.vo.OperationLogVO; +import top.charles7c.cnadmin.monitor.model.query.SystemLogQuery; +import top.charles7c.cnadmin.monitor.model.vo.*; import top.charles7c.cnadmin.monitor.service.LogService; import top.charles7c.cnadmin.system.service.UserService; @@ -94,7 +95,8 @@ public class LogServiceImpl implements LogService { @Override public PageInfo list(LoginLogQuery query, PageQuery pageQuery) { QueryWrapper queryWrapper = QueryHelper.build(query); - queryWrapper.and(qw -> qw.like("request_url", "/auth/login").or().like("request_url", "/auth/logout")); + queryWrapper.lambda() + .and(qw -> qw.like(SysLog::getRequestUrl, "/auth/login").or().like(SysLog::getRequestUrl, "/auth/logout")); // 限定查询信息 String[] fieldsName = ReflectUtils.getNonStaticFieldsName(LoginLogVO.class); @@ -111,6 +113,35 @@ public class LogServiceImpl implements LogService { return pageInfo; } + @Override + public PageInfo list(SystemLogQuery query, PageQuery pageQuery) { + QueryWrapper queryWrapper = QueryHelper.build(query); + + // 限定查询信息 + String[] fieldsName = ReflectUtils.getNonStaticFieldsName(SystemLogVO.class); + List columns = Arrays.stream(fieldsName).map(StrUtil::toUnderlineCase) + .filter(n -> !n.endsWith("string")).collect(Collectors.toList()); + queryWrapper.select(columns); + + // 分页查询 + IPage page = logMapper.selectPage(pageQuery.toPage(), queryWrapper); + PageInfo pageInfo = PageInfo.build(page, SystemLogVO.class); + + // 填充数据 + pageInfo.getList().forEach(this::fill); + return pageInfo; + } + + @Override + public SystemLogDetailVO detail(Long logId) { + SysLog sysLog = logMapper.selectById(logId); + ValidationUtils.exIfNull(sysLog, String.format("ID为 [%s] 的日志已不存在", logId)); + + SystemLogDetailVO detailVO = BeanUtil.copyProperties(sysLog, SystemLogDetailVO.class); + this.fill(detailVO); + return detailVO; + } + /** * 填充数据 * diff --git a/continew-admin-ui/package.json b/continew-admin-ui/package.json index 76dec468..771c2654 100644 --- a/continew-admin-ui/package.json +++ b/continew-admin-ui/package.json @@ -46,6 +46,7 @@ "vue": "^3.2.45", "vue-echarts": "^6.3.3", "vue-i18n": "^9.2.2", + "vue-json-pretty": "^2.2.3", "vue-router": "^4.1.6" }, "devDependencies": { diff --git a/continew-admin-ui/src/api/monitor/system-log.ts b/continew-admin-ui/src/api/monitor/system-log.ts new file mode 100644 index 00000000..69ae9aa2 --- /dev/null +++ b/continew-admin-ui/src/api/monitor/system-log.ts @@ -0,0 +1,59 @@ +import axios from 'axios'; +import qs from 'query-string'; + +export interface SystemLogRecord { + logId: string; + statusCode: number; + requestMethod: string; + requestUrl: string; + elapsedTime: number; + clientIp: string; + location: string; + browser: string; + errorMsg: string; + exceptionDetail?: string; + createUserString: string; + createTime: string; +} + +export interface SystemLogParams extends Partial { + page: number; + size: number; + sort: Array; +} + +export interface SystemLogListRes { + list: SystemLogRecord[]; + total: number; +} + +export function querySystemLogList(params: SystemLogParams) { + return axios.get('/monitor/log/system', { + params, + paramsSerializer: (obj) => { + return qs.stringify(obj); + }, + }); +} + +export interface SystemLogDetailRecord { + logId: string; + description: string; + requestUrl: string; + requestMethod: string; + requestHeaders: string; + requestBody: string; + statusCode: number; + responseHeaders: string; + responseBody: string; + elapsedTime: number; + clientIp: string; + location: string; + browser: string; + createUserString: string; + createTime: string; +} + +export function querySystemLogDetail(logId: string) { + return axios.get(`/monitor/log/system/${logId}`); +} \ No newline at end of file diff --git a/continew-admin-ui/src/locale/en-US.ts b/continew-admin-ui/src/locale/en-US.ts index cd2ee1cf..2491c3ce 100644 --- a/continew-admin-ui/src/locale/en-US.ts +++ b/continew-admin-ui/src/locale/en-US.ts @@ -8,8 +8,9 @@ import localeMonitor from '@/views/dashboard/monitor/locale/en-US'; import localeDataAnalysis from '@/views/visualization/data-analysis/locale/en-US'; import localeMultiDAnalysis from '@/views/visualization/multi-dimension-data-analysis/locale/en-US'; -import localeOperationLog from '@/views/monitor/log/operation/locale/en-US'; import localeLoginLog from '@/views/monitor/log/login/locale/en-US'; +import localeOperationLog from '@/views/monitor/log/operation/locale/en-US'; +import localeSystemLog from '@/views/monitor/log/system/locale/en-US'; import localeSearchTable from '@/views/list/search-table/locale/en-US'; import localeCardList from '@/views/list/card/locale/en-US'; @@ -56,8 +57,9 @@ export default { ...localeDataAnalysis, ...localeMultiDAnalysis, - ...localeOperationLog, ...localeLoginLog, + ...localeOperationLog, + ...localeSystemLog, ...localeSearchTable, ...localeCardList, diff --git a/continew-admin-ui/src/locale/zh-CN.ts b/continew-admin-ui/src/locale/zh-CN.ts index baad96d6..27fce54a 100644 --- a/continew-admin-ui/src/locale/zh-CN.ts +++ b/continew-admin-ui/src/locale/zh-CN.ts @@ -8,8 +8,9 @@ import localeMonitor from '@/views/dashboard/monitor/locale/zh-CN'; import localeDataAnalysis from '@/views/visualization/data-analysis/locale/zh-CN'; import localeMultiDAnalysis from '@/views/visualization/multi-dimension-data-analysis/locale/zh-CN'; -import localeOperationLog from '@/views/monitor/log/operation/locale/zh-CN'; import localeLoginLog from '@/views/monitor/log/login/locale/zh-CN'; +import localeOperationLog from '@/views/monitor/log/operation/locale/zh-CN'; +import localeSystemLog from '@/views/monitor/log/system/locale/zh-CN'; import localeSearchTable from '@/views/list/search-table/locale/zh-CN'; import localeCardList from '@/views/list/card/locale/zh-CN'; @@ -56,8 +57,9 @@ export default { ...localeDataAnalysis, ...localeMultiDAnalysis, - ...localeOperationLog, ...localeLoginLog, + ...localeOperationLog, + ...localeSystemLog, ...localeSearchTable, ...localeCardList, diff --git a/continew-admin-ui/src/router/routes/modules/monitor.ts b/continew-admin-ui/src/router/routes/modules/monitor.ts index 186ed436..9ad616ff 100644 --- a/continew-admin-ui/src/router/routes/modules/monitor.ts +++ b/continew-admin-ui/src/router/routes/modules/monitor.ts @@ -12,6 +12,16 @@ const Monitor: AppRouteRecordRaw = { order: 2, }, children: [ + { + path: 'log/login', + name: 'LoginLog', + component: () => import('@/views/monitor/log/login/index.vue'), + meta: { + locale: 'menu.log.login.list', + requiresAuth: true, + roles: ['*'], + }, + }, { path: 'log/operation', name: 'OperationLog', @@ -23,11 +33,11 @@ const Monitor: AppRouteRecordRaw = { }, }, { - path: 'log/login', - name: 'LoginLog', - component: () => import('@/views/monitor/log/login/index.vue'), + path: 'log/system', + name: 'SystemLog', + component: () => import('@/views/monitor/log/system/index.vue'), meta: { - locale: 'menu.log.login.list', + locale: 'menu.log.system.list', requiresAuth: true, roles: ['*'], }, diff --git a/continew-admin-ui/src/views/monitor/log/login/index.vue b/continew-admin-ui/src/views/monitor/log/login/index.vue index 8b4bb1ae..9f5f6546 100644 --- a/continew-admin-ui/src/views/monitor/log/login/index.vue +++ b/continew-admin-ui/src/views/monitor/log/login/index.vue @@ -77,9 +77,6 @@ - diff --git a/continew-admin-ui/src/views/monitor/log/system/index.vue b/continew-admin-ui/src/views/monitor/log/system/index.vue new file mode 100644 index 00000000..534e1fa8 --- /dev/null +++ b/continew-admin-ui/src/views/monitor/log/system/index.vue @@ -0,0 +1,417 @@ + + + + + + + diff --git a/continew-admin-ui/src/views/monitor/log/system/locale/en-US.ts b/continew-admin-ui/src/views/monitor/log/system/locale/en-US.ts new file mode 100644 index 00000000..f6b1a4fd --- /dev/null +++ b/continew-admin-ui/src/views/monitor/log/system/locale/en-US.ts @@ -0,0 +1,3 @@ +export default { + 'menu.log.system.list': 'System log', +}; diff --git a/continew-admin-ui/src/views/monitor/log/system/locale/zh-CN.ts b/continew-admin-ui/src/views/monitor/log/system/locale/zh-CN.ts new file mode 100644 index 00000000..6d88a88b --- /dev/null +++ b/continew-admin-ui/src/views/monitor/log/system/locale/zh-CN.ts @@ -0,0 +1,3 @@ +export default { + 'menu.log.system.list': '系统日志', +}; diff --git a/continew-admin-ui/yarn.lock b/continew-admin-ui/yarn.lock index c6ef3d83..aa7ac90d 100644 --- a/continew-admin-ui/yarn.lock +++ b/continew-admin-ui/yarn.lock @@ -8117,6 +8117,11 @@ vue-i18n@^9.2.2: "@intlify/vue-devtools" "9.2.2" "@vue/devtools-api" "^6.2.1" +vue-json-pretty@^2.2.3: + version "2.2.3" + resolved "https://registry.npmmirror.com/vue-json-pretty/-/vue-json-pretty-2.2.3.tgz#7cf5c5af464ed5600c1883b6310aa848a8840a4d" + integrity sha512-tJo+4eFclQBt3gJ6EELXNdvo50wDKTZYthwmLpy9YS7UDldeJln5ff+IpdmUglfk+FqLVOX/re0+Ni/EOUPZgw== + vue-router@^4.1.6: version "4.1.6" resolved "https://registry.npmmirror.com/vue-router/-/vue-router-4.1.6.tgz#b70303737e12b4814578d21d68d21618469375a1" diff --git a/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/monitor/SystemLogController.java b/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/monitor/SystemLogController.java new file mode 100644 index 00000000..f97cc726 --- /dev/null +++ b/continew-admin-webapi/src/main/java/top/charles7c/cnadmin/webapi/controller/monitor/SystemLogController.java @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package top.charles7c.cnadmin.webapi.controller.monitor; + +import lombok.RequiredArgsConstructor; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; + +import org.springframework.http.MediaType; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import top.charles7c.cnadmin.common.model.query.PageQuery; +import top.charles7c.cnadmin.common.model.vo.PageInfo; +import top.charles7c.cnadmin.common.model.vo.R; +import top.charles7c.cnadmin.monitor.model.query.SystemLogQuery; +import top.charles7c.cnadmin.monitor.model.vo.SystemLogDetailVO; +import top.charles7c.cnadmin.monitor.model.vo.SystemLogVO; +import top.charles7c.cnadmin.monitor.service.LogService; + +/** + * 系统日志 API + * + * @author Charles7c + * @since 2023/1/17 23:27 + */ +@Tag(name = "操作日志 API") +@Validated +@RestController +@RequiredArgsConstructor +@RequestMapping(value = "/monitor/log/system", produces = MediaType.APPLICATION_JSON_VALUE) +public class SystemLogController { + + private final LogService logService; + + @Operation(summary = "分页查询系统日志列表") + @GetMapping + public R> list(@Validated SystemLogQuery query, @Validated PageQuery pageQuery) { + PageInfo pageInfo = logService.list(query, pageQuery); + return R.ok(pageInfo); + } + + @Operation(summary = "系统日志列表") + @GetMapping("/{logId}") + public R detail(@PathVariable Long logId) { + SystemLogDetailVO detailVO = logService.detail(logId); + return R.ok(detailVO); + } +} diff --git a/continew-admin-webapi/src/main/resources/db/changelog/v0.0.1/continew-admin_table.sql b/continew-admin-webapi/src/main/resources/db/changelog/v0.0.1/continew-admin_table.sql index e7ff8120..522a1e1b 100644 --- a/continew-admin-webapi/src/main/resources/db/changelog/v0.0.1/continew-admin_table.sql +++ b/continew-admin-webapi/src/main/resources/db/changelog/v0.0.1/continew-admin_table.sql @@ -29,10 +29,10 @@ CREATE TABLE IF NOT EXISTS `sys_log` ( `description` varchar(255) DEFAULT NULL COMMENT '日志描述', `request_url` varchar(512) NOT NULL DEFAULT '' COMMENT '请求URL', `request_method` varchar(10) DEFAULT NULL COMMENT '请求方式', - `request_header` text COMMENT '请求头', + `request_headers` text COMMENT '请求头', `request_body` text DEFAULT NULL COMMENT '请求体', `status_code` int(11) unsigned DEFAULT NULL COMMENT '状态码', - `response_header` text DEFAULT NULL COMMENT '响应头', + `response_headers` text DEFAULT NULL COMMENT '响应头', `response_body` mediumtext DEFAULT NULL COMMENT '响应体', `elapsed_time` bigint(20) unsigned DEFAULT NULL COMMENT '请求耗时(ms)', `status` tinyint(1) unsigned DEFAULT 1 COMMENT '操作状态(1成功 2失败)',