// api-service.uts // 缘友(wxchat)插件 前端 API 服务层 // 统一对接 addon/wxchat 后端接口。 // // 约定: // - 基础路径前缀:/wxchat (完整 URL 形如 /wxchat//) // - 真实网络客户端:@/utlis/http-api.uts 的 httpApi(已内置 token 注入与无感刷新) // - 后端统一响应结构:{ code, message, data, timestamp } // - 成功判定:code == 0(success())或 code == 200(部分自定义接口),其余视为业务失败 // // 使用前请确保 utlis/http-api.uts 中的 baseURL 指向正确的后端域名。 import httpApi, { type IResponse } from '@/utlis/http-api.uts' import { setUserToken, setUserInfo, clearToken } from '@/stores/user.uts' import { IUserInfo } from '@/types/user.uts' // ===================== 业务异常 ===================== class ApiError extends Error { public code : number constructor(message : string, code : number) { super(message) this.name = 'ApiError' this.code = code } } // ===================== 基础请求封装 ===================== // 统一处理成功/失败:成功返回 data(UTSJSONObject),失败抛出 ApiError function handleResponse(res : IResponse) : UTSJSONObject { const code = res.code ?? 1 if (code == 0 || code == 200) { return res.data as UTSJSONObject } throw new ApiError(res.message ?? '请求失败', code) } async function getJSON(url : string, data : any = {}, needToken : boolean = false) : Promise { const res = await httpApi.get(url, data, { url: '', needToken: needToken }) return handleResponse(res) } async function postJSON(url : string, data : any = {}, needToken : boolean = false) : Promise { const res = await httpApi.post(url, data, { url: '', needToken: needToken }) return handleResponse(res) } // 把任意对象安全序列化为目标类型(兼容 APP / 非APP 平台的 JSON 解析差异) function toObject(source : any) : T | null { if (source == null) return null // #ifndef APP const str = JSON.stringify(source) const obj = JSON.parse(str) as T return obj // #endif // #ifdef APP return source as T // #endif } // ===================== 1. 认证模块(登录/注册) ===================== const auth = { // 1.1 发送短信验证码(登录/注册场景,event: login|register) sendSmsCode(phone : string, event : string = 'login') : Promise { return postJSON('/wxchat/api/login/sendSmsCode', { phone: phone, event: event }, false) }, // 1.2 短信验证码登录 // 成功后后端返回用户信息(code=0),此处持久化用户信息 async smsLogin(mobile : string, captcha : string, event : string = 'login') : Promise { const data = await postJSON('/wxchat/api/login/smsLogin', { mobile: mobile, captcha: captcha, event: event }, false) // 后端在响应顶层附带 access/refresh token,拦截器已自动持久化;这里仅解析 user_info const info = toObject(data.get('user_info')) if (info != null) { setUserInfo(info) } return info }, // 1.3 本机号码一键登录:携带预凭证 pre_token 换取登录态(token 由拦截器自动持久化) async oneClickLogin(preToken : string) : Promise { const data = await postJSON('/wxchat/api/login/oneClickLogin', { pre_token: preToken }, false) const info = toObject(data.get('user_info')) if (info != null) { setUserInfo(info) } return data }, // 1.3.1 获取一键登录预凭证(模拟运营商 SDK 下发的本机号码凭证) getOneClickPreToken(phone : string) : Promise { return postJSON('/wxchat/api/login/getOneClickPreToken', { phone: phone }, false) }, // 1.4 完善用户信息(新用户首次登录后补全资料) completeUserInfo(profile : any) : Promise { return postJSON('/wxchat/api/login/completeUserInfo', profile, true) }, // 1.5 退出登录(清理本地 token / 用户信息) logout() : void { clearToken() } } // ===================== 2. 用户模块 ===================== const user = { profile() : Promise { return getJSON('/wxchat/api/user/profile', {}, true) }, // 查看他人公开资料(资料卡页) detail(uid : number) : Promise { return getJSON('/wxchat/api/user/detail', { uid: uid }, true) }, updateProfile(profile : any) : Promise { return postJSON('/wxchat/api/user/updateProfile', profile, true) }, nearby(params : any = {}) : Promise { return getJSON('/wxchat/api/user/nearby', params, true) }, local() : Promise { return getJSON('/wxchat/api/user/local', {}, true) }, online() : Promise { return postJSON('/wxchat/api/user/online', {}, true) }, heartbeat() : Promise { return postJSON('/wxchat/api/user/heartbeat', {}, true) }, privacy() : Promise { return getJSON('/wxchat/api/user/privacy', {}, true) }, updatePrivacy(privacy : any) : Promise { return postJSON('/wxchat/api/user/updatePrivacy', privacy, true) }, cancelAccount() : Promise { return postJSON('/wxchat/api/user/cancelAccount', {}, true) }, ranking(params : any = {}) : Promise { return getJSON('/wxchat/api/user/ranking', params, true) } // 用户概要(首页/我的 初始化使用;后端若未实现该 action 会走失败,调用方需自行兜底) summary() : Promise { return getJSON('/wxchat/api/user/summary', {}, true) }, // 我的钱包(余额/金币/汇总/明细) wallet() : Promise { return getJSON('/wxchat/api/user/wallet', {}, true) } } // ===================== 3. 关注模块 ===================== const follow = { // 切换关注状态(关注/取消)。 // 后端 Follow::toggleFollow 通过 uid(当前用户) + target_uid(目标) + action(1关注/0取消) 判定, // 注意它从请求参数读取 uid,而非登录态,调用方需传入当前用户 uid。 toggle(uid : number, targetUid : number, action : number = 1) : Promise { return postJSON('/wxchat/api/follow/toggleFollow', { uid: uid, target_uid: targetUid, action: action }, true) }, followingList(params : any = {}) : Promise { return getJSON('/wxchat/api/follow/getFollowingList', params, true) }, followerList(params : any = {}) : Promise { return getJSON('/wxchat/api/follow/getFollowerList', params, true) }, mutualList(params : any = {}) : Promise { return getJSON('/wxchat/api/follow/getMutualList', params, true) } } // ===================== 4. 好友模块 ===================== const friend = { list(params : any = {}) : Promise { return getJSON('/wxchat/api/friend', params, true) }, requests(params : any = {}) : Promise { return getJSON('/wxchat/api/friend/requests', params, true) }, create(data : any) : Promise { return postJSON('/wxchat/api/friend/create', data, true) }, detail(id : number) : Promise { return getJSON('/wxchat/api/friend/read', { id: id }, true) }, respond(id : number, action : number = 1) : Promise { return postJSON('/wxchat/api/friend/save', { id: id, action: action }, true) }, update(id : number, data : any) : Promise { return postJSON('/wxchat/api/friend/update', { id: id, ...data }, true) }, delete(id : number) : Promise { return postJSON('/wxchat/api/friend/delete', { id: id }, true) } } // ===================== 5. 动态/朋友圈模块 ===================== const moment = { // 动态广场列表:scope = recommend|follow|nearby|hot list(params : any = {}) : Promise { return getJSON('/wxchat/api/moment/index', params, true) }, detail(id : number) : Promise { return getJSON('/wxchat/api/moment/red', { id: id }, true) }, create(data : any) : Promise { return postJSON('/wxchat/api/moment/create', data, true) }, comment(data : any) : Promise { return postJSON('/wxchat/api/moment/comment', data, true) }, like(data : any) : Promise { return postJSON('/wxchat/api/moment/like', data, true) }, collect(data : any) : Promise { return postJSON('/wxchat/api/moment/collect', data, true) }, follow(data : any) : Promise { return postJSON('/wxchat/api/moment/follow', data, true) }, collectedList(params : any = {}) : Promise { return getJSON('/wxchat/api/moment/collectedList', params, true) }, historyList(params : any = {}) : Promise { return getJSON('/wxchat/api/moment/historyList', params, true) }, mine(params : any = {}) : Promise { return getJSON('/wxchat/api/moment/mine', params, true) } upload(data : any) : Promise { return postJSON('/wxchat/api/moment/upload', data, true) } } // ===================== 6. 消息模块 ===================== const message = { send(data : any) : Promise { return postJSON('/wxchat/api/message/send', data, true) }, history(params : any = {}) : Promise { return getJSON('/wxchat/api/message/history', params, true) }, // 会话列表(聚合最新一条消息 + 未读 + 对方资料/在线) conversations() : Promise { return getJSON('/wxchat/api/message/conversations', {}, true) }, unread() : Promise { return getJSON('/wxchat/api/message/unread', {}, true) }, recall(id : number) : Promise { return postJSON('/wxchat/api/message/recall', { id: id }, true) } } // ===================== 7. 礼物模块 ===================== const gift = { list(params : any = {}) : Promise { return getJSON('/wxchat/api/gift/index', params, true) }, send(data : any) : Promise { return postJSON('/wxchat/api/gift/send', data, true) }, received(params : any = {}) : Promise { return getJSON('/wxchat/api/gift/received', params, true) } } // ===================== 8. 抽奖模块 ===================== const lottery = { config() : Promise { return getJSON('/wxchat/api/lottery/config', {}, true) }, draw() : Promise { return postJSON('/wxchat/api/lottery/draw', {}, true) } } // ===================== 8.1 每日任务模块 ===================== const task = { // 任务列表(含真实进度与领取状态) list() : Promise { return getJSON('/wxchat/api/task/index', {}, true) }, // 领取任务奖励 receive(taskId : number) : Promise { return postJSON('/wxchat/api/task/receive', { task_id: taskId }, true) } } // ===================== 9. 推荐模块 ===================== const recommend = { index(params : any = {}) : Promise { return getJSON('/wxchat/api/recommend/index', params, true) } } // ===================== 10. 搜索模块 ===================== const search = { index(params : any = {}) : Promise { return getJSON('/wxchat/api/search/index', params, true) } } // ===================== 11. 未读消息模块 ===================== const unread = { count() : Promise { return getJSON('/wxchat/api/unread/count', {}, true) }, read(data : any) : Promise { return postJSON('/wxchat/api/unread/read', data, true) } } // ===================== 12. 应用基础配置模块 ===================== const app = { appConf() : Promise { return getJSON('/wxchat/api/index/appConf', {}, false) }, launchData() : Promise { return getJSON('/wxchat/api/index/launchData', {}, false) }, baseData() : Promise { return getJSON('/wxchat/api/index/baseData', {}, false) } } // ===================== 13. 意见反馈模块 ===================== const feedback = { // 提交反馈 save(data : any) : Promise { return postJSON('/wxchat/api/feedback/save', data, true) }, // 我的反馈列表 list() : Promise { return getJSON('/wxchat/api/feedback/index', {}, true) } } // ===================== 统一导出 ===================== const Api = { auth, user, follow, friend, moment, message, gift, lottery, task, recommend, search, unread, app, feedback } export default Api export { Api, ApiError } export type { IUserInfo }