xianyu-freedom-front/src/api/accounts.ts
2026-02-04 00:32:18 +08:00

203 lines
6.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { get, post, put, del } from '@/utils/request'
import type { Account, AccountDetail, ApiResponse } from '@/types'
// 获取账号列表(返回账号对象数组)
export const getAccounts = async (): Promise<Account[]> => {
interface BackendAccount {
id: string
value: string
remark?: string
username?: string
password?: string
enabled: boolean
created_at?: string
updated_at?: string
user_id?: number
auto_confirm: boolean
pause_duration?: number
show_browser?: boolean
}
const data = await get<BackendAccount[]>('/goofish/accounts')
// 后端返回的是完整账号对象数组转换为前端Account格式
return data.map(item => ({
id: item.id,
cookie: item.value || '',
remark: item.remark,
enabled: item.enabled,
use_ai_reply: false,
use_default_reply: false,
auto_confirm: item.auto_confirm
}))
}
// 获取账号详情列表
export const getAccountDetails = async (): Promise<AccountDetail[]> => {
interface BackendAccountDetail {
id: string
cookie: string
enabled: boolean
auto_confirm: boolean
remark?: string
pause_duration?: number
username?: string
login_password?: string
show_browser?: boolean
}
const data = await get<BackendAccountDetail[]>('/goofish/accounts')
// 后端返回 value 字段,前端使用 cookie 字段
return data.map((item) => ({
id: item.id,
cookie: item.cookie,
remark: item.remark,
enabled: item.enabled,
auto_confirm: item.auto_confirm,
note: item.remark,
pause_duration: item.pause_duration,
username: item.username,
login_password: item.login_password,
show_browser: item.show_browser,
use_ai_reply: false,
use_default_reply: false,
}))
}
// 添加账号
export const addAccount = (data: { id: string; cookie: string }): Promise<ApiResponse> => {
// 后端需要 id 和 value 字段
return post('/goofish/login-by-cookie', { id: data.id, value: data.cookie })
}
// 更新账号 Cookie 值
export const updateAccountCookie = (id: string, value: string): Promise<ApiResponse> => {
return put(`/goofish/cookies/${id}`, { id, value })
}
// 更新账号启用/禁用状态
export const updateAccountStatus = (id: string, enabled: boolean): Promise<ApiResponse> => {
return put(`/goofish/account/${id}/status`, { enabled })
}
// 更新账号备注
export const updateAccountRemark = (id: string, remark: string): Promise<ApiResponse> => {
return put(`/goofish/account/${id}/remark`, { remark })
}
// 更新账号自动确认设置
export const updateAccountAutoConfirm = (id: string, autoConfirm: boolean): Promise<ApiResponse> => {
return put(`/goofish/cookies/${id}/auto-confirm`, { auto_confirm: autoConfirm })
}
// 更新账号暂停时间
export const updateAccountPauseDuration = (id: string, pauseDuration: number): Promise<ApiResponse> => {
return put(`/goofish/cookies/${id}/pause-duration`, { pause_duration: pauseDuration })
}
// 更新账号登录信息(用户名、密码、是否显示浏览器)
export const updateAccountLoginInfo = (id: string, data: {
username?: string
login_password?: string
show_browser?: boolean
}): Promise<ApiResponse> => {
return put(`/goofish/cookies/${id}/login-info`, data)
}
// 删除账号
export const deleteAccount = (id: string): Promise<ApiResponse> => {
return del(`/goofish/account/${id}`)
}
// 获取账号二维码登录
export const getQRCode = (accountId: string): Promise<{ success: boolean; qrcode_url?: string; token?: string }> => {
return post('/qrcode/generate', { account_id: accountId })
}
// 检查二维码登录状态
export const checkQRCodeStatus = (token: string): Promise<{ success: boolean; status: string; cookie?: string }> => {
return post('/qrcode/check', { token })
}
// 账号密码登录
export const passwordLogin = (data: { account_id: string; account: string; password: string; show_browser?: boolean }): Promise<ApiResponse> => {
return post('/goofish/password-login', data)
}
// 生成扫码登录二维码
export const generateQRLogin = (): Promise<{ success: boolean; session_id?: string; qr_code_url?: string; message?: string }> => {
return post('/goofish/qr-login/generate')
}
// 检查扫码登录状态
// 后端直接返回 { status: ..., message?: ..., account_info?: ... },没有 success 字段
export const checkQRLoginStatus = async (sessionId: string): Promise<{
success: boolean
status: 'pending' | 'scanned' | 'success' | 'expired' | 'cancelled' | 'verification_required' | 'processing' | 'already_processed' | 'error'
message?: string
account_info?: {
account_id: string
is_new_account: boolean
}
}> => {
const result = await get<{
status: string
message?: string
account_info?: { account_id: string; is_new_account: boolean }
}>(`/goofish/qr-login/check/${sessionId}`)
// 后端没有返回 success 字段,根据 status 判断
return {
success: result.status !== 'error',
status: result.status as 'pending' | 'scanned' | 'success' | 'expired' | 'cancelled' | 'verification_required' | 'processing' | 'already_processed' | 'error',
message: result.message,
account_info: result.account_info,
}
}
// 检查密码登录状态
export const checkPasswordLoginStatus = (sessionId: string): Promise<{
success: boolean
status: 'pending' | 'processing' | 'success' | 'failed' | 'verification_required'
message?: string
account_id?: string
}> => {
return get(`/goofish/password-login/status/${sessionId}`)
}
// AI 回复设置接口 - 与后端 AIReplySettings 模型对应
export interface AIReplySettings {
ai_enabled: boolean
model_name?: string
api_key?: string
base_url?: string
max_discount_percent?: number
max_discount_amount?: number
max_bargain_rounds?: number
custom_prompts?: string
// 兼容旧字段(前端内部使用)
enabled?: boolean
}
// 获取AI回复设置
export const getAIReplySettings = (cookieId: string): Promise<AIReplySettings> => {
return get(`/ai-reply-settings/${cookieId}`)
}
// 更新AI回复设置
export const updateAIReplySettings = (cookieId: string, settings: Partial<AIReplySettings>): Promise<ApiResponse> => {
// 转换字段名以匹配后端
const payload: Record<string, unknown> = {
ai_enabled: settings.ai_enabled ?? settings.enabled ?? false,
model_name: settings.model_name ?? 'qwen-plus',
api_key: settings.api_key ?? '',
base_url: settings.base_url ?? 'https://dashscope.aliyuncs.com/compatible-mode/v1',
max_discount_percent: settings.max_discount_percent ?? 10,
max_discount_amount: settings.max_discount_amount ?? 100,
max_bargain_rounds: settings.max_bargain_rounds ?? 3,
custom_prompts: settings.custom_prompts ?? '',
}
return put(`/ai-reply-settings/${cookieId}`, payload)
}
// 获取所有账号的AI回复设置
export const getAllAIReplySettings = (): Promise<Record<number, AIReplySettings>> => {
return get('/ai-reply-settings')
}