From 5be35d82314a5db6df70ba12411049e1a156f6c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9A=93=E6=9C=88=E5=BD=92=E5=B0=98?= Date: Sat, 22 Feb 2025 23:46:00 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=BC=93=E5=AD=98=E5=88=97=E8=A1=A8?= =?UTF-8?q?=EF=BC=8C=E7=9B=91=E6=8E=A7=EF=BC=8C=E6=80=A7=E8=83=BD=E7=9B=91?= =?UTF-8?q?=E6=8E=A7=E6=B7=BB=E5=8A=A0=E6=8C=89=E9=92=AE=E7=BA=A7=E6=9D=83?= =?UTF-8?q?=E9=99=90=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/cache.py | 8 ++++++++ api/permission.py | 26 +++++++++++++++++++++++++- api/server.py | 29 ++++++++++++++++++----------- 3 files changed, 51 insertions(+), 12 deletions(-) diff --git a/api/cache.py b/api/cache.py index f220b79..84736cc 100644 --- a/api/cache.py +++ b/api/cache.py @@ -9,6 +9,7 @@ from fastapi import APIRouter, Depends, Path, Request from fastapi.responses import JSONResponse +from annotation.auth import Auth from annotation.log import Log from config.constant import BusinessType, RedisKeyConfig from controller.login import LoginController @@ -26,6 +27,7 @@ cacheAPI = APIRouter( @cacheAPI.get("/monitor", response_class=JSONResponse, response_model=GetCacheMonitorResponse, summary="获取缓存监控信息") @Log(title="获取缓存监控信息", business_type=BusinessType.SELECT) +@Auth(permission_list=['cache:btn:infoList']) async def get_cache_info(request: Request): info = await request.app.state.redis.info() 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, summary="获取缓存名称列表") @Log(title="获取缓存名称列表", business_type=BusinessType.SELECT) +@Auth(permission_list=['cache:btn:list']) async def get_cache_names(request: Request): name_list = [] 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, summary="获取缓存键名列表") @Log(title="获取缓存键名列表", business_type=BusinessType.SELECT) +@Auth(permission_list=['cache:btn:list']) async def get_cache_keys(request: Request, cacheName: str = Path(description="缓存名称")): 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}:')] @@ -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, summary="获取缓存信息") @Log(title="获取缓存信息", business_type=BusinessType.SELECT) +@Auth(permission_list=['cache:btn:info']) async def get_cache_info(request: Request, cacheName: str = Path(description="缓存名称"), cacheKey: str = Path(description="缓存键名")): 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, summary="通过键名删除缓存") @Log(title="通过键名删除缓存", business_type=BusinessType.DELETE) +@Auth(permission_list=['cache:btn:delete']) async def delete_cache(request: Request, name: str = Path(description="缓存名称")): cache_keys = await request.app.state.redis.keys(f'{name}*') if cache_keys: @@ -99,6 +105,7 @@ async def delete_cache(request: Request, name: str = Path(description="缓存名 summary="通过键值删除缓存") @cacheAPI.post("/cacheKey/{key}", response_class=JSONResponse, response_model=BaseResponse, summary="通过键值删除缓存") @Log(title="通过键值删除缓存", business_type=BusinessType.DELETE) +@Auth(permission_list=['cache:btn:delete']) async def delete_cache_key(request: Request, key: str = Path(description="缓存键名")): cache_keys = await request.app.state.redis.keys(f'*{key}') 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.post("/clearAll", response_class=JSONResponse, response_model=BaseResponse, summary="删除所有缓存") @Log(title="删除所有缓存", business_type=BusinessType.DELETE) +@Auth(permission_list=['cache:btn:delete']) async def delete_all_cache(request: Request): cache_keys = await request.app.state.redis.keys() if cache_keys: diff --git a/api/permission.py b/api/permission.py index ec1d329..853fc2c 100644 --- a/api/permission.py +++ b/api/permission.py @@ -12,7 +12,7 @@ from fastapi.responses import JSONResponse from annotation.auth import Auth from annotation.log import Log -from config.constant import BusinessType +from config.constant import BusinessType, RedisKeyConfig from controller.login import LoginController from models import Permission from schemas.common import BaseResponse @@ -53,6 +53,14 @@ async def add_permission(request: Request, params: AddPermissionParams): hidden_tag=params.hidden_tag, ) 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="新增权限成功!") else: 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): permission.del_flag = 0 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="删除权限成功!") else: 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.hidden_tag = params.hidden_tag 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="更新权限成功!") else: return Response.error(msg="更新权限失败,权限不存在!") diff --git a/api/server.py b/api/server.py index d398ba5..d0ae2fd 100644 --- a/api/server.py +++ b/api/server.py @@ -14,12 +14,14 @@ import psutil from fastapi import APIRouter, Depends, Request from fastapi.responses import JSONResponse +from annotation.auth import Auth from annotation.log import Log from config.constant import BusinessType from controller.login import LoginController from schemas.server import GetServerInfoResponse, CpuInfo, MemoryInfo, SystemInfo, PythonInfo, SystemFiles, \ GetSystemInfoResult from utils.common import bytes2human +from utils.log import logger from utils.response import Response serverAPI = APIRouter( @@ -30,6 +32,7 @@ serverAPI = APIRouter( @serverAPI.get("", response_class=JSONResponse, response_model=GetServerInfoResponse, summary="获取服务器信息") @Log(title="获取服务器信息", business_type=BusinessType.SELECT) +@Auth(permission_list=["server:btn:info"]) async def get_server_info(request: Request): # CPU信息 # 获取CPU总核心数 @@ -96,17 +99,21 @@ async def get_server_info(request: Request): io = psutil.disk_partitions() sys_files = [] for i in io: - o = psutil.disk_usage(i.device) - disk_data = SystemFiles( - dirName=i.device, - sysTypeName=i.fstype, - typeName='本地固定磁盘(' + i.mountpoint.replace('\\', '') + ')', - total=bytes2human(o.total), - used=bytes2human(o.used), - free=bytes2human(o.free), - usage=f'{psutil.disk_usage(i.device).percent}%', - ) - sys_files.append(disk_data) + try: + o = psutil.disk_usage(i.device) + disk_data = SystemFiles( + dirName=i.device, + sysTypeName=i.fstype, + typeName='本地固定磁盘(' + i.mountpoint.replace('\\', '') + ')', + total=bytes2human(o.total), + used=bytes2human(o.used), + free=bytes2human(o.free), + usage=f'{psutil.disk_usage(i.device).percent}%', + ) + 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) return Response.success(data=result)