123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752 |
- import Config from './config.js'
- import store from '@/store/index.js'
- import Http from './http.js'
- export default {
- /**
- * 页面跳转
- * @param {string} to 跳转链接 /pages/idnex/index
- * @param {Object} param 参数 {key : value, ...}
- * @param {string} mode 模式
- */
- redirectTo(to, param, mode) {
- let url = to;
- let tabbarList = ['/pages/index/index', '/pages/goods/category', '/pages/goods/cart',
- '/pages/member/index'
- ]
- if (param != undefined) {
- Object.keys(param).forEach(function(key) {
- if (url.indexOf('?') != -1) {
- url += "&" + key + "=" + param[key];
- } else {
- url += "?" + key + "=" + param[key];
- }
- });
- }
- for (let i = 0; i < tabbarList.length; i++) {
- if (url.indexOf(tabbarList[i]) == 0) {
- uni.switchTab({
- url
- })
- return;
- }
- }
- switch (mode) {
- case 'tabbar':
- // 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面。
- uni.switchTab({
- url
- })
- break;
- case 'redirectTo':
- // 关闭当前页面,跳转到应用内的某个页面。
- uni.redirectTo({
- url
- });
- break;
- case 'reLaunch':
- // 关闭所有页面,打开到应用内的某个页面。
- uni.reLaunch({
- url
- });
- break;
- default:
- // 保留当前页面,跳转到应用内的某个页面
- uni.navigateTo({
- url
- });
- }
- },
- /**
- * 图片路径转换
- * @param {String} img_path 图片地址
- * @param {Object} params 参数,针对商品、相册里面的图片区分大中小,size: big、mid、small
- */
- img(img_path, params) {
- var path = "";
- if (img_path != undefined && img_path != "") {
- if (img_path.split(',').length > 1) {
- img_path = img_path.split(',')[0];
- }
- if (params && img_path != this.getDefaultImage().goods) {
- // 过滤默认图
- let arr = img_path.split(".");
- let suffix = arr[arr.length - 1];
- arr.pop();
- arr[arr.length - 1] = arr[arr.length - 1] + "_" + params.size.toUpperCase();
- arr.push(suffix);
- img_path = arr.join(".");
- }
- if (img_path.indexOf("http://") == -1 && img_path.indexOf("https://") == -1) {
- path = Config.imgDomain + "/" + img_path;
- } else {
- path = img_path;
- }
- // 处理商品助手的图片路径
- path = path.replace("addons/NsGoodsAssist/", "").replace("shop/goods/", "");
- }
- // path += '?t=' + parseInt(new Date().getTime() / 1000);
- return path;
- },
- /**
- * 时间戳转日期格式
- * @param {Object} timeStamp
- */
- timeStampTurnTime(timeStamp, type = "") {
- if (timeStamp != undefined && timeStamp != "" && timeStamp > 0) {
- var date = new Date();
- date.setTime(timeStamp * 1000);
- var y = date.getFullYear();
- var m = date.getMonth() + 1;
- m = m < 10 ? ('0' + m) : m;
- var d = date.getDate();
- d = d < 10 ? ('0' + d) : d;
- var h = date.getHours();
- h = h < 10 ? ('0' + h) : h;
- var minute = date.getMinutes();
- var second = date.getSeconds();
- minute = minute < 10 ? ('0' + minute) : minute;
- second = second < 10 ? ('0' + second) : second;
- if (type) {
- if (type == 'yearMonthDay') {
- return y + '年' + m + '月' + d + '日';
- }
- return y + '-' + m + '-' + d;
- } else {
- return y + '-' + m + '-' + d + ' ' + h + ':' + minute + ':' + second;
- }
- } else {
- return "";
- }
- },
- /**
- * 日期格式转时间戳
- * @param {Object} timeStamp
- */
- timeTurnTimeStamp(string) {
- var f = string.split(' ', 2);
- var d = (f[0] ? f[0] : '').split('-', 3);
- var t = (f[1] ? f[1] : '').split(':', 3);
- return (new Date(
- parseInt(d[0], 10) || null,
- (parseInt(d[1], 10) || 1) - 1,
- parseInt(d[2], 10) || null,
- parseInt(t[0], 10) || null,
- parseInt(t[1], 10) || null,
- parseInt(t[2], 10) || null
- )).getTime() / 1000;
- },
- /**
- * 倒计时
- * @param {Object} seconds 秒
- */
- countDown(seconds) {
- let [day, hour, minute, second] = [0, 0, 0, 0]
- if (seconds > 0) {
- day = Math.floor(seconds / (60 * 60 * 24))
- hour = Math.floor(seconds / (60 * 60)) - (day * 24)
- minute = Math.floor(seconds / 60) - (day * 24 * 60) - (hour * 60)
- second = Math.floor(seconds) - (day * 24 * 60 * 60) - (hour * 60 * 60) - (minute * 60)
- }
- if (day < 10) {
- day = '0' + day
- }
- if (hour < 10) {
- hour = '0' + hour
- }
- if (minute < 10) {
- minute = '0' + minute
- }
- if (second < 10) {
- second = '0' + second
- }
- return {
- d: day,
- h: hour,
- i: minute,
- s: second
- };
- },
- /**
- * 数值去重
- * @param {Array} arr 数组
- * @param {string} field 字段
- */
- unique(arr, field) {
- const res = new Map();
- return arr.filter((a) => !res.has(a[field]) && res.set(a[field], 1));
- },
- /**
- * 判断值是否在数组中
- * @param {Object} elem
- * @param {Object} arr
- * @param {Object} i
- */
- inArray: function(elem, arr) {
- return arr == null ? -1 : arr.indexOf(elem);
- },
- /**
- * 获取某天日期
- * @param {Object} day
- */
- getDay: function(day) {
- var today = new Date();
- var targetday_milliseconds = today.getTime() + 1000 * 60 * 60 * 24 * day;
- today.setTime(targetday_milliseconds);
- const doHandleMonth = function(month) {
- var m = month;
- if (month.toString().length == 1) {
- m = "0" + month;
- }
- return m
- }
- var tYear = today.getFullYear();
- var tMonth = today.getMonth();
- var tDate = today.getDate();
- var tWeek = today.getDay();
- var time = parseInt(today.getTime() / 1000);
- tMonth = doHandleMonth(tMonth + 1);
- tDate = doHandleMonth(tDate);
- const week = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']
- return {
- 't': time,
- 'y': tYear,
- 'm': tMonth,
- 'd': tDate,
- 'w': week[tWeek]
- };
- },
- //上传
- upload_file_server(tempFilePath, data, path, url = "", callback) {
- if (url) {
- var uploadUrl = Config.baseUrl + url
- } else {
- var uploadUrl = Config.baseUrl + '/api/upload/' + path
- }
- return new Promise((resolve, reject) => {
- uni.uploadFile({
- url: uploadUrl,
- filePath: tempFilePath,
- name: 'file',
- formData: data,
- success: function(res) {
- var path_str = JSON.parse(res.data);
- if (path_str.code >= 0) {
- resolve(path_str.data.pic_path);
- typeof callback == 'function' && callback(path_str.data.pic_path);
- } else {
- reject("error");
- }
- }
- });
- });
- },
- /**
- * 复制
- * @param {Object} message
- * @param {Object} callback
- */
- copy(value, callback) {
- // #ifdef H5
- var oInput = document.createElement('input'); //创建一个隐藏input(重要!)
- oInput.value = value; //赋值
- oInput.setAttribute("readonly", "readonly");
- document.body.appendChild(oInput);
- oInput.select(); // 选择对象
- document.execCommand("Copy"); // 执行浏览器复制命令
- oInput.className = 'oInput';
- oInput.style.display = 'none';
- uni.hideKeyboard();
- this.showToast({
- title: '复制成功'
- });
- typeof callback == 'function' && callback();
- // #endif
- // #ifdef MP || APP-PLUS
- uni.setClipboardData({
- data: value,
- success: () => {
- typeof callback == 'function' && callback();
- }
- });
- // #endif
- },
- /**
- * 显示消息提示框
- * @param {Object} params 参数
- */
- showToast(params = {}) {
- params.title = params.title || "";
- params.icon = params.icon || "none";
- // params.position = params.position || 'bottom';
- params.duration = params.duration || 1500;
- uni.showToast(params);
- if (params.success) params.success();
- },
- /**
- * 检测苹果X以上的手机
- */
- isIPhoneX() {
- let res = uni.getSystemInfoSync();
- if (res.model.search('iPhone X') != -1) {
- return true;
- }
- return false;
- },
- //判断安卓还是iOS
- isAndroid() {
- let platform = uni.getSystemInfoSync().platform
- if (platform == 'ios') {
- return false;
- } else if (platform == 'android') {
- return true;
- }
- },
- /**
- * 深度拷贝对象
- * @param {Object} obj
- */
- deepClone(obj) {
- const isObject = function(obj) {
- return typeof obj == 'object';
- }
- if (!isObject(obj)) {
- throw new Error('obj 不是一个对象!')
- }
- //判断传进来的是对象还是数组
- let isArray = Array.isArray(obj)
- let cloneObj = isArray ? [] : {}
- //通过for...in来拷贝
- for (let key in obj) {
- cloneObj[key] = isObject(obj[key]) ? this.deepClone(obj[key]) : obj[key]
- }
- return cloneObj
- },
- /**
- * 获取默认图
- * @param {Object} link
- */
- getDefaultImage() {
- let defaultImg = uni.getStorageSync('default_img');
- if (defaultImg) {
- defaultImg.goods = this.img(defaultImg.goods);
- defaultImg.head = this.img(defaultImg.head);
- defaultImg.store = this.img(defaultImg.store);
- defaultImg.article = this.img(defaultImg.article);
- return defaultImg;
- } else {
- return {
- goods: '',
- head: '',
- store: '',
- article: ''
- };
- }
- },
- /**
- * 判断手机是否为iphoneX系列
- */
- uniappIsIPhoneX() {
- let isIphoneX = false;
- let systemInfo = uni.getSystemInfoSync();
- // #ifdef MP
- if (systemInfo.model.search('iPhone X') != -1 || systemInfo.model.search('iPhone 11') != -1 || systemInfo.model
- .search('iPhone 12') != -1 || systemInfo.model.search('iPhone 13') != -1) {
- isIphoneX = true;
- }
- // #endif
- // #ifdef H5
- var u = navigator.userAgent;
- var isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
- if (isIOS) {
- if (systemInfo.screenWidth == 375 && systemInfo.screenHeight == 812 && systemInfo.pixelRatio == 3) {
- isIphoneX = true;
- } else if (systemInfo.screenWidth == 414 && systemInfo.screenHeight == 896 && systemInfo.pixelRatio == 3) {
- isIphoneX = true;
- } else if (systemInfo.screenWidth == 414 && systemInfo.screenHeight == 896 && systemInfo.pixelRatio == 2) {
- isIphoneX = true;
- }
- }
- // #endif
- return isIphoneX;
- },
- /**
- * 判断手机是否为iphone11系列
- */
- uniappIsIPhone11() {
- let isIphone11 = false;
- let systemInfo = uni.getSystemInfoSync();
- // #ifdef MP
- if (systemInfo.model.search('iPhone 11') != -1) {
- isIphone11 = true;
- }
- // #endif
- return isIphone11;
- },
- // #ifdef H5
- //判断该浏览器是否为safaria浏览器
- isSafari() {
- let res = uni.getSystemInfoSync();
- var ua = navigator.userAgent.toLowerCase();
- if (ua.indexOf('applewebkit') > -1 && ua.indexOf('mobile') > -1 && ua.indexOf('safari') > -1 &&
- ua.indexOf('linux') === -1 && ua.indexOf('android') === -1 && ua.indexOf('chrome') === -1 &&
- ua.indexOf('ios') === -1 && ua.indexOf('browser') === -1) {
- return true;
- } else {
- return false;
- }
- },
- // #endif
- numberFixed(e, f) {
- if (!f) {
- f = 0;
- }
- return Number(e).toFixed(f);
- },
- /**
- * 获取url参数
- */
- getUrlCode(callback) {
- var url = location.search;
- var theRequest = new Object();
- if (url.indexOf('?') != -1) {
- var str = url.substr(1);
- var strs = str.split('&');
- for (var i = 0; i < strs.length; i++) {
- theRequest[strs[i].split('=')[0]] = strs[i].split('=')[1];
- }
- }
- typeof callback == 'function' && callback(theRequest);
- },
- /**
- * 获取当前页面路由
- */
- getCurrRoute() {
- let routes = getCurrentPages(); // 获取当前打开过的页面路由数组
- return routes.length ? routes[routes.length - 1].route : '';
- },
- goBack(backUrl = '/pages/index/index') {
- if (getCurrentPages().length == 1) {
- this.redirectTo(backUrl);
- } else {
- uni.navigateBack();
- }
- },
- /**
- * @param {Object} 转化时间字符串 (转化时分秒)
- */
- getTimeStr(val) {
- var h = parseInt(val / 3600).toString();
- var m = parseInt((val % 3600) / 60).toString();
- if (m.length == 1) {
- m = '0' + m;
- }
- if (h.length == 1) {
- h = '0' + h;
- }
- return h + ':' + m;
- },
- /**
- * 获取定位信息
- */
- getLocation(param = {}) {
- uni.getLocation({
- type: param.type ?? 'gcj02',
- success: res => {
- store.commit('setLocation', res);
- typeof param.success == 'function' && param.success(res);
- },
- fail: res => {
- typeof param.fail == 'function' && param.fail(res);
- },
- complete: res => {
- typeof param.complete == 'function' && param.complete(res);
- }
- });
- },
- // 计算两个经纬度之间的距离
- getDistance(lat1, lng1, lat2, lng2) {
- var radLat1 = lat1 * Math.PI / 180.0;
- var radLat2 = lat2 * Math.PI / 180.0;
- var a = radLat1 - radLat2;
- var b = lng1 * Math.PI / 180.0 - lng2 * Math.PI / 180.0;
- var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) +
- Math.cos(radLat1) * Math.cos(radLat2) * Math.pow(Math.sin(b / 2), 2)));
- s = s * 6378.137; // EARTH_RADIUS;
- s = Math.round(s * 10000) / 10000;
- return s;
- },
- //记录分享人
- onSourceMember(source_member) {
- Http.sendRequest({
- url: '/api/Member/alterShareRelation',
- data: {
- share_member: source_member,
- },
- success: res => {
- if (res.code >= 0) {
- uni.removeStorage({
- key: 'source_member',
- success: res => {
- console.log('删除成功', res)
- }
- })
- }
- }
- })
- },
- /**
- * 微信订阅消息
- */
- subscribeMessage(string) {
- let keywords = string;
- Http.sendRequest({
- url: '/weapp/api/weapp/messagetmplids',
- data: {
- keywords: keywords
- },
- success: res => {
- if (res.data.length) {
- uni.requestSubscribeMessage({
- tmplIds: res.data,
- success: (res) => {
- console.log("res", res)
- },
- fail: (res) => {
- console.log('fail', res)
- }
- })
- }
- }
- })
- },
- /**
- * 分享获取memberId,进行上下级绑定
- */
- getMemberId() {
- return new Promise((resolve, reject) => {
- Http.sendRequest({
- url: "/api/member/id",
- success: res => {
- if (res.code >= 0) {
- resolve(res.data)
- } else {
- reject(res)
- }
- }
- });
- })
- },
- /**
- * 获取小程序分享内容数据
- */
- getMpShare(path) {
- //如果没有特别指定 则获取当前页面的路由
- if (!path) {
- let route = this.getCurrentRoute();
- path = route.path;
- if (path == '/pages/member/index') {
- return new Promise((resolve, reject) => {
- resolve({})
- });
- };
- }
- return new Promise((resolve, reject) => {
- Http.sendRequest({
- url: "/weapp/api/weapp/share",
- data: {
- path: path
- },
- success: res => {
- if (res.code >= 0) {
- let shareConfig = res.data.data;
- if (shareConfig) {
- //分享给好友
- let appMessageData = {
- title: shareConfig.title,
- path: shareConfig.path,
- imageUrl: shareConfig.imageUrl,
- success: res => {},
- fail: res => {}
- }
- //分享到朋友圈
- let query = '';
- if (shareConfig.path.indexOf('?') > 0) {
- query = shareConfig.path.split('?')[1];
- }
- let timeLineData = {
- title: shareConfig.title,
- query: shareConfig.path,
- imageUrl: shareConfig.imageUrl,
- }
- resolve({
- appMessage: appMessageData,
- timeLine: timeLineData,
- })
- } else {
- reject(res.data);
- }
- } else {
- reject(res.data)
- }
- }
- });
- })
- },
- //获取当前路由
- getCurrentRoute() {
- let currentRoutes = getCurrentPages(); // 获取当前打开过的页面路由数组
- let currentRoute = currentRoutes[currentRoutes.length - 1].route //获取当前页面路由
- let currentParam = currentRoutes[currentRoutes.length - 1].options; //获取路由参数
- // 拼接参数
- let param = [];
- for (let key in currentParam) {
- param.push(key + '=' + currentParam[key])
- }
- let currentPath = '/' + currentRoute;
- let currentQuery = param.join('&');
- if (currentQuery) currentPath += '?' + currentQuery;
- return {
- path: currentPath,
- query: currentQuery,
- }
- },
- //获取分享路由
- getCurrentShareRoute(member_id) {
- let route = this.getCurrentRoute();
- //去掉原来的分享人数据
- route.path = route.path.replace(/[?|&]source_member=\d+/, '');
- if (member_id) {
- //路径的处理
- if (route.path.indexOf('?') > 0) {
- route.path += '&';
- } else {
- route.path += '?';
- }
- route.path += 'source_member=' + member_id;
- //参数的处理
- if (route.query) {
- route.query += '&';
- }
- route.query += 'source_member=' + member_id;
- }
- return route;
- },
- /**
- * 对象转style字符串
- * @param {Object} obj
- */
- objToStyle(obj) {
- let s = [];
- for (let i in obj) {
- s.push(i + ':' + obj[i]);
- }
- return s.join(';')
- },
- /**
- * 颜色减值
- * @param {Object} c1
- * @param {Object} c2
- * @param {Object} ratio
- */
- colourBlend(c1, c2, ratio) {
- ratio = Math.max(Math.min(Number(ratio), 1), 0)
- let r1 = parseInt(c1.substring(1, 3), 16)
- let g1 = parseInt(c1.substring(3, 5), 16)
- let b1 = parseInt(c1.substring(5, 7), 16)
- let r2 = parseInt(c2.substring(1, 3), 16)
- let g2 = parseInt(c2.substring(3, 5), 16)
- let b2 = parseInt(c2.substring(5, 7), 16)
- let r = Math.round(r1 * (1 - ratio) + r2 * ratio)
- let g = Math.round(g1 * (1 - ratio) + g2 * ratio)
- let b = Math.round(b1 * (1 - ratio) + b2 * ratio)
- r = ('0' + (r || 0).toString(16)).slice(-2)
- g = ('0' + (g || 0).toString(16)).slice(-2)
- b = ('0' + (b || 0).toString(16)).slice(-2)
- return '#' + r + g + b
- },
- /**
- * 生成贝塞尔曲线轨迹
- * @param {Object} points
- * @param {Object} times
- */
- bezier(points, times) {
- var bezier_points = [];
- var points_D = [];
- var points_E = [];
- const DIST_AB = Math.sqrt(Math.pow(points[1]['x'] - points[0]['x'], 2) + Math.pow(points[1]['y'] - points[0][
- 'y'
- ], 2));
- // 邻控制BC点间距
- const DIST_BC = Math.sqrt(Math.pow(points[2]['x'] - points[1]['x'], 2) + Math.pow(points[2]['y'] - points[1][
- 'y'
- ], 2));
- // D每次在AB方向上移动的距离
- if (points[0]['x'] > points[2]['x']) {
- var EACH_MOVE_AD = -(DIST_AB / times);
- // E每次在BC方向上移动的距离
- var EACH_MOVE_BE = -(DIST_BC / times);
- } else {
- var EACH_MOVE_AD = +(DIST_AB / times);
- // E每次在BC方向上移动的距离
- var EACH_MOVE_BE = +(DIST_BC / times);
- }
- // 点AB的正切
- const TAN_AB = (points[1]['y'] - points[0]['y']) / (points[1]['x'] - points[0]['x']);
- // 点BC的正切
- const TAN_BC = (points[2]['y'] - points[1]['y']) / (points[2]['x'] - points[1]['x']);
- // 点AB的弧度值
- const RADIUS_AB = Math.atan(TAN_AB);
- // 点BC的弧度值
- const RADIUS_BC = Math.atan(TAN_BC);
- // 每次执行
- for (var i = 1; i <= times; i++) {
- // AD的距离
- var dist_AD = EACH_MOVE_AD * i;
- // BE的距离
- var dist_BE = EACH_MOVE_BE * i;
- // D点的坐标
- var point_D = {};
- point_D['x'] = dist_AD * Math.cos(RADIUS_AB) + points[0]['x'];
- point_D['y'] = dist_AD * Math.sin(RADIUS_AB) + points[0]['y'];
- points_D.push(point_D);
- // E点的坐标
- var point_E = {};
- point_E['x'] = dist_BE * Math.cos(RADIUS_BC) + points[1]['x'];
- point_E['y'] = dist_BE * Math.sin(RADIUS_BC) + points[1]['y'];
- points_E.push(point_E);
- // 此时线段DE的正切值
- var tan_DE = (point_E['y'] - point_D['y']) / (point_E['x'] - point_D['x']);
- // tan_DE的弧度值
- var radius_DE = Math.atan(tan_DE);
- // 地市DE的间距
- var dist_DE = Math.sqrt(Math.pow((point_E['x'] - point_D['x']), 2) + Math.pow((point_E['y'] - point_D['y']),
- 2));
- // 此时DF的距离
- var dist_DF = (dist_AD / DIST_AB) * dist_DE;
- // 此时DF点的坐标
- var point_F = {};
- point_F['x'] = dist_DF * Math.cos(radius_DE) + point_D['x'];
- point_F['y'] = dist_DF * Math.sin(radius_DE) + point_D['y'];
- bezier_points.push(point_F);
- }
- return {
- 'bezier_points': bezier_points
- };
- }
- }
|