feat: 补全皮肤站管理台用户页
Sync source to CNB / Sync Git ref (push) Skipped

- 用户列表:搜索(用户名/邮箱/UUID)、分页、封禁状态、注册时间
- 编辑用户:用户名、邮箱、QQ、密码、权限组、封禁状态
- 绑定玩家:展示 Mojang / StarLight 来源与旧内服适配标记
- Bot 管理:查看状态、修改机器人用户名、使 Token 失效、封禁/解封 Bot 创建
- 频率限制:滑块与数字输入设置丢包频率,支持保存与取消
- 管理审计:按用户或全局查看,游标分页加载更早记录
- 邀请码:按邮箱生成邀请码并复制
- 补充对应 API 与类型定义,中英文各补 39 个文案
This commit is contained in:
AxTps committed 2026-10-18 11:18:55 +08:00
1 parent 7b3a5212e6
commit fbcbb803ac
4 files changed
+1257 -243

No files matched your search

File diff suppressed because it is too large. Load diff
@@ -1902,3 +1902,116 @@ export function skinSiteUpdateReviewPaperAdmin(
{ method: 'PUT', body: data },
)
}
export interface SkinSiteBotInfo {
exists: boolean
username?: string | null
active: boolean
creationBanned: boolean
tokenHint?: string | null
createdAt?: number | null
updatedAt?: number | null
}
export interface SkinSiteUserFrequencyLimit {
dropPercent?: number | null
}
export type SkinSiteUserAdminAuditAction =
| 'USER_UPDATED'
| 'USER_DELETED'
| 'RATE_LIMIT_UPDATED'
| 'BOT_USERNAME_UPDATED'
| 'BOT_TOKEN_INVALIDATED'
| 'BOT_CREATION_BANNED'
| 'BOT_CREATION_UNBANNED'
export interface SkinSiteUserAdminAuditChange {
field: string
before?: string | null
after?: string | null
}
export interface SkinSiteUserAdminAuditInfo {
id: number
actorUuid: string
actorName: string
targetUuid: string
targetName: string
action: SkinSiteUserAdminAuditAction
changes: SkinSiteUserAdminAuditChange[]
createdAt: number
}
export interface SkinSiteUserAdminAuditPage {
items: SkinSiteUserAdminAuditInfo[]
nextCursor?: number | null
}
export interface SkinSiteInviteCode {
email: string
code: string
}
export function skinSiteAdminBotInfo(
userUuid: string,
): Promise<SkinSiteResponse<SkinSiteBotInfo>> {
return skinSiteRequest<SkinSiteBotInfo>('admin/users/' + encodeURIComponent(userUuid) + '/bot')
}
export function skinSiteAdminRenameBot(
userUuid: string,
username: string,
): Promise<SkinSiteResponse<SkinSiteBotInfo>> {
return skinSiteRequest<SkinSiteBotInfo>(
'admin/users/' + encodeURIComponent(userUuid) + '/bot/username',
{ method: 'POST', body: { username } },
)
}
export function skinSiteAdminInvalidateBotToken(
userUuid: string,
): Promise<SkinSiteResponse<SkinSiteBotInfo>> {
return skinSiteRequest<SkinSiteBotInfo>(
'admin/users/' + encodeURIComponent(userUuid) + '/bot/invalidate',
{ method: 'POST' },
)
}
export function skinSiteAdminSetBotCreationBanned(
userUuid: string,
banned: boolean,
): Promise<SkinSiteResponse<SkinSiteBotInfo>> {
return skinSiteRequest<SkinSiteBotInfo>(
'admin/users/' + encodeURIComponent(userUuid) + '/bot/ban',
{ method: 'POST', body: { banned } },
)
}
export function skinSiteAdminUpdateUserFrequencyLimit(
userUuid: string,
dropPercent: number | null,
): Promise<SkinSiteResponse<SkinSiteUserFrequencyLimit>> {
return skinSiteRequest<SkinSiteUserFrequencyLimit>(
'admin/users/' + encodeURIComponent(userUuid) + '/frequency-limit',
{ method: 'POST', body: { dropPercent } },
)
}
export function skinSiteAdminUserAudit(params?: {
targetUuid?: string
before?: number
}): Promise<SkinSiteResponse<SkinSiteUserAdminAuditPage>> {
const query = new URLSearchParams()
if (params?.targetUuid) query.set('targetUuid', params.targetUuid)
if (params?.before) query.set('before', String(params.before))
const suffix = query.size > 0 ? '?' + query.toString() : ''
return skinSiteRequest<SkinSiteUserAdminAuditPage>('admin/users/audit' + suffix)
}
export function skinSiteAdminInviteUser(email: string): Promise<SkinSiteResponse<SkinSiteInviteCode>> {
return skinSiteRequest<SkinSiteInviteCode>('admin/inviteCode', {
method: 'POST',
body: { email },
})
}
+40 -1
View File
@@ -12178,5 +12178,44 @@
"app.skin-site.admin.review.move-up": {"message": "Move up"},
"app.skin-site.admin.review.move-down": {"message": "Move down"},
"app.skin-site.admin.review.mail-subject-required": {"message": "Subject is required when mail is enabled."},
"app.skin-site.admin.review.mail-message-required": {"message": "Body is required when mail is enabled."}
"app.skin-site.admin.review.mail-message-required": {"message": "Body is required when mail is enabled."},
"app.skin-site.admin.users.actions": {"message": "Actions"},
"app.skin-site.admin.users.audit": {"message": "Audit"},
"app.skin-site.admin.users.audit-empty": {"message": "No audit records yet."},
"app.skin-site.admin.users.audit-more": {"message": "Load earlier"},
"app.skin-site.admin.users.audit-title": {"message": "User management audit"},
"app.skin-site.admin.users.bot": {"message": "Bot"},
"app.skin-site.admin.users.bot-active": {"message": "Token valid"},
"app.skin-site.admin.users.bot-ban": {"message": "Ban bot creation"},
"app.skin-site.admin.users.bot-creation-banned": {"message": "Token creation banned"},
"app.skin-site.admin.users.bot-exists": {"message": "Bot created"},
"app.skin-site.admin.users.bot-inactive": {"message": "Token invalidated"},
"app.skin-site.admin.users.bot-invalidate": {"message": "Invalidate token"},
"app.skin-site.admin.users.bot-not-exists": {"message": "No bot yet"},
"app.skin-site.admin.users.bot-save-username": {"message": "Save bot username"},
"app.skin-site.admin.users.bot-title": {"message": "Bot management"},
"app.skin-site.admin.users.bot-token-hint": {"message": "Token hint"},
"app.skin-site.admin.users.bot-unban": {"message": "Unban bot creation"},
"app.skin-site.admin.users.bot-username": {"message": "Bot username"},
"app.skin-site.admin.users.bound-players-title": {"message": "Linked players"},
"app.skin-site.admin.users.frequency": {"message": "Rate limit"},
"app.skin-site.admin.users.frequency-clear": {"message": "Clear limit"},
"app.skin-site.admin.users.frequency-current": {"message": "Currently {percent}%"},
"app.skin-site.admin.users.frequency-hint": {"message": "Packets from this user will be dropped at the given rate."},
"app.skin-site.admin.users.frequency-none": {"message": "Not enabled"},
"app.skin-site.admin.users.frequency-range": {"message": "Only integer values from 10% to 100% are allowed."},
"app.skin-site.admin.users.frequency-save": {"message": "Save limit"},
"app.skin-site.admin.users.frequency-title": {"message": "Rate limit"},
"app.skin-site.admin.users.invite": {"message": "Invite user"},
"app.skin-site.admin.users.invite-copied": {"message": "Invite code copied."},
"app.skin-site.admin.users.invite-copy": {"message": "Copy"},
"app.skin-site.admin.users.invite-email": {"message": "Email"},
"app.skin-site.admin.users.invite-email-invalid": {"message": "Enter a valid email address."},
"app.skin-site.admin.users.invite-generate": {"message": "Generate invite code"},
"app.skin-site.admin.users.invite-title": {"message": "Invite user"},
"app.skin-site.admin.users.legacy-adapted": {"message": "Legacy internal adapted"},
"app.skin-site.admin.users.registered-at": {"message": "Registered at"},
"app.skin-site.admin.users.status": {"message": "Status"},
"app.skin-site.admin.users.status-banned": {"message": "Banned"},
"app.skin-site.admin.users.status-normal": {"message": "Normal"}
}
+40 -1
View File
@@ -12009,5 +12009,44 @@
"app.skin-site.admin.review.move-up": {"message": "上移"},
"app.skin-site.admin.review.move-down": {"message": "下移"},
"app.skin-site.admin.review.mail-subject-required": {"message": "开启邮件后必须填写邮件标题。"},
"app.skin-site.admin.review.mail-message-required": {"message": "开启邮件后必须填写邮件正文。"}
"app.skin-site.admin.review.mail-message-required": {"message": "开启邮件后必须填写邮件正文。"},
"app.skin-site.admin.users.actions": {"message": "操作"},
"app.skin-site.admin.users.audit": {"message": "审计"},
"app.skin-site.admin.users.audit-empty": {"message": "暂无管理审计记录。"},
"app.skin-site.admin.users.audit-more": {"message": "加载更早记录"},
"app.skin-site.admin.users.audit-title": {"message": "用户管理审计"},
"app.skin-site.admin.users.bot": {"message": "机器人"},
"app.skin-site.admin.users.bot-active": {"message": "Token 有效"},
"app.skin-site.admin.users.bot-ban": {"message": "封禁 Bot 创建"},
"app.skin-site.admin.users.bot-creation-banned": {"message": "禁止创建 Token"},
"app.skin-site.admin.users.bot-exists": {"message": "已创建 Bot"},
"app.skin-site.admin.users.bot-inactive": {"message": "Token 已失效"},
"app.skin-site.admin.users.bot-invalidate": {"message": "使 Token 失效"},
"app.skin-site.admin.users.bot-not-exists": {"message": "尚未创建 Bot"},
"app.skin-site.admin.users.bot-save-username": {"message": "保存机器人用户名"},
"app.skin-site.admin.users.bot-title": {"message": "Bot 管理"},
"app.skin-site.admin.users.bot-token-hint": {"message": "Token 标识"},
"app.skin-site.admin.users.bot-unban": {"message": "解除 Bot 封禁"},
"app.skin-site.admin.users.bot-username": {"message": "机器人用户名"},
"app.skin-site.admin.users.bound-players-title": {"message": "绑定玩家"},
"app.skin-site.admin.users.frequency": {"message": "频率限制"},
"app.skin-site.admin.users.frequency-clear": {"message": "取消限制"},
"app.skin-site.admin.users.frequency-current": {"message": "当前 {percent}%"},
"app.skin-site.admin.users.frequency-hint": {"message": "以下列频率对指定用户进行丢包处理,限制其进入服务器的频率。"},
"app.skin-site.admin.users.frequency-none": {"message": "当前未启用"},
"app.skin-site.admin.users.frequency-range": {"message": "仅允许设置 10% 至 100% 的整数。"},
"app.skin-site.admin.users.frequency-save": {"message": "保存限制"},
"app.skin-site.admin.users.frequency-title": {"message": "频率限制"},
"app.skin-site.admin.users.invite": {"message": "邀请用户"},
"app.skin-site.admin.users.invite-copied": {"message": "邀请码已复制。"},
"app.skin-site.admin.users.invite-copy": {"message": "复制"},
"app.skin-site.admin.users.invite-email": {"message": "邮箱"},
"app.skin-site.admin.users.invite-email-invalid": {"message": "请输入正确格式的邮箱。"},
"app.skin-site.admin.users.invite-generate": {"message": "生成邀请码"},
"app.skin-site.admin.users.invite-title": {"message": "邀请用户"},
"app.skin-site.admin.users.legacy-adapted": {"message": "已适配旧内服"},
"app.skin-site.admin.users.registered-at": {"message": "注册时间"},
"app.skin-site.admin.users.status": {"message": "状态"},
"app.skin-site.admin.users.status-banned": {"message": "已封禁"},
"app.skin-site.admin.users.status-normal": {"message": "正常"}
}