From b0178c046fa578fd4ab2307435bf27ce1a612d44 Mon Sep 17 00:00:00 2001 From: Ap_Tx <3045929398@qq.com> Date: Sun, 18 Oct 2026 08:01:24 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E7=9A=AE=E8=82=A4?= =?UTF-8?q?=E7=AB=99=E7=AE=A1=E7=90=86=E5=8F=B0=E6=8D=90=E8=B5=A0=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/skin-site/SkinSiteAdminView.vue | 6 +- .../ui/skin-site/admin/AdminDonationsPage.vue | 366 ++++++++++++++++++ .../app-frontend/src/helpers/skin-site-api.ts | 80 ++++ .../app-frontend/src/locales/en-US/index.json | 28 +- .../app-frontend/src/locales/zh-CN/index.json | 28 +- 5 files changed, 505 insertions(+), 3 deletions(-) create mode 100644 apps/app-frontend/src/components/ui/skin-site/admin/AdminDonationsPage.vue 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 a640cf5..5da5085 100644 --- a/apps/app-frontend/src/components/ui/skin-site/SkinSiteAdminView.vue +++ b/apps/app-frontend/src/components/ui/skin-site/SkinSiteAdminView.vue @@ -6,6 +6,7 @@ import { skinSiteUser } from '@/composables/skin-site-session' import AdminAccessAuditPage from './admin/AdminAccessAuditPage.vue' import AdminBroadcastPage from './admin/AdminBroadcastPage.vue' +import AdminDonationsPage from './admin/AdminDonationsPage.vue' import AdminDownloadsPage from './admin/AdminDownloadsPage.vue' import AdminLauncherPage from './admin/AdminLauncherPage.vue' import AdminPlayersPage from './admin/AdminPlayersPage.vue' @@ -98,7 +99,9 @@ const navGroups = computed(() => [ { key: 'broadcast', label: formatMessage(messages.itemBroadcast) }, { key: 'chat', label: formatMessage(messages.itemChat) }, { key: 'wiki', label: formatMessage(messages.itemWiki) }, - { key: 'donations', label: formatMessage(messages.itemDonations) }, + ...(hasWebAdmin.value + ? [{ key: 'donations' as AdminKey, label: formatMessage(messages.itemDonations) }] + : []), ], }, { @@ -177,6 +180,7 @@ const current = ref('summary') +

{{ current }}

diff --git a/apps/app-frontend/src/components/ui/skin-site/admin/AdminDonationsPage.vue b/apps/app-frontend/src/components/ui/skin-site/admin/AdminDonationsPage.vue new file mode 100644 index 0000000..0b284b0 --- /dev/null +++ b/apps/app-frontend/src/components/ui/skin-site/admin/AdminDonationsPage.vue @@ -0,0 +1,366 @@ + + diff --git a/apps/app-frontend/src/helpers/skin-site-api.ts b/apps/app-frontend/src/helpers/skin-site-api.ts index 47f97b5..1bf25b8 100644 --- a/apps/app-frontend/src/helpers/skin-site-api.ts +++ b/apps/app-frontend/src/helpers/skin-site-api.ts @@ -1452,3 +1452,83 @@ export function skinSiteUpdateAccessAuditSettings( body: { retentionDays }, }) } + +export interface SkinSiteDonationEntry { + id: number + rank: number + username: string + avatar: string | null + amount: string +} + +export interface SkinSiteDonationSummary { + totalAmount: string + donorCount: number +} + +export interface SkinSiteDonationAdminEntry { + donor: SkinSiteDonationEntry + userUuid: string | null + qq: string | null + external: boolean + version: number + updatedAt: number +} + +export interface SkinSiteDonationAdminPage { + items: SkinSiteDonationAdminEntry[] + summary: SkinSiteDonationSummary + hasMore: boolean +} + +export function skinSiteAdminDonations( + offset = 0, +): Promise> { + return skinSiteRequest('donation/admin/list?limit=20&offset=' + offset) +} + +export function skinSiteFindAdminDonations(identity: { + userUuid?: string + qq?: string +}): Promise> { + const query = new URLSearchParams() + if (identity.userUuid) query.set('userUuid', identity.userUuid) + if (identity.qq) query.set('qq', identity.qq) + return skinSiteRequest('donation/admin/find?' + query.toString()) +} + +export interface SkinSiteDonationCreate { + amount: string + userUuid?: string + qq?: string + displayName?: string +} + +export function skinSiteCreateDonation( + data: SkinSiteDonationCreate, +): Promise> { + return skinSiteRequest('donation/admin', { method: 'POST', body: data }) +} + +export interface SkinSiteDonationUpdate { + amount: string + version: number + displayName?: string + mode?: 'REPLACE' | 'APPEND' +} + +export function skinSiteUpdateDonation( + id: number, + data: SkinSiteDonationUpdate, +): Promise> { + return skinSiteRequest('donation/admin/' + id, { method: 'PUT', body: data }) +} + +export function skinSiteDeleteDonation( + id: number, + version: number, +): Promise> { + return skinSiteRequest('donation/admin/' + id + '?version=' + version, { + method: 'DELETE', + }) +} diff --git a/apps/app-frontend/src/locales/en-US/index.json b/apps/app-frontend/src/locales/en-US/index.json index db1b46e..1fd0639 100644 --- a/apps/app-frontend/src/locales/en-US/index.json +++ b/apps/app-frontend/src/locales/en-US/index.json @@ -12023,5 +12023,31 @@ "app.skin-site.admin.audit.retention": {"message": "Retention (days)"}, "app.skin-site.admin.audit.record-limit": {"message": "Record limit"}, "app.skin-site.admin.audit.save-retention": {"message": "Save"}, - "app.skin-site.admin.audit.retention-saved": {"message": "Retention updated."} + "app.skin-site.admin.audit.retention-saved": {"message": "Retention updated."}, + "app.skin-site.admin.donations.title": {"message": "Donations"}, + "app.skin-site.admin.donations.loading": {"message": "Loading…"}, + "app.skin-site.admin.donations.failed": {"message": "Could not load donations."}, + "app.skin-site.admin.donations.empty": {"message": "No donations yet."}, + "app.skin-site.admin.donations.total-amount": {"message": "Total"}, + "app.skin-site.admin.donations.donor-count": {"message": "Donors"}, + "app.skin-site.admin.donations.donor": {"message": "Donor"}, + "app.skin-site.admin.donations.amount": {"message": "Amount"}, + "app.skin-site.admin.donations.updated-at": {"message": "Updated"}, + "app.skin-site.admin.donations.external": {"message": "External"}, + "app.skin-site.admin.donations.linked": {"message": "Linked"}, + "app.skin-site.admin.donations.create": {"message": "Add donation"}, + "app.skin-site.admin.donations.save": {"message": "Save"}, + "app.skin-site.admin.donations.cancel": {"message": "Cancel"}, + "app.skin-site.admin.donations.edit": {"message": "Edit"}, + "app.skin-site.admin.donations.remove": {"message": "Delete"}, + "app.skin-site.admin.donations.amount-field": {"message": "Amount"}, + "app.skin-site.admin.donations.display-name": {"message": "Display name"}, + "app.skin-site.admin.donations.user-uuid": {"message": "User UUID"}, + "app.skin-site.admin.donations.qq": {"message": "QQ"}, + "app.skin-site.admin.donations.append-mode": {"message": "Append to existing amount"}, + "app.skin-site.admin.donations.created": {"message": "Donation created."}, + "app.skin-site.admin.donations.updated": {"message": "Donation updated."}, + "app.skin-site.admin.donations.deleted": {"message": "Donation deleted."}, + "app.skin-site.admin.donations.confirm-delete": {"message": "Delete the donation from “{name}”? This cannot be undone."}, + "app.skin-site.admin.donations.load-more": {"message": "Load more"} } diff --git a/apps/app-frontend/src/locales/zh-CN/index.json b/apps/app-frontend/src/locales/zh-CN/index.json index f5f3409..d86a373 100644 --- a/apps/app-frontend/src/locales/zh-CN/index.json +++ b/apps/app-frontend/src/locales/zh-CN/index.json @@ -11854,5 +11854,31 @@ "app.skin-site.admin.audit.retention": {"message": "保留天数"}, "app.skin-site.admin.audit.record-limit": {"message": "记录上限"}, "app.skin-site.admin.audit.save-retention": {"message": "保存"}, - "app.skin-site.admin.audit.retention-saved": {"message": "保留天数已更新。"} + "app.skin-site.admin.audit.retention-saved": {"message": "保留天数已更新。"}, + "app.skin-site.admin.donations.title": {"message": "捐赠管理"}, + "app.skin-site.admin.donations.loading": {"message": "加载中…"}, + "app.skin-site.admin.donations.failed": {"message": "无法加载捐赠列表。"}, + "app.skin-site.admin.donations.empty": {"message": "暂无捐赠记录。"}, + "app.skin-site.admin.donations.total-amount": {"message": "总额"}, + "app.skin-site.admin.donations.donor-count": {"message": "捐赠人数"}, + "app.skin-site.admin.donations.donor": {"message": "捐赠者"}, + "app.skin-site.admin.donations.amount": {"message": "金额"}, + "app.skin-site.admin.donations.updated-at": {"message": "更新时间"}, + "app.skin-site.admin.donations.external": {"message": "外部"}, + "app.skin-site.admin.donations.linked": {"message": "已绑定"}, + "app.skin-site.admin.donations.create": {"message": "新增捐赠"}, + "app.skin-site.admin.donations.save": {"message": "保存"}, + "app.skin-site.admin.donations.cancel": {"message": "取消"}, + "app.skin-site.admin.donations.edit": {"message": "编辑"}, + "app.skin-site.admin.donations.remove": {"message": "删除"}, + "app.skin-site.admin.donations.amount-field": {"message": "金额"}, + "app.skin-site.admin.donations.display-name": {"message": "显示名称"}, + "app.skin-site.admin.donations.user-uuid": {"message": "用户 UUID"}, + "app.skin-site.admin.donations.qq": {"message": "QQ"}, + "app.skin-site.admin.donations.append-mode": {"message": "在原有金额上累加"}, + "app.skin-site.admin.donations.created": {"message": "捐赠记录已创建。"}, + "app.skin-site.admin.donations.updated": {"message": "捐赠记录已更新。"}, + "app.skin-site.admin.donations.deleted": {"message": "捐赠记录已删除。"}, + "app.skin-site.admin.donations.confirm-delete": {"message": "确定删除「{name}」的捐赠记录吗?此操作不可撤销。"}, + "app.skin-site.admin.donations.load-more": {"message": "加载更多"} }