Browse Source

新增日志模块

master
刘力 3 years ago
parent
commit
fe199cf680
  1. 18
      common/src/main/java/com/storeroom/utils/ThrowableUtil.java
  2. 29
      logging/pom.xml
  3. 13
      logging/src/main/java/com/storeroom/annotation/Log.java
  4. 82
      logging/src/main/java/com/storeroom/aspect/LogAspect.java
  5. 93
      logging/src/main/java/com/storeroom/controller/LogController.java
  6. 62
      logging/src/main/java/com/storeroom/domain/Log.java
  7. 17
      logging/src/main/java/com/storeroom/repository/LogRepository.java
  8. 73
      logging/src/main/java/com/storeroom/service/LogService.java
  9. 29
      logging/src/main/java/com/storeroom/service/dto/LogErrorDTO.java
  10. 20
      logging/src/main/java/com/storeroom/service/dto/LogQueryCriteria.java
  11. 22
      logging/src/main/java/com/storeroom/service/dto/LogSmallDTO.java
  12. 151
      logging/src/main/java/com/storeroom/service/impl/LogServiceImpl.java
  13. 11
      logging/src/main/java/com/storeroom/service/mapsturct/LogErrorMapper.java
  14. 11
      logging/src/main/java/com/storeroom/service/mapsturct/LogSmallMapper.java
  15. 14
      pom.xml
  16. 7
      system/pom.xml
  17. 9
      system/src/main/java/com/storeroom/AppRun.java
  18. 19
      system/src/main/java/com/storeroom/modules/system/controller/DeptController.java
  19. 19
      system/src/main/java/com/storeroom/modules/system/controller/DictController.java
  20. 27
      system/src/main/java/com/storeroom/modules/system/controller/DictDetailController.java
  21. 23
      system/src/main/java/com/storeroom/modules/system/controller/MenuController.java
  22. 23
      system/src/main/java/com/storeroom/modules/system/controller/RoleController.java
  23. 33
      system/src/main/java/com/storeroom/modules/system/controller/UserController.java

18
common/src/main/java/com/storeroom/utils/ThrowableUtil.java

@ -0,0 +1,18 @@
package com.storeroom.utils;
import java.io.PrintWriter;
import java.io.StringWriter;
public class ThrowableUtil {
/**
* 获取堆栈信息
*/
public static String getStackTrace(Throwable throwable){
StringWriter sw = new StringWriter();
try (PrintWriter pw = new PrintWriter(sw)) {
throwable.printStackTrace(pw);
return sw.toString();
}
}
}

29
logging/pom.xml

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>yxk_StoreroomSystem</artifactId>
<groupId>com.storeroom</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>logging</artifactId>
<name>日志模块</name>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<!--添加公共模块依赖项-->
<dependencies>
<dependency>
<groupId>com.storeroom</groupId>
<artifactId>common</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
</project>

13
logging/src/main/java/com/storeroom/annotation/Log.java

@ -0,0 +1,13 @@
package com.storeroom.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {
String value() default "";
}

82
logging/src/main/java/com/storeroom/aspect/LogAspect.java

@ -0,0 +1,82 @@
package com.storeroom.aspect;
import com.storeroom.domain.Log;
import com.storeroom.service.LogService;
import com.storeroom.utils.RequestHolder;
import com.storeroom.utils.SecurityUtils;
import com.storeroom.utils.StringUtils;
import com.storeroom.utils.ThrowableUtil;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
@Component
@Aspect
@Slf4j
public class LogAspect {
private final LogService logService;
ThreadLocal<Long> currentTime = new ThreadLocal<>();
public LogAspect(LogService logService) {
this.logService = logService;
}
/**
* 配置切入点
*/
@Pointcut("@annotation(com.storeroom.annotation.Log)")
public void logPointcut() {
// 该方法无方法体,主要为了让同类中其他方法使用此切入点
}
/**
* 配置环绕通知,使用在方法logPointcut()上注册的切入点
*
* @param joinPoint join point for advice
*/
@Around("logPointcut()")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
Object result;
currentTime.set(System.currentTimeMillis());
result = joinPoint.proceed();
Log log = new Log("INFO",System.currentTimeMillis() - currentTime.get());
currentTime.remove();
HttpServletRequest request = RequestHolder.getHttpServletRequest();
logService.save(getUsername(), StringUtils.getBrowser(request), StringUtils.getIp(request),joinPoint, log);
return result;
}
/**
* 配置异常通知
*
* @param joinPoint join point for advice
* @param e exception
*/
@AfterThrowing(pointcut = "logPointcut()", throwing = "e")
public void logAfterThrowing(JoinPoint joinPoint, Throwable e) {
Log log = new Log("ERROR",System.currentTimeMillis() - currentTime.get());
currentTime.remove();
log.setExceptionDetail(ThrowableUtil.getStackTrace(e).getBytes());
HttpServletRequest request = RequestHolder.getHttpServletRequest();
logService.save(getUsername(), StringUtils.getBrowser(request), StringUtils.getIp(request), (ProceedingJoinPoint)joinPoint, log);
}
public String getUsername() {
try {
return SecurityUtils.getCurrentUsername();
}catch (Exception e){
return "";
}
}
}

93
logging/src/main/java/com/storeroom/controller/LogController.java

@ -0,0 +1,93 @@
package com.storeroom.controller;
import com.storeroom.annotation.Log;
import com.storeroom.service.LogService;
import com.storeroom.service.dto.LogQueryCriteria;
import com.storeroom.utils.SecurityUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/logs")
@Api(tags = "系统:日志管理")
public class LogController {
private final LogService logService;
@Log("导出数据")
@ApiOperation("导出数据")
@GetMapping(value = "/download")
@PreAuthorize("@ys.check()")
public void exportLog(HttpServletResponse response, LogQueryCriteria criteria) throws IOException {
criteria.setLogType("INFO");
logService.download(logService.queryAll(criteria), response);
}
@Log("导出错误数据")
@ApiOperation("导出错误数据")
@GetMapping(value = "/error/download")
@PreAuthorize("@ys.check()")
public void exportErrorLog(HttpServletResponse response, LogQueryCriteria criteria) throws IOException {
criteria.setLogType("ERROR");
logService.download(logService.queryAll(criteria), response);
}
@GetMapping
@ApiOperation("日志查询")
@PreAuthorize("@ys.check()")
public ResponseEntity<Object> queryLog(LogQueryCriteria criteria, Pageable pageable){
criteria.setLogType("INFO");
return new ResponseEntity<>(logService.queryAll(criteria,pageable), HttpStatus.OK);
}
@GetMapping(value = "/user")
@ApiOperation("用户日志查询")
public ResponseEntity<Object> queryUserLog(LogQueryCriteria criteria, Pageable pageable){
criteria.setLogType("INFO");
criteria.setBlurry(SecurityUtils.getCurrentUsername());
return new ResponseEntity<>(logService.queryAllByUser(criteria,pageable), HttpStatus.OK);
}
@GetMapping(value = "/error")
@ApiOperation("错误日志查询")
@PreAuthorize("@ys.check()")
public ResponseEntity<Object> queryErrorLog(LogQueryCriteria criteria, Pageable pageable){
criteria.setLogType("ERROR");
return new ResponseEntity<>(logService.queryAll(criteria,pageable), HttpStatus.OK);
}
@GetMapping(value = "/error/{id}")
@ApiOperation("日志异常详情查询")
@PreAuthorize("@ys.check()")
public ResponseEntity<Object> queryErrorLogDetail(@PathVariable Long id){
return new ResponseEntity<>(logService.findByErrDetail(id), HttpStatus.OK);
}
@DeleteMapping(value = "/del/error")
@Log("删除所有ERROR日志")
@ApiOperation("删除所有ERROR日志")
@PreAuthorize("@ys.check()")
public ResponseEntity<Object> delAllErrorLog(){
logService.delAllByError();
return new ResponseEntity<>(HttpStatus.OK);
}
@DeleteMapping(value = "/del/info")
@Log("删除所有INFO日志")
@ApiOperation("删除所有INFO日志")
@PreAuthorize("@ys.check()")
public ResponseEntity<Object> delAllInfoLog(){
logService.delAllByInfo();
return new ResponseEntity<>(HttpStatus.OK);
}
}

62
logging/src/main/java/com/storeroom/domain/Log.java

@ -0,0 +1,62 @@
package com.storeroom.domain;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.hibernate.annotations.CreationTimestamp;
import javax.persistence.*;
import java.io.Serializable;
import java.sql.Timestamp;
@Entity
@Getter
@Setter
@Table(name = "sys_log")
@NoArgsConstructor
public class Log implements Serializable {
@Id
@Column(name = "log_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
/** 操作用户 */
private String username;
/** 描述 */
private String description;
/** 方法名 */
private String method;
/** 参数 */
private String params;
/** 日志类型 */
private String logType;
/** 请求ip */
private String requestIp;
/** 地址 */
private String address;
/** 浏览器 */
private String browser;
/** 请求耗时 */
private Long time;
/** 异常详细 */
private byte[] exceptionDetail;
/** 创建日期 */
@CreationTimestamp
private Timestamp createTime;
public Log(String logType, Long time) {
this.logType = logType;
this.time = time;
}
}

17
logging/src/main/java/com/storeroom/repository/LogRepository.java

@ -0,0 +1,17 @@
package com.storeroom.repository;
import com.storeroom.domain.Log;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
@Repository
public interface LogRepository extends JpaRepository<Log,Long>, JpaSpecificationExecutor<Log> {
@Modifying
@Query(value = "delete from sys_log where log_type = ?1", nativeQuery = true)
void deleteByLogType(String logType);
}

73
logging/src/main/java/com/storeroom/service/LogService.java

@ -0,0 +1,73 @@
package com.storeroom.service;
import com.storeroom.domain.Log;
import com.storeroom.service.dto.LogQueryCriteria;
import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.data.domain.Pageable;
import org.springframework.scheduling.annotation.Async;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
public interface LogService {
/**
* 分页查询
* @param criteria 查询条件
* @param pageable 分页参数
* @return /
*/
Object queryAll(LogQueryCriteria criteria, Pageable pageable);
/**
* 查询全部数据
* @param criteria 查询条件
* @return /
*/
List<Log> queryAll(LogQueryCriteria criteria);
/**
* 查询用户日志
* @param criteria 查询条件
* @param pageable 分页参数
* @return -
*/
Object queryAllByUser(LogQueryCriteria criteria, Pageable pageable);
/**
* 保存日志数据
* @param username 用户
* @param browser 浏览器
* @param ip 请求IP
* @param joinPoint /
* @param log 日志实体
*/
@Async
void save(String username, String browser, String ip, ProceedingJoinPoint joinPoint, Log log);
/**
* 查询异常详情
* @param id 日志ID
* @return Object
*/
Object findByErrDetail(Long id);
/**
* 导出日志
* @param logs 待导出的数据
* @param response /
* @throws IOException /
*/
void download(List<Log> logs, HttpServletResponse response) throws IOException;
/**
* 删除所有错误日志
*/
void delAllByError();
/**
* 删除所有INFO日志
*/
void delAllByInfo();
}

29
logging/src/main/java/com/storeroom/service/dto/LogErrorDTO.java

@ -0,0 +1,29 @@
package com.storeroom.service.dto;
import lombok.Data;
import java.io.Serializable;
import java.sql.Timestamp;
@Data
public class LogErrorDTO implements Serializable {
private Long id;
private String username;
private String description;
private String method;
private String params;
private String browser;
private String requestIp;
private String address;
private Timestamp createTime;
}

20
logging/src/main/java/com/storeroom/service/dto/LogQueryCriteria.java

@ -0,0 +1,20 @@
package com.storeroom.service.dto;
import com.storeroom.annotaion.Query;
import lombok.Data;
import java.sql.Timestamp;
import java.util.List;
@Data
public class LogQueryCriteria {
@Query(blurry = "username,description,address,requestIp,method,params")
private String blurry;
@Query
private String logType;
@Query(type = Query.Type.BETWEEN)
private List<Timestamp> createTime;
}

22
logging/src/main/java/com/storeroom/service/dto/LogSmallDTO.java

@ -0,0 +1,22 @@
package com.storeroom.service.dto;
import lombok.Data;
import java.io.Serializable;
import java.sql.Timestamp;
@Data
public class LogSmallDTO implements Serializable {
private String description;
private String requestIp;
private Long time;
private String address;
private String browser;
private Timestamp createTime;
}

151
logging/src/main/java/com/storeroom/service/impl/LogServiceImpl.java

@ -0,0 +1,151 @@
package com.storeroom.service.impl;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import com.storeroom.domain.Log;
import com.storeroom.repository.LogRepository;
import com.storeroom.service.LogService;
import com.storeroom.service.dto.LogQueryCriteria;
import com.storeroom.service.mapsturct.LogErrorMapper;
import com.storeroom.service.mapsturct.LogSmallMapper;
import com.storeroom.utils.*;
import lombok.RequiredArgsConstructor;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.*;
@Service
@RequiredArgsConstructor
public class LogServiceImpl implements LogService {
private final LogRepository logRepository;
private final LogErrorMapper logErrorMapper;
private final LogSmallMapper logSmallMapper;
@Override
public Object queryAll(LogQueryCriteria criteria, Pageable pageable) {
Page<Log> page = logRepository.findAll(((root, criteriaQuery, cb) -> QueryHelp.getPredicate(root, criteria, cb)), pageable);
String status = "ERROR";
if (status.equals(criteria.getLogType())) {
return PageUtil.toPage(page.map(logErrorMapper::toDto));
}
return page;
}
@Override
public List<Log> queryAll(LogQueryCriteria criteria) {
return logRepository.findAll(((root, criteriaQuery, cb) -> QueryHelp.getPredicate(root, criteria, cb)));
}
@Override
public Object queryAllByUser(LogQueryCriteria criteria, Pageable pageable) {
Page<Log> page = logRepository.findAll(((root, criteriaQuery, cb) -> QueryHelp.getPredicate(root, criteria, cb)), pageable);
return PageUtil.toPage(page.map(logSmallMapper::toDto));
}
@Override
@Transactional(rollbackFor = Exception.class)
public void save(String username, String browser, String ip, ProceedingJoinPoint joinPoint, Log log) {
if (log == null) {
throw new IllegalArgumentException("Log 不能为 null!");
}
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
com.storeroom.annotation.Log aopLog = method.getAnnotation(com.storeroom.annotation.Log.class);
// 方法路径
String methodName = joinPoint.getTarget().getClass().getName() + "." + signature.getName() + "()";
// 描述
log.setDescription(aopLog.value());
log.setRequestIp(ip);
log.setAddress(StringUtils.getCityInfo(log.getRequestIp()));
log.setMethod(methodName);
log.setUsername(username);
log.setParams(getParameter(method, joinPoint.getArgs()));
log.setBrowser(browser);
logRepository.save(log);
}
/**
* 根据方法和传入的参数获取请求参数
*/
private String getParameter(Method method, Object[] args) {
List<Object> argList = new ArrayList<>();
Parameter[] parameters = method.getParameters();
for (int i = 0; i < parameters.length; i++) {
//将RequestBody注解修饰的参数作为请求参数
RequestBody requestBody = parameters[i].getAnnotation(RequestBody.class);
if (requestBody != null) {
argList.add(args[i]);
}
//将RequestParam注解修饰的参数作为请求参数
RequestParam requestParam = parameters[i].getAnnotation(RequestParam.class);
if (requestParam != null) {
Map<String, Object> map = new HashMap<>(4);
String key = parameters[i].getName();
if (!StringUtils.isEmpty(requestParam.value())) {
key = requestParam.value();
}
map.put(key, args[i]);
argList.add(map);
}
}
if (argList.isEmpty()) {
return "";
}
return argList.size() == 1 ? JSONUtil.toJsonStr(argList.get(0)) : JSONUtil.toJsonStr(argList);
}
@Override
public Object findByErrDetail(Long id) {
Log log = logRepository.findById(id).orElseGet(Log::new);
ValidationUtil.isNull(log.getId(), "Log", "id", id);
byte[] details = log.getExceptionDetail();
return Dict.create().set("exception", new String(ObjectUtil.isNotNull(details) ? details : "".getBytes()));
}
@Override
public void download(List<Log> logs, HttpServletResponse response) throws IOException {
List<Map<String, Object>> list = new ArrayList<>();
for (Log log : logs) {
Map<String, Object> map = new LinkedHashMap<>();
map.put("用户名", log.getUsername());
map.put("IP", log.getRequestIp());
map.put("IP来源", log.getAddress());
map.put("描述", log.getDescription());
map.put("浏览器", log.getBrowser());
map.put("请求耗时/毫秒", log.getTime());
map.put("异常详情", new String(ObjectUtil.isNotNull(log.getExceptionDetail()) ? log.getExceptionDetail() : "".getBytes()));
map.put("创建日期", log.getCreateTime());
list.add(map);
}
FileUtil.downloadExcel(list, response);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delAllByError() {
logRepository.deleteByLogType("ERROR");
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delAllByInfo() {
logRepository.deleteByLogType("INFO");
}
}

11
logging/src/main/java/com/storeroom/service/mapsturct/LogErrorMapper.java

@ -0,0 +1,11 @@
package com.storeroom.service.mapsturct;
import com.storeroom.base.BaseMapper;
import com.storeroom.domain.Log;
import com.storeroom.service.dto.LogErrorDTO;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
@Mapper(componentModel = "spring",unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface LogErrorMapper extends BaseMapper<LogErrorDTO, Log> {
}

11
logging/src/main/java/com/storeroom/service/mapsturct/LogSmallMapper.java

@ -0,0 +1,11 @@
package com.storeroom.service.mapsturct;
import com.storeroom.base.BaseMapper;
import com.storeroom.domain.Log;
import com.storeroom.service.dto.LogSmallDTO;
import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy;
@Mapper(componentModel = "spring",unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface LogSmallMapper extends BaseMapper<LogSmallDTO, Log> {
}

14
pom.xml

@ -11,6 +11,7 @@
<modules>
<module>common</module>
<module>system</module>
<module>logging</module>
</modules>
<name>智能库房综合管理系统</name>
@ -232,4 +233,17 @@
</dependency>
</dependencies>
<build>
<plugins>
<!-- 打包时跳过测试 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
</project>

7
system/pom.xml

@ -24,6 +24,12 @@
<version>1.0</version>
</dependency>
<dependency>
<groupId>com.storeroom</groupId>
<artifactId>logging</artifactId>
<version>1.0</version>
</dependency>
<!-- jwt -->
<dependency>
@ -75,4 +81,5 @@
</dependency>
</dependencies>
</project>

9
system/src/main/java/com/storeroom/AppRun.java

@ -5,6 +5,8 @@ import com.storeroom.utils.SpringContextHolder;
import io.swagger.annotations.Api;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.scheduling.annotation.EnableAsync;
@ -29,6 +31,13 @@ public class AppRun {
return new SpringContextHolder();
}
@Bean
public ServletWebServerFactory webServerFactory() {
TomcatServletWebServerFactory fa = new TomcatServletWebServerFactory();
fa.addConnectorCustomizers(connector -> connector.setProperty("relaxedQueryChars", "[]{}"));
return fa;
}
@AnonymousGetMapping("/")
public String index(){
return "Api Service Started Successfully";

19
system/src/main/java/com/storeroom/modules/system/controller/DeptController.java

@ -2,6 +2,7 @@ package com.storeroom.modules.system.controller;
import cn.hutool.core.collection.CollectionUtil;
import com.storeroom.annotation.Log;
import com.storeroom.exception.BaseException;
import com.storeroom.exception.constant.ResponseStatus;
import com.storeroom.modules.system.domain.Dept;
@ -32,14 +33,14 @@ public class DeptController {
@ApiOperation("导出部门数据")
@GetMapping(value = "/download")
//@PreAuthorize("@el.check('dept:list')")
@PreAuthorize("@ys.check('dept:list')")
public void exportDept(HttpServletResponse response, DeptQueryCriteria criteria) throws Exception {
deptService.download(deptService.queryAll(criteria, false), response);
}
@ApiOperation("查询部门")
@GetMapping
//@PreAuthorize("@el.check('user:list','dept:list')")
@PreAuthorize("@ys.check('user:list','dept:list')")
public ApiResponse<Object> queryDept(DeptQueryCriteria criteria) throws Exception {
List<DeptDto> deptDtos = deptService.queryAll(criteria, true);
return ApiResponse.success(PageUtil.toPage(deptDtos, deptDtos.size()));
@ -47,7 +48,7 @@ public class DeptController {
@ApiOperation("查询部门:根据ID获取同级与上级数据")
@PostMapping("/superior")
//@PreAuthorize("@el.check('user:list','dept:list')")
@PreAuthorize("@ys.check('user:list','dept:list')")
public ApiResponse<Object> getDeptSuperior(@RequestBody List<Long> ids) {
Set<DeptDto> deptDtos = new LinkedHashSet<>();
for (Long id : ids) {
@ -58,10 +59,10 @@ public class DeptController {
return ApiResponse.success(deptService.buildTree(new ArrayList<>(deptDtos)));
}
//@Log("新增部门")
@Log("新增部门")
@ApiOperation("新增部门")
@PostMapping
//@PreAuthorize("@el.check('dept:add')")
@PreAuthorize("@ys.check('dept:add')")
public ApiResponse<Object> createDept(@Validated @RequestBody Dept resources){
if (resources.getId() != null) {
throw new BaseException("A new "+ ENTITY_NAME +" cannot already have an ID");
@ -70,19 +71,19 @@ public class DeptController {
return ApiResponse.success(ResponseStatus.SUCCESS);
}
//@Log("修改部门")
@Log("修改部门")
@ApiOperation("修改部门")
@PutMapping
//@PreAuthorize("@el.check('dept:edit')")
@PreAuthorize("@ys.check('dept:edit')")
public ApiResponse<Object> updateDept(@Validated(Dept.Update.class) @RequestBody Dept resources){
deptService.update(resources);
return ApiResponse.success(HttpStatus.NO_CONTENT);
}
//@Log("删除部门")
@Log("删除部门")
@ApiOperation("删除部门")
@DeleteMapping
//@PreAuthorize("@el.check('dept:del')")
@PreAuthorize("@ys.check('dept:del')")
public ApiResponse<Object> deleteDept(@RequestBody Set<Long> ids){
Set<DeptDto> deptDtos = new HashSet<>();
for (Long id : ids) {

19
system/src/main/java/com/storeroom/modules/system/controller/DictController.java

@ -1,6 +1,7 @@
package com.storeroom.modules.system.controller;
import com.storeroom.annotation.Log;
import com.storeroom.exception.BaseException;
import com.storeroom.exception.constant.ResponseStatus;
import com.storeroom.modules.system.domain.Dict;
@ -30,29 +31,29 @@ public class DictController {
@ApiOperation("导出字典数据")
@GetMapping(value = "/download")
//@PreAuthorize("@el.check('dict:list')")
@PreAuthorize("@ys.check('dict:list')")
public void exportDict(HttpServletResponse response, DictQueryCriteria criteria) throws IOException {
dictService.download(dictService.queryAll(criteria), response);
}
@ApiOperation("查询字典")
@GetMapping(value = "/all")
//@PreAuthorize("@el.check('dict:list')")
@PreAuthorize("@ys.check('dict:list')")
public ApiResponse<Object> queryAllDict(){
return ApiResponse.success(dictService.queryAll(new DictQueryCriteria()));
}
@ApiOperation("查询字典")
@GetMapping
//@PreAuthorize("@el.check('dict:list')")
@PreAuthorize("@ys.check('dict:list')")
public ApiResponse<Object> queryDict(DictQueryCriteria resources, Pageable pageable){
return ApiResponse.success(dictService.queryAll(resources,pageable));
}
//@Log("新增字典")
@Log("新增字典")
@ApiOperation("新增字典")
@PostMapping
//@PreAuthorize("@el.check('dict:add')")
@PreAuthorize("@ys.check('dict:add')")
public ApiResponse<Object> createDict(@Validated @RequestBody Dict resources){
if (resources.getId() != null) {
throw new BaseException("A new "+ ENTITY_NAME +" cannot already have an ID");
@ -61,19 +62,19 @@ public class DictController {
return ApiResponse.success(ResponseStatus.SUCCESS);
}
//@Log("修改字典")
@Log("修改字典")
@ApiOperation("修改字典")
@PutMapping
//@PreAuthorize("@el.check('dict:edit')")
@PreAuthorize("@ys.check('dict:edit')")
public ApiResponse<Object> updateDict(@Validated(Dict.Update.class) @RequestBody Dict resources){
dictService.update(resources);
return ApiResponse.success(ResponseStatus.SUCCESS);
}
//@Log("删除字典")
@Log("删除字典")
@ApiOperation("删除字典")
@DeleteMapping
//@PreAuthorize("@el.check('dict:del')")
@PreAuthorize("@ys.check('dict:del')")
public ApiResponse<Object> deleteDict(@RequestBody Set<Long> ids){
dictService.delete(ids);
return ApiResponse.success(ResponseStatus.SUCCESS);

27
system/src/main/java/com/storeroom/modules/system/controller/DictDetailController.java

@ -1,6 +1,7 @@
package com.storeroom.modules.system.controller;
import com.storeroom.annotation.Log;
import com.storeroom.exception.BaseException;
import com.storeroom.exception.constant.ResponseStatus;
import com.storeroom.modules.system.domain.DictDetail;
@ -36,13 +37,13 @@ public class DictDetailController {
@ApiOperation("查询字典详情")
@GetMapping
public ResponseEntity<Object> queryDictDetail(DictDetailQueryCriteria criteria,
@PageableDefault(sort = {"dictSort"}, direction = Sort.Direction.ASC) Pageable pageable){
return new ResponseEntity<>(dictDetailService.queryAll(criteria,pageable), HttpStatus.OK);
@PageableDefault(sort = {"dictSort"}, direction = Sort.Direction.ASC) Pageable pageable) {
return new ResponseEntity<>(dictDetailService.queryAll(criteria, pageable), HttpStatus.OK);
}
@ApiOperation("查询多个字典详情")
@GetMapping(value = "/map")
public ResponseEntity<Object> getDictDetailMaps(@RequestParam String dictName){
public ResponseEntity<Object> getDictDetailMaps(@RequestParam String dictName) {
String[] names = dictName.split("[,,]");
Map<String, List<DictDetailDto>> dictMap = new HashMap<>(16);
for (String name : names) {
@ -51,32 +52,32 @@ public class DictDetailController {
return new ResponseEntity<>(dictMap, HttpStatus.OK);
}
// @Log("新增字典详情")
@Log("新增字典详情")
@ApiOperation("新增字典详情")
@PostMapping
//@PreAuthorize("@el.check('dict:add')")
public ApiResponse<Object> createDictDetail(@Validated @RequestBody DictDetail resources){
@PreAuthorize("@ys.check('dict:add')")
public ApiResponse<Object> createDictDetail(@Validated @RequestBody DictDetail resources) {
if (resources.getId() != null) {
throw new BaseException("A new "+ ENTITY_NAME +" cannot already have an ID");
throw new BaseException("A new " + ENTITY_NAME + " cannot already have an ID");
}
dictDetailService.create(resources);
return ApiResponse.success(ResponseStatus.SUCCESS);
}
//@Log("修改字典详情")
@Log("修改字典详情")
@ApiOperation("修改字典详情")
@PutMapping
//@PreAuthorize("@el.check('dict:edit')")
public ApiResponse<Object> updateDictDetail(@Validated(DictDetail.Update.class) @RequestBody DictDetail resources){
@PreAuthorize("@ys.check('dict:edit')")
public ApiResponse<Object> updateDictDetail(@Validated(DictDetail.Update.class) @RequestBody DictDetail resources) {
dictDetailService.update(resources);
return ApiResponse.success(ResponseStatus.SUCCESS);
}
// @Log("删除字典详情")
@Log("删除字典详情")
@ApiOperation("删除字典详情")
@DeleteMapping(value = "/{id}")
// @PreAuthorize("@el.check('dict:del')")
public ApiResponse<Object> deleteDictDetail(@PathVariable Long id){
@PreAuthorize("@ys.check('dict:del')")
public ApiResponse<Object> deleteDictDetail(@PathVariable Long id) {
dictDetailService.delete(id);
return ApiResponse.success(ResponseStatus.SUCCESS);
}

23
system/src/main/java/com/storeroom/modules/system/controller/MenuController.java

@ -2,6 +2,7 @@ package com.storeroom.modules.system.controller;
import cn.hutool.core.collection.CollectionUtil;
import com.storeroom.annotation.Log;
import com.storeroom.exception.BaseException;
import com.storeroom.exception.constant.ResponseStatus;
import com.storeroom.modules.system.domain.Menu;
@ -36,7 +37,7 @@ public class MenuController {
@ApiOperation("导出菜单数据")
@GetMapping(value = "/download")
//@PreAuthorize("@el.check('menu:list')")
@PreAuthorize("@ys.check('menu:list')")
public void exportMenu(HttpServletResponse response, MenuQueryCriteria criteria) throws Exception {
menuService.download(menuService.queryAll(criteria, false), response);
}
@ -51,14 +52,14 @@ public class MenuController {
@ApiOperation("返回全部的菜单")
@GetMapping(value = "/lazy")
//@PreAuthorize("@el.check('menu:list','roles:list')")
@PreAuthorize("@ys.check('menu:list','roles:list')")
public ApiResponse<Object> queryAllMenu(@RequestParam Long pid){
return ApiResponse.success(menuService.getMenus(pid));
}
@ApiOperation("根据菜单ID返回所有子节点ID,包含自身ID")
@GetMapping(value = "/child")
// @PreAuthorize("@el.check('menu:list','roles:list')")
@PreAuthorize("@ys.check('menu:list','roles:list')")
public ApiResponse<Object> childMenu(@RequestParam Long id){
Set<Menu> menuSet = new HashSet<>();
List<MenuDto> menuList = menuService.getMenus(id);
@ -70,7 +71,7 @@ public class MenuController {
@GetMapping
@ApiOperation("查询菜单")
//@PreAuthorize("@el.check('menu:list')")
@PreAuthorize("@ys.check('menu:list')")
public ApiResponse<Object> queryMenu(MenuQueryCriteria criteria) throws Exception {
List<MenuDto> menuDtoList = menuService.queryAll(criteria, true);
return ApiResponse.success(PageUtil.toPage(menuDtoList, menuDtoList.size()));
@ -78,7 +79,7 @@ public class MenuController {
@ApiOperation("查询菜单:根据ID获取同级与上级数据")
@PostMapping("/superior")
// @PreAuthorize("@el.check('menu:list')")
@PreAuthorize("@ys.check('menu:list')")
public ApiResponse<Object> getMenuSuperior(@RequestBody List<Long> ids) {
Set<MenuDto> menuDtos = new LinkedHashSet<>();
if(CollectionUtil.isNotEmpty(ids)){
@ -91,10 +92,10 @@ public class MenuController {
return ApiResponse.success(menuService.getMenus(null));
}
//@Log("新增菜单")
@Log("新增菜单")
@ApiOperation("新增菜单")
@PostMapping
// @PreAuthorize("@el.check('menu:add')")
@PreAuthorize("@ys.check('menu:add')")
public ApiResponse<Object> createMenu(@Validated @RequestBody Menu resources){
if (resources.getId() != null) {
throw new BaseException("A new "+ ENTITY_NAME +" cannot already have an ID");
@ -103,19 +104,19 @@ public class MenuController {
return ApiResponse.success(ResponseStatus.SUCCESS);
}
//@Log("修改菜单")
@Log("修改菜单")
@ApiOperation("修改菜单")
@PutMapping
//@PreAuthorize("@el.check('menu:edit')")
@PreAuthorize("@ys.check('menu:edit')")
public ApiResponse<Object> updateMenu(@Validated(Menu.Update.class) @RequestBody Menu resources){
menuService.update(resources);
return ApiResponse.success(ResponseStatus.SUCCESS);
}
// @Log("删除菜单")
@Log("删除菜单")
@ApiOperation("删除菜单")
@DeleteMapping
//@PreAuthorize("@el.check('menu:del')")
@PreAuthorize("@ys.check('menu:del')")
public ApiResponse<Object> deleteMenu(@RequestBody Set<Long> ids){
Set<Menu> menuSet = new HashSet<>();
for (Long id : ids) {

23
system/src/main/java/com/storeroom/modules/system/controller/RoleController.java

@ -2,6 +2,7 @@ package com.storeroom.modules.system.controller;
import cn.hutool.core.lang.Dict;
import com.storeroom.annotation.Log;
import com.storeroom.exception.BaseException;
import com.storeroom.modules.system.domain.Role;
import com.storeroom.modules.system.service.RoleService;
@ -40,28 +41,28 @@ public class RoleController {
@ApiOperation("获取单个role")
@GetMapping(value = "/{id}")
@PreAuthorize("@el.check('roles:list')")
@PreAuthorize("@ys.check('roles:list')")
public ApiResponse<Object> findRoleById(@PathVariable Long id){
return ApiResponse.success(roleService.findById(id));
}
@ApiOperation("导出角色数据")
@GetMapping(value = "/download")
//@PreAuthorize("@el.check('role:list')")
@PreAuthorize("@ys.check('role:list')")
public void exportRole(HttpServletResponse response, RoleQueryCriteria criteria) throws IOException {
roleService.download(roleService.queryAll(criteria), response);
}
@ApiOperation("返回全部的角色")
@GetMapping(value = "/all")
//@PreAuthorize("@el.check('roles:list','user:add','user:edit')")
@PreAuthorize("@ys.check('roles:list','user:add','user:edit')")
public ApiResponse<Object> queryAllRole(){
return ApiResponse.success(roleService.queryAll());
}
@ApiOperation("查询角色")
@GetMapping
//@PreAuthorize("@el.check('roles:list')")
@PreAuthorize("@ys.check('roles:list')")
public ApiResponse<Object> queryRole(RoleQueryCriteria criteria, Pageable pageable){
return ApiResponse.success(roleService.queryAll(criteria,pageable));
}
@ -72,10 +73,10 @@ public class RoleController {
return ApiResponse.success(Dict.create().set("level", getLevels(null)));
}
// @Log("新增角色")
@Log("新增角色")
@ApiOperation("新增角色")
@PostMapping
// @PreAuthorize("@el.check('roles:add')")
@PreAuthorize("@ys.check('roles:add')")
public ResponseEntity<Object> createRole(@Validated @RequestBody Role resources){
if (resources.getId() != null) {
throw new BaseException("A new "+ ENTITY_NAME +" cannot already have an ID");
@ -88,17 +89,17 @@ public class RoleController {
//@Log("修改角色")
@ApiOperation("修改角色")
@PutMapping
//@PreAuthorize("@el.check('roles:edit')")
@PreAuthorize("@ys.check('roles:edit')")
public ApiResponse<Object> updateRole(@Validated(Role.Update.class) @RequestBody Role resources){
getLevels(resources.getLevel());
roleService.update(resources);
return ApiResponse.success(HttpStatus.NO_CONTENT);
}
//@Log("修改角色菜单")
@Log("修改角色菜单")
@ApiOperation("修改角色菜单")
@PutMapping(value = "/menu")
//@PreAuthorize("@el.check('roles:edit')")
@PreAuthorize("@ys.check('roles:edit')")
public ApiResponse<Object> updateRoleMenu(@RequestBody Role resources){
RoleDto role = roleService.findById(resources.getId());
getLevels(role.getLevel());
@ -106,10 +107,10 @@ public class RoleController {
return ApiResponse.success(HttpStatus.NO_CONTENT);
}
//@Log("删除角色")
@Log("删除角色")
@ApiOperation("删除角色")
@DeleteMapping
//@PreAuthorize("@el.check('roles:del')")
@PreAuthorize("@ys.check('roles:del')")
public ApiResponse<Object> deleteRole(@RequestBody Set<Long> ids){
for (Long id : ids) {
RoleDto role = roleService.findById(id);

33
system/src/main/java/com/storeroom/modules/system/controller/UserController.java

@ -2,6 +2,7 @@ package com.storeroom.modules.system.controller;
import cn.hutool.core.collection.CollectionUtil;
import com.storeroom.annotation.Log;
import com.storeroom.config.RsaProperties;
import com.storeroom.exception.BaseException;
import com.storeroom.exception.constant.ResponseStatus;
@ -22,6 +23,7 @@ import com.storeroom.utils.SecurityUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Pageable;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.crypto.password.PasswordEncoder;
@ -55,14 +57,14 @@ public class UserController {
@ApiOperation("导出用户数据")
@GetMapping(value = "/download")
// @PreAuthorize("@el.check('user:list')")
@PreAuthorize("@ys.check('user:list')")
public void exportUser(HttpServletResponse response, UserQueryCriteria criteria) throws IOException {
userService.download(userService.queryAll(criteria), response);
}
@ApiOperation("查询用户")
@GetMapping
// @PreAuthorize("@el.check('user:list')")
@PreAuthorize("@ys.check('user:list')")
public ApiResponse<Object> queryUser(UserQueryCriteria criteria, Pageable pageable){
if (!ObjectUtils.isEmpty(criteria.getDeptId())) {
criteria.getDeptIds().add(criteria.getDeptId());
@ -88,10 +90,10 @@ public class UserController {
return ApiResponse.success(PageUtil.toPage(null,0));
}
//@Log("新增用户")
@Log("新增用户")
@ApiOperation("新增用户")
@PostMapping
//@PreAuthorize("@el.check('user:add')")
@PreAuthorize("@ys.check('user:add')")
public ApiResponse<Object> createUser(@Validated @RequestBody User resources){
checkLevel(resources);
// 默认密码 123456
@ -100,17 +102,17 @@ public class UserController {
return ApiResponse.success(ResponseStatus.SUCCESS);
}
//@Log("修改用户")
@Log("修改用户")
@ApiOperation("修改用户")
@PutMapping
//@PreAuthorize("@el.check('user:edit')")
@PreAuthorize("@ys.check('user:edit')")
public ApiResponse<Object> updateUser(@Validated(User.Update.class) @RequestBody User resources) throws Exception {
checkLevel(resources);
userService.update(resources);
return ApiResponse.success(ResponseStatus.SUCCESS);
}
//@Log("修改用户:个人中心")
@Log("修改用户:个人中心")
@ApiOperation("修改用户:个人中心")
@PutMapping(value = "center")
public ApiResponse<Object> centerUser(@Validated(User.Update.class) @RequestBody User resources){
@ -121,10 +123,10 @@ public class UserController {
return ApiResponse.success(ResponseStatus.SUCCESS);
}
//@Log("删除用户")
@Log("删除用户")
@ApiOperation("删除用户")
@DeleteMapping
//@PreAuthorize("@el.check('user:del')")
@PreAuthorize("@ys.check('user:del')")
public ApiResponse<Object> deleteUser(@RequestBody Set<Long> ids){
for (Long id : ids) {
Integer currentLevel = Collections.min(roleService.findByUsersId(SecurityUtils.getCurrentUserId()).stream().map(RoleSmallDto::getLevel).collect(Collectors.toList()));
@ -159,19 +161,6 @@ public class UserController {
return ApiResponse.success(userService.updateAvatar(avatar));
}
//@Log("修改邮箱")
// @ApiOperation("修改邮箱")
// @PostMapping(value = "/updateEmail/{code}")
// public ResponseEntity<Object> updateUserEmail(@PathVariable String code,@RequestBody User user) throws Exception {
// String password = RsaUtils.decryptByPrivateKey(RsaProperties.privateKey,user.getPassword());
// UserDto userDto = userService.findByName(SecurityUtils.getCurrentUsername());
// if(!passwordEncoder.matches(password, userDto.getPassword())){
// throw new BaseException("密码错误");
// }
// verificationCodeService.validated(CodeEnum.EMAIL_RESET_EMAIL_CODE.getKey() + user.getEmail(), code);
// userService.updateEmail(userDto.getUsername(),user.getEmail());
// return new ResponseEntity<>(HttpStatus.OK);
// }
/**
* 如果当前用户的角色级别低于创建用户的角色级别则抛出权限不足的错误

Loading…
Cancel
Save