diff --git a/kinit-api/utils/cache.py b/kinit-api/utils/cache.py index 91bb1ad..011da6a 100644 --- a/kinit-api/utils/cache.py +++ b/kinit-api/utils/cache.py @@ -7,9 +7,11 @@ # @desc : 缓存 from typing import List -from core.logger import logger +from sqlalchemy.future import select +from sqlalchemy.orm import joinedload +from core.logger import logger # 注意:报错就在这里,如果只写 core.logger 会写入日志报错,很难排查 from core.database import db_getter -from apps.vadmin.system.crud import SettingsTabDal +from apps.vadmin.system.models import VadminSystemSettingsTab import json from aioredis.client import Redis from core.exception import CustomException @@ -23,18 +25,49 @@ class Cache: def __init__(self, rd: Redis): self.rd = rd + async def __get_tab_name_values(self, tab_names: List[str], hidden: bool | None = False): + """ + 获取系统配置标签下的标签信息 + """ + async_session = db_getter() + session = await async_session.__anext__() + model = VadminSystemSettingsTab + v_options = [joinedload(model.settings)] + sql = select(model).where( + model.is_delete == False, + model.tab_name.in_(tab_names), + model.disabled == False, + model.hidden == hidden + ).options(*[load for load in v_options]) + queryset = await session.execute(sql) + datas = queryset.scalars().unique().all() + return self.__generate_values(datas) + + @classmethod + def __generate_values(cls, datas: List[VadminSystemSettingsTab]): + """ + 生成字典值 + """ + return { + tab.tab_name: { + item.config_key: item.config_value + for item in tab.settings + if not item.disabled + } + for tab in datas + } + async def cache_tab_names(self, tab_names: List[str] = None): """ 缓存系统配置 如果手动修改了mysql数据库中的配置 那么需要在redis中将对应的tab_name删除 """ - async_session = db_getter() - session = await async_session.__anext__() - if tab_names: - datas = await SettingsTabDal(session).get_tab_name_values(tab_names, hidden=None) - else: - datas = await SettingsTabDal(session).get_tab_name_values(self.DEFAULT_TAB_NAMES, hidden=None) + + if not tab_names: + tab_names = self.DEFAULT_TAB_NAMES + datas = await self.__get_tab_name_values(tab_names, None) + for k, v in datas.items(): await self.rd.client().set(k, json.dumps(v))