From af8feb3fe7d7d5662cbda99eabbd89882f04e388 Mon Sep 17 00:00:00 2001 From: zpc Date: Tue, 22 Jul 2025 23:01:06 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/env.js | 30 +++++ common/server/config.js | 8 ++ common/system/cacheService.js | 66 +++++++++++ common/system/request.js | 204 ++++++++++++++++++++++++++++++++++ common/utils.js | 17 +++ package-lock.json | 7 ++ package.json | 1 + pages.json | 14 +-- pages/index/index.vue | 36 +++--- static/bg.png | Bin 0 -> 263404 bytes vite.config.js | 10 +- 11 files changed, 354 insertions(+), 39 deletions(-) create mode 100644 common/env.js create mode 100644 common/server/config.js create mode 100644 common/system/cacheService.js create mode 100644 common/system/request.js create mode 100644 static/bg.png diff --git a/common/env.js b/common/env.js new file mode 100644 index 0000000..438c4ed --- /dev/null +++ b/common/env.js @@ -0,0 +1,30 @@ +/** + * 项目环境配置文件 + * 集中管理所有环境相关的配置参数 + */ + +// 开发环境配置 +const development = { + // API基础URL + // baseUrl: 'https://ydsapi.zpc-xy.com', + baseUrl: 'http://localhost:2015', + imageUrl: 'https://guyu-1308826010.cos.ap-shanghai.myqcloud.com', + +}; + +// 生产环境配置 +const production = { + baseUrl: 'https://ydsapi.zpc-xy.com', + imageUrl: 'https://guyu-1308826010.cos.ap-shanghai.myqcloud.com', + +}; + +// 根据环境变量选择对应配置 +let currentEnv = development;//production;//testing; +// 衍生配置 +const config = { + ...currentEnv, + apiBaseUrl: currentEnv.baseUrl + '/api/', +}; + +export default config; \ No newline at end of file diff --git a/common/server/config.js b/common/server/config.js new file mode 100644 index 0000000..f1624ca --- /dev/null +++ b/common/server/config.js @@ -0,0 +1,8 @@ +import request from '@/common/system/request'; + +export const getConfig = async () => { + let res = await request.get('Common/GetConfigV3', {}); + return res.data; +} + + diff --git a/common/system/cacheService.js b/common/system/cacheService.js new file mode 100644 index 0000000..2d5c4ca --- /dev/null +++ b/common/system/cacheService.js @@ -0,0 +1,66 @@ +/** + * 设置缓存,持久化到本地 + * @param {String} key 缓存key + * @param {Object} value 缓存数据 + */ +export const setCache = (key, value) => { + uni.setStorageSync(key, value); +} + +/** + * 获取缓存 + * @param {String} key 缓存key + * @returns {Object} 缓存数据 + */ +export const getCache = (key) => { + return uni.getStorageSync(key); +} + +/** + * 删除缓存 + * @param {String} key 缓存key + */ +export const removeCache = (key) => { + uni.removeStorageSync(key); +} + +/** + * 本地缓存 + */ +let localCache = {}; + +/** + * 设置缓存,非持久化 + * @param {String} key 缓存key + * @param {Object} value 缓存数据 + * @param {Number} time 缓存时间,秒 + */ +export const setLocalStorage = (key, value, time = 0) => { + localCache[key] = { + value: value, + expireTime: time > 0 ? Date.now() + time * 1000 : 0, + createTime: Date.now() + } +} + +/** + * 获取缓存,非持久化 + * @param {String} key 缓存key + * @returns {Object} 缓存数据 + */ +export const getLocalStorage = (key) => { + if (localCache[key]) { + if (localCache[key].expireTime > 0 && localCache[key].expireTime > Date.now()) { + return localCache[key].value; + } + } + return null; +} + +/** + * 删除缓存,非持久化 + * @param {String} key 缓存key + */ +export const removeLocalStorage = (key) => { + delete localCache[key]; +} \ No newline at end of file diff --git a/common/system/request.js b/common/system/request.js new file mode 100644 index 0000000..02bc89d --- /dev/null +++ b/common/system/request.js @@ -0,0 +1,204 @@ +/** + * 网络请求工具类 + * 封装统一的网络请求方法 + */ + +import EnvConfig from '@/common/env.js'; +import md5 from 'js-md5'; +import { getLocalStorage, setLocalStorage } from './cacheService'; +import qs from 'qs'; +class request { + /** + * 生成唯一的nonce值 + * @returns {String} nonce值 + */ + static generateNonce() { + return md5(Date.now() + Math.random().toString(36).substring(2, 15)); + } + + /** + * 创建签名 + * @param {Object} data 请求数据 + * @param {String} host 主机名 + * @returns {Object} 带签名的数据和参数字符串 + * @private + */ + static _createSignature(data, host) { + // 添加时间戳 + data.timestamp = Math.floor(Date.now() / 1000); + // 添加nonce随机字符串 + data.nonce = request.generateNonce(); + + // 按照键名对参数进行排序 + const sortedParams = {}; + Object.keys(data).sort().forEach(key => { + sortedParams[key] = data[key]; + }); + + // 组合参数为字符串 + let signStr = ''; + for (const key in sortedParams) { + if (typeof sortedParams[key] === 'object') { + signStr += key + '=' + JSON.stringify(sortedParams[key]) + '&'; + } else { + signStr += key + '=' + sortedParams[key] + '&'; + } + } + + // 获取时间戳,组合为密钥 + const timestamp = data.timestamp; + const appSecret = host + timestamp; + + // 添加密钥并去除最后的& + signStr = signStr.substring(0, signStr.length - 1) + appSecret; + + // 使用MD5生成签名 + const sign = md5(signStr); + data.sign = sign; + + return { data, signStr }; + } + + /** + * 构建请求URL + * @param {String} url 请求路径 + * @returns {Object} 包含请求URL和主机名的对象 + * @private + */ + static _buildRequestUrl(url) { + let requestUrl = ''; + + if (url.startsWith('http://') || url.startsWith('https://')) { + // 如果是完整的URL,直接使用 + requestUrl = url; + } else { + // 否则拼接基础URL和相对路径 + // 确保基础URL以/结尾,而请求路径不以/开头 + const apiBaseUrl = EnvConfig.apiBaseUrl; + const baseUrlWithSlash = apiBaseUrl.endsWith('/') ? apiBaseUrl : apiBaseUrl + '/'; + let routeMap = url; + const path = routeMap.startsWith('/') ? routeMap.substring(1) : routeMap; + requestUrl = baseUrlWithSlash + path; + } + + // 使用正则表达式从URL中提取主机名 + const hostRegex = /^(?:https?:\/\/)?([^\/]+)/i; + const matches = requestUrl.match(hostRegex); + const host = matches && matches[1] ? matches[1] : 'localhost'; + + return { requestUrl, host }; + } + + /** + * 发送请求 + * @param {String} url 请求地址 + * @param {Object} fromData 请求数据 + * @param {String} method 请求方式 + * @param {Boolean} showLoading 是否显示加载提示 + * @returns {Promise} 返回请求Promise + */ + static request(url, fromData = {}, method = 'POST', showLoading = false) { + return new Promise((resolve, reject) => { + // 使用传入的method而不是重新声明 + const requestMethod = method.toUpperCase(); + const token = uni.getStorageSync('token'); + let data = { ...fromData }; // 创建数据的深拷贝,避免修改原数据 + + // 构建请求URL和提取主机名 + const { requestUrl, host } = request._buildRequestUrl(url); + + // 显示加载提示 + if (showLoading) { + uni.showLoading({ + title: '正在加载中...', + mask: true + }); + } + + // 创建签名并准备请求数据和头信息 + const { data: signedData } = request._createSignature(data, host); + data = signedData; + // 根据请求方法设置不同的headers + const header = { + Authorization: 'Bearer ' + token, + 'content-type': 'application/json' + }; + + const startDate = Date.now(); + + // 发起网络请求 + uni.request({ + url: requestUrl, + method: requestMethod, + header: header, + data: data, + timeout: 30000, // 设置30秒超时 + success: res => { + const endDate = Date.now(); + console.log(requestUrl, "请求消耗时间", endDate - startDate); + resolve(res); + }, + fail: e => { + console.error('网络请求失败:', e); + uni.showToast({ + title: e.errMsg || '发送请求失败,请稍后再试!', + icon: 'none' + }); + reject(e); + }, + complete: () => { + if (showLoading) { + uni.hideLoading(); + } + } + }); + }); + } + + /** + * 发送GET请求 + * @param {String} url 请求地址 + * @param {Object} data 请求参数 + * @param {Boolean} showLoading 是否显示加载提示 + * @returns {Promise} 返回请求Promise + */ + static get(url, data = {}, showLoading = false) { + return request.request(url, data, 'GET', showLoading); + } + + /** + * 发送POST请求 + * @param {String} url 请求地址 + * @param {Object} data 请求参数 + * @param {Boolean} showLoading 是否显示加载提示 + * @returns {Promise} 返回请求Promise + */ + static post(url, data = {}, showLoading = false) { + return request.request(url, data, 'POST', showLoading); + } + + /** + * 发送get请求,如果缓存存在,则返回缓存数据,否则发送请求,并缓存数据 + * @param {String} url 请求地址 + * @param {Object} data 请求参数 + * @param {Number} time 缓存时间,秒 + * @param {Boolean} showLoading 是否显示加载提示 + * @returns {Promise} 返回请求Promise + */ + static async getOrCache(url, data = {}, time = 300, showLoading = false) { + const cacheKey = 'cache_' + url + '_' + qs.stringify(data); + // console.log('getOrCache', cacheKey, '查询缓存'); + const cacheData = getLocalStorage(cacheKey); + if (cacheData) { + console.log('getOrCache', cacheKey, '缓存命中'); + return cacheData; + } + + const res = await request.request(url, data, 'GET', showLoading); + setLocalStorage(cacheKey, res, time); + return res; + } + +} + +export default request; \ No newline at end of file diff --git a/common/utils.js b/common/utils.js index 4fcfad5..299f28e 100644 --- a/common/utils.js +++ b/common/utils.js @@ -109,3 +109,20 @@ export function hideLoading() { }); }); } + + +let os = ''; +/** + * + */ +export function getOS() { + if (os != '') { + return os; + } + // #ifdef APP-PLUS + const systemInfo = uni.getSystemInfoSync(); + return systemInfo.platform === 'ios' ? 'ios' : 'android'; + // #endif + + return 'mp'; +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index fbfc878..603508e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "@dcloudio/uni-ui": "^1.5.7", "crypto-js": "^4.2.0", "js-md5": "^0.8.3", + "lodash": "^4.17.21", "qs": "^6.14.0" }, "devDependencies": { @@ -685,6 +686,12 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, "node_modules/magic-string": { "version": "0.30.17", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", diff --git a/package.json b/package.json index ba670df..5d15541 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "@dcloudio/uni-ui": "^1.5.7", "crypto-js": "^4.2.0", "js-md5": "^0.8.3", + "lodash": "^4.17.21", "qs": "^6.14.0" }, "devDependencies": { diff --git a/pages.json b/pages.json index ab7a75f..3f0b147 100644 --- a/pages.json +++ b/pages.json @@ -1,18 +1,17 @@ { "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages - + { + "path": "pages/index/index", + "style": { + "navigationStyle": "custom" + } + }, { "path": "pages/home/home-page", "style": { "navigationStyle": "custom", "navigationBarTitleText": "" } - }, { - "path": "pages/index/index", - "style": { - "navigationStyle": "custom", - "navigationBarTitleText": "" - } }, { "path": "pages/bags/bags-page", @@ -78,7 +77,6 @@ "backgroundColor": "#F8F8F8" }, "uniIdRouter": {}, - "tabBar": { "color": "#FFFDF1", "selectedColor": "#333333", diff --git a/pages/index/index.vue b/pages/index/index.vue index d9d5dc9..7eddafe 100644 --- a/pages/index/index.vue +++ b/pages/index/index.vue @@ -1,32 +1,24 @@ - diff --git a/static/bg.png b/static/bg.png new file mode 100644 index 0000000000000000000000000000000000000000..a5b63fcc2e893cdbf9a9805b17b5493a6d29e5d2 GIT binary patch literal 263404 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