refactor(api): 精简并移除多余的API接口和类型定义
- 移除多余的统计、预算、AI设置、用户偏好、数据同步及AI处理相关类型定义 - 删除大量未使用的API请求函数,简化导出接口 - 保留核心的用户认证、交易记录、聊天消息和账单提醒相关接口 - 优化App组件状态初始化,改为从localStorage加载持久化数据,避免重复请求 - VoiceInput组件重构,改用持续监听及更健壮的权限和错误处理逻辑 - 优化语音识别启动和停止机制,提升用户体验和错误恢复能力 - 更新依赖顺序,无功能性变更
This commit is contained in:
338
services/api.ts
338
services/api.ts
@@ -24,55 +24,6 @@ interface PaginatedResponse<T> {
|
||||
total: number;
|
||||
}
|
||||
|
||||
// 统计数据响应格式
|
||||
interface TransactionStats {
|
||||
month: string;
|
||||
total_income: number;
|
||||
total_expense: number;
|
||||
balance: number;
|
||||
expense_by_category: Record<string, number>;
|
||||
income_by_category: Record<string, number>;
|
||||
daily_expense: Array<{ date: string; amount: number }>;
|
||||
}
|
||||
|
||||
// 预算响应格式
|
||||
interface Budget {
|
||||
id: string;
|
||||
user_id?: string;
|
||||
member_id?: string;
|
||||
budgets: Record<string, number>;
|
||||
month: string;
|
||||
created_at?: string;
|
||||
updated_at?: string;
|
||||
}
|
||||
|
||||
// 预算执行情况
|
||||
interface BudgetExecution {
|
||||
month: string;
|
||||
budgets: Record<string, {
|
||||
budget: number;
|
||||
spent: number;
|
||||
remaining: number;
|
||||
percentage: number;
|
||||
}>;
|
||||
total_budget: number;
|
||||
total_spent: number;
|
||||
total_remaining: number;
|
||||
is_over_budget: boolean;
|
||||
}
|
||||
|
||||
// AI设置
|
||||
interface AISettings {
|
||||
id?: string;
|
||||
user_id?: string;
|
||||
member_id?: string;
|
||||
name: string;
|
||||
persona: string;
|
||||
avatar?: string;
|
||||
created_at?: string;
|
||||
updated_at?: string;
|
||||
}
|
||||
|
||||
// 通用请求函数
|
||||
async function request<T>(
|
||||
endpoint: string,
|
||||
@@ -156,13 +107,6 @@ export async function getUserProfile(): Promise<any> {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 退出登录
|
||||
*/
|
||||
export function logout(): void {
|
||||
localStorage.removeItem('auth_token');
|
||||
}
|
||||
|
||||
// ==================== 交易记录接口 ====================
|
||||
|
||||
/**
|
||||
@@ -208,13 +152,6 @@ export async function getTransactions(params?: {
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取单个交易记录
|
||||
*/
|
||||
export async function getTransaction(id: string): Promise<Transaction> {
|
||||
return request<Transaction>(`/bill/transactions/${id}`);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新交易记录
|
||||
*/
|
||||
@@ -244,27 +181,6 @@ export async function deleteTransaction(id: string): Promise<void> {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量删除交易记录
|
||||
*/
|
||||
export async function batchDeleteTransactions(
|
||||
transactionIds: string[]
|
||||
): Promise<{ deleted_count: number }> {
|
||||
return request<{ deleted_count: number }>('/bill/transactions/batch', {
|
||||
method: 'DELETE',
|
||||
body: JSON.stringify({ transaction_ids: transactionIds }),
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取交易统计数据
|
||||
*/
|
||||
export async function getTransactionStats(
|
||||
month: string
|
||||
): Promise<TransactionStats> {
|
||||
return request<TransactionStats>(`/bill/transactions/stats/summary?month=${month}`);
|
||||
}
|
||||
|
||||
// ==================== 聊天消息接口 ====================
|
||||
|
||||
/**
|
||||
@@ -306,13 +222,6 @@ export async function getMessages(params?: {
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取单个消息
|
||||
*/
|
||||
export async function getMessage(id: string): Promise<Message> {
|
||||
return request<Message>(`/bill/messages/${id}`);
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除消息
|
||||
*/
|
||||
@@ -322,46 +231,6 @@ export async function deleteMessage(id: string): Promise<void> {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 清空聊天历史
|
||||
*/
|
||||
export async function clearMessages(): Promise<{ deleted_count: number }> {
|
||||
return request<{ deleted_count: number }>('/bill/messages/clear', {
|
||||
method: 'DELETE',
|
||||
});
|
||||
}
|
||||
|
||||
// ==================== 预算管理接口 ====================
|
||||
|
||||
/**
|
||||
* 获取月度预算
|
||||
*/
|
||||
export async function getMonthlyBudget(month: string): Promise<Budget> {
|
||||
return request<Budget>(`/bill/budgets/${month}`);
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置/更新月度预算
|
||||
*/
|
||||
export async function updateMonthlyBudget(
|
||||
month: string,
|
||||
budgets: Record<string, number>
|
||||
): Promise<Budget> {
|
||||
return request<Budget>(`/bill/budgets/${month}`, {
|
||||
method: 'PUT',
|
||||
body: JSON.stringify({ budgets }),
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取预算执行情况
|
||||
*/
|
||||
export async function getBudgetExecution(
|
||||
month: string
|
||||
): Promise<BudgetExecution> {
|
||||
return request<BudgetExecution>(`/bill/budgets/${month}/execution`);
|
||||
}
|
||||
|
||||
// ==================== 账单提醒接口 ====================
|
||||
|
||||
/**
|
||||
@@ -403,13 +272,6 @@ export async function getReminders(params?: {
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取单个提醒
|
||||
*/
|
||||
export async function getReminder(id: string): Promise<BillReminder> {
|
||||
return request<BillReminder>(`/bill/reminders/${id}`);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新账单提醒
|
||||
*/
|
||||
@@ -451,228 +313,28 @@ export async function deleteReminder(id: string): Promise<void> {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取即将到期的提醒
|
||||
*/
|
||||
export async function getUpcomingReminders(
|
||||
days: number = 7
|
||||
): Promise<PaginatedResponse<BillReminder>> {
|
||||
return request<PaginatedResponse<BillReminder>>(
|
||||
`/bill/reminders/upcoming?days=${days}`
|
||||
);
|
||||
}
|
||||
|
||||
// ==================== AI设置接口 ====================
|
||||
|
||||
/**
|
||||
* 获取AI设置
|
||||
*/
|
||||
export async function getAISettings(): Promise<AISettings> {
|
||||
return request<AISettings>('/h5/ai-settings');
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新AI设置
|
||||
*/
|
||||
export async function updateAISettings(data: {
|
||||
name?: string;
|
||||
persona?: string;
|
||||
avatar?: string;
|
||||
}): Promise<AISettings> {
|
||||
return request<AISettings>('/h5/ai-settings', {
|
||||
method: 'PUT',
|
||||
body: JSON.stringify(data),
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 重置AI设置为默认
|
||||
*/
|
||||
export async function resetAISettings(): Promise<AISettings> {
|
||||
return request<AISettings>('/h5/ai-settings/reset', {
|
||||
method: 'POST',
|
||||
});
|
||||
}
|
||||
|
||||
// ==================== 用户偏好接口 ====================
|
||||
|
||||
interface UserPreferences {
|
||||
id?: string;
|
||||
user_id?: string;
|
||||
custom_preset_name?: string;
|
||||
custom_preset_description?: string;
|
||||
theme_index?: number;
|
||||
created_at?: string;
|
||||
updated_at?: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取用户偏好
|
||||
*/
|
||||
export async function getUserPreferences(): Promise<UserPreferences> {
|
||||
return request<UserPreferences>('/h5/preferences');
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新用户偏好
|
||||
*/
|
||||
export async function updateUserPreferences(
|
||||
data: Partial<UserPreferences>
|
||||
): Promise<UserPreferences> {
|
||||
return request<UserPreferences>('/h5/preferences', {
|
||||
method: 'PUT',
|
||||
body: JSON.stringify(data),
|
||||
});
|
||||
}
|
||||
|
||||
// ==================== 数据同步接口 ====================
|
||||
|
||||
interface SyncData {
|
||||
transactions?: Transaction[];
|
||||
messages?: Message[];
|
||||
budgets?: Record<string, number>;
|
||||
reminders?: BillReminder[];
|
||||
ai_settings?: AISettings;
|
||||
preferences?: UserPreferences;
|
||||
}
|
||||
|
||||
/**
|
||||
* 全量数据同步(上传)
|
||||
*/
|
||||
export async function uploadSyncData(data: SyncData): Promise<{
|
||||
synced_at: string;
|
||||
summary: {
|
||||
transactions_count: number;
|
||||
messages_count: number;
|
||||
reminders_count: number;
|
||||
};
|
||||
}> {
|
||||
return request('/bill/sync/upload', {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(data),
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 全量数据同步(下载)
|
||||
*/
|
||||
export async function downloadSyncData(): Promise<SyncData> {
|
||||
return request<SyncData>('/bill/sync/download');
|
||||
}
|
||||
|
||||
/**
|
||||
* 增量数据同步
|
||||
*/
|
||||
export async function incrementalSync(data: {
|
||||
last_sync_at: string;
|
||||
changes: SyncData;
|
||||
}): Promise<{
|
||||
synced_at: string;
|
||||
server_changes: SyncData;
|
||||
}> {
|
||||
return request('/bill/sync/incremental', {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(data),
|
||||
});
|
||||
}
|
||||
|
||||
// ==================== AI处理接口 ====================
|
||||
|
||||
interface AIProcessResult {
|
||||
transaction: {
|
||||
item: string;
|
||||
amount: number;
|
||||
type: 'expense' | 'income';
|
||||
category: string;
|
||||
} | null;
|
||||
reply: string;
|
||||
created_transaction_id?: string;
|
||||
created_message_ids?: string[];
|
||||
}
|
||||
|
||||
/**
|
||||
* AI处理用户消息
|
||||
*/
|
||||
export async function processAIMessage(data: {
|
||||
message: string;
|
||||
image_base64?: string;
|
||||
mime_type?: string;
|
||||
}): Promise<AIProcessResult> {
|
||||
return request<AIProcessResult>('/ai/process', {
|
||||
method: 'POST',
|
||||
body: JSON.stringify(data),
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* AI识别账单图片
|
||||
*/
|
||||
export async function recognizeReceipt(
|
||||
imageFile: File
|
||||
): Promise<AIProcessResult> {
|
||||
const formData = new FormData();
|
||||
formData.append('image', imageFile);
|
||||
|
||||
// 注意: FormData需要特殊处理,不设置Content-Type让浏览器自动设置
|
||||
return request<AIProcessResult>('/ai/recognize-receipt', {
|
||||
method: 'POST',
|
||||
body: formData,
|
||||
headers: {}, // 清空默认headers,让fetch自动处理multipart/form-data
|
||||
});
|
||||
}
|
||||
|
||||
// ==================== 导出所有API ====================
|
||||
export default {
|
||||
// 用户认证
|
||||
loginOrRegister,
|
||||
getUserProfile,
|
||||
logout,
|
||||
|
||||
// 交易记录
|
||||
createTransaction,
|
||||
getTransactions,
|
||||
getTransaction,
|
||||
updateTransaction,
|
||||
deleteTransaction,
|
||||
batchDeleteTransactions,
|
||||
getTransactionStats,
|
||||
|
||||
// 聊天消息
|
||||
createMessage,
|
||||
getMessages,
|
||||
getMessage,
|
||||
deleteMessage,
|
||||
clearMessages,
|
||||
|
||||
// 预算管理
|
||||
getMonthlyBudget,
|
||||
updateMonthlyBudget,
|
||||
getBudgetExecution,
|
||||
|
||||
// 账单提醒
|
||||
createReminder,
|
||||
getReminders,
|
||||
getReminder,
|
||||
updateReminder,
|
||||
toggleReminder,
|
||||
deleteReminder,
|
||||
getUpcomingReminders,
|
||||
|
||||
// AI设置
|
||||
getAISettings,
|
||||
updateAISettings,
|
||||
resetAISettings,
|
||||
|
||||
// 用户偏好
|
||||
getUserPreferences,
|
||||
updateUserPreferences,
|
||||
|
||||
// 数据同步
|
||||
uploadSyncData,
|
||||
downloadSyncData,
|
||||
incrementalSync,
|
||||
|
||||
// AI处理
|
||||
processAIMessage,
|
||||
recognizeReceipt,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user