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 @@
-
-
-
-
-
- {{ item }}
-
-
+
+
+
+
+
+ {{ tips_text }}
-
-
-
-
- {{item.title}}
-
-
-
- {{item.tiem}}
-
-
-
-
-
-
-
-
-
-
-
\ 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;