diff --git a/server/src/main/java/com/xaaef/molly/MollyApplication.java b/server/src/main/java/com/xaaef/molly/MollyApplication.java index 3743613..bf30338 100644 --- a/server/src/main/java/com/xaaef/molly/MollyApplication.java +++ b/server/src/main/java/com/xaaef/molly/MollyApplication.java @@ -10,7 +10,7 @@ import org.springframework.scheduling.annotation.EnableScheduling; /** *

- * spring boot jpa 多租户 启动类 + * spring boot mybatis-plus 多租户 启动类 *

* * @author WangChenChen diff --git a/server/src/main/java/com/xaaef/molly/core/auth/jwt/JwtLoginUser.java b/server/src/main/java/com/xaaef/molly/core/auth/jwt/JwtLoginUser.java index daf8f88..18b1911 100644 --- a/server/src/main/java/com/xaaef/molly/core/auth/jwt/JwtLoginUser.java +++ b/server/src/main/java/com/xaaef/molly/core/auth/jwt/JwtLoginUser.java @@ -11,6 +11,7 @@ import lombok.experimental.Accessors; import org.springframework.security.core.userdetails.UserDetails; import java.security.Principal; +import java.time.LocalDate; import java.time.LocalDateTime; import java.util.Collection; @@ -108,6 +109,11 @@ public class JwtLoginUser implements UserDetails, Principal { */ private Long deptId; + /** + * 过期时间 为空就是永久 + */ + private LocalDateTime expired; + /** * 登录时间 */ @@ -139,7 +145,10 @@ public class JwtLoginUser implements UserDetails, Principal { @JsonIgnore @Override public boolean isAccountNonExpired() { - return true; + if (expired == null) { + return true; + } + return LocalDateTime.now().isBefore(expired); } diff --git a/server/src/main/java/com/xaaef/molly/core/auth/service/impl/LineCaptchaServiceImpl.java b/server/src/main/java/com/xaaef/molly/core/auth/service/impl/LineCaptchaServiceImpl.java index 6bdc021..1313ca0 100644 --- a/server/src/main/java/com/xaaef/molly/core/auth/service/impl/LineCaptchaServiceImpl.java +++ b/server/src/main/java/com/xaaef/molly/core/auth/service/impl/LineCaptchaServiceImpl.java @@ -18,14 +18,15 @@ import static com.xaaef.molly.core.auth.consts.LoginConst.CAPTCHA_CODE_KEY; /** *

- * + * 验证码 *

* * @author Wang Chen Chen<932560435@qq.com> - * @version 1.0 + * @version 1.0.1 * @createTime 2020/3/5 0005 11:32 */ + @Slf4j @Service @AllArgsConstructor diff --git a/server/src/main/java/com/xaaef/molly/core/auth/service/impl/UserLoginServiceImpl.java b/server/src/main/java/com/xaaef/molly/core/auth/service/impl/UserLoginServiceImpl.java index 6e8a3db..eeffb60 100644 --- a/server/src/main/java/com/xaaef/molly/core/auth/service/impl/UserLoginServiceImpl.java +++ b/server/src/main/java/com/xaaef/molly/core/auth/service/impl/UserLoginServiceImpl.java @@ -4,6 +4,7 @@ import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.xaaef.molly.common.domain.CustomRequestInfo; import com.xaaef.molly.common.util.ServletUtils; import com.xaaef.molly.core.auth.enums.AdminFlag; import com.xaaef.molly.core.auth.enums.GrantType; @@ -17,6 +18,7 @@ import com.xaaef.molly.core.auth.po.LoginFormPO; import com.xaaef.molly.core.auth.service.JwtTokenService; import com.xaaef.molly.core.auth.service.LineCaptchaService; import com.xaaef.molly.core.auth.service.UserLoginService; +import com.xaaef.molly.core.log.domain.LoginLog; import com.xaaef.molly.core.log.service.LogStorageService; import com.xaaef.molly.core.tenant.service.MultiTenantManager; import com.xaaef.molly.core.tenant.util.TenantUtils; @@ -24,7 +26,6 @@ import com.xaaef.molly.core.tenant.util.TenantUtils; import com.xaaef.molly.perms.entity.PmsRoleProxy; import com.xaaef.molly.perms.mapper.PmsRoleMapper; import com.xaaef.molly.system.entity.SysMenu; -import com.xaaef.molly.system.entity.SysTenant; import com.xaaef.molly.system.enums.MenuTargetEnum; import com.xaaef.molly.system.mapper.SysMenuMapper; import com.xaaef.molly.system.mapper.SysTenantMapper; @@ -45,6 +46,16 @@ import java.util.stream.Collectors; import static com.xaaef.molly.common.util.JsonUtils.DEFAULT_DATE_TIME_PATTERN; +/** + *

+ * 用户登录 + *

+ * + * @author Wang Chen Chen<932560435@qq.com> + * @version 1.0.1 + * @createTime 2020/3/5 0005 11:32 + */ + @Slf4j @Service @AllArgsConstructor @@ -93,7 +104,6 @@ public class UserLoginServiceImpl implements UserLoginService { var format = LocalDateTimeUtil.format(currentTenant.getExpired(), DEFAULT_DATE_TIME_PATTERN); throw new JwtAuthException(StrUtil.format("租户 {} 已经在 {} 过期了!", currentTenant.getName(), format)); } - // 把表单提交的 username password 封装到 UsernamePasswordAuthenticationToken中 var authResult = authManager.authenticate( new UsernamePasswordAuthenticationToken( @@ -124,7 +134,7 @@ public class UserLoginServiceImpl implements UserLoginService { tokenService.setLoginUser(target); // 保存登录日志到数据库中 - logStorageService.asyncLoginSave(target, ServletUtils.getRequestInfo(request)); + asyncLoginLogSave(target, ServletUtils.getRequestInfo(request)); // 删除 redis 中的 验证码 captchaService.delete(po.getCodeKey()); @@ -189,4 +199,30 @@ public class UserLoginServiceImpl implements UserLoginService { } + + /** + * 保存 登录日志 + * + * @author WangChenChen + * @date 2023/2/6 15:56 + */ + private void asyncLoginLogSave(JwtLoginUser loginUser, CustomRequestInfo request) { + var loginLog = new LoginLog(); + loginLog.setRequestUrl(request.getRequestUrl()); + loginLog.setRequestIp(request.getIp()); + loginLog.setAddress(request.getAddress()); + loginLog.setOsName(request.getOsName()); + loginLog.setBrowser(request.getBrowser()); + loginLog.setAvatar(loginUser.getAvatar()); + loginLog.setNickname(loginUser.getNickname()); + loginLog.setUsername(loginUser.getUsername()); + loginLog.setUserId(loginUser.getUserId()); + loginLog.setTenantId(loginUser.getTenantId()); + loginLog.setCreateTime(loginUser.getLoginTime()); + loginLog.setGrantType(loginUser.getGrantType().getCode()); + loginLog.setId(IdUtil.getSnowflakeNextId()); + logStorageService.asyncLoginSave(loginLog); + } + + } diff --git a/server/src/main/java/com/xaaef/molly/core/log/service/LogStorageService.java b/server/src/main/java/com/xaaef/molly/core/log/service/LogStorageService.java index 61fc2a5..ae596cb 100644 --- a/server/src/main/java/com/xaaef/molly/core/log/service/LogStorageService.java +++ b/server/src/main/java/com/xaaef/molly/core/log/service/LogStorageService.java @@ -2,6 +2,7 @@ package com.xaaef.molly.core.log.service; import com.xaaef.molly.common.domain.CustomRequestInfo; import com.xaaef.molly.core.auth.jwt.JwtLoginUser; +import com.xaaef.molly.core.log.domain.LoginLog; import com.xaaef.molly.core.log.domain.OperLog; import org.aspectj.lang.JoinPoint; @@ -21,11 +22,11 @@ public interface LogStorageService { /** * 异步保存 登录日志 到 ES 中 * - * @param loginUser + * @param loginLog * @author Wang Chen Chen * @date 2021/8/11 15:30 */ - void asyncLoginSave(JwtLoginUser loginUser, CustomRequestInfo request); + void asyncLoginSave(LoginLog loginLog); /** diff --git a/server/src/main/java/com/xaaef/molly/core/log/service/impl/LogStorageServiceAdapter.java b/server/src/main/java/com/xaaef/molly/core/log/service/impl/LogStorageServiceAdapter.java deleted file mode 100644 index 16df414..0000000 --- a/server/src/main/java/com/xaaef/molly/core/log/service/impl/LogStorageServiceAdapter.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.xaaef.molly.core.log.service.impl; - -import cn.hutool.core.util.IdUtil; -import com.xaaef.molly.common.domain.CustomRequestInfo; -import com.xaaef.molly.common.util.JsonUtils; -import com.xaaef.molly.core.auth.jwt.JwtLoginUser; -import com.xaaef.molly.core.log.domain.LoginLog; -import com.xaaef.molly.core.log.domain.OperLog; -import com.xaaef.molly.core.log.service.LogStorageService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Component; - - -/** - *

- * 操作日志 - *

- * - * @author Wang Chen Chen - * @version 1.0.1 - * @date 2021/8/17 16:18 - */ - - -@Slf4j -@Component -public class LogStorageServiceAdapter implements LogStorageService { - - - @Async - @Override - public void asyncLoginSave(JwtLoginUser loginUser, CustomRequestInfo request) { - var loginLog = new LoginLog(); - loginLog.setRequestUrl(request.getRequestUrl()); - loginLog.setRequestIp(request.getIp()); - loginLog.setAddress(request.getAddress()); - loginLog.setOsName(request.getOsName()); - loginLog.setBrowser(request.getBrowser()); - loginLog.setAvatar(loginUser.getAvatar()); - loginLog.setNickname(loginUser.getNickname()); - loginLog.setUsername(loginUser.getUsername()); - loginLog.setUserId(loginUser.getUserId()); - loginLog.setTenantId(loginUser.getTenantId()); - loginLog.setCreateTime(loginUser.getLoginTime()); - loginLog.setGrantType(loginUser.getGrantType().getCode()); - loginLog.setId(IdUtil.getSnowflakeNextId()); - log.info("登录日志: \n{}", JsonUtils.toFormatJson(loginLog)); - } - - - @Async - @Override - public void asyncOperateSave(OperLog operLog) { - log.info("操作日志: \n{}", JsonUtils.toFormatJson(operLog)); - } - - -} diff --git a/server/src/main/java/com/xaaef/molly/monitor/controller/LmsLoginLogController.java b/server/src/main/java/com/xaaef/molly/monitor/controller/LmsLoginLogController.java new file mode 100644 index 0000000..a48a98e --- /dev/null +++ b/server/src/main/java/com/xaaef/molly/monitor/controller/LmsLoginLogController.java @@ -0,0 +1,53 @@ +package com.xaaef.molly.monitor.controller; + +import com.xaaef.molly.common.domain.Pagination; +import com.xaaef.molly.common.po.SearchPO; +import com.xaaef.molly.common.util.JsonResult; +import com.xaaef.molly.monitor.entity.LmsLoginLog; +import com.xaaef.molly.monitor.service.LmsLoginLogService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import java.util.Set; + + +/** + *

+ * 监控 登录日志 + *

+ * + * @author Wang Chen Chen <932560435@qq.com> + * @version 3.0 + */ + + +@Slf4j +@RestController +@RequestMapping("/lms/lgoin") +@Tag(name = "[ 监控 ] 登录日志") +@AllArgsConstructor +public class LmsLoginLogController { + + private final LmsLoginLogService baseService; + + + @Operation(summary = "分页", description = "分页 查询所有") + @GetMapping("/query") + public JsonResult> pageQuery(SearchPO params) { + var page = baseService.pageKeywords(params); + return JsonResult.success(page.getTotal(), page.getRecords()); + } + + + @Operation(summary = "批量删除", description = "只需要id即可") + @PostMapping() + public JsonResult delete(@RequestBody Set ids) { + boolean b = baseService.removeBatchByIds(ids); + return JsonResult.success(b); + } + + +} diff --git a/server/src/main/java/com/xaaef/molly/monitor/controller/LmsOperLogController.java b/server/src/main/java/com/xaaef/molly/monitor/controller/LmsOperLogController.java new file mode 100644 index 0000000..8f301b4 --- /dev/null +++ b/server/src/main/java/com/xaaef/molly/monitor/controller/LmsOperLogController.java @@ -0,0 +1,53 @@ +package com.xaaef.molly.monitor.controller; + +import com.xaaef.molly.common.domain.Pagination; +import com.xaaef.molly.common.po.SearchPO; +import com.xaaef.molly.common.util.JsonResult; +import com.xaaef.molly.monitor.entity.LmsOperLog; +import com.xaaef.molly.monitor.service.LmsOperLogService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import java.util.Set; + + +/** + *

+ * 监控 操作日志 + *

+ * + * @author Wang Chen Chen <932560435@qq.com> + * @version 3.0 + */ + + +@Slf4j +@RestController +@RequestMapping("/lms/oper") +@Tag(name = "[ 监控 ] 操作日志") +@AllArgsConstructor +public class LmsOperLogController { + + private final LmsOperLogService baseService; + + + @Operation(summary = "分页", description = "分页 查询所有") + @GetMapping("/query") + public JsonResult> pageQuery(SearchPO params) { + var page = baseService.pageKeywords(params); + return JsonResult.success(page.getTotal(), page.getRecords()); + } + + + @Operation(summary = "批量删除", description = "只需要id即可") + @PostMapping() + public JsonResult delete(@RequestBody Set ids) { + boolean b = baseService.removeBatchByIds(ids); + return JsonResult.success(b); + } + + +} diff --git a/server/src/main/java/com/xaaef/molly/system/controller/ServerInfoController.java b/server/src/main/java/com/xaaef/molly/monitor/controller/ServerInfoController.java similarity index 73% rename from server/src/main/java/com/xaaef/molly/system/controller/ServerInfoController.java rename to server/src/main/java/com/xaaef/molly/monitor/controller/ServerInfoController.java index 08ef08a..15abd51 100644 --- a/server/src/main/java/com/xaaef/molly/system/controller/ServerInfoController.java +++ b/server/src/main/java/com/xaaef/molly/monitor/controller/ServerInfoController.java @@ -1,13 +1,15 @@ -package com.xaaef.molly.system.controller; +package com.xaaef.molly.monitor.controller; import com.xaaef.molly.common.util.JsonResult; -import com.xaaef.molly.system.entity.ServerInfo; +import com.xaaef.molly.monitor.entity.ServerInfo; import com.xaaef.molly.system.service.SysConfigService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; @Slf4j diff --git a/server/src/main/java/com/xaaef/molly/monitor/entity/LmsLoginLog.java b/server/src/main/java/com/xaaef/molly/monitor/entity/LmsLoginLog.java new file mode 100644 index 0000000..6a772c1 --- /dev/null +++ b/server/src/main/java/com/xaaef/molly/monitor/entity/LmsLoginLog.java @@ -0,0 +1,93 @@ +package com.xaaef.molly.monitor.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; + +/** + *

+ * 登录日志 + *

+ * + * @author WangChenChen + * @version 1.1 + * @date 2023/2/6 15:27 + */ + +@TableName("lms_login_log") +@Getter +@Setter +@Builder +@Accessors(chain = true) +@AllArgsConstructor +@NoArgsConstructor +public class LmsLoginLog implements java.io.Serializable { + + /** + * ID + */ + @TableId + private Long id; + + /** + * 授权类型 + */ + private String grantType; + + /** + * 用户ID + */ + private Long userId; + + /** + * 用户昵称 + */ + private String nickname; + + /** + * 用户名 + */ + private String username; + + /** + * 头像 + */ + private String avatar; + + /** + * 请求地址 + */ + private String requestUrl; + + /** + * 请求IP + */ + private String requestIp; + + /** + * 请求地址 + */ + private String address; + + /** + * 操作系统 + */ + private String osName; + + /** + * 浏览器 + */ + private String browser; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + protected LocalDateTime createTime; + +} diff --git a/server/src/main/java/com/xaaef/molly/monitor/entity/LmsOperLog.java b/server/src/main/java/com/xaaef/molly/monitor/entity/LmsOperLog.java new file mode 100644 index 0000000..373fbe4 --- /dev/null +++ b/server/src/main/java/com/xaaef/molly/monitor/entity/LmsOperLog.java @@ -0,0 +1,113 @@ +package com.xaaef.molly.monitor.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.*; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; + +/** + *

+ * 操作日志 + *

+ * + * @author WangChenChen + * @version 1.1 + * @date 2023/2/6 15:27 + */ + +@TableName("lms_oper_log") +@Getter +@Setter +@Builder +@Accessors(chain = true) +@AllArgsConstructor +@NoArgsConstructor +public class LmsOperLog implements java.io.Serializable { + + /** + * ID + */ + @TableId + private Long id; + + /** + * 标题 + */ + private String title; + + /** + * 描述 + */ + private String description; + + /** + * 服务名称 + */ + private String serviceName; + + /** + * 用户ID + */ + private Long userId; + + /** + * 方法 + */ + private String method; + + /** + * 方法参数 + */ + private String methodArgs; + + /** + * 请求类型 + */ + private String requestMethod; + + /** + * 请求地址 + */ + private String requestUrl; + + /** + * 请求IP + */ + private String requestIp; + + /** + * 请求地址 + */ + private String address; + + /** + * 请求响应 + */ + private String responseResult; + + /** + * 状态 + */ + private Integer status; + + /** + * 错误日志 + */ + private String errorLog; + + /** + * 耗时(毫秒) + */ + private Long timeCost; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + protected LocalDateTime createTime; + +} diff --git a/server/src/main/java/com/xaaef/molly/system/entity/ServerInfo.java b/server/src/main/java/com/xaaef/molly/monitor/entity/ServerInfo.java similarity index 98% rename from server/src/main/java/com/xaaef/molly/system/entity/ServerInfo.java rename to server/src/main/java/com/xaaef/molly/monitor/entity/ServerInfo.java index 2161b7a..115182c 100644 --- a/server/src/main/java/com/xaaef/molly/system/entity/ServerInfo.java +++ b/server/src/main/java/com/xaaef/molly/monitor/entity/ServerInfo.java @@ -1,6 +1,5 @@ -package com.xaaef.molly.system.entity; +package com.xaaef.molly.monitor.entity; -import cn.hutool.core.date.DateUtil; import com.xaaef.molly.common.util.ArithUtils; import com.xaaef.molly.common.util.IpUtils; import com.xaaef.molly.common.util.JsonUtils; @@ -17,13 +16,10 @@ import oshi.software.os.OperatingSystem; import oshi.util.Util; import java.lang.management.ManagementFactory; -import java.net.UnknownHostException; import java.time.Duration; import java.time.Instant; -import java.time.Period; import java.time.ZoneId; import java.time.format.DateTimeFormatter; -import java.time.temporal.ChronoUnit; import java.util.LinkedList; import java.util.List; import java.util.Properties; diff --git a/server/src/main/java/com/xaaef/molly/monitor/mapper/LmsLoginLogMapper.java b/server/src/main/java/com/xaaef/molly/monitor/mapper/LmsLoginLogMapper.java new file mode 100644 index 0000000..9ce9767 --- /dev/null +++ b/server/src/main/java/com/xaaef/molly/monitor/mapper/LmsLoginLogMapper.java @@ -0,0 +1,19 @@ +package com.xaaef.molly.monitor.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.xaaef.molly.monitor.entity.LmsLoginLog; + +/** + *

+ * 登录日志 + *

+ * + * @author WangChenChen + * @version 1.1 + * @date 2023/2/6 15:28 + */ + +public interface LmsLoginLogMapper extends BaseMapper { + + +} diff --git a/server/src/main/java/com/xaaef/molly/monitor/mapper/LmsOperLogMapper.java b/server/src/main/java/com/xaaef/molly/monitor/mapper/LmsOperLogMapper.java new file mode 100644 index 0000000..9d8558f --- /dev/null +++ b/server/src/main/java/com/xaaef/molly/monitor/mapper/LmsOperLogMapper.java @@ -0,0 +1,20 @@ +package com.xaaef.molly.monitor.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.xaaef.molly.monitor.entity.LmsLoginLog; +import com.xaaef.molly.monitor.entity.LmsOperLog; + +/** + *

+ * 操作日志 + *

+ * + * @author WangChenChen + * @version 1.1 + * @date 2023/2/6 15:28 + */ + +public interface LmsOperLogMapper extends BaseMapper { + + +} diff --git a/server/src/main/java/com/xaaef/molly/monitor/service/LmsLoginLogService.java b/server/src/main/java/com/xaaef/molly/monitor/service/LmsLoginLogService.java new file mode 100644 index 0000000..27e40c6 --- /dev/null +++ b/server/src/main/java/com/xaaef/molly/monitor/service/LmsLoginLogService.java @@ -0,0 +1,22 @@ +package com.xaaef.molly.monitor.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.xaaef.molly.common.po.SearchPO; +import com.xaaef.molly.monitor.entity.LmsLoginLog; + +/** + *

+ * 登录日志 + *

+ * + * @author WangChenChen + * @version 1.1 + * @date 2023/2/6 15:28 + */ + +public interface LmsLoginLogService extends IService { + + IPage pageKeywords(SearchPO params); + +} diff --git a/server/src/main/java/com/xaaef/molly/monitor/service/LmsOperLogService.java b/server/src/main/java/com/xaaef/molly/monitor/service/LmsOperLogService.java new file mode 100644 index 0000000..1d5812d --- /dev/null +++ b/server/src/main/java/com/xaaef/molly/monitor/service/LmsOperLogService.java @@ -0,0 +1,22 @@ +package com.xaaef.molly.monitor.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.xaaef.molly.common.po.SearchPO; +import com.xaaef.molly.monitor.entity.LmsOperLog; + +/** + *

+ * 操作日志 + *

+ * + * @author WangChenChen + * @version 1.1 + * @date 2023/2/6 15:28 + */ + +public interface LmsOperLogService extends IService { + + IPage pageKeywords(SearchPO params); + +} diff --git a/server/src/main/java/com/xaaef/molly/monitor/service/impl/LmsLoginLogServiceImpl.java b/server/src/main/java/com/xaaef/molly/monitor/service/impl/LmsLoginLogServiceImpl.java new file mode 100644 index 0000000..3b7dd86 --- /dev/null +++ b/server/src/main/java/com/xaaef/molly/monitor/service/impl/LmsLoginLogServiceImpl.java @@ -0,0 +1,58 @@ +package com.xaaef.molly.monitor.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.xaaef.molly.common.po.SearchPO; +import com.xaaef.molly.monitor.entity.LmsLoginLog; +import com.xaaef.molly.monitor.mapper.LmsLoginLogMapper; +import com.xaaef.molly.monitor.service.LmsLoginLogService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; + +import static com.xaaef.molly.core.tenant.consts.MbpConst.CREATE_TIME; + +/** + *

+ * 登录日志 + *

+ * + * @author WangChenChen + * @version 1.1 + * @date 2023/2/6 15:28 + */ + +@Slf4j +@Service +@AllArgsConstructor +public class LmsLoginLogServiceImpl extends ServiceImpl implements LmsLoginLogService { + + + @Override + public IPage pageKeywords(SearchPO params) { + Page pageRequest = Page.of(params.getPageIndex(), params.getPageSize()); + var wrapper = new LambdaQueryWrapper(); + // 开始时间是否为空 + if (ObjectUtils.isNotEmpty(params.getStartDate())) { + // 如果结束时间是否为空 + if (ObjectUtils.isNotEmpty(params.getEndDate())) { + wrapper.between(LmsLoginLog::getCreateTime, params.getStartDate(), params.getEndDate()); + } else { + wrapper.between(LmsLoginLog::getCreateTime, params.getStartDate(), LocalDate.now()); + } + } + if (StringUtils.isNotBlank(params.getKeywords())) { + wrapper.like(LmsLoginLog::getCreateTime, params.getKeywords()); + } + return super.page(pageRequest, wrapper); + } + + +} diff --git a/server/src/main/java/com/xaaef/molly/monitor/service/impl/LmsOperLogServiceImpl.java b/server/src/main/java/com/xaaef/molly/monitor/service/impl/LmsOperLogServiceImpl.java new file mode 100644 index 0000000..6217a1e --- /dev/null +++ b/server/src/main/java/com/xaaef/molly/monitor/service/impl/LmsOperLogServiceImpl.java @@ -0,0 +1,56 @@ +package com.xaaef.molly.monitor.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.xaaef.molly.common.po.SearchPO; +import com.xaaef.molly.monitor.entity.LmsLoginLog; +import com.xaaef.molly.monitor.entity.LmsOperLog; +import com.xaaef.molly.monitor.mapper.LmsOperLogMapper; +import com.xaaef.molly.monitor.service.LmsOperLogService; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.time.LocalDate; + +/** + *

+ * 操作日志 + *

+ * + * @author WangChenChen + * @version 1.1 + * @date 2023/2/6 15:28 + */ + +@Slf4j +@Service +@AllArgsConstructor +public class LmsOperLogServiceImpl extends ServiceImpl implements LmsOperLogService { + + + @Override + public IPage pageKeywords(SearchPO params) { + Page pageRequest = Page.of(params.getPageIndex(), params.getPageSize()); + var wrapper = new LambdaQueryWrapper(); + // 开始时间是否为空 + if (ObjectUtils.isNotEmpty(params.getStartDate())) { + // 如果结束时间是否为空 + if (ObjectUtils.isNotEmpty(params.getEndDate())) { + wrapper.between(LmsOperLog::getCreateTime, params.getStartDate(), params.getEndDate()); + } else { + wrapper.between(LmsOperLog::getCreateTime, params.getStartDate(), LocalDate.now()); + } + } + if (StringUtils.isNotBlank(params.getKeywords())) { + wrapper.like(LmsOperLog::getCreateTime, params.getKeywords()); + } + return super.page(pageRequest, wrapper); + } + + +} diff --git a/server/src/main/java/com/xaaef/molly/monitor/service/impl/LogStorageServiceImpl.java b/server/src/main/java/com/xaaef/molly/monitor/service/impl/LogStorageServiceImpl.java new file mode 100644 index 0000000..deefb3d --- /dev/null +++ b/server/src/main/java/com/xaaef/molly/monitor/service/impl/LogStorageServiceImpl.java @@ -0,0 +1,61 @@ +package com.xaaef.molly.monitor.service.impl; + +import com.xaaef.molly.common.util.JsonUtils; +import com.xaaef.molly.core.log.domain.LoginLog; +import com.xaaef.molly.core.log.domain.OperLog; +import com.xaaef.molly.core.log.service.LogStorageService; +import com.xaaef.molly.monitor.entity.LmsLoginLog; +import com.xaaef.molly.monitor.entity.LmsOperLog; +import com.xaaef.molly.monitor.mapper.LmsLoginLogMapper; +import com.xaaef.molly.monitor.mapper.LmsOperLogMapper; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeanUtils; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + + +/** + *

+ * 日志 + *

+ * + * @author Wang Chen Chen + * @version 1.0.1 + * @date 2021/8/17 16:18 + */ + + +@Slf4j +@Component +@AllArgsConstructor +public class LogStorageServiceImpl implements LogStorageService { + + private final LmsLoginLogMapper loginLogMapper; + + private final LmsOperLogMapper operLogMapper; + + + @Async + @Override + public void asyncLoginSave(LoginLog loginLog) { + var target = new LmsLoginLog(); + BeanUtils.copyProperties(loginLog, target); + loginLogMapper.insert(target); + // log.info("登录日志: \n{}", JsonUtils.toFormatJson(target)); + } + + + @Async + @Override + public void asyncOperateSave(OperLog operLog) { + var target = new LmsOperLog(); + BeanUtils.copyProperties(operLog, target); + target.setResponseResult(JsonUtils.toJson(operLog.getResponseResult())); + target.setMethodArgs(JsonUtils.toJson(operLog.getMethodArgs())); + operLogMapper.insert(target); + // log.info("操作日志: \n{}", JsonUtils.toFormatJson(target)); + } + + +} diff --git a/server/src/main/resources/db/changelog-master.xml b/server/src/main/resources/db/changelog-master.xml index 543b176..ff43858 100644 --- a/server/src/main/resources/db/changelog-master.xml +++ b/server/src/main/resources/db/changelog-master.xml @@ -5,14 +5,13 @@ xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog https://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsd"> - + - diff --git a/server/src/main/resources/db/changelog-other.xml b/server/src/main/resources/db/changelog-other.xml index 4ecbf26..993968c 100644 --- a/server/src/main/resources/db/changelog-other.xml +++ b/server/src/main/resources/db/changelog-other.xml @@ -6,5 +6,6 @@ https://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsd"> + diff --git a/server/src/main/resources/db/changelog/lms.xml b/server/src/main/resources/db/changelog/lms.xml new file mode 100644 index 0000000..fc9a963 --- /dev/null +++ b/server/src/main/resources/db/changelog/lms.xml @@ -0,0 +1,59 @@ + + + + + + + + CREATE TABLE `lms_oper_log` + ( + `id` bigint(20) NOT NULL COMMENT 'ID', + `title` varchar(255) NOT NULL COMMENT '标题', + `description` varchar(255) NOT NULL COMMENT '描述', + `service_name` varchar(255) NOT NULL COMMENT '服务名称', + `user_id` bigint(20) COMMENT '用户ID', + `method` varchar(255) NOT NULL COMMENT '方法', + `method_args` text COMMENT '方法参数', + `request_method` varchar(255) COMMENT '请求类型', + `request_url` varchar(255) COMMENT '请求地址', + `request_ip` varchar(255) COMMENT '请求IP', + `address` varchar(255) COMMENT '请求地址', + `response_result` text COMMENT '请求响应', + `status` int(11) NOT NULL COMMENT '状态', + `error_log` text COMMENT '错误日志', + `time_cost` bigint(20) NOT NULL COMMENT '耗时(毫秒)', + `create_time` datetime NOT NULL COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='[ 日志 ] 操作日志'; + + + + + + + + CREATE TABLE `lms_login_log` + ( + `id` bigint(20) NOT NULL COMMENT 'ID', + `grant_type` varchar(255) NOT NULL COMMENT '授权类型', + `user_id` bigint(20) NOT NULL COMMENT '用户ID', + `nickname` varchar(255) NOT NULL COMMENT '用户昵称', + `username` varchar(255) NOT NULL COMMENT '用户名', + `avatar` varchar(255) NOT NULL COMMENT '头像', + `request_url` varchar(255) NOT NULL COMMENT '请求地址', + `request_ip` varchar(255) NOT NULL COMMENT '请求IP', + `address` varchar(255) NOT NULL COMMENT '请求地址', + `os_name` varchar(255) COMMENT '操作系统', + `browser` varchar(255) COMMENT '浏览器', + `create_time` datetime NOT NULL COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='[ 日志 ] 登录日志'; + + + + + diff --git a/server/src/main/resources/db/changelog/sql/sys_menu.sql b/server/src/main/resources/db/changelog/sql/sys_menu.sql index 9e462c5..dd672ff 100644 --- a/server/src/main/resources/db/changelog/sql/sys_menu.sql +++ b/server/src/main/resources/db/changelog/sql/sys_menu.sql @@ -41,7 +41,6 @@ INSERT INTO `sys_menu` VALUES (10018, '视图', 10004, 'pre_user:view', '#', '', INSERT INTO `sys_menu` VALUES (10019, '修改', 10004, 'pre_user:update', '#', '', '', 3, 1, 1, 2, '2022-06-25 15:03:42', 19980817, '2022-06-25 15:03:42', 19980817); INSERT INTO `sys_menu` VALUES (10020, '删除', 10004, 'pre_user:delete', '#', '', '', 4, 1, 1, 2, '2022-06-25 15:03:42', 19980817, '2022-06-25 15:03:42', 19980817); INSERT INTO `sys_menu` VALUES (10021, '重置密码', 10004, 'pre_user:reset:password', '#', '', '', 5, 1, 1, 2, '2022-06-25 15:03:42', 19980817, '2022-06-25 15:03:42', 19980817); -INSERT INTO `sys_menu` VALUES (10022, '修改角色', 10004, 'pre_user:update:roles', '#', '', '', 6, 1, 1, 2, '2022-06-25 15:03:42', 19980817, '2022-06-25 15:03:42', 19980817); INSERT INTO `sys_menu` VALUES (10023, '视图', 10005, 'pre_role:view', '#', '', '', 1, 1, 1, 2, '2022-06-25 15:03:42', 19980817, '2022-06-25 15:03:42', 19980817); INSERT INTO `sys_menu` VALUES (10024, '新增', 10005, 'pre_role:create', '#', '', '', 2, 1, 1, 2, '2022-06-25 15:03:42', 19980817, '2022-06-25 15:03:42', 19980817); INSERT INTO `sys_menu` VALUES (10025, '修改', 10005, 'pre_role:update', '#', '', '', 3, 1, 1, 2, '2022-06-25 15:03:42', 19980817, '2022-06-25 15:03:42', 19980817); @@ -56,7 +55,6 @@ INSERT INTO `sys_menu` VALUES (10033, '新增', 10006, 'pre_menu:create', '#', ' INSERT INTO `sys_menu` VALUES (10034, '修改', 10006, 'pre_menu:update', '#', '', '', 3, 1, 1, 1, '2022-06-25 15:03:42', 19980817, '2022-06-27 20:39:53', 19980817); INSERT INTO `sys_menu` VALUES (10035, '删除', 10006, 'pre_menu:delete', '#', '', '', 4, 1, 1, 1, '2022-06-25 15:03:42', 19980817, '2022-06-27 20:39:25', 19980817); INSERT INTO `sys_menu` VALUES (10036, '字典数据', 10001, 'sys:dict:data', 'sys/dict/dictData', '#', '/sys/dict/data', 7, 0, 0, 1, '2022-06-27 20:36:39', 19980817, '2022-06-30 12:10:50', 19980817); -INSERT INTO `sys_menu` VALUES (10037, '新增租户', 10016, 'sys:tenant:create:link', 'sys/tenant/createTenant', 'sys', '/sys/tenant/create', 1, 0, 0, 1, '2022-06-27 21:28:41', 19980817, '2022-06-27 21:28:41', 19980817); INSERT INTO `sys_menu` VALUES (10038, '数据统计', 0, 'statistics', 'Layout', 'statistics', '/statistics', 1, 0, 1, 2, '2022-07-30 18:17:42', 19980817, '2022-07-30 18:17:42', 19980817); INSERT INTO `sys_menu` VALUES (10039, '能耗统计', 10038, 'statistics:energy', 'statistics/energy/index', 'statistics_energy', '/statistics/energy', 5, 0, 1, 2, '2022-07-30 18:18:27', 19980817, '2022-07-30 18:18:27', 19980817); INSERT INTO `sys_menu` VALUES (10040, '趋势分析', 10038, 'statistics:trend', 'statistics/trend/index', 'statistics_trend', '/statistics/trend', 10, 0, 1, 2, '2022-07-30 18:19:12', 19980817, '2022-07-30 18:19:12', 19980817); diff --git a/server/src/main/resources/db/changelog/sys.xml b/server/src/main/resources/db/changelog/sys.xml index 6a16f75..f46c7e8 100644 --- a/server/src/main/resources/db/changelog/sys.xml +++ b/server/src/main/resources/db/changelog/sys.xml @@ -243,4 +243,5 @@ +