/** * 缘分合盘 API */ // 请求参数类型 export interface AffinityPersonInfo { name: string; gender: 'male' | 'female'; birth_date: string; // 显示格式:1990年1月1日 子时 birth_date_api: string; // API格式:1990-01-01 00:30:00 } export interface AffinityCalculateRequest { relationship: 'couple' | 'married' | 'crush' | 'partner' | 'friend' | 'family'; person1: AffinityPersonInfo; person2: AffinityPersonInfo; } // 响应数据类型 export interface AffinitySixDimension { personality: number; // 性格 emotion: number; // 情感 family: number; // 家庭 wealth: number; // 财运 career: number; // 事业 health: number; // 健康 } export interface AffinityAnalysisCard { id: string; icon: string; iconBg: string; title: string; score: string; summary: string; content: string; } export interface AffinityPastLife { description: string; depth: string; relationship: string; } export interface AffinityMatchItem { label: string; match: number; desc: string; } export interface AffinityGuide { realNeeds: string; redZone: string; tips: string[]; } export interface AffinityMonthlyFortune { heats: number[]; heatLabels: string[]; highlights: string; warnings: string; } export interface AffinityTimelineItem { year: string; title: string; desc: string; highlight: boolean; } export interface AffinityMasterAdvice { message: string; tips: string[]; } export interface AffinityUnlockedContent { pastLife: AffinityPastLife; matchItems: AffinityMatchItem[]; guide: AffinityGuide; monthlyFortune: AffinityMonthlyFortune; timeline: AffinityTimelineItem[]; masterAdvice: AffinityMasterAdvice; } export interface AffinityCalculateResponse { relationship: string; relationshipLabel: string; person1: { name: string; gender: string; birthDate: string; }; person2: { name: string; gender: string; birthDate: string; }; score: number; scoreBadge: string; sixDimension: AffinitySixDimension; radarDesc: string; analysisCards: AffinityAnalysisCard[]; unlocked: AffinityUnlockedContent; isUnlocked: boolean; unlockPrice: number; unlockStats: { unlockCount: number; accuracy: string; }; } // 列表查询相关类型 export interface AffinityListRequest { page_no?: number; page_size?: number; } export interface AffinityListItem { id: number; uuid: string; user_id: number; relationship: string; person1_name: string; person1_gender: string; person1_birth_date: string; person1_birth_date_api: string; person2_name: string; person2_gender: string; person2_birth_date: string; person2_birth_date_api: string; score: number | null; score_badge: string | null; six_dimension: string | null; radar_desc: string | null; analysis_cards: string | null; is_unlocked: number; unlock_price: number; unlocked_content: string | null; task_status: number; error_message: string | null; created_time: string; updated_time: string; } export interface AffinityListResponse { code: number; msg: string; data: { page_no: number; page_size: number; total: number; has_next: boolean; data: AffinityListItem[]; }; status_code: number; success: boolean; } /** * 缘分合盘测算 */ export async function calculateAffinity(params: AffinityCalculateRequest): Promise { // 获取token(避免JSON解析错误) let token = ''; try { // 尝试从localStorage获取(Web环境) if (typeof localStorage !== 'undefined') { token = localStorage.getItem('token') || ''; // 如果token是JSON字符串,解析它 if (token.startsWith('"') && token.endsWith('"')) { token = JSON.parse(token); } } else { // uni-app环境,直接获取字符串 token = uni.getStorageSync('token') || ''; } } catch (e) { console.error('获取token失败:', e); } const response = await uni.request({ url: 'https://yifan.action-ai.cn/api/v1/yifan/yifan_affinity/calculate', method: 'POST', header: { 'Content-Type': 'application/json', 'Authorization': token ? `Bearer ${token}` : '', }, data: params, }); if (response.status_code !== 200) { throw new Error(response.data?.msg || '网络请求失败'); } // 处理认证失败,跳转到登录页(必须在检查code之前) if (response.data?.msg === '认证失败,请登录后再试') { uni.showToast({ title: '请先登录', icon: 'none', duration: 2000, }); setTimeout(() => { uni.reLaunch({ url: '/pages/login/login', }); }, 2000); throw new Error(response.data.msg); } if (response.data.code !== 200) { throw new Error(response.data.msg || '测算失败'); } return response.data.data; } /** * 查询合盘列表 */ export async function getAffinityList(params: AffinityListRequest = {}): Promise { // 获取token(避免JSON解析错误) let token = ''; if (typeof localStorage !== 'undefined') { token = localStorage.getItem('token') || ''; // 如果token是JSON字符串,解析它 if (token.startsWith('"') && token.endsWith('"')) { token = token.slice(1, -1); } } else { // uni-app环境,直接获取字符串 token = uni.getStorageSync('token') || ''; } const { page_no = 1, page_size = 10 } = params; const response = await uni.request({ url: `https://yifan.action-ai.cn/api/v1/yifan/yifan_affinity/list?page_no=${page_no}&page_size=${page_size}`, method: 'GET', header: { 'Content-Type': 'application/json', 'Authorization': token ? `Bearer ${token}` : '', }, }); if (response.data?.msg === '认证失败,请登录后再试') { uni.showToast({ title: '请先登录', icon: 'none', duration: 2000 }); setTimeout(() => { uni.reLaunch({ url: '/pages/login/login' }); }, 2000); return null; } if (response.data.code == 0) { return response.data; } return null; } /** * 根据id获取缘分合盘详情 */ export async function getAffinityDetail(id: number) { let token = ''; if (typeof localStorage !== 'undefined') { token = localStorage.getItem('token') || ''; if (token.startsWith('"') && token.endsWith('"')) { token = token.slice(1, -1); } } else { token = uni.getStorageSync('token') || ''; } const response = await uni.request({ url: `https://yifan.action-ai.cn/api/v1/yifan/yifan_affinity/${id}`, method: 'GET', header: { 'Content-Type': 'application/json', 'Authorization': token ? `Bearer ${token}` : '', }, }); if (response.data?.msg === '认证失败,请登录后再试') { uni.showToast({ title: '请先登录', icon: 'none', duration: 2000 }); setTimeout(() => { uni.reLaunch({ url: '/pages/login/login' }); }, 2000); return null; } if (response.data.code == 0) { return response.data.data; } return null; } export const affinityApi = { calculateAffinity, getAffinityList, getAffinityDetail, };