diff --git a/apps/app-frontend/src/components/ui/skin-site/SkinSiteAdminView.vue b/apps/app-frontend/src/components/ui/skin-site/SkinSiteAdminView.vue index efa40b4..4428888 100644 --- a/apps/app-frontend/src/components/ui/skin-site/SkinSiteAdminView.vue +++ b/apps/app-frontend/src/components/ui/skin-site/SkinSiteAdminView.vue @@ -5,7 +5,9 @@ import { computed, ref } from 'vue' import { skinSiteUser } from '@/composables/skin-site-session' import AdminBroadcastPage from './admin/AdminBroadcastPage.vue' +import AdminPlayersPage from './admin/AdminPlayersPage.vue' import AdminSummaryPage from './admin/AdminSummaryPage.vue' +import AdminUsersPage from './admin/AdminUsersPage.vue' const emit = defineEmits<{ (e: 'back'): void }>() @@ -156,6 +158,8 @@ const current = ref('summary') > + +

{{ current }}

diff --git a/apps/app-frontend/src/components/ui/skin-site/admin/AdminPlayersPage.vue b/apps/app-frontend/src/components/ui/skin-site/admin/AdminPlayersPage.vue new file mode 100644 index 0000000..ed8ee67 --- /dev/null +++ b/apps/app-frontend/src/components/ui/skin-site/admin/AdminPlayersPage.vue @@ -0,0 +1,315 @@ + + diff --git a/apps/app-frontend/src/components/ui/skin-site/admin/AdminUsersPage.vue b/apps/app-frontend/src/components/ui/skin-site/admin/AdminUsersPage.vue new file mode 100644 index 0000000..3cf833a --- /dev/null +++ b/apps/app-frontend/src/components/ui/skin-site/admin/AdminUsersPage.vue @@ -0,0 +1,468 @@ + + diff --git a/apps/app-frontend/src/helpers/skin-site-api.ts b/apps/app-frontend/src/helpers/skin-site-api.ts index 3dbf59b..254f213 100644 --- a/apps/app-frontend/src/helpers/skin-site-api.ts +++ b/apps/app-frontend/src/helpers/skin-site-api.ts @@ -904,3 +904,131 @@ export function skinSiteUpdateBroadcast( export function skinSiteDeleteBroadcast(id: number): Promise> { return skinSiteRequest('broadcast/' + id, { method: 'DELETE', type: 'skin' }) } + +export interface SkinSiteAdminPlayer { + uuid: string + name: string + isMojang: boolean + ownerUsername: string + legacyInternalAdapted: boolean +} + +export interface SkinSiteAdminPlayerQuery { + limit: number + offset: number + searchField?: string + keyword?: string +} + +export function skinSiteAdminPlayerCount(params?: { + searchField?: string + keyword?: string +}): Promise> { + const query = new URLSearchParams() + if (params?.searchField?.trim()) query.set('searchField', params.searchField!.trim()) + if (params?.keyword?.trim()) query.set('keyword', params.keyword!.trim()) + const suffix = query.toString() ? '?' + query.toString() : '' + return skinSiteRequest('admin/players/number' + suffix, { type: 'skin' }) +} + +export function skinSiteAdminPlayerList( + query: SkinSiteAdminPlayerQuery, +): Promise> { + return skinSiteRequest('admin/players/list', { + method: 'POST', + type: 'skin', + body: query, + }) +} + +export function skinSiteAdminUpdatePlayer(input: { + uuid: string + name: string + isMojang: boolean +}): Promise> { + return skinSiteRequest('admin/update', { + method: 'POST', + type: 'skin', + body: input, + }) +} + +export function skinSiteAdminDeletePlayer(uuid: string): Promise> { + return skinSiteRequest('admin/delete/' + encodeURIComponent(uuid), { + method: 'POST', + type: 'skin', + }) +} + +export interface SkinSiteAdminUser { + uuid: string + username: string + email: string + qq?: number + banned: boolean + id: number + permissions: string[] + avatar?: string + registerTime: number +} + +export function skinSiteAdminUserCount(params?: { + searchField?: string + keyword?: string +}): Promise> { + const query = new URLSearchParams() + if (params?.searchField?.trim()) query.set('searchField', params.searchField!.trim()) + if (params?.keyword?.trim()) query.set('keyword', params.keyword!.trim()) + const suffix = query.toString() ? '?' + query.toString() : '' + return skinSiteRequest('admin/users/number' + suffix) +} + +export function skinSiteAdminUserList(query: { + limit: number + offset: number + searchField?: string + keyword?: string +}): Promise> { + return skinSiteRequest('admin/users/list', { + method: 'POST', + body: query, + }) +} + +export function skinSiteAdminUpdateUser(input: { + uuid: string + username: string + password?: string + email: string + qq?: number + banned: boolean + permissions: string[] +}): Promise> { + return skinSiteRequest('admin/update', { method: 'POST', body: input }) +} + +export function skinSiteAdminDeleteUser(uuid: string): Promise> { + return skinSiteRequest('admin/delete/' + encodeURIComponent(uuid), { + method: 'POST', + }) +} + +export function skinSiteAdminUserPlayers( + uuid: string, +): Promise> { + return skinSiteRequest( + 'admin/users/' + encodeURIComponent(uuid) + '/players', + ) +} + +export interface SkinSiteFrequencyLimit { + dropPercent?: number | null +} + +export function skinSiteAdminUserFrequencyLimit( + uuid: string, +): Promise> { + return skinSiteRequest( + 'admin/users/' + encodeURIComponent(uuid) + '/frequency-limit', + ) +} diff --git a/apps/app-frontend/src/locales/en-US/index.json b/apps/app-frontend/src/locales/en-US/index.json index 2abb886..0bc699c 100644 --- a/apps/app-frontend/src/locales/en-US/index.json +++ b/apps/app-frontend/src/locales/en-US/index.json @@ -11830,5 +11830,61 @@ "app.skin-site.admin.broadcast.updated": {"message": "Announcement updated."}, "app.skin-site.admin.broadcast.deleted": {"message": "Announcement deleted."}, "app.skin-site.admin.broadcast.confirm-delete": {"message": "Delete “{title}”? This cannot be undone."}, - "app.skin-site.admin.broadcast.uploader": {"message": "by {name}"} + "app.skin-site.admin.broadcast.uploader": {"message": "by {name}"}, + "app.skin-site.admin.players.title": {"message": "Players"}, + "app.skin-site.admin.players.loading": {"message": "Loading…"}, + "app.skin-site.admin.players.failed": {"message": "Could not load players."}, + "app.skin-site.admin.players.empty": {"message": "No players found."}, + "app.skin-site.admin.players.search": {"message": "Search"}, + "app.skin-site.admin.players.search-name": {"message": "Name"}, + "app.skin-site.admin.players.search-owner": {"message": "Owner"}, + "app.skin-site.admin.players.search-uuid": {"message": "UUID"}, + "app.skin-site.admin.players.total": {"message": "{count} players"}, + "app.skin-site.admin.players.prev": {"message": "Previous"}, + "app.skin-site.admin.players.next": {"message": "Next"}, + "app.skin-site.admin.players.page": {"message": "Page {page}"}, + "app.skin-site.admin.players.name": {"message": "Name"}, + "app.skin-site.admin.players.owner": {"message": "Owner"}, + "app.skin-site.admin.players.source": {"message": "Source"}, + "app.skin-site.admin.players.legacy": {"message": "Legacy adapted"}, + "app.skin-site.admin.players.actions": {"message": "Actions"}, + "app.skin-site.admin.players.edit": {"message": "Edit"}, + "app.skin-site.admin.players.save": {"message": "Save"}, + "app.skin-site.admin.players.cancel": {"message": "Cancel"}, + "app.skin-site.admin.players.remove": {"message": "Delete"}, + "app.skin-site.admin.players.updated": {"message": "Player updated."}, + "app.skin-site.admin.players.deleted": {"message": "Player deleted."}, + "app.skin-site.admin.players.confirm-delete": {"message": "Delete player “{name}”? This cannot be undone."}, + "app.skin-site.admin.players.mojang": {"message": "Mojang"}, + "app.skin-site.admin.players.custom": {"message": "Skin site"}, + "app.skin-site.admin.users.title": {"message": "Users"}, + "app.skin-site.admin.users.loading": {"message": "Loading…"}, + "app.skin-site.admin.users.failed": {"message": "Could not load users."}, + "app.skin-site.admin.users.empty": {"message": "No users found."}, + "app.skin-site.admin.users.search": {"message": "Search"}, + "app.skin-site.admin.users.search-name": {"message": "Username"}, + "app.skin-site.admin.users.search-email": {"message": "Email"}, + "app.skin-site.admin.users.search-uuid": {"message": "UUID"}, + "app.skin-site.admin.users.total": {"message": "{count} users"}, + "app.skin-site.admin.users.prev": {"message": "Previous"}, + "app.skin-site.admin.users.next": {"message": "Next"}, + "app.skin-site.admin.users.page": {"message": "Page {page}"}, + "app.skin-site.admin.users.edit": {"message": "Edit"}, + "app.skin-site.admin.users.save": {"message": "Save"}, + "app.skin-site.admin.users.cancel": {"message": "Cancel"}, + "app.skin-site.admin.users.remove": {"message": "Delete"}, + "app.skin-site.admin.users.players": {"message": "Players"}, + "app.skin-site.admin.users.updated": {"message": "User updated."}, + "app.skin-site.admin.users.deleted": {"message": "User deleted."}, + "app.skin-site.admin.users.confirm-delete": {"message": "Delete user “{name}”? This cannot be undone."}, + "app.skin-site.admin.users.username": {"message": "Username"}, + "app.skin-site.admin.users.email": {"message": "Email"}, + "app.skin-site.admin.users.qq": {"message": "QQ"}, + "app.skin-site.admin.users.password": {"message": "New password"}, + "app.skin-site.admin.users.password-hint": {"message": "Leave empty to keep the current password."}, + "app.skin-site.admin.users.banned": {"message": "Banned"}, + "app.skin-site.admin.users.permissions": {"message": "Permissions"}, + "app.skin-site.admin.users.permissions-hint": {"message": "Comma separated, e.g. WEB_ADMIN, SERVER_ADMIN."}, + "app.skin-site.admin.users.no-players": {"message": "No linked players."}, + "app.skin-site.admin.users.registered": {"message": "Registered"} } diff --git a/apps/app-frontend/src/locales/zh-CN/index.json b/apps/app-frontend/src/locales/zh-CN/index.json index 3afc3a3..097222b 100644 --- a/apps/app-frontend/src/locales/zh-CN/index.json +++ b/apps/app-frontend/src/locales/zh-CN/index.json @@ -11661,5 +11661,61 @@ "app.skin-site.admin.broadcast.updated": {"message": "公告已更新。"}, "app.skin-site.admin.broadcast.deleted": {"message": "公告已删除。"}, "app.skin-site.admin.broadcast.confirm-delete": {"message": "确定删除「{title}」吗?此操作不可撤销。"}, - "app.skin-site.admin.broadcast.uploader": {"message": "由 {name} 发布"} + "app.skin-site.admin.broadcast.uploader": {"message": "由 {name} 发布"}, + "app.skin-site.admin.players.title": {"message": "玩家"}, + "app.skin-site.admin.players.loading": {"message": "加载中…"}, + "app.skin-site.admin.players.failed": {"message": "无法加载玩家列表。"}, + "app.skin-site.admin.players.empty": {"message": "没有找到玩家。"}, + "app.skin-site.admin.players.search": {"message": "搜索"}, + "app.skin-site.admin.players.search-name": {"message": "名称"}, + "app.skin-site.admin.players.search-owner": {"message": "所有者"}, + "app.skin-site.admin.players.search-uuid": {"message": "UUID"}, + "app.skin-site.admin.players.total": {"message": "共 {count} 名玩家"}, + "app.skin-site.admin.players.prev": {"message": "上一页"}, + "app.skin-site.admin.players.next": {"message": "下一页"}, + "app.skin-site.admin.players.page": {"message": "第 {page} 页"}, + "app.skin-site.admin.players.name": {"message": "名称"}, + "app.skin-site.admin.players.owner": {"message": "所有者"}, + "app.skin-site.admin.players.source": {"message": "来源"}, + "app.skin-site.admin.players.legacy": {"message": "旧版适配"}, + "app.skin-site.admin.players.actions": {"message": "操作"}, + "app.skin-site.admin.players.edit": {"message": "编辑"}, + "app.skin-site.admin.players.save": {"message": "保存"}, + "app.skin-site.admin.players.cancel": {"message": "取消"}, + "app.skin-site.admin.players.remove": {"message": "删除"}, + "app.skin-site.admin.players.updated": {"message": "玩家已更新。"}, + "app.skin-site.admin.players.deleted": {"message": "玩家已删除。"}, + "app.skin-site.admin.players.confirm-delete": {"message": "确定删除玩家「{name}」吗?此操作不可撤销。"}, + "app.skin-site.admin.players.mojang": {"message": "正版"}, + "app.skin-site.admin.players.custom": {"message": "皮肤站"}, + "app.skin-site.admin.users.title": {"message": "用户"}, + "app.skin-site.admin.users.loading": {"message": "加载中…"}, + "app.skin-site.admin.users.failed": {"message": "无法加载用户列表。"}, + "app.skin-site.admin.users.empty": {"message": "没有找到用户。"}, + "app.skin-site.admin.users.search": {"message": "搜索"}, + "app.skin-site.admin.users.search-name": {"message": "用户名"}, + "app.skin-site.admin.users.search-email": {"message": "邮箱"}, + "app.skin-site.admin.users.search-uuid": {"message": "UUID"}, + "app.skin-site.admin.users.total": {"message": "共 {count} 名用户"}, + "app.skin-site.admin.users.prev": {"message": "上一页"}, + "app.skin-site.admin.users.next": {"message": "下一页"}, + "app.skin-site.admin.users.page": {"message": "第 {page} 页"}, + "app.skin-site.admin.users.edit": {"message": "编辑"}, + "app.skin-site.admin.users.save": {"message": "保存"}, + "app.skin-site.admin.users.cancel": {"message": "取消"}, + "app.skin-site.admin.users.remove": {"message": "删除"}, + "app.skin-site.admin.users.players": {"message": "角色"}, + "app.skin-site.admin.users.updated": {"message": "用户已更新。"}, + "app.skin-site.admin.users.deleted": {"message": "用户已删除。"}, + "app.skin-site.admin.users.confirm-delete": {"message": "确定删除用户「{name}」吗?此操作不可撤销。"}, + "app.skin-site.admin.users.username": {"message": "用户名"}, + "app.skin-site.admin.users.email": {"message": "邮箱"}, + "app.skin-site.admin.users.qq": {"message": "QQ"}, + "app.skin-site.admin.users.password": {"message": "新密码"}, + "app.skin-site.admin.users.password-hint": {"message": "留空则保持原密码不变。"}, + "app.skin-site.admin.users.banned": {"message": "封禁"}, + "app.skin-site.admin.users.permissions": {"message": "权限"}, + "app.skin-site.admin.users.permissions-hint": {"message": "以逗号分隔,例如 WEB_ADMIN, SERVER_ADMIN。"}, + "app.skin-site.admin.users.no-players": {"message": "没有绑定的角色。"}, + "app.skin-site.admin.users.registered": {"message": "注册时间"} }