"use strict"; const common_vendor = require("../common/vendor.js"); const ENV = "dev"; const CONFIG = { dev: "http://localhost:8081", // 开发环境 prod: "http://192.168.1.2:8081" // 生产环境 }; const BASE_URL = CONFIG[ENV]; const getImageUrl = (url) => { if (!url) return ""; if (url.startsWith("http") || url.startsWith("/static/")) { return url; } return BASE_URL + url; }; const getToken = () => { return common_vendor.index.getStorageSync("user_token") || null; }; const request = (options) => { return new Promise((resolve, reject) => { const token = getToken(); const header = options.header || {}; if (token) { header["Authorization"] = `Bearer ${token}`; } common_vendor.index.request({ url: `${BASE_URL}${options.url}`, method: options.method || "GET", data: options.data || {}, header, success: (res) => { const newToken = res.header["New-Token"] || res.header["new-token"]; if (newToken) { console.log("检测到新token,自动续期"); common_vendor.index.setStorageSync("user_token", newToken); } if (res.statusCode === 200) { resolve(res.data); } else if (res.statusCode === 401) { common_vendor.index.showToast({ title: "登录已过期,请重新登录", icon: "none", duration: 2e3 }); common_vendor.index.removeStorageSync("user_token"); common_vendor.index.removeStorageSync("user_info"); setTimeout(() => { common_vendor.index.showModal({ title: "登录提示", content: '登录已过期,请前往"模拟排名"或"强势池"页面重新登录', confirmText: "去登录", cancelText: "取消", success: (modalRes) => { if (modalRes.confirm) { common_vendor.index.switchTab({ url: "/pages/rank/rank" }); } } }); }, 2e3); reject(new Error("未授权")); } else { reject(new Error(res.data.message || "服务暂不可用")); } }, fail: (err) => { reject(new Error("网络异常")); } }); }); }; const wxSilentLoginApi = (params) => { return request({ url: "/v1/auth/wx/silent-login", method: "POST", header: { "content-type": "application/json" }, data: params }); }; const wxPhoneLoginApi = (params) => { return request({ url: "/v1/auth/wx/phone-verify", method: "POST", header: { "content-type": "application/json" }, data: params }); }; const wxCompleteUserInfoApi = (params) => { return request({ url: "/v1/auth/wx/register", method: "POST", header: { "content-type": "application/json" }, data: params }); }; const getUserInfoApi = () => { return request({ url: "/v1/user/info", method: "GET" }); }; const uploadFile = { url: `${BASE_URL}/v1/file/upload` }; const updateUserProfile = (data) => { return request({ url: "/v1/user/profile", method: "PUT", header: { "content-type": "application/json" }, data }); }; const getSuggestions = (keyword) => { return request({ url: "/v1/stock/suggestion", method: "GET", data: { keyword } }); }; const searchStocks = (keyword) => { return request({ url: "/v1/stock/search", method: "POST", header: { "content-type": "application/json" }, data: { keyword } }); }; const getStockQuotes = (codes) => { return request({ url: "/api/stock/fetch", method: "GET", data: { codes } }); }; const getIndexQuote = (code) => { return request({ url: "/api/stock/index", method: "GET", data: { code } }); }; const getUserStocks = () => { return request({ url: "/v1/user/stock/list", method: "GET" }); }; const addUserStock = (data) => { return request({ url: "/v1/user/stock/add", method: "POST", header: { "content-type": "application/json" }, data }); }; const deleteUserStock = (stockCode) => { return request({ url: `/v1/user/stock/delete?stockCode=${encodeURIComponent(stockCode)}`, method: "DELETE" }); }; const getStockPoolList = (poolType) => { return request({ url: "/v1/stock/pool/list", method: "GET", data: { poolType } }); }; const createOrder = (data) => { return request({ url: "/v1/order/create", method: "POST", header: { "content-type": "application/json" }, data }); }; const getUserOrders = () => { return request({ url: "/v1/order/list", method: "GET" }); }; const checkSubscription = (poolType) => { return request({ url: "/v1/order/check-subscription", method: "GET", data: { poolType } }); }; const wxPay = (payParams) => { return new Promise((resolve, reject) => { common_vendor.index.requestPayment({ provider: "wxpay", timeStamp: payParams.timeStamp, nonceStr: payParams.nonceStr, package: payParams.packageValue, signType: payParams.signType, paySign: payParams.paySign, success: (res) => { resolve(res); }, fail: (err) => { if (err.errMsg.includes("cancel")) { reject(new Error("用户取消支付")); } else { reject(new Error("支付失败:" + err.errMsg)); } } }); }); }; const mockPay = (orderNo) => { return request({ url: `/v1/order/mock-pay?orderNo=${encodeURIComponent(orderNo)}`, method: "POST" }); }; exports.BASE_URL = BASE_URL; exports.addUserStock = addUserStock; exports.checkSubscription = checkSubscription; exports.createOrder = createOrder; exports.deleteUserStock = deleteUserStock; exports.getImageUrl = getImageUrl; exports.getIndexQuote = getIndexQuote; exports.getStockPoolList = getStockPoolList; exports.getStockQuotes = getStockQuotes; exports.getSuggestions = getSuggestions; exports.getUserInfoApi = getUserInfoApi; exports.getUserOrders = getUserOrders; exports.getUserStocks = getUserStocks; exports.mockPay = mockPay; exports.searchStocks = searchStocks; exports.updateUserProfile = updateUserProfile; exports.uploadFile = uploadFile; exports.wxCompleteUserInfoApi = wxCompleteUserInfoApi; exports.wxPay = wxPay; exports.wxPhoneLoginApi = wxPhoneLoginApi; exports.wxSilentLoginApi = wxSilentLoginApi;