跳到正文Skip to content

管理端点:用户、组、配额与审计

当第三方管理脚本或集成需要创建账号、划分用户组、设置配额或导出审计日志时使用本页。它记录四组管理员 HTTP 端点:/api/admin/users/api/admin/groups、配额端点(/api/quota/stats/api/admin/quota/*)和 /audit/*。Web 管理界面的操作入口见管理界面,账号与权限的界面侧说明见账号、权限与 API 密钥;会话建立、X-Session-Token 校验与通用状态码见HTTP API 鉴权与错误,服务器配置与预设端点见配置、环境与资源

接口范围

  • 内容包括用户、用户组、配额、审计四组管理端点及其后端服务:account_servicegroup_management_servicequota_serviceaudit_servicepermission_service
  • GET /api/quota/stats 只要求会话(require_auth)外,其余端点全部要求 require_admin:令牌缺失或无效返回 401,非管理员角色返回 403
  • 这里不记录真实账号、用户名、密码、令牌、API Key 或私有绝对路径;默认值来自源码常量,不代表运行中的实际配置。
  • /admin/* 管理端点(设置、任务、日志、存储、清理)和旧文件管理端点(/upload/font/prompts/fonts)属于其他页面,不在本页展开。

管理端点总览

未显式声明成功状态的端点默认返回 200;失败时的错误结构、401/403422 信封见HTTP API 鉴权与错误

用户管理端点

端点清单

方法与路径请求响应说明
POST /api/admin/usersCreateUserRequestUserResponse201创建账号并写入审计 create_user;用户名重复或密码不足返回 400
GET /api/admin/users用户数组每个用户附带 quotadaily_useddaily_limitmonthly_usedmonthly_limit
GET /api/admin/users/{username}路径参数UserResponse不存在返回 404 USER_NOT_FOUND
PUT /api/admin/users/{username}UpdateUserRequestUserResponse更新角色/组/激活/强制改密;停用会终止该用户全部会话;写入审计 update_user
DELETE /api/admin/users/{username}路径参数空(204不能删除自己(400 CANNOT_DELETE_SELF);终止会话并删除;写入审计 delete_user
PUT /api/admin/users/{username}/permissionsUpdatePermissionsRequestUserResponse未提供任何字段返回 400 NO_UPDATES;写入审计 update_permissions

CreateUserRequest 字段:username(1–50 字符)、password(至少 6 字符)、roleadminuser)、group(默认 default)、permissions(可选)。UpdateUserRequest 字段:rolegroupis_activemust_change_password,均可选。

用户权限字段

PUT /api/admin/users/{username}/permissions 请求体里的权限字段与 UserPermissions 模型一一对应:

字段语义备注
allowed_translators / denied_translators翻译器白名单 / 黑名单* 表示全部
allowed_ocr / denied_ocrOCR 白名单 / 黑名单空数组表示继承用户组
allowed_colorizers / denied_colorizers上色器白名单 / 黑名单同上
allowed_renderers / denied_renderers渲染器白名单 / 黑名单同上
allowed_workflows / denied_workflows工作流白名单 / 黑名单同上
allowed_parameters / denied_parameters参数白名单 / 黑名单* 表示全部
max_concurrent_tasks最大并发任务数ge=0
daily_quota每日翻译配额ge=-1-1 表示无限制
can_upload_files / can_delete_files上传 / 删除文件布尔值

权限继承与校验

翻译入口用 permission_service.check_feature_permission() 校验功能权限。用户级白名单为空表示“继承用户组”,用户级设置可覆盖用户组(黑名单优先);解析顺序如下:

flowchart TD
    A["请求使用某个功能\n(翻译器/OCR/上色/渲染/工作流)"] --> B{"用户级黑名单命中?"}
    B -->|"是"| X["拒绝 403"]
    B -->|"否"| C{"用户级白名单含 * 或该项?"}
    C -->|"是"| OK["允许"]
    C -->|"否(空=继承用户组)"| D{"用户组黑名单命中?"}
    D -->|"是"| X
    D -->|"否"| E{"用户组白名单为空或含 * 或该项?"}
    E -->|"是"| OK
    E -->|"否"| X

allowed_parameters 走独立的 check_parameter_permission():用户级含 * 时全部放行,否则按名单判断;参数过滤还用于 filter_config_for_user() 遮蔽用户配置。管理员创建时默认获得全部白名单(*)与 max_concurrent_tasks=10daily_quota=-1;普通用户默认继承用户组、max_concurrent_tasks=2daily_quota=100

用户组管理端点

端点清单

方法与路径请求响应说明
POST /api/admin/groupsCreateGroupRequest{success, message, group}201组 ID 重复返回 400 CREATE_FAILED
PUT /api/admin/groups/{group_id}/renameRenameGroupRequest{success, old_group_id, new_group_id, new_name}系统组不可重命名;自动更新所有用户的组关联;写入审计 rename_group
DELETE /api/admin/groups/{group_id}路径参数{success, message, group_id}系统组不可删除;成员移动到 default;写入审计 delete_group
GET /api/admin/groups{success, groups}返回组列表
GET /api/admin/groups/{group_id}路径参数{success, group}不存在返回 404 GROUP_NOT_FOUND
PUT /api/admin/groups/{group_id}/configUpdateGroupConfigRequest{success, message, group_id}更新参数配置与功能白/黑名单;写入审计 update_group_config

CreateGroupRequest 字段:group_idnamedescriptionparameter_configpermissionsquota_limitsvisible_presetsdefault_preset_idUpdateGroupConfigRequest 字段:parameter_config,以及翻译器/OCR/上色/渲染/工作流的白名单与黑名单、default_preset_idvisible_presets

系统组与成员迁移

GroupRepository.SYSTEM_GROUPS = {'admin', 'default', 'guest'} 是系统预定义组:admin(管理员组)、default(新用户默认组)、guest(访客组)。它们既不能重命名也不能删除。重命名组时 group_management_service.rename_group() 会扫描 accounts.json,把属于旧组的所有账号迁移到新组 ID;删除组时成员统一移动到 default

配额端点

端点清单

方法与路径请求响应说明
GET /api/quota/statsQuotaStatsResponse当前会话用户的配额统计;未找到返回 404
GET /api/admin/quota/statsAllQuotaStatsResponsequotas 字典 + total_users全部用户统计
POST /api/admin/quota/resetQuotaResetRequestQuotaResetResponseuser_id 为空表示重置所有用户;返回 users_reset 数量
POST /api/admin/quota/set-limitsSetQuotaLimitsRequest{success, message}设置单个用户限制
GET /api/admin/quota/user/{user_id}路径参数QuotaStatsResponse指定用户统计;不存在返回 404

QuotaStatsResponse 字段:user_iddaily_limitused_todayremainingactive_sessionstotal_uploadedSetQuotaLimitsRequest 字段:user_idmax_file_sizemax_files_per_uploadmax_sessionsdaily_quota。注意 GET /api/admin/users 列表里 daily_limit 在无限制时显示为 999999,而 QuotaStatsResponse 中无限制仍为 -1,两者口径不同。

配额来源与优先级

QuotaManagementService._get_user_quota_limit() 按“用户级 > 用户组级 > 全局默认”解析限制;解析出的用户级配额会写回 quotas.json 以便快速读取:

flowchart LR
    R["配额检查\n(上传大小/文件数/会话数/每日配额)"] --> Q{"用户级配额存在?"}
    Q -->|"是"| U["使用用户级限制"]
    Q -->|"否"| G{"用户组配置含 quota_limits?"}
    G -->|"是"| GR["使用组级限制"]
    G -->|"否"| D["全局默认:10MB / 10 文件 / 5 会话 / 每日无限(-1)"]

全局默认常量:DEFAULT_MAX_FILE_SIZE = 10MBDEFAULT_MAX_FILES_PER_UPLOAD = 10DEFAULT_MAX_SESSIONS = 5DEFAULT_DAILY_QUOTA = -1(无限制)。active_sessions 来自 QuotaManagementService 内存字典(_active_sessions),不持久化。

每日重置

QuotaScheduler 每小时检查一次 UTC 日期,发现跨天后调用 reset_daily_quota(user_id=None) 重置全部用户的每日计数;管理员也可用 POST /api/admin/quota/reset 手动重置单个或全部用户。翻译入口的每日配额另由 permission_service.check_daily_quota() 用内存计数执行,两者是独立机制(见依赖与冲突)。

审计端点

端点清单

方法与路径查询参数响应说明
GET /audit/eventsusernameevent_typeresultsuccess|failure)、start_timeend_time(ISO 格式)、limit(默认 100,最大 1000)、offsetlist[AuditEventResponse]时间无效返回 400 INVALID_TIME_FORMAT;按时间倒序分页
GET /audit/export同上加 formatjsoncsv,默认 json文件下载(Content-Disposition: attachment文件名为 audit_log_YYYYMMDD_HHMMSS.{json,csv};操作本身写入审计 export_audit_log

AuditEventResponse 字段:event_idtimestampevent_typeusernameip_addressdetailsresult

事件类型

静态扫描全部 log_event(...) 调用得到的事件类型:loginlogoutinitial_setupregisterpassword_changecreate_userupdate_userdelete_userupdate_permissionscreate_tasktranslation_starttranslation_progresstranslation_completetranslation_errorpermission_deniedexport_audit_logsystem_initsession_cleanuplog_rotation_check/audit/eventsevent_type 筛选接受任意字符串,是否命中取决于日志里实际记录的类型。

存储、轮转与一致性

AuditService 把事件以 JSON Lines 追加写入 manga_translator/server/data/audit.log,单文件超过 10MB 时轮转并保留 5 个备份。注意两个写入方写同一文件但格式不同:用户/翻译路由写入 AuditEvent 结构(含 event_id/event_type/username/result),而 group_management_service._log_audit() 写入的是 {timestamp, admin_id, action, details} 结构。后者缺少 event_id 等字段,/audit/events 解析时会跳过这些行,因此“组操作已写入 audit.log”并不等于“能通过审计 API 查到”。

在管理界面中的操作

管理员在 GET /adminadmin-new.html)操作账号与组。侧边栏的用户管理(users)、用户组管理(groups)、配额管理(quota)模块分别调用 GET /api/admin/usersGET /api/admin/groupsGET /api/admin/groups/{id}PUT /api/admin/groups/{id}/config;用户/组编辑弹窗复用 permission-editor.js 组件,其标签来自桌面 locale 的 i18n key。配额模块的“默认配额设置”走旧的 GET/PUT /admin/settingsdefault_quota 字段),用户配额表格来自 GET /api/admin/users 返回的 quota 字段,并没有调用 /api/admin/quota/* 端点;审计端点没有对应管理界面页签。

接口约束

  • 用户组的 parameter_config 既是组内参数可见性/只读控制(GroupService),也承载组级配额(quota 下的 daily_image_limitmax_concurrent_tasks);而 quota_limits 字段由 GroupManagementService 保存、由 QuotaManagementService 读取。两条组级配额路径并存,修改时需同时核对。
  • 翻译请求的每日配额与并发限制由 permission_service(内存计数,组级 daily_image_limit 优先于用户 daily_quota)执行;/api/quota/*QuotaManagementService 是文件持久化、用户级优先的独立实现。两者互不同步:管理员用 /api/admin/quota/reset 重置的计数器不直接影响翻译入口的 daily_usage
  • 停用用户会终止其全部会话;删除用户同样先终止会话再删除。删除自己被明确拒绝(400 CANNOT_DELETE_SELF)。
  • 系统组 admindefaultguest 不可重命名或删除;重命名组会改写所有成员的 group 字段,删除组会把成员移动到 default
  • 审计 API 只能查询 AuditEvent 行格式;组管理写入的另一种行会被跳过,不能当作审计 API 的数据缺失证据。
  • 所有管理端点返回体可能包含用户名、组名等标识符;共享日志、导出文件或调试目录前必须删除真实账号名、令牌、API Key 和私有路径。

开发指南

选项中英对照

管理端点总览

路由组(前缀)方法与路径数量鉴权边界 / 来源
用户(/api/admin/usersPOST /GET /GET|PUT|DELETE /{username}PUT /{username}/permissions6全部 require_admin;创建 201、删除 204routes/users.py
用户组(/api/admin/groupsPOST /GET /GET /{group_id}PUT /{group_id}/rename/{group_id}/configDELETE /{group_id}6全部 require_admin;创建 201routes/groups.py
配额(/apiGET /quota/statsGET /admin/quota/statsPOST /admin/quota/reset/admin/quota/set-limitsGET /admin/quota/user/{user_id}5第一个 require_auth,其余管理员;routes/quota.py
审计(/auditGET /eventsGET /export2全部 require_adminroutes/audit.py

管理界面 i18n 文案

UI 调用 keyEnglish 实际值简体中文实际值
web_user_managementUser Management用户管理
web_group_managementGroup Management用户组管理
web_quota_managementQuota Management配额管理
web_create_groupCreate Group创建用户组
web_group_nameGroup Name用户组名称
web_group_descriptionGroup Description用户组描述
web_group_configGroup Configuration用户组配置
web_default_presetDefault Configuration默认配置
web_daily_quotaDaily Quota每日配额
web_daily_limitDaily Limit每日限制
web_upload_limitUpload Limit上传限制
web_max_file_sizeMax File Size单文件最大
web_max_filesMax Files最多文件数
web_resource_managementResource Management资源管理
web_can_upload_fontCan Upload Font可上传字体
web_can_upload_promptCan Upload Prompt可上传提示词
web_can_view_historyCan View History可查看历史
web_can_view_logsCan View Logs可查看日志
web_saveSave保存
web_cancelCancel取消
web_deleteDelete删除
web_resetReset重置

admin-new.html 还有一批没有 i18n key 的硬编码中文文案,例如“用户列表”“添加用户”“暂无用户”“活跃”“禁用”“编辑”“删除”“保存配额设置”“默认配额设置”“用户配额使用情况”,英文界面缺失;文档不补译这些缺失值。以上 key 的英文与简体中文值来自 desktop_qt_ui/locales/en_US.jsonzh_CN.json,管理端通过 /i18n/{locale} 复用同一份 locale。

文件/格式本页实际作用手改与兼容注意
manga_translator/server/data/accounts.json账号持久化(bcrypt 哈希密码)原子写入并备份;不读取或展示真实账号
manga_translator/server/data/group_config.json用户组持久化(GroupRepository / GroupService系统组 admin/default/guest 不可删改
manga_translator/server/data/quotas.json用户级配额持久化(QuotaRepository用户级配额优先于组级与全局默认
manga_translator/server/data/audit.log审计事件 JSON Lines 日志10MB 轮转、5 备份;含两种行格式
manga_translator/server/data/sessions.json会话持久化停用/删除用户时终止会话;不展示真实令牌

代码位置

层级文件本页核对内容
路由manga_translator/server/routes/users.pygroups.pyquota.pyaudit.py端点路径、方法、请求/响应模型、状态码与审计事件
鉴权manga_translator/server/core/middleware.pyrequire_auth / require_admin401 / 403 信封
服务manga_translator/server/core/account_service.pygroup_management_service.pygroup_service.pyquota_service.pypermission_service.pyaudit_service.py创建/更新/删除、成员迁移、配额解析、权限继承、审计轮转
模型与仓库manga_translator/server/models/group_models.pyquota_models.pyrepositories/group_repository.pyrepositories/quota_repository.pycore/models.pyUserGroupQuotaLimit/QuotaStats、系统组、UserPermissions/AuditEvent
调度与启动manga_translator/server/core/quota_scheduler.pysystem_init.py每日配额重置、默认管理员、会话清理与日志轮转
Web UImanga_translator/server/static/admin-new.htmlstatic/js/admin/modules/{users,groups,quota}.jsstatic/js/admin/components/permission-editor.jsdesktop_qt_ui/locales/en_US.jsonzh_CN.json管理界面入口、调用端点与 i18n 三列