feat: add user and role management pages with authentication settings

- Implemented AuthSettingsTab for managing authentication settings including user registration and default roles.
- Created UsersPage for managing users and roles, including user creation, editing, and deletion functionalities.
- Added components for user and role management: UserEditorDrawer, RoleEditorDrawer, UsersTable, RolesTable, and PathRuleEditorDrawer.
- Introduced QuickCreateRoleModal for quick role creation within user management.
- Implemented permission management within roles, including path rules and user assignments.
- Enhanced user experience with loading states and error handling in API interactions.
This commit is contained in:
shiyu
2026-02-01 19:25:17 +08:00
parent 4014a4dd74
commit c5e4b3ef43
29 changed files with 1631 additions and 1323 deletions
+32
View File
@@ -5,11 +5,21 @@ from fastapi import APIRouter, Depends, Form, Request
from api.response import success
from domain.audit import AuditAction, audit
from domain.auth import User, get_current_active_user
from domain.permission.service import PermissionService
from domain.permission.types import SystemPermission
from .service import ConfigService
from .types import ConfigItem
router = APIRouter(prefix="/api/config", tags=["config"])
PUBLIC_CONFIG_KEYS = [
"THEME_MODE",
"THEME_PRIMARY_COLOR",
"THEME_BORDER_RADIUS",
"THEME_CUSTOM_TOKENS",
"THEME_CUSTOM_CSS",
]
@router.get("/")
@audit(action=AuditAction.READ, description="获取配置")
@@ -18,6 +28,9 @@ async def get_config(
current_user: Annotated[User, Depends(get_current_active_user)],
key: str,
):
await PermissionService.require_system_permission(
current_user.id, SystemPermission.CONFIG_EDIT
)
value = await ConfigService.get(key)
return success(ConfigItem(key=key, value=value).model_dump())
@@ -30,6 +43,9 @@ async def set_config(
key: str = Form(...),
value: str = Form(""),
):
await PermissionService.require_system_permission(
current_user.id, SystemPermission.CONFIG_EDIT
)
await ConfigService.set(key, value)
return success(ConfigItem(key=key, value=value).model_dump())
@@ -40,9 +56,25 @@ async def get_all_config(
request: Request,
current_user: Annotated[User, Depends(get_current_active_user)],
):
await PermissionService.require_system_permission(
current_user.id, SystemPermission.CONFIG_EDIT
)
configs = await ConfigService.get_all()
return success(configs)
@router.get("/public")
@audit(action=AuditAction.READ, description="获取公开配置")
async def get_public_config(
request: Request,
current_user: Annotated[User, Depends(get_current_active_user)],
):
data = {}
for key in PUBLIC_CONFIG_KEYS:
value = await ConfigService.get(key)
if value is not None:
data[key] = value
return success(data)
@router.get("/status")
@audit(action=AuditAction.READ, description="获取系统状态")