feat: 缓存列表,监控,性能监控添加按钮级权限控制

This commit is contained in:
2025-02-22 23:46:00 +08:00
parent 75a163910d
commit 5be35d8231
3 changed files with 51 additions and 12 deletions

View File

@@ -9,6 +9,7 @@
from fastapi import APIRouter, Depends, Path, Request from fastapi import APIRouter, Depends, Path, Request
from fastapi.responses import JSONResponse from fastapi.responses import JSONResponse
from annotation.auth import Auth
from annotation.log import Log from annotation.log import Log
from config.constant import BusinessType, RedisKeyConfig from config.constant import BusinessType, RedisKeyConfig
from controller.login import LoginController from controller.login import LoginController
@@ -26,6 +27,7 @@ cacheAPI = APIRouter(
@cacheAPI.get("/monitor", response_class=JSONResponse, response_model=GetCacheMonitorResponse, @cacheAPI.get("/monitor", response_class=JSONResponse, response_model=GetCacheMonitorResponse,
summary="获取缓存监控信息") summary="获取缓存监控信息")
@Log(title="获取缓存监控信息", business_type=BusinessType.SELECT) @Log(title="获取缓存监控信息", business_type=BusinessType.SELECT)
@Auth(permission_list=['cache:btn:infoList'])
async def get_cache_info(request: Request): async def get_cache_info(request: Request):
info = await request.app.state.redis.info() info = await request.app.state.redis.info()
db_size = await request.app.state.redis.dbsize() db_size = await request.app.state.redis.dbsize()
@@ -45,6 +47,7 @@ async def get_cache_info(request: Request):
@cacheAPI.get("/names", response_class=JSONResponse, response_model=GetCacheInfoResponse, @cacheAPI.get("/names", response_class=JSONResponse, response_model=GetCacheInfoResponse,
summary="获取缓存名称列表") summary="获取缓存名称列表")
@Log(title="获取缓存名称列表", business_type=BusinessType.SELECT) @Log(title="获取缓存名称列表", business_type=BusinessType.SELECT)
@Auth(permission_list=['cache:btn:list'])
async def get_cache_names(request: Request): async def get_cache_names(request: Request):
name_list = [] name_list = []
for key_config in RedisKeyConfig: for key_config in RedisKeyConfig:
@@ -62,6 +65,7 @@ async def get_cache_names(request: Request):
@cacheAPI.get("/keys/{cacheName}", response_class=JSONResponse, response_model=GetCacheKeysListResponse, @cacheAPI.get("/keys/{cacheName}", response_class=JSONResponse, response_model=GetCacheKeysListResponse,
summary="获取缓存键名列表") summary="获取缓存键名列表")
@Log(title="获取缓存键名列表", business_type=BusinessType.SELECT) @Log(title="获取缓存键名列表", business_type=BusinessType.SELECT)
@Auth(permission_list=['cache:btn:list'])
async def get_cache_keys(request: Request, cacheName: str = Path(description="缓存名称")): async def get_cache_keys(request: Request, cacheName: str = Path(description="缓存名称")):
cache_keys = await request.app.state.redis.keys(f'{cacheName}*') cache_keys = await request.app.state.redis.keys(f'{cacheName}*')
cache_key_list = [key.split(':', 1)[1] for key in cache_keys if key.startswith(f'{cacheName}:')] cache_key_list = [key.split(':', 1)[1] for key in cache_keys if key.startswith(f'{cacheName}:')]
@@ -71,6 +75,7 @@ async def get_cache_keys(request: Request, cacheName: str = Path(description="
@cacheAPI.get("/info/{cacheName}/{cacheKey}", response_class=JSONResponse, response_model=GetCacheInfoResponse, @cacheAPI.get("/info/{cacheName}/{cacheKey}", response_class=JSONResponse, response_model=GetCacheInfoResponse,
summary="获取缓存信息") summary="获取缓存信息")
@Log(title="获取缓存信息", business_type=BusinessType.SELECT) @Log(title="获取缓存信息", business_type=BusinessType.SELECT)
@Auth(permission_list=['cache:btn:info'])
async def get_cache_info(request: Request, cacheName: str = Path(description="缓存名称"), async def get_cache_info(request: Request, cacheName: str = Path(description="缓存名称"),
cacheKey: str = Path(description="缓存键名")): cacheKey: str = Path(description="缓存键名")):
cache_value = await request.app.state.redis.get(f'{cacheName}:{cacheKey}') cache_value = await request.app.state.redis.get(f'{cacheName}:{cacheKey}')
@@ -88,6 +93,7 @@ async def get_cache_info(request: Request, cacheName: str = Path(description="
@cacheAPI.post("/cacheName/{name}", response_class=JSONResponse, response_model=BaseResponse, @cacheAPI.post("/cacheName/{name}", response_class=JSONResponse, response_model=BaseResponse,
summary="通过键名删除缓存") summary="通过键名删除缓存")
@Log(title="通过键名删除缓存", business_type=BusinessType.DELETE) @Log(title="通过键名删除缓存", business_type=BusinessType.DELETE)
@Auth(permission_list=['cache:btn:delete'])
async def delete_cache(request: Request, name: str = Path(description="缓存名称")): async def delete_cache(request: Request, name: str = Path(description="缓存名称")):
cache_keys = await request.app.state.redis.keys(f'{name}*') cache_keys = await request.app.state.redis.keys(f'{name}*')
if cache_keys: if cache_keys:
@@ -99,6 +105,7 @@ async def delete_cache(request: Request, name: str = Path(description="缓存名
summary="通过键值删除缓存") summary="通过键值删除缓存")
@cacheAPI.post("/cacheKey/{key}", response_class=JSONResponse, response_model=BaseResponse, summary="通过键值删除缓存") @cacheAPI.post("/cacheKey/{key}", response_class=JSONResponse, response_model=BaseResponse, summary="通过键值删除缓存")
@Log(title="通过键值删除缓存", business_type=BusinessType.DELETE) @Log(title="通过键值删除缓存", business_type=BusinessType.DELETE)
@Auth(permission_list=['cache:btn:delete'])
async def delete_cache_key(request: Request, key: str = Path(description="缓存键名")): async def delete_cache_key(request: Request, key: str = Path(description="缓存键名")):
cache_keys = await request.app.state.redis.keys(f'*{key}') cache_keys = await request.app.state.redis.keys(f'*{key}')
if cache_keys: if cache_keys:
@@ -109,6 +116,7 @@ async def delete_cache_key(request: Request, key: str = Path(description="缓存
@cacheAPI.delete("/clearAll", response_class=JSONResponse, response_model=BaseResponse, summary="删除所有缓存") @cacheAPI.delete("/clearAll", response_class=JSONResponse, response_model=BaseResponse, summary="删除所有缓存")
@cacheAPI.post("/clearAll", response_class=JSONResponse, response_model=BaseResponse, summary="删除所有缓存") @cacheAPI.post("/clearAll", response_class=JSONResponse, response_model=BaseResponse, summary="删除所有缓存")
@Log(title="删除所有缓存", business_type=BusinessType.DELETE) @Log(title="删除所有缓存", business_type=BusinessType.DELETE)
@Auth(permission_list=['cache:btn:delete'])
async def delete_all_cache(request: Request): async def delete_all_cache(request: Request):
cache_keys = await request.app.state.redis.keys() cache_keys = await request.app.state.redis.keys()
if cache_keys: if cache_keys:

View File

@@ -12,7 +12,7 @@ from fastapi.responses import JSONResponse
from annotation.auth import Auth from annotation.auth import Auth
from annotation.log import Log from annotation.log import Log
from config.constant import BusinessType from config.constant import BusinessType, RedisKeyConfig
from controller.login import LoginController from controller.login import LoginController
from models import Permission from models import Permission
from schemas.common import BaseResponse from schemas.common import BaseResponse
@@ -53,6 +53,14 @@ async def add_permission(request: Request, params: AddPermissionParams):
hidden_tag=params.hidden_tag, hidden_tag=params.hidden_tag,
) )
if permission: if permission:
# 更新用户信息缓存
userInfos = await request.app.state.redis.keys(f'{RedisKeyConfig.USER_INFO.key}*')
if userInfos:
await request.app.state.redis.delete(*userInfos)
# 更新用户路由缓存
userRoutes = await request.app.state.redis.keys(f'{RedisKeyConfig.USER_ROUTES.key}*')
if userRoutes:
await request.app.state.redis.delete(*userRoutes)
return Response.success(msg="新增权限成功!") return Response.success(msg="新增权限成功!")
else: else:
return Response.error(msg="新增权限失败!") return Response.error(msg="新增权限失败!")
@@ -66,6 +74,14 @@ async def delete_permission(request: Request, id: str = Path(description="权限
if permission := await Permission.get_or_none(id=id, del_flag=1): if permission := await Permission.get_or_none(id=id, del_flag=1):
permission.del_flag = 0 permission.del_flag = 0
await permission.save() await permission.save()
# 更新用户信息缓存
userInfos = await request.app.state.redis.keys(f'{RedisKeyConfig.USER_INFO.key}*')
if userInfos:
await request.app.state.redis.delete(*userInfos)
# 更新用户路由缓存
userRoutes = await request.app.state.redis.keys(f'{RedisKeyConfig.USER_ROUTES.key}*')
if userRoutes:
await request.app.state.redis.delete(*userRoutes)
return Response.success(msg="删除权限成功!") return Response.success(msg="删除权限成功!")
else: else:
return Response.error(msg="删除权限失败,权限不存在!") return Response.error(msg="删除权限失败,权限不存在!")
@@ -99,6 +115,14 @@ async def update_permission(request: Request, params: AddPermissionParams, id: s
permission.fixed_tag = params.fixed_tag permission.fixed_tag = params.fixed_tag
permission.hidden_tag = params.hidden_tag permission.hidden_tag = params.hidden_tag
await permission.save() await permission.save()
# 更新用户信息缓存
userInfos = await request.app.state.redis.keys(f'{RedisKeyConfig.USER_INFO.key}*')
if userInfos:
await request.app.state.redis.delete(*userInfos)
# 更新用户路由缓存
userRoutes = await request.app.state.redis.keys(f'{RedisKeyConfig.USER_ROUTES.key}*')
if userRoutes:
await request.app.state.redis.delete(*userRoutes)
return Response.success(msg="更新权限成功!") return Response.success(msg="更新权限成功!")
else: else:
return Response.error(msg="更新权限失败,权限不存在!") return Response.error(msg="更新权限失败,权限不存在!")

View File

@@ -14,12 +14,14 @@ import psutil
from fastapi import APIRouter, Depends, Request from fastapi import APIRouter, Depends, Request
from fastapi.responses import JSONResponse from fastapi.responses import JSONResponse
from annotation.auth import Auth
from annotation.log import Log from annotation.log import Log
from config.constant import BusinessType from config.constant import BusinessType
from controller.login import LoginController from controller.login import LoginController
from schemas.server import GetServerInfoResponse, CpuInfo, MemoryInfo, SystemInfo, PythonInfo, SystemFiles, \ from schemas.server import GetServerInfoResponse, CpuInfo, MemoryInfo, SystemInfo, PythonInfo, SystemFiles, \
GetSystemInfoResult GetSystemInfoResult
from utils.common import bytes2human from utils.common import bytes2human
from utils.log import logger
from utils.response import Response from utils.response import Response
serverAPI = APIRouter( serverAPI = APIRouter(
@@ -30,6 +32,7 @@ serverAPI = APIRouter(
@serverAPI.get("", response_class=JSONResponse, response_model=GetServerInfoResponse, summary="获取服务器信息") @serverAPI.get("", response_class=JSONResponse, response_model=GetServerInfoResponse, summary="获取服务器信息")
@Log(title="获取服务器信息", business_type=BusinessType.SELECT) @Log(title="获取服务器信息", business_type=BusinessType.SELECT)
@Auth(permission_list=["server:btn:info"])
async def get_server_info(request: Request): async def get_server_info(request: Request):
# CPU信息 # CPU信息
# 获取CPU总核心数 # 获取CPU总核心数
@@ -96,6 +99,7 @@ async def get_server_info(request: Request):
io = psutil.disk_partitions() io = psutil.disk_partitions()
sys_files = [] sys_files = []
for i in io: for i in io:
try:
o = psutil.disk_usage(i.device) o = psutil.disk_usage(i.device)
disk_data = SystemFiles( disk_data = SystemFiles(
dirName=i.device, dirName=i.device,
@@ -107,6 +111,9 @@ async def get_server_info(request: Request):
usage=f'{psutil.disk_usage(i.device).percent}%', usage=f'{psutil.disk_usage(i.device).percent}%',
) )
sys_files.append(disk_data) sys_files.append(disk_data)
except Exception as e:
logger.error(f"获取磁盘信息失败:{e}")
continue
result = GetSystemInfoResult(cpu=cpu, memory=mem, system=sys, python=py, systemFiles=sys_files) result = GetSystemInfoResult(cpu=cpu, memory=mem, system=sys, python=py, systemFiles=sys_files)
return Response.success(data=result) return Response.success(data=result)