支持管理员读写设置

This commit is contained in:
2026-01-08 14:54:30 +08:00
parent baf59b9903
commit 91208352f8
3 changed files with 69 additions and 37 deletions

View File

@@ -24,7 +24,9 @@ from models.group import (
from models.user import (
UserPublic, UserAdminUpdateRequest, UserCalibrateResponse,
)
from models.setting import SettingsUpdateRequest, SettingsGetResponse
from models.setting import (
SettingItem, SettingsListResponse, SettingsUpdateRequest, SettingsUpdateResponse,
)
from models.object import AdminFileResponse, AdminFileListResponse, FileBanRequest
from models.policy import GroupPolicyLink
from service.storage import DirectoryCreationError, LocalStorageService
@@ -288,34 +290,34 @@ def router_admin_get_news() -> ResponseBase:
async def router_admin_update_settings(
session: SessionDep,
request: SettingsUpdateRequest,
) -> ResponseBase:
) -> SettingsUpdateResponse:
"""
批量更新站点设置。
:param session: 数据库会话
:param request: 更新请求,按类型分组的设置项
:param request: 更新请求,设置项列表
:return: 更新结果
"""
updated_count = 0
created_count = 0
for setting_type, items in request.settings.items():
for name, value in items.items():
existing = await Setting.get(
session,
and_(Setting.type == setting_type, Setting.name == name)
)
if existing:
existing.value = value
await existing.save(session)
else:
new_setting = Setting(type=setting_type, name=name, value=value)
await new_setting.save(session)
for item in request.settings:
existing = await Setting.get(
session,
and_(Setting.type == item.type, Setting.name == item.name)
)
if existing:
existing.value = item.value
await existing.save(session)
updated_count += 1
else:
new_setting = Setting(type=item.type, name=item.name, value=item.value)
await new_setting.save(session)
created_count += 1
l.info(f"管理员更新了 {updated_count} 个设置项")
return ResponseBase(data={"updated": updated_count})
l.info(f"管理员更新了 {updated_count} 个设置项,新建了 {created_count} 个设置项")
return SettingsUpdateResponse(updated=updated_count, created=created_count)
@admin_router.get(
@@ -324,23 +326,37 @@ async def router_admin_update_settings(
description='Get settings',
dependencies=[Depends(admin_required)],
)
async def router_admin_get_settings(session: SessionDep) -> ResponseBase:
async def router_admin_get_settings(
session: SessionDep,
type: str | None = None,
name: str | None = None,
) -> SettingsListResponse:
"""
获取所有站点设置,按类型分组返回
获取站点设置,支持按类型和名称筛选
:param session: 数据库会话
:return: 按类型分组的设置项
:param type: 设置类型(可选筛选条件)
:param name: 设置名称(可选筛选条件)
:return: 设置项列表
"""
settings = await Setting.get(session, None, fetch_mode="all")
# 构建查询条件
conditions = []
if type:
conditions.append(Setting.type == type)
if name:
conditions.append(Setting.name == name)
# 按 type 分组
grouped: dict[str, dict[str, str | None]] = {}
for setting in settings:
if setting.type not in grouped:
grouped[setting.type] = {}
grouped[setting.type][setting.name] = setting.value
condition = and_(*conditions) if conditions else None
return ResponseBase(data=grouped)
settings = await Setting.get(session, condition, fetch_mode="all")
# 转换为 DTO
setting_items = [
SettingItem(type=s.type, name=s.name, value=s.value)
for s in settings
]
return SettingsListResponse(settings=setting_items, total=len(setting_items))
@admin_group_router.get(
path='/',