Compare commits

..

No commits in common. "8434098c39c011f47318f93b04d60d4fe607deaa" and "2d736e8f3d3c9629db07cdd470fa01e2ba6cb39a" have entirely different histories.

17 changed files with 268 additions and 763 deletions

View File

@ -1,12 +0,0 @@
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,8 +1,5 @@
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.stdproject.entity.AppOptLog;
import com.stdproject.service.IAppOptLogService;
@ -93,7 +90,7 @@ public class OperationLogAspect {
optLog.setDescription(operationLog.description());
optLog.setMethod(request.getMethod() + " " + request.getRequestURI());
optLog.setRequestip(getIpAddress(request));
optLog.setBrowser(getBrowser(request));
optLog.setBrowser(request.getHeader("User-Agent"));
optLog.setLogtime(LocalDateTime.now());
// 设置操作用户
@ -150,12 +147,6 @@ 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地址
*/

View File

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

View File

@ -1,92 +0,0 @@
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,9 +34,6 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
@Autowired
private UserDetailsService userDetailsService;
@Autowired
private WebConfig webConfig;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
@ -44,11 +41,6 @@ public class JwtAuthenticationFilter extends OncePerRequestFilter {
try {
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) {
String username = jwtUtils.getUsernameFromToken(jwt);

View File

@ -1,9 +1,5 @@
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.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@ -16,17 +12,6 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Value("${spring.security.jwt.expiration-ms}")
private Long expirationMs;
/**
* 用户缓存
*/
@Bean
public Cache<String, String> loginuserCache() {
return CacheUtil.newTimedCache(expirationMs);
}
/**
* 静态资源处理
*/

View File

@ -18,7 +18,6 @@ import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
/**
* <p>
@ -129,7 +128,7 @@ public class AppDictionaryController {
if (appDictionary.getOrderno() == null) {
// 获取同一字典编码下的最大序号
QueryWrapper<AppDictionary> orderQuery = new QueryWrapper<>();
orderQuery.eq("app_id", appDictionary.getAppId());
orderQuery.eq("dictcode", appDictionary.getDictcode());
orderQuery.orderByDesc("orderno");
orderQuery.last("LIMIT 1");
AppDictionary lastDict = appDictionaryService.getOne(orderQuery);
@ -245,7 +244,7 @@ public class AppDictionaryController {
@Operation(summary = "根据字典编码分组查询字典项")
@GetMapping("/grouped")
@OperationLog(type = "06", module = "数据字典管理", description = "根据字典编码分组查询字典项")
public Result<Map<String, List<AppDictionary>>> getGroupedDictionaries() {
public Result<java.util.Map<String, List<AppDictionary>>> getGroupedDictionaries() {
QueryWrapper<AppDictionary> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByAsc("dictcode", "orderno");

View File

@ -1,8 +1,6 @@
package com.stdproject.controller;
import cn.hutool.core.util.StrUtil;
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.extension.plugins.pagination.Page;
import com.stdproject.common.OperationLog;
@ -10,7 +8,6 @@ import com.stdproject.common.PageRequest;
import com.stdproject.common.Result;
import com.stdproject.entity.AppMenu;
import com.stdproject.service.IAppMenuService;
import com.stdproject.service.IAppUserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
@ -40,9 +37,6 @@ public class AppMenuController {
@Autowired
private IAppMenuService appMenuService;
@Autowired
private IAppUserService appUserService;
@Operation(summary = "分页查询菜单列表")
@PostMapping("/page")
@OperationLog(type = "06", module = "菜单管理", description = "分页查询菜单列表")
@ -88,10 +82,8 @@ public class AppMenuController {
@Operation(summary = "获取菜单树形结构")
@GetMapping("/tree")
@OperationLog(type = "06", module = "菜单管理", description = "获取菜单树形结构")
public Result<List<MenuTreeNode>> getMenuTree(@RequestParam String appId,@RequestParam String name) {
public Result<List<MenuTreeNode>> getMenuTree() {
QueryWrapper<AppMenu> queryWrapper = new QueryWrapper<>();
queryWrapper.eq(StrUtil.isNotBlank(appId),"app_id", appId);
queryWrapper.like(StrUtil.isNotBlank(name),"name", name);
queryWrapper.orderByAsc("parentid", "orderno");
List<AppMenu> allMenus = appMenuService.list(queryWrapper);
@ -163,7 +155,6 @@ public class AppMenuController {
}
appMenu.setLastmodifydate(LocalDateTime.now());
appMenu.setLastmodifier(appUserService.getCurrentUsername());
boolean success = appMenuService.save(appMenu);
return success ? Result.success("新增成功") : Result.error("新增失败");
}
@ -196,7 +187,7 @@ public class AppMenuController {
}
// 检查父级菜单是否存在如果不是顶级菜单
if (!"0".equals(existMenu.getParentid())) {
if (!"0".equals(appMenu.getParentid())) {
AppMenu parentMenu = appMenuService.getById(appMenu.getParentid());
if (parentMenu == null) {
return Result.error("父级菜单不存在");
@ -205,38 +196,10 @@ public class AppMenuController {
}
appMenu.setLastmodifydate(LocalDateTime.now());
appMenu.setLastmodifier(appUserService.getCurrentUsername());
boolean success = appMenuService.updateById(appMenu);
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 = "删除菜单")
@DeleteMapping("/{id}")
@OperationLog(type = "03", module = "菜单管理", description = "删除菜单")
@ -360,7 +323,6 @@ public class AppMenuController {
* 菜单树节点
*/
public static class MenuTreeNode {
private String id;
private String code;
private String name;
@ -375,125 +337,42 @@ public class AppMenuController {
private List<MenuTreeNode> children = new ArrayList<>();
// Getters and Setters
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
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 String getId() { return id; }
public void setId(String id) { this.id = id; }
public String getCode() { return code; }
public void setCode(String code) { this.code = code; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
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 {
private String id;
private Integer orderno;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Integer getOrderno() {
return orderno;
}
public void setOrderno(Integer orderno) {
this.orderno = orderno;
}
public String getId() { return id; }
public void setId(String id) { this.id = id; }
public Integer getOrderno() { return orderno; }
public void setOrderno(Integer orderno) { this.orderno = orderno; }
}
}

View File

@ -1,6 +1,5 @@
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.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -13,14 +12,12 @@ import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
/**
@ -34,7 +31,6 @@ import java.util.List;
@Tag(name = "操作日志管理", description = "操作日志查询、操作日志删除等功能")
@RestController
@RequestMapping("/api/optlog")
@Slf4j
public class AppOptLogController {
@Autowired
@ -117,7 +113,7 @@ public class AppOptLogController {
@Parameter(description = "限制条数") @RequestParam(defaultValue = "100") Integer limit) {
QueryWrapper<AppOptLog> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("module", module);
queryWrapper.orderByDesc("logtime");
queryWrapper.orderByDesc("opttime");
queryWrapper.last("LIMIT " + limit);
List<AppOptLog> logs = appOptLogService.list(queryWrapper);
@ -132,8 +128,8 @@ public class AppOptLogController {
@Parameter(description = "结束时间") @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime endTime,
@Parameter(description = "限制条数") @RequestParam(defaultValue = "1000") Integer limit) {
QueryWrapper<AppOptLog> queryWrapper = new QueryWrapper<>();
queryWrapper.between("logtime", startTime, endTime);
queryWrapper.orderByDesc("logtime");
queryWrapper.between("opttime", startTime, endTime);
queryWrapper.orderByDesc("opttime");
queryWrapper.last("LIMIT " + limit);
List<AppOptLog> logs = appOptLogService.list(queryWrapper);
@ -148,13 +144,14 @@ public class AppOptLogController {
@Parameter(description = "限制条数") @RequestParam(defaultValue = "100") Integer limit) {
QueryWrapper<AppOptLog> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("ip", ip);
queryWrapper.orderByDesc("logtime");
queryWrapper.orderByDesc("opttime");
queryWrapper.last("LIMIT " + limit);
List<AppOptLog> logs = appOptLogService.list(queryWrapper);
return Result.success(logs);
}
@Operation(summary = "删除操作日志")
@DeleteMapping("/{id}")
@OperationLog(type = "03", module = "操作日志管理", description = "删除操作日志")
@ -175,21 +172,12 @@ public class AppOptLogController {
@DeleteMapping("/clean/{days}")
@OperationLog(type = "03", module = "操作日志管理", description = "清理历史操作日志")
public Result<String> cleanOldLogs(@Parameter(description = "保留天数") @PathVariable Integer days) {
try {
// 参数校验
if (days == null || days < 0 || days > 3650) {
return Result.error("保留天数必须在0到3650之间");
}
LocalDateTime cutoff = LocalDateTime.now().minusDays(days);
LambdaQueryWrapper<AppOptLog> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.lt(AppOptLog::getLogtime, cutoff);
LocalDateTime cutoffTime = LocalDateTime.now().minusDays(days);
QueryWrapper<AppOptLog> queryWrapper = new QueryWrapper<>();
queryWrapper.lt("logtime", cutoffTime);
boolean success = appOptLogService.remove(queryWrapper);
return success ? Result.success("清理成功") : Result.error("清理失败");
} catch (Exception e) {
// 记录异常日志以便排查
log.error("清理操作日志失败", e);
return Result.error("系统异常,请稍后再试");
}
}
@Operation(summary = "获取操作日志统计信息")
@ -202,17 +190,17 @@ public class AppOptLogController {
// 今日日志数
LocalDateTime todayStart = LocalDateTime.now().withHour(0).withMinute(0).withSecond(0).withNano(0);
QueryWrapper<AppOptLog> todayQuery = new QueryWrapper<>();
todayQuery.ge("logtime", todayStart);
todayQuery.ge("opttime", todayStart);
long todayCount = appOptLogService.count(todayQuery);
// 本周日志数
LocalDateTime weekStart = LocalDateTime.now().minusDays(7).withNano(0);
LocalDateTime weekStart = LocalDateTime.now().minusDays(7);
QueryWrapper<AppOptLog> weekQuery = new QueryWrapper<>();
weekQuery.ge("logtime", weekStart);
long weekCount = appOptLogService.count(weekQuery);
// 本月日志数
LocalDateTime monthStart = LocalDateTime.now().minusDays(30).withNano(0);
LocalDateTime monthStart = LocalDateTime.now().minusDays(30);
QueryWrapper<AppOptLog> monthQuery = new QueryWrapper<>();
monthQuery.ge("logtime", monthStart);
long monthCount = appOptLogService.count(monthQuery);
@ -243,42 +231,18 @@ public class AppOptLogController {
* 日志统计信息
*/
public static class LogStatistics {
private Long totalCount;
private Long todayCount;
private Long weekCount;
private Long monthCount;
public Long getTotalCount() {
return totalCount;
}
public void setTotalCount(Long totalCount) {
this.totalCount = totalCount;
}
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;
}
public Long getTotalCount() { return totalCount; }
public void setTotalCount(Long totalCount) { this.totalCount = totalCount; }
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,27 +1,21 @@
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.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.stdproject.common.OperationLog;
import com.stdproject.common.Result;
import com.stdproject.entity.AppOrganization;
import com.stdproject.service.IAppOrganizationService;
import com.stdproject.service.IAppUserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* <p>
@ -45,24 +39,21 @@ public class AppOrganizationController {
@Operation(summary = "查询公司结构树")
@GetMapping("/getCompanyTree")
@OperationLog(type = "06", module = "组织管理", description = "查询公司结构树")
public Result<List<OrganizationTreeNode>> getCompanyTree(@RequestParam String appId) {
public Result<List<AppOrganization>> getCompanyTree() {
QueryWrapper<AppOrganization> queryWrapper = new QueryWrapper<>();
queryWrapper.eq(StrUtil.isNotBlank(appId),"app_id", appId);
queryWrapper.eq("orgtype", "01");
queryWrapper.eq("isvaild", "1");
queryWrapper.orderByAsc("orgcode");
List<AppOrganization> children = appOrganizationService.list(queryWrapper);
List<OrganizationTreeNode> organizationTreeNodes = buildOrganizationTree(children, "0");
return Result.success(organizationTreeNodes);
return Result.success(children);
}
@Operation(summary = "查询公司/部门列表")
@Operation(summary = "查询部门列表")
@GetMapping("/getDepartmentList")
@OperationLog(type = "06", module = "组织管理", description = "查询公司/部门列表")
public Result<List<AppOrganization>> getDepartmentList(@RequestParam String appId, @RequestParam String orgtype,
@RequestParam String parentid, @RequestParam String keystr) {
@OperationLog(type = "06", module = "组织管理", description = "查询部门列表")
public Result<List<AppOrganization>> getDepartmentList(@RequestParam String parentid,@RequestParam String keystr) {
QueryWrapper<AppOrganization> queryWrapper = new QueryWrapper<>();
queryWrapper.eq(StrUtil.isNotBlank(appId), "app_id", appId);
queryWrapper.eq(StrUtil.isNotBlank(orgtype), "orgtype", orgtype);
queryWrapper.eq("orgtype", "02");
queryWrapper.eq("parentid", parentid);
queryWrapper.eq("isvaild", "1");
if (StringUtils.hasText(keystr)) {
@ -77,6 +68,8 @@ public class AppOrganizationController {
return Result.success(children);
}
@Operation(summary = "根据ID查询组织详情")
@GetMapping("getDetailById/{id}")
@OperationLog(type = "06", module = "组织管理", description = "根据ID查询组织详情")
@ -85,6 +78,7 @@ public class AppOrganizationController {
return Result.success(organization);
}
@Operation(summary = "新增组织")
@PostMapping("add")
@OperationLog(type = "01", module = "组织管理", description = "新增组织")
@ -132,19 +126,6 @@ public class AppOrganizationController {
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 = "删除组织")
@PostMapping("delete/{id}")
@OperationLog(type = "03", module = "组织管理", description = "删除组织")
@ -222,6 +203,7 @@ public class AppOrganizationController {
}
}
private String getMaxCodeByParentId(String orgType,String parentId) {
LambdaQueryWrapper<AppOrganization> queryWrapper = new LambdaQueryWrapper<AppOrganization>()
.eq(AppOrganization::getOrgtype, orgType)
@ -235,99 +217,5 @@ public class AppOrganizationController {
// 如果列表不为空返回第一个记录的orgcode
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,6 +1,5 @@
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.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@ -50,13 +49,12 @@ public class AppRoleController {
private IAppRoleUserService appRoleUserService;
@Operation(summary = "分页查询角色列表")
@PostMapping("/page/{appId}")
@PostMapping("/page")
@OperationLog(type = "06", module = "角色管理", description = "分页查询角色列表")
public Result<IPage<AppRole>> page(@Parameter(description = "用户ID") @PathVariable String appId,
@RequestBody @Valid PageRequest pageRequest) {
public Result<IPage<AppRole>> page(@RequestBody @Valid PageRequest pageRequest) {
Page<AppRole> page = new Page<>(pageRequest.getCurrent(), pageRequest.getSize());
QueryWrapper<AppRole> queryWrapper = new QueryWrapper<>();
queryWrapper.eq(StrUtil.isNotBlank(appId),"app_id",appId);
// 关键字搜索
if (StringUtils.hasText(pageRequest.getKeyword())) {
queryWrapper.and(wrapper -> wrapper
@ -103,7 +101,6 @@ public class AppRoleController {
AppRole role = appRoleService.getById(id);
return Result.success(role);
}
@Operation(summary = "新增角色")
@PostMapping
@OperationLog(type = "01", module = "角色管理", description = "新增角色")
@ -136,7 +133,6 @@ public class AppRoleController {
/**
* 获取最大的角色编号
*
* @return 最大角色编号
*/
private String getMaxRoleCode() {
@ -208,6 +204,8 @@ public class AppRoleController {
return Result.error("角色不存在");
}
@Operation(summary = "根据角色类型查询角色列表")
@GetMapping("/type/{type}")
@OperationLog(type = "06", module = "角色管理", description = "根据角色类型查询角色列表")

View File

@ -1,12 +1,10 @@
package com.stdproject.controller;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.stdproject.common.OperationLog;
import com.stdproject.common.PageRequest;
import com.stdproject.common.QueryWrapperBuilder;
import com.stdproject.common.Result;
import com.stdproject.entity.AppUser;
import com.stdproject.service.IAppUserService;
@ -39,15 +37,12 @@ public class AppUserController {
private IAppUserService appUserService;
@Operation(summary = "分页查询用户列表")
@PostMapping("/page/{orgId}/{appId}")
@PostMapping("/page")
@OperationLog(type = "06", module = "用户管理", description = "分页查询用户列表")
public Result<IPage<AppUser>> page(@Parameter(description = "用户ID") @PathVariable String orgId,
@Parameter(description = "用户ID") @PathVariable String appId,
@RequestBody @Valid PageRequest pageRequest) {
public Result<IPage<AppUser>> page(@RequestBody @Valid PageRequest pageRequest) {
Page<AppUser> page = new Page<>(pageRequest.getCurrent(), pageRequest.getSize());
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())) {
queryWrapper.and(wrapper -> wrapper
@ -259,42 +254,24 @@ public class AppUserController {
* 密码修改请求类
*/
public static class PasswordUpdateRequest {
private String oldPassword;
private String newPassword;
// getters and setters
public String getOldPassword() {
return oldPassword;
}
public void setOldPassword(String oldPassword) {
this.oldPassword = oldPassword;
}
public String getNewPassword() {
return newPassword;
}
public void setNewPassword(String newPassword) {
this.newPassword = newPassword;
}
public String getOldPassword() { return oldPassword; }
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 {
private String newPassword;
// getters and setters
public String getNewPassword() {
return newPassword;
}
public void setNewPassword(String newPassword) {
this.newPassword = newPassword;
}
public String getNewPassword() { return newPassword; }
public void setNewPassword(String newPassword) { this.newPassword = newPassword; }
}
}

View File

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

View File

@ -2,7 +2,6 @@ package com.stdproject.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.stdproject.entity.AppOptLog;
import org.apache.ibatis.annotations.Delete;
/**
* <p>

View File

@ -4,8 +4,6 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.stdproject.entity.AppOptLog;
import com.stdproject.mapper.AppOptLogMapper;
import com.stdproject.service.IAppOptLogService;
import org.apache.ibatis.annotations.Delete;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**