|
|
@@ -1,5 +1,11 @@
|
|
|
import i18n, { defaultLang } from "@/lang/index.js";
|
|
|
|
|
|
+// 加解密
|
|
|
+import {
|
|
|
+ encryptApiPayload,
|
|
|
+ decryptApiPayload
|
|
|
+} from "@/utils/apiCrypto.js";
|
|
|
+
|
|
|
// export const apiUrl = 'http://bot28api.sp2509.cc/api/'; // botapi的地址
|
|
|
|
|
|
export var globalBaseURL = 'https://api.f1bet888.com/api'
|
|
|
@@ -14,6 +20,14 @@ export var apiUrl = 'https://bot-api.f1bet888.com/api/'; // botapi的地址
|
|
|
// export var apiUrl = 'https://bot28api.sp2509.cc/api/'; // botapi的地址
|
|
|
// #endif
|
|
|
|
|
|
+// 不需要加密的接口
|
|
|
+const encryptExcludeList = [
|
|
|
+ '/upload/',
|
|
|
+ '/egame/play'
|
|
|
+];
|
|
|
+function needEncrypt(url) {
|
|
|
+ return !encryptExcludeList.some(item => url.includes(item));
|
|
|
+}
|
|
|
// 1. 封装 uni.request 请求
|
|
|
const service = (config) => {
|
|
|
|
|
|
@@ -57,131 +71,187 @@ const service = (config) => {
|
|
|
}
|
|
|
|
|
|
// 4. 发起 uni.request 请求
|
|
|
- uni.request({
|
|
|
- // #ifdef H5
|
|
|
- url: window.global?.baseURL + url, // 拼接基础地址和接口路径
|
|
|
- // #endif
|
|
|
-
|
|
|
- // #ifdef APP
|
|
|
- url: globalBaseURL + url, // 拼接基础地址和接口路径
|
|
|
- // url: 'https://sportapi.sp2509.cc/api' + url, // 拼接基础地址和接口路径
|
|
|
- // #endif
|
|
|
-
|
|
|
- // url: 'https://sportapi.sp2509.cc/api' + url, // 拼接基础地址和接口路径
|
|
|
- // url: 'http://192.168.110.106:8084/api' + url, // 拼接基础地址和接口路径
|
|
|
- method: method.toUpperCase(), // 确保请求方法为大写
|
|
|
- data: data, // POST/PUT 等请求的参数
|
|
|
- header: header,
|
|
|
- timeout: timeout,
|
|
|
- // 5. 请求成功回调
|
|
|
- success: (response) => {
|
|
|
- const res = response.data;
|
|
|
-
|
|
|
- // 关闭 loading
|
|
|
- if (loadingShowed) {
|
|
|
- uni.hideLoading();
|
|
|
- }
|
|
|
+ const sendRequest = (requestData) => {
|
|
|
+ uni.request({
|
|
|
+ // #ifdef H5
|
|
|
+ url: window.global?.baseURL + url, // 拼接基础地址和接口路径
|
|
|
+ // #endif
|
|
|
+
|
|
|
+ // #ifdef APP
|
|
|
+ url: globalBaseURL + url, // 拼接基础地址和接口路径
|
|
|
+ // url: 'https://sportapi.sp2509.cc/api' + url, // 拼接基础地址和接口路径
|
|
|
+ // #endif
|
|
|
+
|
|
|
+ // url: 'https://sportapi.sp2509.cc/api' + url, // 拼接基础地址和接口路径
|
|
|
+ // url: 'http://192.168.110.106:8084/api' + url, // 拼接基础地址和接口路径
|
|
|
+ method: method.toUpperCase(), // 确保请求方法为大写
|
|
|
+ data: requestData, // POST/PUT 等请求的参数
|
|
|
+ header: header,
|
|
|
+ timeout: timeout,
|
|
|
+ // 5. 请求成功回调
|
|
|
+ success: (response) => {
|
|
|
+ const handleResponse = (res) => {
|
|
|
+ // 关闭 loading
|
|
|
+ if (loadingShowed) {
|
|
|
+ uni.hideLoading();
|
|
|
+ }
|
|
|
+
|
|
|
+ // 按 code 处理响应
|
|
|
+ if (res.code === 1) {
|
|
|
+ // 成功:按需显示成功提示
|
|
|
+ if (showSuccessTip && res.msg) {
|
|
|
+ uni.showToast({
|
|
|
+ title: res.msg,
|
|
|
+ icon: 'success',
|
|
|
+ duration: 2000,
|
|
|
+ position: 'middle'
|
|
|
+ });
|
|
|
+ }
|
|
|
+ resolve(res); // 返回成功数据
|
|
|
+ } else if (res.code === 0) {
|
|
|
+ // 失败:按需显示失败提示
|
|
|
+ if (showFailTip && res.msg) {
|
|
|
+ uni.showToast({
|
|
|
+ title: res.msg,
|
|
|
+ icon: 'none',
|
|
|
+ duration: 2000,
|
|
|
+ position: 'middle'
|
|
|
+ });
|
|
|
+ }
|
|
|
+ reject(new Error(res.msg || i18n.global.t('操作失败')));
|
|
|
+ } else if (res.code === 401) {
|
|
|
+ // 登录过期:强制显示提示
|
|
|
+ uni.showToast({
|
|
|
+ title: res.msg || i18n.global.t('登录已过期,请重新登录'),
|
|
|
+ icon: 'none',
|
|
|
+ duration: 2000,
|
|
|
+ mask: true
|
|
|
+ });
|
|
|
+ // 清除 token + 跳登录页
|
|
|
+ uni.removeStorageSync('token');
|
|
|
+ uni.removeStorageSync('youke_token');
|
|
|
+ let timer = setTimeout(() => {
|
|
|
+ clearTimeout(timer);
|
|
|
+ uni.navigateTo({
|
|
|
+ url: '/pages/login/index' // 注意路径要符合uni-app规范
|
|
|
+ });
|
|
|
+ }, 1500);
|
|
|
+ reject(new Error('登录已过期'));
|
|
|
+ } else if (res.code === 10011) {
|
|
|
+ // 资金密码未设置
|
|
|
+ // 加一个微小延迟防止被之前的loading遮挡
|
|
|
+ let modalTimer = setTimeout(() => {
|
|
|
+ clearTimeout(modalTimer);
|
|
|
+ uni.showModal({
|
|
|
+ title: i18n.global.t('提示'),
|
|
|
+ content: i18n.global.t('您还未设置资金密码,是否前往设置?'),
|
|
|
+ success: (modalRes) => {
|
|
|
+ if (modalRes.confirm) {
|
|
|
+ uni.navigateTo({
|
|
|
+ url: '/pages/WorkModule/my/changeFundPassword/index'
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }, 300);
|
|
|
+ reject(new Error(res.msg || '未设置资金密码'));
|
|
|
+ } else if (res.code === 10012) {
|
|
|
+ // 触发全局事件,唤起自定义的高级通知弹窗
|
|
|
+ // 如果后端接口返回了通知的文本内容,可以通过 res.data 传过去
|
|
|
+ uni.$emit('show-system-notice-modal', res.data || res.msg);
|
|
|
+ reject(new Error(res.msg || '系统重要通知'));
|
|
|
+ } else {
|
|
|
+ // 其他 code:按需显示失败提示
|
|
|
+ if (showFailTip) {
|
|
|
+ uni.showToast({
|
|
|
+ title: res.msg || i18n.global.t('请求失败,请稍后重试'),
|
|
|
+ icon: 'none',
|
|
|
+ duration: 2000
|
|
|
+ });
|
|
|
+ }
|
|
|
+ reject(new Error(res.msg || '请求失败'));
|
|
|
+ }
|
|
|
+ };
|
|
|
+ if (
|
|
|
+ response.data &&
|
|
|
+ response.data.encrypted === true &&
|
|
|
+ response.data.payload
|
|
|
+ ) {
|
|
|
+
|
|
|
+ decryptApiPayload(
|
|
|
+ response.data.payload,
|
|
|
+ "response"
|
|
|
+ )
|
|
|
+ .then(result => {
|
|
|
+
|
|
|
+ handleResponse(result);
|
|
|
+
|
|
|
+ })
|
|
|
+ .catch(err => {
|
|
|
+
|
|
|
+ reject(err);
|
|
|
+
|
|
|
+ });
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ handleResponse(response.data);
|
|
|
|
|
|
- // 按 code 处理响应
|
|
|
- if (res.code === 1) {
|
|
|
- // 成功:按需显示成功提示
|
|
|
- if (showSuccessTip && res.msg) {
|
|
|
- uni.showToast({
|
|
|
- title: res.msg,
|
|
|
- icon: 'success',
|
|
|
- duration: 2000,
|
|
|
- position: 'middle'
|
|
|
- });
|
|
|
}
|
|
|
- resolve(res); // 返回成功数据
|
|
|
- } else if (res.code === 0) {
|
|
|
- // 失败:按需显示失败提示
|
|
|
- if (showFailTip && res.msg) {
|
|
|
- uni.showToast({
|
|
|
- title: res.msg,
|
|
|
- icon: 'none',
|
|
|
- duration: 2000,
|
|
|
- position: 'middle'
|
|
|
- });
|
|
|
+ },
|
|
|
+ // 6. 请求失败回调(网络错误、超时等)
|
|
|
+ fail: (error) => {
|
|
|
+ console.log(error, 119);
|
|
|
+ // 关闭 loading
|
|
|
+ if (loadingShowed) {
|
|
|
+ uni.hideLoading();
|
|
|
}
|
|
|
- reject(new Error(res.msg || i18n.global.t('操作失败')));
|
|
|
- } else if (res.code === 401) {
|
|
|
- // 登录过期:强制显示提示
|
|
|
+ // 显示网络错误提示
|
|
|
uni.showToast({
|
|
|
- title: res.msg || i18n.global.t('登录已过期,请重新登录'),
|
|
|
+ // title: error.errMsg || i18n.global.t('网络异常,请检查网络后重试'),
|
|
|
+ title: i18n.global.t('网络异常,请检查网络后重试'),
|
|
|
icon: 'none',
|
|
|
- duration: 2000,
|
|
|
- mask: true
|
|
|
+ duration: 2000
|
|
|
});
|
|
|
- // 清除 token + 跳登录页
|
|
|
- uni.removeStorageSync('token');
|
|
|
- uni.removeStorageSync('youke_token');
|
|
|
- let timer = setTimeout(() => {
|
|
|
- clearTimeout(timer);
|
|
|
- uni.navigateTo({
|
|
|
- url: '/pages/login/index' // 注意路径要符合uni-app规范
|
|
|
- });
|
|
|
- }, 1500);
|
|
|
- reject(new Error('登录已过期'));
|
|
|
- } else if (res.code === 10011) {
|
|
|
- // 资金密码未设置
|
|
|
- // 加一个微小延迟防止被之前的loading遮挡
|
|
|
- let modalTimer = setTimeout(() => {
|
|
|
- clearTimeout(modalTimer);
|
|
|
- uni.showModal({
|
|
|
- title: i18n.global.t('提示'),
|
|
|
- content: i18n.global.t('您还未设置资金密码,是否前往设置?'),
|
|
|
- success: (modalRes) => {
|
|
|
- if (modalRes.confirm) {
|
|
|
- uni.navigateTo({
|
|
|
- url: '/pages/WorkModule/my/changeFundPassword/index'
|
|
|
- });
|
|
|
- }
|
|
|
- }
|
|
|
- });
|
|
|
- }, 300);
|
|
|
- reject(new Error(res.msg || '未设置资金密码'));
|
|
|
- } else if (res.code === 10012) {
|
|
|
- // 触发全局事件,唤起自定义的高级通知弹窗
|
|
|
- // 如果后端接口返回了通知的文本内容,可以通过 res.data 传过去
|
|
|
- uni.$emit('show-system-notice-modal', res.data || res.msg);
|
|
|
- reject(new Error(res.msg || '系统重要通知'));
|
|
|
- } else {
|
|
|
- // 其他 code:按需显示失败提示
|
|
|
- if (showFailTip) {
|
|
|
- uni.showToast({
|
|
|
- title: res.msg || i18n.global.t('请求失败,请稍后重试'),
|
|
|
- icon: 'none',
|
|
|
- duration: 2000
|
|
|
- });
|
|
|
+ reject(error);
|
|
|
+ },
|
|
|
+ // 7. 请求完成(无论成功失败)
|
|
|
+ complete: () => {
|
|
|
+ // 兜底关闭loading,防止遗漏
|
|
|
+ if (loadingShowed) {
|
|
|
+ uni.hideLoading();
|
|
|
}
|
|
|
- reject(new Error(res.msg || '请求失败'));
|
|
|
- }
|
|
|
- },
|
|
|
- // 6. 请求失败回调(网络错误、超时等)
|
|
|
- fail: (error) => {
|
|
|
- console.log(error, 119);
|
|
|
- // 关闭 loading
|
|
|
- if (loadingShowed) {
|
|
|
- uni.hideLoading();
|
|
|
}
|
|
|
- // 显示网络错误提示
|
|
|
- uni.showToast({
|
|
|
- // title: error.errMsg || i18n.global.t('网络异常,请检查网络后重试'),
|
|
|
- title: i18n.global.t('网络异常,请检查网络后重试'),
|
|
|
- icon: 'none',
|
|
|
- duration: 2000
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ if (needEncrypt(url)) {
|
|
|
+
|
|
|
+ encryptApiPayload(data, "request")
|
|
|
+ .then(payload => {
|
|
|
+
|
|
|
+ header["X-Api-Encrypted"] = "1";
|
|
|
+
|
|
|
+ sendRequest({
|
|
|
+ payload
|
|
|
+ });
|
|
|
+
|
|
|
+ })
|
|
|
+ .catch(err => {
|
|
|
+
|
|
|
+ if (loadingShowed) {
|
|
|
+ uni.hideLoading();
|
|
|
+ }
|
|
|
+
|
|
|
+ reject(err);
|
|
|
+
|
|
|
});
|
|
|
- reject(error);
|
|
|
- },
|
|
|
- // 7. 请求完成(无论成功失败)
|
|
|
- complete: () => {
|
|
|
- // 兜底关闭loading,防止遗漏
|
|
|
- if (loadingShowed) {
|
|
|
- uni.hideLoading();
|
|
|
- }
|
|
|
- }
|
|
|
- });
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ sendRequest(data);
|
|
|
+
|
|
|
+ }
|
|
|
});
|
|
|
};
|
|
|
|