瀏覽代碼

初始化项目

hejie 3 年之前
父節點
當前提交
7d031076c9

+ 360 - 15
src/App.vue

@@ -1,19 +1,364 @@
 <script>
-export default {
-  onLaunch: function () {
-    // console.log("App Launch");
-  },
-  onShow: function () {
-    // console.log("App Show");
-  },
-  onHide: function () {
-    // console.log("App Hide");
-  },
-};
+	let util = require('@/utils/utils.js');
+	var registerFlag = true;
+	let crypto = require("crypto");
+	export default {
+		globalData:{
+		    userInfo: {},
+		    shopInfo: {
+		        shop_name: "数字茶城",
+		        desc: "数字茶城"
+		    },
+		    kfCode: '',
+			
+			ShopUrl: 'https://shop.haocha13.cn/ShuZiTeaYW/',
+			SignUrl: 'https://shop.haocha13.cn/ShuZiTeaIntegral/',
+			SpecUrl: 'https://shop.haocha13.cn/ShuZiTeaSpecial/',
+			groupUrl:'https://shop.haocha13.cn/ShuZiTeaSpell/', // 团购测试url  tea
+
+			// ShopUrl: 'https://tea.soowin.com/ShuZiTeaYW/',
+			// SignUrl: 'https://tea.soowin.com/ShuZiTeaIntegral/',
+			// SpecUrl: 'https://tea.soowin.com/ShuZiTeaSpecial/',
+			// groupUrl:'https://tea.soowin.com/ShuZiTeaSpell/', // 团购测试url  tea
+
+			// ShopUrl: 'http://192.168.31.176:8080/ShuZiTeaYW/',
+			// SignUrl: 'http://192.168.31.176:8080/ShuZiTeaIntegral/',
+			// SpecUrl: 'http://192.168.31.176:8080/ShuZiTeaSpecial/',
+			// groupUrl:'http://192.168.31.176:8080/ShuZiTeaSpell/', // 团购测试url  tea
+
+		    openId: '',
+		    agentId: 1, //推荐人ID
+		    interfaceheader: {
+		        "Content-Type": "application/x-www-form-urlencoded"
+		    },
+		    authorizeWindow: true, //是否可以打开用户信息授权页面,避免重复打开
+		    bindPhoneWindow: true, //是否可以打开绑定手机号码页面,避免重复打开
+		    hasUpdate: false, // 小程序是否有更新版本 默认为没有
+		    newVersionInfo: {
+		        num: "1.0.0",
+		        desc: "数字茶城上线啦!",
+		        updateInfo: [] // 数组形式描述一下具体更新了什么内容
+		    }, // 当前小程序最新版本信息
+		    msgTmp: null ,//订阅消息模板id信息
+			systemUserInfo:''
+		},
+		//检测缓存中是否有当前用户信息
+		authorizeUserInfo: function (callback, isHome) {
+			var that=this
+		    if (this.globalData.systemUserInfo=='') {
+		        uni.getStorage({
+		            key: 'systemUserInfo',
+		            success(res) {
+		                that.globalData.systemUserInfo = res.data;
+		                if (callback) {
+		                    callback(res.data.userId);
+		                }
+		            },
+		            fail() {
+						that.login(callback, isHome);
+		            }
+		        })
+		    } else {
+		        if (callback) {
+		            callback(this.globalData.systemUserInfo.userId);
+		        }
+		    }
+		},
+		login: function(callback, isHome) {
+		    var that = this;
+		    uni.showLoading({
+				icon: 'loading',
+				mask: true
+			});
+			uni.login({
+				provider: 'weixin',
+				success: function (res) {
+					if (res.code) {
+						// console.log(res.code)
+						//查询当前用户openId并返回是否已注册
+						uni.request({
+							//获取openID
+							url: that.globalData.ShopUrl + 'login/openid',
+							method: 'POST',
+							header: that.globalData.interfaceheader,
+							data: {
+								code: res.code
+							},
+							success: function (res) {
+								uni.hideLoading();
+								if (res.data.status == '200' || res.data.status == '300') {
+									that.globalData.openId = res.data.openid;
+									//用户已存在
+									if (res.data.userInfo && res.data.userInfo != ''){
+										that.globalData.systemUserInfo = res.data.userInfo;
+										uni.setStorage({
+											key: 'systemUserInfo',
+											data: res.data.userInfo
+										})
+										if (callback) {
+											callback(res.data.userInfo.userId);
+										}
+									}else{
+										//如果不是首页
+										if (!isHome){
+											//用户不存在
+											if(res.data.status == '300'){
+												let is=1
+												that.sendauthorizeUserInfo(is,callback);
+											}else{
+												let is=1
+												that.sendauthorizeUserInfo(is,callback);
+											}
+										}else{
+											callback();
+										}
+									}
+								} else {
+									console.log("登录" + res.data.status);
+									that.errTips(res.data.msg || "");
+								}
+							}
+						})
+					} else {
+						uni.hideLoading();
+						that.errTips("登录失败,请稍后重试。");
+					}
+				},
+				fail: (err) => {
+					console.log(err)
+				}
+			})
+		},
+		setAppData:function(id,data){
+			this.globalData.systemUserInfo=data
+			this.globalData.openId=id
+		},
+		//发起userInfo授权
+		sendauthorizeUserInfo: function(is,callback) {
+		    var that = this;
+		    //检测当前微信版本是否兼容wx.getUserInfo
+		    if (uni.getSetting) {
+		        uni.getSetting({
+		            success(res) {
+		                if (res.authSetting['scope.userInfo']) {
+							if(is==1){
+								that.setData(callback);
+							}else if(is==2){
+								that.setUnionid(callback)
+							}
+		                } else {
+		                    if (that.globalData.authorizeWindow) {
+		                        uni.navigateTo({
+		                            url: "/pages/authorize/index"
+		                        })
+								
+								that.globalData.authorizeWindow = false;
+		                    }
+		                }
+		            },
+		            fail(res) {
+		                uni.showModal({
+		                    content: "登录失败,请稍后重试。",
+		                    showCancel: false
+		                });
+		            }
+		        })
+		    } else {
+		        // 如果希望用户在最新版本的客户端上体验您的小程序,可以这样提示
+		        that.checkEdition();
+		        return;
+		    }
+		},
+		//微信版本太旧提示
+		checkEdition: function() {
+		    uni.showModal({
+		        title: '微信版本太旧',
+		        content: '使用旧版本微信,将无法登录、使用一些功能。请至 微信 -> 设置 或其他可信渠道更新微信。',
+		        showCancel: false,
+		        confirmColor: "#f02f2f",
+		        confirmText: "好",
+		    })
+		},
+		//发起userInfo授权
+		sendauthorizeUserInfo: function(is,callback) {
+		    var that = this;
+		    //检测当前微信版本是否兼容wx.getUserInfo
+		    if (uni.getSetting) {
+		        uni.getSetting({
+		            success(res) {
+		                if (res.authSetting['scope.userInfo']) {
+							if(is==1){
+								that.setData(callback);
+							}else if(is==2){
+								that.setUnionid(callback)
+							}
+		                } else {
+		                    if (that.globalData.authorizeWindow) {
+		                        uni.navigateTo({
+		                            url: "/pages/authorize/index"
+		                        })
+								
+								that.globalData.authorizeWindow = false;
+		                    }
+		                }
+		            },
+		            fail(res) {
+		                uni.showModal({
+		                    content: "登录失败,请稍后重试。",
+		                    showCancel: false
+		                });
+		            }
+		        })
+		    } else {
+		        // 如果希望用户在最新版本的客户端上体验您的小程序,可以这样提示
+		        that.checkEdition();
+		        return;
+		    }
+		},
+		// 获取data
+		setData(callback){
+		    var that = this;
+		    // 如果改为unionid注册时以下代码加上注释
+		    uni.getUserProfile({
+		        desc: '获取用户注册信息',
+		    	lang:'zh_CN',
+		        success: function (res) {
+		            var userinfo = {
+		                nickname: res.userInfo.nickName ? util.emoji_utf16toEntities(res.userInfo.nickName) : '',
+		                headimgurl: res.userInfo.avatarUrl || '',
+		                sex: res.userInfo.gender == 2 ? '女' : '男',
+		                city: res.userInfo.city || '',
+		                province: res.userInfo.province || '',
+		                country: res.userInfo.country || ''
+		            };
+		            that.globalData.systemUserInfo = userinfo;
+		            var data = {
+		                agentId: that.globalData.agentId,
+		                openid: that.globalData.openId,
+		                ...userinfo
+		            };
+		    		let isdata=1
+		            that.setUnionidApi(data,isdata, callback);
+		        },
+		        fail: function (res) {
+		            console.log(res);
+		        }
+		    })
+		},
+		setUnionid:function(callback){
+			var that=this
+			// 如果改为unionid注册时以下代码去掉注释
+			uni.login({
+			    success: function (obj) {
+			        if (obj.code) {
+			            uni.getUserInfo({
+			                withCredentials: true,
+			                success: function (res) {
+			                    var data = {
+			                        agentId: that.globalData.agentId,
+			                        code: obj.code,
+			                        encryptedData: res.encryptedData,
+			                        iv: res.iv
+			                    };
+			                    let isUnionid=2
+			                    that.setUnionidApi(data,isUnionid, callback);
+			                },
+			                fail: function (res) {
+			                    console.log("unionid授权失败:" + res);
+			                }
+			            })
+			        }else{
+			            console.log("unionid登录code获取失败:" + obj);
+			        }
+			    },
+			    fail: function (obj) {
+			        console.log("unionid登录code获取失败:" + obj);
+			    }
+			})
+		},
+		setUnionidApi(data = this.parameter("data"),is, callback){
+		    var that = this;
+			if(is==1){
+				uni.request({
+				    url: this.globalData.ShopUrl + 'login/data', // 如果改为unionid注册时改回'login/addUnionid'接口
+				    method: 'POST',
+				    header: this.globalData.interfaceheader,
+				    data: data,
+				    success: function (res) {
+				        if (res.data.status == 200) { //登录成功
+				            var userInfo = that.globalData.systemUserInfo;
+				            userInfo = res.data.userInfo;
+				            that.globalData.systemUserInfo = userInfo;
+				            uni.setStorage({
+				                key: 'systemUserInfo',
+				                data: userInfo
+				            })
+				            if (callback) {
+				                callback(userInfo.userId);
+				            }
+				        } else {
+				            uni.hideLoading();
+				            console.log(res.data.msg || "保存信息接口失败");
+				        }
+				    }
+				})
+			}else if(is==2){
+				uni.request({
+				    url: this.globalData.miniShopUrl + 'login/addUnionid', 
+				    method: 'POST',
+				    header: this.globalData.interfaceheader,
+				    data: data,
+				    success: function (res) {
+				        if (res.data.status == 200) { //登录成功
+				            var userInfo = that.globalData.systemUserInfo;
+				            userInfo = res.data.userInfo;
+				            that.globalData.systemUserInfo = userInfo;
+				            // var userinfo = res.data.userInfo;
+				            // that.globalData.systemUserInfo = userinfo;
+				            uni.setStorage({
+				                key: 'systemUserInfo',
+				                data: userInfo
+				            })
+				            if (callback) {
+				                callback(userInfo.userId);
+				            }
+				        } else {
+				            uni.hideLoading();
+				            console.log(res.data.msg||"保存unionid接口失败");
+				            // console.log(res.data.msg || "保存信息接口失败");
+				        }
+				    }
+				})
+			}
+		},
+		errTips(msg, duration, open){
+		    uni.showToast({
+		        title: msg,
+		        icon:'none',
+		        duration: duration ? duration : 1200,
+		        mask: true
+		    })
+		},
+		// 接口未传递有效参数值的错误提示
+		parameter(authName) {
+		    throw new Error("'" + authName + "' cat\'t be empty!");
+		},
+		onLaunch: function() {
+			var logs = uni.getStorageSync('logs') || []
+			logs.unshift(Date.now())
+			uni.setStorageSync('logs', logs);
+			uni.setStorageSync('mallName', "数字茶城");
+		},
+		onShow: function() {
+			console.log('App Show')
+		},
+		onHide: function() {
+			console.log('App Hide')
+		}
+	}
 </script>
 
-<style lang="scss">
-/* 注意要写在第一行,同时给style标签加入lang="scss"属性 */
-// @import "uview-ui/index.scss";
-@import "./app.scss";
+<style>
+	/*每个页面公共css */
+	@import "./app.scss";
 </style>

+ 41 - 28
src/pages/my/index.vue

@@ -131,7 +131,7 @@
             url="/pages/top-up/index"
             hover-class="none"
           >
-            <image class="fun_img" src="/static/recharge.png" mode=""></image>
+            <image class="fun_img" src="/static/my/recharge.png" mode=""></image>
             <view class="fun_text">充值</view>
           </navigator>
           <navigator
@@ -139,7 +139,7 @@
             url="/pages/wealth/index"
             hover-class="none"
           >
-            <image class="fun_img" src="/static/wealth.png" mode=""></image>
+            <image class="fun_img" src="/static/my/wealth.png" mode=""></image>
             <view class="fun_text">财富</view>
           </navigator>
           <navigator
@@ -147,7 +147,7 @@
             url="/pages/consign-list/index"
             hover-class="none"
           >
-            <image class="fun_img" src="/static/consign.png" mode=""></image>
+            <image class="fun_img" src="/static/my/consign.png" mode=""></image>
             <view class="fun_text">寄售</view>
           </navigator>
           <navigator
@@ -155,7 +155,7 @@
             url="/pages/give/index"
             hover-class="none"
           >
-            <image class="fun_img" src="/static/give.png" mode=""></image>
+            <image class="fun_img" src="/static/my/give.png" mode=""></image>
             <view class="fun_text">赠送</view>
           </navigator>
         </view>
@@ -170,7 +170,7 @@
           >
             <image
               class="fun_img"
-              src="/static/pintaun_icon.png"
+              src="/static/my/pintaun_icon.png"
               mode=""
             ></image>
             <view class="fun_text">我的拼团</view>
@@ -180,7 +180,7 @@
             url="/pages/group-list/index"
             hover-class="none"
           >
-            <image class="fun_img" src="/static/my_pintuan.png" mode=""></image>
+            <image class="fun_img" src="/static/my/my_pintuan.png" mode=""></image>
             <view class="fun_text">发起拼团</view>
           </navigator>
           <navigator
@@ -190,7 +190,7 @@
           >
             <image
               class="fun_img"
-              src="/static/dingdan_icon.png"
+              src="/static/my/dingdan_icon.png"
               mode=""
             ></image>
             <view class="fun_text">拼团订单</view>
@@ -202,7 +202,7 @@
           >
             <image
               class="fun_img"
-              src="/static/pintaunjin_icon.png"
+              src="/static/my/pintaunjin_icon.png"
               mode=""
             ></image>
             <view class="fun_text">拼团金明细</view>
@@ -217,7 +217,7 @@
             url="/pages/fund-list/index"
             hover-class="none"
           >
-            <image class="fun_img" src="/static/fund.png" mode=""></image>
+            <image class="fun_img" src="/static/my/fund.png" mode=""></image>
             <view class="fun_text">流水明细</view>
           </navigator>
           <navigator
@@ -225,7 +225,7 @@
             url="/pages/withdraw-list/index"
             hover-class="none"
           >
-            <image class="fun_img" src="/static/withdraw.png" mode=""></image>
+            <image class="fun_img" src="/static/my/withdraw.png" mode=""></image>
             <view class="fun_text">提现明细</view>
           </navigator>
           <navigator
@@ -233,7 +233,7 @@
             url="/pages/top-up-list/index"
             hover-class="none"
           >
-            <image class="fun_img" src="/static/topup.png" mode=""></image>
+            <image class="fun_img" src="/static/my/topup.png" mode=""></image>
             <view class="fun_text">充值明细</view>
           </navigator>
           <navigator
@@ -241,7 +241,7 @@
             url="/pages/sign-list/index"
             hover-class="none"
           >
-            <image class="fun_img" src="/static/inte-list.png" mode=""></image>
+            <image class="fun_img" src="/static/my/inte-list.png" mode=""></image>
             <view class="fun_text">积分明细</view>
           </navigator>
         </view>
@@ -254,7 +254,7 @@
             url="/pages/szw-order-list/index?status=1"
             hover-class="none"
             >全部订单
-            <image class="more_img" src="/static/more.png" mode=""></image>
+            <image class="more_img" src="/static/my/more.png" mode=""></image>
           </navigator>
         </view>
         <view class="fun_con mar_t50 flex_r flex_ac flex_jb">
@@ -263,7 +263,7 @@
             url="/pages/szw-order-list/index?status=2"
             hover-class="none"
           >
-            <image class="fun_img" src="/static/payment.png" mode=""></image>
+            <image class="fun_img" src="/static/my/payment.png" mode=""></image>
             <view class="fun_text">待付款</view>
           </navigator>
           <navigator
@@ -271,7 +271,7 @@
             url="/pages/szw-order-list/index?status=3"
             hover-class="none"
           >
-            <image class="fun_img" src="/static/deliver.png" mode=""></image>
+            <image class="fun_img" src="/static/my/deliver.png" mode=""></image>
             <view class="fun_text">待发货</view>
           </navigator>
           <navigator
@@ -279,7 +279,7 @@
             url="/pages/szw-order-list/index?status=4"
             hover-class="none"
           >
-            <image class="fun_img" src="/static/take.png" mode=""></image>
+            <image class="fun_img" src="/static/my/take.png" mode=""></image>
             <view class="fun_text">待收货</view>
           </navigator>
           <navigator
@@ -287,7 +287,7 @@
             url="/pages/szw-order-list/index?status=5"
             hover-class="none"
           >
-            <image class="fun_img" src="/static/evaluate.png" mode=""></image>
+            <image class="fun_img" src="/static/my/evaluate.png" mode=""></image>
             <view class="fun_text">待评价</view>
           </navigator>
           <navigator
@@ -295,7 +295,7 @@
             url="/pages/order-refund-list/index?status=5"
             hover-class="none"
           >
-            <image class="fun_img" src="/static/refund.png" mode=""></image>
+            <image class="fun_img" src="/static/my/refund.png" mode=""></image>
             <view class="fun_text">退换货</view>
           </navigator>
         </view>
@@ -308,7 +308,7 @@
             url="/pages/about/index"
             hover-class="none"
           >
-            <image class="fun_img" src="/static/about.png" mode=""></image>
+            <image class="fun_img" src="/static/my/about.png" mode=""></image>
             <view class="fun_text">关于我们</view>
           </navigator>
           <navigator
@@ -316,7 +316,7 @@
             url="/pages/notice/index"
             hover-class="none"
           >
-            <image class="fun_img" src="/static/feedback.png" mode=""></image>
+            <image class="fun_img" src="/static/my/feedback.png" mode=""></image>
             <view class="fun_text">用户须知</view>
           </navigator>
           <navigator
@@ -324,7 +324,7 @@
             url="/pages/course/index"
             hover-class="none"
           >
-            <image class="fun_img" src="/static/green.png" mode=""></image>
+            <image class="fun_img" src="/static/my/green.png" mode=""></image>
             <view class="fun_text">新手教程</view>
           </navigator>
           <view class="fun_list flex_c flex_ac">
@@ -332,7 +332,7 @@
               open-type="contact"
               style="background: #fff; border: 0; line-height: 1; padding: 0"
             >
-              <image class="fun_img" src="/static/service.png" mode=""></image>
+              <image class="fun_img" src="/static/my/service.png" mode=""></image>
               <view class="fun_text">在线客服</view>
             </button>
           </view>
@@ -356,11 +356,12 @@
 <script>
 let page = 1;
 let app = getApp();
-let reqApi = new ReqApi();
+// let reqApi = new ReqApi();
 var appEv = app.$vm.$options;
 // import { ReqApi } from "@/utils/reqTools.js";
 import authorizeModule from "@/components/authorize-module/index";
 // import uniCopy from "@/js_sdk/xb-copy/uni-copy.js";
+import { get, post } from "@/request/api.js";
 export default {
   components: {
     authorizeModule,
@@ -397,14 +398,26 @@ export default {
         ? app.globalData.systemUserInfo.userId
         : "";
     if (!userId || userId == "" || userId == undefined) {
+      // #ifdef  MP-WEIXIN
       that.showAuth = true;
       appEv.authorizeUserInfo((res) => {
         if (res) {
           that.shopInfo = app.globalData.shopInfo;
+
           that.showAuth = false;
           that.loadData();
         }
       });
+      // #endif
+
+      // #ifdef  H5 APP-PLUS
+      uni.showToast({
+        title: "跳转登录页",
+        icon: "none",
+        duration: 1200,
+        mask: true,
+      });
+      // #endif
     } else {
       this.loadData();
     }
@@ -530,11 +543,11 @@ export default {
     },
     // 复制账号
     copyText: function (e) {
-    //   uniCopy({
-    //     content: e,
-    //     success: (res) => {},
-    //     error: (e) => {},
-    //   });
+      //   uniCopy({
+      //     content: e,
+      //     success: (res) => {},
+      //     error: (e) => {},
+      //   });
     },
     // 跳转到用户设置页面
     getToSetting: function () {

二進制
src/static/my/about.png


二進制
src/static/my/consign.png


二進制
src/static/my/deliver.png


二進制
src/static/my/dingdan_icon.png


二進制
src/static/my/evaluate.png


二進制
src/static/my/feedback.png


二進制
src/static/my/fund.png


二進制
src/static/my/give.png


二進制
src/static/my/green.png


二進制
src/static/my/inte-list.png


二進制
src/static/my/more.png


二進制
src/static/my/my_pintuan.png


二進制
src/static/my/payment.png


二進制
src/static/my/pindou_icon.png


二進制
src/static/my/pintaun_icon.png


二進制
src/static/my/pintaunjin_icon.png


二進制
src/static/my/recharge.png


二進制
src/static/my/refund.png


二進制
src/static/my/service.png


二進制
src/static/my/take.png


二進制
src/static/my/topup.png


二進制
src/static/my/wealth.png


二進制
src/static/my/withdraw.png


+ 561 - 0
src/utils/utils.js

@@ -0,0 +1,561 @@
+// 比较微信版本v1:用户当前版本;v2:当前程序所需要求兼容的版本
+function compareVersion(v1, v2) {
+    v1 = v1.split('.')
+    v2 = v2.split('.')
+    const len = Math.max(v1.length, v2.length)
+
+    while (v1.length < len) {
+        v1.push('0')
+    }
+    while (v2.length < len) {
+        v2.push('0')
+    }
+
+    for (let i = 0; i < len; i++) {
+        const num1 = parseInt(v1[i])
+        const num2 = parseInt(v2[i])
+
+        if (num1 > num2) {
+            return 1
+        } else if (num1 < num2) {
+            return -1
+        }
+    }
+
+    return 0
+}
+
+/* 系统当前日期+时间 */
+function formatTime(date) {
+    var year = date.getFullYear()
+    var month = date.getMonth() + 1
+    var day = date.getDate()
+
+    var hour = date.getHours()
+    var minute = date.getMinutes()
+    var second = date.getSeconds()
+
+
+    return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')
+}
+
+function formatTime2(date) {
+    var year = date.getFullYear()
+    var month = date.getMonth() + 1
+    var day = date.getDate()
+
+
+    return [year, month, day].map(formatNumber).join('-')
+}
+
+function formatTime3(number, format) {
+
+    var formateArr = ['Y', 'M', 'D', 'h', 'm', 's'];
+    var returnArr = [];
+
+    var date = new Date(number * 1000);
+    returnArr.push(date.getFullYear());
+    returnArr.push(formatNumber(date.getMonth() + 1));
+    returnArr.push(formatNumber(date.getDate()));
+
+    returnArr.push(formatNumber(date.getHours()));
+    returnArr.push(formatNumber(date.getMinutes()));
+    returnArr.push(formatNumber(date.getSeconds()));
+
+    for (var i in returnArr) {
+        format = format.replace(formateArr[i], returnArr[i]);
+    }
+    return format;
+}
+
+function formatNumber(n) {
+    n = n.toString()
+    return n[1] ? n : '0' + n
+}
+/* 日期转时间戳 */
+function timeToUnix(stringTime) {
+    if (stringTime) {
+        var timestamp = Date.parse(new Date(stringTime));
+    } else {
+        var timestamp = Date.parse(new Date());
+    }
+    timestamp = timestamp / 1000;
+    return timestamp;
+}
+/* 倒计时:时+分+秒 */
+function changeTimeStamp(timeStamp, hasTimeRemaining) {
+	var distancetime;
+	if(hasTimeRemaining){
+		distancetime = timeStamp;
+	}else{
+		var curTimeStamp = timeToUnix();
+		distancetime = parseInt(timeStamp) - curTimeStamp;
+	}
+    
+
+    if (distancetime > 0) {
+        //如果大于0.说明尚未到达截止时间       
+        var day = Math.floor(distancetime / (60 * 60 * 24));
+        var hour = Math.floor(distancetime / (60 * 60)) - (day * 24);
+        var minute = Math.floor(distancetime / 60) - (day * 24 * 60) - (hour * 60);
+        var second = Math.floor(distancetime) - (day * 24 * 60 * 60) - (hour * 60 * 60) - (minute * 60);
+
+        hour = parseInt(hour) + parseInt(day) * 24;
+        if (hour < 10) {
+            hour = "0" + hour;
+        }
+        if (minute < 10) {
+            minute = "0" + minute;
+        }
+        if (second < 10) {
+            second = "0" + second;
+        }
+
+        return [hour, minute, second];
+    } else {
+        return false
+    }
+}
+
+// md5
+function md5(string) {
+    var x = Array();
+    var k, AA, BB, CC, DD, a, b, c, d;
+    var S11 = 7,
+        S12 = 12,
+        S13 = 17,
+        S14 = 22;
+    var S21 = 5,
+        S22 = 9,
+        S23 = 14,
+        S24 = 20;
+    var S31 = 4,
+        S32 = 11,
+        S33 = 16,
+        S34 = 23;
+    var S41 = 6,
+        S42 = 10,
+        S43 = 15,
+        S44 = 21;
+    string = Utf8Encode(string);
+    x = ConvertToWordArray(string);
+    a = 0x67452301;
+    b = 0xEFCDAB89;
+    c = 0x98BADCFE;
+    d = 0x10325476;
+    for (k = 0; k < x.length; k += 16) {
+        AA = a;
+        BB = b;
+        CC = c;
+        DD = d;
+        a = FF(a, b, c, d, x[k + 0], S11, 0xD76AA478);
+        d = FF(d, a, b, c, x[k + 1], S12, 0xE8C7B756);
+        c = FF(c, d, a, b, x[k + 2], S13, 0x242070DB);
+        b = FF(b, c, d, a, x[k + 3], S14, 0xC1BDCEEE);
+        a = FF(a, b, c, d, x[k + 4], S11, 0xF57C0FAF);
+        d = FF(d, a, b, c, x[k + 5], S12, 0x4787C62A);
+        c = FF(c, d, a, b, x[k + 6], S13, 0xA8304613);
+        b = FF(b, c, d, a, x[k + 7], S14, 0xFD469501);
+        a = FF(a, b, c, d, x[k + 8], S11, 0x698098D8);
+        d = FF(d, a, b, c, x[k + 9], S12, 0x8B44F7AF);
+        c = FF(c, d, a, b, x[k + 10], S13, 0xFFFF5BB1);
+        b = FF(b, c, d, a, x[k + 11], S14, 0x895CD7BE);
+        a = FF(a, b, c, d, x[k + 12], S11, 0x6B901122);
+        d = FF(d, a, b, c, x[k + 13], S12, 0xFD987193);
+        c = FF(c, d, a, b, x[k + 14], S13, 0xA679438E);
+        b = FF(b, c, d, a, x[k + 15], S14, 0x49B40821);
+        a = GG(a, b, c, d, x[k + 1], S21, 0xF61E2562);
+        d = GG(d, a, b, c, x[k + 6], S22, 0xC040B340);
+        c = GG(c, d, a, b, x[k + 11], S23, 0x265E5A51);
+        b = GG(b, c, d, a, x[k + 0], S24, 0xE9B6C7AA);
+        a = GG(a, b, c, d, x[k + 5], S21, 0xD62F105D);
+        d = GG(d, a, b, c, x[k + 10], S22, 0x2441453);
+        c = GG(c, d, a, b, x[k + 15], S23, 0xD8A1E681);
+        b = GG(b, c, d, a, x[k + 4], S24, 0xE7D3FBC8);
+        a = GG(a, b, c, d, x[k + 9], S21, 0x21E1CDE6);
+        d = GG(d, a, b, c, x[k + 14], S22, 0xC33707D6);
+        c = GG(c, d, a, b, x[k + 3], S23, 0xF4D50D87);
+        b = GG(b, c, d, a, x[k + 8], S24, 0x455A14ED);
+        a = GG(a, b, c, d, x[k + 13], S21, 0xA9E3E905);
+        d = GG(d, a, b, c, x[k + 2], S22, 0xFCEFA3F8);
+        c = GG(c, d, a, b, x[k + 7], S23, 0x676F02D9);
+        b = GG(b, c, d, a, x[k + 12], S24, 0x8D2A4C8A);
+        a = HH(a, b, c, d, x[k + 5], S31, 0xFFFA3942);
+        d = HH(d, a, b, c, x[k + 8], S32, 0x8771F681);
+        c = HH(c, d, a, b, x[k + 11], S33, 0x6D9D6122);
+        b = HH(b, c, d, a, x[k + 14], S34, 0xFDE5380C);
+        a = HH(a, b, c, d, x[k + 1], S31, 0xA4BEEA44);
+        d = HH(d, a, b, c, x[k + 4], S32, 0x4BDECFA9);
+        c = HH(c, d, a, b, x[k + 7], S33, 0xF6BB4B60);
+        b = HH(b, c, d, a, x[k + 10], S34, 0xBEBFBC70);
+        a = HH(a, b, c, d, x[k + 13], S31, 0x289B7EC6);
+        d = HH(d, a, b, c, x[k + 0], S32, 0xEAA127FA);
+        c = HH(c, d, a, b, x[k + 3], S33, 0xD4EF3085);
+        b = HH(b, c, d, a, x[k + 6], S34, 0x4881D05);
+        a = HH(a, b, c, d, x[k + 9], S31, 0xD9D4D039);
+        d = HH(d, a, b, c, x[k + 12], S32, 0xE6DB99E5);
+        c = HH(c, d, a, b, x[k + 15], S33, 0x1FA27CF8);
+        b = HH(b, c, d, a, x[k + 2], S34, 0xC4AC5665);
+        a = II(a, b, c, d, x[k + 0], S41, 0xF4292244);
+        d = II(d, a, b, c, x[k + 7], S42, 0x432AFF97);
+        c = II(c, d, a, b, x[k + 14], S43, 0xAB9423A7);
+        b = II(b, c, d, a, x[k + 5], S44, 0xFC93A039);
+        a = II(a, b, c, d, x[k + 12], S41, 0x655B59C3);
+        d = II(d, a, b, c, x[k + 3], S42, 0x8F0CCC92);
+        c = II(c, d, a, b, x[k + 10], S43, 0xFFEFF47D);
+        b = II(b, c, d, a, x[k + 1], S44, 0x85845DD1);
+        a = II(a, b, c, d, x[k + 8], S41, 0x6FA87E4F);
+        d = II(d, a, b, c, x[k + 15], S42, 0xFE2CE6E0);
+        c = II(c, d, a, b, x[k + 6], S43, 0xA3014314);
+        b = II(b, c, d, a, x[k + 13], S44, 0x4E0811A1);
+        a = II(a, b, c, d, x[k + 4], S41, 0xF7537E82);
+        d = II(d, a, b, c, x[k + 11], S42, 0xBD3AF235);
+        c = II(c, d, a, b, x[k + 2], S43, 0x2AD7D2BB);
+        b = II(b, c, d, a, x[k + 9], S44, 0xEB86D391);
+        a = AddUnsigned(a, AA);
+        b = AddUnsigned(b, BB);
+        c = AddUnsigned(c, CC);
+        d = AddUnsigned(d, DD);
+    }
+    var temp = WordToHex(a) + WordToHex(b) + WordToHex(c) + WordToHex(d);
+    return temp.toUpperCase();
+}
+
+function RotateLeft(lValue, iShiftBits) {
+    return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits));
+}
+
+function AddUnsigned(lX, lY) {
+    var lX4, lY4, lX8, lY8, lResult;
+    lX8 = (lX & 0x80000000);
+    lY8 = (lY & 0x80000000);
+    lX4 = (lX & 0x40000000);
+    lY4 = (lY & 0x40000000);
+    lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF);
+    if (lX4 & lY4) {
+        return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
+    }
+    if (lX4 | lY4) {
+        if (lResult & 0x40000000) {
+            return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
+        } else {
+            return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
+        }
+    } else {
+        return (lResult ^ lX8 ^ lY8);
+    }
+}
+
+function F(x, y, z) {
+    return (x & y) | ((~x) & z);
+}
+
+function G(x, y, z) {
+    return (x & z) | (y & (~z));
+}
+
+function H(x, y, z) {
+    return (x ^ y ^ z);
+}
+
+function I(x, y, z) {
+    return (y ^ (x | (~z)));
+}
+
+function FF(a, b, c, d, x, s, ac) {
+    a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
+    return AddUnsigned(RotateLeft(a, s), b);
+}
+
+function GG(a, b, c, d, x, s, ac) {
+    a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
+    return AddUnsigned(RotateLeft(a, s), b);
+}
+
+function HH(a, b, c, d, x, s, ac) {
+    a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
+    return AddUnsigned(RotateLeft(a, s), b);
+}
+
+function II(a, b, c, d, x, s, ac) {
+    a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
+    return AddUnsigned(RotateLeft(a, s), b);
+}
+
+function ConvertToWordArray(string) {
+    var lWordCount;
+    var lMessageLength = string.length;
+    var lNumberOfWords_temp1 = lMessageLength + 8;
+    var lNumberOfWords_temp2 = (lNumberOfWords_temp1 - (lNumberOfWords_temp1 % 64)) / 64;
+    var lNumberOfWords = (lNumberOfWords_temp2 + 1) * 16;
+    var lWordArray = Array(lNumberOfWords - 1);
+    var lBytePosition = 0;
+    var lByteCount = 0;
+    while (lByteCount < lMessageLength) {
+        lWordCount = (lByteCount - (lByteCount % 4)) / 4;
+        lBytePosition = (lByteCount % 4) * 8;
+        lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount) << lBytePosition));
+        lByteCount++;
+    }
+    lWordCount = (lByteCount - (lByteCount % 4)) / 4;
+    lBytePosition = (lByteCount % 4) * 8;
+    lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition);
+    lWordArray[lNumberOfWords - 2] = lMessageLength << 3;
+    lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29;
+    return lWordArray;
+}
+
+function WordToHex(lValue) {
+    var WordToHexValue = "",
+        WordToHexValue_temp = "",
+        lByte, lCount;
+    for (lCount = 0; lCount <= 3; lCount++) {
+        lByte = (lValue >>> (lCount * 8)) & 255;
+        WordToHexValue_temp = "0" + lByte.toString(16);
+        WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length - 2, 2);
+    }
+    return WordToHexValue;
+}
+
+function Utf8Encode(string) {
+    var utftext = "";
+    for (var n = 0; n < string.length; n++) {
+        var c = string.charCodeAt(n);
+        if (c < 128) {
+            utftext += String.fromCharCode(c);
+        } else if ((c > 127) && (c < 2048)) {
+            utftext += String.fromCharCode((c >> 6) | 192);
+            utftext += String.fromCharCode((c & 63) | 128);
+        } else {
+            utftext += String.fromCharCode((c >> 12) | 224);
+            utftext += String.fromCharCode(((c >> 6) & 63) | 128);
+            utftext += String.fromCharCode((c & 63) | 128);
+        }
+    }
+    return utftext;
+}
+// md5 end
+
+// base64_encode
+function base64_encode(str) { // 编码,配合encodeURIComponent使用
+    var c1, c2, c3;
+    var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
+    var i = 0,
+        len = str.length,
+        strin = '';
+    while (i < len) {
+        c1 = str.charCodeAt(i++) & 0xff;
+        if (i == len) {
+            strin += base64EncodeChars.charAt(c1 >> 2);
+            strin += base64EncodeChars.charAt((c1 & 0x3) << 4);
+            strin += "==";
+            break;
+        }
+        c2 = str.charCodeAt(i++);
+        if (i == len) {
+            strin += base64EncodeChars.charAt(c1 >> 2);
+            strin += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
+            strin += base64EncodeChars.charAt((c2 & 0xF) << 2);
+            strin += "=";
+            break;
+        }
+        c3 = str.charCodeAt(i++);
+        strin += base64EncodeChars.charAt(c1 >> 2);
+        strin += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
+        strin += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));
+        strin += base64EncodeChars.charAt(c3 & 0x3F)
+    }
+    return strin
+}
+
+function base64_decode(input) { // 解码,配合decodeURIComponent使用
+    var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
+    var output = "";
+    var chr1, chr2, chr3;
+    var enc1, enc2, enc3, enc4;
+    var i = 0;
+    input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
+    while (i < input.length) {
+        enc1 = base64EncodeChars.indexOf(input.charAt(i++));
+        enc2 = base64EncodeChars.indexOf(input.charAt(i++));
+        enc3 = base64EncodeChars.indexOf(input.charAt(i++));
+        enc4 = base64EncodeChars.indexOf(input.charAt(i++));
+        chr1 = (enc1 << 2) | (enc2 >> 4);
+        chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
+        chr3 = ((enc3 & 3) << 6) | enc4;
+        output = output + String.fromCharCode(chr1);
+        if (enc3 != 64) {
+            output = output + String.fromCharCode(chr2);
+        }
+        if (enc4 != 64) {
+            output = output + String.fromCharCode(chr3);
+        }
+    }
+    return utf8_decode(output);
+}
+
+
+function utf8_decode(utftext) { // utf-8解码
+    var string = '';
+    let i = 0;
+    let c = 0;
+    let c1 = 0;
+    let c2 = 0;
+    while (i < utftext.length) {
+        c = utftext.charCodeAt(i);
+        if (c < 128) {
+            string += String.fromCharCode(c);
+            i++;
+        } else if ((c > 191) && (c < 224)) {
+            c1 = utftext.charCodeAt(i + 1);
+            string += String.fromCharCode(((c & 31) << 6) | (c1 & 63));
+            i += 2;
+        } else {
+            c1 = utftext.charCodeAt(i + 1);
+            c2 = utftext.charCodeAt(i + 2);
+            string += String.fromCharCode(((c & 15) << 12) | ((c1 & 63) << 6) | (c2 & 63));
+            i += 3;
+        }
+    }
+    return string;
+}
+// base64_encode end
+
+// emoji图片表情转表情字符串
+function emoji_utf16toEntities(str='') {
+    var patt = /[\ud800-\udbff][\udc00-\udfff]/g; // 检测utf16字符正则 
+    str = str.replace(patt, function (char) {
+        var H, L, code;
+        if (char.length === 2) {
+            H = char.charCodeAt(0); // 取出高位 
+            L = char.charCodeAt(1); // 取出低位 
+            code = (H - 0xD800) * 0x400 + 0x10000 + L - 0xDC00; // 转换算法 
+            return "&#" + code + ";";
+        } else {
+            return char;
+        }
+    });
+    return str;
+}
+
+// 表情字符串转emoji图片表情
+function emoji_uncodeUtf16(str='') {
+    var reg = /\&#.*?;/g;
+    var result = str.replace(reg, function (char) {
+        var H, L, code;
+        if (char.length == 9) {
+            code = parseInt(char.match(/[0-9]+/g));
+            H = Math.floor((code - 0x10000) / 0x400) + 0xD800;
+            L = (code - 0x10000) % 0x400 + 0xDC00;
+            return unescape("%u" + H.toString(16) + "%u" + L.toString(16));
+        } else {
+            return char;
+        }
+    });
+    return result;
+}
+// 时间戳转日期
+function formatDateTime(timeStamp, type = 'datetime', delimiter = '-') {
+    var date = new Date();
+    // date.setTime(timeStamp / 1000);
+    date.setTime(timeStamp);
+    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 == 'date') {
+        return y + delimiter + m + delimiter + d;
+    }
+    if (type == 'datehm') {
+        return y + delimiter + m + delimiter + d + ' ' + h + ':' + minute;
+    }
+    if (type == 'hz') {
+        return y + "年" + m + "月" + d + '日 ' + h + '时' + minute + '分' + second + '秒';
+    }
+    if (type == 'hzhm') {
+        return y + "年" + m + "月" + d + '日 ' + h + '时' + minute + '分';
+    }
+    return y + delimiter + m + delimiter + d + ' ' + h + ':' + minute + ':' + second;
+};
+/**
+ * canvas绘图相关,把文字转化成只能行数,多余显示省略号
+ * ctx: 当前的canvas
+ * text: 文本
+ * contentWidth: 文本最大宽度
+ * lineNumber: 显示几行
+ */
+function transformContentToMultiLineText(ctx, text='', contentWidth, lineNumber) {
+    var textArray = text.split(""); // 分割成字符串数组
+    var temp = "";
+    var row = [];
+
+    for (var i = 0; i < textArray.length; i++) {
+        if (ctx.measureText(temp).width < contentWidth) {
+            temp += textArray[i];
+        } else {
+            i--; // 这里添加i--是为了防止字符丢失
+            row.push(temp);
+            temp = "";
+        }
+    }
+    row.push(temp);
+
+    // 如果数组长度大于2,则截取前两个
+    if (row.length > lineNumber) {
+        var rowCut = row.slice(0, lineNumber);
+        var rowPart = rowCut[lineNumber-1];
+        var test = "";
+        var empty = [];
+        for (var a = 0; a < rowPart.length; a++) {
+            if (ctx.measureText(test).width < contentWidth) {
+                test += rowPart[a];
+            } else {
+                break;
+            }
+        }
+        empty.push(test); // 处理后面加省略号
+        var group = empty[0] + '...'
+        rowCut.splice(lineNumber - 1, 1, group);
+        row = rowCut;
+    }
+    
+    return row;
+}
+
+/* 保留两位小数 */
+function getTwoFloat(num = 0) {
+    return (Math.round(num * 100) / 100).toFixed(2);
+}
+//验证手机号码
+function checkPhoneNum(str){
+    if (!str || str == '') {
+        return false;
+    }
+    var phoneTest = /(^1[3|4|5|6|7|8|9][0-9]{9}$)/;
+    return phoneTest.test(str);
+}
+
+module.exports = {
+    compareVersion: compareVersion,
+    formatTime: formatTime,
+    formatTime2: formatTime2,
+    formatTime3: formatTime3,
+    unxiNum: timeToUnix,
+    changeTimeStamp: changeTimeStamp,
+    md5: md5,
+    base64_encode,
+    base64_decode,
+    utf8_decode,
+    emoji_utf16toEntities,
+    emoji_uncodeUtf16,
+    formatDateTime,
+    transformContentToMultiLineText,
+    getTwoFloat
+}