2e2c161770
- backed/: Go Fiber backend with cpdaily integration - frondend/: Vue 3 + Vite frontend - Dockerfile: multi-stage build (Node → Go → Alpine) - deploy/docker-compose.yml: production compose file - .woodpecker/build.yml: CI/CD with blue-green zero-downtime deploy - /health endpoint for deployment health checks - Port 8884/8885 blue-green swap via 1Panel OpenResty
244 lines
5.3 KiB
TypeScript
244 lines
5.3 KiB
TypeScript
import api from './index'
|
||
|
||
// ======== 设置 ========
|
||
|
||
export interface SetupStatus {
|
||
installed: boolean
|
||
}
|
||
|
||
export interface AdminTokenResult {
|
||
token: {
|
||
accessToken: string
|
||
expiresIn: number
|
||
tokenType: string
|
||
}
|
||
agent: AgentInfo
|
||
}
|
||
|
||
/** 检查是否已安装(是否有admin账号) */
|
||
export function getSetupStatus() {
|
||
return api.get<{ data: SetupStatus }>('/admin/setup/status')
|
||
}
|
||
|
||
/** 初始化创建管理员账号 */
|
||
export function setupInit(params: { username: string; password: string }) {
|
||
return api.post<{ data: AdminTokenResult }>('/admin/setup/init', params)
|
||
}
|
||
|
||
// ======== 管理员认证 ========
|
||
|
||
export interface AdminLoginParams {
|
||
username: string
|
||
password: string
|
||
}
|
||
|
||
export interface AgentInfo {
|
||
id: number
|
||
username: string
|
||
role: string
|
||
rate: number
|
||
balance: number
|
||
status: string
|
||
parentId?: number | null
|
||
subCount?: number
|
||
cdkCount?: number
|
||
createdAt?: string
|
||
}
|
||
|
||
export interface AdminLoginResult {
|
||
token: {
|
||
accessToken: string
|
||
expiresIn: number
|
||
tokenType: string
|
||
}
|
||
agent: AgentInfo
|
||
}
|
||
|
||
/** admin 登录 */
|
||
export function adminLogin(params: AdminLoginParams) {
|
||
return api.post<{ data: AdminLoginResult }>('/admin/login', params)
|
||
}
|
||
|
||
/** 获取当前账号信息 */
|
||
export function getAdminMe() {
|
||
return api.get<{ data: AgentInfo }>('/admin/me')
|
||
}
|
||
|
||
// ======== 代理管理 ========
|
||
|
||
export interface AgentUser {
|
||
id: number
|
||
username: string
|
||
role: string
|
||
parentId: number | null
|
||
parentUsername?: string
|
||
rate: number
|
||
balance: number
|
||
status: string
|
||
createdAt: string
|
||
updatedAt: string
|
||
}
|
||
|
||
export interface CreateAgentParams {
|
||
username: string
|
||
password: string
|
||
rate: number
|
||
balance: number
|
||
}
|
||
|
||
export interface UpdateAgentParams {
|
||
balance?: number
|
||
rate?: number
|
||
}
|
||
|
||
/** 获取下级代理列表 */
|
||
export function getSubAgents() {
|
||
return api.get<{ data: AgentUser[] }>('/admin/agents')
|
||
}
|
||
|
||
/** 获取所有代理(admin only) */
|
||
export function getAllAgents() {
|
||
return api.get<{ data: AgentUser[] }>('/admin/all-agents')
|
||
}
|
||
|
||
/** 创建下级代理 */
|
||
export function createSubAgent(params: CreateAgentParams) {
|
||
return api.post<{ data: { username: string; role: string; rate: number; balance: number } }>(
|
||
'/admin/agents',
|
||
params
|
||
)
|
||
}
|
||
|
||
/** 更新代理(充值/修改费率) */
|
||
export function updateSubAgent(id: number, params: UpdateAgentParams) {
|
||
return api.put<{ data: AgentUser }>(`/admin/agents/${id}`, params)
|
||
}
|
||
|
||
/** 获取代理详情 */
|
||
export function getAgentDetail(id: number) {
|
||
return api.get(`/admin/agents/${id}`)
|
||
}
|
||
|
||
/** 修改代理密码(admin only) */
|
||
export function updateAgentPassword(id: number, password: string) {
|
||
return api.put(`/admin/agents/${id}/password`, { password })
|
||
}
|
||
|
||
/** 启用/禁用代理(admin only) */
|
||
export function updateAgentStatus(id: number, status: 'active' | 'disabled') {
|
||
return api.put(`/admin/agents/${id}/status`, { status })
|
||
}
|
||
|
||
// ======== CDK管理 ========
|
||
|
||
export interface CDKCode {
|
||
id: number
|
||
code: string
|
||
price: number
|
||
costPrice: number
|
||
agentId: number
|
||
status: string
|
||
userId: number | null
|
||
usedAt: string | null
|
||
createdAt: string
|
||
updatedAt: string
|
||
}
|
||
|
||
export interface GenerateCDKResult {
|
||
count: number
|
||
price: number
|
||
maxRuns: number
|
||
costTotal: number
|
||
cdkCodes: CDKCode[]
|
||
}
|
||
|
||
/** 生成CDK */
|
||
export function generateCDK(count: number = 1, maxRuns: number = 1) {
|
||
return api.post<{ data: GenerateCDKResult }>('/admin/cdks', { count, maxRuns })
|
||
}
|
||
|
||
/** 获取自己生成的CDK列表 */
|
||
export function getMyCDKs() {
|
||
return api.get<{ data: CDKCode[] }>('/admin/cdks')
|
||
}
|
||
|
||
/** 获取所有CDK列表(admin only) */
|
||
export function getAllCDKs() {
|
||
return api.get<{ data: CDKCode[] }>('/admin/all-cdks')
|
||
}
|
||
|
||
// ======== 系统设置(admin only) ========
|
||
|
||
export interface SystemSettings {
|
||
[key: string]: string
|
||
}
|
||
|
||
/** 获取系统设置 */
|
||
export function getSettings() {
|
||
return api.get<{ data: SystemSettings }>('/admin/settings')
|
||
}
|
||
|
||
/** 更新系统设置 */
|
||
export function updateSetting(key: string, value: string) {
|
||
return api.put('/admin/settings', { key, value })
|
||
}
|
||
|
||
// ======== 公告管理(admin only) ========
|
||
|
||
export interface Announcement {
|
||
id: number
|
||
title: string
|
||
content: string
|
||
targetType: 'agent' | 'user'
|
||
forcePopup: boolean
|
||
loopPopup: boolean
|
||
createdBy: number
|
||
createdAt: string
|
||
updatedAt: string
|
||
}
|
||
|
||
export interface AnnouncementListItem extends Announcement {
|
||
readCount: number
|
||
unreadCount: number
|
||
totalTargets: number
|
||
}
|
||
|
||
export interface CreateAnnouncementParams {
|
||
title: string
|
||
content: string
|
||
targetType: 'agent' | 'user'
|
||
forcePopup: boolean
|
||
loopPopup: boolean
|
||
}
|
||
|
||
export interface ReadUser {
|
||
userId: number
|
||
username: string
|
||
readAt: string
|
||
}
|
||
|
||
export interface AnnouncementDetail {
|
||
announcement: Announcement
|
||
readUsers: ReadUser[]
|
||
}
|
||
|
||
/** 创建公告 */
|
||
export function createAnnouncement(params: CreateAnnouncementParams) {
|
||
return api.post<{ data: Announcement }>('/admin/announcements', params)
|
||
}
|
||
|
||
/** 获取公告列表(含统计) */
|
||
export function getAnnouncements() {
|
||
return api.get<{ data: AnnouncementListItem[] }>('/admin/announcements')
|
||
}
|
||
|
||
/** 获取公告详情(含已读用户列表) */
|
||
export function getAnnouncementDetail(id: number) {
|
||
return api.get<{ data: AnnouncementDetail }>(`/admin/announcements/${id}`)
|
||
}
|
||
|
||
/** 删除公告 */
|
||
export function deleteAnnouncement(id: number) {
|
||
return api.delete(`/admin/announcements/${id}`)
|
||
}
|