twt 3 年之前
當前提交
af6c49fbdd

二進制
.DS_Store


+ 16 - 0
.hbuilderx/launch.json

@@ -0,0 +1,16 @@
+{ // launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/
+  // launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数
+    "version": "0.0",
+    "configurations": [{
+     	"default" : 
+     	{
+     		"launchtype" : "local"
+     	},
+     	"h5" : 
+     	{
+     		"launchtype" : "local"
+     	},
+     	"type" : "uniCloud"
+     }
+    ]
+}

+ 17 - 0
App.vue

@@ -0,0 +1,17 @@
+<script>
+	export default {
+		onLaunch: function() {
+			console.log('App Launch')
+		},
+		onShow: function() {
+			console.log('App Show')
+		},
+		onHide: function() {
+			console.log('App Hide')
+		}
+	}
+</script>
+
+<style>
+	/*每个页面公共css */
+</style>

+ 192 - 0
common/MD5.js

@@ -0,0 +1,192 @@
+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;
+}
+export default {
+  md5: md5
+}

+ 22 - 0
common/common.js

@@ -0,0 +1,22 @@
+
+const isUserId = function() {
+	var userId=uni.getStorageSync("logodata").uid;
+	//console.log("userId---"+userId)
+	if(!userId){
+		   uni.navigateTo({
+			  url:'../login/login'
+		   })
+	 }
+}
+/* const uid =function() {
+	var userId=uni.getStorageSync("logodata").uid;
+	return
+} */
+
+export default {
+    commonData:{
+        companyType:1,
+    },
+    isUserId,
+	
+}

+ 156 - 0
common/request.js

@@ -0,0 +1,156 @@
+const baseUrl = 'http://58.56.15.138:20189/' 
+const burl2='http://58.56.15.138:20187' 
+//const baseUrl = 'http://58.56.15.138:20132/' 
+// const baseUrl = 'https://api.dms.66km.com/'
+
+import md5 from './MD5.js'
+
+
+/* const http = (url = '', date = {}, type = 'POST', header = {
+}) => {
+    return new Promise((resolve, reject) => {
+		console.log(burl2 + url)
+		//header['Content-Type']='application/x-www-form-urlencoded';
+		header['actionFromMiniApp']=1;
+        uni.request({
+            method: type,
+            url: burl2 + url,
+            data: date,
+            header: header,
+            dataType: 'json',         
+        }).then((response) => {
+           setTimeout(function() {
+                uni.hideLoading();
+            }, 200); 
+			  let [error, res] = response;
+			if(res.data.code==403){
+				uni.showToast({
+				     title: res.data.msg,
+				 	 icon:'none',
+				     duration: 3000,
+				 });
+				 uni.clearStorageSync()
+				 uni.navigateTo({
+					url:'../login/login'
+				}) 
+			}else if(res.data.code==409){
+				  getToken(url,date,type,header)
+			}
+          		
+            resolve(res.data);
+        }).catch(error => {
+            let [err, res] = error;
+            reject(err)
+        }) 
+    });
+}
+ */
+
+const http = (url = '', date = {}, type = 'POST', header = {
+}) => {
+    return new Promise((resolve, reject) => {
+		console.log(burl2 + url)
+		header={};
+		const logodata = uni.getStorageSync("logodata");
+		header['token']=logodata.token;
+		header['uid']=logodata.uid; 
+		//header['token']='98A9FED8814B457288166BDF623F33D1';
+		//header['uid']='39415962-C9D3-466D-A73F-5B5429A8DB2A'; 
+		header['Content-Type']='application/x-www-form-urlencoded';
+		//console.log(header)
+        uni.request({
+            method: type,
+            url: baseUrl + url,
+            data: date,
+            header: header,
+            dataType: 'json',         
+        }).then((response) => {
+           /* setTimeout(function() {
+                uni.hideLoading();
+            }, 200); */
+            let [error, res] = response;
+		 
+			if(res.data.code==401||res.data.code==403){
+				 uni.showToast({
+				     title: res.data.msg,
+				 	 icon:'none',
+				     duration: 3000,
+				 });
+				 uni.clearStorageSync()
+				 uni.navigateTo({
+					url:'../login/login'
+				}) 
+			}else if(res.data.code==409){
+				 // getToken(url,date,type,header)
+			}
+            resolve(res.data);
+        }).catch(error => {
+            let [err, res] = error;
+            reject(err)
+        }) 
+    });
+}
+
+function getToken(url,date,type,header){
+	var header={};
+    //var userId=uni.getStorageSync("devData").userId;
+	//var devData=uni.getStorageSync("devData")
+	header['Content-Type']='application/x-www-form-urlencoded';
+	uni.request({
+	    method: "POST",
+	    url: burl2 + '/sys/getTokenByUserID',
+	    data: {
+			userId:userId
+		},
+	    header: header,
+	    dataType: 'json',         
+	}).then((response) => {
+	    let [error, res] = response;
+		var accessToken=res.data.data.accessToken.accessToken;
+		devData.accessToken=accessToken;
+		uni.setStorage({
+			   key: 'devData',
+			   data:devData,
+			   success: function () {
+				   refresh(url,date,type,header) //刷新接口
+			   }
+		 });
+		  // console.log(accessToken)
+	}).catch(error => {
+	   
+	}) 
+}
+
+function refresh(url,date,type,header){
+	uni.request({
+	    method: type,
+	    url: burl2 + url,
+	    data: date,
+	    header: header,
+	    dataType: 'json',         
+	}).then((response) => {
+	   setTimeout(function() {
+	        uni.hideLoading();
+	    }, 200); 
+	    let [error, res] = response;
+	  
+		if(res.data.code==403){
+			uni.showToast({
+			     title: res.data.msg,
+			 	 icon:'none',
+			     duration: 3000,
+			 });
+			 uni.navigateTo({
+				url:'../login/login'
+			}) 
+		}
+	    resolve(res.data);
+	}).catch(error => {
+	    let [err, res] = error;
+	    reject(err)
+	})
+}
+
+export default {
+	http,baseUrl
+}

二進制
components/.DS_Store


+ 187 - 0
components/ay-operate/del_slideLeft.vue

@@ -0,0 +1,187 @@
+<template>
+	<view>
+		<view class="box-slideLeft" >
+			<view class="touch-item touch-slideLeft " @touchstart="touchS" @touchmove="touchM" @touchend="touchE"  :style="item_show.txtStyle">
+				<slot />
+			</view>
+			
+			<view class="touch-item del-box-touch-slideLeft cf-shuCenter"  @click="delItem(item_show)">
+				<view class="iconfont icon-shanchu"></view>
+			</view>
+
+		</view>
+	</view>
+</template>
+
+<script>
+	
+	export default {
+		components: {
+
+		},
+		props: {
+			
+			data_transit: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+			//可不传参
+			item: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+		},
+		computed: {
+
+		},
+		
+		data() {
+			return {
+				
+				item_show : {},
+				delBtnWidth: 60, //删除按钮宽度单位(rpx)
+				startX: '',
+			};
+		},
+		created:function(){
+			//专门处理检查对象中,某字段是否存在的,如果存在返回 true 不存在返回 false
+			let that = this ;
+			let item = that.item ;
+			if(!item.hasOwnProperty("txtStyle")){
+				this.$set(this.item,'txtStyle','');//不需要初始化了
+			}
+			this.item_show = this.item ;
+		},
+		watch: {
+			item(e){
+				this.item_show = e ;
+			},
+		},
+		methods: {
+			//点击删除按钮事件
+			delItem: function(e) {
+				let that = this;
+				let data ={
+					item : e ,
+					data : that.data_transit ,
+				};
+				this.$emit('delItem', data);
+				var txtStyle = "";
+				that.item_show.txtStyle = txtStyle;
+			},
+			touchS: function(e) {
+				let that = this;
+				
+				if (e.touches.length == 1) {
+					//设置触摸起始点水平方向位置
+					this.startX = e.touches[0].clientX
+					
+				}
+			},
+			touchM: function(e) {
+				let that = this;
+				
+				if (e.touches.length == 1) {
+					//手指移动时水平方向位置
+					var moveX = e.touches[0].clientX;
+					//手指起始点位置与移动期间的差值
+					var disX = this.startX - moveX;
+					var delBtnWidth = this.delBtnWidth;
+					var txtStyle = "";
+					if (disX == 0 || disX < 0) { //如果移动距离小于等于0,说明向右滑动,文本层位置不变
+						txtStyle = "left:0px";
+					} else if (disX > 0) { //移动距离大于0,文本层left值等于手指移动距离
+						txtStyle = "left:-" + disX + "px";
+						if (disX >= delBtnWidth) {
+							//控制手指移动距离最大值为删除按钮的宽度
+							txtStyle = "left:-" + delBtnWidth + "px";
+						}
+					}
+					//获取手指触摸的是哪一项
+					
+					that.item_show.txtStyle = txtStyle;
+					
+				}
+			},
+			touchE: function(e) {
+				let that = this;
+				if (e.changedTouches.length == 1) {
+					//手指移动结束后水平位置
+					var endX = e.changedTouches[0].clientX;
+					//触摸开始与结束,手指移动的距离
+					var disX = this.startX - endX;
+					var delBtnWidth = this.delBtnWidth;
+					//如果距离小于删除按钮的1/2,不显示删除按钮
+					var txtStyle = disX > delBtnWidth / 2 ? "left:-" + delBtnWidth + "px" : "left:0px";
+					//获取手指触摸的是哪一项
+					that.item_show.txtStyle = txtStyle;
+					
+				}
+			},
+			
+		}
+
+	}
+</script>
+
+<style lang="scss">
+	@import './iconfont.css';//便于有删除图标
+	
+	.box-slideLeft {
+		view {
+			box-sizing: border-box;
+		}
+		position: relative;
+		overflow: hidden;
+		
+		.touch-item {
+			position: absolute;
+			top: 0;
+		/* 	padding: 10px 10px 10px; */
+			background-color: #FFFFFF;
+			// border-radius: 10px;
+			overflow: hidden;
+		}
+		
+		.touch-slideLeft {
+			position: relative;
+			width: 100%;
+			z-index: 5;
+			transition: left 0.2s ease-in-out;
+			/* white-space: nowrap; */
+			overflow: hidden;
+			text-overflow: ellipsis;
+		}
+		.del-box-touch-slideLeft {
+			right: 0;
+			float: left;
+			width: 70px;
+			height: 100%;
+			line-height: 101px;
+			background-color: red;
+			border-radius: 0 10px 10px 0;
+			color: #fff;
+			font-size: 18px;
+			font-weight: lighter;
+			text-align: center;
+		}
+		.icon-shanchu{
+			font-size: 44upx;
+		}
+		
+		.cf-shuCenter{
+			display: flex;
+			flex-direction: column;
+			justify-content: center;
+			align-items: center;
+			
+		}
+	}
+
+	
+</style>
+

文件差異過大導致無法顯示
+ 252 - 0
components/ay-operate/iconfont.css


+ 676 - 0
components/chose-city/chose-city.vue

@@ -0,0 +1,676 @@
+<template>
+	<view class="chose-city">
+		<view>
+			<view class="status_bar" :style="{height: iStatusBarHeight + 'px'}" v-if="topshow"></view>
+			<view class="nav" v-if="topshow">城市选择
+			  <image src="../../static/img/goback.png" mode="" class="foback" @click="closeModal"></image>
+			</view>
+		</view>
+		<!-- 城市搜索 -->
+		<view class="city-search-wrap">
+			<view class="search">
+				<view class="l-search">
+					<view class="icon-search">
+						<!-- <view class="cuIcon-search"></view> -->
+						<image src="../../static/img/icon_search.png" mode="" class="cuIcon-search"></image>
+					</view>
+					<input class="input-search" type="text" :value="inputValue" placeholder="请输入城市" placeholder-style="color:#8E8F97"
+					 :focus="searchFocus" @input="searchChange" />
+					<text class="clear-input iconfont icon-icon-test" v-if="isClearBtn" @click="inputValue = ''"></text>
+				</view>
+				<view class="r-cancel" @click="closeModal">取消</view>
+			</view>
+			<!-- 搜索列表  -->
+			<view class="reach-content" v-show="inputValue">
+				<block v-show="searchData.length">
+					<view class="li" v-for="item in searchData" :key="item.citycode" @click="selectCity(item)">
+						{{item.name}}
+					</view>
+				</block>
+				<view class="has-no-data" v-show="hasNoData">没有找到匹配数据~</view>
+			</view>
+		</view>
+		<!-- 城市列表 -->
+		<scroll-view class="scroll-view" scroll-y scroll-with-animation="true" enable-back-to-top="true" :scroll-into-view="toIndex"
+		 @scroll="scrollHandle" v-if="!inputValue">
+			<view class="block">
+				<!-- 您所在的地区 -->
+				<view class="area list-item" id="area">
+					<view class="title-wrapp">
+						<view class="c-title">
+							<text class="l">定位城市</text>
+						</view>
+					</view>
+					<view class="ul">
+						<!-- <view class="li now font-clamp" @click="selectCity(myCityObj,'refresh')">
+							<image src="https://fulu-mall.oss-cn-hangzhou.aliyuncs.com/e0e5e497b1714e8fa6135df32e4bf114.png" class="icon"
+							 v-if="hasLocation"></image>
+							<image src="https://fulu-mall.oss-cn-hangzhou.aliyuncs.com/8ed89f5bcaac48c6bd9139261f86c6b6.png" class="icon"
+							 v-else></image>
+							<text class="text">{{ hasLocation ? myCityObj.name:'定位失败' }}</text>
+						</view> -->
+						<view @click="selectCity(citydw)">{{citydw.name}}</view>
+					</view>
+				</view>
+				<!-- 历史记录 -->
+				<!-- <view class="area list-item" id="record" v-if="recordList.length">
+					<view class="title-wrapp">
+						<view class="c-title">
+							<text class="l">历史记录</text>
+						</view>
+					</view>
+					<view class="ul">
+						<view class="li font-clamp" v-for="item in recordList" :key="item.citycode" @click="selectCity(item)">
+							{{ item.name }}
+						</view>
+					</view>
+				</view> -->
+			</view>
+			<!-- 城市列表  -->
+			<view class="city-list">
+				<view class="list list-item" v-for="(item, key) of cityList" :key="key" :id="item.nameType">
+					<view class="c-title">{{ item.nameType }}</view>
+					<view class="item" v-for="innerItem in item.list" :key="innerItem.citycode" @click="selectCity(innerItem)">
+						{{ innerItem.name }}
+					</view>
+				</view>
+			</view>
+		</scroll-view>
+
+		<!-- 字母列表 -->
+		<view class="alphabet" @touchstart="touchStart" @touchend="touchEnd" @touchmove.stop="touchMove">
+			<view v-for="(item, index) in alphabet" :key="index" @touchstart="getLetter" @touchend="setLetter" :id="item">
+				<view class="item" :class="{ active: currentLetter == item }">
+					{{ item == 'area' ? '当前' : item == 'record' ? '历史' : item }}
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import cityJson from '@/static/dataJson/city.json'
+	export default {
+		props:{
+			 topshow:{            //参数名
+			   type:Boolean,      //定义传值的类型
+			   default:false    //参数默认
+			} 
+		},
+		data() {
+			return {
+				isIPX: null,
+				regionId: null, // 区域ID
+				isToggle: true,
+				isReach: false,
+				inputValue: '',
+				searchData: [], // 搜索的数据
+				isClearBtn: false,
+				toIndex: '', // 跳转的索引的字母
+				tipsLetter: '', // 滑动显示字母
+				timer: null,
+				hasNoData: false,
+				searchFocus: false,
+				letterDetails: [],
+				currentLetter: 'area', //默认选择
+				cityArr: [],
+				recordList: [],
+				cityList: [],
+				hasLocation: false,
+				myCityObj: {},
+				alphabet:[],
+				iStatusBarHeight:'',
+				lng:'',
+				lat:'',
+				cityname:'',
+				cityCode:'',
+				citydw:{
+					name:'',
+					citycode:'',
+				}
+			};
+		},
+		mounted() {
+			 this.iStatusBarHeight = uni.getSystemInfoSync().statusBarHeight;
+			this.cityArr = cityJson.data.list
+			if (this.cityArr && this.cityArr[0]) {
+				this.cityArr.map(v => {
+					v.nameType = v.pinyin.substr(0, 1)
+				})
+				this.cityList = this.groupArr(this.cityArr, 'nameType')
+			}
+			this.recordList = cityJson.data.recordList
+			this.alphabet = cityJson.data.alphabet
+			this.getLocation()
+		},
+		watch: {
+			// 城市搜索输入框
+			inputValue(newVal) {
+				this.isClearBtn = newVal ? true : false;
+
+				if (this.timer) {
+					clearTimeout(this.timer);
+				}
+
+				if (!this.inputValue) {
+					this.searchData = [];
+					return;
+				}
+				this.timer = setTimeout(() => {
+					const result = [];
+					this.cityList.map(v => {
+						v.list.forEach((item) => {
+							if (/^[a-zA-Z]+$/.test(item.pinyin) && item.pinyin.toLowerCase().includes(this.inputValue.toLowerCase()) ||
+								item.name.includes(this.inputValue)) {
+								result.push(item);
+							}
+						});
+					})
+					this.searchData = result;
+					if (this.searchData.length === 0) {
+						this.hasNoData = true;
+					} else {
+						this.hasNoData = false;
+					}
+				}, 500);
+			},
+			isReach(val) {
+				this.searchFocus = val;
+			},
+		},
+		methods: {
+			getLocation() {
+				const that = this
+				/* uni.getLocation({
+					// #ifdef MP-ALIPAY
+					type: 'gcj02',
+					// #endif
+					success(res) {
+						console.log('---',res)
+						res.name = res.city
+						res.citycode = res.cityAdcode
+						that.myCityObj = res
+						that.hasLocation = true
+						uni.setStorageSync('nowCityObj', res)
+					},
+					fail(err) {
+						that.hasLocation = false
+						uni.showToast({
+							icon:'none',
+							title: '获取用户定位失败,请手动选择当前城市'
+						})
+					},
+				}) */
+				console.log("定位")
+				uni.getLocation({
+				    type: 'gcj02',
+				    success: function (res) {
+				       console.log(res)
+						that.lng=res.longitude
+						that.lat=res.latitude
+						that.getAdress();
+						
+				    },
+					 fail(err) {
+						console.log(err)
+						 that.cityname=uni.getStorageSync("location").cityname;
+						 that.citydw.name=uni.getStorageSync("location").cityname
+						 that.citydw.citycode=uni.getStorageSync("location").cityCode
+					 }
+				}); 
+			},
+			getAdress(){
+				var location=this.lng+','+this.lat
+				uni.request({
+				    url: 'https://restapi.amap.com/v3/place/around', //仅为示例,并非真实接口地址。
+				    data: {
+				        key: '064b6a4a8ade55656edcde2f528876de',
+						location: location,
+						types:"190000",
+						extensions:"all",
+						radius:100
+				    },
+				    dataType: "json",
+				    success: (res) => {
+				        console.log(res);
+				        this.cityname=res.data.pois[0].cityname;
+						var cityCode=res.data.pois[0].adcode
+						cityCode=cityCode.slice(0, -2)
+						cityCode=cityCode+'00'
+						this.cityCode=cityCode
+						this.citydw.name=this.cityname
+						this.citydw.citycode=this.cityCode
+				    }
+				});
+			},
+			groupArr(list, field) {
+				var fieldList = [],
+					att = [];
+				list.map((e) => {
+					fieldList.push(e[field])
+				})
+				//数组去重
+				fieldList = fieldList.filter((e, i, self) => {
+					return self.indexOf(e) == i
+				})
+				for (var j = 0; j < fieldList.length; j++) {
+					//过滤出匹配到的数据
+					var arr = list.filter((e) => {
+						return e[field] == fieldList[j];
+					})
+					att.push({
+						nameType: arr[0].nameType,
+						list: arr
+					})
+				}
+				return att;
+			},
+			selectCity(item,type) {
+				if(type === 'refresh' && !this.hasLocation){
+					// 获取定位
+					return this.getLocation()
+				}
+				// console.log('选择的城市:', item);
+				uni.setStorageSync('myCityObj', item)
+				this.$emit('selectCity', item)
+				// 当前项目是需要选择到区域,所以选择城市后回到区县的地方
+				this.toIndex = 'area';
+				setTimeout(() => {
+					this.toIndex = '';
+				}, 1000);
+			},
+			closeModal(){
+				this.$emit('closeModal')
+			},
+			//列表滚动,和右边字母表对应
+			scrollHandle(e) {
+				let view = uni.createSelectorQuery().in(this).selectAll('.list-item');
+				view
+					.boundingClientRect((d) => {
+						let top = d[0].top;
+						d.forEach((item) => {
+							item.top = item.top - top;
+							item.bottom = item.bottom - top;
+							this.letterDetails.push({
+								id: item.id,
+								top: item.top,
+								bottom: item.bottom,
+							});
+						});
+					})
+					.exec();
+
+				const scrollTop = e.detail.scrollTop;
+				this.letterDetails.some((item) => {
+					if (scrollTop >= item.top && scrollTop <= item.bottom - 20) {
+						this.currentLetter = item.id;
+						//当前固定用的是粘性定位,如果不用粘性定位,在这里设置
+						return true;
+					}
+				});
+			},
+
+			//搜索
+			searchChange(e) {
+				let {
+					value
+				} = e.detail;
+				this.inputValue = value;
+			},
+			// 触发开始
+			touchStart(e) {
+				// console.log(e);
+			},
+			//移动时
+			touchMove(e) {
+				uni.vibrateShort();
+				let y = e.touches[0].clientY;
+				let offsettop = e.currentTarget.offsetTop;
+
+				//判断选择区域,只在选择区才会生效
+				if (y > offsettop) {
+					let num = parseInt((y - offsettop) / 15); //右边每个字母元素的高度
+					let letter = this.alphabet[num];
+					this.tipsLetter = letter;
+
+					let curentLetter = this.letterTransform(letter);
+					uni.showToast({
+						title: curentLetter,
+						icon: 'none',
+					});
+				}
+			},
+			//触发结束
+			touchEnd() {
+				this.toIndex = this.tipsLetter;
+			},
+			//移动开始获取字母,并放大提示
+			getLetter(e) {
+				uni.vibrateShort();
+				let {
+					id
+				} = e.currentTarget;
+				this.tipsLetter = id;
+
+				let curentLetter = this.letterTransform(id);
+				uni.showToast({
+					title: curentLetter,
+					icon: 'none',
+				});
+			},
+			//移动结束设置字母,赋值到toIndex
+			setLetter() {
+				this.toIndex = this.tipsLetter;
+			},
+
+			//提示字母转换
+			letterTransform(letter) {
+				let str = '';
+				if (letter == 'area') {
+					str = '当前';
+				} else if (letter == 'record') {
+					str = '历史';
+				} else {
+					str = letter;
+				}
+				return str;
+			},
+		},
+	}
+</script>
+
+<style lang="less" scoped>
+	.chose-city {
+		position: fixed;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		z-index: 999;
+		background: #fff;
+	}
+
+	.city-search-wrap {
+		width: 100%;
+		box-sizing: border-box;
+
+		.search {
+			width: 750rpx;
+			height: 110rpx;
+			display: flex;
+			align-items: center;
+			font-size: 28rpx;
+			color: #222;
+			padding: 14rpx 36rpx;
+			box-sizing: border-box;
+			background: #fff;
+
+			.l-search {
+				width: 597rpx;
+				position: relative;
+				height: 72rpx;
+				line-height: 72rpx;
+
+				.icon-search {
+					font-size: 28rpx;
+					position: absolute;
+					left: 0rpx;
+					top: 0;
+					color: #8e8f97;
+					font-weight: 700;
+					height: 72rpx;
+					line-height: 72rpx;
+				}
+				.cuIcon-search{
+					width: 40rpx;
+					height: 40rpx;
+					padding: 20rpx;
+				}
+				.input-search {
+					width: 597rpx;
+					height: 72rpx;
+					box-sizing: border-box;
+					padding: 0 84rpx 0 84rpx;
+					text-align: left;
+					background: #f4f5f9;
+					border-radius: 12rpx;
+					border: 0;
+				}
+
+				.clear-input {
+					font-size: 30rpx;
+					position: absolute;
+					right: 10rpx;
+					top: 50%;
+					transform: translateY(-50%);
+					padding: 10rpx;
+					color: #8e8f97;
+				}
+			}
+
+			.r-cancel {
+				width: 80rpx;
+				box-sizing: border-box;
+				padding-left: 24rpx;
+				font-size: 28rpx;
+				height: 72rpx;
+				line-height: 72rpx;
+				background: transparent;
+				border: 0;
+				color: #519AD2;
+			}
+		}
+	}
+
+	.reach-content {
+		padding-left: 36rpx;
+		box-sizing: border-box;
+		.li {
+			width: 714rpx;
+			font-size: 28rpx;
+			height: 100rpx;
+			line-height: 100rpx;
+			color: #333;
+			position: relative;
+			box-sizing: border-box;
+			border-bottom: 2rpx solid #F5F5F5;
+		}
+	}
+
+	.block {
+		padding: 0 36rpx;
+		box-sizing: border-box;
+	}
+
+	.top-search {
+		line-height: 72rpx;
+		padding: 14rpx 30rpx 0;
+		box-sizing: border-box;
+		margin-bottom: 26rpx;
+
+		.item {
+			background: #F5F5F5;
+			border-radius: 12rpx;
+			font-size: 28rpx;
+			text-align: center;
+			color: #999999;
+			/* #ifdef MP-ALIPAY */
+			height: 72rpx;
+			line-height: 72rpx;
+
+			/* #endif */
+			text {
+				padding-left: 20rpx;
+				color: #c1c2cd;
+				vertical-align: middle;
+				position: relative;
+				top: -4rpx;
+			}
+
+		}
+	}
+
+	.scroll-view {
+		width: 100%;
+		height: calc(100vh - 110rpx);
+		box-sizing: border-box;
+	}
+
+	.area {
+		margin-bottom: 8rpx;
+
+		.title-wrapp {
+			position: sticky;
+			top: 0;
+			left: 0;
+			background: #fff;
+		}
+
+		.c-title {
+			width: 100%;
+			box-sizing: border-box;
+			font-size: 28rpx;
+			color: #999999;
+			margin-bottom: 24rpx;
+			display: inline-flex;
+			justify-content: space-between;
+			align-items: center;
+
+			.r {
+				font-size: 24rpx;
+				color: #8e8f97;
+				display: inline-block;
+				align-items: center;
+
+				.iconfont {
+					font-size: 24rpx;
+				}
+			}
+		}
+
+		.ul {
+			display: flex;
+			flex-wrap: wrap;
+
+			.li {
+				width: 155rpx;
+				padding: 0 10rpx;
+				box-sizing: border-box;
+				height: 72rpx;
+				line-height: 68rpx;
+				text-align: center;
+				font-size: 32rpx;
+				color: #333;
+				border-radius: 8rpx;
+				margin: 0 18rpx 28rpx 0;
+				border: 2rpx solid #E2E2E2;
+
+				&:nth-child(4n) {
+					margin-right: 0;
+				}
+
+				&.now {
+					width: auto;
+					padding: 0 32rpx 0 22rpx;
+
+					.icon {
+						width: 50rpx;
+						height: 50rpx;
+						background-size: 100%;
+						vertical-align: middle;
+						position: relative;
+						top: -4rpx;
+					}
+
+					.text {
+						padding-left: 10rpx;
+					}
+				}
+
+				&.active {
+					font-weight: 500;
+					background: #ffde45;
+				}
+			}
+
+			.hover {
+				background: #ffde45;
+			}
+		}
+	}
+
+	.city-list {
+		width: 750rpx;
+		padding-bottom: 50rpx;
+
+		.c-title {
+			height: 60rpx;
+			line-height: 60rpx;
+			font-size: 30rpx;
+			font-weight: 500;
+			color: #272636;
+			background: #fff;
+			box-sizing: border-box;
+			padding-left: 36rpx;
+			position: sticky;
+			top: 0;
+			left: 0;
+			z-index: 2;
+		}
+
+		.item {
+			width: 714rpx;
+			margin-left: 36rpx;
+			padding: 0 36rpx 0 0;
+			height: 100rpx;
+			line-height: 100rpx;
+			color: #333;
+			font-size: 28rpx;
+			box-sizing: border-box;
+			border-bottom: 2rpx solid #F5F5F5;
+		}
+	}
+
+	.alphabet {
+		position: fixed;
+		right: 0;
+		bottom: 20%;
+		width: calc(750rpx - 680rpx);
+		text-align: center;
+		font-size: 20rpx;
+		font-weight: 700;
+		color: #8e8f97;
+		z-index: 99;
+
+		.item {
+			height: 15px;
+			line-height: 15px;
+		}
+
+		.active {
+			color: #222;
+		}
+	}
+
+	.has-no-data {
+		font-size: 24rpx;
+		text-align: center;
+		color: #8e8f97;
+		margin-top: 50rpx;
+	}
+	.nav{
+		height: 44px;
+		line-height: 44px;
+		text-align: center;
+		font-size: 26rpx;
+		color:#3C3C3C;
+		position: relative;
+	}
+	.foback{
+		position: absolute;
+		width: 15px;
+		height: 15px;
+		left: 24rpx;
+		top: 15px;
+	}
+</style>

+ 47 - 0
components/nodata/nodata.vue

@@ -0,0 +1,47 @@
+<template>
+	<view class="" style="padding-bottom: 20rpx;">
+		
+		<view  class="nodataBox">
+			<image src="../../static/img/nodata.png" mode="widthFix" class="nodataImg"></image>
+			<view class="noTxt">暂无数据</view>
+		</view>
+		
+		
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			
+		}
+	},
+	onLoad(opt) {
+      
+	},
+	onShow() {
+		
+	},
+	methods: {
+		
+	}
+}
+</script>
+
+<style scoped>
+	
+	.nodataImg{
+	  width: 400rpx;
+	  padding-top: 100rpx;
+	}
+	.noTxt{
+		font-size: 36rpx;
+		color: #999999;
+		padding-top: 50rpx;
+	}
+	.nodataBox{
+		text-align: center;
+	}
+	
+</style>

+ 415 - 0
components/timeChose/timeChose.vue

@@ -0,0 +1,415 @@
+<template>
+	<view>
+		<uni-popup ref="popcash" type="bottom" @change="popChange">
+			<view class="pop_phone pop-container">
+				<view class="popup-title">
+					<view class="u-popup-cancel-btn" @click="closepop">取消</view>
+					<view class="u-title">选择时间</view>
+					<view class="u-popup-sure-btn" @click="handleSelectSure">确定</view>
+				</view>
+				<view class="m-select-time">
+					<view @click="timeChose(0)" class="u-time-label" :style="{ color: timeIndex == 0 ? '#f00' : '#666' }">{{ startTimeDisplay }}</view>
+					<view @click="timeChose(1)" class="u-time-label" :style="{ color: timeIndex == 1 ? '#f00' : '#666' }">{{ endTimeDisplay }}</view>
+				</view>
+				<view class="picker-height">
+					<picker-view v-if="visible" class="mpvue-picker-view" :indicator-style="indicatorStyle" :value.async="curData" @change="bindChange">
+						<picker-view-column>
+							<view class="item" v-for="(item, index) in years" :key="index">{{ item }}年</view>
+						</picker-view-column>
+						<picker-view-column>
+							<view class="item" v-for="(item, index) in months" :key="index">{{ item }}月</view>
+						</picker-view-column>
+						<picker-view-column>
+							<view class="item" v-for="(item, index) in days" :key="index">{{ item }}日</view>
+						</picker-view-column>
+					</picker-view>
+				</view>
+			</view>
+		</uni-popup>
+	</view>
+</template>
+
+<script>
+	//import uniPopup from './uni-popup/uni-popup.vue';
+	export default {
+		/* components: {
+			uniPopup
+		}, */
+		props: {
+			isShow: {
+				type: Boolean,
+				default: true
+			}
+		},
+		data() {
+			const currentDate = this.getDate({
+				format: true
+			});
+
+
+			const date = new Date();
+			const years = [];
+			const year = date.getFullYear();
+			const months = [];
+			const month = date.getMonth() + 1;
+			const days = [];
+			const day = date.getDate();
+			for (let i = 1990; i <= date.getFullYear(); i++) {
+				years.push(i);
+			}
+			for (let i = 1; i <= 12; i++) {
+				months.push(i);
+			}
+			for (let i = 1; i <= 31; i++) {
+				days.push(i);
+			}
+			return {
+				startTime: '',
+				endTime: '',
+				startTimeDisplay: '开始时间',
+				endTimeDisplay: '结束时间',
+				timeSelectActive: 1,
+				currentDate: '',
+				date: currentDate,
+				timeIndex: 0,
+
+				years,
+				year,
+				months,
+				month,
+				days,
+				day,
+				curData: [9999, month - 1, day - 1],
+				visible: false,
+				indicatorStyle: `height: ${Math.round(uni.getSystemInfoSync().screenWidth / (750 / 100))}px;`
+			};
+		},
+		watch: {
+			isShow(val) {
+				console.log('---val-----', val);
+				this.$refs.popcash.open();
+			}
+		},
+		mounted() {
+			this.startTimeDisplay = this.getTodayTime();
+			this.endTimeDisplay = this.getTodayTime();
+			// this.startDate = this.getDate('start');
+			// this.endDate = this.getDate('end');
+			this.$refs.popcash.open();
+			this.visible = true;
+			this.timeChose(0);
+
+		},
+		computed: {
+
+		},
+		methods: {
+			//今天的时间
+			getTodayTime() {
+				var day2 = new Date();
+				day2.setTime(day2.getTime());
+				var time = day2.getFullYear() + '-' + this.check0((day2.getMonth() + 1)) + '-' + this.check0(day2.getDate());
+				return time;
+			},
+			check0(num){
+				num = +num;
+				return num > 9 ? num : ('0'+num);
+			},
+			bindChange(e) {
+				const val = e.detail.value;
+				this.curData = val;
+				this.year = this.years[val[0]];
+				this.month = this.months[val[1]];
+				this.day = this.days[val[2]];
+
+				//将选择的年月日变为number形式,便于比较之用
+				var y = parseInt(this.year);
+				var m = parseInt(this.month);
+				var d = parseInt(this.day);
+
+				//选择不同月份显示的天数不同
+				if (m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) {
+					if (this.days.length != 31) {
+						this.days = [];
+						for (let i = 1; i <= 31; i++) {
+							this.days.push(i);
+						}
+					}
+				} else if (m == 4 || m == 6 || m == 9 || m == 11) {
+					if (this.days.length != 30) {
+						this.days = [];
+						for (let i = 1; i <= 30; i++) {
+							this.days.push(i);
+						}
+					}
+				} else if (m == 2) {
+					if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) {
+						//闰年
+						if (this.days.length != 29) {
+							this.days = [];
+							for (let i = 1; i <= 29; i++) {
+								this.days.push(i);
+							}
+						}
+					} else {
+						//平年
+						if (this.days.length != 28) {
+							this.days = [];
+							for (let i = 1; i <= 28; i++) {
+								this.days.push(i);
+							}
+						}
+					}
+				}
+
+				//处理选择今年的情况
+				if (y == this.currentYear) {
+					//最多显示到当前月份
+					if (this.months.length != this.currentMonth) {
+						this.months = [];
+						for (let i = 1; i <= this.currentMonth; i++) {
+							this.months.push(i);
+						}
+					}
+
+					//如果选择的是当前月份,那么日最多显示到今天
+					if (m == this.currentMonth) {
+						if (this.days.length != this.currentDay) {
+							this.days = [];
+							for (let i = 1; i <= this.currentDay; i++) {
+								this.days.push(i);
+							}
+						}
+					}
+				} else {
+					this.months = [];
+					for (let i = 1; i <= 12; i++) {
+						this.months.push(i);
+					}
+				}
+
+				//我的业务中是选择的孩子日期,根据选择的日期可以计算出孩子几岁了😄
+				if (y >= this.currentYear) {
+					this.babyAge = 0;
+				} else {
+					//选择的月份大于当前月份
+					if (m > this.currentMonth) {
+						this.babyAge = this.currentYear - y - 1;
+					} else if (m == this.currentMonth) {
+						if (d > this.currentDay) {
+							this.babyAge = this.currentYear - y - 1;
+						} else {
+							this.babyAge = this.currentYear - y;
+						}
+					} else {
+						this.babyAge = this.currentYear - y;
+					}
+				}
+				
+				this.month = this.check0(this.month);
+				this.day = this.check0(this.day);
+				
+				if (this.timeIndex == 0) {
+					this.startTimeDisplay = this.year.toString() + '-' + this.month.toString() + '-' + this.day.toString();
+				} else {
+					this.endTimeDisplay = this.year.toString() + '-' + this.month.toString() + '-' + this.day.toString()
+				}
+				console.log('当前选中' + this.year.toString() + '-' + this.month.toString() + '-' + this.day.toString());
+			},
+			timeChose(index) {
+				var that = this;
+				this.timeIndex = index;
+				// this.curData = [0,0,0];
+				var date = index === 0 ? this.startTimeDisplay : this.endTimeDisplay;
+				that.curData = that.getCurIndex(date);
+				console.log(this.curData)
+			},
+			getCurIndex(date) {
+				var years = +date.split('-')[0];
+				var months = +date.split('-')[1];
+				var days = +date.split('-')[2];
+
+				return [this.years.indexOf(years), this.months.indexOf(months), this.days.indexOf(days)]
+			},
+			popChange(e) {
+				console.log('----popChange---', e);
+				/* if (!e.show) {
+					var obj = {
+						isclose: true
+					};
+					this.$emit('returnDate', obj);
+				} */
+			},
+			closepop() {
+				this.$refs.popcash.close();
+			},
+			dateMinus(date1, date2) {
+				var sdate = new Date(date1.replace(/-/g, "/"));
+				var now = new Date(date2.replace(/-/g, "/"));
+				var days = now.getTime() - sdate.getTime();
+				var day = parseInt(days / (1000 * 60 * 60 * 24));
+				return day;
+			},
+			startDateChange: function(e) {
+				this.timeIndex = 0;
+				this.startTimeDisplay = e.target.value;
+			},
+			endDateChange: function(e) {
+				this.timeIndex = 1;
+				this.endTimeDisplay = e.target.value;
+			},
+			getDate(type) {
+				const date = new Date();
+				let year = date.getFullYear();
+				let month = date.getMonth() + 1;
+				let day = date.getDate();
+
+				if (type === 'start') {
+					year = year - 50;
+				} else if (type === 'end') {
+					year = year + 2;
+				}
+				month = month > 9 ? month : '0' + month;
+				day = day > 9 ? day : '0' + day;
+				return `${year}-${month}-${day}`;
+			},
+			handleSetActive(active) {
+				this.timeSelectActive = active;
+
+				let time;
+				if (active === 1) {
+					time = this.startTimeDisplay.split('-');
+				} else {
+					time = this.endTimeDisplay.split('-');
+				}
+
+				this.currentDate = new Date(time[0], +time[1] - 1, time[2]);
+			},
+			timeSelectInput(evt) {
+				if (this.timeSelectActive == 1) {
+					this.startTimeDisplay = evt.getValues().join('-');
+				} else if (this.timeSelectActive == 2) {
+					this.endTimeDisplay = evt.getValues().join('-');
+				}
+			},
+			handleSelectSure() {
+				console.log("选择时间")
+				if (this.startTimeDisplay == '开始时间') {
+					uni.showToast({
+						title: '请选择开始时间',
+						icon: 'none'
+					});
+					return;
+				}
+				if (this.endTimeDisplay == '结束时间') {
+					uni.showToast({
+						title: '请选择结束时间',
+						icon: 'none'
+					});
+					return;
+				}
+				var start = this.startTimeDisplay.split('-');
+				var end = this.endTimeDisplay.split('-');
+				var totalDay = 0;
+				if (new Date(start[0], +start[1] - 1, start[2]) > new Date(end[0], +end[1] - 1, end[2])) {
+					this.startTime = this.endTimeDisplay;
+					this.endTime = this.startTimeDisplay;
+					totalDay = this.dateMinus(this.endTimeDisplay, this.startTimeDisplay);
+				} else {
+					this.startTime = this.startTimeDisplay;
+					this.endTime = this.endTimeDisplay;
+					totalDay = this.dateMinus(this.startTimeDisplay, this.endTimeDisplay);
+				}
+				console.log(this.startTime, this.endTime)
+				
+				// if (+totalDay > 31) {
+				// 	uni.showToast({
+				// 		title: '最多可查询31天内的数据',
+				// 		icon: 'none'
+				// 	});
+				// 	return;
+				// }
+				
+				var obj = {
+					startTime: this.startTime,
+					endTime: this.endTime,
+					isclose: false
+				};
+				this.$emit('returnDate', obj);
+				this.$refs.popcash.close();
+			}
+		}
+	};
+</script>
+
+<style scoped lang="scss">
+	.pop-container {
+		height: 700upx;
+		background: #fff;
+	}
+
+	.picker-height {
+		height: 400upx;
+	}
+
+	.popup-title {
+		height: 90rpx;
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+	}
+
+	.u-title {
+		font-size: 30rpx;
+	}
+
+	.u-popup-cancel-btn {
+		color: #999;
+		padding: 0 30rpx;
+		height: 90rpx;
+		line-height: 90rpx;
+	}
+
+	.u-popup-sure-btn {
+		color: #007aff;
+		padding: 0 30rpx;
+		height: 90rpx;
+		line-height: 90rpx;
+	}
+
+	.m-select-time {
+		height: 160rpx;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		font-size: 34rpx;
+	}
+
+	.u-time-label {
+		color: #ccc;
+		width: 220rpx;
+		height: 60rpx;
+		line-height: 60rpx;
+		border-bottom: 1px solid #ccc;
+		text-align: center;
+		margin: 0 40rpx;
+	}
+
+	.mpvue-picker-view {
+		width: 100%;
+		height: 100%;
+		// height: 280upx;
+		background-color: rgba(255, 255, 255, 1);
+
+		.item {
+			text-align: center;
+			width: 100%;
+			height: 100upx;
+			line-height: 100upx;
+			text-overflow: ellipsis;
+			white-space: nowrap;
+			font-size: 30upx;
+		}
+	}
+</style>
+

文件差異過大導致無法顯示
+ 1 - 0
components/tki-float-keyboard/style.css


+ 459 - 0
components/tki-float-keyboard/tki-float-keyboard.vue

@@ -0,0 +1,459 @@
+<template xlang="wxml" minapp="mpvue">
+	<view class="_flkey-body" :class="[keyShowAni?'_floatAniIn':'_floatAniOut']" v-if='keyShow'>
+		<view class="_flkey-bar">
+			<view class="_flkey-bar-l" @tap="_keySwUp" hover-class="_float-hover-c">
+				<view class="_flkey-bar-btn" v-show="mode == 'keyboard' && keyInputSkin">{{isUp?'小写':'大写'}}</view>
+			</view>
+			<view class="_flkey-bar-c">
+				<view class="_flkey-bar-title">{{title}}</view>
+			</view>
+			<view class="_flkey-bar-r" @tap="_keyHide" hover-class="_float-hover-c">
+				<view class="_flkey-bar-btn">完成</view>
+			</view>
+		</view>
+		<view class="_flkey" v-show="mode != 'number'">
+			<view class="_flkey-h" v-show="!keyInputSkin && mode == 'car'">
+				<view class="_flkey-row">
+					<view class="_flkey-i" :class="{'_flkey-noac':!provinceCP_}" :data-ac="provinceCP_" v-for="v in province.row_1" :key="v" :data-v="v" @tap="_keyInput" hover-class="_float-hover-c">
+						<view class="_flkey-i-b">
+							{{v}}
+						</view>
+					</view>
+				</view>
+				<view class="_flkey-row">
+					<view class="_flkey-i" :class="{'_flkey-noac':!provinceCP_}" :data-ac="provinceCP_" v-for="v in province.row_2" :key="v" :data-v="v" @tap="_keyInput" hover-class="_float-hover-c">
+						<view class="_flkey-i-b">
+							{{v}}
+						</view>
+					</view>
+				</view>
+				<view class="_flkey-row">
+					<view class="_flkey-i" :class="{'_flkey-noac':!provinceCP_}" :data-ac="provinceCP_" v-for="v in province.row_3" :key="v" :data-v="v" @tap="_keyInput" hover-class="_float-hover-c">
+						<view class="_flkey-i-b">
+							{{v}}
+						</view>
+					</view>
+				</view>
+				<view class="_flkey-row">
+					<view class="_flkey-i" :class="{'_flkey-noac':!provinceCP_}" :data-ac="provinceCP_" v-for="v in province.row_4" :key="v" :data-v="v" @tap="_keyInput" hover-class="_float-hover-c">
+						<view class="_flkey-i-b">
+							{{v}}
+						</view>
+					</view>
+					<view class="_flkey-i" :class="{'_flkey-noac':!specialCP_}" :data-ac="specialCP_" v-for="v in province.row_5" :key="v" :data-v="v" @tap="_keyInput" hover-class="_float-hover-c">
+						<view class="_flkey-i-b">
+							{{v}}
+						</view>
+					</view>
+				</view>
+			</view>
+			<view class="_flkey-h" v-show="!keyInputSkin && mode == 'keyboard'">
+				<view class="_flkey-row">
+					<view class="_flkey-i" :class="{'_flkey-noac':!symbolCP_}" :data-ac="symbolCP_" v-for="v in symbol.row_1" :key="v" :data-v="v" @tap="_keyInput" hover-class="_float-hover-c">
+						<view class="_flkey-i-b">
+							{{v}}
+						</view>
+					</view>
+				</view>
+				<view class="_flkey-row">
+					<view class="_flkey-i" :class="{'_flkey-noac':!symbolCP_}" :data-ac="symbolCP_" v-for="v in symbol.row_2" :key="v" :data-v="v" @tap="_keyInput" hover-class="_float-hover-c">
+						<view class="_flkey-i-b">
+							{{v}}
+						</view>
+					</view>
+				</view>
+				<view class="_flkey-row">
+					<view class="_flkey-i" :class="{'_flkey-noac':!symbolCP_}" :data-ac="symbolCP_" v-for="v in symbol.row_3" :key="v" :data-v="v" @tap="_keyInput" hover-class="_float-hover-c">
+						<view class="_flkey-i-b">
+							{{v}}
+						</view>
+					</view>
+				</view>
+			</view>
+			<view class="_flkey-n" v-show="keyInputSkin">
+				<view class="_flkey-row">
+					<view class="_flkey-i" :class="{'_flkey-noac':!numCp_}" :data-ac="numCp_" v-for="v in number" :key="v" :data-v="v" @tap="_keyInput" hover-class="_float-hover-c">
+						<view class="_flkey-i-b">
+							{{v}}
+						</view>
+					</view>
+				</view>
+				<view class="_flkey-row">
+					<view class="_flkey-i" :class="{'_flkey-noac':!letterCp_}" :data-ac="letterCp_" v-for="v in letter.row_1" :key="v" :data-v="v" @tap="_keyInput" hover-class="_float-hover-c">
+						<view class="_flkey-i-b">
+							{{v}}
+						</view>
+					</view>
+				</view>
+				<view class="_flkey-row">
+					<view class="_flkey-i" :class="{'_flkey-noac':!letterCp_}" :data-ac="letterCp_" v-for="v in letter.row_2" :key="v" :data-v="v" @tap="_keyInput" hover-class="_float-hover-c">
+						<view class="_flkey-i-b">
+							{{v}}
+						</view>
+					</view>
+				</view>
+				<view class="_flkey-row">
+					<view class="_flkey-i" :class="{'_flkey-noac':!letterCp_}" :data-ac="letterCp_" v-for="v in letter.row_3" :key="v" :data-v="v" @tap="_keyInput" hover-class="_float-hover-c">
+						<view class="_flkey-i-b">
+							{{v}}
+						</view>
+					</view>
+				</view>
+			</view>
+			<view class="_flkey-tool">
+				<view class="_flkey-tool-i tool-i-a" :class="{'_flkey-noac':!swCp_}" @tap="_keyInputSw" hover-class="_float-hover-c">
+					<view class="_flkey-tool-i-b">{{keyInputSkin?swTxtCp_[0]:swTxtCp_[1]}}</view>
+				</view>
+				<view class="_flkey-tool-i tool-i-del" @tap="_keyInputDel" hover-class="_float-hover-c">
+					<view class="_flkey-tool-i-b">删除</view>
+				</view>
+			</view>
+		</view>
+		<view class="_flkey-number" v-show="mode == 'number'">
+			<view class="_flkey-number-row">
+				<view class="_flkey-number-row-i" data-v="1" :class="{'_flkey-noac':!digitCp_}" :data-ac="digitCp_" @tap="_keyInput" hover-class="_float-hover-c">1</view>
+				<view class="_flkey-number-row-i" data-v="2" :class="{'_flkey-noac':!digitCp_}" :data-ac="digitCp_" @tap="_keyInput" hover-class="_float-hover-c">2</view>
+				<view class="_flkey-number-row-i" data-v="3" :class="{'_flkey-noac':!digitCp_}" :data-ac="digitCp_" @tap="_keyInput" hover-class="_float-hover-c">3</view>
+			</view>
+			<view class="_flkey-number-row">
+				<view class="_flkey-number-row-i" data-v="4" :class="{'_flkey-noac':!digitCp_}" :data-ac="digitCp_" @tap="_keyInput" hover-class="_float-hover-c">4</view>
+				<view class="_flkey-number-row-i" data-v="5" :class="{'_flkey-noac':!digitCp_}" :data-ac="digitCp_" @tap="_keyInput" hover-class="_float-hover-c">5</view>
+				<view class="_flkey-number-row-i" data-v="6" :class="{'_flkey-noac':!digitCp_}" :data-ac="digitCp_" @tap="_keyInput" hover-class="_float-hover-c">6</view>
+			</view>
+			<view class="_flkey-number-row">
+				<view class="_flkey-number-row-i" data-v="7" :class="{'_flkey-noac':!digitCp_}" :data-ac="digitCp_" @tap="_keyInput" hover-class="_float-hover-c">7</view>
+				<view class="_flkey-number-row-i" data-v="8" :class="{'_flkey-noac':!digitCp_}" :data-ac="digitCp_" @tap="_keyInput" hover-class="_float-hover-c">8</view>
+				<view class="_flkey-number-row-i" data-v="9" :class="{'_flkey-noac':!digitCp_}" :data-ac="digitCp_" @tap="_keyInput" hover-class="_float-hover-c">9</view>
+			</view>
+			<view class="_flkey-number-row">
+				<view class="_flkey-number-row-i _number-tool" data-v="." :class="{'_flkey-noac':!dotCp_}" :data-ac="dotCp_" @tap="_keyInput" hover-class="_float-hover-c">.</view>
+				<view class="_flkey-number-row-i" data-v="0" :class="{'_flkey-noac':!digitCp_}" :data-ac="digitCp_" @tap="_keyInput" hover-class="_float-hover-c">0</view>
+				<view class="_flkey-number-row-i _number-tool" hover-class="_float-hover-c" @tap="_keyInputDel">删除</view>
+			</view>
+		</view>
+		<view class="_flkey-bot">
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	name: "tki-float-keyboard",
+	props: {
+		'title': {
+			type: [String],
+			default: '',
+		},
+		'type': {
+			type: [Number, String],
+			default: 0,
+		},
+		'mode': {
+			type: [String],
+			default: 'keyboard', // keyboard 普通键盘 car 汽车键盘 number 数字键盘
+		}
+	},
+	data() {
+		return {
+			isUp: false, // 是否是大写
+			swTxt: true, // 键盘切换按钮是否可用
+			keyShow: false,
+			keyShowAni: true, // true 进入 false 隐藏
+			keyInputSkin: true, // true 显示 字母和数字  false 显示汉子
+			symbol: {
+				row_1: ['+', '-', '*', '/', '=', '^', '<', '>', '(', ')'],
+				row_2: ['?', '!', '@', '#', '$', '&', ',', '.', '[', ']'],
+				row_3: [':', ';', '\'', '"', '_', '~', '…'],
+			},
+			province: {
+				row_1: ["京", "津", "沪", "渝", "蒙", "新", "藏", "宁", "桂", "黑"],
+				row_2: ["吉", "辽", "晋", "冀", "青", "鲁", "豫", "苏", "皖", "浙"],
+				row_3: ["闽", "赣", "湘", "鄂", "粤", "琼", "甘", "陕", "云", "贵"],
+				row_4: ["川"],
+				row_5: ["港", "澳", "学", "警", "领", "使"],
+			},
+			number: [1, 2, 3, 4, 5, 6, 7, 8, 9, 0],
+			letter: {
+				row_1: ["Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P"],
+				row_2: ["A", "S", "D", "F", "G", "H", "J", "K", "L"],
+				row_3: ["Z", "X", "C", "V", "B", "N", "M"],
+			},
+			symbolCP_: true,
+			provinceCP_: true,
+			specialCP_: true,
+			numCp_: true,
+			letterCp_: true,
+			digitCp_: true,
+			dotCp_: true,
+			swCp_: true,
+			swTxtCp_: ['省', 'ABC'],
+		}
+	},
+	methods: {
+		_keyInit() {
+			if (this.mode == 'keyboard') {
+				this.isUp = true
+				this._keyTypeWacth(this.keyType)
+				this._keySwUp()
+			}
+			if (this.mode == 'car') {
+				this.isUp = false
+				this._carTypeWacth(this.carType)
+				this._keySwUp()
+			}
+			if (this.mode == 'number') {
+				this._numberTypeWacth(this.numberType)
+			}
+		},
+		_keySwUp(t) {
+			if (this.mode != 'number' && this.keyInputSkin) {
+				// 大小写切换
+				for (const key in this.letter) {
+					if (this.letter.hasOwnProperty(key)) {
+						for (let index = 0; index < this.letter[key].length; index++) {
+							if (!this.isUp) {
+								let tp = this.letter[key][index].toUpperCase()
+								this.letter[key][index] = tp
+							} else {
+								let tp = this.letter[key][index].toLowerCase()
+								this.letter[key][index] = tp
+							}
+						}
+					}
+				}
+				this.isUp = !this.isUp
+			}
+		},
+		_keyInput(e) {
+			let d = e.currentTarget.dataset
+			if (d.ac) {
+				this.$emit('val', String(d.v))
+			}
+		},
+		_keyInputDel() {
+			this.$emit('del', true)
+		},
+		_keyInputSw() {
+			let that = this;
+			if (that.swCp_) {
+				that.keyInputSkin = !that.keyInputSkin
+			}
+		},
+		_keyShow() {
+			let that = this
+			uni.hideKeyboard()
+			that.keyShow = true
+			that.keyShowAni = true
+			setTimeout(() => {
+				uni.createSelectorQuery().in(that).select('._flkey-body').boundingClientRect(function (rect) {
+					that.$emit('show', rect)
+				}).exec()
+			}, 150);
+		},
+		_keyHide() {
+			let that = this
+			that.keyShowAni = false
+			setTimeout(() => {
+				that.$emit('hide', true)
+				that.keyShow = false
+			}, 166);
+		},
+		_carTypeWacth(n) {
+			let v = Number(n)
+			// 0 全部
+			// 1 字母加数字
+			// 2 省
+			// 3 字母加数字加特
+			// 4 字母
+			// 5 数字
+			switch (v) {
+				case 0:
+					this.provinceCP_ = true
+					this.specialCP_ = true
+					this.numCp_ = true
+					this.letterCp_ = true
+					this.swCp_ = true
+					this.swTxtCp_ = ['省', 'ABC']
+					this.keyInputSkin = true
+					break;
+				case 1:
+					this.provinceCP_ = false
+					this.specialCP_ = false
+					this.numCp_ = true
+					this.letterCp_ = true
+					this.swCp_ = false
+					this.swTxtCp_ = ['省', 'ABC']
+					this.keyInputSkin = true
+					break;
+				case 2:
+					this.provinceCP_ = true
+					this.specialCP_ = false
+					this.numCp_ = false
+					this.letterCp_ = false
+					this.swCp_ = false
+					this.swTxtCp_ = ['省', 'ABC']
+					this.keyInputSkin = false
+					break;
+				case 3:
+					this.provinceCP_ = false
+					this.specialCP_ = true
+					this.numCp_ = true
+					this.letterCp_ = true
+					this.swCp_ = true
+					this.swTxtCp_ = ['特', 'ABC']
+					this.keyInputSkin = true
+					break;
+				case 4:
+					this.provinceCP_ = false
+					this.specialCP_ = false
+					this.numCp_ = false
+					this.letterCp_ = true
+					this.swCp_ = false
+					this.swTxtCp_ = ['省', 'ABC']
+					this.keyInputSkin = true
+					break;
+				case 5:
+					this.provinceCP_ = false
+					this.specialCP_ = false
+					this.numCp_ = true
+					this.letterCp_ = false
+					this.swCp_ = false
+					this.swTxtCp_ = ['省', 'ABC']
+					this.keyInputSkin = true
+					break;
+				default:
+					this.provinceCP_ = true
+					this.specialCP_ = true
+					this.numCp_ = true
+					this.letterCp_ = true
+					this.swCp_ = true
+					this.swTxtCp_ = ['省', 'ABC']
+					this.keyInputSkin = true
+					break;
+			}
+		},
+		_keyTypeWacth(n) {
+			let v = Number(n)
+			// 0 全部
+			// 1 字母加数字
+			// 2 符号
+			// 3 字母
+			// 4 数字
+			// 5 字母加符号
+			// 6 数字加符号
+			switch (v) {
+				case 0:
+					this.symbolCP_ = true
+					this.numCp_ = true
+					this.letterCp_ = true
+					this.swCp_ = true
+					this.swTxtCp_ = ['符', 'ABC']
+					this.keyInputSkin = true
+					break;
+				case 1:
+					this.symbolCP_ = false
+					this.numCp_ = true
+					this.letterCp_ = true
+					this.swCp_ = false
+					this.swTxtCp_ = ['符', 'ABC']
+					this.keyInputSkin = true
+					break;
+				case 2:
+					this.symbolCP_ = true
+					this.numCp_ = false
+					this.letterCp_ = false
+					this.swCp_ = false
+					this.swTxtCp_ = ['符', 'ABC']
+					this.keyInputSkin = false
+					break;
+				case 3:
+					this.symbolCP_ = false
+					this.numCp_ = false
+					this.letterCp_ = true
+					this.swCp_ = false
+					this.swTxtCp_ = ['符', 'ABC']
+					this.keyInputSkin = true
+					break;
+				case 4:
+					this.symbolCP_ = false
+					this.numCp_ = true
+					this.letterCp_ = false
+					this.swCp_ = false
+					this.swTxtCp_ = ['符', 'ABC']
+					this.keyInputSkin = true
+					break;
+				case 5:
+					this.symbolCP_ = true
+					this.numCp_ = false
+					this.letterCp_ = true
+					this.swCp_ = true
+					this.swTxtCp_ = ['符', 'ABC']
+					this.keyInputSkin = true
+					break;
+				case 6:
+					this.symbolCP_ = true
+					this.numCp_ = true
+					this.letterCp_ = false
+					this.swCp_ = true
+					this.swTxtCp_ = ['符', 'ABC']
+					this.keyInputSkin = true
+					break;
+				default:
+					this.symbolCP_ = true
+					this.numCp_ = true
+					this.letterCp_ = true
+					this.swCp_ = true
+					this.swTxtCp_ = ['符', 'ABC']
+					this.keyInputSkin = true
+					break;
+			}
+		},
+		_numberTypeWacth(n) {
+			let v = Number(n)
+			// 0 全部
+			// 1 禁用.
+			switch (v) {
+				case 0:
+					this.digitCp_ = true
+					this.dotCp_ = true
+					break;
+				case 1:
+					this.digitCp_ = true
+					this.dotCp_ = false
+					break;
+				default:
+					this.digitCp_ = true
+					this.dotCp_ = true
+					break;
+			}
+		}
+	},
+	computed: {
+	},
+	watch: {
+		type(n, o) {
+			if (this.mode == 'car') {
+				this._carTypeWacth(n)
+			}
+			if (this.mode == 'keyboard') {
+				this._keyTypeWacth(n)
+			}
+			if (this.mode == 'number') {
+				this._numberTypeWacth(n)
+			}
+		},
+		mode(n, o) {
+			if (n != o) {
+				this._keyInit()
+			}
+		}
+	},
+	created() {
+		this._keyInit()
+	},
+}
+</script>
+
+<style>
+@import "style.css";
+</style>

文件差異過大導致無法顯示
+ 1201 - 0
components/tki-qrcode/qrcode.js


+ 210 - 0
components/tki-qrcode/tki-qrcode.vue

@@ -0,0 +1,210 @@
+<template xlang="wxml" minapp="mpvue">
+	<view class="tki-qrcode">
+		<!-- #ifndef MP-ALIPAY -->
+		<canvas class="tki-qrcode-canvas" :canvas-id="cid" :style="{width:cpSize+'px',height:cpSize+'px'}" />
+		<!-- #endif -->
+		<!-- #ifdef MP-ALIPAY -->
+		<canvas :id="cid" :width="cpSize" :height="cpSize" class="tki-qrcode-canvas" />
+		<!-- #endif -->
+		<image v-show="show" :src="result" :style="{width:cpSize+'px',height:cpSize+'px'}" />
+	</view>
+</template>
+
+<script>
+import QRCode from "./qrcode.js"
+let qrcode
+export default {
+	name: "tki-qrcode",
+	props: {
+		cid: {
+			type: String,
+			default: 'tki-qrcode-canvas'
+		},
+		size: {
+			type: Number,
+			default: 200
+		},
+		unit: {
+			type: String,
+			default: 'upx'
+		},
+		show: {
+			type: Boolean,
+			default: true
+		},
+		val: {
+			type: String,
+			default: ''
+		},
+		background: {
+			type: String,
+			default: '#ffffff'
+		},
+		foreground: {
+			type: String,
+			default: '#000000'
+		},
+		pdground: {
+			type: String,
+			default: '#000000'
+		},
+		icon: {
+			type: String,
+			default: ''
+		},
+		iconSize: {
+			type: Number,
+			default: 40
+		},
+		lv: {
+			type: Number,
+			default: 3
+		},
+		onval: {
+			type: Boolean,
+			default: false
+		},
+		loadMake: {
+			type: Boolean,
+			default: false
+		},
+		usingComponents: {
+			type: Boolean,
+			default: true
+		},
+		showLoading: {
+			type: Boolean,
+			default: true
+		},
+		loadingText: {
+			type: String,
+			default: '二维码生成中'
+		},
+	},
+	data() {
+		return {
+			result: '',
+		}
+	},
+	methods: {
+		_makeCode() {
+			let that = this
+			if (!this._empty(this.val)) {
+				qrcode = new QRCode({
+					context: that, // 上下文环境
+					canvasId:that.cid, // canvas-id
+					usingComponents: that.usingComponents, // 是否是自定义组件
+					showLoading: that.showLoading, // 是否显示loading
+					loadingText: that.loadingText, // loading文字
+					text: that.val, // 生成内容
+					size: that.cpSize, // 二维码大小
+					background: that.background, // 背景色
+					foreground: that.foreground, // 前景色
+					pdground: that.pdground, // 定位角点颜色
+					correctLevel: that.lv, // 容错级别
+					image: that.icon, // 二维码图标
+					imageSize: that.iconSize,// 二维码图标大小
+					cbResult: function (res) { // 生成二维码的回调
+						that._result(res)
+					},
+				});
+			} else {
+				uni.showToast({
+					title: '二维码内容不能为空',
+					icon: 'none',
+					duration: 2000
+				});
+			}
+		},
+		_clearCode() {
+			this._result('')
+			qrcode.clear()
+		},
+		_saveCode() {
+			let that = this;
+			if (this.result != "") {
+				uni.saveImageToPhotosAlbum({
+					filePath: that.result,
+					success: function () {
+						uni.showToast({
+							title: '二维码保存成功',
+							icon: 'success',
+							duration: 2000
+						});
+					}
+				});
+			}
+		},
+		_result(res) {
+			this.result = res;
+			this.$emit('result', res)
+		},
+		_empty(v) {
+			let tp = typeof v,
+				rt = false;
+			if (tp == "number" && String(v) == "") {
+				rt = true
+			} else if (tp == "undefined") {
+				rt = true
+			} else if (tp == "object") {
+				if (JSON.stringify(v) == "{}" || JSON.stringify(v) == "[]" || v == null) rt = true
+			} else if (tp == "string") {
+				if (v == "" || v == "undefined" || v == "null" || v == "{}" || v == "[]") rt = true
+			} else if (tp == "function") {
+				rt = false
+			}
+			return rt
+		}
+	},
+	watch: {
+		size: function (n, o) {
+			if (n != o && !this._empty(n)) {
+				this.cSize = n
+				if (!this._empty(this.val)) {
+					setTimeout(() => {
+						this._makeCode()
+					}, 100);
+				}
+			}
+		},
+		val: function (n, o) {
+			if (this.onval) {
+				if (n != o && !this._empty(n)) {
+					setTimeout(() => {
+						this._makeCode()
+					}, 0);
+				}
+			}
+		}
+	},
+	computed: {
+		cpSize() {
+			if(this.unit == "upx"){
+				return uni.upx2px(this.size)
+			}else{
+				return this.size
+			}
+		}
+	},
+	mounted: function () {
+		if (this.loadMake) {
+			if (!this._empty(this.val)) {
+				setTimeout(() => {
+					this._makeCode()
+				}, 0);
+			}
+		}
+	},
+}
+</script>
+<style scoped>
+.tki-qrcode {
+  position: relative;
+}
+.tki-qrcode-canvas {
+  position: fixed;
+  top: -99999upx;
+  left: -99999upx;
+  z-index: -99999;
+}
+</style>

+ 205 - 0
components/vcode-input/vcode-input.vue

@@ -0,0 +1,205 @@
+<template>
+	<view class="vcode-input-body">
+		<text class="vcode-input-item" 
+		:class="isBorderLine?'vcode-input-line':'vcode-input-border'"
+		v-for="(v,index) in sum" 
+		:key="index"
+		@tap.stop="setFocus"
+		:style="{
+			borderColor:text.length===index&&focus?borderActiveColor:(text.length>index?borderValueColor:borderColor),
+			color:text.length>index?borderValueColor:borderColor
+		}"
+		>{{text[index]}}</text>
+		<text class="vcode-input-item" @click="addNum" v-if="addShow">+</text>
+		<view class="hidden-input">
+			<input
+			id="vcodeInput"
+			ref="vcodeInput"
+			type="text" 
+			:show-confirm-bar="false"
+			auto-blur
+			:focus="focus"
+			:maxlength.sync="sum"
+			v-model="value"
+			@blur="setBlur"
+			@focus="setFocus"
+			:password="isPassword"
+			placeholder="验证码"/>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name:'VcodeInput',
+		props: {
+			autofocus:{
+				type: Boolean,
+				default: true
+			},
+			sum:{
+				type: Number,
+				default: 6
+			},
+			isBorderLine:{
+				type:Boolean,
+				default:false
+			},
+			borderColor:{
+				type:String,
+				default:'#DADADA'
+			},
+			borderValueColor:{
+				type:String,
+				default:'#424456'
+			},
+			borderActiveColor:{
+				type:String,
+				default:'#FF6B00'
+			},
+			isAutoComplete:{
+				type: Boolean,
+				default: true
+			},
+			isPassword:{
+				type: Boolean,
+				default: false
+			},
+			plateNumber:{
+				type: String,
+				default: '0'
+			}
+		},
+		data() {
+			return {
+				focus:false,
+				text:[],
+				value:'',
+				addShow:true,
+			};
+		},
+		watch:{
+			value(value,oldVal){
+				if(this.isAutoComplete){
+					if(value.length>=this.sum){
+						this.focus=false;
+						//this.$emit('vcodeInput', value);
+					}
+					if(value.length>=this.sum-1){
+						
+						this.$emit('vcodeInput', value);
+					}
+				}else{
+					this.$emit('vcodeInput', value);
+				}
+				if(this.isPassword){
+					let val='';
+					for (let i = 0; i < value.length; i++) {
+						val+='●';
+					}
+					this.text=val;
+				}else{
+					//console.log(value)
+					this.text=value.split("");
+					//console.log(this.text)
+				}
+			},
+			plateNumber:{
+			  immediate: true, // 很重要!!!
+			  handler (val) {
+				console.log(val.length)
+				var length=val.length;
+				if(length == 7||length == 0){
+					this.addShow=true;
+					console.log(this.addShow)
+					this.$emit('setsum',7)
+				}else{
+					this.addShow=false;
+					this.$emit('setsum',8)
+				}
+				this.value=val;
+				this.text=val.split("");
+			  }
+			}
+	
+		},
+		mounted() {
+			this.$nextTick(() => {
+				this.initInput()
+			})
+		},
+		methods:{
+			addNum(){
+				 //触发一个更新事件
+			    this.$emit('setsum',8)
+				this.addShow=false;
+			},
+			initInput(){
+				if(this.autofocus)
+				this.focus=true;
+				// #ifdef H5
+				this.$refs.vcodeInput.$refs.input.setAttribute('type','number');
+				this.$refs.vcodeInput.$refs.input.setAttribute('pattern','[0-9]*')
+				// #endif
+			},
+			setBlur(){
+				uni.hideKeyboard();
+				this.$nextTick(() => {
+					this.focus=false;
+				})
+			},
+			setFocus(){
+				this.focus=true;
+			},
+			clearValue(){
+				this.setBlur();
+				this.value='';
+				this.text=[];
+				this.$forceUpdate();
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+.vcode-input-body{
+	margin-left: -36rpx;
+	margin-right: -36rpx;
+	position: relative;
+	overflow: hidden;
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	flex-direction: row;
+	justify-content: center;
+	align-items: center;
+}
+.vcode-input-item{
+	width: 60rpx;
+	height: 60rpx;
+	margin-left: 12rpx;
+	margin-right: 12rpx;
+	line-height: 60rpx;
+	text-align: center;
+	font-weight: 500;
+}
+.vcode-input-border{
+	border-style: solid;
+	border-width: 2rpx;
+	border-color: $uni-border-color;
+	border-radius: 4rpx;
+}
+.vcode-input-line{
+	border-bottom-style: solid;
+	border-bottom-width: 2rpx;
+	border-color: $uni-border-color;
+}
+.hidden-input{
+	width: 1px;
+	height: 1px;
+	position: absolute;
+	left: -1px;
+	top: -1px;
+	overflow: hidden;
+}
+</style>

+ 14 - 0
index.html

@@ -0,0 +1,14 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0" />
+    <title></title>
+    <!--preload-links-->
+    <!--app-context-->
+  </head>
+  <body>
+    <div id="app"><!--app-html--></div>
+    <script type="module" src="/main.js"></script>
+  </body>
+</html>

+ 39 - 0
main.js

@@ -0,0 +1,39 @@
+import App from './App'
+
+import request from 'common/request.js'
+import common from 'common/common.js'
+
+
+Vue.prototype.$http = request.http
+Vue.prototype.$request =request
+Vue.prototype.$common =common
+Vue.config.productionTip = false
+
+
+// #ifndef VUE3
+import Vue from 'vue'
+Vue.config.productionTip = false
+App.mpType = 'app'
+const app = new Vue({
+    ...App
+})
+app.$mount()
+// #endif
+
+// #ifdef VUE3
+import { createSSRApp } from 'vue'
+export function createApp() {
+  const app = createSSRApp(App)
+  return {
+    app
+  }
+}
+// #endif
+
+// Vue全局处理undefined和null转为空白字符串
+Vue.prototype.$praseStrEmpty = function(str) {
+    if (typeof str === 'undefined' || str === null) {
+        return "";
+    }
+    return str;
+}

+ 77 - 0
manifest.json

@@ -0,0 +1,77 @@
+{
+    "name" : "txCar",
+    "appid" : "__UNI__FF68191",
+    "description" : "",
+    "versionName" : "1.0.0",
+    "versionCode" : "100",
+    "transformPx" : false,
+    /* 5+App特有相关 */
+    "app-plus" : {
+        "usingComponents" : true,
+        "nvueStyleCompiler" : "uni-app",
+        "compilerVersion" : 3,
+        "splashscreen" : {
+            "alwaysShowBeforeRender" : true,
+            "waiting" : true,
+            "autoclose" : true,
+            "delay" : 0
+        },
+        /* 模块配置 */
+        "modules" : {},
+        /* 应用发布信息 */
+        "distribute" : {
+            /* android打包配置 */
+            "android" : {
+                "permissions" : [
+                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
+                ]
+            },
+            /* ios打包配置 */
+            "ios" : {},
+            /* SDK配置 */
+            "sdkConfigs" : {}
+        }
+    },
+    /* 快应用特有相关 */
+    "quickapp" : {},
+    /* 小程序特有相关 */
+    "mp-weixin" : {
+        "appid" : "wxe008726be8d45bc6",
+        "setting" : {
+            "urlCheck" : false
+        },
+        "usingComponents" : true,
+        "permission" : {
+            "scope.userLocation" : {
+                "desc" : "获取定位"
+            }
+        }
+    },
+    "mp-alipay" : {
+        "usingComponents" : true
+    },
+    "mp-baidu" : {
+        "usingComponents" : true
+    },
+    "mp-toutiao" : {
+        "usingComponents" : true
+    },
+    "uniStatistics" : {
+        "enable" : false
+    },
+    "vueVersion" : "2"
+}

+ 55 - 0
pages.json

@@ -0,0 +1,55 @@
+{
+	"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
+		{
+			"path": "pages/index/index",
+			"style": {
+				"navigationBarTitleText": "填写爱车信息"
+			}
+		},
+		{
+			"path": "pages/shop/shopList",
+			"style": {
+				"navigationBarTitleText": "4S门店"
+			}
+		},
+		{
+			"path": "pages/me/me",
+			"style": {
+				"navigationStyle": "custom" 
+			}
+		}
+	],
+	"tabBar": {
+		"color": "#8a8a8a",
+		"selectedColor": "#FF4F00",
+		"borderStyle": "black",
+		"backgroundColor": "#ffffff",
+		"list": [{
+				"pagePath": "pages/index/index",
+				"iconPath": "static/img/tabme1.png",
+				"selectedIconPath": "static/img/tabme2.png",
+				"text": "4S保养"
+			},
+			
+			{
+				"pagePath": "pages/shop/shopList",
+				"iconPath": "static/img/tabshop1.png",
+				"selectedIconPath": "static/img/tabshop2.png",
+				"text": "4S门店"
+			},
+			{
+				"pagePath": "pages/me/me",
+				"iconPath": "static/img/tabme1.png",
+				"selectedIconPath": "static/img/tabme2.png",
+				"text": "我的"
+			}
+		 
+		]
+	},
+	"globalStyle": {
+		"navigationBarTextStyle": "black",
+		"navigationBarTitleText": "uni-app",
+		"navigationBarBackgroundColor": "#F8F8F8",
+		"backgroundColor": "#F8F8F8"
+	}
+}

+ 52 - 0
pages/index/index.vue

@@ -0,0 +1,52 @@
+<template>
+	<view class="content">
+		<image class="logo" src="/static/logo.png"></image>
+		<view class="text-area">
+			<text class="title">{{title}}</text>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				title: 'Hello'
+			}
+		},
+		onLoad() {
+
+		},
+		methods: {
+
+		}
+	}
+</script>
+
+<style>
+	.content {
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
+	}
+
+	.logo {
+		height: 200rpx;
+		width: 200rpx;
+		margin-top: 200rpx;
+		margin-left: auto;
+		margin-right: auto;
+		margin-bottom: 50rpx;
+	}
+
+	.text-area {
+		display: flex;
+		justify-content: center;
+	}
+
+	.title {
+		font-size: 36rpx;
+		color: #8f8f94;
+	}
+</style>

+ 331 - 0
pages/me/me.vue

@@ -0,0 +1,331 @@
+<template>
+	<view class="box">
+		<!-- <view @click="login">
+			登录
+		</view> -->
+		<view class="headerBox">
+			<view class="headerLeft">
+				<image :src="ueserInfo.memberInfo.headUrl" mode="" class="headerImg" v-if="ueserInfo.memberInfo.headUrl"></image>
+				<!-- <image src="../../static/img/pic_def_ava.png" mode="" class="headerImg" v-else></image> -->
+				
+				<view class="nickName">{{ueserInfo.memberInfo.nickName}}</view>
+			</view>
+			<view>
+				<!-- <image src="../../static/img/icon_set.png" mode="" class="setImg" @click="gonavigateTo('../me/setup')"></image> -->
+			</view>
+		</view>
+
+		<view class="meLineBox2">
+			<view class="meLine2"  @click="gonavigateTo('../me/scGoodsList')">
+			<!-- 	<image src="../../static/img/icon_star.png" mode="" class="maintainBottomImg"></image> -->
+				<view class="maintainBottomTxt">商品收藏</view>
+			</view>
+			<view class="meLine2" @click="gonavigateTo('../me/gzshopList')">
+				<!-- <image src="../../static/img/my_icon_store.png" mode="" class="maintainBottomImg"></image> -->
+				<view class="maintainBottomTxt">门店关注</view>
+			</view>
+			<view class="meLine2" @click="gonavigateTo('../me/footprint')">
+			<!-- 	<image src="../../static/img/my_icon_zuji.png" mode="" class="maintainBottomImg"></image> -->
+				<view class="maintainBottomTxt">我的足迹</view>
+			</view>
+			<view class="meLine2" @click="gonavigateTo('discountCard')">
+				<!-- <image src="../../static/img/icon_youhui.png" mode="" class="maintainBottomImg"></image> -->
+				<view class="maintainBottomTxt">优惠券</view>
+			</view>
+		</view>
+		<!-- 我的订单 -->
+		<view class="orderBox">
+			<view class="orderTitle">我的订单</view>
+			<view class="orderLIneBox">
+				<view class="orderLine" @click="goorder(1)">
+					<view class="orderImgBox">
+						<view class="orderNum" v-show="numList.sheetOne>0">{{numList.sheetOne}}</view>
+						<!-- <image src="../../static/img/my_icon_2.png" mode="" class="orderLineImg"></image> -->
+					</view>
+					<view class="orderLineTxt">待付款</view>
+				</view>
+				<view class="orderLine" @click="goorder(2)">
+					<view class="orderImgBox">
+						<view class="orderNum" v-show="numList.sheetTwo>0">{{numList.sheetTwo}}</view>
+						<!-- <image src="../../static/img/my_icon_1.png" mode="" class="orderLineImg"></image> -->
+					</view>
+					<view class="orderLineTxt">待服务</view>
+				</view>
+				<view class="orderLine" @click="goorder(4)">
+					<view class="orderImgBox">
+						<view class="orderNum" v-show="numList.sheetFour>0">{{numList.sheetFour}}</view>
+						<!-- <image src="../../static/img/my_icon_5.png" mode="" class="orderLineImg"></image> -->
+					</view>
+					<view class="orderLineTxt">待评价</view>
+				</view>
+				<view class="orderLine" @click="goorder(5)">
+					<view class="orderImgBox">
+						<!-- <image src="../../static/img/qubu.png" mode="" class="orderLineImg"></image> -->
+					</view>
+					<view class="orderLineTxt">全部</view>
+				</view>
+			</view>
+		</view>
+		<!-- 常用功能 -->
+		<view class="orderBox">
+			<view class="orderTitle">常用功能</view>
+			<view class="orderLIneBox">
+				<view class="orderLine" @click="gonavigateTo('../car/carArchives')">
+					<view class="orderImgBox">
+						<!-- <image src="../../static/img/my_icon_staff.png" mode="" class="orderLineImg"></image> -->
+					</view>
+					<view class="orderLineTxt">爱车档案</view>
+				</view>
+				<view class="orderLine" @click="gonavigateTo('myAppraise')">
+					<view class="orderImgBox">
+						<!-- <image src="../../static/img/qingjia.png" mode="" class="orderLineImg"></image> -->
+					</view>
+					<view class="orderLineTxt">我的评价</view>
+				</view>
+				<view class="orderLine" @click="gonavigateTo('myIntegral')">
+					<view class="orderImgBox">
+						<!-- <image src="../../static/img/my_icon_review.png" mode="" class="orderLineImg"></image> -->
+					</view>
+					<view class="orderLineTxt">我的积分</view>
+				</view>
+				<view class="orderLine" @click="gonavigateTo('feedBack')">
+					<view class="orderImgBox">
+						<!-- <image src="../../static/img/yjfk.png" mode="" class="orderLineImg"></image> -->
+					</view>
+					<view class="orderLineTxt">意见反馈</view>
+				</view>
+			</view>
+		</view>
+		<!-- 客服电话: -->
+		<view class="phone" @click="call">
+			<span class="phoneSpan1">客服电话:</span>
+			<span class="phoneSpan2">{{numList.customerService.contents}}</span>
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	data() {
+		return {
+			ueserInfo:'',
+			shopData:'',
+			numList:'',
+		}
+	},
+	onLoad() {
+		 
+	},
+	onShow() {
+		this.$common.isUserId()
+		this.ueserInfo=uni.getStorageSync("logodata");
+		this.shopData=uni.getStorageSync("shopData");
+		this.queryMyDetail();
+	},
+	methods: {
+		call(){
+			uni.makePhoneCall({
+			    phoneNumber: this.numList.customerService.contents
+			}); 
+		},
+		goorder(num){
+			uni.navigateTo({
+				url:'../order/myorder?num='+num
+			})
+		},
+        login(){
+			uni.navigateTo({
+				url:'../login/login'
+			})
+		},
+		queryMyDetail(){
+			uni.showLoading({ });
+			this.$http('miniAppMyBMemberCar/queryMyDetail', {
+			
+			 },'GET').then(res => {
+				uni.hideLoading();
+			    this.numList=res.data
+			})
+		},
+		gonavigateTo(url){
+			uni.navigateTo({
+				url:url
+			})
+		}
+	}
+}
+</script>
+
+<style scoped>
+	.box{
+		min-height: 100vh;
+		background: linear-gradient(180deg, #FEF1E9 0%, #F4F5F7 100%);
+		padding: 0 24rpx;
+	}
+	.flex{
+		display: flex;
+	}
+	.headerBox{
+		padding-top: 14rpx;
+	}
+	.headerImg{
+		width: 90rpx;height: 90rpx;border-radius: 50%;
+	}
+	.setImg{
+		width: 38rpx;height: 38rpx;margin-top: 25rpx;
+	}
+	.headerBox{
+		display: flex;
+		justify-content: space-between;
+	}
+	.headerLeft{
+		display: flex;
+	}
+	.nickName{
+		padding-left: 20rpx;line-height: 90rpx;color: #3C3C3C;font-size: 32rpx;
+	}
+	.shopBox{
+		background: url('http://phone.66km.cn:8088/thFiles/41A4AA99-0EE8-47DE-88AB-2221820C346F.png') no-repeat;
+		background-size: 100%;
+		width: 702rpx;
+		height: 80rpx;
+		line-height: 80rpx;
+		margin-top: 30rpx;
+		display: flex;
+		justify-content: space-between;
+	}
+	.shopName{
+		color: #EBCE8F;padding-left: 20rpx;font-size: 28rpx;
+	}
+	.shopImg{
+		width: 30rpx;height: 30rpx;
+		margin-right: 20rpx;margin-top: 25rpx;
+	}
+	.maintain{
+		margin-top: 20rpx;
+		background: #FFFFFF;
+		border-radius: 10rpx;
+		padding: 25rpx 15rpx;
+	}
+	.maintainTopIcon{
+		width: 56rpx;height: 56rpx;
+	}
+	.maintainTxt{
+		font-size: 30rpx;
+		color: #3C3C3C;
+		line-height: 56rpx;
+		padding-left: 20rpx;
+	}
+	.maintainTopNum{
+		font-size: 30rpx;line-height: 56rpx;
+		font-weight: 600;
+		color: #FF4F00;
+	}
+	.shopcar{
+		display: flex;
+		justify-content: space-between;
+		width: 310rpx;
+	}
+	.shuxian{
+		width: 1px;
+		height: 36rpx;
+		background-color:#EEEEEE ;
+		margin-top:10rpx ;
+	}
+	.shuxian2{
+		width: 1px;
+		height: 36rpx;
+		background-color:#EEEEEE ;
+		margin-top:4rpx ;
+	}
+	.maintainTop{
+		display: flex;
+		justify-content: space-between;
+		padding-right: 10rpx;
+		border-bottom: 1px solid #EEEEEE;
+		padding-bottom: 20rpx;
+	}
+	.maintainBottomImg{
+		width: 48rpx;
+		height: 48rpx;
+	}
+	.maintainBottomTxt{
+		font-size: 28rpx;
+		color: #000000;
+		padding-left: 6rpx;
+	}
+	.maintainBottom{
+		display: flex;line-height: 42rpx;
+		padding-top: 20rpx;justify-content: space-between;
+	}
+	.maintainBottomNum{
+		font-size: 24pxr;
+		color: #999999;
+		padding-left: 6rpx;
+	}
+	.orderBox{
+		margin-top: 30rpx;
+		background: #FFFFFF;
+		padding: 30rpx 0rpx;
+		border-radius: 10rpx;
+	}
+	.orderTitle{
+		font-size: 30rpx;
+		color: #3C3C3C;
+		font-weight: 600;
+		padding-left: 20rpx;
+	}
+	.orderLine{
+		width: 25%;
+		text-align: center;
+	}
+	.orderLineImg{
+		width: 60rpx;
+		height: 60rpx;
+	}
+	.orderLineTxt{
+		font-size: 26rpx;
+		color: #3C3C3C;
+	}
+	.orderImgBox{
+		text-align: center;
+		position: relative;
+	}
+	.orderLIneBox{
+		display: flex;
+		justify-content: space-between;
+		padding-top: 30rpx;
+	}
+	.orderNum{
+		line-height: 26rpx;
+		background: #FF4F00;
+		padding: 0 8rpx;
+		border-radius: 13rpx;
+		color: #FFFFFF;
+		font-size: 20rpx;
+	    position: absolute;
+		top: -5rpx;
+		right: 38rpx;
+		z-index: 11;
+	}
+	.phone{
+		text-align: center;
+		font-size: 28rpx;
+		padding-top: 30rpx;
+		color: #3C3C3C;
+	}
+	.phoneSpan2{
+		color: #3F90F7;
+	}
+	.meLineBox2{
+		display: flex;
+		justify-content: space-between;
+		padding-top: 50rpx;
+		padding-bottom: 10rpx;
+		
+	}
+	.meLine2{
+		text-align: center;
+		width: 25%;
+	}
+</style>

+ 446 - 0
pages/shop/shopList.vue

@@ -0,0 +1,446 @@
+<template>
+	<view class="box">
+		<view class="allShop" >
+			<view class="topView">
+				<view class="search"><!-- 120rpx -->
+					<view class="searchVIew">
+						<!-- <image src="../../static/img/icon_search.png" mode="" class="searchIMg"></image> -->
+						<input type="text" value="" placeholder="请输入门店名称" class="searchInput" v-model="shopName" @confirm="searchList" />
+					  <!--  <image src="../../static/img/icon_search_del.png" v-show="shopName" mode="" class="ssScImg" @click="searchSc"></image> -->
+					</view>
+				</view>
+				<view class="screen">
+					<view class="screenLine">
+						<view class="screenLineTxt" @click="showCity=true,comprehensiveShow=false,levelShow=false">{{cityname}}</view>
+						<!-- <image src="../../static/img/icon_arrow_gray.png" mode="" v-show="!showCity" class="screenJt"></image>
+						<image src="../../static/img/icon_arrow_cheng.png" mode="" v-show="showCity" class="screenJt"></image> -->
+					</view>
+					<view class="screenLine" @click="mdlx">
+						<view class="screenLineTxt " :class="{colorCS:levelShow}">门店类型</view>
+						<!-- <image src="../../static/img/icon_arrow_gray.png" mode="" class="screenJt" v-show="!levelShow"></image>
+						<image src="../../static/img/icon_arrow_cheng.png" mode="" v-show="levelShow" class="screenJt"></image> -->
+					</view>
+					<view class="screenLine" @click="juli" :class="{colorCS:comprehensiveShow}">
+						<view class="screenLineTxt" v-if="comprehensive==0">综合排序</view>
+						<view class="screenLineTxt"  v-if="comprehensive==1">距离最近</view>
+						<view class="screenLineTxt"  v-if="comprehensive==2">评分最高</view>
+						<!-- <image src="../../static/img/icon_arrow_gray.png" mode="" v-show="!comprehensiveShow" class="screenJt"></image>
+						<image src="../../static/img/icon_arrow_cheng.png" mode="" v-show="comprehensiveShow" class="screenJt"></image> -->
+					</view>
+					<!-- 门店类型弹框 -->
+					<view class="shoplevelBox" v-show="levelShow" @click="levelShow=false">
+						<view class="shoplevelCont">
+							<view class="shoplevelLine" v-for="(item,index) in shopLevel" @click.stop="levelClick(item)"
+							:class="{shoplevalActive:item.ckeck}"
+							>{{item.name}}</view>
+						</view>
+						<view class="shoplevelBottom">
+							<view class="shoplevelReset" @click.stop="shoplevelReset">重置</view>
+							<view class="shoplevelsbu" @click.shop="shoplevelsbu">确定</view>
+						</view>
+					</view>
+					<!-- 门店类型弹框 -->
+					<!-- 综合排序 -->
+					  <view class="shoplevelBox " v-show="comprehensiveShow"  @click="comprehensiveShow=false">
+					  	<view class="shoplevelCont ">
+							<view class="comprehensivebox">
+								 <view class="comprehensiveLine" :class="{comprehensiveACtive:comprehensive==0}" @click.stop="comprehensiveClick(0)">综合排序</view>
+								 <view class="comprehensiveLine" :class="{comprehensiveACtive:comprehensive==1}" @click.stop="comprehensiveClick(1)">距离最近</view>
+								 <view class="comprehensiveLine" :class="{comprehensiveACtive:comprehensive==2}" @click.stop="comprehensiveClick(2)">评分最高</view>
+							</view>
+					  		
+					  	</view>
+					  	
+					  </view>
+					<!-- 综合排序 -->
+				</view>
+			</view>
+			<view class="shopLineBox">
+				<view class="shopBox shopBox2" v-for="(item,index) in queryShopList" @click="goDetail(item)">
+					    <view class="">
+						 <image :src="item.photoPath" mode="" class="shopImg" v-if="item.photoPath"></image>
+						<!-- <image src="../../static/img/noimg.png" mode="" class="shopImg" v-else></image> -->
+						</view>
+						<view class="shopCont">
+							<view class="shopName">{{item.shopName}}</view>
+							<view class="flex shopRight">
+								<view>
+									<span class="span1" v-if="item.shopScore">{{item.shopScore}}</span>
+									<span class="span2" v-if="item.shopScore">分</span>
+									<span class="span2" v-if="!item.shopScore">暂无评分</span>
+									<span class="span3">服务次数 {{item.sheetSum}} </span>
+								</view>
+								<view class="shopBq" v-show="item.levelName">{{item.levelName}}</view>
+							</view>
+							<view class="shopTime"><span v-show="item.startTime">{{item.startTime}}</span> - <span v-show="item.endTime">{{item.endTime}}</span> </view>
+							<view class="flex addressBox">
+								<view class="address" > <span v-show="item.address"> {{item.address}}</span></view>
+								<view class="shopKm" v-show="item.distance&&item.distance!= '0.00'">{{item.distance}}km</view>
+							</view>
+						</view>
+					
+				</view>
+				<view v-if="queryShopList==''" class="nodataBox">
+					<!-- <image src="../../static/img/nodata.png" mode="widthFix" class="nodataImg"></image>
+					<view class="noTxt">暂无数据</view> -->
+				</view>
+			</view>
+			
+		</view>
+		<chose-city @selectCity="selectCity"  v-if="showCity" @closeModal="closeModal"></chose-city>
+	</view>
+</template>
+
+<script>
+import choseCity from "@/components/chose-city/chose-city"
+export default {
+	components: {
+		choseCity
+	},
+	data() {
+		return {
+			location:'',
+			cityname:'上海市',
+			queryShopList:'',
+			shopName:'',
+			level:'',
+			comprehensive:1,
+			shopLevel:[
+				{name:'洗剪点',ckeck:false},{name:'VIIIP',ckeck:false}
+			],
+			levelShow:false,
+			comprehensiveShow:false,
+			showCity:false,
+		}
+	},
+	onShow() {
+		this.showCity=false;
+		this.levelShow=false;
+		this.comprehensiveShow=false;
+		this.$common.isUserId();
+		
+		 this.location=uni.getStorageSync("location");
+		 if(this.location){
+		 	this.cityname=this.location.cityname
+		 }
+		  this.getqueryShopList()//获取全部门店列表
+		 this.getqueryBShopLevel()//查询门店等级
+	},
+	onLoad() {
+        
+	},
+	methods: {
+		mdlx(){
+			this.levelShow=!this.levelShow;this.comprehensiveShow=false;this.showCity=false
+		},
+		juli(){
+			this.comprehensiveShow=!this.comprehensiveShow;this.levelShow=false;this.showCity=false
+		},
+		searchList(){
+			 this.getqueryShopList()//获取全部门店列表
+		},
+		searchSc(){
+			this.shopName='';
+			this.getqueryShopList()//获取全部门店列表
+		},
+		selectCity(item) {
+			console.log('-您选择的城市-',item)
+			this.location.cityname=item.name;
+			this.location.cityCode=item.citycode;
+			this.cityname=item.name;
+			console.log(this.location)
+			uni.setStorage({
+				key: 'location',
+				data: this.location,
+				success: function () {}
+			}); 
+			this.showCity = false;
+		    this.getqueryShopList()//获取全部门店列表
+		},
+		closeModal() {
+			this.showCity = false
+		
+		},
+		getqueryShopList(){
+			uni.showLoading({ });
+			this.$http('miniAppShopInfoController/queryShopList', {
+			   shopName:this.shopName,
+			  lat:this.location.lat,
+			  lng:this.location.lng,
+			 cityCode:this.location.cityCode,
+			  comprehensive:this.comprehensive,
+			  level:this.level,
+			 },'GET').then(res => {
+				uni.hideLoading();
+				this.queryShopList=res.data
+			})
+		},
+		getqueryBShopLevel(){
+			this.$http('miniAppShopInfoController/queryBShopLevel', {
+			  
+			 },'GET').then(res => {
+				res.data.forEach(item=>{
+					item.ckeck=false;
+				})
+				this.shopLevel=res.data
+			})
+		},
+		levelClick(item){
+			item.ckeck=!item.ckeck
+		},
+		shoplevelReset(){
+			this.shopLevel.forEach(item=>{
+				item.ckeck=false;
+			})
+			// this.getqueryShopList()
+			//this.levelShow=false;
+		},
+		shoplevelsbu(){
+			var arr=[]
+			this.shopLevel.forEach(item=>{
+				if(item.ckeck){
+					arr.push(item.id)
+				}
+			})
+			this.level=arr.join(',')
+			console.log(this.level)
+			this.levelShow=false;
+			this.getqueryShopList()
+		},
+		comprehensiveClick(num){
+			this.comprehensive=num;
+			this.comprehensiveShow=false;
+			this.getqueryShopList()
+		},
+        goDetail(item){
+			uni.navigateTo({
+				url:'../Shop/shopDetail?id='+item.shopId
+			})
+		}
+	}
+}
+</script>
+
+<style scoped>
+	.box{
+		min-height: 100vh;
+		background:#F4F5F7 ;
+	}
+	.allShop{
+		/* background: #FFFFFF; */
+	}
+	.topView{
+		position: fixed;
+		width: 100%;
+		height: 170rpx;
+		background-color: #FFFFFF;
+		z-index: 11;
+	}
+	.searchIMg{
+		width: 40rpx;height: 40rpx;margin-top: 16rpx;margin-left: 20rpx;
+	}
+	.ssScImg{
+		width: 40rpx;height: 40rpx;margin-top: 16rpx;
+	}
+	.search{
+		padding: 24rpx;
+		background: #FFFFFF;
+	}
+	.searchVIew{
+		display: flex;
+		background: #F4F5F7;
+		border-radius: 36rpx;
+		height: 72rpx;
+	}
+	.searchInput{
+		color: #999999;font-size: 28rpx;padding-left: 16rpx;
+		height: 72rpx;line-height: 72rpx;width: 570rpx;
+	}
+	.screenJt{
+		width: 24rpx;
+		height: 24rpx;
+		margin-top: 7rpx;
+		margin-left: 5rpx;
+		
+	}
+	.screen{
+		display: flex;
+		justify-content: space-between;
+		padding: 0 24rpx 16rpx 24rpx;
+		border-bottom: 2rpx solid #EEEEEE;
+		position: relative;
+		background: #FFFFFF;
+		height: 60rpx;
+	}
+	.screenLine{
+		display: flex;
+		color: #333333;
+		font-size: 28rpx;
+		
+	}
+	.shopLineBox{
+		padding: 190rpx 0rpx 25rpx;
+	}
+	.shopBox2{
+		margin-top: 20rpx;
+		padding-bottom: 30rpx;
+		background: #FFFFFF;
+		border-radius: 10rpx;
+		padding-left: 20rpx;
+		padding-right: 20rpx;
+	}
+	.shoplevelBox{
+		position: fixed;
+		left: 0;
+		width: 750rpx;
+		top: 196rpx;
+		background: rgba(0,0,0,0.4);
+		
+		z-index: 11;
+		border-top: 1px solid #EEEEEE;
+		border-bottom:1px solid #EEEEEE ;
+		height: calc(100vh - 196rpx);
+	}
+	/* #ifdef H5 */
+	.shoplevelBox{
+		
+		top: calc(196rpx + 44px);
+		
+	}
+	/* #endif */
+	
+	.shoplevelCont{
+		display: flex;
+		flex-wrap: wrap;
+		background: #FFFFFF;
+		padding: 24rpx;
+	}
+	.shoplevelLine{
+		color: #333333;
+		line-height: 64rpx;
+		padding: 0 40rpx;
+		height: 64rpx;
+		background: #F4F5F7;
+		border-radius: 32rpx;
+		margin-right: 20rpx;
+		margin-bottom: 30rpx;
+	}
+	.shoplevelBottom{
+		display: flex;
+		justify-content: space-between;
+		padding-top: 60rpx;
+		padding-right: 24rpx;
+		background: #FFFFFF;
+		padding: 24rpx;
+	}
+	.shoplevelReset{
+		width: 320rpx;
+		height: 74rpx;
+		border-radius: 37rpx;
+		border: 2rpx solid #FF4F00;
+		text-align: center;
+		line-height: 74rpx;
+		font-size: 30rpx;
+		font-family: PingFangSC-Medium, PingFang SC;
+		font-weight: 500;
+		color: #FF4F00;
+	}
+	.shoplevelsbu{
+		width: 320rpx;
+		height: 74rpx;
+		background: #FF4F00;
+		border-radius: 37rpx;
+		font-size: 30rpx;
+		font-family: PingFangSC-Medium, PingFang SC;
+		font-weight: 500;
+		color: #FFFFFF;
+		text-align: center;
+	   line-height: 74rpx;
+	   border: 2rpx solid #FF4F00;
+	}
+	.shoplevalActive{
+		color: #FF4F00;
+		background: rgba(255, 79, 0, 0.08);
+		
+	}
+	.comprehensiveLine{
+	/* 	width: 200rpx;
+		height: 60rpx;
+		line-height: 60rpx;
+		text-align: center;
+		border: 1px solid rgb(228, 228, 228);
+		border-radius: 10rpx; */
+		font-size: 26rpx;
+		font-family: PingFangSC-Regular, PingFang SC;
+		font-weight: 400;
+		color: #333333;
+		padding: 25rpx 0;
+		
+	}
+	.comprehensivebox{
+		/* display: flex;justify-content: space-around; */
+	}
+	.comprehensiveACtive{
+		color: #FF4F00;
+	}
+	.nodataImg{
+	  width: 400rpx;
+	  padding-top: 100rpx;
+	}
+	.noTxt{
+		font-size: 36rpx;
+		color: #999999;
+		padding-top: 50rpx;
+	}
+	.nodataBox{
+		text-align: center;
+	}
+	.shopImg{
+			width: 146rpx;
+			height: 146rpx;
+			border-radius: 6rpx;
+		}
+		.shopBox{
+			padding-top: 30rpx;
+			display: flex;
+		}
+		.flex{
+			display: flex;
+			justify-content: space-between;
+		}
+		.shopCont{
+			padding-left: 22rpx;
+			width: 520rpx;
+		}
+		.shopName{
+			color: #333333;
+			font-size: 26rpx;
+			font-weight: 600;
+		}
+		.span1{
+			color: #FF4F00;font-size: 36rpx;
+		}
+		.span2{
+			color: #FF4F00;font-size: 22rpx;
+		}
+		.span3{
+				color: #333333;font-size: 22rpx;padding-left: 22rpx;
+		}
+		.shopBq{
+			color: #FF4F00;font-size: 22rpx;border-radius: 4rpx;
+	border: 1px solid #FF4F00;line-height: 30rpx;height: 30rpx;padding: 0rpx 5rpx;
+	margin-top: 10rpx;
+		}
+	.shopTime{
+		color: #666666;font-size: 22rpx;
+	}	
+	.addressBox{
+		color: #666666;font-size: 22rpx;
+	}
+	.shopNameSearchInput{
+		width: 500rpx;
+	}
+	.colorCS{
+		color: #FF4F00;
+	}
+</style>

文件差異過大導致無法顯示
+ 1734 - 0
static/dataJson/city.json


二進制
static/img/baiheiback.png


二進制
static/img/goback.png


二進制
static/img/icon_search.png


二進制
static/img/tabme1.png


二進制
static/img/tabme2.png


二進制
static/img/tabshop1.png


二進制
static/img/tabshop2.png


二進制
static/logo.png


+ 76 - 0
uni.scss

@@ -0,0 +1,76 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+
+/* 颜色变量 */
+
+/* 行为相关颜色 */
+$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:16;
+
+/* 图片尺寸 */
+$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;