From f4aa42aa10669b07b8daa08f56055f5ffde2b068 Mon Sep 17 00:00:00 2001 From: laker <935009066@qq.com> Date: Tue, 17 Aug 2021 11:10:18 +0800 Subject: [PATCH] =?UTF-8?q?(=E6=96=B0=E5=A2=9E)[=E5=90=8E=E7=AB=AF](?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=99=BB=E5=BD=95=E9=AA=8C=E8=AF=81=E7=A0=81?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 15 ++++-- pom.xml | 1 + run.sh | 6 +-- .../laker/admin/framework/aop/Metrics.java | 14 ++++++ .../admin/framework/aop/MetricsAspect.java | 36 ++++++++++++-- .../ext/controller/ExtLogController.java | 10 +++- .../laker/admin/module/ext/entity/ExtLog.java | 11 ++++- .../flow/SnakerflowFacetsController.java | 4 ++ .../sys/controller/LoginController.java | 8 +++- .../admin/module/sys/controller/LoginDto.java | 7 ++- .../sys/controller/SysDeptController.java | 2 + .../sys/controller/SysDictController.java | 2 + .../sys/controller/SysMenuController.java | 2 + .../sys/controller/SysRoleController.java | 2 + .../sys/controller/SysUserController.java | 10 ++++ .../sys/controller/WebLogController.java | 7 ++- .../sys/service/impl/SysMenuServiceImpl.java | 2 +- .../utils/http/HttpServletRequestUtil.java | 15 ++++++ src/main/resources/application.yaml | 6 --- src/main/resources/logback.xml | 18 +++++-- .../java/com/laker/admin/service/Test.java | 11 +++++ web/admin/view/ext/log.html | 47 ++++++++++--------- web/admin/view/system/user/edit.html | 7 --- 23 files changed, 183 insertions(+), 60 deletions(-) create mode 100644 src/main/java/com/laker/admin/framework/aop/Metrics.java create mode 100644 src/test/java/com/laker/admin/service/Test.java diff --git a/README.md b/README.md index f004462..5c14b48 100644 --- a/README.md +++ b/README.md @@ -2,11 +2,11 @@ #### 介绍 -**easy**,**easy**,**easy**,打造一个**简单**、**轻量级**的**后台管理系统脚手架**。目前使用的技术都是相对较轻量级、上手很容易的技术。例如:**Spring Boot**、**hutool-all**、**mybatis-plus** 、**knife4j** 、**sa-token**、**javamelody** 、**snakerflow** 等。**后续的发展方向也是把目标对准中小型项目**,**提炼简单高效架构**。 +**easy**,**easy**,**easy**,打造一款**简单**、**轻量级**的**后台管理系统脚手架**。目前使用的技术都是相对较轻量级、上手很容易的技术。例如:**Spring Boot**、**hutool-all**、**mybatis-plus** 、**knife4j** 、**sa-token**、**javamelody** 、**snakerflow** 等。**后续的发展方向也是把目标对准中小型项目**,**提炼简单高效架构**。 -**适合场景:**`学生学习`、`前后端项目练手`、`接私活快速开发`、`中小型企业脚手架`、`Spring Boot深度扩展学习`等 +**适合场景:学生学习、前后端项目练手、私活快速开发、中小型企业脚手架、Spring Boot深度扩展学习**等 -项目架构灵活多变,内置前后端代码生成,可前后端分离,也可以一体化开发。 +**项目架构灵活多变**,**内置前后端代码生成**,**开发模式**支持**前后端分离**和**不分离**模式,**部署模式支持多种方式**:**Fat.jar模式**、**Nginx反向代理**、**Nginx正向代理**。 **项目地址**:[https://gitee.com/lakernote/easy-admin](https://gitee.com/lakernote/easy-admin) @@ -21,7 +21,11 @@ #### 在线演示 -暂时无服务器。。。尬住了 +**地址**:[http://101.132.189.23/admin/login.html](http://101.132.189.23/admin/login.html) + +**用户名/密码**:laker/lakernote + +> 当前处于开发阶段,由于我前端技术小白水平,开发进度较慢,还有很多功能未开发完成,有想一起开发的小伙伴,请加vx【**lakernote**】联系我。 #### 软件架构 @@ -216,4 +220,5 @@ web ----login.html ``` -浏览器访问`http://ip:port/admin` \ No newline at end of file +浏览器访问`http://ip:port/admin` + diff --git a/pom.xml b/pom.xml index c9e2949..115f493 100644 --- a/pom.xml +++ b/pom.xml @@ -11,6 +11,7 @@ 4.0.0 easy-admin + 1.0.0 diff --git a/run.sh b/run.sh index 80ff67c..b770ef5 100644 --- a/run.sh +++ b/run.sh @@ -1,9 +1,9 @@ #!/bin/bash -AppName=ruoyi.jar +AppName=easy-admin-1.0.0.jar #JVM参数 -JVM_OPTS="-Dname=$AppName -Duser.timezone=Asia/Shanghai -Xms512M -Xmx512M -XX:PermSize=256M -XX:MaxPermSize=512M -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30 -XX:+UseParallelGC -XX:+UseParallelOldGC" +JVM_OPTS="-Dname=$AppName -Duser.timezone=Asia/Shanghai -Xms100M -Xmx100M -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30 -XX:+UseParallelGC -XX:+UseParallelOldGC" APP_HOME=`pwd` LOG_PATH=$APP_HOME/logs/$AppName.log @@ -26,7 +26,7 @@ function start() if [ x"$PID" != x"" ]; then echo "$AppName is running..." else - nohup java -jar $JVM_OPTS $AppName > /dev/null 2>&1 & + nohup java -jar $JVM_OPTS $AppName & echo "Start $AppName success..." fi } diff --git a/src/main/java/com/laker/admin/framework/aop/Metrics.java b/src/main/java/com/laker/admin/framework/aop/Metrics.java new file mode 100644 index 0000000..f1bc5c9 --- /dev/null +++ b/src/main/java/com/laker/admin/framework/aop/Metrics.java @@ -0,0 +1,14 @@ + +package com.laker.admin.framework.aop; + +import java.lang.annotation.*; + +/** + * @author laker + */ +@Target({ElementType.TYPE, ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface Metrics { + +} diff --git a/src/main/java/com/laker/admin/framework/aop/MetricsAspect.java b/src/main/java/com/laker/admin/framework/aop/MetricsAspect.java index 75462be..97a2697 100644 --- a/src/main/java/com/laker/admin/framework/aop/MetricsAspect.java +++ b/src/main/java/com/laker/admin/framework/aop/MetricsAspect.java @@ -1,6 +1,10 @@ package com.laker.admin.framework.aop; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.util.StrUtil; import com.fasterxml.jackson.databind.ObjectMapper; +import com.laker.admin.module.ext.entity.ExtLog; +import com.laker.admin.module.ext.service.IExtLogService; import com.laker.admin.utils.http.HttpServletRequestUtil; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.ProceedingJoinPoint; @@ -15,37 +19,59 @@ import org.springframework.stereotype.Component; import java.time.Duration; import java.time.Instant; +import java.time.LocalDateTime; /** * Bean的优先级设置为最高 */ @Aspect -//@Component +@Component @Slf4j @Order(Ordered.HIGHEST_PRECEDENCE) public class MetricsAspect { @Autowired ObjectMapper objectMapper; + @Autowired + IExtLogService extLogService; - @Pointcut("@within(org.springframework.web.bind.annotation.RestController)") - public void withAnnotationRestController() { + @Pointcut("@annotation(Metrics) || @within(Metrics)") + public void withAnnotationMetrics() { } - @Around("withAnnotationRestController()") + @Around("withAnnotationMetrics()") public Object metrics(ProceedingJoinPoint pjp) throws Throwable { MethodSignature signature = (MethodSignature) pjp.getSignature(); String name = signature.toShortString(); Object returnValue; Instant start = Instant.now(); + ExtLog logBean = new ExtLog(); + logBean.setIp(HttpServletRequestUtil.getRemoteAddress()); + logBean.setUri(HttpServletRequestUtil.getRequestURI()); + logBean.setUserId(StpUtil.isLogin() ? StpUtil.getLoginIdAsLong() : null); + logBean.setClient(HttpServletRequestUtil.getRequestUserAgent()); + logBean.setRequest(objectMapper.writeValueAsString(pjp.getArgs())); + logBean.setMethod(name); + logBean.setStatus(true); try { returnValue = pjp.proceed(); } catch (Exception ex) { log.info("method:{},fail,cost:{}ms,uri:{},param:{}", name, Duration.between(start, Instant.now()).toMillis(), HttpServletRequestUtil.getRequestURI(), objectMapper.writeValueAsString(pjp.getArgs())); + logBean.setCost((int) Duration.between(start, Instant.now()).toMillis()); + logBean.setCreateTime(LocalDateTime.now()); + logBean.setStatus(false); + extLogService.save(logBean); log.error(name, ex); throw ex; } - log.info("method:{},success,cost:{}ms,uri:{},param:{},return:{}", name, Duration.between(start, Instant.now()).toMillis(), HttpServletRequestUtil.getRequestURI(), objectMapper.writeValueAsString(pjp.getArgs()), objectMapper.writeValueAsString(returnValue)); + String response = objectMapper.writeValueAsString(returnValue); + log.info("method:{},success,cost:{}ms,uri:{},param:{},return:{}", name, Duration.between(start, Instant.now()).toMillis(), HttpServletRequestUtil.getRequestURI(), objectMapper.writeValueAsString(pjp.getArgs()), response); + logBean.setCost((int) Duration.between(start, Instant.now()).toMillis()); + logBean.setCreateTime(LocalDateTime.now()); + if (StrUtil.isNotBlank(response) && response.length() <= 500) { + logBean.setResponse(response); + } + extLogService.save(logBean); return returnValue; } } diff --git a/src/main/java/com/laker/admin/module/ext/controller/ExtLogController.java b/src/main/java/com/laker/admin/module/ext/controller/ExtLogController.java index af4b285..15102ec 100644 --- a/src/main/java/com/laker/admin/module/ext/controller/ExtLogController.java +++ b/src/main/java/com/laker/admin/module/ext/controller/ExtLogController.java @@ -1,11 +1,13 @@ package com.laker.admin.module.ext.controller; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.laker.admin.framework.PageResponse; import com.laker.admin.framework.Response; +import com.laker.admin.framework.aop.Metrics; import com.laker.admin.module.ext.entity.ExtLog; import com.laker.admin.module.ext.service.IExtLogService; import io.swagger.annotations.ApiOperation; @@ -22,6 +24,7 @@ import org.springframework.web.bind.annotation.*; */ @RestController @RequestMapping("/ext/log") +@Metrics public class ExtLogController { @Autowired IExtLogService extLogService; @@ -29,9 +32,14 @@ public class ExtLogController { @GetMapping @ApiOperation(value = "日志分页查询") public PageResponse pageAll(@RequestParam(required = false, defaultValue = "1") long page, - @RequestParam(required = false, defaultValue = "10") long limit) { + @RequestParam(required = false, defaultValue = "10") long limit, + String keyWord) { Page roadPage = new Page<>(page, limit); LambdaQueryWrapper queryWrapper = new QueryWrapper().lambda(); + if (StrUtil.isNotBlank(keyWord)) { + queryWrapper.like(ExtLog::getRequest, keyWord); + } + queryWrapper.orderByDesc(ExtLog::getCreateTime); Page pageList = extLogService.page(roadPage, queryWrapper); return PageResponse.ok(pageList.getRecords(), pageList.getTotal()); } diff --git a/src/main/java/com/laker/admin/module/ext/entity/ExtLog.java b/src/main/java/com/laker/admin/module/ext/entity/ExtLog.java index 2efb58d..c3f789f 100644 --- a/src/main/java/com/laker/admin/module/ext/entity/ExtLog.java +++ b/src/main/java/com/laker/admin/module/ext/entity/ExtLog.java @@ -2,11 +2,13 @@ package com.laker.admin.module.ext.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; -import java.time.LocalDateTime; -import java.io.Serializable; +import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import lombok.EqualsAndHashCode; +import java.io.Serializable; +import java.time.LocalDateTime; + /** *

* 日志 @@ -41,6 +43,8 @@ public class ExtLog implements Serializable { * 浏览器或者app信息 */ private String client; + private String uri; + private String method; /** * 请求 @@ -52,6 +56,8 @@ public class ExtLog implements Serializable { */ private String response; + private Boolean status; + /** * 耗时ms */ @@ -60,6 +66,7 @@ public class ExtLog implements Serializable { /** * 创建时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime createTime; diff --git a/src/main/java/com/laker/admin/module/flow/SnakerflowFacetsController.java b/src/main/java/com/laker/admin/module/flow/SnakerflowFacetsController.java index 4cad461..ff28488 100644 --- a/src/main/java/com/laker/admin/module/flow/SnakerflowFacetsController.java +++ b/src/main/java/com/laker/admin/module/flow/SnakerflowFacetsController.java @@ -6,6 +6,7 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import com.laker.admin.framework.PageResponse; import com.laker.admin.framework.Response; +import com.laker.admin.framework.aop.Metrics; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; @@ -42,6 +43,7 @@ public class SnakerflowFacetsController { @GetMapping("/process/modelJson") @ApiOperation(value = "根据流程定义名称获取流程定义json", tags = "流程引擎-流程") + @Metrics public String getProcess(@RequestParam(required = false) String processId) { if (StrUtil.isBlank(processId)) { return ""; @@ -80,6 +82,7 @@ public class SnakerflowFacetsController { */ @ApiOperation(value = "根据流程定义ID,删除流程定义", tags = "流程引擎-流程") @RequestMapping(value = "/process/delete/{id}", method = RequestMethod.GET) + @Metrics public Response processDelete(@PathVariable("id") String id) { snakerEngineFacets.getEngine().process().undeploy(id); return Response.ok(); @@ -121,6 +124,7 @@ public class SnakerflowFacetsController { @ApiOperation(value = "流程定义+流程状态", tags = "流程引擎-流程") @RequestMapping(value = "/process/json", method = RequestMethod.GET) + @Metrics public Object json(String processId, String orderId) { Process process = snakerEngineFacets.getEngine().process().getProcessById(processId); AssertHelper.notNull(process); diff --git a/src/main/java/com/laker/admin/module/sys/controller/LoginController.java b/src/main/java/com/laker/admin/module/sys/controller/LoginController.java index bdcbf06..432d04a 100644 --- a/src/main/java/com/laker/admin/module/sys/controller/LoginController.java +++ b/src/main/java/com/laker/admin/module/sys/controller/LoginController.java @@ -3,10 +3,12 @@ package com.laker.admin.module.sys.controller; import cn.dev33.satoken.annotation.SaCheckLogin; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.SecureUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import com.github.xiaoymin.knife4j.annotations.ApiSupport; import com.laker.admin.framework.Response; +import com.laker.admin.framework.aop.Metrics; import com.laker.admin.framework.cache.ICache; import com.laker.admin.module.sys.entity.SysUser; import com.laker.admin.module.sys.service.ISysUserService; @@ -14,6 +16,7 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; 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.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -23,6 +26,7 @@ import org.springframework.web.bind.annotation.RestController; @ApiSupport(order = 2) @RestController @Slf4j +@Metrics public class LoginController { @Autowired @@ -33,7 +37,7 @@ public class LoginController { @PostMapping("/api/v1/login") @ApiOperationSupport(order = 1) @ApiOperation(value = "登录") - public Response login(@RequestBody LoginDto loginDto) { + public Response login(@Validated @RequestBody LoginDto loginDto) { log.info("login {}", loginDto); // 验证码是否正确 String code = iCache.get(loginDto.getUid()); @@ -43,7 +47,7 @@ public class LoginController { // 单机版:在map中创建了会话,token id等映射关系 // 写入cookie SysUser sysUser = sysUserService.getOne(Wrappers.lambdaQuery() .eq(SysUser::getUserName, loginDto.getUsername()) - .eq(SysUser::getPassword, loginDto.getPassword())); + .eq(SysUser::getPassword, SecureUtil.sha256(loginDto.getPassword()))); if (sysUser == null) { return Response.error("5001", "用户名或密码不正确"); } diff --git a/src/main/java/com/laker/admin/module/sys/controller/LoginDto.java b/src/main/java/com/laker/admin/module/sys/controller/LoginDto.java index 5e5b5ed..ce639f7 100644 --- a/src/main/java/com/laker/admin/module/sys/controller/LoginDto.java +++ b/src/main/java/com/laker/admin/module/sys/controller/LoginDto.java @@ -2,14 +2,19 @@ package com.laker.admin.module.sys.controller; import lombok.Data; +import javax.validation.constraints.NotBlank; + /** * @author laker */ @Data public class LoginDto { - + @NotBlank(message = "用户名不能为空") private String username; + @NotBlank(message = "密码不能为空") private String password; + @NotBlank(message = "验证码不能为空") private String captchaCode; + @NotBlank(message = "验证码Id不能为空") private String uid; } diff --git a/src/main/java/com/laker/admin/module/sys/controller/SysDeptController.java b/src/main/java/com/laker/admin/module/sys/controller/SysDeptController.java index 37d372f..a6f5b2e 100644 --- a/src/main/java/com/laker/admin/module/sys/controller/SysDeptController.java +++ b/src/main/java/com/laker/admin/module/sys/controller/SysDeptController.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.laker.admin.framework.Response; import com.laker.admin.framework.ResultTable; import com.laker.admin.framework.ResultTree; +import com.laker.admin.framework.aop.Metrics; import com.laker.admin.module.sys.entity.SysDept; import com.laker.admin.module.sys.service.ISysDeptService; import io.swagger.annotations.ApiOperation; @@ -24,6 +25,7 @@ import java.util.List; */ @RestController @RequestMapping("/sys/dept") +@Metrics public class SysDeptController { @Autowired ISysDeptService sysDeptService; diff --git a/src/main/java/com/laker/admin/module/sys/controller/SysDictController.java b/src/main/java/com/laker/admin/module/sys/controller/SysDictController.java index 23c0a62..9edb652 100644 --- a/src/main/java/com/laker/admin/module/sys/controller/SysDictController.java +++ b/src/main/java/com/laker/admin/module/sys/controller/SysDictController.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.laker.admin.framework.PageResponse; import com.laker.admin.framework.Response; +import com.laker.admin.framework.aop.Metrics; import com.laker.admin.module.sys.entity.SysDict; import com.laker.admin.module.sys.service.ISysDictService; import io.swagger.annotations.ApiOperation; @@ -22,6 +23,7 @@ import org.springframework.web.bind.annotation.*; */ @RestController @RequestMapping("/sys/dict") +@Metrics public class SysDictController { @Autowired ISysDictService sysDictService; diff --git a/src/main/java/com/laker/admin/module/sys/controller/SysMenuController.java b/src/main/java/com/laker/admin/module/sys/controller/SysMenuController.java index 7dfbe68..efabc58 100644 --- a/src/main/java/com/laker/admin/module/sys/controller/SysMenuController.java +++ b/src/main/java/com/laker/admin/module/sys/controller/SysMenuController.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.laker.admin.framework.Response; +import com.laker.admin.framework.aop.Metrics; import com.laker.admin.module.sys.entity.SysMenu; import com.laker.admin.module.sys.pojo.MenuVo; import com.laker.admin.module.sys.service.ISysMenuService; @@ -24,6 +25,7 @@ import java.util.List; */ @RestController @RequestMapping("/sys/menu") +@Metrics public class SysMenuController { @Autowired ISysMenuService sysMenuService; diff --git a/src/main/java/com/laker/admin/module/sys/controller/SysRoleController.java b/src/main/java/com/laker/admin/module/sys/controller/SysRoleController.java index 053864f..ac69d04 100644 --- a/src/main/java/com/laker/admin/module/sys/controller/SysRoleController.java +++ b/src/main/java/com/laker/admin/module/sys/controller/SysRoleController.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.laker.admin.framework.PageResponse; import com.laker.admin.framework.Response; import com.laker.admin.framework.ResultTree; +import com.laker.admin.framework.aop.Metrics; import com.laker.admin.module.sys.entity.SysMenu; import com.laker.admin.module.sys.entity.SysRole; import com.laker.admin.module.sys.entity.SysRolePower; @@ -31,6 +32,7 @@ import java.util.List; */ @RestController @RequestMapping("/sys/role") +@Metrics public class SysRoleController { @Autowired ISysRoleService sysRoleService; diff --git a/src/main/java/com/laker/admin/module/sys/controller/SysUserController.java b/src/main/java/com/laker/admin/module/sys/controller/SysUserController.java index aeb354f..e417dfc 100644 --- a/src/main/java/com/laker/admin/module/sys/controller/SysUserController.java +++ b/src/main/java/com/laker/admin/module/sys/controller/SysUserController.java @@ -1,12 +1,15 @@ package com.laker.admin.module.sys.controller; +import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.util.StrUtil; +import cn.hutool.crypto.SecureUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.laker.admin.framework.PageResponse; import com.laker.admin.framework.Response; +import com.laker.admin.framework.aop.Metrics; import com.laker.admin.module.sys.entity.SysRole; import com.laker.admin.module.sys.entity.SysUser; import com.laker.admin.module.sys.entity.SysUserRole; @@ -33,6 +36,7 @@ import java.util.List; */ @RestController @RequestMapping("/sys/user") +@Metrics public class SysUserController { @Autowired ISysUserService sysUserService; @@ -64,6 +68,12 @@ public class SysUserController { public Response saveOrUpdate(@RequestBody SysUser param) { if (param.getUserId() == null) { + // 只有超级管理员才能创建用户 + if (StpUtil.getLoginIdAsLong() != 1L) { + return Response.error("403", "只有超级管理员才能创建用户!"); + } + String password = param.getPassword(); + param.setPassword(SecureUtil.sha256(password)); param.setCreateTime(LocalDateTime.now()); sysUserService.save(param); if (StrUtil.isNotBlank(param.getRoleIds())) { diff --git a/src/main/java/com/laker/admin/module/sys/controller/WebLogController.java b/src/main/java/com/laker/admin/module/sys/controller/WebLogController.java index e7655a6..1de2f47 100644 --- a/src/main/java/com/laker/admin/module/sys/controller/WebLogController.java +++ b/src/main/java/com/laker/admin/module/sys/controller/WebLogController.java @@ -9,10 +9,11 @@ import org.springframework.boot.logging.LoggerGroups; import org.springframework.boot.logging.LoggingSystem; import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.Resource; +import org.springframework.stereotype.Controller; 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 org.springframework.web.bind.annotation.ResponseBody; import java.io.File; @@ -24,7 +25,7 @@ import java.io.File; * @author laker * @since 2021-08-05 */ -@RestController +@Controller @RequestMapping("/sys/weblog") public class WebLogController { @Autowired @@ -36,6 +37,7 @@ public class WebLogController { @GetMapping(value = "/file", produces = "text/plain; charset=UTF-8") + @ResponseBody public Resource logFile(@RequestParam(required = false) String filePath) { String lookFilePath = lakerConfig.getLogFilePath(); if (StrUtil.isNotBlank(filePath)) { @@ -49,6 +51,7 @@ public class WebLogController { } @RequestMapping(value = "/level") //动态设置日志级别 + @ResponseBody public String configureLogLevel(String name, LogLevel configuredLevel) { if (StrUtil.isBlank(name)) { return "请输入日志名称"; diff --git a/src/main/java/com/laker/admin/module/sys/service/impl/SysMenuServiceImpl.java b/src/main/java/com/laker/admin/module/sys/service/impl/SysMenuServiceImpl.java index 66ea3a1..a130c0b 100644 --- a/src/main/java/com/laker/admin/module/sys/service/impl/SysMenuServiceImpl.java +++ b/src/main/java/com/laker/admin/module/sys/service/impl/SysMenuServiceImpl.java @@ -70,7 +70,7 @@ public class SysMenuServiceImpl extends ServiceImpl impl List roleIds = userRoles.stream().map(sysUserRole -> sysUserRole.getRoleId()).collect(Collectors.toList()); List rolePowerLists = sysRolePowerService.list(Wrappers.lambdaQuery().in(SysRolePower::getRoleId, roleIds)); List powerIds = rolePowerLists.stream().map(sysRolePower -> sysRolePower.getPowerId()).collect(Collectors.toList()); - return menuService.list(Wrappers.lambdaQuery().in(SysMenu::getMenuId, powerIds).eq(SysMenu::getEnable, true).orderByDesc(SysMenu::getSort)); + return menuService.list(Wrappers.lambdaQuery().in(SysMenu::getMenuId, powerIds).eq(SysMenu::getEnable, true).orderByAsc(SysMenu::getSort)); } } diff --git a/src/main/java/com/laker/admin/utils/http/HttpServletRequestUtil.java b/src/main/java/com/laker/admin/utils/http/HttpServletRequestUtil.java index e02450d..609a715 100644 --- a/src/main/java/com/laker/admin/utils/http/HttpServletRequestUtil.java +++ b/src/main/java/com/laker/admin/utils/http/HttpServletRequestUtil.java @@ -1,6 +1,9 @@ package com.laker.admin.utils.http; import cn.hutool.core.util.StrUtil; +import cn.hutool.http.useragent.UserAgent; +import cn.hutool.http.useragent.UserAgentUtil; +import cn.hutool.json.JSONUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.util.StreamUtils; import org.springframework.util.StringUtils; @@ -46,6 +49,18 @@ public class HttpServletRequestUtil { } + /** + * 获取getRequestURI + * + * @return + */ + public static String getRequestUserAgent() { + HttpServletRequest request = getRequest(); + UserAgent userAgent = UserAgentUtil.parse(request.getHeader("User-Agent")); + return JSONUtil.toJsonStr(userAgent); + + } + public static String getRemoteAddress() { HttpServletRequest request = getRequest(); if (request == null) { diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 93236b9..6bea1f1 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -22,12 +22,6 @@ spring: thread-name-prefix: laker- freemarker: suffix: .ftl -logging: - file: - max-size: 10MB - max-history: 50 - name: laker.log - path: ./ mybatis-plus: type-aliases-package: org.snaker.engine.entity knife4j: diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index bbccb81..e1f5452 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -1,21 +1,31 @@ - + + ${LOG_HOME}/laker.log true false + %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{50} %line - %m%n + + ${ENCODING} - - ${LOG_HOME}/test.log.%d{yyyy-MM-dd} - + + ${LOG_HOME}/laker-%d{yyyy-MM-dd}-%i.log + 15 + + 20GB + + + 10MB + diff --git a/src/test/java/com/laker/admin/service/Test.java b/src/test/java/com/laker/admin/service/Test.java new file mode 100644 index 0000000..508ed56 --- /dev/null +++ b/src/test/java/com/laker/admin/service/Test.java @@ -0,0 +1,11 @@ +package com.laker.admin.service; + +import cn.hutool.crypto.SecureUtil; + +public class Test { + + public static void main(String[] args) { + String s = SecureUtil.sha256("lakernote"); + System.out.println(s); + } +} diff --git a/web/admin/view/ext/log.html b/web/admin/view/ext/log.html index 1c1c596..7f2433f 100644 --- a/web/admin/view/ext/log.html +++ b/web/admin/view/ext/log.html @@ -68,49 +68,52 @@ title: '用户id', field: 'userId', align: 'center', - width: 120 + width: 80 }, { - title: 'ip地址', + title: '请求IP', field: 'ip', align: 'center', - width: 120 + width: 100 }, { - title: '浏览器或者app信息', - field: 'client', - align: 'center', - width: 120 + title: '请求方法', + field: 'method', + align: 'center' }, { - title: '请求', + title: '请求URI', + field: 'uri', + align: 'center' + }, + { + title: '请求内容', field: 'request', - align: 'center', - width: 120 + align: 'center' }, { - title: '响应', + title: '响应内容', field: 'response', align: 'center', - width: 120 + width: 150 }, { title: '耗时ms', field: 'cost', align: 'center', - width: 120 + width: 80 + }, + { + title: 'Client信息', + field: 'client', + align: 'center', + width: 80 }, { title: '创建时间', field: 'createTime', align: 'center', - width: 120 - }, - { - title: '操作', - toolbar: '#record-toolbar', - align: 'center', - width: 180 + width: 150 } ] ] @@ -121,7 +124,9 @@ let uri = "/ext/" + module; easyAdmin.tableRender({ url: uri, - cols: cols + cols: cols, + toolbar: null, + defaultToolbar: null }); easyAdmin.TableTool(uri, module); easyAdmin.TableToolBar(uri, module); diff --git a/web/admin/view/system/user/edit.html b/web/admin/view/system/user/edit.html index ab293f8..2301a3c 100644 --- a/web/admin/view/system/user/edit.html +++ b/web/admin/view/system/user/edit.html @@ -31,13 +31,6 @@ placeholder="请输入标题" class="layui-input"> -

- -
- -
-