diff --git a/common/src/main/java/com/storeroom/utils/ThrowableUtil.java b/common/src/main/java/com/storeroom/utils/ThrowableUtil.java new file mode 100644 index 0000000..d59cbf5 --- /dev/null +++ b/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(); + } + } +} diff --git a/logging/pom.xml b/logging/pom.xml new file mode 100644 index 0000000..91d754f --- /dev/null +++ b/logging/pom.xml @@ -0,0 +1,29 @@ + + + + yxk_StoreroomSystem + com.storeroom + 1.0 + + 4.0.0 + + logging + 日志模块 + + + 17 + 17 + + + + + + com.storeroom + common + 1.0 + + + + \ No newline at end of file diff --git a/logging/src/main/java/com/storeroom/annotation/Log.java b/logging/src/main/java/com/storeroom/annotation/Log.java new file mode 100644 index 0000000..3266944 --- /dev/null +++ b/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 ""; +} diff --git a/logging/src/main/java/com/storeroom/aspect/LogAspect.java b/logging/src/main/java/com/storeroom/aspect/LogAspect.java new file mode 100644 index 0000000..c91c67b --- /dev/null +++ b/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 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 ""; + } + } +} diff --git a/logging/src/main/java/com/storeroom/controller/LogController.java b/logging/src/main/java/com/storeroom/controller/LogController.java new file mode 100644 index 0000000..f20d7b3 --- /dev/null +++ b/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 queryLog(LogQueryCriteria criteria, Pageable pageable){ + criteria.setLogType("INFO"); + return new ResponseEntity<>(logService.queryAll(criteria,pageable), HttpStatus.OK); + } + + @GetMapping(value = "/user") + @ApiOperation("用户日志查询") + public ResponseEntity 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 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 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 delAllErrorLog(){ + logService.delAllByError(); + return new ResponseEntity<>(HttpStatus.OK); + } + + @DeleteMapping(value = "/del/info") + @Log("删除所有INFO日志") + @ApiOperation("删除所有INFO日志") + @PreAuthorize("@ys.check()") + public ResponseEntity delAllInfoLog(){ + logService.delAllByInfo(); + return new ResponseEntity<>(HttpStatus.OK); + } +} diff --git a/logging/src/main/java/com/storeroom/domain/Log.java b/logging/src/main/java/com/storeroom/domain/Log.java new file mode 100644 index 0000000..955f165 --- /dev/null +++ b/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; + } +} diff --git a/logging/src/main/java/com/storeroom/repository/LogRepository.java b/logging/src/main/java/com/storeroom/repository/LogRepository.java new file mode 100644 index 0000000..50fe8da --- /dev/null +++ b/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, JpaSpecificationExecutor { + + @Modifying + @Query(value = "delete from sys_log where log_type = ?1", nativeQuery = true) + void deleteByLogType(String logType); +} diff --git a/logging/src/main/java/com/storeroom/service/LogService.java b/logging/src/main/java/com/storeroom/service/LogService.java new file mode 100644 index 0000000..946bea7 --- /dev/null +++ b/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 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 logs, HttpServletResponse response) throws IOException; + + /** + * 删除所有错误日志 + */ + void delAllByError(); + + /** + * 删除所有INFO日志 + */ + void delAllByInfo(); +} diff --git a/logging/src/main/java/com/storeroom/service/dto/LogErrorDTO.java b/logging/src/main/java/com/storeroom/service/dto/LogErrorDTO.java new file mode 100644 index 0000000..c1da4fd --- /dev/null +++ b/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; +} diff --git a/logging/src/main/java/com/storeroom/service/dto/LogQueryCriteria.java b/logging/src/main/java/com/storeroom/service/dto/LogQueryCriteria.java new file mode 100644 index 0000000..224d5f2 --- /dev/null +++ b/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 createTime; +} diff --git a/logging/src/main/java/com/storeroom/service/dto/LogSmallDTO.java b/logging/src/main/java/com/storeroom/service/dto/LogSmallDTO.java new file mode 100644 index 0000000..2e7ff1f --- /dev/null +++ b/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; +} diff --git a/logging/src/main/java/com/storeroom/service/impl/LogServiceImpl.java b/logging/src/main/java/com/storeroom/service/impl/LogServiceImpl.java new file mode 100644 index 0000000..d852572 --- /dev/null +++ b/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 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 queryAll(LogQueryCriteria criteria) { + return logRepository.findAll(((root, criteriaQuery, cb) -> QueryHelp.getPredicate(root, criteria, cb))); + } + + @Override + public Object queryAllByUser(LogQueryCriteria criteria, Pageable pageable) { + Page 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 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 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 logs, HttpServletResponse response) throws IOException { + List> list = new ArrayList<>(); + for (Log log : logs) { + Map 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"); + } +} diff --git a/logging/src/main/java/com/storeroom/service/mapsturct/LogErrorMapper.java b/logging/src/main/java/com/storeroom/service/mapsturct/LogErrorMapper.java new file mode 100644 index 0000000..d6d94a6 --- /dev/null +++ b/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 { +} diff --git a/logging/src/main/java/com/storeroom/service/mapsturct/LogSmallMapper.java b/logging/src/main/java/com/storeroom/service/mapsturct/LogSmallMapper.java new file mode 100644 index 0000000..3ba0dd6 --- /dev/null +++ b/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 { +} diff --git a/pom.xml b/pom.xml index 96fe5b7..abc5d77 100644 --- a/pom.xml +++ b/pom.xml @@ -11,6 +11,7 @@ common system + logging 智能库房综合管理系统 @@ -232,4 +233,17 @@ + + + + + org.apache.maven.plugins + maven-surefire-plugin + + true + + + + + \ No newline at end of file diff --git a/system/pom.xml b/system/pom.xml index 66377f1..fcb3377 100644 --- a/system/pom.xml +++ b/system/pom.xml @@ -24,6 +24,12 @@ 1.0 + + com.storeroom + logging + 1.0 + + @@ -75,4 +81,5 @@ + \ No newline at end of file diff --git a/system/src/main/java/com/storeroom/AppRun.java b/system/src/main/java/com/storeroom/AppRun.java index bff1007..6952b93 100644 --- a/system/src/main/java/com/storeroom/AppRun.java +++ b/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"; diff --git a/system/src/main/java/com/storeroom/modules/system/controller/DeptController.java b/system/src/main/java/com/storeroom/modules/system/controller/DeptController.java index a3e17e6..26925c3 100644 --- a/system/src/main/java/com/storeroom/modules/system/controller/DeptController.java +++ b/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 queryDept(DeptQueryCriteria criteria) throws Exception { List 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 getDeptSuperior(@RequestBody List ids) { Set 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 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 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 deleteDept(@RequestBody Set ids){ Set deptDtos = new HashSet<>(); for (Long id : ids) { diff --git a/system/src/main/java/com/storeroom/modules/system/controller/DictController.java b/system/src/main/java/com/storeroom/modules/system/controller/DictController.java index 955d6af..abcd7a7 100644 --- a/system/src/main/java/com/storeroom/modules/system/controller/DictController.java +++ b/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 queryAllDict(){ return ApiResponse.success(dictService.queryAll(new DictQueryCriteria())); } @ApiOperation("查询字典") @GetMapping - //@PreAuthorize("@el.check('dict:list')") + @PreAuthorize("@ys.check('dict:list')") public ApiResponse 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 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 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 deleteDict(@RequestBody Set ids){ dictService.delete(ids); return ApiResponse.success(ResponseStatus.SUCCESS); diff --git a/system/src/main/java/com/storeroom/modules/system/controller/DictDetailController.java b/system/src/main/java/com/storeroom/modules/system/controller/DictDetailController.java index 21ba8f3..577c73a 100644 --- a/system/src/main/java/com/storeroom/modules/system/controller/DictDetailController.java +++ b/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 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 getDictDetailMaps(@RequestParam String dictName){ + public ResponseEntity getDictDetailMaps(@RequestParam String dictName) { String[] names = dictName.split("[,,]"); Map> 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 createDictDetail(@Validated @RequestBody DictDetail resources){ + @PreAuthorize("@ys.check('dict:add')") + public ApiResponse 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 updateDictDetail(@Validated(DictDetail.Update.class) @RequestBody DictDetail resources){ + @PreAuthorize("@ys.check('dict:edit')") + public ApiResponse 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 deleteDictDetail(@PathVariable Long id){ + @PreAuthorize("@ys.check('dict:del')") + public ApiResponse deleteDictDetail(@PathVariable Long id) { dictDetailService.delete(id); return ApiResponse.success(ResponseStatus.SUCCESS); } diff --git a/system/src/main/java/com/storeroom/modules/system/controller/MenuController.java b/system/src/main/java/com/storeroom/modules/system/controller/MenuController.java index 4325a35..ca53911 100644 --- a/system/src/main/java/com/storeroom/modules/system/controller/MenuController.java +++ b/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 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 childMenu(@RequestParam Long id){ Set menuSet = new HashSet<>(); List 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 queryMenu(MenuQueryCriteria criteria) throws Exception { List 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 getMenuSuperior(@RequestBody List ids) { Set 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 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 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 deleteMenu(@RequestBody Set ids){ Set menuSet = new HashSet<>(); for (Long id : ids) { diff --git a/system/src/main/java/com/storeroom/modules/system/controller/RoleController.java b/system/src/main/java/com/storeroom/modules/system/controller/RoleController.java index 3c69608..10b6037 100644 --- a/system/src/main/java/com/storeroom/modules/system/controller/RoleController.java +++ b/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 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 queryAllRole(){ return ApiResponse.success(roleService.queryAll()); } @ApiOperation("查询角色") @GetMapping - //@PreAuthorize("@el.check('roles:list')") + @PreAuthorize("@ys.check('roles:list')") public ApiResponse 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 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 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 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 deleteRole(@RequestBody Set ids){ for (Long id : ids) { RoleDto role = roleService.findById(id); diff --git a/system/src/main/java/com/storeroom/modules/system/controller/UserController.java b/system/src/main/java/com/storeroom/modules/system/controller/UserController.java index e5ce3e5..5446f18 100644 --- a/system/src/main/java/com/storeroom/modules/system/controller/UserController.java +++ b/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 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 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 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 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 deleteUser(@RequestBody Set 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 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); -// } /** * 如果当前用户的角色级别低于创建用户的角色级别,则抛出权限不足的错误