Files

168 lines
7.0 KiB
TypeScript
Raw Permalink 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 http, { BASE_URL, type RequestConfig } from '@/utils/request';
import type { WxLoginParams, WxLoginResponse, WxRegisterParams, WxRegisterResponse, WxBindParams, WxBindResponse, MobileRegisterParams, MobileRegisterResponse, MobileLoginParams, MobileLoginResponse, ForgotPasswordParams, ForgotPasswordResponse, WxLogoutResponse, PartnerApplyParams, PartnerApplyResponse, MembershipDiscountConfigResponse, MembershipServicePriceConfigResponse, MyMembershipQuotaResponse, MyReportsParams, MyReportsResponse, SolutionFullDetail, MyFavoritesParams, MyFavoritesResponse, ToggleFavoriteParams, ToggleFavoriteResponse, FavoriteSolutionParams, FavoriteSolutionResponse, UnfavoriteSolutionParams, UnfavoriteSolutionResponse, FAQResponse, PrivacyPolicyResponse, FeedbackParams, FeedbackResponse, GenerateQRCodeResponse, UploadImageResponse, UpdateCurrentUserUsernameMobileParams, UpdateCurrentUserUsernameMobileResponse } from './types';
/** 与 yifan 同域下的 system 模块接口根路径 */
const systemApiBaseUrl = () => String(BASE_URL || '').replace(/\/yifan\/?$/, '/system');
export const userApi = {
// 发送手机短信验证码
sendSmsCode: (mobile: string) =>
http.post<{ code: number; msg: string; data: any }>('/yifan_wx_auth/send-sms', { mobile }, { showLoading: true }),
// 手机号密码注册
mobileRegister: (params: MobileRegisterParams) =>
http.post<MobileRegisterResponse>('/yifan_wx_auth/mobile-register', params, { showLoading: true }),
// 手机号密码登录
mobileLogin: (params: MobileLoginParams) =>
http.post<MobileLoginResponse>('/yifan_wx_auth/mobile-login', params, { showLoading: true }),
// 忘记密码
forgotPassword: (params: ForgotPasswordParams) =>
http.post<ForgotPasswordResponse>('/yifan_wx_auth/forgot-password', params, { showLoading: true }),
// 小程序登录
wxLogin: (params: WxLoginParams) =>
http.post<WxLoginResponse>('/yifan_wx_auth/login', params, { showLoading: true, timeout: 9999999 }),
// 小程序注册超时时间设置为30秒
wxRegister: (params: WxRegisterParams) =>
http.post<WxRegisterResponse>('/yifan_wx_auth/register', params, { showLoading: true, timeout: 30000 }),
// 小程序绑定
wxBind: (params: WxBindParams) =>
http.post<WxBindResponse>('/yifan_wx_auth/bind', params, { showLoading: true }),
// 退出登录
wxLogout: () =>
http.post<WxLogoutResponse>('/yifan_wx_auth/logout', {}, { showLoading: true }),
// 申请成为合伙人
applyPartner: (params: PartnerApplyParams) =>
http.post<PartnerApplyResponse>('/yifan_partner_apply/apply', params, { showLoading: true }),
// 我的会员等级与额度
getMyMembershipQuota: (options?: Partial<RequestConfig>) =>
http.get<MyMembershipQuotaResponse>('/yifan_membership/my-quota', undefined, options),
// 获取会员折扣配置(初级会员/高级会员)
getMembershipDiscountConfig: (options?: Partial<RequestConfig>) =>
http.get<MembershipDiscountConfigResponse>('/yifan_membership/discount-config', undefined, options),
// 获取服务价格配置(起名/改名/每日运程/每月运程)
getMembershipServicePriceConfig: (options?: Partial<RequestConfig>) =>
http.get<MembershipServicePriceConfigResponse>('/yifan_membership/service-price-config', undefined, options),
// 修改当前用户用户名与手机号(成功后仅前端合并缓存,不因本接口误清 token/userInfo
updateCurrentUserUsernameMobile: (params: UpdateCurrentUserUsernameMobileParams) =>
http.put<UpdateCurrentUserUsernameMobileResponse>(
`${systemApiBaseUrl()}/user/current/username-mobile`,
params,
{ showLoading: true, clearAuthOnError: false }
),
// 我的方案
getMyReports: (params?: MyReportsParams, options?: Partial<RequestConfig>) =>
http.get<MyReportsResponse>('/yifan_naming_reports/my_reports', params, options),
// 根据方案id获取详情
getSolutionDetail: (id: number) =>
http.get<SolutionFullDetail>(`/yifan_naming_solutions/full_detail/${id}`),
// 我的收藏
getMyFavorites: (params?: MyFavoritesParams, options?: Partial<RequestConfig>) =>
http.get<MyFavoritesResponse>('/yifan_naming_favorites/my_favorites', params, options),
// 添加/取消收藏
toggleFavorite: (params: ToggleFavoriteParams) =>
http.post<ToggleFavoriteResponse>('/yifan_naming_favorites/toggle', params, { showLoading: true }),
// 收藏方案
favoriteSolution: (params: FavoriteSolutionParams) =>
http.post<FavoriteSolutionResponse>('/yifan_naming_favorites/favorite', params, { showLoading: true }),
// 取消收藏
unfavoriteSolution: (params: UnfavoriteSolutionParams) =>
http.post<UnfavoriteSolutionResponse>('/yifan_naming_favorites/unfavorite', params, { showLoading: true }),
// 获取常见问题
getFAQ: () =>
http.get<FAQResponse>('/yifan_faq/mini/grouped'),
// 获取隐私政策
getPrivacyPolicy: () =>
http.get<PrivacyPolicyResponse>('/yifan_privacy_policy/mini/current'),
// 提交意见反馈
submitFeedback: (params: FeedbackParams) =>
http.post<FeedbackResponse>('/yifan_feedback/mini/submit', params, { showLoading: true }),
// 生成分享二维码(小程序码)
generateShareQRCode: () =>
http.post<GenerateQRCodeResponse>('/yifan_wx_auth/generate-qrcode', {}, { showLoading: true }),
// 上传图片 (H5 版本)
uploadImage: async (file: File): Promise<UploadImageResponse> => {
const formData = new FormData();
formData.append('file', file);
formData.append('base_url', BASE_URL);
try {
const response = await http.post<UploadImageResponse>(
'/yifan_wx_auth/upload-image',
formData,
{
headers: {
'Content-Type': 'multipart/form-data'
},
showLoading: true
}
);
return response;
} catch (error: any) {
throw new Error(error.msg || '上传失败');
}
},
// 选择并上传图片H5 版本)
chooseAndUploadImage: (options?: { count?: number; accept?: string }): Promise<UploadImageResponse[]> => {
return new Promise((resolve, reject) => {
const input = document.createElement('input');
input.type = 'file';
input.accept = options?.accept || 'image/*';
input.multiple = (options?.count || 1) > 1;
input.onchange = async (e: Event) => {
const target = e.target as HTMLInputElement;
const files = target.files;
if (!files || files.length === 0) {
reject(new Error('未选择文件'));
return;
}
try {
const results: UploadImageResponse[] = [];
const maxCount = options?.count || 1;
const filesToUpload = Array.from(files).slice(0, maxCount);
for (const file of filesToUpload) {
const result = await userApi.uploadImage(file);
results.push(result);
}
resolve(results);
} catch (e) {
reject(e);
}
};
input.click();
});
},
};
export default userApi;