hookehuyr

feat(api): 添加request函数统一处理API响应并更新文档

在fn.js中添加request函数封装API请求,统一处理响应格式和错误提示
更新recall_users.js中所有API调用使用新的request函数
更新VUE_CODE_STYLE_GUIDE.md文档说明API返回结构调整
...@@ -184,7 +184,7 @@ Vue 官方建议在 SFC + Composition API 场景使用 `<script setup>`,因为 ...@@ -184,7 +184,7 @@ Vue 官方建议在 SFC + Composition API 场景使用 `<script setup>`,因为
184 184
185 ## 6. 结合本项目:可直接落地的优化清单(按收益排序) 185 ## 6. 结合本项目:可直接落地的优化清单(按收益排序)
186 186
187 -1) 统一 API 返回结构:去掉 `false` 返回,调用侧统一 `res.code === 1` 187 +1) 统一 API 返回结构:去掉 `false` 返回,调用侧统一 `res.code === 1` (已做调整,在recall_users.js里面使用了request函数做了封装)
188 188
189 - 目标:减少大量 `if (res && res.code)` 的防御判断,把错误信息(msg)保留下来 189 - 目标:减少大量 `if (res && res.code)` 的防御判断,把错误信息(msg)保留下来
190 - 涉及文件:[fn.js](file:///Users/huyirui/program/itomix/git/mlaj/src/api/fn.js) 190 - 涉及文件:[fn.js](file:///Users/huyirui/program/itomix/git/mlaj/src/api/fn.js)
......
1 /* 1 /*
2 * @Date: 2022-05-18 22:56:08 2 * @Date: 2022-05-18 22:56:08
3 * @LastEditors: hookehuyr hookehuyr@gmail.com 3 * @LastEditors: hookehuyr hookehuyr@gmail.com
4 - * @LastEditTime: 2025-03-25 14:59:50 4 + * @LastEditTime: 2025-12-27 23:06:36
5 * @FilePath: /mlaj/src/api/fn.js 5 * @FilePath: /mlaj/src/api/fn.js
6 * @Description: 文件描述 6 * @Description: 文件描述
7 */ 7 */
8 import axios from '@/utils/axios'; 8 import axios from '@/utils/axios';
9 -import qs from 'Qs' 9 +import qs from 'qs'
10 import { showFailToast } from 'vant'; 10 import { showFailToast } from 'vant';
11 import 'vant/es/toast/style' 11 import 'vant/es/toast/style'
12 12
...@@ -40,6 +40,57 @@ export const fn = (api) => { ...@@ -40,6 +40,57 @@ export const fn = (api) => {
40 } 40 }
41 41
42 /** 42 /**
43 + * 网络请求功能函数(带错误处理)
44 + * @param {*} api 请求axios接口
45 + * @param {*} options 选项对象,包含 toast、silent_codes、default_msg、network_msg 字段
46 + * @returns 请求成功后,获取数据
47 + */
48 +export const request = async (api, options = {}) => {
49 + const {
50 + toast = true,
51 + silent_codes = [401],
52 + default_msg = '请求失败',
53 + network_msg = '网络异常',
54 + } = options || {}
55 +
56 + try {
57 + const res = await api
58 + const payload = res && res.data ? res.data : {}
59 + const code = payload && typeof payload.code === 'number' ? payload.code : 0
60 +
61 + if (code === 1) {
62 + return payload || { code: 1, data: null, msg: '' }
63 + }
64 +
65 + const msg = payload && payload.msg ? payload.msg : default_msg
66 + const should_toast = toast && !silent_codes.includes(code)
67 + if (should_toast) {
68 + showFailToast(msg)
69 + }
70 +
71 + return {
72 + code: 0,
73 + data: payload && Object.prototype.hasOwnProperty.call(payload, 'data') ? payload.data : null,
74 + msg,
75 + raw_code: code,
76 + raw: payload
77 + }
78 + } catch (err) {
79 + if (toast) {
80 + showFailToast(network_msg)
81 + }
82 + return {
83 + code: 0,
84 + data: null,
85 + msg: network_msg,
86 + raw_code: 0,
87 + raw: null,
88 + error: err
89 + }
90 + }
91 +}
92 +
93 +/**
43 * 七牛返回格式 94 * 七牛返回格式
44 * @param {*} api 95 * @param {*} api
45 * @returns 96 * @returns
......
1 /* 1 /*
2 * @Date: 2025-12-19 10:43:09 2 * @Date: 2025-12-19 10:43:09
3 * @LastEditors: hookehuyr hookehuyr@gmail.com 3 * @LastEditors: hookehuyr hookehuyr@gmail.com
4 - * @LastEditTime: 2025-12-26 16:00:49 4 + * @LastEditTime: 2025-12-27 23:10:17
5 * @FilePath: /mlaj/src/api/recall_users.js 5 * @FilePath: /mlaj/src/api/recall_users.js
6 * @Description: 引入外部接口, 召回旧用户相关接口 6 * @Description: 引入外部接口, 召回旧用户相关接口
7 */ 7 */
8 -import { fn, fetch } from './fn'; 8 +import { fetch, request } from './fn';
9 9
10 const Api = { 10 const Api = {
11 USER_LOGIN: '/srv/?a=desk_calendar&t=login', 11 USER_LOGIN: '/srv/?a=desk_calendar&t=login',
...@@ -25,13 +25,13 @@ const Api = { ...@@ -25,13 +25,13 @@ const Api = {
25 * @param: entry 进入H5的入口。qrcode=扫二维码进入, poster=通过海报进入 25 * @param: entry 进入H5的入口。qrcode=扫二维码进入, poster=通过海报进入
26 * @param: referrer_user_id 海报创建人ID 26 * @param: referrer_user_id 海报创建人ID
27 */ 27 */
28 -export const loginAPI = (params) => fn(fetch.post(Api.USER_LOGIN, params)); 28 +export const loginAPI = (params) => request(fetch.post(Api.USER_LOGIN, params));
29 29
30 /** 30 /**
31 * @description: 获取用户信息 31 * @description: 获取用户信息
32 * @return: data.user: { id 用户ID, name 姓名, mobile 手机号, has_idcard 是否填写了身份证, has_activity_registration 是否收集了星球壁币 } 32 * @return: data.user: { id 用户ID, name 姓名, mobile 手机号, has_idcard 是否填写了身份证, has_activity_registration 是否收集了星球壁币 }
33 */ 33 */
34 -export const userInfoAPI = () => fn(fetch.get(Api.USER_INFO)); 34 +export const userInfoAPI = () => request(fetch.get(Api.USER_INFO));
35 35
36 /** 36 /**
37 * @description: 搜索历史活动 37 * @description: 搜索历史活动
...@@ -44,7 +44,7 @@ export const userInfoAPI = () => fn(fetch.get(Api.USER_INFO)); ...@@ -44,7 +44,7 @@ export const userInfoAPI = () => fn(fetch.get(Api.USER_INFO));
44 * fee_desc 收费描述, create_time 创建时间 }] 44 * fee_desc 收费描述, create_time 创建时间 }]
45 * } 45 * }
46 */ 46 */
47 -export const searchOldActivityAPI = (params) => fn(fetch.get(Api.USER_SEARCH_OLD_ACTIVITY, params)); 47 +export const searchOldActivityAPI = (params) => request(fetch.get(Api.USER_SEARCH_OLD_ACTIVITY, params));
48 48
49 /** 49 /**
50 * @description: 查询海报配置 50 * @description: 查询海报配置
...@@ -52,26 +52,26 @@ export const searchOldActivityAPI = (params) => fn(fetch.get(Api.USER_SEARCH_OLD ...@@ -52,26 +52,26 @@ export const searchOldActivityAPI = (params) => fn(fetch.get(Api.USER_SEARCH_OLD
52 * @param: campaign_id 活动ID 52 * @param: campaign_id 活动ID
53 * @return: data: { background_image 海报背景图URL, qrcode 二维码 } 53 * @return: data: { background_image 海报背景图URL, qrcode 二维码 }
54 */ 54 */
55 -export const getPosterAPI = (params) => fn(fetch.get(Api.USER_GET_POSTER, params)); 55 +export const getPosterAPI = (params) => request(fetch.get(Api.USER_GET_POSTER, params));
56 56
57 /** 57 /**
58 * @description: 编辑海报配置 58 * @description: 编辑海报配置
59 * @param: campaign_id 活动ID 59 * @param: campaign_id 活动ID
60 * @param: background_image 海报背景图URL 60 * @param: background_image 海报背景图URL
61 */ 61 */
62 -export const editPosterAPI = (params) => fn(fetch.post(Api.USER_EDIT_POSTER, params)); 62 +export const editPosterAPI = (params) => request(fetch.post(Api.USER_EDIT_POSTER, params));
63 63
64 /** 64 /**
65 * @description: 查询补充信息 65 * @description: 查询补充信息
66 * @return: data: { note 补充说明 } 66 * @return: data: { note 补充说明 }
67 */ 67 */
68 -export const getSupplementAPI = (params) => fn(fetch.get(Api.USER_GET_SUPPLEMENT, params)); 68 +export const getSupplementAPI = (params) => request(fetch.get(Api.USER_GET_SUPPLEMENT, params));
69 69
70 /** 70 /**
71 * @description: 编辑补充信息 71 * @description: 编辑补充信息
72 * @param: note 补充说明 72 * @param: note 补充说明
73 */ 73 */
74 -export const editSupplementAPI = (params) => fn(fetch.post(Api.USER_EDIT_SUPPLEMENT, params)); 74 +export const editSupplementAPI = (params) => request(fetch.post(Api.USER_EDIT_SUPPLEMENT, params));
75 75
76 /** 76 /**
77 * @description: 埋点 77 * @description: 埋点
...@@ -79,4 +79,4 @@ export const editSupplementAPI = (params) => fn(fetch.post(Api.USER_EDIT_SUPPLEM ...@@ -79,4 +79,4 @@ export const editSupplementAPI = (params) => fn(fetch.post(Api.USER_EDIT_SUPPLEM
79 * @param: campaign_id 活动ID(转发海报时填写) 79 * @param: campaign_id 活动ID(转发海报时填写)
80 * @param: stu_uid 学员ID(转发海报时填写) 80 * @param: stu_uid 学员ID(转发海报时填写)
81 */ 81 */
82 -export const trackingAPI = (params) => fn(fetch.post(Api.USER_TRACKING, params)); 82 +export const trackingAPI = (params) => request(fetch.post(Api.USER_TRACKING, params));
......