Compare commits

..

5 Commits

Author SHA1 Message Date
weitang
8434098c39 优化组织结构树查询 2025-06-10 11:00:36 +08:00
weitang
099b308c5e 新增缺少的方法和参数 2025-06-10 11:00:35 +08:00
weitang
e1221dd1f9 拓展一个构造器方法,暂时不用 2025-06-10 11:00:34 +08:00
weitang
d14849903c 提交新增接口 2025-06-10 11:00:28 +08:00
weitang
5e03d7ea5e 测试接口并优化接口功能 2025-06-10 11:00:02 +08:00
17 changed files with 763 additions and 268 deletions

View File

@ -0,0 +1,12 @@
package com.stdproject.common;
import lombok.Data;
@Data
public class FilterCondition {
private String field;
private String operator; // eq, ne, gt, ge, lt, le
private Object value;
}

View File

@ -1,5 +1,8 @@
package com.stdproject.common; package com.stdproject.common;
import cn.hutool.http.useragent.Browser;
import cn.hutool.http.useragent.UserAgent;
import cn.hutool.http.useragent.UserAgentUtil;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import com.stdproject.entity.AppOptLog; import com.stdproject.entity.AppOptLog;
import com.stdproject.service.IAppOptLogService; import com.stdproject.service.IAppOptLogService;
@ -83,14 +86,14 @@ public class OperationLogAspect {
// 创建操作日志对象 // 创建操作日志对象
AppOptLog optLog = new AppOptLog(); AppOptLog optLog = new AppOptLog();
// 设置基本信息 // 设置基本信息
optLog.setOpttype(operationLog.type()); optLog.setOpttype(operationLog.type());
optLog.setModule(operationLog.module()); optLog.setModule(operationLog.module());
optLog.setDescription(operationLog.description()); optLog.setDescription(operationLog.description());
optLog.setMethod(request.getMethod() + " " + request.getRequestURI()); optLog.setMethod(request.getMethod() + " " + request.getRequestURI());
optLog.setRequestip(getIpAddress(request)); optLog.setRequestip(getIpAddress(request));
optLog.setBrowser(request.getHeader("User-Agent")); optLog.setBrowser(getBrowser(request));
optLog.setLogtime(LocalDateTime.now()); optLog.setLogtime(LocalDateTime.now());
// 设置操作用户 // 设置操作用户
@ -109,7 +112,7 @@ public class OperationLogAspect {
if (operationLog.recordParams()) { if (operationLog.recordParams()) {
String methodParams = getMethodParams(joinPoint); String methodParams = getMethodParams(joinPoint);
optLog.setParams(methodParams); optLog.setParams(methodParams);
} }
// 保存日志 // 保存日志
appOptLogService.save(optLog); appOptLogService.save(optLog);
@ -147,6 +150,12 @@ public class OperationLogAspect {
} }
} }
public static String getBrowser(HttpServletRequest request) {
UserAgent userAgent = UserAgentUtil.parse(request.getHeader("User-Agent"));
Browser browser = userAgent.getBrowser();
return browser.getName();
}
/** /**
* 获取客户端IP地址 * 获取客户端IP地址
*/ */
@ -169,4 +178,4 @@ public class OperationLogAspect {
} }
return ip; return ip;
} }
} }

View File

@ -4,7 +4,7 @@ import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.Data; import lombok.Data;
import java.util.List;
/** /**
* 分页查询请求类 * 分页查询请求类
@ -43,6 +43,11 @@ public class PageRequest {
*/ */
private String keyword; private String keyword;
/**
* 条件过滤器
*/
private List<FilterCondition> filters;
/** /**
* 获取偏移量 * 获取偏移量
* *
@ -69,4 +74,4 @@ public class PageRequest {
public boolean isDesc() { public boolean isDesc() {
return "desc".equalsIgnoreCase(orderDirection); return "desc".equalsIgnoreCase(orderDirection);
} }
} }

View File

@ -0,0 +1,92 @@
package com.stdproject.common;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.util.StringUtils;
import java.util.Collection;
import java.util.Set;
/**
* @Date: 2025/6/5 9:21
* @Description:
*/
public class QueryWrapperBuilder {
public static <T> QueryWrapper<T> buildQueryWrapper(PageRequest pageRequest) {
QueryWrapper<T> queryWrapper = new QueryWrapper<>();
// 过滤条件
if (pageRequest.getFilters() != null && !pageRequest.getFilters().isEmpty()) {
for (FilterCondition condition : pageRequest.getFilters()) {
String field = condition.getField();
String op = condition.getOperator();
Object val = condition.getValue();
if (!StringUtils.hasText(field) || ObjectUtil.isEmpty(val)) continue;
switch (op.toLowerCase()) {
case "eq":
queryWrapper.eq(field, val);
break;
case "like":
queryWrapper.like(field, val);
break;
case "left_like":
queryWrapper.likeLeft(field, val);
break;
case "right_like":
queryWrapper.likeRight(field, val);
break;
case "ne":
queryWrapper.ne(field, val);
break;
case "gt":
queryWrapper.gt(field, val);
break;
case "ge":
queryWrapper.ge(field, val);
break;
case "lt":
queryWrapper.lt(field, val);
break;
case "le":
queryWrapper.le(field, val);
break;
case "in":
if (val instanceof Collection) {
queryWrapper.in(field, (Collection<?>) val);
}
break;
case "notin":
if (val instanceof Collection) {
queryWrapper.notIn(field, (Collection<?>) val);
}
break;
default:
// 忽略不支持的操作符
break;
}
}
}
// 排序字段白名单校验
// String orderBy = pageRequest.getOrderBy();
// if (StringUtils.hasText(orderBy) && isAllowedOrderField(orderBy)) {
// if ("asc".equalsIgnoreCase(pageRequest.getOrderDirection())) {
// queryWrapper.orderByAsc(orderBy);
// } else {
// queryWrapper.orderByDesc(orderBy);
// }
// }
return queryWrapper;
}
private static final Set<String> ALLOWED_ORDER_FIELDS = Set.of(
"username", "nickname", "email", "phone", "lastmodifydate", "age"
);
private static boolean isAllowedOrderField(String field) {
return ALLOWED_ORDER_FIELDS.contains(field);
}
}

View File

@ -34,21 +34,29 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
@Autowired @Autowired
private UserDetailsService userDetailsService; private UserDetailsService userDetailsService;
@Autowired
private WebConfig webConfig;
@Override @Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException { throws ServletException, IOException {
try { try {
String jwt = getJwtFromRequest(request); String jwt = getJwtFromRequest(request);
// 拦截器中校验
if (webConfig.loginuserCache().get(jwt) != null) {
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Token 已失效");
return;
}
if (StringUtils.hasText(jwt) && SecurityContextHolder.getContext().getAuthentication() == null) { if (StringUtils.hasText(jwt) && SecurityContextHolder.getContext().getAuthentication() == null) {
String username = jwtUtils.getUsernameFromToken(jwt); String username = jwtUtils.getUsernameFromToken(jwt);
if (StringUtils.hasText(username)) { if (StringUtils.hasText(username)) {
UserDetails userDetails = userDetailsService.loadUserByUsername(username); UserDetails userDetails = userDetailsService.loadUserByUsername(username);
if (jwtUtils.validateToken(jwt, userDetails.getUsername())) { if (jwtUtils.validateToken(jwt, userDetails.getUsername())) {
UsernamePasswordAuthenticationToken authentication = UsernamePasswordAuthenticationToken authentication =
new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities()); new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authentication); SecurityContextHolder.getContext().setAuthentication(authentication);
@ -58,7 +66,7 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
} catch (Exception e) { } catch (Exception e) {
log.error("无法设置用户认证: {}", e.getMessage()); log.error("无法设置用户认证: {}", e.getMessage());
} }
filterChain.doFilter(request, response); filterChain.doFilter(request, response);
} }

View File

@ -1,5 +1,9 @@
package com.stdproject.config; package com.stdproject.config;
import cn.hutool.cache.Cache;
import cn.hutool.cache.CacheUtil;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@ -12,6 +16,17 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration @Configuration
public class WebConfig implements WebMvcConfigurer { public class WebConfig implements WebMvcConfigurer {
@Value("${spring.security.jwt.expiration-ms}")
private Long expirationMs;
/**
* 用户缓存
*/
@Bean
public Cache<String, String> loginuserCache() {
return CacheUtil.newTimedCache(expirationMs);
}
/** /**
* 静态资源处理 * 静态资源处理
*/ */
@ -20,9 +35,9 @@ public class WebConfig implements WebMvcConfigurer {
// Swagger UI 静态资源 // Swagger UI 静态资源
registry.addResourceHandler("/swagger-ui/**") registry.addResourceHandler("/swagger-ui/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/swagger-ui/"); .addResourceLocations("classpath:/META-INF/resources/webjars/swagger-ui/");
// 其他静态资源 // 其他静态资源
registry.addResourceHandler("/static/**") registry.addResourceHandler("/static/**")
.addResourceLocations("classpath:/static/"); .addResourceLocations("classpath:/static/");
} }
} }

View File

@ -18,6 +18,7 @@ import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* <p> * <p>
@ -41,7 +42,7 @@ public class AppDictionaryController {
public Result<IPage<AppDictionary>> page(@RequestBody @Valid PageRequest pageRequest) { public Result<IPage<AppDictionary>> page(@RequestBody @Valid PageRequest pageRequest) {
Page<AppDictionary> page = new Page<>(pageRequest.getCurrent(), pageRequest.getSize()); Page<AppDictionary> page = new Page<>(pageRequest.getCurrent(), pageRequest.getSize());
QueryWrapper<AppDictionary> queryWrapper = new QueryWrapper<>(); QueryWrapper<AppDictionary> queryWrapper = new QueryWrapper<>();
// 关键字搜索 // 关键字搜索
if (StringUtils.hasText(pageRequest.getKeyword())) { if (StringUtils.hasText(pageRequest.getKeyword())) {
queryWrapper.and(wrapper -> wrapper queryWrapper.and(wrapper -> wrapper
@ -50,7 +51,7 @@ public class AppDictionaryController {
.or().like("dictdata", pageRequest.getKeyword()) .or().like("dictdata", pageRequest.getKeyword())
); );
} }
// 排序 // 排序
if (StringUtils.hasText(pageRequest.getOrderBy())) { if (StringUtils.hasText(pageRequest.getOrderBy())) {
if ("asc".equalsIgnoreCase(pageRequest.getOrderDirection())) { if ("asc".equalsIgnoreCase(pageRequest.getOrderDirection())) {
@ -61,7 +62,7 @@ public class AppDictionaryController {
} else { } else {
queryWrapper.orderByAsc("dictcode", "orderno"); queryWrapper.orderByAsc("dictcode", "orderno");
} }
IPage<AppDictionary> result = appDictionaryService.page(page, queryWrapper); IPage<AppDictionary> result = appDictionaryService.page(page, queryWrapper);
return Result.success(result); return Result.success(result);
} }
@ -72,7 +73,7 @@ public class AppDictionaryController {
public Result<List<AppDictionary>> list() { public Result<List<AppDictionary>> list() {
QueryWrapper<AppDictionary> queryWrapper = new QueryWrapper<>(); QueryWrapper<AppDictionary> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByAsc("dictcode", "orderno"); queryWrapper.orderByAsc("dictcode", "orderno");
List<AppDictionary> dictionaries = appDictionaryService.list(queryWrapper); List<AppDictionary> dictionaries = appDictionaryService.list(queryWrapper);
return Result.success(dictionaries); return Result.success(dictionaries);
} }
@ -92,7 +93,7 @@ public class AppDictionaryController {
QueryWrapper<AppDictionary> queryWrapper = new QueryWrapper<>(); QueryWrapper<AppDictionary> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("dictcode", dictCode); queryWrapper.eq("dictcode", dictCode);
queryWrapper.orderByAsc("orderno"); queryWrapper.orderByAsc("orderno");
List<AppDictionary> dictionaries = appDictionaryService.list(queryWrapper); List<AppDictionary> dictionaries = appDictionaryService.list(queryWrapper);
return Result.success(dictionaries); return Result.success(dictionaries);
} }
@ -106,7 +107,7 @@ public class AppDictionaryController {
QueryWrapper<AppDictionary> queryWrapper = new QueryWrapper<>(); QueryWrapper<AppDictionary> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("dictcode", dictCode); queryWrapper.eq("dictcode", dictCode);
queryWrapper.eq("dictdata", dictData); queryWrapper.eq("dictdata", dictData);
AppDictionary dictionary = appDictionaryService.getOne(queryWrapper); AppDictionary dictionary = appDictionaryService.getOne(queryWrapper);
return Result.success(dictionary); return Result.success(dictionary);
} }
@ -123,18 +124,18 @@ public class AppDictionaryController {
if (existDictionary != null) { if (existDictionary != null) {
return Result.error("该字典编码下的字典值已存在"); return Result.error("该字典编码下的字典值已存在");
} }
// 设置默认值 // 设置默认值
if (appDictionary.getOrderno() == null) { if (appDictionary.getOrderno() == null) {
// 获取同一字典编码下的最大序号 // 获取同一字典编码下的最大序号
QueryWrapper<AppDictionary> orderQuery = new QueryWrapper<>(); QueryWrapper<AppDictionary> orderQuery = new QueryWrapper<>();
orderQuery.eq("dictcode", appDictionary.getDictcode()); orderQuery.eq("app_id", appDictionary.getAppId());
orderQuery.orderByDesc("orderno"); orderQuery.orderByDesc("orderno");
orderQuery.last("LIMIT 1"); orderQuery.last("LIMIT 1");
AppDictionary lastDict = appDictionaryService.getOne(orderQuery); AppDictionary lastDict = appDictionaryService.getOne(orderQuery);
appDictionary.setOrderno(lastDict != null ? lastDict.getOrderno() + 1 : 1); appDictionary.setOrderno(lastDict != null ? lastDict.getOrderno() + 1 : 1);
} }
appDictionary.setLastmodifydate(LocalDateTime.now()); appDictionary.setLastmodifydate(LocalDateTime.now());
boolean success = appDictionaryService.save(appDictionary); boolean success = appDictionaryService.save(appDictionary);
return success ? Result.success("新增成功") : Result.error("新增失败"); return success ? Result.success("新增成功") : Result.error("新增失败");
@ -149,7 +150,7 @@ public class AppDictionaryController {
if (existDictionary == null) { if (existDictionary == null) {
return Result.error("数据字典不存在"); return Result.error("数据字典不存在");
} }
// 如果修改了字典编码或字典值检查新的组合是否已被其他字典项使用 // 如果修改了字典编码或字典值检查新的组合是否已被其他字典项使用
if (!existDictionary.getDictcode().equals(appDictionary.getDictcode()) || if (!existDictionary.getDictcode().equals(appDictionary.getDictcode()) ||
!existDictionary.getDictdata().equals(appDictionary.getDictdata())) { !existDictionary.getDictdata().equals(appDictionary.getDictdata())) {
@ -162,7 +163,7 @@ public class AppDictionaryController {
return Result.error("该字典编码下的字典数据已被其他字典项使用"); return Result.error("该字典编码下的字典数据已被其他字典项使用");
} }
} }
appDictionary.setLastmodifydate(LocalDateTime.now()); appDictionary.setLastmodifydate(LocalDateTime.now());
boolean success = appDictionaryService.updateById(appDictionary); boolean success = appDictionaryService.updateById(appDictionary);
return success ? Result.success("修改成功") : Result.error("修改失败"); return success ? Result.success("修改成功") : Result.error("修改失败");
@ -190,7 +191,7 @@ public class AppDictionaryController {
public Result<String> deleteByDictCode(@Parameter(description = "字典编码") @PathVariable String dictCode) { public Result<String> deleteByDictCode(@Parameter(description = "字典编码") @PathVariable String dictCode) {
QueryWrapper<AppDictionary> queryWrapper = new QueryWrapper<>(); QueryWrapper<AppDictionary> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("dictcode", dictCode); queryWrapper.eq("dictcode", dictCode);
boolean success = appDictionaryService.remove(queryWrapper); boolean success = appDictionaryService.remove(queryWrapper);
return success ? Result.success("删除成功") : Result.error("删除失败"); return success ? Result.success("删除成功") : Result.error("删除失败");
} }
@ -202,7 +203,7 @@ public class AppDictionaryController {
QueryWrapper<AppDictionary> queryWrapper = new QueryWrapper<>(); QueryWrapper<AppDictionary> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("dictname", dictName); queryWrapper.eq("dictname", dictName);
AppDictionary dictionary = appDictionaryService.getOne(queryWrapper); AppDictionary dictionary = appDictionaryService.getOne(queryWrapper);
if (dictionary != null) { if (dictionary != null) {
return Result.success(dictionary.getDictdata()); return Result.success(dictionary.getDictdata());
} }
@ -216,13 +217,13 @@ public class AppDictionaryController {
QueryWrapper<AppDictionary> queryWrapper = new QueryWrapper<>(); QueryWrapper<AppDictionary> queryWrapper = new QueryWrapper<>();
queryWrapper.select("DISTINCT dictcode"); queryWrapper.select("DISTINCT dictcode");
queryWrapper.orderByAsc("dictcode"); queryWrapper.orderByAsc("dictcode");
List<AppDictionary> dictionaries = appDictionaryService.list(queryWrapper); List<AppDictionary> dictionaries = appDictionaryService.list(queryWrapper);
List<String> dictCodes = dictionaries.stream() List<String> dictCodes = dictionaries.stream()
.map(AppDictionary::getDictcode) .map(AppDictionary::getDictcode)
.distinct() .distinct()
.collect(java.util.stream.Collectors.toList()); .collect(java.util.stream.Collectors.toList());
return Result.success(dictCodes); return Result.success(dictCodes);
} }
@ -244,14 +245,14 @@ public class AppDictionaryController {
@Operation(summary = "根据字典编码分组查询字典项") @Operation(summary = "根据字典编码分组查询字典项")
@GetMapping("/grouped") @GetMapping("/grouped")
@OperationLog(type = "06", module = "数据字典管理", description = "根据字典编码分组查询字典项") @OperationLog(type = "06", module = "数据字典管理", description = "根据字典编码分组查询字典项")
public Result<java.util.Map<String, List<AppDictionary>>> getGroupedDictionaries() { public Result<Map<String, List<AppDictionary>>> getGroupedDictionaries() {
QueryWrapper<AppDictionary> queryWrapper = new QueryWrapper<>(); QueryWrapper<AppDictionary> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByAsc("dictcode", "orderno"); queryWrapper.orderByAsc("dictcode", "orderno");
List<AppDictionary> allDictionaries = appDictionaryService.list(queryWrapper); List<AppDictionary> allDictionaries = appDictionaryService.list(queryWrapper);
java.util.Map<String, List<AppDictionary>> groupedDict = allDictionaries.stream() java.util.Map<String, List<AppDictionary>> groupedDict = allDictionaries.stream()
.collect(java.util.stream.Collectors.groupingBy(AppDictionary::getDictcode)); .collect(java.util.stream.Collectors.groupingBy(AppDictionary::getDictcode));
return Result.success(groupedDict); return Result.success(groupedDict);
} }
@ -267,4 +268,4 @@ public class AppDictionaryController {
public Integer getOrderno() { return orderno; } public Integer getOrderno() { return orderno; }
public void setOrderno(Integer orderno) { this.orderno = orderno; } public void setOrderno(Integer orderno) { this.orderno = orderno; }
} }
} }

View File

@ -1,6 +1,8 @@
package com.stdproject.controller; package com.stdproject.controller;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.stdproject.common.OperationLog; import com.stdproject.common.OperationLog;
@ -8,6 +10,7 @@ import com.stdproject.common.PageRequest;
import com.stdproject.common.Result; import com.stdproject.common.Result;
import com.stdproject.entity.AppMenu; import com.stdproject.entity.AppMenu;
import com.stdproject.service.IAppMenuService; import com.stdproject.service.IAppMenuService;
import com.stdproject.service.IAppUserService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
@ -37,22 +40,25 @@ public class AppMenuController {
@Autowired @Autowired
private IAppMenuService appMenuService; private IAppMenuService appMenuService;
@Autowired
private IAppUserService appUserService;
@Operation(summary = "分页查询菜单列表") @Operation(summary = "分页查询菜单列表")
@PostMapping("/page") @PostMapping("/page")
@OperationLog(type = "06", module = "菜单管理", description = "分页查询菜单列表") @OperationLog(type = "06", module = "菜单管理", description = "分页查询菜单列表")
public Result<IPage<AppMenu>> page(@RequestBody @Valid PageRequest pageRequest) { public Result<IPage<AppMenu>> page(@RequestBody @Valid PageRequest pageRequest) {
Page<AppMenu> page = new Page<>(pageRequest.getCurrent(), pageRequest.getSize()); Page<AppMenu> page = new Page<>(pageRequest.getCurrent(), pageRequest.getSize());
QueryWrapper<AppMenu> queryWrapper = new QueryWrapper<>(); QueryWrapper<AppMenu> queryWrapper = new QueryWrapper<>();
// 关键字搜索 // 关键字搜索
if (StringUtils.hasText(pageRequest.getKeyword())) { if (StringUtils.hasText(pageRequest.getKeyword())) {
queryWrapper.and(wrapper -> wrapper queryWrapper.and(wrapper -> wrapper
.like("name", pageRequest.getKeyword()) .like("name", pageRequest.getKeyword())
.or().like("code", pageRequest.getKeyword()) .or().like("code", pageRequest.getKeyword())
.or().like("url", pageRequest.getKeyword()) .or().like("url", pageRequest.getKeyword())
); );
} }
// 排序 // 排序
if (StringUtils.hasText(pageRequest.getOrderBy())) { if (StringUtils.hasText(pageRequest.getOrderBy())) {
if ("asc".equalsIgnoreCase(pageRequest.getOrderDirection())) { if ("asc".equalsIgnoreCase(pageRequest.getOrderDirection())) {
@ -63,7 +69,7 @@ public class AppMenuController {
} else { } else {
queryWrapper.orderByAsc("parentid", "orderno"); queryWrapper.orderByAsc("parentid", "orderno");
} }
IPage<AppMenu> result = appMenuService.page(page, queryWrapper); IPage<AppMenu> result = appMenuService.page(page, queryWrapper);
return Result.success(result); return Result.success(result);
} }
@ -74,7 +80,7 @@ public class AppMenuController {
public Result<List<AppMenu>> list() { public Result<List<AppMenu>> list() {
QueryWrapper<AppMenu> queryWrapper = new QueryWrapper<>(); QueryWrapper<AppMenu> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByAsc("parentid", "orderno"); queryWrapper.orderByAsc("parentid", "orderno");
List<AppMenu> menus = appMenuService.list(queryWrapper); List<AppMenu> menus = appMenuService.list(queryWrapper);
return Result.success(menus); return Result.success(menus);
} }
@ -82,10 +88,12 @@ public class AppMenuController {
@Operation(summary = "获取菜单树形结构") @Operation(summary = "获取菜单树形结构")
@GetMapping("/tree") @GetMapping("/tree")
@OperationLog(type = "06", module = "菜单管理", description = "获取菜单树形结构") @OperationLog(type = "06", module = "菜单管理", description = "获取菜单树形结构")
public Result<List<MenuTreeNode>> getMenuTree() { public Result<List<MenuTreeNode>> getMenuTree(@RequestParam String appId,@RequestParam String name) {
QueryWrapper<AppMenu> queryWrapper = new QueryWrapper<>(); QueryWrapper<AppMenu> queryWrapper = new QueryWrapper<>();
queryWrapper.eq(StrUtil.isNotBlank(appId),"app_id", appId);
queryWrapper.like(StrUtil.isNotBlank(name),"name", name);
queryWrapper.orderByAsc("parentid", "orderno"); queryWrapper.orderByAsc("parentid", "orderno");
List<AppMenu> allMenus = appMenuService.list(queryWrapper); List<AppMenu> allMenus = appMenuService.list(queryWrapper);
List<MenuTreeNode> tree = buildMenuTree(allMenus, "0"); List<MenuTreeNode> tree = buildMenuTree(allMenus, "0");
return Result.success(tree); return Result.success(tree);
@ -106,7 +114,7 @@ public class AppMenuController {
QueryWrapper<AppMenu> queryWrapper = new QueryWrapper<>(); QueryWrapper<AppMenu> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("parentid", parentId); queryWrapper.eq("parentid", parentId);
queryWrapper.orderByAsc("orderno"); queryWrapper.orderByAsc("orderno");
List<AppMenu> children = appMenuService.list(queryWrapper); List<AppMenu> children = appMenuService.list(queryWrapper);
return Result.success(children); return Result.success(children);
} }
@ -122,7 +130,7 @@ public class AppMenuController {
if (existMenu != null) { if (existMenu != null) {
return Result.error("菜单编号已存在"); return Result.error("菜单编号已存在");
} }
// 检查父级菜单是否存在如果不是顶级菜单 // 检查父级菜单是否存在如果不是顶级菜单
if (!"0".equals(appMenu.getParentid())) { if (!"0".equals(appMenu.getParentid())) {
AppMenu parentMenu = appMenuService.getById(appMenu.getParentid()); AppMenu parentMenu = appMenuService.getById(appMenu.getParentid());
@ -130,7 +138,7 @@ public class AppMenuController {
return Result.error("父级菜单不存在"); return Result.error("父级菜单不存在");
} }
} }
// 设置默认值 // 设置默认值
if (appMenu.getOrderno() == null) { if (appMenu.getOrderno() == null) {
// 获取同级菜单的最大序号 // 获取同级菜单的最大序号
@ -141,20 +149,21 @@ public class AppMenuController {
AppMenu lastMenu = appMenuService.getOne(orderQuery); AppMenu lastMenu = appMenuService.getOne(orderQuery);
appMenu.setOrderno(lastMenu != null ? lastMenu.getOrderno() + 1 : 1); appMenu.setOrderno(lastMenu != null ? lastMenu.getOrderno() + 1 : 1);
} }
if (!StringUtils.hasText(appMenu.getIsdisplay())) { if (!StringUtils.hasText(appMenu.getIsdisplay())) {
appMenu.setIsdisplay("1"); appMenu.setIsdisplay("1");
} }
if (!StringUtils.hasText(appMenu.getIslink())) { if (!StringUtils.hasText(appMenu.getIslink())) {
appMenu.setIslink("0"); appMenu.setIslink("0");
} }
if (!StringUtils.hasText(appMenu.getType())) { if (!StringUtils.hasText(appMenu.getType())) {
appMenu.setType("01"); appMenu.setType("01");
} }
appMenu.setLastmodifydate(LocalDateTime.now()); appMenu.setLastmodifydate(LocalDateTime.now());
appMenu.setLastmodifier(appUserService.getCurrentUsername());
boolean success = appMenuService.save(appMenu); boolean success = appMenuService.save(appMenu);
return success ? Result.success("新增成功") : Result.error("新增失败"); return success ? Result.success("新增成功") : Result.error("新增失败");
} }
@ -168,7 +177,7 @@ public class AppMenuController {
if (existMenu == null) { if (existMenu == null) {
return Result.error("菜单不存在"); return Result.error("菜单不存在");
} }
// 如果修改了菜单编号检查新编号是否已被其他菜单使用 // 如果修改了菜单编号检查新编号是否已被其他菜单使用
if (!existMenu.getCode().equals(appMenu.getCode())) { if (!existMenu.getCode().equals(appMenu.getCode())) {
QueryWrapper<AppMenu> queryWrapper = new QueryWrapper<>(); QueryWrapper<AppMenu> queryWrapper = new QueryWrapper<>();
@ -179,27 +188,55 @@ public class AppMenuController {
return Result.error("菜单编号已被其他菜单使用"); return Result.error("菜单编号已被其他菜单使用");
} }
} }
// 如果修改了父级菜单检查是否会形成循环引用 // 如果修改了父级菜单检查是否会形成循环引用
if (!existMenu.getParentid().equals(appMenu.getParentid())) { if (!existMenu.getParentid().equals(appMenu.getParentid())) {
if (isCircularReference(appMenu.getId(), appMenu.getParentid())) { if (isCircularReference(appMenu.getId(), appMenu.getParentid())) {
return Result.error("不能将菜单移动到自己的子菜单下"); return Result.error("不能将菜单移动到自己的子菜单下");
} }
// 检查父级菜单是否存在如果不是顶级菜单 // 检查父级菜单是否存在如果不是顶级菜单
if (!"0".equals(appMenu.getParentid())) { if (!"0".equals(existMenu.getParentid())) {
AppMenu parentMenu = appMenuService.getById(appMenu.getParentid()); AppMenu parentMenu = appMenuService.getById(appMenu.getParentid());
if (parentMenu == null) { if (parentMenu == null) {
return Result.error("父级菜单不存在"); return Result.error("父级菜单不存在");
} }
} }
} }
appMenu.setLastmodifydate(LocalDateTime.now()); appMenu.setLastmodifydate(LocalDateTime.now());
appMenu.setLastmodifier(appUserService.getCurrentUsername());
boolean success = appMenuService.updateById(appMenu); boolean success = appMenuService.updateById(appMenu);
return success ? Result.success("修改成功") : Result.error("修改失败"); return success ? Result.success("修改成功") : Result.error("修改失败");
} }
@Operation(summary = "更新菜单及按钮是否有效")
@PutMapping("/display/{id}")
@OperationLog(type = "02", module = "菜单管理", description = "更新菜单及按钮是否有效")
public Result<String> setIsDisplay(
@Parameter(description = "菜单ID") @PathVariable String id,
@RequestParam String isDisplay) {
LambdaUpdateWrapper<AppMenu> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(AppMenu::getId, id).set(AppMenu::getIsdisplay, isDisplay).set(AppMenu::getLastmodifydate,
LocalDateTime.now()).set(AppMenu::getLastmodifier, appUserService.getCurrentUsername());
boolean success = appMenuService.update(updateWrapper);
return success ? Result.success("更新成功") : Result.error("更新失败");
}
@Operation(summary = "更新关联模块ID")
@PutMapping("/module/{id}")
@OperationLog(type = "02", module = "菜单管理", description = "更新关联模块ID")
public Result<String> setModuleId(
@Parameter(description = "菜单ID") @PathVariable String id,
@RequestParam String moduleId) {
LambdaUpdateWrapper<AppMenu> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(AppMenu::getId, id).set(AppMenu::getModuleId, moduleId).set(AppMenu::getLastmodifydate,
LocalDateTime.now()).set(AppMenu::getLastmodifier, appUserService.getCurrentUsername());
boolean success = appMenuService.update(updateWrapper);
return success ? Result.success("更新成功") : Result.error("更新失败");
}
@Operation(summary = "删除菜单") @Operation(summary = "删除菜单")
@DeleteMapping("/{id}") @DeleteMapping("/{id}")
@OperationLog(type = "03", module = "菜单管理", description = "删除菜单") @OperationLog(type = "03", module = "菜单管理", description = "删除菜单")
@ -211,7 +248,7 @@ public class AppMenuController {
if (childCount > 0) { if (childCount > 0) {
return Result.error("存在子菜单,无法删除"); return Result.error("存在子菜单,无法删除");
} }
boolean success = appMenuService.removeById(id); boolean success = appMenuService.removeById(id);
return success ? Result.success("删除成功") : Result.error("删除失败"); return success ? Result.success("删除成功") : Result.error("删除失败");
} }
@ -229,7 +266,7 @@ public class AppMenuController {
return Result.error("存在子菜单的菜单无法删除"); return Result.error("存在子菜单的菜单无法删除");
} }
} }
boolean success = appMenuService.removeByIds(ids); boolean success = appMenuService.removeByIds(ids);
return success ? Result.success("批量删除成功") : Result.error("批量删除失败"); return success ? Result.success("批量删除成功") : Result.error("批量删除失败");
} }
@ -241,7 +278,7 @@ public class AppMenuController {
QueryWrapper<AppMenu> queryWrapper = new QueryWrapper<>(); QueryWrapper<AppMenu> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("type", type); queryWrapper.eq("type", type);
queryWrapper.orderByAsc("parentid", "orderno"); queryWrapper.orderByAsc("parentid", "orderno");
List<AppMenu> menus = appMenuService.list(queryWrapper); List<AppMenu> menus = appMenuService.list(queryWrapper);
return Result.success(menus); return Result.success(menus);
} }
@ -253,7 +290,7 @@ public class AppMenuController {
QueryWrapper<AppMenu> queryWrapper = new QueryWrapper<>(); QueryWrapper<AppMenu> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("isdisplay", "1"); queryWrapper.eq("isdisplay", "1");
queryWrapper.orderByAsc("parentid", "orderno"); queryWrapper.orderByAsc("parentid", "orderno");
List<AppMenu> displayMenus = appMenuService.list(queryWrapper); List<AppMenu> displayMenus = appMenuService.list(queryWrapper);
List<MenuTreeNode> tree = buildMenuTree(displayMenus, "0"); List<MenuTreeNode> tree = buildMenuTree(displayMenus, "0");
return Result.success(tree); return Result.success(tree);
@ -279,24 +316,24 @@ public class AppMenuController {
*/ */
private List<MenuTreeNode> buildMenuTree(List<AppMenu> allMenus, String parentId) { private List<MenuTreeNode> buildMenuTree(List<AppMenu> allMenus, String parentId) {
return allMenus.stream() return allMenus.stream()
.filter(menu -> parentId.equals(menu.getParentid())) .filter(menu -> parentId.equals(menu.getParentid()))
.map(menu -> { .map(menu -> {
MenuTreeNode node = new MenuTreeNode(); MenuTreeNode node = new MenuTreeNode();
node.setId(menu.getId()); node.setId(menu.getId());
node.setCode(menu.getCode()); node.setCode(menu.getCode());
node.setName(menu.getName()); node.setName(menu.getName());
node.setIcon(menu.getIcon()); node.setIcon(menu.getIcon());
node.setUrl(menu.getUrl()); node.setUrl(menu.getUrl());
node.setType(menu.getType()); node.setType(menu.getType());
node.setIslink(menu.getIslink()); node.setIslink(menu.getIslink());
node.setIsdisplay(menu.getIsdisplay()); node.setIsdisplay(menu.getIsdisplay());
node.setOrderno(menu.getOrderno()); node.setOrderno(menu.getOrderno());
node.setParentid(menu.getParentid()); node.setParentid(menu.getParentid());
node.setModuleId(menu.getModuleId()); node.setModuleId(menu.getModuleId());
node.setChildren(buildMenuTree(allMenus, menu.getId())); node.setChildren(buildMenuTree(allMenus, menu.getId()));
return node; return node;
}) })
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
/** /**
@ -306,16 +343,16 @@ public class AppMenuController {
if ("0".equals(newParentId)) { if ("0".equals(newParentId)) {
return false; return false;
} }
if (menuId.equals(newParentId)) { if (menuId.equals(newParentId)) {
return true; return true;
} }
AppMenu parentMenu = appMenuService.getById(newParentId); AppMenu parentMenu = appMenuService.getById(newParentId);
if (parentMenu == null) { if (parentMenu == null) {
return false; return false;
} }
return isCircularReference(menuId, parentMenu.getParentid()); return isCircularReference(menuId, parentMenu.getParentid());
} }
@ -323,6 +360,7 @@ public class AppMenuController {
* 菜单树节点 * 菜单树节点
*/ */
public static class MenuTreeNode { public static class MenuTreeNode {
private String id; private String id;
private String code; private String code;
private String name; private String name;
@ -337,42 +375,125 @@ public class AppMenuController {
private List<MenuTreeNode> children = new ArrayList<>(); private List<MenuTreeNode> children = new ArrayList<>();
// Getters and Setters // Getters and Setters
public String getId() { return id; } public String getId() {
public void setId(String id) { this.id = id; } return id;
public String getCode() { return code; } }
public void setCode(String code) { this.code = code; }
public String getName() { return name; } public void setId(String id) {
public void setName(String name) { this.name = name; } this.id = id;
public String getIcon() { return icon; } }
public void setIcon(String icon) { this.icon = icon; }
public String getUrl() { return url; } public String getCode() {
public void setUrl(String url) { this.url = url; } return code;
public String getType() { return type; } }
public void setType(String type) { this.type = type; }
public String getIslink() { return islink; } public void setCode(String code) {
public void setIslink(String islink) { this.islink = islink; } this.code = code;
public String getIsdisplay() { return isdisplay; } }
public void setIsdisplay(String isdisplay) { this.isdisplay = isdisplay; }
public Integer getOrderno() { return orderno; } public String getName() {
public void setOrderno(Integer orderno) { this.orderno = orderno; } return name;
public String getParentid() { return parentid; } }
public void setParentid(String parentid) { this.parentid = parentid; }
public String getModuleId() { return moduleId; } public void setName(String name) {
public void setModuleId(String moduleId) { this.moduleId = moduleId; } this.name = name;
public List<MenuTreeNode> getChildren() { return children; } }
public void setChildren(List<MenuTreeNode> children) { this.children = children; }
public String getIcon() {
return icon;
}
public void setIcon(String icon) {
this.icon = icon;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getIslink() {
return islink;
}
public void setIslink(String islink) {
this.islink = islink;
}
public String getIsdisplay() {
return isdisplay;
}
public void setIsdisplay(String isdisplay) {
this.isdisplay = isdisplay;
}
public Integer getOrderno() {
return orderno;
}
public void setOrderno(Integer orderno) {
this.orderno = orderno;
}
public String getParentid() {
return parentid;
}
public void setParentid(String parentid) {
this.parentid = parentid;
}
public String getModuleId() {
return moduleId;
}
public void setModuleId(String moduleId) {
this.moduleId = moduleId;
}
public List<MenuTreeNode> getChildren() {
return children;
}
public void setChildren(List<MenuTreeNode> children) {
this.children = children;
}
} }
/** /**
* 菜单排序请求 * 菜单排序请求
*/ */
public static class MenuOrderRequest { public static class MenuOrderRequest {
private String id; private String id;
private Integer orderno; private Integer orderno;
public String getId() { return id; } public String getId() {
public void setId(String id) { this.id = id; } return id;
public Integer getOrderno() { return orderno; } }
public void setOrderno(Integer orderno) { this.orderno = orderno; }
public void setId(String id) {
this.id = id;
}
public Integer getOrderno() {
return orderno;
}
public void setOrderno(Integer orderno) {
this.orderno = orderno;
}
} }
} }

View File

@ -1,5 +1,6 @@
package com.stdproject.controller; package com.stdproject.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -12,12 +13,14 @@ import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List; import java.util.List;
/** /**
@ -31,6 +34,7 @@ import java.util.List;
@Tag(name = "操作日志管理", description = "操作日志查询、操作日志删除等功能") @Tag(name = "操作日志管理", description = "操作日志查询、操作日志删除等功能")
@RestController @RestController
@RequestMapping("/api/optlog") @RequestMapping("/api/optlog")
@Slf4j
public class AppOptLogController { public class AppOptLogController {
@Autowired @Autowired
@ -42,16 +46,16 @@ public class AppOptLogController {
public Result<IPage<AppOptLog>> page(@RequestBody @Valid PageRequest pageRequest) { public Result<IPage<AppOptLog>> page(@RequestBody @Valid PageRequest pageRequest) {
Page<AppOptLog> page = new Page<>(pageRequest.getCurrent(), pageRequest.getSize()); Page<AppOptLog> page = new Page<>(pageRequest.getCurrent(), pageRequest.getSize());
QueryWrapper<AppOptLog> queryWrapper = new QueryWrapper<>(); QueryWrapper<AppOptLog> queryWrapper = new QueryWrapper<>();
// 关键字搜索 // 关键字搜索
if (StringUtils.hasText(pageRequest.getKeyword())) { if (StringUtils.hasText(pageRequest.getKeyword())) {
queryWrapper.and(wrapper -> wrapper queryWrapper.and(wrapper -> wrapper
.like("username", pageRequest.getKeyword()) .like("username", pageRequest.getKeyword())
.or().like("module", pageRequest.getKeyword()) .or().like("module", pageRequest.getKeyword())
.or().like("description", pageRequest.getKeyword()) .or().like("description", pageRequest.getKeyword())
); );
} }
// 排序 // 排序
if (StringUtils.hasText(pageRequest.getOrderBy())) { if (StringUtils.hasText(pageRequest.getOrderBy())) {
if ("asc".equalsIgnoreCase(pageRequest.getOrderDirection())) { if ("asc".equalsIgnoreCase(pageRequest.getOrderDirection())) {
@ -62,7 +66,7 @@ public class AppOptLogController {
} else { } else {
queryWrapper.orderByDesc("logtime"); queryWrapper.orderByDesc("logtime");
} }
IPage<AppOptLog> result = appOptLogService.page(page, queryWrapper); IPage<AppOptLog> result = appOptLogService.page(page, queryWrapper);
return Result.success(result); return Result.success(result);
} }
@ -85,7 +89,7 @@ public class AppOptLogController {
queryWrapper.eq("username", username); queryWrapper.eq("username", username);
queryWrapper.orderByDesc("logtime"); queryWrapper.orderByDesc("logtime");
queryWrapper.last("LIMIT " + limit); queryWrapper.last("LIMIT " + limit);
List<AppOptLog> logs = appOptLogService.list(queryWrapper); List<AppOptLog> logs = appOptLogService.list(queryWrapper);
return Result.success(logs); return Result.success(logs);
} }
@ -100,7 +104,7 @@ public class AppOptLogController {
queryWrapper.eq("type", type); queryWrapper.eq("type", type);
queryWrapper.orderByDesc("logtime"); queryWrapper.orderByDesc("logtime");
queryWrapper.last("LIMIT " + limit); queryWrapper.last("LIMIT " + limit);
List<AppOptLog> logs = appOptLogService.list(queryWrapper); List<AppOptLog> logs = appOptLogService.list(queryWrapper);
return Result.success(logs); return Result.success(logs);
} }
@ -113,9 +117,9 @@ public class AppOptLogController {
@Parameter(description = "限制条数") @RequestParam(defaultValue = "100") Integer limit) { @Parameter(description = "限制条数") @RequestParam(defaultValue = "100") Integer limit) {
QueryWrapper<AppOptLog> queryWrapper = new QueryWrapper<>(); QueryWrapper<AppOptLog> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("module", module); queryWrapper.eq("module", module);
queryWrapper.orderByDesc("opttime"); queryWrapper.orderByDesc("logtime");
queryWrapper.last("LIMIT " + limit); queryWrapper.last("LIMIT " + limit);
List<AppOptLog> logs = appOptLogService.list(queryWrapper); List<AppOptLog> logs = appOptLogService.list(queryWrapper);
return Result.success(logs); return Result.success(logs);
} }
@ -128,10 +132,10 @@ public class AppOptLogController {
@Parameter(description = "结束时间") @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime endTime, @Parameter(description = "结束时间") @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime endTime,
@Parameter(description = "限制条数") @RequestParam(defaultValue = "1000") Integer limit) { @Parameter(description = "限制条数") @RequestParam(defaultValue = "1000") Integer limit) {
QueryWrapper<AppOptLog> queryWrapper = new QueryWrapper<>(); QueryWrapper<AppOptLog> queryWrapper = new QueryWrapper<>();
queryWrapper.between("opttime", startTime, endTime); queryWrapper.between("logtime", startTime, endTime);
queryWrapper.orderByDesc("opttime"); queryWrapper.orderByDesc("logtime");
queryWrapper.last("LIMIT " + limit); queryWrapper.last("LIMIT " + limit);
List<AppOptLog> logs = appOptLogService.list(queryWrapper); List<AppOptLog> logs = appOptLogService.list(queryWrapper);
return Result.success(logs); return Result.success(logs);
} }
@ -144,14 +148,13 @@ public class AppOptLogController {
@Parameter(description = "限制条数") @RequestParam(defaultValue = "100") Integer limit) { @Parameter(description = "限制条数") @RequestParam(defaultValue = "100") Integer limit) {
QueryWrapper<AppOptLog> queryWrapper = new QueryWrapper<>(); QueryWrapper<AppOptLog> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("ip", ip); queryWrapper.eq("ip", ip);
queryWrapper.orderByDesc("opttime"); queryWrapper.orderByDesc("logtime");
queryWrapper.last("LIMIT " + limit); queryWrapper.last("LIMIT " + limit);
List<AppOptLog> logs = appOptLogService.list(queryWrapper); List<AppOptLog> logs = appOptLogService.list(queryWrapper);
return Result.success(logs); return Result.success(logs);
} }
@Operation(summary = "删除操作日志") @Operation(summary = "删除操作日志")
@DeleteMapping("/{id}") @DeleteMapping("/{id}")
@OperationLog(type = "03", module = "操作日志管理", description = "删除操作日志") @OperationLog(type = "03", module = "操作日志管理", description = "删除操作日志")
@ -172,12 +175,21 @@ public class AppOptLogController {
@DeleteMapping("/clean/{days}") @DeleteMapping("/clean/{days}")
@OperationLog(type = "03", module = "操作日志管理", description = "清理历史操作日志") @OperationLog(type = "03", module = "操作日志管理", description = "清理历史操作日志")
public Result<String> cleanOldLogs(@Parameter(description = "保留天数") @PathVariable Integer days) { public Result<String> cleanOldLogs(@Parameter(description = "保留天数") @PathVariable Integer days) {
LocalDateTime cutoffTime = LocalDateTime.now().minusDays(days); try {
QueryWrapper<AppOptLog> queryWrapper = new QueryWrapper<>(); // 参数校验
queryWrapper.lt("logtime", cutoffTime); if (days == null || days < 0 || days > 3650) {
return Result.error("保留天数必须在0到3650之间");
boolean success = appOptLogService.remove(queryWrapper); }
return success ? Result.success("清理成功") : Result.error("清理失败"); LocalDateTime cutoff = LocalDateTime.now().minusDays(days);
LambdaQueryWrapper<AppOptLog> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.lt(AppOptLog::getLogtime, cutoff);
boolean success = appOptLogService.remove(queryWrapper);
return success ? Result.success("清理成功") : Result.error("清理失败");
} catch (Exception e) {
// 记录异常日志以便排查
log.error("清理操作日志失败", e);
return Result.error("系统异常,请稍后再试");
}
} }
@Operation(summary = "获取操作日志统计信息") @Operation(summary = "获取操作日志统计信息")
@ -186,31 +198,31 @@ public class AppOptLogController {
public Result<LogStatistics> getStatistics() { public Result<LogStatistics> getStatistics() {
// 总日志数 // 总日志数
long totalCount = appOptLogService.count(); long totalCount = appOptLogService.count();
// 今日日志数 // 今日日志数
LocalDateTime todayStart = LocalDateTime.now().withHour(0).withMinute(0).withSecond(0).withNano(0); LocalDateTime todayStart = LocalDateTime.now().withHour(0).withMinute(0).withSecond(0).withNano(0);
QueryWrapper<AppOptLog> todayQuery = new QueryWrapper<>(); QueryWrapper<AppOptLog> todayQuery = new QueryWrapper<>();
todayQuery.ge("opttime", todayStart); todayQuery.ge("logtime", todayStart);
long todayCount = appOptLogService.count(todayQuery); long todayCount = appOptLogService.count(todayQuery);
// 本周日志数 // 本周日志数
LocalDateTime weekStart = LocalDateTime.now().minusDays(7); LocalDateTime weekStart = LocalDateTime.now().minusDays(7).withNano(0);
QueryWrapper<AppOptLog> weekQuery = new QueryWrapper<>(); QueryWrapper<AppOptLog> weekQuery = new QueryWrapper<>();
weekQuery.ge("logtime", weekStart); weekQuery.ge("logtime", weekStart);
long weekCount = appOptLogService.count(weekQuery); long weekCount = appOptLogService.count(weekQuery);
// 本月日志数 // 本月日志数
LocalDateTime monthStart = LocalDateTime.now().minusDays(30); LocalDateTime monthStart = LocalDateTime.now().minusDays(30).withNano(0);
QueryWrapper<AppOptLog> monthQuery = new QueryWrapper<>(); QueryWrapper<AppOptLog> monthQuery = new QueryWrapper<>();
monthQuery.ge("logtime", monthStart); monthQuery.ge("logtime", monthStart);
long monthCount = appOptLogService.count(monthQuery); long monthCount = appOptLogService.count(monthQuery);
LogStatistics statistics = new LogStatistics(); LogStatistics statistics = new LogStatistics();
statistics.setTotalCount(totalCount); statistics.setTotalCount(totalCount);
statistics.setTodayCount(todayCount); statistics.setTodayCount(todayCount);
statistics.setWeekCount(weekCount); statistics.setWeekCount(weekCount);
statistics.setMonthCount(monthCount); statistics.setMonthCount(monthCount);
return Result.success(statistics); return Result.success(statistics);
} }
@ -222,7 +234,7 @@ public class AppOptLogController {
QueryWrapper<AppOptLog> queryWrapper = new QueryWrapper<>(); QueryWrapper<AppOptLog> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByDesc("logtime"); queryWrapper.orderByDesc("logtime");
queryWrapper.last("LIMIT " + limit); queryWrapper.last("LIMIT " + limit);
List<AppOptLog> logs = appOptLogService.list(queryWrapper); List<AppOptLog> logs = appOptLogService.list(queryWrapper);
return Result.success(logs); return Result.success(logs);
} }
@ -231,18 +243,42 @@ public class AppOptLogController {
* 日志统计信息 * 日志统计信息
*/ */
public static class LogStatistics { public static class LogStatistics {
private Long totalCount; private Long totalCount;
private Long todayCount; private Long todayCount;
private Long weekCount; private Long weekCount;
private Long monthCount; private Long monthCount;
public Long getTotalCount() { return totalCount; } public Long getTotalCount() {
public void setTotalCount(Long totalCount) { this.totalCount = totalCount; } return totalCount;
public Long getTodayCount() { return todayCount; } }
public void setTodayCount(Long todayCount) { this.todayCount = todayCount; }
public Long getWeekCount() { return weekCount; } public void setTotalCount(Long totalCount) {
public void setWeekCount(Long weekCount) { this.weekCount = weekCount; } this.totalCount = totalCount;
public Long getMonthCount() { return monthCount; } }
public void setMonthCount(Long monthCount) { this.monthCount = monthCount; }
public Long getTodayCount() {
return todayCount;
}
public void setTodayCount(Long todayCount) {
this.todayCount = todayCount;
}
public Long getWeekCount() {
return weekCount;
}
public void setWeekCount(Long weekCount) {
this.weekCount = weekCount;
}
public Long getMonthCount() {
return monthCount;
}
public void setMonthCount(Long monthCount) {
this.monthCount = monthCount;
}
} }
} }

View File

@ -1,21 +1,27 @@
package com.stdproject.controller; package com.stdproject.controller;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.stdproject.common.OperationLog; import com.stdproject.common.OperationLog;
import com.stdproject.common.Result; import com.stdproject.common.Result;
import com.stdproject.entity.AppOrganization; import com.stdproject.entity.AppOrganization;
import com.stdproject.service.IAppOrganizationService; import com.stdproject.service.IAppOrganizationService;
import com.stdproject.service.IAppUserService; import com.stdproject.service.IAppUserService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
/** /**
* <p> * <p>
@ -39,21 +45,24 @@ public class AppOrganizationController {
@Operation(summary = "查询公司结构树") @Operation(summary = "查询公司结构树")
@GetMapping("/getCompanyTree") @GetMapping("/getCompanyTree")
@OperationLog(type = "06", module = "组织管理", description = "查询公司结构树") @OperationLog(type = "06", module = "组织管理", description = "查询公司结构树")
public Result<List<AppOrganization>> getCompanyTree() { public Result<List<OrganizationTreeNode>> getCompanyTree(@RequestParam String appId) {
QueryWrapper<AppOrganization> queryWrapper = new QueryWrapper<>(); QueryWrapper<AppOrganization> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("orgtype", "01"); queryWrapper.eq(StrUtil.isNotBlank(appId),"app_id", appId);
queryWrapper.eq("isvaild", "1"); queryWrapper.eq("isvaild", "1");
queryWrapper.orderByAsc("orgcode"); queryWrapper.orderByAsc("orgcode");
List<AppOrganization> children = appOrganizationService.list(queryWrapper); List<AppOrganization> children = appOrganizationService.list(queryWrapper);
return Result.success(children); List<OrganizationTreeNode> organizationTreeNodes = buildOrganizationTree(children, "0");
return Result.success(organizationTreeNodes);
} }
@Operation(summary = "查询部门列表") @Operation(summary = "查询公司/部门列表")
@GetMapping("/getDepartmentList") @GetMapping("/getDepartmentList")
@OperationLog(type = "06", module = "组织管理", description = "查询部门列表") @OperationLog(type = "06", module = "组织管理", description = "查询公司/部门列表")
public Result<List<AppOrganization>> getDepartmentList(@RequestParam String parentid,@RequestParam String keystr) { public Result<List<AppOrganization>> getDepartmentList(@RequestParam String appId, @RequestParam String orgtype,
@RequestParam String parentid, @RequestParam String keystr) {
QueryWrapper<AppOrganization> queryWrapper = new QueryWrapper<>(); QueryWrapper<AppOrganization> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("orgtype", "02"); queryWrapper.eq(StrUtil.isNotBlank(appId), "app_id", appId);
queryWrapper.eq(StrUtil.isNotBlank(orgtype), "orgtype", orgtype);
queryWrapper.eq("parentid", parentid); queryWrapper.eq("parentid", parentid);
queryWrapper.eq("isvaild", "1"); queryWrapper.eq("isvaild", "1");
if (StringUtils.hasText(keystr)) { if (StringUtils.hasText(keystr)) {
@ -68,8 +77,6 @@ public class AppOrganizationController {
return Result.success(children); return Result.success(children);
} }
@Operation(summary = "根据ID查询组织详情") @Operation(summary = "根据ID查询组织详情")
@GetMapping("getDetailById/{id}") @GetMapping("getDetailById/{id}")
@OperationLog(type = "06", module = "组织管理", description = "根据ID查询组织详情") @OperationLog(type = "06", module = "组织管理", description = "根据ID查询组织详情")
@ -78,7 +85,6 @@ public class AppOrganizationController {
return Result.success(organization); return Result.success(organization);
} }
@Operation(summary = "新增组织") @Operation(summary = "新增组织")
@PostMapping("add") @PostMapping("add")
@OperationLog(type = "01", module = "组织管理", description = "新增组织") @OperationLog(type = "01", module = "组织管理", description = "新增组织")
@ -115,7 +121,7 @@ public class AppOrganizationController {
if (parent == null || !"1".equals(parent.getIsvaild())) { if (parent == null || !"1".equals(parent.getIsvaild())) {
return Result.error("父级组织不存在或已禁用"); return Result.error("父级组织不存在或已禁用");
} }
if ("02".equals(parent.getOrgtype())) { if ("02".equals(parent.getOrgtype())) {
return Result.error("部门下不能有子组织"); return Result.error("部门下不能有子组织");
} }
@ -126,6 +132,19 @@ public class AppOrganizationController {
return success ? Result.success("修改成功") : Result.error("修改失败"); return success ? Result.success("修改成功") : Result.error("修改失败");
} }
@Operation(summary = "设置组织是否有效")
@PutMapping("/isValid/{id}")
@OperationLog(type = "02", module = "组织管理", description = "设置组织是否有效")
public Result<String> setIsValid(
@Parameter(description = "组织ID") @PathVariable String id,
@RequestParam String isValid) {
LambdaUpdateWrapper<AppOrganization> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(AppOrganization::getId, id).set(AppOrganization::getIsvaild, isValid).set(AppOrganization::getLastmodifydate,
LocalDateTime.now()).set(AppOrganization::getLastmodifier, appUserService.getCurrentUsername());
boolean success = appOrganizationService.update(updateWrapper);
return success ? Result.success("设置成功") : Result.error("设置失败");
}
@Operation(summary = "删除组织") @Operation(summary = "删除组织")
@PostMapping("delete/{id}") @PostMapping("delete/{id}")
@OperationLog(type = "03", module = "组织管理", description = "删除组织") @OperationLog(type = "03", module = "组织管理", description = "删除组织")
@ -137,7 +156,7 @@ public class AppOrganizationController {
/** /**
* 根据组织类型和父节点生成新的组织编码 * 根据组织类型和父节点生成新的组织编码
* *
* @param orgType 组织类型"01"表示公司"02"表示部门 * @param orgType 组织类型"01"表示公司"02"表示部门
* @param parentId 父节点ID新增部门时使用 * @param parentId 父节点ID新增部门时使用
* @return 新的组织编码 * @return 新的组织编码
*/ */
@ -156,7 +175,7 @@ public class AppOrganizationController {
String parentCode = parentOrg != null ? parentOrg.getOrgcode() : "01"; String parentCode = parentOrg != null ? parentOrg.getOrgcode() : "01";
// 获取当前父节点下的最大子节点编码 // 获取当前父节点下的最大子节点编码
String maxCompanyCode = getMaxCodeByParentId("01",parentId); String maxCompanyCode = getMaxCodeByParentId("01", parentId);
int nextLevel = 1; int nextLevel = 1;
if (maxCompanyCode != null && !maxCompanyCode.isEmpty()) { if (maxCompanyCode != null && !maxCompanyCode.isEmpty()) {
@ -182,7 +201,7 @@ public class AppOrganizationController {
} }
// 获取该父节点下最大部门编号 // 获取该父节点下最大部门编号
String maxDeptCodeStr = getMaxCodeByParentId("02",parentId); String maxDeptCodeStr = getMaxCodeByParentId("02", parentId);
int nextSeq = 1; int nextSeq = 1;
if (maxDeptCodeStr != null && !maxDeptCodeStr.isEmpty()) { if (maxDeptCodeStr != null && !maxDeptCodeStr.isEmpty()) {
@ -203,8 +222,7 @@ public class AppOrganizationController {
} }
} }
private String getMaxCodeByParentId(String orgType, String parentId) {
private String getMaxCodeByParentId(String orgType,String parentId) {
LambdaQueryWrapper<AppOrganization> queryWrapper = new LambdaQueryWrapper<AppOrganization>() LambdaQueryWrapper<AppOrganization> queryWrapper = new LambdaQueryWrapper<AppOrganization>()
.eq(AppOrganization::getOrgtype, orgType) .eq(AppOrganization::getOrgtype, orgType)
.eq(AppOrganization::getParentid, parentId) .eq(AppOrganization::getParentid, parentId)
@ -217,5 +235,99 @@ public class AppOrganizationController {
// 如果列表不为空返回第一个记录的orgcode // 如果列表不为空返回第一个记录的orgcode
return list.isEmpty() ? null : list.get(0).getOrgcode(); return list.isEmpty() ? null : list.get(0).getOrgcode();
} }
/**
* 构建菜单树
*/
private List<OrganizationTreeNode> buildOrganizationTree(List<AppOrganization> allOrganizations, String parentId) {
return allOrganizations.stream()
.filter(organization -> parentId.equals(organization.getParentid()))
.map(organization -> {
OrganizationTreeNode node = new OrganizationTreeNode();
node.setId(organization.getId());
node.setAppId(organization.getAppId());
node.setOrgtype(organization.getOrgtype());
node.setOrgcode(organization.getOrgcode());
node.setOrgname(organization.getOrgname());
node.setParentid(organization.getParentid());
node.setManager(organization.getManager());
node.setDescription(organization.getDescription());
node.setAddress(organization.getAddress());
node.setContactPhone(organization.getContactPhone());
node.setContactPerson(organization.getContactPerson());
node.setIsvaild(organization.getIsvaild());
node.setChildren(buildOrganizationTree(allOrganizations, organization.getId()));
return node;
})
.collect(Collectors.toList());
}
} /**
* 组织树节点
*/
@Data
public static class OrganizationTreeNode {
/**
* ID
*/
private String id;
/**
* 应用ID 关联应用系统
*/
private String appId;
/**
* 组织类型01-公司 02-部门
*/
private String orgtype;
/**
* 组织编号
*/
private String orgcode;
/**
* 组织名称
*/
private String orgname;
/**
* 上级ID
*/
private String parentid;
/**
* 组织负责人
*/
private String manager;
/**
* 组织详情
*/
private String description;
/**
* 联系地址
*/
private String address;
/**
* 联系电话
*/
private String contactPhone;
/**
* 联系人
*/
private String contactPerson;
/**
* 是否有效 1- 0-
*/
private String isvaild;
private List<OrganizationTreeNode> children = new ArrayList<>();
}
}

View File

@ -1,5 +1,6 @@
package com.stdproject.controller; package com.stdproject.controller;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
@ -41,32 +42,33 @@ public class AppRoleController {
@Autowired @Autowired
private IAppRoleService appRoleService; private IAppRoleService appRoleService;
@Autowired @Autowired
private IAppRoleMenuService appRoleMenuService; private IAppRoleMenuService appRoleMenuService;
@Autowired @Autowired
private IAppRoleUserService appRoleUserService; private IAppRoleUserService appRoleUserService;
@Operation(summary = "分页查询角色列表") @Operation(summary = "分页查询角色列表")
@PostMapping("/page") @PostMapping("/page/{appId}")
@OperationLog(type = "06", module = "角色管理", description = "分页查询角色列表") @OperationLog(type = "06", module = "角色管理", description = "分页查询角色列表")
public Result<IPage<AppRole>> page(@RequestBody @Valid PageRequest pageRequest) { public Result<IPage<AppRole>> page(@Parameter(description = "用户ID") @PathVariable String appId,
@RequestBody @Valid PageRequest pageRequest) {
Page<AppRole> page = new Page<>(pageRequest.getCurrent(), pageRequest.getSize()); Page<AppRole> page = new Page<>(pageRequest.getCurrent(), pageRequest.getSize());
QueryWrapper<AppRole> queryWrapper = new QueryWrapper<>(); QueryWrapper<AppRole> queryWrapper = new QueryWrapper<>();
queryWrapper.eq(StrUtil.isNotBlank(appId),"app_id",appId);
// 关键字搜索 // 关键字搜索
if (StringUtils.hasText(pageRequest.getKeyword())) { if (StringUtils.hasText(pageRequest.getKeyword())) {
queryWrapper.and(wrapper -> wrapper queryWrapper.and(wrapper -> wrapper
.like("rolename", pageRequest.getKeyword()) .like("rolename", pageRequest.getKeyword())
.or().like("rolecode", pageRequest.getKeyword()) .or().like("rolecode", pageRequest.getKeyword())
.or().like("description", pageRequest.getKeyword()) .or().like("description", pageRequest.getKeyword())
); );
} }
// 只查询有效的角色 // 只查询有效的角色
queryWrapper.eq("isvaild", "1"); queryWrapper.eq("isvaild", "1");
// 排序 // 排序
if (StringUtils.hasText(pageRequest.getOrderBy())) { if (StringUtils.hasText(pageRequest.getOrderBy())) {
if ("asc".equalsIgnoreCase(pageRequest.getOrderDirection())) { if ("asc".equalsIgnoreCase(pageRequest.getOrderDirection())) {
@ -77,7 +79,7 @@ public class AppRoleController {
} else { } else {
queryWrapper.orderByAsc("rolecode"); queryWrapper.orderByAsc("rolecode");
} }
IPage<AppRole> result = appRoleService.page(page, queryWrapper); IPage<AppRole> result = appRoleService.page(page, queryWrapper);
return Result.success(result); return Result.success(result);
} }
@ -89,7 +91,7 @@ public class AppRoleController {
QueryWrapper<AppRole> queryWrapper = new QueryWrapper<>(); QueryWrapper<AppRole> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("isvaild", "1"); queryWrapper.eq("isvaild", "1");
queryWrapper.orderByAsc("rolecode"); queryWrapper.orderByAsc("rolecode");
List<AppRole> roles = appRoleService.list(queryWrapper); List<AppRole> roles = appRoleService.list(queryWrapper);
return Result.success(roles); return Result.success(roles);
} }
@ -101,6 +103,7 @@ public class AppRoleController {
AppRole role = appRoleService.getById(id); AppRole role = appRoleService.getById(id);
return Result.success(role); return Result.success(role);
} }
@Operation(summary = "新增角色") @Operation(summary = "新增角色")
@PostMapping @PostMapping
@OperationLog(type = "01", module = "角色管理", description = "新增角色") @OperationLog(type = "01", module = "角色管理", description = "新增角色")
@ -133,6 +136,7 @@ public class AppRoleController {
/** /**
* 获取最大的角色编号 * 获取最大的角色编号
*
* @return 最大角色编号 * @return 最大角色编号
*/ */
private String getMaxRoleCode() { private String getMaxRoleCode() {
@ -154,7 +158,7 @@ public class AppRoleController {
if (existRole == null) { if (existRole == null) {
return Result.error("角色不存在"); return Result.error("角色不存在");
} }
// 如果修改了角色名称检查新名称是否已被其他角色使用 // 如果修改了角色名称检查新名称是否已被其他角色使用
if (!existRole.getRolename().equals(appRole.getRolename())) { if (!existRole.getRolename().equals(appRole.getRolename())) {
QueryWrapper<AppRole> nameQuery = new QueryWrapper<>(); QueryWrapper<AppRole> nameQuery = new QueryWrapper<>();
@ -183,29 +187,27 @@ public class AppRoleController {
if (userCount > 0) { if (userCount > 0) {
return Result.error("存在用户关联此角色,无法删除"); return Result.error("存在用户关联此角色,无法删除");
} }
// 软删除设置为无效 // 软删除设置为无效
AppRole role = appRoleService.getById(id); AppRole role = appRoleService.getById(id);
if (role != null) { if (role != null) {
role.setIsvaild("0"); role.setIsvaild("0");
role.setLastmodifydate(LocalDateTime.now()); role.setLastmodifydate(LocalDateTime.now());
boolean success = appRoleService.updateById(role); boolean success = appRoleService.updateById(role);
if (success) { if (success) {
// 同时删除角色菜单关联 // 同时删除角色菜单关联
QueryWrapper<AppRoleMenu> menuQuery = new QueryWrapper<>(); QueryWrapper<AppRoleMenu> menuQuery = new QueryWrapper<>();
menuQuery.eq("roleid", id); menuQuery.eq("roleid", id);
appRoleMenuService.remove(menuQuery); appRoleMenuService.remove(menuQuery);
} }
return success ? Result.success("删除成功") : Result.error("删除失败"); return success ? Result.success("删除成功") : Result.error("删除失败");
} }
return Result.error("角色不存在"); return Result.error("角色不存在");
} }
@Operation(summary = "根据角色类型查询角色列表") @Operation(summary = "根据角色类型查询角色列表")
@GetMapping("/type/{type}") @GetMapping("/type/{type}")
@OperationLog(type = "06", module = "角色管理", description = "根据角色类型查询角色列表") @OperationLog(type = "06", module = "角色管理", description = "根据角色类型查询角色列表")
@ -213,7 +215,7 @@ public class AppRoleController {
QueryWrapper<AppRole> queryWrapper = new QueryWrapper<>(); QueryWrapper<AppRole> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("type", type); queryWrapper.eq("type", type);
queryWrapper.eq("isvaild", "1"); queryWrapper.eq("isvaild", "1");
queryWrapper.orderByAsc("rolecode"); queryWrapper.orderByAsc("rolecode");
List<AppRole> roles = appRoleService.list(queryWrapper); List<AppRole> roles = appRoleService.list(queryWrapper);
return Result.success(roles); return Result.success(roles);
} }
@ -224,18 +226,18 @@ public class AppRoleController {
public Result<String> assignMenus( public Result<String> assignMenus(
@Parameter(description = "角色ID") @PathVariable String roleId, @Parameter(description = "角色ID") @PathVariable String roleId,
@RequestBody List<String> menuIds) { @RequestBody List<String> menuIds) {
// 检查角色是否存在 // 检查角色是否存在
AppRole role = appRoleService.getById(roleId); AppRole role = appRoleService.getById(roleId);
if (role == null || !"1".equals(role.getIsvaild())) { if (role == null || !"1".equals(role.getIsvaild())) {
return Result.error("角色不存在或已禁用"); return Result.error("角色不存在或已禁用");
} }
// 先删除原有的菜单权限 // 先删除原有的菜单权限
QueryWrapper<AppRoleMenu> deleteQuery = new QueryWrapper<>(); QueryWrapper<AppRoleMenu> deleteQuery = new QueryWrapper<>();
deleteQuery.eq("roleid", roleId); deleteQuery.eq("roleid", roleId);
appRoleMenuService.remove(deleteQuery); appRoleMenuService.remove(deleteQuery);
// 添加新的菜单权限 // 添加新的菜单权限
if (menuIds != null && !menuIds.isEmpty()) { if (menuIds != null && !menuIds.isEmpty()) {
List<AppRoleMenu> roleMenus = menuIds.stream().map(menuId -> { List<AppRoleMenu> roleMenus = menuIds.stream().map(menuId -> {
@ -245,11 +247,11 @@ public class AppRoleController {
roleMenu.setAppId(role.getAppId()); roleMenu.setAppId(role.getAppId());
return roleMenu; return roleMenu;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
boolean success = appRoleMenuService.saveBatch(roleMenus); boolean success = appRoleMenuService.saveBatch(roleMenus);
return success ? Result.success("权限分配成功") : Result.error("权限分配失败"); return success ? Result.success("权限分配成功") : Result.error("权限分配失败");
} }
return Result.success("权限分配成功"); return Result.success("权限分配成功");
} }
@ -259,12 +261,12 @@ public class AppRoleController {
public Result<List<String>> getRoleMenus(@Parameter(description = "角色ID") @PathVariable String roleId) { public Result<List<String>> getRoleMenus(@Parameter(description = "角色ID") @PathVariable String roleId) {
QueryWrapper<AppRoleMenu> queryWrapper = new QueryWrapper<>(); QueryWrapper<AppRoleMenu> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("roleid", roleId); queryWrapper.eq("roleid", roleId);
List<AppRoleMenu> roleMenus = appRoleMenuService.list(queryWrapper); List<AppRoleMenu> roleMenus = appRoleMenuService.list(queryWrapper);
List<String> menuIds = roleMenus.stream() List<String> menuIds = roleMenus.stream()
.map(AppRoleMenu::getMenuid) .map(AppRoleMenu::getMenuid)
.collect(Collectors.toList()); .collect(Collectors.toList());
return Result.success(menuIds); return Result.success(menuIds);
} }
@ -274,18 +276,18 @@ public class AppRoleController {
public Result<String> assignUsers( public Result<String> assignUsers(
@Parameter(description = "角色ID") @PathVariable String roleId, @Parameter(description = "角色ID") @PathVariable String roleId,
@RequestBody List<String> userIds) { @RequestBody List<String> userIds) {
// 检查角色是否存在 // 检查角色是否存在
AppRole role = appRoleService.getById(roleId); AppRole role = appRoleService.getById(roleId);
if (role == null || !"1".equals(role.getIsvaild())) { if (role == null || !"1".equals(role.getIsvaild())) {
return Result.error("角色不存在或已禁用"); return Result.error("角色不存在或已禁用");
} }
// 先删除原有的用户角色关联 // 先删除原有的用户角色关联
QueryWrapper<AppRoleUser> deleteQuery = new QueryWrapper<>(); QueryWrapper<AppRoleUser> deleteQuery = new QueryWrapper<>();
deleteQuery.eq("roleid", roleId); deleteQuery.eq("roleid", roleId);
appRoleUserService.remove(deleteQuery); appRoleUserService.remove(deleteQuery);
// 添加新的用户角色关联 // 添加新的用户角色关联
if (userIds != null && !userIds.isEmpty()) { if (userIds != null && !userIds.isEmpty()) {
List<AppRoleUser> roleUsers = userIds.stream().map(userId -> { List<AppRoleUser> roleUsers = userIds.stream().map(userId -> {
@ -295,11 +297,11 @@ public class AppRoleController {
roleUser.setAppId(role.getAppId()); roleUser.setAppId(role.getAppId());
return roleUser; return roleUser;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
boolean success = appRoleUserService.saveBatch(roleUsers); boolean success = appRoleUserService.saveBatch(roleUsers);
return success ? Result.success("用户分配成功") : Result.error("用户分配失败"); return success ? Result.success("用户分配成功") : Result.error("用户分配失败");
} }
return Result.success("用户分配成功"); return Result.success("用户分配成功");
} }
@ -309,12 +311,12 @@ public class AppRoleController {
public Result<List<String>> getRoleUsers(@Parameter(description = "角色ID") @PathVariable String roleId) { public Result<List<String>> getRoleUsers(@Parameter(description = "角色ID") @PathVariable String roleId) {
QueryWrapper<AppRoleUser> queryWrapper = new QueryWrapper<>(); QueryWrapper<AppRoleUser> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("roleid", roleId); queryWrapper.eq("roleid", roleId);
List<AppRoleUser> roleUsers = appRoleUserService.list(queryWrapper); List<AppRoleUser> roleUsers = appRoleUserService.list(queryWrapper);
List<String> userIds = roleUsers.stream() List<String> userIds = roleUsers.stream()
.map(AppRoleUser::getUserid) .map(AppRoleUser::getUserid)
.collect(Collectors.toList()); .collect(Collectors.toList());
return Result.success(userIds); return Result.success(userIds);
} }
} }

View File

@ -1,10 +1,12 @@
package com.stdproject.controller; package com.stdproject.controller;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.stdproject.common.OperationLog; import com.stdproject.common.OperationLog;
import com.stdproject.common.PageRequest; import com.stdproject.common.PageRequest;
import com.stdproject.common.QueryWrapperBuilder;
import com.stdproject.common.Result; import com.stdproject.common.Result;
import com.stdproject.entity.AppUser; import com.stdproject.entity.AppUser;
import com.stdproject.service.IAppUserService; import com.stdproject.service.IAppUserService;
@ -37,22 +39,25 @@ public class AppUserController {
private IAppUserService appUserService; private IAppUserService appUserService;
@Operation(summary = "分页查询用户列表") @Operation(summary = "分页查询用户列表")
@PostMapping("/page") @PostMapping("/page/{orgId}/{appId}")
@OperationLog(type = "06", module = "用户管理", description = "分页查询用户列表") @OperationLog(type = "06", module = "用户管理", description = "分页查询用户列表")
public Result<IPage<AppUser>> page(@RequestBody @Valid PageRequest pageRequest) { public Result<IPage<AppUser>> page(@Parameter(description = "用户ID") @PathVariable String orgId,
@Parameter(description = "用户ID") @PathVariable String appId,
@RequestBody @Valid PageRequest pageRequest) {
Page<AppUser> page = new Page<>(pageRequest.getCurrent(), pageRequest.getSize()); Page<AppUser> page = new Page<>(pageRequest.getCurrent(), pageRequest.getSize());
QueryWrapper<AppUser> queryWrapper = new QueryWrapper<>(); QueryWrapper<AppUser> queryWrapper = new QueryWrapper<>();
queryWrapper.eq(StrUtil.isNotBlank(orgId),"orgid",orgId);
queryWrapper.eq(StrUtil.isNotBlank(appId),"app_id",appId);
// 关键字搜索 // 关键字搜索
if (StringUtils.hasText(pageRequest.getKeyword())) { if (StringUtils.hasText(pageRequest.getKeyword())) {
queryWrapper.and(wrapper -> wrapper queryWrapper.and(wrapper -> wrapper
.like("username", pageRequest.getKeyword()) .like("username", pageRequest.getKeyword())
.or().like("nickname", pageRequest.getKeyword()) .or().like("nickname", pageRequest.getKeyword())
.or().like("email", pageRequest.getKeyword()) .or().like("email", pageRequest.getKeyword())
.or().like("phone", pageRequest.getKeyword()) .or().like("phone", pageRequest.getKeyword())
); );
} }
// 排序 // 排序
if (StringUtils.hasText(pageRequest.getOrderBy())) { if (StringUtils.hasText(pageRequest.getOrderBy())) {
if ("asc".equalsIgnoreCase(pageRequest.getOrderDirection())) { if ("asc".equalsIgnoreCase(pageRequest.getOrderDirection())) {
@ -63,7 +68,7 @@ public class AppUserController {
} else { } else {
queryWrapper.orderByDesc("lastmodifydate"); queryWrapper.orderByDesc("lastmodifydate");
} }
IPage<AppUser> result = appUserService.page(page, queryWrapper); IPage<AppUser> result = appUserService.page(page, queryWrapper);
return Result.success(result); return Result.success(result);
} }
@ -101,7 +106,7 @@ public class AppUserController {
if (existUser != null) { if (existUser != null) {
return Result.error("用户名已存在"); return Result.error("用户名已存在");
} }
// 设置默认值 // 设置默认值
if (!StringUtils.hasText(appUser.getStatus())) { if (!StringUtils.hasText(appUser.getStatus())) {
appUser.setStatus("1"); // 默认有效 appUser.setStatus("1"); // 默认有效
@ -112,12 +117,12 @@ public class AppUserController {
if (appUser.getFailednum() == null) { if (appUser.getFailednum() == null) {
appUser.setFailednum(0); appUser.setFailednum(0);
} }
// 密码加密 // 密码加密
if (StringUtils.hasText(appUser.getPassword())) { if (StringUtils.hasText(appUser.getPassword())) {
appUser.setPassword(PasswordUtils.encodePassword(appUser.getPassword())); appUser.setPassword(PasswordUtils.encodePassword(appUser.getPassword()));
} }
appUser.setLastmodifydate(LocalDateTime.now()); appUser.setLastmodifydate(LocalDateTime.now());
boolean success = appUserService.save(appUser); boolean success = appUserService.save(appUser);
return success ? Result.success("新增成功") : Result.error("新增失败"); return success ? Result.success("新增成功") : Result.error("新增失败");
@ -132,7 +137,7 @@ public class AppUserController {
if (existUser == null) { if (existUser == null) {
return Result.error("用户不存在"); return Result.error("用户不存在");
} }
// 如果修改了用户名检查新用户名是否已被其他用户使用 // 如果修改了用户名检查新用户名是否已被其他用户使用
if (!existUser.getUsername().equals(appUser.getUsername())) { if (!existUser.getUsername().equals(appUser.getUsername())) {
AppUser userWithSameName = appUserService.findByUsername(appUser.getUsername()); AppUser userWithSameName = appUserService.findByUsername(appUser.getUsername());
@ -140,7 +145,7 @@ public class AppUserController {
return Result.error("用户名已被其他用户使用"); return Result.error("用户名已被其他用户使用");
} }
} }
// 如果传入了新密码进行加密 // 如果传入了新密码进行加密
if (StringUtils.hasText(appUser.getPassword())) { if (StringUtils.hasText(appUser.getPassword())) {
appUser.setPassword(PasswordUtils.encodePassword(appUser.getPassword())); appUser.setPassword(PasswordUtils.encodePassword(appUser.getPassword()));
@ -149,7 +154,7 @@ public class AppUserController {
// 如果没有传入密码保持原密码不变 // 如果没有传入密码保持原密码不变
appUser.setPassword(existUser.getPassword()); appUser.setPassword(existUser.getPassword());
} }
appUser.setLastmodifydate(LocalDateTime.now()); appUser.setLastmodifydate(LocalDateTime.now());
boolean success = appUserService.updateById(appUser); boolean success = appUserService.updateById(appUser);
return success ? Result.success("修改成功") : Result.error("修改失败"); return success ? Result.success("修改成功") : Result.error("修改失败");
@ -181,17 +186,17 @@ public class AppUserController {
if (user == null) { if (user == null) {
return Result.error("用户不存在"); return Result.error("用户不存在");
} }
// 验证旧密码 // 验证旧密码
if (!PasswordUtils.matches(request.getOldPassword(), user.getPassword())) { if (!PasswordUtils.matches(request.getOldPassword(), user.getPassword())) {
return Result.error("原密码错误"); return Result.error("原密码错误");
} }
// 更新新密码 // 更新新密码
user.setPassword(PasswordUtils.encodePassword(request.getNewPassword())); user.setPassword(PasswordUtils.encodePassword(request.getNewPassword()));
user.setPwdresettime(LocalDateTime.now()); user.setPwdresettime(LocalDateTime.now());
user.setLastmodifydate(LocalDateTime.now()); user.setLastmodifydate(LocalDateTime.now());
boolean success = appUserService.updateById(user); boolean success = appUserService.updateById(user);
return success ? Result.success("密码修改成功") : Result.error("密码修改失败"); return success ? Result.success("密码修改成功") : Result.error("密码修改失败");
} }
@ -206,12 +211,12 @@ public class AppUserController {
if (user == null) { if (user == null) {
return Result.error("用户不存在"); return Result.error("用户不存在");
} }
// 重置密码 // 重置密码
user.setPassword(PasswordUtils.encodePassword(request.getNewPassword())); user.setPassword(PasswordUtils.encodePassword(request.getNewPassword()));
user.setPwdresettime(LocalDateTime.now()); user.setPwdresettime(LocalDateTime.now());
user.setLastmodifydate(LocalDateTime.now()); user.setLastmodifydate(LocalDateTime.now());
boolean success = appUserService.updateById(user); boolean success = appUserService.updateById(user);
return success ? Result.success("密码重置成功") : Result.error("密码重置失败"); return success ? Result.success("密码重置成功") : Result.error("密码重置失败");
} }
@ -226,10 +231,10 @@ public class AppUserController {
if (user == null) { if (user == null) {
return Result.error("用户不存在"); return Result.error("用户不存在");
} }
user.setStatus(status); user.setStatus(status);
user.setLastmodifydate(LocalDateTime.now()); user.setLastmodifydate(LocalDateTime.now());
boolean success = appUserService.updateById(user); boolean success = appUserService.updateById(user);
String message = "1".equals(status) ? "启用成功" : "禁用成功"; String message = "1".equals(status) ? "启用成功" : "禁用成功";
return success ? Result.success(message) : Result.error("操作失败"); return success ? Result.success(message) : Result.error("操作失败");
@ -242,11 +247,11 @@ public class AppUserController {
QueryWrapper<AppUser> queryWrapper = new QueryWrapper<>(); QueryWrapper<AppUser> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("orgid", orgId); queryWrapper.eq("orgid", orgId);
queryWrapper.orderByDesc("lastmodifydate"); queryWrapper.orderByDesc("lastmodifydate");
List<AppUser> users = appUserService.list(queryWrapper); List<AppUser> users = appUserService.list(queryWrapper);
// 不返回密码信息 // 不返回密码信息
users.forEach(user -> user.setPassword(null)); users.forEach(user -> user.setPassword(null));
return Result.success(users); return Result.success(users);
} }
@ -254,24 +259,42 @@ public class AppUserController {
* 密码修改请求类 * 密码修改请求类
*/ */
public static class PasswordUpdateRequest { public static class PasswordUpdateRequest {
private String oldPassword; private String oldPassword;
private String newPassword; private String newPassword;
// getters and setters // getters and setters
public String getOldPassword() { return oldPassword; } public String getOldPassword() {
public void setOldPassword(String oldPassword) { this.oldPassword = oldPassword; } return oldPassword;
public String getNewPassword() { return newPassword; } }
public void setNewPassword(String newPassword) { this.newPassword = newPassword; }
public void setOldPassword(String oldPassword) {
this.oldPassword = oldPassword;
}
public String getNewPassword() {
return newPassword;
}
public void setNewPassword(String newPassword) {
this.newPassword = newPassword;
}
} }
/** /**
* 密码重置请求类 * 密码重置请求类
*/ */
public static class PasswordResetRequest { public static class PasswordResetRequest {
private String newPassword; private String newPassword;
// getters and setters // getters and setters
public String getNewPassword() { return newPassword; } public String getNewPassword() {
public void setNewPassword(String newPassword) { this.newPassword = newPassword; } return newPassword;
}
public void setNewPassword(String newPassword) {
this.newPassword = newPassword;
}
} }
} }

View File

@ -3,6 +3,7 @@ package com.stdproject.controller;
import com.stdproject.common.Constants; import com.stdproject.common.Constants;
import com.stdproject.common.OperationLog; import com.stdproject.common.OperationLog;
import com.stdproject.common.Result; import com.stdproject.common.Result;
import com.stdproject.config.WebConfig;
import com.stdproject.entity.AppUser; import com.stdproject.entity.AppUser;
import com.stdproject.service.IAppUserService; import com.stdproject.service.IAppUserService;
import com.stdproject.utils.CaptchaUtils; import com.stdproject.utils.CaptchaUtils;
@ -20,6 +21,7 @@ import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.UUID; import java.util.UUID;
@ -48,12 +50,14 @@ public class AuthController {
@Autowired @Autowired
private IAppUserService appUserService; private IAppUserService appUserService;
@Autowired
private WebConfig webConfig;
/** /**
* 登录请求类 * 登录请求类
*/ */
public static class LoginRequest { public static class LoginRequest {
@NotBlank(message = "用户名不能为空") @NotBlank(message = "用户名不能为空")
private String username; private String username;
@ -67,20 +71,44 @@ public class AuthController {
private String captchaKey; private String captchaKey;
// Getters and Setters // Getters and Setters
public String getUsername() { return username; } public String getUsername() {
public void setUsername(String username) { this.username = username; } return username;
public String getPassword() { return password; } }
public void setPassword(String password) { this.password = password; }
public String getCaptcha() { return captcha; } public void setUsername(String username) {
public void setCaptcha(String captcha) { this.captcha = captcha; } this.username = username;
public String getCaptchaKey() { return captchaKey; } }
public void setCaptchaKey(String captchaKey) { this.captchaKey = captchaKey; }
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getCaptcha() {
return captcha;
}
public void setCaptcha(String captcha) {
this.captcha = captcha;
}
public String getCaptchaKey() {
return captchaKey;
}
public void setCaptchaKey(String captchaKey) {
this.captchaKey = captchaKey;
}
} }
/** /**
* 修改密码请求类 * 修改密码请求类
*/ */
public static class ChangePasswordRequest { public static class ChangePasswordRequest {
@NotBlank(message = "原密码不能为空") @NotBlank(message = "原密码不能为空")
private String oldPassword; private String oldPassword;
@ -88,10 +116,21 @@ public class AuthController {
private String newPassword; private String newPassword;
// Getters and Setters // Getters and Setters
public String getOldPassword() { return oldPassword; } public String getOldPassword() {
public void setOldPassword(String oldPassword) { this.oldPassword = oldPassword; } return oldPassword;
public String getNewPassword() { return newPassword; } }
public void setNewPassword(String newPassword) { this.newPassword = newPassword; }
public void setOldPassword(String oldPassword) {
this.oldPassword = oldPassword;
}
public String getNewPassword() {
return newPassword;
}
public void setNewPassword(String newPassword) {
this.newPassword = newPassword;
}
} }
/** /**
@ -128,7 +167,8 @@ public class AuthController {
@Operation(summary = "用户登录", description = "用户登录认证") @Operation(summary = "用户登录", description = "用户登录认证")
@PostMapping("/login") @PostMapping("/login")
@OperationLog(type = Constants.OPT_TYPE_LOGIN, module = "认证管理", description = "用户登录") @OperationLog(type = Constants.OPT_TYPE_LOGIN, module = "认证管理", description = "用户登录")
public Result<Map<String, Object>> login(@Valid @RequestBody LoginRequest loginRequest, HttpServletRequest request) { public Result<Map<String, Object>> login(@Valid @RequestBody LoginRequest loginRequest,
HttpServletRequest request) {
try { try {
// 注意在实际应用中应该从会话或其他存储中获取验证码进行验证 // 注意在实际应用中应该从会话或其他存储中获取验证码进行验证
// 此处简化处理假设验证码已通过实际应用中需要实现验证逻辑 // 此处简化处理假设验证码已通过实际应用中需要实现验证逻辑
@ -136,17 +176,17 @@ public class AuthController {
// 进行身份认证 // 进行身份认证
Authentication authentication = authenticationManager.authenticate( Authentication authentication = authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken( new UsernamePasswordAuthenticationToken(
loginRequest.getUsername(), loginRequest.getUsername(),
loginRequest.getPassword() loginRequest.getPassword()
) )
); );
AppUser user=appUserService.findByUsername(loginRequest.getUsername()); AppUser user = appUserService.findByUsername(loginRequest.getUsername());
// 设置认证信息到安全上下文 // 设置认证信息到安全上下文
SecurityContextHolder.getContext().setAuthentication(authentication); SecurityContextHolder.getContext().setAuthentication(authentication);
// 生成JWT Token // 生成JWT Token
String token = jwtUtils.generateToken(user.getUsername(),user.getId()); String token = jwtUtils.generateToken(user.getUsername(), user.getId());
Map<String, Object> result = new HashMap<>(); Map<String, Object> result = new HashMap<>();
result.put("token", token); result.put("token", token);
@ -172,10 +212,19 @@ public class AuthController {
String token = request.getHeader(Constants.JWT_HEADER); String token = request.getHeader(Constants.JWT_HEADER);
if (token != null && token.startsWith(Constants.JWT_PREFIX)) { if (token != null && token.startsWith(Constants.JWT_PREFIX)) {
token = token.substring(Constants.JWT_PREFIX.length()); token = token.substring(Constants.JWT_PREFIX.length());
// 实现token失效
Date expirationDateFromToken = jwtUtils.getExpirationDateFromToken(token);
// 获取当前时间的时间戳毫秒
long nowMillis = System.currentTimeMillis();
// 注意在实际应用中应该实现Token失效机制 // 获取 Token 过期时间的时间戳毫秒
// 可以考虑使用短期Token或其他方式实现Token失效 long expirationMillis = expirationDateFromToken.getTime();
// 此处省略Token黑名单实现
// 计算剩余有效时间毫秒
long remainingMillis = expirationMillis - nowMillis;
if (remainingMillis > 0) {
webConfig.loginuserCache().put(token, "1", remainingMillis);
}
} }
// 清除安全上下文 // 清除安全上下文
@ -216,14 +265,16 @@ public class AuthController {
@Operation(summary = "修改密码", description = "修改当前用户密码") @Operation(summary = "修改密码", description = "修改当前用户密码")
@PostMapping("/changePassword") @PostMapping("/changePassword")
@OperationLog(type = Constants.OPT_TYPE_UPDATE, module = "认证管理", description = "修改密码") @OperationLog(type = Constants.OPT_TYPE_UPDATE, module = "认证管理", description = "修改密码")
public Result<Void> changePassword(@Valid @RequestBody ChangePasswordRequest request, HttpServletRequest httpRequest) { public Result<Void> changePassword(@Valid @RequestBody ChangePasswordRequest request,
HttpServletRequest httpRequest) {
try { try {
String token = httpRequest.getHeader(Constants.JWT_HEADER); String token = httpRequest.getHeader(Constants.JWT_HEADER);
if (token != null && token.startsWith(Constants.JWT_PREFIX)) { if (token != null && token.startsWith(Constants.JWT_PREFIX)) {
token = token.substring(Constants.JWT_PREFIX.length()); token = token.substring(Constants.JWT_PREFIX.length());
String username = jwtUtils.getUsernameFromToken(token); String username = jwtUtils.getUsernameFromToken(token);
boolean success = appUserService.changePassword(username, request.getOldPassword(), request.getNewPassword()); boolean success = appUserService.changePassword(username, request.getOldPassword(),
request.getNewPassword());
if (success) { if (success) {
return Result.success(); return Result.success();
} else { } else {
@ -239,6 +290,7 @@ public class AuthController {
} }
@PostMapping("/refreshToken") @PostMapping("/refreshToken")
@Operation(summary = "刷新令牌", description = "刷新当前用户的令牌")
public Result<String> refreshToken(@RequestBody Map<String, String> params) { public Result<String> refreshToken(@RequestBody Map<String, String> params) {
String refreshToken = params.get("refreshToken"); String refreshToken = params.get("refreshToken");
@ -262,5 +314,9 @@ public class AuthController {
} }
} }
@GetMapping("/getExpirationDateFromToken")
public Result<Date> getExpirationDateFromToken(String token) {
Date expirationDateFromToken = jwtUtils.getExpirationDateFromToken(token);
return Result.success(expirationDateFromToken);
}
} }

View File

@ -15,4 +15,4 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper @Mapper
public interface AppOptLogMapper extends BaseMapper<AppOptLog> { public interface AppOptLogMapper extends BaseMapper<AppOptLog> {
} }

View File

@ -2,6 +2,7 @@ package com.stdproject.service;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.stdproject.entity.AppOptLog; import com.stdproject.entity.AppOptLog;
import org.apache.ibatis.annotations.Delete;
/** /**
* <p> * <p>
@ -13,4 +14,4 @@ import com.stdproject.entity.AppOptLog;
*/ */
public interface IAppOptLogService extends IService<AppOptLog> { public interface IAppOptLogService extends IService<AppOptLog> {
} }

View File

@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.stdproject.entity.AppOptLog; import com.stdproject.entity.AppOptLog;
import com.stdproject.mapper.AppOptLogMapper; import com.stdproject.mapper.AppOptLogMapper;
import com.stdproject.service.IAppOptLogService; import com.stdproject.service.IAppOptLogService;
import org.apache.ibatis.annotations.Delete;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
/** /**
@ -17,4 +19,4 @@ import org.springframework.stereotype.Service;
@Service @Service
public class AppOptLogServiceImpl extends ServiceImpl<AppOptLogMapper, AppOptLog> implements IAppOptLogService { public class AppOptLogServiceImpl extends ServiceImpl<AppOptLogMapper, AppOptLog> implements IAppOptLogService {
} }

View File

@ -82,4 +82,4 @@ public class PasswordUtils {
return hasUpper && hasLower && hasDigit && hasSpecial; return hasUpper && hasLower && hasDigit && hasSpecial;
} }
} }