refactor(after-sales): 删除独立售后页面并整合至订单列表

- 删除 afterSales.vue 独立页面,将售后入口统一至 myOrder 页面
- 修改售后相关页面跳转路径为 /pages/order/myOrder?status=5
- 重构 applySuccess 页面,增加微信订阅消息授权与视觉优化
- 重构预存款明细页面,增加收支筛选与日志解析功能
- 新增 store 端 API 基础地址配置
This commit is contained in:
pikachu1995@126.com
2026-11-02 16:57:29 +08:00
parent 1411f15679
commit e1a48d6d11
34 changed files with 7082 additions and 1361 deletions

View File

@@ -0,0 +1,155 @@
import api from "@/config/api.js";
import Request from "@/lib/request/index.js";
import Foundation from "@/utils/Foundation.js";
import { md5 } from "@/utils/md5.js";
import storage from "@/utils/storage.js";
import uuid from "@/utils/uuid.modified.js";
let isStoreNavigateTo = false;
function cleanStoreAuth() {
uni.showToast({
title: "商家登录状态已过期,请重新登录",
icon: "none",
duration: 1800,
});
storage.clearStoreAuth();
if (!isStoreNavigateTo) {
isStoreNavigateTo = true;
setTimeout(() => {
isStoreNavigateTo = false;
uni.reLaunch({
url: "/pages-sub/merchant/pages/login/index",
});
}, 1200);
}
}
const storeHttp = new Request();
const ensureUuid = () => {
if (!storage.getUuid()) {
storage.setUuid(uuid.v1());
}
};
storeHttp.setConfig((config) => {
ensureUuid();
config.baseURL = api.store;
config.header = {
...config.header,
};
config.validateStatus = () => true;
return config;
});
storeHttp.interceptors.request.use(
(config) => {
ensureUuid();
const token = storage.getStoreAccessToken();
if (token) {
const nonce = Foundation.randomString(6);
const timestamp = parseInt(new Date().getTime() / 1000);
const sign = md5(nonce + timestamp + token);
const _params = { nonce, timestamp, sign };
config.params = { ...(config.params || {}), ..._params };
config.header.accessToken = token;
}
config.header = {
...config.header,
uuid: storage.getUuid(),
};
return config;
},
(config) => Promise.reject(config)
);
let isStoreRefreshing = false;
let storeRequests = [];
function refreshTokenApi(refreshToken) {
return uni.request({
url: `${api.store}/passport/login/refresh/${refreshToken}`,
method: "GET",
header: {
uuid: storage.getUuid(),
},
});
}
storeHttp.interceptors.response.use(
async (response) => {
isStoreNavigateTo = false;
try {
uni.hideLoading();
} catch (e) {}
const token = storage.getStoreAccessToken();
const refreshToken = storage.getStoreRefreshToken();
// 403 / 401 并且有 refreshToken,尝试刷新
if (
token &&
refreshToken &&
(response.statusCode === 403 || response.statusCode === 401 || response.data?.code === 403)
) {
if (!isStoreRefreshing) {
isStoreRefreshing = true;
storage.removeStoreAccessToken();
try {
const [err, res] = await refreshTokenApi(refreshToken);
const data = res?.data || err?.data;
if (data && data.success && data.result) {
const { accessToken: newAccessToken, refreshToken: newRefreshToken } = data.result;
storage.setStoreAccessToken(newAccessToken);
if (newRefreshToken) {
storage.setStoreRefreshToken(newRefreshToken);
}
response.header = response.header || {};
response.header.accessToken = `${newAccessToken}`;
storeRequests.forEach((cb) => cb(newAccessToken));
storeRequests = [];
return storeHttp.request(response.config);
} else {
cleanStoreAuth();
return Promise.reject(data);
}
} catch (e) {
cleanStoreAuth();
return Promise.reject(e);
} finally {
isStoreRefreshing = false;
}
} else {
return new Promise((resolve) => {
storeRequests.push((newToken) => {
response.header = response.header || {};
response.header.accessToken = `${newToken}`;
resolve(storeHttp.request(response.config));
});
});
}
} else if (
(!token && (response.statusCode === 403 || response.statusCode === 401)) ||
response.data?.code === 403 ||
response.data?.code === 401
) {
cleanStoreAuth();
} else if ((response.statusCode === 200 && response.data && !response.data.success) || response.statusCode === 400) {
if (response.data?.message) {
uni.showToast({
title: response.data.message,
icon: "none",
duration: 2000,
});
}
}
return response;
},
(error) => error
);
export { storeHttp };
export default storeHttp;