feat(ECR-010): Ops-E 系统运营;修复登出解绑;P2 Complete
ci / h5 (push) Canceled after 0s
ci / api (push) Canceled after 0s
ci / ess-docs (push) Canceled after 0s

落地管理员 RBAC/封禁/推送任务 stub,logout 解绑 device 并统一各页 ensureAccount,同时收口 P2 生日生成与状态文档。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
jackyu66git
2026-08-11 18:54:59 +08:00
co-authored by Cursor
parent 0ee4d4f5ae
commit 5ceb3ce749
85 changed files with 2098 additions and 103 deletions
+35 -2
View File
@@ -94,24 +94,57 @@ export type UserDetail = {
}>
}
export type AdminRole = 'super' | 'ops'
export type AdminMe = { id: string; username: string; role: AdminRole }
export type PushJob = {
id: string
title: string
body: string
audience: string
status: 'draft' | 'cancelled'
created_by: string
created_at: string
updated_at: string
}
export type AdminListItem = {
id: string
username: string
role: AdminRole
status: string
created_at: string
}
export const adminApi = {
login: (username: string, password: string) =>
request<{ token: string; admin: { id: string; username: string } }>('POST', '/auth/login', {
request<{ token: string; admin: AdminMe }>('POST', '/auth/login', {
username,
password,
}),
logout: () => request<{ ok: boolean }>('POST', '/auth/logout'),
me: () => request<{ id: string; username: string }>('GET', '/me'),
me: () => request<AdminMe>('GET', '/me'),
stats: () => request<DashboardStats>('GET', '/stats'),
users: (q = '') =>
request<{ items: UserListItem[] }>('GET', `/users?q=${encodeURIComponent(q)}`),
user: (id: string) => request<UserDetail>('GET', `/users/${id}`),
banUser: (id: string) => request<{ ok: boolean }>('POST', `/users/${id}/ban`),
unbanUser: (id: string) => request<{ ok: boolean }>('POST', `/users/${id}/unban`),
grant: (id: string, plan: string) =>
request<{ ok: boolean }>('POST', `/users/${id}/membership/grant`, { plan }),
grantAskQuota: (id: string, delta: number) =>
request<{ ok: boolean; ask_paid_quota_left: number }>('POST', `/users/${id}/ask-quota/grant`, {
delta,
}),
admins: () => request<{ items: AdminListItem[] }>('GET', '/admins'),
patchAdminRole: (id: string, role: AdminRole) =>
request<{ ok: boolean }>('PATCH', `/admins/${id}`, { role }),
pushJobs: () => request<{ items: PushJob[] }>('GET', '/push-jobs'),
createPushJob: (body: { title: string; body?: string; audience?: string }) =>
request<PushJob>('POST', '/push-jobs', body),
patchPushJob: (id: string, body: { title?: string; body?: string; status?: 'draft' | 'cancelled' }) =>
request<PushJob>('PATCH', `/push-jobs/${id}`, body),
orders: (params?: {
status?: string
kind?: string