Merge branch 'main' of http://192.168.195.14:3000/shang/youdas
This commit is contained in:
commit
4e1c375d41
2
.gitattributes
vendored
Normal file
2
.gitattributes
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
# manifest.json merge=ours
|
||||||
|
# common/env.js merge=ours
|
||||||
10
.gitignore
vendored
Normal file
10
.gitignore
vendored
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
.vscode/
|
||||||
|
.hbuilderx/
|
||||||
|
.history/
|
||||||
|
.idea/
|
||||||
|
node_modules/
|
||||||
|
unpackage/dist/
|
||||||
|
unpackage/cache/
|
||||||
|
unpackage/resources/
|
||||||
|
/.vs
|
||||||
|
.DS_Store
|
||||||
14
README.md
Normal file
14
README.md
Normal file
|
|
@ -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('页面加载中');
|
||||||
|
});
|
||||||
|
```
|
||||||
0
common/config.js
Normal file
0
common/config.js
Normal file
40
common/env.js
Normal file
40
common/env.js
Normal file
|
|
@ -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;
|
||||||
12
common/platform/AppPlatform.js
Normal file
12
common/platform/AppPlatform.js
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
import BasePlatform from './BasePlatform';
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class AppPlatform extends BasePlatform {
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
this.code = 'APP_ANDROID';
|
||||||
|
this.env = 'app';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export default AppPlatform;
|
||||||
157
common/platform/BasePlatform.js
Normal file
157
common/platform/BasePlatform.js
Normal file
|
|
@ -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;
|
||||||
23
common/platform/PlatformFactory.js
Normal file
23
common/platform/PlatformFactory.js
Normal file
|
|
@ -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
|
||||||
|
};
|
||||||
10
common/server/config.js
Normal file
10
common/server/config.js
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
import HttpRequest from "../system/request";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取系统配置
|
||||||
|
* @returns {}
|
||||||
|
*/
|
||||||
|
export const getConfig = async () => {
|
||||||
|
const res = await HttpRequest.getOrCache('/config');
|
||||||
|
return res.data;
|
||||||
|
}
|
||||||
66
common/system/cacheService.js
Normal file
66
common/system/cacheService.js
Normal file
|
|
@ -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];
|
||||||
|
}
|
||||||
212
common/system/request.js
Normal file
212
common/system/request.js
Normal file
|
|
@ -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;
|
||||||
124
common/system/routeMap.js
Normal file
124
common/system/routeMap.js
Normal file
File diff suppressed because one or more lines are too long
13
common/system/router.js
Normal file
13
common/system/router.js
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
import { platform } from '@/common/platform/PlatformFactory';
|
||||||
|
|
||||||
|
export const navigateTo = (url) => {
|
||||||
|
uni.navigateTo({
|
||||||
|
url: url,
|
||||||
|
fail: (err) => {
|
||||||
|
uni.switchTab({
|
||||||
|
url: url
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
33
common/utils.js
Normal file
33
common/utils.js
Normal file
|
|
@ -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;
|
||||||
|
}
|
||||||
14
main.js
14
main.js
|
|
@ -6,17 +6,19 @@ import './uni.promisify.adaptor'
|
||||||
Vue.config.productionTip = false
|
Vue.config.productionTip = false
|
||||||
App.mpType = 'app'
|
App.mpType = 'app'
|
||||||
const app = new Vue({
|
const app = new Vue({
|
||||||
...App
|
...App
|
||||||
})
|
})
|
||||||
app.$mount()
|
app.$mount()
|
||||||
// #endif
|
// #endif
|
||||||
|
|
||||||
// #ifdef VUE3
|
// #ifdef VUE3
|
||||||
import { createSSRApp } from 'vue'
|
import {
|
||||||
|
createSSRApp
|
||||||
|
} from 'vue'
|
||||||
export function createApp() {
|
export function createApp() {
|
||||||
const app = createSSRApp(App)
|
const app = createSSRApp(App)
|
||||||
return {
|
return {
|
||||||
app
|
app
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// #endif
|
// #endif
|
||||||
|
|
@ -17,7 +17,10 @@
|
||||||
"delay" : 0
|
"delay" : 0
|
||||||
},
|
},
|
||||||
/* 模块配置 */
|
/* 模块配置 */
|
||||||
"modules" : {},
|
"modules" : {
|
||||||
|
"Camera" : {},
|
||||||
|
"Payment" : {}
|
||||||
|
},
|
||||||
/* 应用发布信息 */
|
/* 应用发布信息 */
|
||||||
"distribute" : {
|
"distribute" : {
|
||||||
/* android打包配置 */
|
/* android打包配置 */
|
||||||
|
|
@ -41,9 +44,18 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
/* ios打包配置 */
|
/* ios打包配置 */
|
||||||
"ios" : {},
|
"ios" : {
|
||||||
|
"idfa" : false
|
||||||
|
},
|
||||||
/* SDK配置 */
|
/* SDK配置 */
|
||||||
"sdkConfigs" : {}
|
"sdkConfigs" : {
|
||||||
|
"payment" : {
|
||||||
|
"alipay" : {
|
||||||
|
"__platform__" : [ "ios", "android" ]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"share" : {}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
/* 快应用特有相关 */
|
/* 快应用特有相关 */
|
||||||
|
|
|
||||||
289
package-lock.json
generated
Normal file
289
package-lock.json
generated
Normal file
|
|
@ -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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
7
package.json
Normal file
7
package.json
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
{
|
||||||
|
"dependencies": {
|
||||||
|
"crypto-js": "^4.2.0",
|
||||||
|
"js-md5": "^0.8.3",
|
||||||
|
"qs": "^6.14.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
29
pages.json
29
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",
|
"path": "pages/news/news",
|
||||||
"style": {
|
"style": {
|
||||||
|
|
@ -7,13 +13,7 @@
|
||||||
"navigationBarTitleText": ""
|
"navigationBarTitleText": ""
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"path": "pages/index/index",
|
|
||||||
"style": {
|
|
||||||
"navigationStyle": "custom",
|
|
||||||
"navigationBarTitleText": ""
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"path": "pages/mall/mall",
|
"path": "pages/mall/mall",
|
||||||
"style": {
|
"style": {
|
||||||
|
|
@ -27,12 +27,6 @@
|
||||||
"navigationStyle": "custom",
|
"navigationStyle": "custom",
|
||||||
"navigationBarTitleText": ""
|
"navigationBarTitleText": ""
|
||||||
}
|
}
|
||||||
},
|
|
||||||
{
|
|
||||||
"path": "pages/news/news_details",
|
|
||||||
"style": {
|
|
||||||
"navigationBarTitleText": ""
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"globalStyle": {
|
"globalStyle": {
|
||||||
|
|
@ -41,13 +35,13 @@
|
||||||
"navigationBarBackgroundColor": "#FFFFFF",
|
"navigationBarBackgroundColor": "#FFFFFF",
|
||||||
"backgroundColor": "#F7F7F7"
|
"backgroundColor": "#F7F7F7"
|
||||||
},
|
},
|
||||||
|
|
||||||
"tabBar": {
|
"tabBar": {
|
||||||
"color": "#C6C6C6",
|
"color": "#C6C6C6",
|
||||||
"selectedColor": "#333333",
|
"selectedColor": "#333333",
|
||||||
"borderStyle": "black",
|
"borderStyle": "black",
|
||||||
"height": "124.05rpx",
|
"height": "124.05rpx",
|
||||||
"list": [{
|
"list": [
|
||||||
|
{
|
||||||
"pagePath": "pages/news/news",
|
"pagePath": "pages/news/news",
|
||||||
"text": "资讯",
|
"text": "资讯",
|
||||||
"iconPath": "/static/tabbar/news.png",
|
"iconPath": "/static/tabbar/news.png",
|
||||||
|
|
@ -65,9 +59,6 @@
|
||||||
"iconPath": "/static/tabbar/me.png",
|
"iconPath": "/static/tabbar/me.png",
|
||||||
"selectedIconPath": "/static/tabbar/me_s.png"
|
"selectedIconPath": "/static/tabbar/me_s.png"
|
||||||
}
|
}
|
||||||
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -1,179 +1,82 @@
|
||||||
<template>
|
<template>
|
||||||
<view class="content">
|
<view class="page">
|
||||||
|
<view class="welcome">
|
||||||
<view class="" style="width: 100%; height: 225.19rpx; background-color: white; position: relative;">
|
<image class="welcome__logo" :src="icon" mode="aspectFit">
|
||||||
<view class="tab">
|
</image>
|
||||||
<view class="tab-item" v-for="(item, i) in tabList" :key="i" :class="tabC == i ? 'act' : 'unact'"
|
<image :src="login_icon" class="welcome__animation"></image>
|
||||||
@click="tabChange(i)">
|
<view class="welcome__tips">{{ tips_text }}</view>
|
||||||
<text>{{ item }}</text>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
</view>
|
||||||
|
|
||||||
<scroll-view class="" scroll-y="true" style="width: 688.93rpx; height: 1211rpx; margin: 15rpx auto;">
|
|
||||||
<view class="view-data" v-for="(item,index) in dataList" @click="toDetails(item.id)">
|
|
||||||
<view class="title">
|
|
||||||
{{item.title}}
|
|
||||||
</view>
|
|
||||||
|
|
||||||
<view class="time">
|
|
||||||
{{item.tiem}}
|
|
||||||
</view>
|
|
||||||
|
|
||||||
<view class="img">
|
|
||||||
|
|
||||||
</view>
|
|
||||||
|
|
||||||
</view>
|
|
||||||
</scroll-view>
|
|
||||||
|
|
||||||
|
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script setup>
|
||||||
export default {
|
import { defineComponent, ref } from 'vue'
|
||||||
data() {
|
import { onLoad } from '@dcloudio/uni-app'
|
||||||
return {
|
import { getConfig } from '@/common/server/config';
|
||||||
tabC: 1,
|
import { navigateTo } from '@/common/system/router';
|
||||||
tabList: ["热榜", "精选", "关注"],
|
let icon = ref("/static/app-plus/icon_108.png");
|
||||||
dataList: [{
|
let login_icon = ref("/static/app-plus/index_login.gif");
|
||||||
id: 1,
|
let tips_text = ref("正在加载中。。。");
|
||||||
title: "联合国预测世界人口将达到80亿,这一数字这一数字",
|
onLoad(async () => {
|
||||||
tiem: "今天 20:01",
|
// 检查网络状态
|
||||||
imgUrl: ""
|
const network = await uni.getNetworkType();
|
||||||
}, {
|
if (network.networkType === 'none') {
|
||||||
id: 1,
|
tips_text.value = '请检查网络连接';
|
||||||
title: "联合国预测世界人口将达到80亿,这一数字……",
|
// 监听网络状态变化
|
||||||
tiem: "今天 20:01",
|
uni.onNetworkStatusChange(checkNetwork);
|
||||||
imgUrl: ""
|
return;
|
||||||
}, {
|
|
||||||
id: 1,
|
|
||||||
title: "联合国预测世界人口将达到80亿,这一数字……",
|
|
||||||
tiem: "今天 20:01",
|
|
||||||
imgUrl: ""
|
|
||||||
}, {
|
|
||||||
id: 1,
|
|
||||||
title: "联合国预测世界人口将达到80亿,这一数字……",
|
|
||||||
tiem: "今天 20:01",
|
|
||||||
imgUrl: ""
|
|
||||||
}, {
|
|
||||||
id: 1,
|
|
||||||
title: "联合国预测世界人口将达到80亿,这一数字……",
|
|
||||||
tiem: "今天 20:01",
|
|
||||||
imgUrl: ""
|
|
||||||
}, {
|
|
||||||
id: 1,
|
|
||||||
title: "联合国预测世界人口将达到80亿,这一数字……",
|
|
||||||
tiem: "今天 20:01",
|
|
||||||
imgUrl: ""
|
|
||||||
}, ]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onLoad() {
|
|
||||||
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
tabChange(i) {
|
|
||||||
this.tabC = i
|
|
||||||
},
|
|
||||||
|
|
||||||
toDetails(i) {
|
|
||||||
//在起始页面跳转到test.vue页面并传递参数
|
|
||||||
uni.navigateTo({
|
|
||||||
url: '/pages/index/news_details'
|
|
||||||
})
|
|
||||||
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
navigateTo('/pages/news/news');
|
||||||
|
// const config = await getConfig();
|
||||||
|
// console.log('config', config);
|
||||||
|
// const config1 = await getConfig();
|
||||||
|
// console.log('config1', config1);
|
||||||
|
});
|
||||||
|
/**
|
||||||
|
* 检查网络状态
|
||||||
|
* @param {Object} res 网络状态
|
||||||
|
*/
|
||||||
|
function checkNetwork(res) {
|
||||||
|
console.log('网络状态变化:', res.isConnected, res.networkType);
|
||||||
|
if (res.isConnected) {
|
||||||
|
tips_text.value = '正在加载中。。。';
|
||||||
|
// #ifdef APP
|
||||||
|
plus.runtime.restart();
|
||||||
|
// #endif
|
||||||
|
} else {
|
||||||
|
tips_text.value = '请检查网络连接';
|
||||||
|
}
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
.content {
|
.page {
|
||||||
width: 100%;
|
width: 100vw;
|
||||||
display: flex;
|
height: 100vh;
|
||||||
flex-direction: column;
|
background-color: #f8f8f8;
|
||||||
background-color: #F7F7F7;
|
}
|
||||||
|
|
||||||
|
.welcome {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
padding: 20px;
|
||||||
|
|
||||||
|
&__logo {
|
||||||
|
width: 96px;
|
||||||
|
height: 96px;
|
||||||
|
margin-top: 20vh;
|
||||||
|
border-radius: 50%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tab {
|
&__animation {
|
||||||
width: 100%;
|
width: 200rpx;
|
||||||
display: flex;
|
height: 200rpx;
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
position: absolute;
|
|
||||||
bottom: 20rpx;
|
|
||||||
|
|
||||||
.tab-item {
|
|
||||||
width: 155rpx;
|
|
||||||
height: 68rpx;
|
|
||||||
position: relative;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
|
|
||||||
&.act {
|
|
||||||
font-size: 30.53rpx;
|
|
||||||
color: #000000;
|
|
||||||
|
|
||||||
&::after {
|
|
||||||
content: '';
|
|
||||||
position: absolute;
|
|
||||||
bottom: 0;
|
|
||||||
left: 50%;
|
|
||||||
transform: translateX(-50%);
|
|
||||||
width: 26.72rpx;
|
|
||||||
height: 4rpx;
|
|
||||||
background: #333333;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
&.unact {
|
|
||||||
font-size: 30.53rpx;
|
|
||||||
color: #4C4C4C;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.view-data {
|
&__tips {
|
||||||
width: 100%;
|
margin-top: 10px;
|
||||||
height: 225.19rpx;
|
|
||||||
background-color: white;
|
|
||||||
margin-bottom: 15rpx;
|
|
||||||
border-radius: 19.08rpx;
|
|
||||||
position: relative;
|
|
||||||
|
|
||||||
|
|
||||||
.title {
|
|
||||||
width: 366.41rpx;
|
|
||||||
height: 83.97rpx;
|
|
||||||
position: absolute;
|
|
||||||
top: 32rpx;
|
|
||||||
left: 20rpx;
|
|
||||||
-webkit-line-clamp: 2;
|
|
||||||
-webkit-box-orient: vertical;
|
|
||||||
display: -webkit-box;
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
}
|
|
||||||
|
|
||||||
.time {
|
|
||||||
position: absolute;
|
|
||||||
left: 20rpx;
|
|
||||||
font-size: 22.9rpx;
|
|
||||||
color: #878787;
|
|
||||||
bottom: 24rpx;
|
|
||||||
}
|
|
||||||
|
|
||||||
.img {
|
|
||||||
position: absolute;
|
|
||||||
right: 20rpx;
|
|
||||||
top: 34rpx;
|
|
||||||
width: 225.19rpx;
|
|
||||||
height: 158.4rpx;
|
|
||||||
background-color: #D8D8D8;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
BIN
static/app-plus/icon_108.png
Normal file
BIN
static/app-plus/icon_108.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.3 KiB |
BIN
static/app-plus/index_login.gif
Normal file
BIN
static/app-plus/index_login.gif
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 284 KiB |
BIN
static/app-plus/no-data.png
Normal file
BIN
static/app-plus/no-data.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.0 KiB |
BIN
static/logo.png
BIN
static/logo.png
Binary file not shown.
|
Before Width: | Height: | Size: 3.9 KiB |
60
uni.scss
60
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;
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user