diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..2be092a --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# manifest.json merge=ours +# common/env.js merge=ours diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..55cdb3f --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +.vscode/ +.hbuilderx/ +.history/ +.idea/ +node_modules/ +unpackage/dist/ +unpackage/cache/ +unpackage/resources/ +/.vs +.DS_Store \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..73a7edd --- /dev/null +++ b/README.md @@ -0,0 +1,14 @@ +# 友达赏 + +## 代码 +```sh +# 导入基础 +import { defineComponent, ref } from 'vue'; +# 导入页面加载方法 +import { onLoad } from '@dcloudio/uni-app'; +let icon = ref("/static/app-plus/icon_108.png"); +# 使用页面加载方法 +onLoad(() => { + console.log('页面加载中'); +}); +``` \ No newline at end of file diff --git a/common/config.js b/common/config.js new file mode 100644 index 0000000..e69de29 diff --git a/common/env.js b/common/env.js new file mode 100644 index 0000000..633f4c5 --- /dev/null +++ b/common/env.js @@ -0,0 +1,40 @@ +/** + * 项目环境配置文件 + * 集中管理所有环境相关的配置参数 + */ + +// 开发环境配置 +const development = { + // API基础URL + baseUrl: 'https://testapi.zfunbox.cn', + // 图片资源URL + imageUrl: 'https://image.zfunbox.cn', + routeMapSecretKey: 'g6R@9!zB2fL#1cVm', + normalizeResponseKeys: 'g6R@9!zB2fL#1cVm' +}; + +// 生产环境配置 +const production = { + baseUrl: 'https://api.zfunbox.cn', + imageUrl: 'https://image.zfunbox.cn', + routeMapSecretKey: 'g6R@9!zB2fL#1cVm', + normalizeResponseKeys: 'g6R@9!zB2fL#1cVm' +}; +// 测试环境配置 +const testing = { + baseUrl: 'https://testapi.zfunbox.cn', + imageUrl: 'https://image.zfunbox.cn', + routeMapSecretKey: 'g6R@9!zB2fL#1cVm', + normalizeResponseKeys: 'g6R@9!zB2fL#1cVm' +}; + +// 根据环境变量选择对应配置 +let currentEnv = testing;//production;//testing; +// 衍生配置 +const config = { + ...currentEnv, + // API请求完整路径 + apiBaseUrl: currentEnv.baseUrl + '/api/', +}; + +export default config; \ No newline at end of file diff --git a/common/platform/AppPlatform.js b/common/platform/AppPlatform.js new file mode 100644 index 0000000..966c3e7 --- /dev/null +++ b/common/platform/AppPlatform.js @@ -0,0 +1,12 @@ +import BasePlatform from './BasePlatform'; + + + +class AppPlatform extends BasePlatform { + constructor() { + super(); + this.code = 'APP_ANDROID'; + this.env = 'app'; + } +} +export default AppPlatform; \ No newline at end of file diff --git a/common/platform/BasePlatform.js b/common/platform/BasePlatform.js new file mode 100644 index 0000000..cf29e5d --- /dev/null +++ b/common/platform/BasePlatform.js @@ -0,0 +1,157 @@ + +/** + * 多端平台抽象基类(父类) + * 定义所有端必须实现的方法 + */ +class BasePlatform { + constructor() { + if (new.target === BasePlatform) { + throw new Error('BasePlatform 是抽象类,不能直接实例化'); + } + this.code = ''; // 平台代码(WEB/MP/APP) + this.env = ''; // 运行环境标识 + this.config = null; + this.version = '1.0.0'; + } + async getConfig() { + + return {}; + } + async appData() { + + } + + /** + * 加载缓存 + */ + async loadCacheData() { + + } + /** + * 获取是否需要审核 + * @returns {boolean} 是否需要审核 + */ + getIsCheck(tag) { + return this.config?.isCheck ?? false; + } + getPayData(url, data) { + throw new Error('子类必须实现 getPayData 方法'); + } + /** + * + */ + chooseAddress() { + return new Promise((resolve, reject) => { + throw new Error('子类必须实现 chooseAddress 方法'); + }); + } + /** + * 支付方法(子类必须实现) + * @param {number} amount - 支付金额(分) + * @param {string} orderId - 订单号 + */ + pay({ + data + }, event) { + throw new Error('子类必须实现 pay 方法'); + } + + /** + * 分享方法(子类必须实现) + * @param {object} params - 分享参数 { title, desc, image, url } + */ + share({ + title, + desc, + link, + image + }) { + throw new Error('子类必须实现 share 方法'); + } + + /** + * 通用方法(所有端共用) + */ + getPlatformInfo() { + return { + code: this.code, + env: this.env, + ua: navigator?.userAgent || '' + }; + } + + downloadFile(url) { + return new Promise((resolve, reject) => { + throw new Error('子类必须实现 downloadFile 方法'); + }); + } + AppLaunch(options) { + throw new Error('子类必须实现 AppLaunch 方法'); + } + /** + * 获取订单号 + */ + getOrderNo(event) { + throw new Error('子类必须实现 getOrderNo 方法'); + } + + delOrderNo() { + + } + + /** + * 获取用户中心菜单列表 + * @returns {Array} 菜单项数组,每项包含id, show, title, icon, path和handler + */ + getUserMenuList() { + return []; + } + + /** + * 导航到指定页面 + * @param {Object} item 菜单项 + */ + navigateToPath(item) { + + } + + + + /** + * 处理退出登录 + */ + handleLogout() { + uni.showModal({ + title: '提示', + content: '确定要退出登录吗?', + success: (res) => { + if (res.confirm) { + + } + } + }); + } + /** + * 开启调试 + */ + startDeb() { + + } + /** + * 关闭调试 + */ + closeDeb() { + + } + getVersion() { + return this.version; + } + getUserAgreement() { + // navigateTo('/pages/guize/guize', { type: 4 }) + } + getPrivacyAgreement() { + // navigateTo('/pages/guize/guize', { type: 5 }) + } + +} +export default BasePlatform; \ No newline at end of file diff --git a/common/platform/PlatformFactory.js b/common/platform/PlatformFactory.js new file mode 100644 index 0000000..a664edf --- /dev/null +++ b/common/platform/PlatformFactory.js @@ -0,0 +1,23 @@ +import BasePlatform from './BasePlatform.js'; +import AppPlatform from './AppPlatform'; +//#ifdef APP +// import AppPlatform from './AppPlatform'; +//#endif + +class PlatformFactory { + static create() { + console.log('获取平台获取平台获取平台获取平台获取平台获取平台'); + + //#ifdef APP + return new AppPlatform(); + //#endif + // 默认返回 + return new AppPlatform(); + } +} + +// 使用示例 +const platform = PlatformFactory.create(); +export { + platform +}; \ No newline at end of file diff --git a/common/server/config.js b/common/server/config.js new file mode 100644 index 0000000..b458427 --- /dev/null +++ b/common/server/config.js @@ -0,0 +1,10 @@ +import HttpRequest from "../system/request"; + +/** + * 获取系统配置 + * @returns {} + */ +export const getConfig = async () => { + const res = await HttpRequest.getOrCache('/config'); + 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..44035ea --- /dev/null +++ b/common/system/request.js @@ -0,0 +1,212 @@ +/** + * 网络请求工具类 + * 封装统一的网络请求方法 + */ + +import EnvConfig from '@/common/env.js'; +import md5 from 'js-md5'; +import { normalizeResponseKeys, getRouteMap } from '@/common/system/routeMap.js'; +import { platform } from '@/common/platform/PlatformFactory'; +import { getLocalStorage, setLocalStorage } from './cacheService'; +import qs from 'qs'; +class HttpRequest { + /** + * 生成唯一的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 = HttpRequest.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 = getRouteMap(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'); + const client = platform.code; + let data = { ...fromData }; // 创建数据的深拷贝,避免修改原数据 + + // 构建请求URL和提取主机名 + const { requestUrl, host } = HttpRequest._buildRequestUrl(url); + + // 显示加载提示 + if (showLoading) { + uni.showLoading({ + title: '正在加载中...', + mask: true + }); + } + + // 创建签名并准备请求数据和头信息 + const { data: signedData } = HttpRequest._createSignature(data, host); + data = signedData; + + // 根据请求方法设置不同的headers + const header = { + platform: client, + token: token, + version: platform.getVersion(), + 'content-type': requestMethod === 'POST' + ? 'application/x-www-form-urlencoded' + : '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); + const normalizedRes = normalizeResponseKeys(res); + + resolve(normalizedRes); + }, + 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 HttpRequest.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 HttpRequest.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); + const cacheData = getLocalStorage(cacheKey); + if (cacheData) { + console.log('getOrCache', cacheKey, '缓存命中'); + return cacheData; + } + const res = await HttpRequest.request(url, data, 'GET', showLoading); + setLocalStorage(cacheKey, res, time); + return res; + } + +} + +export default HttpRequest; \ No newline at end of file diff --git a/common/system/routeMap.js b/common/system/routeMap.js new file mode 100644 index 0000000..c3bad8a --- /dev/null +++ b/common/system/routeMap.js @@ -0,0 +1,124 @@ +import CryptoJS from 'crypto-js' +import EnvConfig from '@/common/env' + + +let routeMapSecretKey = EnvConfig.routeMapSecretKey; +let normalizeSecretKeys = EnvConfig.normalizeResponseKeys; +/** + * 解密 route_map 字符串 + * @param {string} encryptedBase64 加密后的 Base64 字符串 + * @param {string} secretKey 与后端一致的密钥(16字节) + * @returns {Object|null} 解密后的 JSON 对象(映射表),失败则为 null + */ +export function decryptRouteMap(encryptedBase64, secretKey = '') { + if (secretKey == '') { + secretKey = routeMapSecretKey; + } + try { + // 与 PHP 中 substr(md5(secretKey), 0, 16) 相同 + const iv = CryptoJS.enc.Utf8.parse(CryptoJS.MD5(secretKey).toString().substring(0, 16)) + const key = CryptoJS.enc.Utf8.parse(secretKey) + + // base64 解码 + const encryptedHex = CryptoJS.enc.Base64.parse(encryptedBase64) + + // 解密 + const decrypted = CryptoJS.AES.decrypt({ ciphertext: encryptedHex }, key, { + iv, + mode: CryptoJS.mode.CBC, + padding: CryptoJS.pad.Pkcs7 + }) + + const decryptedText = decrypted.toString(CryptoJS.enc.Utf8) + return JSON.parse(decryptedText) + } catch (e) { + console.error('❌ 解密失败:', e) + return null + } +} + +/** + * 解密 payload 字段 + * @param {Object} res 接口返回的数据对象 + * @returns {Object} 处理后的对象(直接修改原对象) + */ +export function normalizeResponseKeys(res) { + if (!res || typeof res !== 'object') return res; + + // 安全处理 res.data + if (!res.data || typeof res.data !== 'object') { + res.data = {}; + } + + // 将安卓专属字段映射为通用字段 + if (res.data.ret != null) { + res.data.status = res.data.ret; + delete res.data.ret; + } + + if (res.data.note != null) { + res.data.msg = res.data.note; + delete res.data.note; + } + + // 解密 payload 字段(如果存在) + if (res.data.payload != null && typeof res.data.payload === 'string') { + try { + const base64EncryptedData = res.data.payload; + + // 先 base64 解码(CryptoJS 需要的是 WordArray) + const encryptedHexStr = CryptoJS.enc.Base64.parse(base64EncryptedData); + + // 解密 key 和 iv + const secretKey = normalizeSecretKeys; + const key = CryptoJS.enc.Utf8.parse(secretKey); + const iv = CryptoJS.enc.Utf8.parse(CryptoJS.MD5(secretKey).toString().substring(0, 16)); + + // 进行解密 + const decrypted = CryptoJS.AES.decrypt( + { ciphertext: encryptedHexStr }, + key, + { + iv: iv, + mode: CryptoJS.mode.CBC, + padding: CryptoJS.pad.Pkcs7 + } + ); + + const decryptedText = decrypted.toString(CryptoJS.enc.Utf8); + try { + res.data.data = JSON.parse(decryptedText); + } catch (e) { + res.data.data = decryptedText; + } + } catch (e) { + console.error('解密 payload 失败:', res.data.payload, e); + res.data.data = null; // 解密失败时给 null 或原值 + } + } + + if (res.data.ts != null) { + res.data.timestamp = res.data.ts; + } + + return res; +} + +const routeMapText = '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'; +const route_map = decryptRouteMap(routeMapText); +console.log(route_map); +export { route_map }; + +/** + * 获取路由映射 + * @param {string} route 路由名称 + * @returns {string} 映射后的路由名称 + */ +export function getRouteMap(route) { + // 去除 route 中的 开头/ + if (route.startsWith('/')) { + route = route.substring(1); + } + // 如果 route 中不包含 / 则返回 route_map[route] + return route_map[route] || route; +} \ No newline at end of file diff --git a/common/system/router.js b/common/system/router.js new file mode 100644 index 0000000..ccfff71 --- /dev/null +++ b/common/system/router.js @@ -0,0 +1,13 @@ +import { platform } from '@/common/platform/PlatformFactory'; + +export const navigateTo = (url) => { + uni.navigateTo({ + url: url, + fail: (err) => { + uni.switchTab({ + url: url + }); + + } + }); +} \ No newline at end of file diff --git a/common/utils.js b/common/utils.js new file mode 100644 index 0000000..8849c0f --- /dev/null +++ b/common/utils.js @@ -0,0 +1,33 @@ +/** + * 延迟执行 + * @param {Number} ms + * @returns + */ +export function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} +/** + * 解析查询字符串 + * @param {string} urlOrQueryString + * @returns {Object} 查询参数对象 + */ +export function parseQueryString(urlOrQueryString) { + // 如果传入的是完整URL(如 "/path?name=value"),提取查询部分 + let queryString = urlOrQueryString; + const questionMarkIndex = queryString.indexOf('?'); + if (questionMarkIndex !== -1) { + queryString = queryString.slice(questionMarkIndex + 1); + } + + const params = {}; + if (!queryString) return params; // 如果没有查询参数,返回空对象 + + const pairs = queryString.split('&'); + for (const pair of pairs) { + const [key, value] = pair.split('='); + // 解码 URI 组件,并处理无值情况(如 "key" 而不是 "key=value") + params[key] = value ? decodeURIComponent(value) : ''; + } + + return params; +} \ No newline at end of file diff --git a/main.js b/main.js index c1caf36..5f2ba1c 100644 --- a/main.js +++ b/main.js @@ -6,17 +6,19 @@ import './uni.promisify.adaptor' Vue.config.productionTip = false App.mpType = 'app' const app = new Vue({ - ...App + ...App }) app.$mount() // #endif // #ifdef VUE3 -import { createSSRApp } from 'vue' +import { + createSSRApp +} from 'vue' export function createApp() { - const app = createSSRApp(App) - return { - app - } + const app = createSSRApp(App) + return { + app + } } // #endif \ No newline at end of file diff --git a/manifest.json b/manifest.json index 38e0daf..697061f 100644 --- a/manifest.json +++ b/manifest.json @@ -17,7 +17,10 @@ "delay" : 0 }, /* 模块配置 */ - "modules" : {}, + "modules" : { + "Camera" : {}, + "Payment" : {} + }, /* 应用发布信息 */ "distribute" : { /* android打包配置 */ @@ -41,9 +44,18 @@ ] }, /* ios打包配置 */ - "ios" : {}, + "ios" : { + "idfa" : false + }, /* SDK配置 */ - "sdkConfigs" : {} + "sdkConfigs" : { + "payment" : { + "alipay" : { + "__platform__" : [ "ios", "android" ] + } + }, + "share" : {} + } } }, /* 快应用特有相关 */ diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..bf48524 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,289 @@ +{ + "name": "youdas", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "crypto-js": "^4.2.0", + "js-md5": "^0.8.3", + "qs": "^6.14.0" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/crypto-js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "license": "MIT" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/js-md5": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/js-md5/-/js-md5-0.8.3.tgz", + "integrity": "sha512-qR0HB5uP6wCuRMrWPTrkMaev7MJZwJuuw4fnwAzRgP4J4/F8RwtodOKpGp4XpqsLBFzzgqIO42efFAyz2Et6KQ==", + "license": "MIT" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..7d2b6bd --- /dev/null +++ b/package.json @@ -0,0 +1,7 @@ +{ + "dependencies": { + "crypto-js": "^4.2.0", + "js-md5": "^0.8.3", + "qs": "^6.14.0" + } +} diff --git a/pages.json b/pages.json index f494844..ac2b16c 100644 --- a/pages.json +++ b/pages.json @@ -1,5 +1,11 @@ { - "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages + "pages": [ + { + "path": "pages/index/index", + "style": { + "navigationStyle": "custom" + } + }, { "path": "pages/news/news", "style": { @@ -7,13 +13,7 @@ "navigationBarTitleText": "" } }, - { - "path": "pages/index/index", - "style": { - "navigationStyle": "custom", - "navigationBarTitleText": "" - } - }, + { "path": "pages/mall/mall", "style": { @@ -27,12 +27,6 @@ "navigationStyle": "custom", "navigationBarTitleText": "" } - }, - { - "path": "pages/news/news_details", - "style": { - "navigationBarTitleText": "" - } } ], "globalStyle": { @@ -41,13 +35,13 @@ "navigationBarBackgroundColor": "#FFFFFF", "backgroundColor": "#F7F7F7" }, - "tabBar": { "color": "#C6C6C6", "selectedColor": "#333333", "borderStyle": "black", "height": "124.05rpx", - "list": [{ + "list": [ + { "pagePath": "pages/news/news", "text": "资讯", "iconPath": "/static/tabbar/news.png", @@ -65,9 +59,6 @@ "iconPath": "/static/tabbar/me.png", "selectedIconPath": "/static/tabbar/me_s.png" } - ] } - - } \ No newline at end of file diff --git a/pages/index/index.vue b/pages/index/index.vue index 8ea2867..9455435 100644 --- a/pages/index/index.vue +++ b/pages/index/index.vue @@ -1,179 +1,82 @@ - \ No newline at end of file diff --git a/static/app-plus/icon_108.png b/static/app-plus/icon_108.png new file mode 100644 index 0000000..1f39a91 Binary files /dev/null and b/static/app-plus/icon_108.png differ diff --git a/static/app-plus/index_login.gif b/static/app-plus/index_login.gif new file mode 100644 index 0000000..7294be9 Binary files /dev/null and b/static/app-plus/index_login.gif differ diff --git a/static/app-plus/no-data.png b/static/app-plus/no-data.png new file mode 100644 index 0000000..a825ac0 Binary files /dev/null and b/static/app-plus/no-data.png differ diff --git a/static/logo.png b/static/logo.png deleted file mode 100644 index b5771e2..0000000 Binary files a/static/logo.png and /dev/null differ diff --git a/uni.scss b/uni.scss index b9249e9..4000de4 100644 --- a/uni.scss +++ b/uni.scss @@ -14,63 +14,3 @@ /* 颜色变量 */ -/* 行为相关颜色 */ -$uni-color-primary: #007aff; -$uni-color-success: #4cd964; -$uni-color-warning: #f0ad4e; -$uni-color-error: #dd524d; - -/* 文字基本颜色 */ -$uni-text-color:#333;//基本色 -$uni-text-color-inverse:#fff;//反色 -$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息 -$uni-text-color-placeholder: #808080; -$uni-text-color-disable:#c0c0c0; - -/* 背景颜色 */ -$uni-bg-color:#ffffff; -$uni-bg-color-grey:#f8f8f8; -$uni-bg-color-hover:#f1f1f1;//点击状态颜色 -$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色 - -/* 边框颜色 */ -$uni-border-color:#c8c7cc; - -/* 尺寸变量 */ - -/* 文字尺寸 */ -$uni-font-size-sm:12px; -$uni-font-size-base:14px; -$uni-font-size-lg:16px; - -/* 图片尺寸 */ -$uni-img-size-sm:20px; -$uni-img-size-base:26px; -$uni-img-size-lg:40px; - -/* Border Radius */ -$uni-border-radius-sm: 2px; -$uni-border-radius-base: 3px; -$uni-border-radius-lg: 6px; -$uni-border-radius-circle: 50%; - -/* 水平间距 */ -$uni-spacing-row-sm: 5px; -$uni-spacing-row-base: 10px; -$uni-spacing-row-lg: 15px; - -/* 垂直间距 */ -$uni-spacing-col-sm: 4px; -$uni-spacing-col-base: 8px; -$uni-spacing-col-lg: 12px; - -/* 透明度 */ -$uni-opacity-disabled: 0.3; // 组件禁用态的透明度 - -/* 文章场景相关 */ -$uni-color-title: #2C405A; // 文章标题颜色 -$uni-font-size-title:20px; -$uni-color-subtitle: #555555; // 二级标题颜色 -$uni-font-size-subtitle:26px; -$uni-color-paragraph: #3F536E; // 文章段落颜色 -$uni-font-size-paragraph:15px;