From 96dd81860e5fe8b5b4c0f257850408c77886b55e Mon Sep 17 00:00:00 2001 From: wanghu Date: Mon, 17 Aug 2026 14:56:58 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AD=A6=E6=A0=A1=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/api/CacheController.java | 89 +++++++++---------- .../oapi/sync/SyncGroupController.java | 10 ++- .../oapi/sync/SyncUserController.java | 2 + .../service/com/ComSchTreeService.java | 10 ++- 4 files changed, 57 insertions(+), 54 deletions(-) diff --git a/src/main/java/com/yunhai/bschclassmanage/controller/api/CacheController.java b/src/main/java/com/yunhai/bschclassmanage/controller/api/CacheController.java index c9fdc6d..26775e7 100644 --- a/src/main/java/com/yunhai/bschclassmanage/controller/api/CacheController.java +++ b/src/main/java/com/yunhai/bschclassmanage/controller/api/CacheController.java @@ -2,17 +2,23 @@ package com.yunhai.bschclassmanage.controller.api; import com.yunhai.bschclassmanage.config.Config; import com.yunhai.bschclassmanage.controller.BaseController; +import com.yunhai.bschclassmanage.enums.UserType; import com.yunhai.bschclassmanage.utils.RedisUtil; +import com.yunhai.bschclassmanage.utils.UserContext; +import com.yunhai.platform.utils.exception.DException; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.*; +import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; /** * 缓存查看接口 @@ -23,12 +29,25 @@ import java.util.concurrent.TimeUnit; @CrossOrigin(originPatterns = {"*"}, allowCredentials = "true") public class CacheController extends BaseController { + /** 匹配全部 key 的通配符,禁止用于清空全部 */ + private static final String ALL_KEYS_PATTERN = "*"; + @Autowired private RedisTemplate redisTemplate; @Autowired private RedisUtil redisUtil; + /** + * 超管校验:非超级管理员直接抛异常阻断 + */ + private void denyIfNotSuperAdmin() { + boolean isSuperAdmin = UserType.SUPER_ADMINISTRATOR.getId().equals(UserContext.getType()); + if (!isSuperAdmin) { + throw new DException("无权限:仅超级管理员可执行缓存操作"); + } + } + /** * 根据 key 查看缓存内容 * 返回 key 是否存在、数据类型、剩余过期时间(秒)以及对应的值 @@ -38,22 +57,18 @@ public class CacheController extends BaseController { */ @GetMapping("get") public Map getByKey(@RequestParam String key) { - Map result = new HashMap<>(); - result.put("key", key); - + denyIfNotSuperAdmin(); if (StringUtils.isBlank(key)) { - result.put("exists", false); - result.put("msg", "key不能为空"); - return result; + throw new DException("key不能为空"); } Boolean exists = redisTemplate.hasKey(key); if (exists == null || !exists) { - result.put("exists", false); - result.put("msg", "缓存不存在或已过期"); - return result; + throw new DException("缓存不存在或已过期"); } + Map result = new HashMap<>(); + result.put("key", key); result.put("exists", true); String type = redisTemplate.type(key).name().toLowerCase(); result.put("type", type); @@ -90,7 +105,8 @@ public class CacheController extends BaseController { * @param pattern 匹配模式,默认 * 表示所有 key */ @GetMapping("keys") - public Object keys(@RequestParam(required = false, defaultValue = "*") String pattern) { + public Set keys(@RequestParam(required = false, defaultValue = "*") String pattern) { + denyIfNotSuperAdmin(); return redisUtil.keys(pattern); } @@ -103,14 +119,19 @@ public class CacheController extends BaseController { */ @PostMapping("delete") public Map delete(@RequestParam String key) { - Map result = new HashMap<>(); + denyIfNotSuperAdmin(); if (StringUtils.isBlank(key)) { - result.put("success", false); - result.put("msg", "key不能为空"); - return result; + throw new DException("key不能为空"); } - String[] keys = key.split(","); - long count = redisTemplate.delete(java.util.Arrays.asList(keys)); + List keys = Arrays.stream(key.split(",")) + .map(String::trim) + .filter(StringUtils::isNotBlank) + .collect(Collectors.toList()); + if (keys.isEmpty()) { + throw new DException("key不能为空"); + } + long count = redisTemplate.delete(keys); + Map result = new HashMap<>(); result.put("success", true); result.put("deleted", count); result.put("msg", "已清除 " + count + " 个 key"); @@ -125,43 +146,19 @@ public class CacheController extends BaseController { */ @PostMapping("deletePattern") public Map deletePattern(@RequestParam String pattern) { - Map result = new HashMap<>(); - if (StringUtils.isBlank(pattern) || "*".equals(pattern.trim())) { - result.put("success", false); - result.put("msg", "禁止用 * 清空全部,请使用 clearAll 接口或指定明确前缀"); - return result; + denyIfNotSuperAdmin(); + if (StringUtils.isBlank(pattern) || ALL_KEYS_PATTERN.equals(pattern.trim())) { + throw new DException("禁止用 * 清空全部,请指定明确的 key 前缀"); } - Set keys = redisUtil.keys(pattern); - Map ret = new HashMap<>(); + Set keys = redisUtil.keys(pattern.trim()); if (keys == null || keys.isEmpty()) { - result.put("success", true); - result.put("deleted", 0); - result.put("msg", "未匹配到任何 key"); - return result; + throw new DException("未匹配到任何 key"); } redisTemplate.delete(keys); + Map result = new HashMap<>(); result.put("success", true); result.put("deleted", keys.size()); result.put("msg", "已清除 " + keys.size() + " 个 key"); return result; } - - /** - * 清空当前 Redis 数据库(仅当前 db,不影响其他 db) - * ⚠️ 高危操作:会删除当前库下所有缓存,请谨慎调用 - */ - @PostMapping("clearAll") - public Map clearAll() { - Map result = new HashMap<>(); - try { - redisTemplate.getConnectionFactory().getConnection().flushDb(); - result.put("success", true); - result.put("msg", "当前数据库已清空"); - } catch (Exception e) { - log.error("清空缓存失败", e); - result.put("success", false); - result.put("msg", "清空失败:" + e.getMessage()); - } - return result; - } } diff --git a/src/main/java/com/yunhai/bschclassmanage/controller/oapi/sync/SyncGroupController.java b/src/main/java/com/yunhai/bschclassmanage/controller/oapi/sync/SyncGroupController.java index 5304d95..6fcff54 100644 --- a/src/main/java/com/yunhai/bschclassmanage/controller/oapi/sync/SyncGroupController.java +++ b/src/main/java/com/yunhai/bschclassmanage/controller/oapi/sync/SyncGroupController.java @@ -22,7 +22,7 @@ public class SyncGroupController { @PostMapping("AddGroup") public void AddGroup(@RequestBody String jsonString) { - log.info("jsonString="+jsonString); + log.info("AddGroup jsonString="+jsonString); //判断 2,"学校组" 4, "班级组" SyncGroupDTO group = OtherUtil.jsonParseObject(jsonString, SyncGroupDTO.class); syncGroupService.syncAddOrUpdate(group); @@ -30,19 +30,21 @@ public class SyncGroupController { @PostMapping("UpdateGroup") public void UpdateGroup(@RequestBody String jsonString) { - log.info("jsonString="+jsonString); + log.info("UpdateGroup jsonString="+jsonString); SyncGroupDTO group = OtherUtil.jsonParseObject(jsonString, SyncGroupDTO.class); syncGroupService.syncAddOrUpdate(group); } @PostMapping("DeleteGroup") public void DeleteGroup(@RequestBody String jsonString) { - log.info("jsonString="+jsonString); + log.info("DeleteGroup jsonString="+jsonString); } @PostMapping("SyncGroup") public void SyncGroup(@RequestBody String jsonString) { - log.info("jsonString="+jsonString); + log.info("SyncGroup jsonString="+jsonString); + SyncGroupDTO group = OtherUtil.jsonParseObject(jsonString, SyncGroupDTO.class); + syncGroupService.syncAddOrUpdate(group); } } diff --git a/src/main/java/com/yunhai/bschclassmanage/controller/oapi/sync/SyncUserController.java b/src/main/java/com/yunhai/bschclassmanage/controller/oapi/sync/SyncUserController.java index 7b8b474..2d5775d 100644 --- a/src/main/java/com/yunhai/bschclassmanage/controller/oapi/sync/SyncUserController.java +++ b/src/main/java/com/yunhai/bschclassmanage/controller/oapi/sync/SyncUserController.java @@ -43,5 +43,7 @@ public class SyncUserController { @PostMapping("SyncUser") public void SyncUser(@RequestBody String jsonString) { log.info("SyncUser jsonString="+jsonString); + List userList = OtherUtil.jsonParseList(jsonString, SyncUserDTO.class); + syncUserService.syncAddOrUpdate(userList); } } diff --git a/src/main/java/com/yunhai/bschclassmanage/service/com/ComSchTreeService.java b/src/main/java/com/yunhai/bschclassmanage/service/com/ComSchTreeService.java index 039a992..f9c14c7 100644 --- a/src/main/java/com/yunhai/bschclassmanage/service/com/ComSchTreeService.java +++ b/src/main/java/com/yunhai/bschclassmanage/service/com/ComSchTreeService.java @@ -107,10 +107,12 @@ public class ComSchTreeService implements IComSchTreeService { public List getSchTree(Integer schId) { - String cacheKey = RedisConstants.SCHOOL_TREE + "_" + schId; - String json = redisUtil.get(cacheKey,String.class); - List treeList = OtherUtil.jsonParseArrayTree(json, BoaGroup.class); - return treeList; + BoaGroup group = YschBaseOpenApi.getGroupById(schId,true); + return Collections.singletonList(group); +// String cacheKey = RedisConstants.SCHOOL_TREE + "_" + schId; +// String json = redisUtil.get(cacheKey,String.class); +// List treeList = OtherUtil.jsonParseArrayTree(json, BoaGroup.class); +// return treeList; }