访问日志的管理功能的迁移

This commit is contained in:
YunaiV 2020-07-15 20:11:04 +08:00
parent e1e42c0ce0
commit 4ed8d5fcf2
60 changed files with 950 additions and 498 deletions

View File

@ -33,8 +33,11 @@ public class ServiceExceptionUtil {
public interface Enumerable<V extends Enum> {
int getCode();
String getMessage();
int getGroup();
}
/**

View File

@ -48,7 +48,7 @@ public class CommonWebAutoConfiguration implements WebMvcConfigurer {
// ========== 拦截器相关 ==========
@Bean
@ConditionalOnClass(name = {"cn.iocoder.mall.systemservice.rpc.systemlog.SystemLogRPC", "org.apache.dubbo.config.annotation.Reference"})
@ConditionalOnClass(name = {"cn.iocoder.mall.systemservice.rpc.systemlog.SystemExceptionLogRpc", "org.apache.dubbo.config.annotation.Reference"})
@ConditionalOnMissingBean(AccessLogInterceptor.class)
public AccessLogInterceptor accessLogInterceptor() {
return new AccessLogInterceptor();

View File

@ -6,8 +6,8 @@ import cn.iocoder.common.framework.util.ExceptionUtil;
import cn.iocoder.common.framework.util.HttpUtil;
import cn.iocoder.common.framework.util.MallUtils;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.systemservice.rpc.systemlog.SystemLogRPC;
import cn.iocoder.mall.systemservice.rpc.systemlog.dto.ExceptionLogAddDTO;
import cn.iocoder.mall.systemservice.rpc.systemlog.SystemExceptionLogRpc;
import cn.iocoder.mall.systemservice.rpc.systemlog.dto.SystemExceptionLogCreateDTO;
import cn.iocoder.mall.web.core.util.CommonWebUtil;
import com.alibaba.fastjson.JSON;
import org.apache.commons.lang3.exception.ExceptionUtils;
@ -44,8 +44,8 @@ public class GlobalExceptionHandler {
private String applicationName;
// TODO 目前存在一个问题如果未引入 system-rpc-api 依赖GlobalExceptionHandler 会报类不存在未来封装出 Repository 解决该问题
@Reference(validation = "true", version = "${dubbo.consumer.SystemLogRPC.version}")
private SystemLogRPC systemLogRPC;
@Reference(validation = "true", version = "${dubbo.consumer.SystemExceptionLogRpc.version}")
private SystemExceptionLogRpc systemExceptionLogRpc;
// 逻辑异常
@ExceptionHandler(value = ServiceException.class)
@ -76,7 +76,7 @@ public class GlobalExceptionHandler {
public CommonResult exceptionHandler(HttpServletRequest req, Exception e) {
logger.error("[exceptionHandler]", e);
// 插入异常日志
ExceptionLogAddDTO exceptionLog = new ExceptionLogAddDTO();
SystemExceptionLogCreateDTO exceptionLog = new SystemExceptionLogCreateDTO();
try {
// 增加异常计数 metrics TODO 暂时去掉
// EXCEPTION_COUNTER.increment();
@ -91,7 +91,7 @@ public class GlobalExceptionHandler {
return CommonResult.error(SysErrorCodeEnum.SYS_ERROR.getCode(), SysErrorCodeEnum.SYS_ERROR.getMessage());
}
private void initExceptionLog(ExceptionLogAddDTO exceptionLog, HttpServletRequest request, Exception e) {
private void initExceptionLog(SystemExceptionLogCreateDTO exceptionLog, HttpServletRequest request, Exception e) {
// 设置账号编号
exceptionLog.setUserId(CommonWebUtil.getUserId(request));
exceptionLog.setUserType(CommonWebUtil.getUserType(request));
@ -119,9 +119,9 @@ public class GlobalExceptionHandler {
}
@Async
public void addExceptionLog(ExceptionLogAddDTO exceptionLog) {
public void addExceptionLog(SystemExceptionLogCreateDTO exceptionLog) {
try {
systemLogRPC.addExceptionLog(exceptionLog);
systemExceptionLogRpc.createSystemExceptionLog(exceptionLog);
} catch (Throwable th) {
logger.error("[addAccessLog][插入异常日志({}) 发生异常({})", JSON.toJSONString(exceptionLog), ExceptionUtils.getRootCauseMessage(th));
}

View File

@ -3,8 +3,8 @@ package cn.iocoder.mall.web.core.interceptor;
import cn.iocoder.common.framework.util.HttpUtil;
import cn.iocoder.common.framework.util.MallUtils;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.systemservice.rpc.systemlog.SystemLogRPC;
import cn.iocoder.mall.systemservice.rpc.systemlog.dto.AccessLogAddDTO;
import cn.iocoder.mall.systemservice.rpc.systemlog.SystemAccessLogRpc;
import cn.iocoder.mall.systemservice.rpc.systemlog.dto.SystemAccessLogCreateDTO;
import cn.iocoder.mall.web.core.util.CommonWebUtil;
import com.alibaba.fastjson.JSON;
import org.apache.commons.lang3.exception.ExceptionUtils;
@ -26,8 +26,8 @@ public class AccessLogInterceptor extends HandlerInterceptorAdapter {
private Logger logger = LoggerFactory.getLogger(getClass());
@Reference(validation = "false", version = "${dubbo.consumer.SystemLogRPC.version}")
private SystemLogRPC systemLogRPC;
@Reference(validation = "false", version = "${dubbo.consumer.SystemAccessLogRpc.version}")
private SystemAccessLogRpc systemAccessLogRpc;
@Value("${spring.application.name}")
private String applicationName;
@ -41,7 +41,7 @@ public class AccessLogInterceptor extends HandlerInterceptorAdapter {
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
AccessLogAddDTO accessLog = new AccessLogAddDTO();
SystemAccessLogCreateDTO accessLog = new SystemAccessLogCreateDTO();
try {
// 初始化 accessLog
initAccessLog(accessLog, request);
@ -53,7 +53,7 @@ public class AccessLogInterceptor extends HandlerInterceptorAdapter {
}
}
private void initAccessLog(AccessLogAddDTO accessLog, HttpServletRequest request) {
private void initAccessLog(SystemAccessLogCreateDTO accessLog, HttpServletRequest request) {
// 设置账号编号
accessLog.setUserId(CommonWebUtil.getUserId(request));
accessLog.setUserType(CommonWebUtil.getUserType(request));
@ -78,9 +78,9 @@ public class AccessLogInterceptor extends HandlerInterceptorAdapter {
}
@Async // 异步入库
public void addAccessLog(AccessLogAddDTO accessLog) {
public void addAccessLog(SystemAccessLogCreateDTO accessLog) {
try {
systemLogRPC.addAccessLog(accessLog);
systemAccessLogRpc.createSystemAccessLog(accessLog);
} catch (Throwable th) {
logger.error("[addAccessLog][插入访问日志({}) 发生异常({})", JSON.toJSONString(accessLog), ExceptionUtils.getRootCauseMessage(th));
}

View File

View File

@ -0,0 +1,227 @@
/*
Navicat Premium Data Transfer
Source Server : onemall-huawei
Source Server Type : MySQL
Source Server Version : 50730
Source Host : 400-infra.server.iocoder.cn:3306
Source Schema : mall_system
Target Server Type : MySQL
Target Server Version : 50730
File Encoding : 65001
Date: 15/07/2020 20:59:37
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for admin
-- ----------------------------
DROP TABLE IF EXISTS `admin`;
CREATE TABLE `admin` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '管理员编号',
`name` varchar(10) NOT NULL COMMENT '真实名字',
`avatar` varchar(255) DEFAULT NULL COMMENT '头像',
`department_id` int(11) DEFAULT NULL COMMENT '部门id',
`status` tinyint(4) NOT NULL COMMENT '在职状态',
`username` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '登陆账号',
`password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '加密后的密码',
`password_salt` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '密码的盐',
`create_admin_id` int(11) NOT NULL COMMENT '创建管理员编号',
`create_ip` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '创建 IP',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE KEY `uk_username` (`username`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=34 DEFAULT CHARSET=utf8mb4 COMMENT='管理员';
-- ----------------------------
-- Table structure for admin_department
-- ----------------------------
DROP TABLE IF EXISTS `admin_department`;
CREATE TABLE `admin_department` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '部门编号',
`name` varchar(100) COLLATE utf8mb4_bin NOT NULL COMMENT '部门名称',
`sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序字段',
`pid` int(11) NOT NULL DEFAULT '0' COMMENT '父级部门编号',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '删除标记',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='部门';
-- ----------------------------
-- Table structure for oauth2_access_token
-- ----------------------------
DROP TABLE IF EXISTS `oauth2_access_token`;
CREATE TABLE `oauth2_access_token` (
`id` varchar(32) NOT NULL COMMENT '访问令牌',
`user_id` int(11) NOT NULL COMMENT '用户编号',
`user_type` tinyint(4) NOT NULL COMMENT '用户类型',
`refresh_token` varchar(32) NOT NULL COMMENT '刷新令牌',
`expires_time` datetime NOT NULL COMMENT '过期时间',
`create_ip` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '创建 IP',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`) USING BTREE,
KEY `idx_userId` (`user_id`) USING BTREE,
KEY `idx_refreshToken` (`refresh_token`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='访问令牌';
-- ----------------------------
-- Table structure for oauth2_refresh_token
-- ----------------------------
DROP TABLE IF EXISTS `oauth2_refresh_token`;
CREATE TABLE `oauth2_refresh_token` (
`id` varchar(32) NOT NULL COMMENT '编号,刷新令牌',
`user_id` int(11) NOT NULL COMMENT '用户编号',
`user_type` tinyint(4) NOT NULL COMMENT '用户类型',
`expires_time` datetime NOT NULL COMMENT '过期时间',
`create_ip` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT '创建 IP',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`) USING BTREE,
KEY `idx_userId` (`user_id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='刷新令牌';
-- ----------------------------
-- Table structure for permission_admin_role
-- ----------------------------
DROP TABLE IF EXISTS `permission_admin_role`;
CREATE TABLE `permission_admin_role` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '编号',
`admin_id` int(11) NOT NULL COMMENT '管理员编号',
`role_id` int(11) NOT NULL COMMENT '角色编号',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=40 DEFAULT CHARSET=utf8mb4 COMMENT='管理员角色';
-- ----------------------------
-- Table structure for permission_resource
-- ----------------------------
DROP TABLE IF EXISTS `permission_resource`;
CREATE TABLE `permission_resource` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '资源编号',
`name` varchar(50) NOT NULL DEFAULT '' COMMENT '菜单名',
`permission` varchar(255) DEFAULT NULL COMMENT '权限标识',
`type` int(11) NOT NULL COMMENT '资源类型',
`sort` int(11) NOT NULL COMMENT '排序',
`pid` int(11) NOT NULL DEFAULT '0' COMMENT '父级资源编号(外键:{@link ResourceDO#id})',
`route` varchar(50) DEFAULT NULL COMMENT '前端路由',
`icon` varchar(50) DEFAULT NULL COMMENT '菜单图标',
`view` varchar(50) DEFAULT NULL COMMENT '前端界面',
`create_admin_id` int(11) NOT NULL COMMENT '创建管理员编号',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=82 DEFAULT CHARSET=utf8mb4 COMMENT='资源';
-- ----------------------------
-- Table structure for permission_role
-- ----------------------------
DROP TABLE IF EXISTS `permission_role`;
CREATE TABLE `permission_role` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '角色编号',
`name` varchar(50) NOT NULL DEFAULT '' COMMENT '角色名',
`code` varchar(50) DEFAULT NULL COMMENT '角色编码',
`type` tinyint(4) NOT NULL COMMENT '角色类型',
`create_admin_id` int(11) NOT NULL COMMENT '创建管理员编号',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4 COMMENT='角色';
-- ----------------------------
-- Table structure for permission_role_resource
-- ----------------------------
DROP TABLE IF EXISTS `permission_role_resource`;
CREATE TABLE `permission_role_resource` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '编号',
`role_id` int(11) NOT NULL DEFAULT '-1' COMMENT '角色编号(外键:{@link RoleDO}',
`resource_id` int(11) NOT NULL DEFAULT '-1' COMMENT '资源编号',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=860 DEFAULT CHARSET=utf8mb4 COMMENT='角色资源';
-- ----------------------------
-- Table structure for system_access_log
-- ----------------------------
DROP TABLE IF EXISTS `system_access_log`;
CREATE TABLE `system_access_log` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '编号',
`user_id` int(11) DEFAULT NULL COMMENT '用户编号',
`user_type` tinyint(4) DEFAULT NULL COMMENT '用户类型',
`trace_id` varchar(64) DEFAULT NULL COMMENT '链路追踪编号',
`application_name` varchar(50) NOT NULL COMMENT '应用名',
`uri` varchar(4096) NOT NULL DEFAULT '' COMMENT '访问地址',
`query_string` varchar(4096) NOT NULL DEFAULT '' COMMENT '参数',
`method` varchar(50) NOT NULL DEFAULT '' COMMENT 'http 方法',
`user_agent` varchar(1024) NOT NULL DEFAULT '' COMMENT 'userAgent',
`ip` varchar(50) NOT NULL DEFAULT '' COMMENT 'ip',
`start_time` datetime NOT NULL COMMENT '请求时间',
`response_time` int(11) NOT NULL COMMENT '响应时长 -- 毫秒级',
`error_code` int(11) NOT NULL COMMENT '错误码',
`error_message` varchar(512) DEFAULT NULL COMMENT '错误提示',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=87141 DEFAULT CHARSET=utf8mb4 COMMENT='系统访问日志';
-- ----------------------------
-- Table structure for system_data_dict
-- ----------------------------
DROP TABLE IF EXISTS `system_data_dict`;
CREATE TABLE `system_data_dict` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '编号',
`enum_value` varchar(50) NOT NULL DEFAULT '' COMMENT '大类枚举值',
`value` varchar(50) NOT NULL DEFAULT '' COMMENT '小类数值',
`display_name` varchar(50) NOT NULL DEFAULT '' COMMENT '展示名',
`sort` int(11) NOT NULL DEFAULT '-1' COMMENT '排序值',
`memo` varchar(50) DEFAULT '' COMMENT '备注',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=67 DEFAULT CHARSET=utf8mb4 COMMENT='数据字典';
-- ----------------------------
-- Table structure for system_exception_log
-- ----------------------------
DROP TABLE IF EXISTS `system_exception_log`;
CREATE TABLE `system_exception_log` (
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '编号',
`user_id` int(11) DEFAULT NULL COMMENT '用户编号',
`user_type` tinyint(4) DEFAULT NULL COMMENT '用户类型',
`trace_id` varchar(64) NOT NULL COMMENT '链路追踪编号\n *\n * 一般来说通过链路追踪编号可以将访问日志错误日志链路追踪日志logger 打印日志等,结合在一起,从而进行排错。',
`application_name` varchar(50) NOT NULL COMMENT '应用名\n *\n * 目前读取 spring.application.name',
`uri` varchar(4096) NOT NULL COMMENT '访问地址',
`query_string` varchar(4096) NOT NULL COMMENT '参数',
`method` varchar(50) NOT NULL COMMENT 'http 方法',
`user_agent` varchar(1024) NOT NULL COMMENT 'userAgent',
`ip` varchar(50) NOT NULL COMMENT 'ip',
`exception_time` datetime NOT NULL COMMENT '异常发生时间',
`exception_name` varchar(128) NOT NULL DEFAULT '' COMMENT '异常名\n *\n * {@link Throwable#getClass()} 的类全名',
`exception_message` text NOT NULL COMMENT '异常导致的消息\n *\n * {@link cn.iocoder.common.framework.util.ExceptionUtil#getMessage(Throwable)}',
`exception_root_cause_message` text NOT NULL COMMENT '异常导致的根消息\n *\n * {@link cn.iocoder.common.framework.util.ExceptionUtil#getRootCauseMessage(Throwable)}',
`exception_stack_trace` text NOT NULL COMMENT '异常的栈轨迹\n *\n * {@link cn.iocoder.common.framework.util.ExceptionUtil#getServiceException(Exception)}',
`exception_class_name` varchar(512) NOT NULL COMMENT '异常发生的类全名\n *\n * {@link StackTraceElement#getClassName()}',
`exception_file_name` varchar(512) NOT NULL COMMENT '异常发生的类文件\n *\n * {@link StackTraceElement#getFileName()}',
`exception_method_name` varchar(512) NOT NULL COMMENT '异常发生的方法名\n *\n * {@link StackTraceElement#getMethodName()}',
`exception_line_number` int(11) NOT NULL COMMENT '异常发生的方法所在行\n *\n * {@link StackTraceElement#getLineNumber()}',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最后更新时间',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1012 DEFAULT CHARSET=utf8mb4 COMMENT='系统异常日志';
SET FOREIGN_KEY_CHECKS = 1;

View File

@ -6,6 +6,7 @@ import cn.iocoder.mall.managementweb.controller.datadict.dto.DataDictUpdateDTO;
import cn.iocoder.mall.managementweb.controller.datadict.vo.DataDictSimpleVO;
import cn.iocoder.mall.managementweb.controller.datadict.vo.DataDictVO;
import cn.iocoder.mall.managementweb.manager.datadict.DataDictManager;
import cn.iocoder.security.annotations.RequiresPermissions;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
@ -22,7 +23,7 @@ import static cn.iocoder.common.framework.vo.CommonResult.success;
* 数据字典 Controller
*/
@RestController
@RequestMapping("/data_dict")
@RequestMapping("/data-dict")
@Api(tags = "数据字典")
@Validated
public class DataDictController {
@ -32,12 +33,14 @@ public class DataDictController {
@PostMapping("/create")
@ApiOperation("创建数据字典")
@RequiresPermissions("system:data-dict:create")
public CommonResult<Integer> createDataDict(@Valid DataDictCreateDTO createDTO) {
return success(dataDictManager.createDataDict(createDTO));
}
@PostMapping("/update")
@ApiOperation("更新数据字典")
@RequiresPermissions("system:data-dict:update")
public CommonResult<Boolean> updateDataDict(@Valid DataDictUpdateDTO updateDTO) {
dataDictManager.updateDataDict(updateDTO);
return success(true);
@ -46,6 +49,7 @@ public class DataDictController {
@PostMapping("/delete")
@ApiOperation("删除数据字典")
@ApiImplicitParam(name = "dataDictId", value = "数据字典编号", required = true)
@RequiresPermissions("system:data-dict:delete")
public CommonResult<Boolean> deleteDataDict(@RequestParam("dataDictId") Integer dataDictId) {
dataDictManager.deleteDataDict(dataDictId);
return success(true);
@ -54,6 +58,7 @@ public class DataDictController {
@GetMapping("/get")
@ApiOperation("获得数据字典")
@ApiImplicitParam(name = "dataDictId", value = "数据字典编号", required = true)
@RequiresPermissions("system:data-dict:list")
public CommonResult<DataDictVO> getDataDict(@RequestParam("dataDictId") Integer dataDictId) {
return success(dataDictManager.getDataDict(dataDictId));
}
@ -61,18 +66,21 @@ public class DataDictController {
@GetMapping("/list")
@ApiOperation("获得数据字典列表")
@ApiImplicitParam(name = "dataDictIds", value = "数据字典编号列表", required = true)
@RequiresPermissions("system:data-dict:list")
public CommonResult<List<DataDictVO>> listDataDicts(@RequestParam("dataDictIds") List<Integer> dataDictIds) {
return success(dataDictManager.listDataDicts(dataDictIds));
}
@GetMapping("/list-all")
@ApiOperation("获得全部数据字典列表")
@RequiresPermissions("system:data-dict:list")
public CommonResult<List<DataDictVO>> listDataDicts() {
return success(dataDictManager.listDataDicts());
}
@GetMapping("/list-all-simple")
@ApiOperation(value = "获得全部数据字典列表", notes = "一般用于管理后台缓存数据字典在本地")
// 无需添加权限认证因为前端全局都需要
public CommonResult<List<DataDictSimpleVO>> listSimpleDataDicts() {
return success(dataDictManager.listSimpleDataDicts());
}

View File

@ -0,0 +1,7 @@
### /system-access-log/page 成功
GET {{baseUrl}}/system-access-log/page?pageNo=1&pageSize=10
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer {{accessToken}}
###

View File

@ -0,0 +1,36 @@
package cn.iocoder.mall.managementweb.controller.systemlog;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.managementweb.controller.systemlog.dto.SystemAccessLogPageDTO;
import cn.iocoder.mall.managementweb.controller.systemlog.vo.SystemAccessLogVO;
import cn.iocoder.mall.managementweb.manager.systemlog.SystemAccessLogManager;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import static cn.iocoder.common.framework.vo.CommonResult.success;
/**
* 系统访问日志 Controller
*/
@RestController
@RequestMapping("/system-access-log")
@Api(tags = "系统访问日志")
@Validated
public class SystemAccessLogController {
@Autowired
private SystemAccessLogManager systemAccessLogManager;
@GetMapping("/page")
@ApiOperation("获得系统访问日志分页")
public CommonResult<PageResult<SystemAccessLogVO>> pageSystemAccessLog(SystemAccessLogPageDTO pageDTO) {
return success(systemAccessLogManager.pageSystemAccessLog(pageDTO));
}
}

View File

@ -0,0 +1,19 @@
package cn.iocoder.mall.managementweb.controller.systemlog.dto;
import cn.iocoder.common.framework.vo.PageParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ApiModel("系统访问日志分页 DTO")
@Data
public class SystemAccessLogPageDTO extends PageParam {
@ApiModelProperty(value = "用户编号")
private Integer userId;
@ApiModelProperty(value = "用户类型")
private Integer userType;
@ApiModelProperty(value = "应用名", required = true)
private String applicationName;
}

View File

@ -0,0 +1,40 @@
package cn.iocoder.mall.managementweb.controller.systemlog.vo;
import lombok.*;
import io.swagger.annotations.*;
import java.util.*;
@ApiModel("系统访问日志 VO")
@Data
public class SystemAccessLogVO {
@ApiModelProperty(value = "编号", required = true)
private Integer id;
@ApiModelProperty(value = "用户编号", example = "1024")
private Integer userId;
@ApiModelProperty(value = "用户类型", example = "1")
private Integer userType;
@ApiModelProperty(value = "链路追踪编号", example = "89aca178-a370-411c-ae02-3f0d672be4ab")
private String traceId;
@ApiModelProperty(value = "应用名", required = true, example = "user-shop-application")
private String applicationName;
@ApiModelProperty(value = "访问地址", required = true, example = "/management-api/system-access-log/page")
private String uri;
@ApiModelProperty(value = "参数", required = true, example = "pageNo=1&pageSize=10")
private String queryString;
@ApiModelProperty(value = "http 方法", required = true, example = "GET")
private String method;
@ApiModelProperty(value = "userAgent", required = true, example = "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0")
private String userAgent;
@ApiModelProperty(value = "ip", required = true, example = "127.0.0.1")
private String ip;
@ApiModelProperty(value = "请求时间", required = true)
private Date startTime;
@ApiModelProperty(value = "响应时长 -- 毫秒级", required = true, example = "1024")
private Integer responseTime;
@ApiModelProperty(value = "错误码", required = true, example = "0")
private Integer errorCode;
@ApiModelProperty(value = "错误提示", example = "你的昵称过长~")
private String errorMessage;
}

View File

@ -0,0 +1,18 @@
package cn.iocoder.mall.managementweb.convert.systemlog;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.managementweb.controller.systemlog.vo.SystemAccessLogVO;
import cn.iocoder.mall.systemservice.rpc.systemlog.vo.SystemAccessLogPageDTO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper
public interface SystemAccessLogConvert {
SystemAccessLogConvert INSTANCE = Mappers.getMapper(SystemAccessLogConvert.class);
SystemAccessLogPageDTO convert(cn.iocoder.mall.managementweb.controller.systemlog.dto.SystemAccessLogPageDTO bean);
PageResult<SystemAccessLogVO> convertPage(PageResult<cn.iocoder.mall.systemservice.rpc.systemlog.vo.SystemAccessLogVO> page);
}

View File

@ -21,7 +21,7 @@ public class DataDictManager {
private static final Comparator<cn.iocoder.mall.systemservice.rpc.datadict.vo.DataDictVO> COMPARATOR_ENUM_VALUE_SORT = (o1, o2) -> {
int cmp = o1.getEnumValue().compareTo(o2.getEnumValue());
if (cmp == 0) {
if (cmp != 0) {
return cmp;
}
return o1.getSort().compareTo(o2.getSort());

View File

@ -0,0 +1,34 @@
package cn.iocoder.mall.managementweb.manager.systemlog;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.managementweb.controller.systemlog.dto.SystemAccessLogPageDTO;
import cn.iocoder.mall.managementweb.controller.systemlog.vo.SystemAccessLogVO;
import cn.iocoder.mall.managementweb.convert.systemlog.SystemAccessLogConvert;
import cn.iocoder.mall.systemservice.rpc.systemlog.SystemAccessLogRpc;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;
/**
* 系统访问日志 Manager
*/
@Service
public class SystemAccessLogManager {
@Reference(version = "${dubbo.consumer.SystemAccessLogRpc.version}", validation = "false")
private SystemAccessLogRpc systemAccessLogRpc;
/**
* 获得系统访问日志分页
*
* @param pageDTO 系统访问日志分页查询
* @return 系统访问日志分页结果
*/
public PageResult<SystemAccessLogVO> pageSystemAccessLog(SystemAccessLogPageDTO pageDTO) {
CommonResult<PageResult<cn.iocoder.mall.systemservice.rpc.systemlog.vo.SystemAccessLogVO>> pageSystemAccessLogResult =
systemAccessLogRpc.pageSystemAccessLog(SystemAccessLogConvert.INSTANCE.convert(pageDTO));
pageSystemAccessLogResult.checkError();
return SystemAccessLogConvert.INSTANCE.convertPage(pageSystemAccessLogResult.getData());
}
}

View File

@ -28,8 +28,6 @@ dubbo:
version: 1.0.0
AdminRpc:
version: 1.0.0
SystemLogRPC:
version: 1.0.0
ResourceRpc:
version: 1.0.0
RoleRpc:
@ -40,6 +38,10 @@ dubbo:
version: 1.0.0
DataDictRpc:
version: 1.0.0
SystemAccessLogRpc:
version: 1.0.0
SystemExceptionLogRpc:
version: 1.0.0
# Swagger 配置项
swagger:

View File

@ -0,0 +1,30 @@
package cn.iocoder.mall.systemservice.rpc.systemlog;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.systemservice.rpc.systemlog.dto.SystemAccessLogCreateDTO;
import cn.iocoder.mall.systemservice.rpc.systemlog.vo.SystemAccessLogPageDTO;
import cn.iocoder.mall.systemservice.rpc.systemlog.vo.SystemAccessLogVO;
/**
* 系统访问日志 Rpc 接口
*/
public interface SystemAccessLogRpc {
/**
* 创建系统访问日志
*
* @param createDTO 创建系统访问日志 DTO
* @return 系统访问日志编号
*/
CommonResult<Boolean> createSystemAccessLog(SystemAccessLogCreateDTO createDTO);
/**
* 获得系统访问日志分页
*
* @param pageDTO 系统访问日志分页查询
* @return 系统访问日志分页结果
*/
CommonResult<PageResult<SystemAccessLogVO>> pageSystemAccessLog(SystemAccessLogPageDTO pageDTO);
}

View File

@ -0,0 +1,10 @@
package cn.iocoder.mall.systemservice.rpc.systemlog;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.systemservice.rpc.systemlog.dto.SystemExceptionLogCreateDTO;
public interface SystemExceptionLogRpc {
CommonResult<Boolean> createSystemExceptionLog(SystemExceptionLogCreateDTO createDTO);
}

View File

@ -1,13 +0,0 @@
package cn.iocoder.mall.systemservice.rpc.systemlog;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.systemservice.rpc.systemlog.dto.AccessLogAddDTO;
import cn.iocoder.mall.systemservice.rpc.systemlog.dto.ExceptionLogAddDTO;
public interface SystemLogRPC {
CommonResult<Boolean> addAccessLog(AccessLogAddDTO accessLogAddDTO);
CommonResult<Boolean> addExceptionLog(ExceptionLogAddDTO exceptionLogAddDTO);
}

View File

@ -9,11 +9,11 @@ import java.io.Serializable;
import java.util.Date;
/**
* 访问日志添加 DTO
* 系统访问日志添加 DTO
*/
@Data
@Accessors(chain = true)
public class AccessLogAddDTO implements Serializable {
public class SystemAccessLogCreateDTO implements Serializable {
/**
* 账号编号

View File

@ -9,11 +9,11 @@ import java.io.Serializable;
import java.util.Date;
/**
* 异常日志添加 DTO
* 系统异常日志添加 DTO
*/
@Data
@Accessors(chain = true)
public class ExceptionLogAddDTO implements Serializable {
public class SystemExceptionLogCreateDTO implements Serializable {
/**
* 账号编号

View File

@ -0,0 +1,29 @@
package cn.iocoder.mall.systemservice.rpc.systemlog.vo;
import cn.iocoder.common.framework.vo.PageParam;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* 系统访问日志分页 DTO
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
public class SystemAccessLogPageDTO extends PageParam {
/**
* 用户编号
*/
private Integer userId;
/**
* 用户类型
*/
private Integer userType;
/**
* 应用名
*/
private String applicationName;
}

View File

@ -0,0 +1,73 @@
package cn.iocoder.mall.systemservice.rpc.systemlog.vo;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
* 系统访问日志 VO
*/
@Data
@Accessors(chain = true)
public class SystemAccessLogVO implements Serializable {
/**
* 编号
*/
private Integer id;
/**
* 用户编号
*/
private Integer userId;
/**
* 用户类型
*/
private Integer userType;
/**
* 链路追踪编号
*/
private String traceId;
/**
* 应用名
*/
private String applicationName;
/**
* 访问地址
*/
private String uri;
/**
* 参数
*/
private String queryString;
/**
* http 方法
*/
private String method;
/**
* userAgent
*/
private String userAgent;
/**
* ip
*/
private String ip;
/**
* 请求时间
*/
private Date startTime;
/**
* 响应时长 -- 毫秒级
*/
private Integer responseTime;
/**
* 错误码
*/
private Integer errorCode;
/**
* 错误提示
*/
private String errorMessage;
}

View File

@ -0,0 +1,32 @@
package cn.iocoder.mall.systemservice.convert.systemlog;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.systemservice.dal.mysql.dataobject.systemlog.SystemAccessLogDO;
import cn.iocoder.mall.systemservice.rpc.systemlog.dto.SystemAccessLogCreateDTO;
import cn.iocoder.mall.systemservice.rpc.systemlog.vo.SystemAccessLogPageDTO;
import cn.iocoder.mall.systemservice.rpc.systemlog.vo.SystemAccessLogVO;
import cn.iocoder.mall.systemservice.service.systemlog.bo.SystemAccessLogBO;
import cn.iocoder.mall.systemservice.service.systemlog.bo.SystemAccessLogCreateBO;
import cn.iocoder.mall.systemservice.service.systemlog.bo.SystemAccessLogPageBO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
@Mapper
public interface SystemAccessLogConvert {
SystemAccessLogConvert INSTANCE = Mappers.getMapper(SystemAccessLogConvert.class);
SystemAccessLogDO convert(SystemAccessLogCreateBO bean);
SystemAccessLogCreateBO convert(SystemAccessLogCreateDTO bean);
@Mapping(source = "records", target = "list")
PageResult<SystemAccessLogBO> convertPage(IPage<SystemAccessLogDO> page);
SystemAccessLogPageBO convert(SystemAccessLogPageDTO bean);
PageResult<SystemAccessLogVO> convertPage(PageResult<SystemAccessLogBO> page);
}

View File

@ -0,0 +1,18 @@
package cn.iocoder.mall.systemservice.convert.systemlog;
import cn.iocoder.mall.systemservice.dal.mysql.dataobject.systemlog.SystemExceptionLogDO;
import cn.iocoder.mall.systemservice.rpc.systemlog.dto.SystemExceptionLogCreateDTO;
import cn.iocoder.mall.systemservice.service.systemlog.bo.SystemExceptionLogCreateBO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper
public interface SystemExceptionLogConvert {
SystemExceptionLogConvert INSTANCE = Mappers.getMapper(SystemExceptionLogConvert.class);
SystemExceptionLogDO convert(SystemExceptionLogCreateBO bean);
SystemExceptionLogCreateBO convert(SystemExceptionLogCreateDTO bean);
}

View File

@ -1,34 +0,0 @@
package cn.iocoder.mall.systemservice.convert.systemlog;
import cn.iocoder.mall.systemservice.dal.mysql.dataobject.systemlog.AccessLogDO;
import cn.iocoder.mall.systemservice.dal.mysql.dataobject.systemlog.ExceptionLogDO;
import cn.iocoder.mall.systemservice.rpc.systemlog.dto.AccessLogAddDTO;
import cn.iocoder.mall.systemservice.rpc.systemlog.dto.ExceptionLogAddDTO;
import cn.iocoder.mall.systemservice.service.systemlog.bo.AccessLogAddBO;
import cn.iocoder.mall.systemservice.service.systemlog.bo.ExceptionLogAddBO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper
public interface SystemLogConvert {
SystemLogConvert INSTANCE = Mappers.getMapper(SystemLogConvert.class);
AccessLogDO convert(AccessLogAddBO bean);
ExceptionLogDO convert(ExceptionLogAddBO bean);
AccessLogAddBO convert(AccessLogAddDTO bean);
ExceptionLogAddBO convert(ExceptionLogAddDTO bean);
// AccessLogDO convert(AccessLogAddDTO bean);
//
// ExceptionLogDO convert(ExceptionLogAddDTO bean);
//
// @Mapping(source = "records", target = "list")
// PageResult<AccessLogBO> convertPage(IPage<AccessLogDO> page);
//
// AccessLogBO convert(AccessLogDO bean);
}

View File

@ -14,7 +14,7 @@ import lombok.experimental.Accessors;
* value1
* value2
*/
@TableName("data_dict")
@TableName("system_data_dict")
@Data
@Accessors(chain = true)
public class DataDictDO extends DeletableDO {

View File

@ -11,13 +11,17 @@ import lombok.experimental.Accessors;
import java.util.Date;
/**
* 访问日志 DO
* 系统访问日志 DO
*
* 记录用户管理员对 API 接口的调用
*
* TODO 优化点考虑到架构简单暂时记录到 MySQL因为访问日志容易比较大所以建议未来存储到 ES 同时能够提供更丰富的检索能力
*/
@TableName("system_access_log")
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
public class AccessLogDO extends BaseDO {
public class SystemAccessLogDO extends BaseDO {
/**
* 编号

View File

@ -10,13 +10,13 @@ import lombok.experimental.Accessors;
import java.util.Date;
/**
* 异常日志 DO
* 系统异常日志 DO
*/
@TableName("system_exception_log")
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
public class ExceptionLogDO extends BaseDO {
public class SystemExceptionLogDO extends BaseDO {
/**
* 编号

View File

@ -13,16 +13,16 @@ public interface DataDictMapper extends BaseMapper<DataDictDO> {
default DataDictDO selectByEnumValueAndValue(String enumValue, String value) {
return selectOne(new QueryWrapper<DataDictDO>()
.eq("enumValue", enumValue).eq("value", value));
.eq("enum_value", enumValue).eq("value", value));
}
default List<DataDictDO> selectByEnumValueAndValues(String enumValue, Collection<String> values) {
return selectList(new QueryWrapper<DataDictDO>()
.eq("enumValue", enumValue).in("value", values));
.eq("enum_value", enumValue).in("value", values));
}
default List<DataDictDO> selectByEnumValue(String enumValue) {
return selectList(new QueryWrapper<DataDictDO>().eq("enumValue", enumValue));
return selectList(new QueryWrapper<DataDictDO>().eq("enum_value", enumValue));
}
}

View File

@ -1,15 +0,0 @@
package cn.iocoder.mall.systemservice.dal.mysql.mapper.systemlog;
import cn.iocoder.mall.systemservice.dal.mysql.dataobject.systemlog.AccessLogDO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Repository;
@Repository
public interface AccessLogMapper extends BaseMapper<AccessLogDO> {
// default IPage<AccessLogDO> selectPage(AccessLogPageDTO accessLogPageDTO) {
// return selectPage(new Page<>(accessLogPageDTO.getPageNo(), accessLogPageDTO.getPageSize()),
// new QueryWrapperX<AccessLogDO>().eqIfPresent("account_id", accessLogPageDTO.getAccountId()));
// }
}

View File

@ -0,0 +1,26 @@
package cn.iocoder.mall.systemservice.dal.mysql.mapper.systemlog;
import cn.iocoder.mall.mybatis.query.QueryWrapperX;
import cn.iocoder.mall.systemservice.dal.mysql.dataobject.systemlog.SystemAccessLogDO;
import cn.iocoder.mall.systemservice.service.systemlog.bo.SystemAccessLogPageBO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.stereotype.Repository;
/**
* 系统访问日志 Mapper
*/
@Repository
public interface SystemAccessLogMapper extends BaseMapper<SystemAccessLogDO> {
default IPage<SystemAccessLogDO> selectPage(SystemAccessLogPageBO pageBO) {
return selectPage(new Page<>(pageBO.getPageNo(), pageBO.getPageSize()),
new QueryWrapperX<SystemAccessLogDO>()
.eqIfPresent("user_id", pageBO.getUserId())
.eqIfPresent("user_type", pageBO.getUserType())
.eqIfPresent("application_name", pageBO.getApplicationName())
.orderByDesc("start_time"));
}
}

View File

@ -1,10 +1,10 @@
package cn.iocoder.mall.systemservice.dal.mysql.mapper.systemlog;
import cn.iocoder.mall.systemservice.dal.mysql.dataobject.systemlog.ExceptionLogDO;
import cn.iocoder.mall.systemservice.dal.mysql.dataobject.systemlog.SystemExceptionLogDO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Repository;
@Repository
public interface ExceptionLogMapper extends BaseMapper<ExceptionLogDO> {
public interface SystemExceptionLogMapper extends BaseMapper<SystemExceptionLogDO> {
}

View File

@ -0,0 +1,42 @@
package cn.iocoder.mall.systemservice.manager.systemlog;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.systemservice.convert.systemlog.SystemAccessLogConvert;
import cn.iocoder.mall.systemservice.rpc.systemlog.dto.SystemAccessLogCreateDTO;
import cn.iocoder.mall.systemservice.rpc.systemlog.vo.SystemAccessLogPageDTO;
import cn.iocoder.mall.systemservice.rpc.systemlog.vo.SystemAccessLogVO;
import cn.iocoder.mall.systemservice.service.systemlog.SystemAccessLogService;
import cn.iocoder.mall.systemservice.service.systemlog.bo.SystemAccessLogBO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* 系统访问日志 Manager
*/
@Service
public class SystemAccessLogManager {
@Autowired
private SystemAccessLogService systemAccessLogService;
/**
* 创建系统访问日志
*
* @param createDTO 创建系统访问日志 DTO
*/
public void createSystemAccessLog(SystemAccessLogCreateDTO createDTO) {
systemAccessLogService.createSystemAccessLog(SystemAccessLogConvert.INSTANCE.convert(createDTO));
}
/**
* 获得系统访问日志分页
*
* @param pageDTO 系统访问日志分页查询
* @return 系统访问日志分页结果
*/
public PageResult<SystemAccessLogVO> pageSystemAccessLog(SystemAccessLogPageDTO pageDTO) {
PageResult<SystemAccessLogBO> pageResultBO = systemAccessLogService.pageSystemAccessLog(SystemAccessLogConvert.INSTANCE.convert(pageDTO));
return SystemAccessLogConvert.INSTANCE.convertPage(pageResultBO);
}
}

View File

@ -0,0 +1,22 @@
package cn.iocoder.mall.systemservice.manager.systemlog;
import cn.iocoder.mall.systemservice.convert.systemlog.SystemExceptionLogConvert;
import cn.iocoder.mall.systemservice.rpc.systemlog.dto.SystemExceptionLogCreateDTO;
import cn.iocoder.mall.systemservice.service.systemlog.SystemExceptionLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* 系统异常日志 Manager
*/
@Service
public class SystemExceptionLogManager {
@Autowired
private SystemExceptionLogService systemLogService;
public void createSystemExceptionLog(SystemExceptionLogCreateDTO createDTO) {
systemLogService.createSystemExceptionLog(SystemExceptionLogConvert.INSTANCE.convert(createDTO));
}
}

View File

@ -1,24 +0,0 @@
package cn.iocoder.mall.systemservice.manager.systemlog;
import cn.iocoder.mall.systemservice.convert.systemlog.SystemLogConvert;
import cn.iocoder.mall.systemservice.rpc.systemlog.dto.AccessLogAddDTO;
import cn.iocoder.mall.systemservice.rpc.systemlog.dto.ExceptionLogAddDTO;
import cn.iocoder.mall.systemservice.service.systemlog.SystemLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class SystemLogManager {
@Autowired
private SystemLogService systemLogService;
public void addAccessLog(AccessLogAddDTO accessLogAddDTO) {
systemLogService.addAccessLog(SystemLogConvert.INSTANCE.convert(accessLogAddDTO));
}
public void addExceptionLog(ExceptionLogAddDTO exceptionLogAddDTO) {
systemLogService.addExceptionLog(SystemLogConvert.INSTANCE.convert(exceptionLogAddDTO));
}
}

View File

@ -0,0 +1,34 @@
package cn.iocoder.mall.systemservice.rpc.systemlog;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.systemservice.manager.systemlog.SystemAccessLogManager;
import cn.iocoder.mall.systemservice.rpc.systemlog.dto.SystemAccessLogCreateDTO;
import cn.iocoder.mall.systemservice.rpc.systemlog.vo.SystemAccessLogPageDTO;
import cn.iocoder.mall.systemservice.rpc.systemlog.vo.SystemAccessLogVO;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;
import static cn.iocoder.common.framework.vo.CommonResult.success;
/**
* 系统访问日志 Rpc 实现类
*/
@Service(version = "${dubbo.provider.SystemAccessLogRpc.version}", validation = "false")
public class SystemAccessLogRpcImpl implements SystemAccessLogRpc {
@Autowired
private SystemAccessLogManager systemAccessLogManager;
@Override
public CommonResult<Boolean> createSystemAccessLog(SystemAccessLogCreateDTO createDTO) {
systemAccessLogManager.createSystemAccessLog(createDTO);
return success(true);
}
@Override
public CommonResult<PageResult<SystemAccessLogVO>> pageSystemAccessLog(SystemAccessLogPageDTO pageDTO) {
return success(systemAccessLogManager.pageSystemAccessLog(pageDTO));
}
}

View File

@ -0,0 +1,21 @@
package cn.iocoder.mall.systemservice.rpc.systemlog;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.systemservice.manager.systemlog.SystemExceptionLogManager;
import cn.iocoder.mall.systemservice.rpc.systemlog.dto.SystemExceptionLogCreateDTO;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;
@Service(version = "${dubbo.provider.SystemExceptionLogRpc.version}", validation = "false")
public class SystemExceptionLogRpcImpl implements SystemExceptionLogRpc {
@Autowired
private SystemExceptionLogManager systemExceptionLogManager;
@Override
public CommonResult<Boolean> createSystemExceptionLog(SystemExceptionLogCreateDTO createDTO) {
systemExceptionLogManager.createSystemExceptionLog(createDTO);
return CommonResult.success(true);
}
}

View File

@ -1,28 +0,0 @@
package cn.iocoder.mall.systemservice.rpc.systemlog;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.systemservice.manager.systemlog.SystemLogManager;
import cn.iocoder.mall.systemservice.rpc.systemlog.dto.AccessLogAddDTO;
import cn.iocoder.mall.systemservice.rpc.systemlog.dto.ExceptionLogAddDTO;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;
@Service(version = "${dubbo.provider.SystemLogRPC.version}", validation = "false")
public class SystemLogRPCImpl implements SystemLogRPC {
@Autowired
private SystemLogManager systemLogManager;
@Override
public CommonResult<Boolean> addAccessLog(AccessLogAddDTO accessLogAddDTO) {
systemLogManager.addAccessLog(accessLogAddDTO);
return CommonResult.success(true);
}
@Override
public CommonResult<Boolean> addExceptionLog(ExceptionLogAddDTO exceptionLogAddDTO) {
systemLogManager.addExceptionLog(exceptionLogAddDTO);
return CommonResult.success(true);
}
}

View File

@ -0,0 +1,44 @@
package cn.iocoder.mall.systemservice.service.systemlog;
import cn.iocoder.common.framework.vo.PageResult;
import cn.iocoder.mall.systemservice.convert.systemlog.SystemAccessLogConvert;
import cn.iocoder.mall.systemservice.dal.mysql.dataobject.systemlog.SystemAccessLogDO;
import cn.iocoder.mall.systemservice.dal.mysql.mapper.systemlog.SystemAccessLogMapper;
import cn.iocoder.mall.systemservice.service.systemlog.bo.SystemAccessLogBO;
import cn.iocoder.mall.systemservice.service.systemlog.bo.SystemAccessLogCreateBO;
import cn.iocoder.mall.systemservice.service.systemlog.bo.SystemAccessLogPageBO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* 系统访问日志 Service
*/
@Service
public class SystemAccessLogService {
@Autowired
private SystemAccessLogMapper systemAccessLogMapper;
/**
* 创建系统访问日志
*
* @param createBO 创建系统访问日志 BO
*/
public void createSystemAccessLog(SystemAccessLogCreateBO createBO) {
SystemAccessLogDO logDO = SystemAccessLogConvert.INSTANCE.convert(createBO);
systemAccessLogMapper.insert(logDO);
}
/**
* 获得系统访问日志分页
*
* @param pageBO 系统访问日志分页查询
* @return 系统访问日志分页结果
*/
public PageResult<SystemAccessLogBO> pageSystemAccessLog(SystemAccessLogPageBO pageBO) {
IPage<SystemAccessLogDO> systemAccessLogDOPage = systemAccessLogMapper.selectPage(pageBO);
return SystemAccessLogConvert.INSTANCE.convertPage(systemAccessLogDOPage);
}
}

View File

@ -0,0 +1,24 @@
package cn.iocoder.mall.systemservice.service.systemlog;
import cn.iocoder.mall.systemservice.convert.systemlog.SystemExceptionLogConvert;
import cn.iocoder.mall.systemservice.dal.mysql.dataobject.systemlog.SystemExceptionLogDO;
import cn.iocoder.mall.systemservice.dal.mysql.mapper.systemlog.SystemExceptionLogMapper;
import cn.iocoder.mall.systemservice.service.systemlog.bo.SystemExceptionLogCreateBO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* 系统异常日志 Service
*/
@Service
public class SystemExceptionLogService {
@Autowired
private SystemExceptionLogMapper systemExceptionLogMapper;
public void createSystemExceptionLog(SystemExceptionLogCreateBO createBO) {
SystemExceptionLogDO logDO = SystemExceptionLogConvert.INSTANCE.convert(createBO);
systemExceptionLogMapper.insert(logDO);
}
}

View File

@ -1,39 +0,0 @@
package cn.iocoder.mall.systemservice.service.systemlog;
import cn.iocoder.mall.systemservice.convert.systemlog.SystemLogConvert;
import cn.iocoder.mall.systemservice.dal.mysql.dataobject.systemlog.AccessLogDO;
import cn.iocoder.mall.systemservice.dal.mysql.dataobject.systemlog.ExceptionLogDO;
import cn.iocoder.mall.systemservice.dal.mysql.mapper.systemlog.AccessLogMapper;
import cn.iocoder.mall.systemservice.dal.mysql.mapper.systemlog.ExceptionLogMapper;
import cn.iocoder.mall.systemservice.service.systemlog.bo.AccessLogAddBO;
import cn.iocoder.mall.systemservice.service.systemlog.bo.ExceptionLogAddBO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class SystemLogService {
@Autowired
private AccessLogMapper accessLogMapper;
@Autowired
private ExceptionLogMapper exceptionLogMapper;
public void addAccessLog(AccessLogAddBO accessLogAddBO) {
AccessLogDO logDO = SystemLogConvert.INSTANCE.convert(accessLogAddBO);
accessLogMapper.insert(logDO);
}
public void addExceptionLog(ExceptionLogAddBO exceptionLogAddBO) {
ExceptionLogDO logDO = SystemLogConvert.INSTANCE.convert(exceptionLogAddBO);
exceptionLogMapper.insert(logDO);
}
// @Override
// @SuppressWarnings("Duplicates")
// public PageResult<AccessLogBO> getAccessLogPage(AccessLogPageDTO accessLogPageDTO) {
// PageResult<AccessLogBO> accessLogPageBOPageResult = SystemLogConvert.INSTANCE.convertPage(
// accessLogMapper.selectPage(accessLogPageDTO)); // TODO FROM 芋艿 to 2447007062可以考虑直接 return简洁 + IDEA 不告警
// return accessLogPageBOPageResult;
// }
}

View File

@ -0,0 +1,76 @@
package cn.iocoder.mall.systemservice.service.systemlog.bo;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* 系统访问日志 BO
*/
@Data
@Accessors(chain = true)
public class SystemAccessLogBO {
/**
* 编号
*/
private Integer id;
/**
* 用户编号
*/
private Integer userId;
/**
* 用户类型
*/
private Integer userType;
/**
* 链路追踪编号
*/
private String traceId;
/**
* 应用名
*/
private String applicationName;
/**
* 访问地址
*/
private String uri;
/**
* 参数
*/
private String queryString;
/**
* http 方法
*/
private String method;
/**
* userAgent
*/
private String userAgent;
/**
* ip
*/
private String ip;
/**
* 请求时间
*/
private Date startTime;
/**
* 响应时长 -- 毫秒级
*/
private Integer responseTime;
/**
* 错误码
*/
private Integer errorCode;
/**
* 错误提示
*/
private String errorMessage;
/**
* 创建时间
*/
private Date createTime;
}

View File

@ -5,7 +5,6 @@ import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Date;
/**
@ -13,7 +12,7 @@ import java.util.Date;
*/
@Data
@Accessors(chain = true)
public class AccessLogAddBO implements Serializable {
public class SystemAccessLogCreateBO {
/**
* 账号编号

View File

@ -0,0 +1,29 @@
package cn.iocoder.mall.systemservice.service.systemlog.bo;
import cn.iocoder.common.framework.vo.PageParam;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* 系统访问日志分页 BO
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
public class SystemAccessLogPageBO extends PageParam {
/**
* 用户编号
*/
private Integer userId;
/**
* 用户类型
*/
private Integer userType;
/**
* 应用名
*/
private String applicationName;
}

View File

@ -8,11 +8,11 @@ import javax.validation.constraints.NotNull;
import java.util.Date;
/**
* 异常日志添加 BO
* 系统异常日志添加 BO
*/
@Data
@Accessors(chain = true)
public class ExceptionLogAddBO {
public class SystemExceptionLogCreateBO {
/**
* 账号编号

View File

@ -37,8 +37,6 @@ dubbo:
version: 1.0.0
AdminRpc:
version: 1.0.0
SystemLogRPC:
version: 1.0.0
ResourceRpc:
version: 1.0.0
RoleRpc:
@ -49,3 +47,7 @@ dubbo:
version: 1.0.0
DataDictRpc:
version: 1.0.0
SystemExceptionLogRpc:
version: 1.0.0
SystemAccessLogRpc:
version: 1.0.0

View File

@ -18,10 +18,6 @@ public interface UserConvert {
UserConvert INSTANCE = Mappers.getMapper(UserConvert.class);
@Mapping(source = "userBO", target = "user")
@Mapping(source = "accessTokenBO", target = "token")
UserAuthenticateBO convert(UserBO userBO, OAuth2AuthenticateBO accessTokenBO);
UserBO convert(UserDO bean);
/**

View File

@ -1,32 +0,0 @@
package cn.iocoder.mall.system.biz.dto.system;
import lombok.Data;
import lombok.experimental.Accessors;
import javax.validation.constraints.NotNull;
/**
* 访问日志添加 DTO
*/
@Data
@Accessors(chain = true)
public class AccessLogPageDTO { // TODO FROM 芋艿 to 2447007062有个 PageParams 类哈可以继承
/**
* 账号编号
*/
private Integer accountId;
/**
* 页码 1 开始
*/
@NotNull(message = "页码不能为空")
private Integer pageNo;
/**
* 每页条数
*/
@NotNull(message = "每页条数不能为空")
private Integer pageSize;
}

View File

@ -1,80 +0,0 @@
package cn.iocoder.mall.system.application.controller.admins;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.system.api.DataDictService;
import cn.iocoder.mall.system.api.bo.datadict.DataDictBO;
import cn.iocoder.mall.system.api.dto.datadict.DataDictAddDTO;
import cn.iocoder.mall.system.api.dto.datadict.DataDictUpdateDTO;
import cn.iocoder.mall.system.application.convert.DataDictConvert;
import cn.iocoder.mall.system.application.vo.datadict.DataDictEnumVO;
import cn.iocoder.mall.system.sdk.annotation.RequiresPermissions;
import cn.iocoder.mall.system.sdk.context.AdminSecurityContextHolder;
import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.Multimaps;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
import static cn.iocoder.common.framework.vo.CommonResult.success;
@RestController
@RequestMapping("admins/data_dict")
@Api("数据字典模块")
public class DataDictController {
@Reference(validation = "true", version = "${dubbo.provider.DataDictService.version}")
private DataDictService dataDictService;
@GetMapping("/list")
@ApiOperation(value = "数据字典全列表")
@RequiresPermissions("system.dataDict.list")
public CommonResult<List<DataDictBO>> list() {
return success( dataDictService.selectDataDictList());
}
@GetMapping("/tree")
@RequiresPermissions({}) // 因为是通用的接口所以无需权限标识
@ApiOperation(value = "数据字典树结构", notes = "该接口返回的信息更为精简。一般用于前端缓存数据字典到本地。")
public CommonResult<List<DataDictEnumVO>> tree() {
// 查询数据字典全列表
List<DataDictBO> dataDicts = dataDictService.selectDataDictList();
// 构建基于 enumValue 聚合的 Multimap
ImmutableListMultimap<String, DataDictBO> dataDictMap = Multimaps.index(dataDicts, DataDictBO::getEnumValue); // KEY enumValue VALUE DataDictBO 数组
// 构建返回结果
List<DataDictEnumVO> dataDictEnumVOs = new ArrayList<>(dataDictMap.size());
dataDictMap.keys().forEach(enumValue -> {
DataDictEnumVO dataDictEnumVO = new DataDictEnumVO().setEnumValue(enumValue)
.setValues(DataDictConvert.INSTANCE.convert2(dataDictMap.get(enumValue)));
dataDictEnumVOs.add(dataDictEnumVO);
});
return success(dataDictEnumVOs);
}
@PostMapping("/add")
@RequiresPermissions("system.dataDict.add")
@ApiOperation(value = "创建数据字典")
public CommonResult<DataDictBO> add(DataDictAddDTO dataDictAddDTO) {
return success(dataDictService.addDataDict(AdminSecurityContextHolder.getContext().getAdminId(), dataDictAddDTO));
}
@PostMapping("/update")
@RequiresPermissions("system.dataDict.update")
@ApiOperation(value = "更新数据字典")
public CommonResult<Boolean> update(DataDictUpdateDTO dataDictUpdateDTO) {
return success(dataDictService.updateDataDict(AdminSecurityContextHolder.getContext().getAdminId(), dataDictUpdateDTO));
}
@PostMapping("/delete")
@RequiresPermissions("system.dataDict.delete")
@ApiOperation(value = "删除数据字典")
@ApiImplicitParam(name = "id", value = "编号", required = true, example = "100")
public CommonResult<Boolean> delete(@RequestParam("id") Integer id) {
return success(dataDictService.deleteDataDict(AdminSecurityContextHolder.getContext().getAdminId(), id));
}
}

View File

@ -1,56 +0,0 @@
package cn.iocoder.mall.system.application.controller.admins;
import cn.iocoder.common.framework.vo.CommonResult;
import cn.iocoder.mall.system.api.SystemLogService;
import cn.iocoder.mall.system.api.bo.systemlog.AccessLogPageBO;
import cn.iocoder.mall.system.api.dto.systemlog.AccessLogPageDTO;
import cn.iocoder.mall.system.application.convert.AccessLogConvert;
import cn.iocoder.mall.system.application.vo.log.AccessLogPageVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import static cn.iocoder.common.framework.vo.CommonResult.success;
/**
* @author:ycjx
* @descriptio
* @create:2019-06-23 16:42
*/
@RestController
@RequestMapping("admins/system/logs")
@Api("系统日志")
public class SystemLogController {
@Reference(validation = "true", version = "${dubbo.provider.AdminAccessLogService.version}")
private SystemLogService systemLogService;
@GetMapping("access/page")
@ApiOperation(value = "访问日志分页")
@ApiImplicitParams({
@ApiImplicitParam(name = "userId", value = "用户id", example = "1"),
@ApiImplicitParam(name = "pageNo", value = "页码,从 1 开始", example = "1"),
@ApiImplicitParam(name = "pageSize", value = "每页条数", required = true, example = "10"),
})
public CommonResult<AccessLogPageVo> page(@RequestParam(value = "userId", required = false) Integer userId,
@RequestParam(value = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
AccessLogPageDTO accessLogPageDTO = new AccessLogPageDTO().setUserId(userId)
.setPageNo(pageNo).setPageSize(pageSize);
// 查询分页
AccessLogPageBO result = systemLogService.getAccessLogPage(accessLogPageDTO);
// 转换结果
return success(AccessLogConvert.INSTANCE.convert(result));
}
}

View File

@ -1,30 +0,0 @@
package cn.iocoder.mall.system.application.convert;
import cn.iocoder.mall.system.api.bo.systemlog.AccessLogBO;
import cn.iocoder.mall.system.api.bo.systemlog.AccessLogPageBO;
import cn.iocoder.mall.system.application.vo.log.AccessLogPageVo;
import cn.iocoder.mall.system.application.vo.log.AccessLogVo;
import org.mapstruct.Mapper;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
/**
* @author:ycjx
* @descriptio
* @create:2019-06-23 17:36
*/
@Mapper
public interface AccessLogConvert {
AccessLogConvert INSTANCE = Mappers.getMapper(AccessLogConvert.class);
@Mappings({})
AccessLogPageVo convert(AccessLogPageBO result);
@Mappings({})
AccessLogVo convert(AccessLogBO result);
}

View File

@ -1,19 +0,0 @@
package cn.iocoder.mall.system.application.convert;
import cn.iocoder.mall.system.api.bo.datadict.DataDictBO;
import cn.iocoder.mall.system.application.vo.datadict.DataDictEnumVO;
import org.mapstruct.Mapper;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper
public interface DataDictConvert {
DataDictConvert INSTANCE = Mappers.getMapper(DataDictConvert.class);
@Mappings({})
List<DataDictEnumVO.Value> convert2(List<DataDictBO> dataDictBOs);
}

View File

@ -1,25 +0,0 @@
package cn.iocoder.mall.system.application.vo.log;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
/**
* @author:ycjx
* @descriptio
* @create:2019-06-23 17:03
*/
@ApiModel("访问日志分页 VO")
@Data
@Accessors(chain = true)
public class AccessLogPageVo {
@ApiModelProperty(value = "访问数据")
private List<AccessLogVo> list;
@ApiModelProperty(value = "访问总数")
private Integer total;
}

View File

@ -1,58 +0,0 @@
package cn.iocoder.mall.system.application.vo.log;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* @author:yuxj
* @descriptio
* @create:2019-06-23 17:04
*/
@ApiModel("访问日志 VO")
@Data
@Accessors(chain = true)
public class AccessLogVo {
@ApiModelProperty(value = "链路追踪编号", required = true, example = "1")
private String traceId;
@ApiModelProperty(value = "用户编号", required = true, example = "1")
private Integer userId;
@ApiModelProperty(value = "用户类型", required = true, example = "1")
private Integer userType;
@ApiModelProperty(value = "应用名", required = true, example = "1")
private String applicationName;
@ApiModelProperty(value = "访问地址", required = true, example = "1")
private String uri;
@ApiModelProperty(value = "请求参数", required = true, example = "1")
private String queryString;
@ApiModelProperty(value = "http 请求方法", required = true, example = "1")
private String method;
@ApiModelProperty(value = "User-Agent ", required = true, example = "1")
private String userAgent;
@ApiModelProperty(value = "ip", required = true, example = "1")
private String ip;
@ApiModelProperty(value = "请求时间", required = true, example = "1")
private Date startTime;
@ApiModelProperty(value = "响应时长", required = true, example = "1")
private Integer responseTime;
@ApiModelProperty(value = "错误码", required = true, example = "1")
private Integer errorCode;
}