Files
2026-06-08 18:14:59 +08:00

163 lines
5.2 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
UI Config Service - UI配置服务层
"""
import json
from typing import Optional, List, Dict, Any
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from app.base_service import BaseService
from core.ui_config.model import UIConfig
from core.ui_config.schema import UIConfigCreate, UIConfigUpdate
class UIConfigService(BaseService[UIConfig, UIConfigCreate, UIConfigUpdate]):
"""
UI配置服务层
继承BaseService,自动获得增删改查功能
"""
model = UIConfig
@classmethod
async def get_by_key(
cls,
db: AsyncSession,
config_key: str,
application_id: Optional[str] = None
) -> Optional[UIConfig]:
"""
根据配置键获取配置
:param db: 数据库会话
:param config_key: 配置键
:param application_id: 应用IDNone表示主应用配置
"""
query = select(UIConfig).where(
UIConfig.config_key == config_key,
UIConfig.is_deleted == False # noqa: E712
)
if application_id:
query = query.where(UIConfig.application_id == application_id)
else:
query = query.where(UIConfig.application_id.is_(None))
result = await db.execute(query)
return result.scalar_one_or_none()
@classmethod
async def get_by_type(cls, db: AsyncSession, config_type: str) -> List[UIConfig]:
"""根据配置类型获取配置列表"""
result = await db.execute(
select(UIConfig).where(
UIConfig.config_type == config_type,
UIConfig.status == True, # noqa: E712
UIConfig.is_deleted == False # noqa: E712
).order_by(UIConfig.sort)
)
return list(result.scalars().all())
@classmethod
async def get_all_active(cls, db: AsyncSession) -> List[UIConfig]:
"""获取所有启用的配置"""
result = await db.execute(
select(UIConfig).where(
UIConfig.status == True, # noqa: E712
UIConfig.is_deleted == False # noqa: E712
).order_by(UIConfig.sort)
)
return list(result.scalars().all())
@classmethod
async def get_preferences_config(
cls,
db: AsyncSession,
application_id: Optional[str] = None
) -> Optional[Dict[str, Any]]:
"""
获取前端偏好配置
返回格式与前端 Preferences 类型一致
:param db: 数据库会话
:param application_id: 应用IDNone表示主应用配置
"""
config = await cls.get_by_key(db, "frontend_preferences", application_id)
if config and config.config_value and config.status:
try:
return json.loads(config.config_value)
except json.JSONDecodeError:
return None
# 如果子应用没有配置,回退到主应用配置
if application_id:
return await cls.get_preferences_config(db, None)
return None
@classmethod
async def update_preferences_config(
cls,
db: AsyncSession,
preferences: Dict[str, Any],
application_id: Optional[str] = None
) -> UIConfig:
"""
更新前端偏好配置
如果不存在则创建
:param db: 数据库会话
:param preferences: 偏好配置
:param application_id: 应用IDNone表示主应用配置
"""
config = await cls.get_by_key(db, "frontend_preferences", application_id)
config_value = json.dumps(preferences, ensure_ascii=False)
if config:
config.config_value = config_value
await db.commit()
await db.refresh(config)
return config
else:
new_config = UIConfig(
application_id=application_id,
config_key="frontend_preferences",
config_value=config_value,
config_type="preferences",
description="前端UI偏好配置" if not application_id else f"子应用UI偏好配置",
status=True
)
db.add(new_config)
await db.commit()
await db.refresh(new_config)
return new_config
@classmethod
async def update_value_by_key(
cls,
db: AsyncSession,
config_key: str,
config_value: str
) -> Optional[UIConfig]:
"""根据配置键更新配置值"""
config = await cls.get_by_key(db, config_key)
if config:
config.config_value = config_value
await db.commit()
await db.refresh(config)
return config
return None
@classmethod
async def get_config_value(cls, db: AsyncSession, config_key: str) -> Optional[Any]:
"""获取配置值(解析JSON"""
config = await cls.get_by_key(db, config_key)
if config and config.config_value:
try:
return json.loads(config.config_value)
except json.JSONDecodeError:
return config.config_value
return None