Zory 1 долоо хоног өмнө
parent
commit
7654ae18ad
100 өөрчлөгдсөн 1747 нэмэгдсэн , 65 устгасан
  1. BIN
      .DS_Store
  2. 1 1
      main.js
  3. 2 2
      manifest.json
  4. 23 2
      pages.json
  5. 2 2
      pages/index/index.vue
  6. 246 17
      pages/order/confirm.vue
  7. 2 2
      pages/order/detail.vue
  8. 251 0
      pages/order/info.vue
  9. 59 9
      pages/order/order.vue
  10. 11 3
      pages/order/store.vue
  11. 203 0
      pages/user/address.vue
  12. 18 16
      pages/user/user.vue
  13. BIN
      static/.DS_Store
  14. 19 0
      static/api/address.js
  15. 18 3
      static/api/order.js
  16. BIN
      static/image/del.png
  17. BIN
      static/image/edit.png
  18. 1 1
      static/js/common.js
  19. 2 2
      static/js/request.js
  20. 13 0
      uni.promisify.adaptor.js
  21. 0 5
      uni_modules/uview-ui/libs/config/config.js
  22. 0 0
      unpackage/dist/build/.automator/mp-toutiao/.automator.json
  23. 4 0
      unpackage/dist/build/mp-toutiao/app.js
  24. 48 0
      unpackage/dist/build/mp-toutiao/app.json
  25. 3 0
      unpackage/dist/build/mp-toutiao/app.ttss
  26. 1 0
      unpackage/dist/build/mp-toutiao/common/main.js
  27. 1 0
      unpackage/dist/build/mp-toutiao/common/main.ttss
  28. 2 0
      unpackage/dist/build/mp-toutiao/common/runtime.js
  29. 0 0
      unpackage/dist/build/mp-toutiao/common/vendor.js
  30. 0 0
      unpackage/dist/build/mp-toutiao/pages/index/index.js
  31. 6 0
      unpackage/dist/build/mp-toutiao/pages/index/index.json
  32. 1 0
      unpackage/dist/build/mp-toutiao/pages/index/index.ttml
  33. 1 0
      unpackage/dist/build/mp-toutiao/pages/index/index.ttss
  34. 0 0
      unpackage/dist/build/mp-toutiao/pages/order/confirm.js
  35. 7 0
      unpackage/dist/build/mp-toutiao/pages/order/confirm.json
  36. 0 0
      unpackage/dist/build/mp-toutiao/pages/order/confirm.ttml
  37. 0 0
      unpackage/dist/build/mp-toutiao/pages/order/confirm.ttss
  38. 0 0
      unpackage/dist/build/mp-toutiao/pages/order/detail.js
  39. 6 0
      unpackage/dist/build/mp-toutiao/pages/order/detail.json
  40. 1 0
      unpackage/dist/build/mp-toutiao/pages/order/detail.ttml
  41. 1 0
      unpackage/dist/build/mp-toutiao/pages/order/detail.ttss
  42. 0 0
      unpackage/dist/build/mp-toutiao/pages/order/info.js
  43. 4 0
      unpackage/dist/build/mp-toutiao/pages/order/info.json
  44. 0 0
      unpackage/dist/build/mp-toutiao/pages/order/info.ttml
  45. 0 0
      unpackage/dist/build/mp-toutiao/pages/order/info.ttss
  46. 0 0
      unpackage/dist/build/mp-toutiao/pages/order/order.js
  47. 6 0
      unpackage/dist/build/mp-toutiao/pages/order/order.json
  48. 0 0
      unpackage/dist/build/mp-toutiao/pages/order/order.ttml
  49. 0 0
      unpackage/dist/build/mp-toutiao/pages/order/order.ttss
  50. 0 0
      unpackage/dist/build/mp-toutiao/pages/order/store.js
  51. 4 0
      unpackage/dist/build/mp-toutiao/pages/order/store.json
  52. 1 0
      unpackage/dist/build/mp-toutiao/pages/order/store.ttml
  53. 1 0
      unpackage/dist/build/mp-toutiao/pages/order/store.ttss
  54. 0 0
      unpackage/dist/build/mp-toutiao/pages/user/address.js
  55. 7 0
      unpackage/dist/build/mp-toutiao/pages/user/address.json
  56. 0 0
      unpackage/dist/build/mp-toutiao/pages/user/address.ttml
  57. 0 0
      unpackage/dist/build/mp-toutiao/pages/user/address.ttss
  58. 0 0
      unpackage/dist/build/mp-toutiao/pages/user/license.js
  59. 4 0
      unpackage/dist/build/mp-toutiao/pages/user/license.json
  60. 1 0
      unpackage/dist/build/mp-toutiao/pages/user/license.ttml
  61. 1 0
      unpackage/dist/build/mp-toutiao/pages/user/license.ttss
  62. 0 0
      unpackage/dist/build/mp-toutiao/pages/user/user.js
  63. 4 0
      unpackage/dist/build/mp-toutiao/pages/user/user.json
  64. 1 0
      unpackage/dist/build/mp-toutiao/pages/user/user.ttml
  65. 1 0
      unpackage/dist/build/mp-toutiao/pages/user/user.ttss
  66. 11 0
      unpackage/dist/build/mp-toutiao/project.config.json
  67. 5 0
      unpackage/dist/build/mp-toutiao/project.private.config.json
  68. BIN
      unpackage/dist/build/mp-toutiao/static/.DS_Store
  69. 19 0
      unpackage/dist/build/mp-toutiao/static/api/address.js
  70. 19 0
      unpackage/dist/build/mp-toutiao/static/api/home.js
  71. 34 0
      unpackage/dist/build/mp-toutiao/static/api/order.js
  72. 18 0
      unpackage/dist/build/mp-toutiao/static/api/user.js
  73. BIN
      unpackage/dist/build/mp-toutiao/static/image/address.png
  74. BIN
      unpackage/dist/build/mp-toutiao/static/image/check.png
  75. BIN
      unpackage/dist/build/mp-toutiao/static/image/coupon-fill.png
  76. BIN
      unpackage/dist/build/mp-toutiao/static/image/coupon.png
  77. BIN
      unpackage/dist/build/mp-toutiao/static/image/del.png
  78. BIN
      unpackage/dist/build/mp-toutiao/static/image/edit.png
  79. BIN
      unpackage/dist/build/mp-toutiao/static/image/info.png
  80. BIN
      unpackage/dist/build/mp-toutiao/static/image/location.png
  81. BIN
      unpackage/dist/build/mp-toutiao/static/image/map.png
  82. BIN
      unpackage/dist/build/mp-toutiao/static/image/no.png
  83. BIN
      unpackage/dist/build/mp-toutiao/static/image/order-fill.png
  84. BIN
      unpackage/dist/build/mp-toutiao/static/image/order.png
  85. BIN
      unpackage/dist/build/mp-toutiao/static/image/order_none.png
  86. BIN
      unpackage/dist/build/mp-toutiao/static/image/out.png
  87. BIN
      unpackage/dist/build/mp-toutiao/static/image/right.png
  88. BIN
      unpackage/dist/build/mp-toutiao/static/image/round_close.png
  89. BIN
      unpackage/dist/build/mp-toutiao/static/image/search.png
  90. BIN
      unpackage/dist/build/mp-toutiao/static/image/service.png
  91. BIN
      unpackage/dist/build/mp-toutiao/static/image/tel.png
  92. BIN
      unpackage/dist/build/mp-toutiao/static/image/user-fill.png
  93. BIN
      unpackage/dist/build/mp-toutiao/static/image/user.png
  94. BIN
      unpackage/dist/build/mp-toutiao/static/image/zizhi.png
  95. 154 0
      unpackage/dist/build/mp-toutiao/static/js/common.js
  96. 267 0
      unpackage/dist/build/mp-toutiao/static/js/form.js
  97. 226 0
      unpackage/dist/build/mp-toutiao/static/js/request.js
  98. BIN
      unpackage/dist/build/mp-toutiao/static/logo.png
  99. 0 0
      unpackage/dist/build/mp-toutiao/uni_modules/uni-popup/components/uni-popup/uni-popup.js
  100. 6 0
      unpackage/dist/build/mp-toutiao/uni_modules/uni-popup/components/uni-popup/uni-popup.json

BIN
.DS_Store


+ 1 - 1
main.js

@@ -6,7 +6,7 @@ import uView from './uni_modules/uview-ui'
 Vue.use(uView)
 
 
-import common from 'static/js/common.js';
+import common from './static/js/common.js';
 Vue.prototype.$dialog = common;
 
 // #ifndef VUE3

+ 2 - 2
manifest.json

@@ -69,6 +69,6 @@
     "uniStatistics" : {
         "enable" : false
     },
-    "vueVersion" : "2",
-	"sassImplementationName":"node-sass"
+    "vueVersion" : "2",
+    "sassImplementationName" : "node-sass"
 }

+ 23 - 2
pages.json

@@ -9,7 +9,10 @@
 		{
 			"path": "pages/order/order",
 			"style": {
-				"navigationBarTitleText": "订单"
+				"navigationBarTitleText": "订单",
+				"usingComponents": {
+					"pay-button-sdk": "tta5a3d31e3aecfb9b11://pay-button"
+				}
 			}
 		},
 		{
@@ -27,7 +30,10 @@
 		{
 			"path": "pages/order/detail",
 			"style": {
-				"navigationBarTitleText": "团购券"
+				"navigationBarTitleText": "团购券",
+				"usingComponents": {
+					"pay-button-sdk": "tta5a3d31e3aecfb9b11://pay-button"
+				}
 			}
 		},
 		{
@@ -41,6 +47,21 @@
 			"style": {
 				"navigationBarTitleText": "选择门店"
 			}
+		},
+		{
+			"path": "pages/user/address",
+			"style": {
+				"navigationBarTitleText": "会员地址"
+			}
+		},
+		{
+			"path": "pages/order/info",
+			"style": {
+				"navigationBarTitleText": "预约详情",
+				"usingComponents": {
+					"pay-button-sdk": "tta5a3d31e3aecfb9b11://pay-button"
+				}
+			}
 		}
 	],
 	"globalStyle": {

+ 2 - 2
pages/index/index.vue

@@ -59,7 +59,7 @@ export default {
 					Api.data({"code":lres.code}).then((res)=>{
 						uni.hideLoading();
 						if (res.code == 0) {
-							return app.$dialog.showSuccess(res.info);
+							return app.$dialog.showSuccess(res.msg);
 						}
 						uni.setStorageSync("user_data", res.data.user)
 						uni.setStorageSync("user_token", res.data.user.access_token)
@@ -85,7 +85,7 @@ page{
 	align-items: center;
 	justify-content: center;
 }
-.coupon-item{background-color: #fff;border-radius: 10upx;width: calc(95% - 40upx);margin: 20upx auto;box-shadow: 8px 8px 20px 0 rgba(55, 99, 170, .1);border: 2upx solid #fff;border-radius: 10upx;position: relative;}
+.coupon-item{background-color: #fff;border-radius: 10upx;width: calc(95% - 40upx);margin: 20upx auto;border: 2upx solid #fff;border-radius: 10upx;position: relative;}
 .coupon-item .state-img{position: absolute;right: 0;top: 0;}
 .coupon-item .state-img image{width: 100upx;height: 100upx;}
 .coupon-item .header{padding: 20upx;font-size: 28upx;color: #333;line-height: 48upx;border-bottom: 2upx solid #f8f8f8;}

+ 246 - 17
pages/order/confirm.vue

@@ -1,9 +1,23 @@
 <template>
 	<view>
 		<view class="address" v-if="storeInfo && storeInfo.service_type==2">
-			
-		</view>
-	
+			<view class="addressInfo" v-if="addressInfo" @click="toAddress">
+				<view class="empty-data">
+					<view class="left">
+						<view class="contact-name">{{addressInfo.username}} <view class="mobile">{{addressInfo.mobile}}</view></view>
+						<view class="desc">{{addressInfo.region}}{{addressInfo.address}}</view>
+					</view>
+					<view class="right"><image src="/static/image/right.png"></image></view>
+				</view>
+			</view>
+			<view class="addressInfo" @click="toAddress" v-else>
+				<view class="empty-data">
+					<view class="left"><image src="/static/image/location.png"></image></view>
+					<view class="name">完善收货地址</view>
+					<view class="right"><image src="/static/image/right.png"></image></view>
+				</view>
+			</view>
+		</view>
 		<view class="location" @click="toDetail">
 			<view class="left">
 				<view class="name">{{poi_name}}</view>
@@ -35,6 +49,18 @@
 				title
 				loading
 			></u-skeleton>
+		</view>
+		
+		<view class="goods_skus" v-if="goodsSku.length > 0">
+			<view class="sku_box" v-for="(item,indx) in goodsSku" :key="indx">
+				<view class="sku_name">
+					{{item.name}}({{item.list.length}}选{{item.num}})
+					<view class="right" @click="clearSku(indx)">清除</view> 
+				</view>
+				<view class="sku_list">
+					<view :class="itm.check?'sku_item':'sku_item active'" @click="skuCheck(item.name,item.num,indx,iddx)" v-for="(itm,iddx) in item.list" :key="iddx">{{itm.name}}</view>
+				</view>
+			</view>
 		</view>
 		
 		<view class="order-time" v-if="storeInfo && storeInfo.service_type==1">
@@ -53,7 +79,7 @@
 		<view class="flx-footer">
 			<view class="footer-btn">
 				<view class="price"><text class="desc">已优惠:¥{{goodsInfo.order_amount}},</text>合计<text class="money">¥0</text></view>
-				<view class="btn-group"><button :disabled="disabled" class="btn">{{disabled?'处理中...':'确认兑换'}}</button></view>
+				<view class="btn-group"><button :disabled="disabled" @click="submitOrder" class="btn">{{disabled?'处理中...':'确认兑换'}}</button></view>
 			</view>
 			<view class="footer-safe"></view>
 		</view>
@@ -63,11 +89,20 @@
 				<view class="title">选择时间<view class="close" @click="selectTime(2)"><image src="/static/image/round_close.png"></image></view> </view>
 			</view>
 			<view class="time-body">
-				<view class="time-left"></view>
-				<view class="time-right"></view>
+				<view class="time-left">
+					<view :class="timeIndex==index?'time-left-item active':'time-left-item'" @click="timeCheck(index)" v-for="(item,index) in timeData">
+						<view class="name">{{item.day}}</view>
+						<view class="desc">{{item.week}}</view>
+					</view>
+				</view>
+				<view class="time-right">
+					<view  :class="childIndex==index?'time-right-item active':'time-right-item'" @click="childCheck(index)" v-for="(item,index) in timeChildren">
+						<view class="name">{{item.display}}</view>
+					</view>
+				</view>
 			</view>
 			<view class="time-btn">
-				<button class="btn">确认选择</button>
+				<button class="btn" @click="checkTimeEnd">确认选择</button>
 			</view>
 		</uni-popup>
 	</view>
@@ -80,6 +115,8 @@ export default {
 	data() {
 		return {
 			disabled:false,
+			timeIndex:0,
+			childIndex:0,
 			order:"",
 			poi_name:"",
 			poi_id:"",
@@ -88,7 +125,12 @@ export default {
 			storeInfo:null,
 			timeStr:null,
 			timeState:false,
-			timeData:[]
+			timeData:[],
+			timeChildren:[],
+			addressInfo:null,
+			msg:"",
+			totalData:[],
+			goodsSku:[]
 		}
 	},
 	onLoad({order,poi_id,poi_name,juli}) {
@@ -99,7 +141,130 @@ export default {
 		app.juli = juli;
 		app.getOrder();
 	},
-	methods: {
+	methods: {
+		submitOrder(){
+			var formData = {};
+			formData.order = app.order;
+			formData.poi_id = app.poi_id;
+			if (app.storeInfo.service_type==2 && app.addressInfo == null) {
+				return app.$dialog.showSuccess("请选择会员地址");
+			}
+			if (app.storeInfo.service_type==1 && app.timeStr == null) {
+				return app.$dialog.showSuccess("请选择预约时间");
+			}
+			var skuInfo = "",skuState = true;
+			if (app.goodsSku.length > 0) {
+				app.goodsSku.forEach((item,index)=>{
+					var skuCheck = [],skuI = 0;
+					skuInfo += item.name+":";
+					item.list.forEach((itm,idx)=>{
+						if (itm.check==false){
+							skuInfo += itm.name+',';
+							skuCheck[skuI] = itm.name;
+							skuI ++;
+						}
+					});
+					skuInfo = skuInfo.slice(0, -1);
+					skuInfo += ";";
+					if (item.num > skuCheck.length) {
+						app.$dialog.showSuccess("请完善【"+item.name+"】选项");
+						skuState = false;
+						return false;
+					}
+				});
+				if (!skuState) return ;
+			}
+			formData.sku = skuInfo;
+			formData.address = JSON.stringify(app.addressInfo);
+			formData.time = app.timeStr;
+			formData.remark = app.msg;
+			app.disabled = true;
+			Api.submit(formData).then((res)=>{
+				app.disabled = false;
+				if (res.code == 0) {
+					return app.$dialog.showSuccess(res.msg);
+				}
+				app.$dialog.showSuccess(res.msg,"none",function(){
+					uni.switchTab({
+						url:"/pages/order/order"
+					})
+				});
+			})
+		},
+		clearSku(parent){
+			app.totalData = [];
+			var goodsSku = app.goodsSku;
+			goodsSku[parent].list.forEach((item,index) => {
+				if (!item.check) {
+					item.check = true;
+				}
+			})
+		},
+		skuCheck(name,length,parent,select){
+			var goodsSku = app.goodsSku;
+			if (length == '1') { // 单选
+				goodsSku[parent].list.forEach((item,index) => {
+					item.check = true;
+					if (index == select) {
+						item.check = false;
+						app.skuInfo = goodsSku[parent].name+":"+item.name;
+					}
+				})
+			} else { // 多选
+				var data = [];
+				var checkData = app.skuDataCheck(parent,length);
+				goodsSku[parent].list.forEach((item,index) => {
+					if (checkData >= length) {
+						app.$dialog.showSuccess("清除后可重选~");
+						return ;
+					}
+					if (index == select) {
+						if (item.check) {
+							data[parent+'_'+index] = item;
+						}
+						item.check = item.check?false:true;
+						app.totalData.push(data)
+					}
+				});
+			}
+			app.goodsSku = goodsSku;
+		},
+		skuDataCheck(parent,length){
+			var dataLen = 0;
+			for (let key in app.totalData) {
+				if (typeof app.totalData[key] == 'object' || typeof app.totalData[key] == 'array')
+				{
+					for (let indx in app.totalData[key]) {
+						if (indx.includes(parent+"_")) {
+							dataLen ++;
+						}
+					}
+				}
+			}
+			return dataLen;
+		},
+		checkTimeEnd(){
+			app.$refs.timepopup.close()
+			var day = app.timeData[app.timeIndex];
+			var fullday = day.full;
+			var time = day.children[app.childIndex].display;
+			app.timeStr = fullday+" "+time;
+		},
+		timeCheck(index){
+			app.timeIndex = index;
+			app.timeChildren = app.timeData[index].children
+		},
+		childCheck(index){
+			app.childIndex = index;
+		},
+		getBackInfo(data){
+			app.addressInfo = data;
+		},
+		toAddress(){
+			uni.navigateTo({
+				url:"/pages/user/address?type=2"
+			})
+		},
 		selectTime(type){
 			if (type == 1) {
 				app.$refs.timepopup.open()
@@ -111,13 +276,15 @@ export default {
 		getOrder(){
 			Api.detail({"order":app.order}).then((res)=>{
 				if (res.code == 0) {
-					return app.$dialog.showSuccess(res.info,"none",function(){
+					return app.$dialog.showSuccess(res.msg,"none",function(){
 						uni.navigateBack()
 					});
 				}
 				app.goodsInfo = res.data.order;
 				app.storeInfo = res.data.store;
-				app.timeData = res.data.time
+				app.timeData = res.data.time
+				app.timeChildren = app.timeData[0].children
+				app.goodsSku = res.data.specs;
 			});
 		},
 		toDetail(){
@@ -130,10 +297,28 @@ export default {
 </script>
 
 <style>
-	
-.time-body{height: 30vh;}
-.time-body .time-left{width: 30%;background-color: #F5FAFD;height: 100%;overflow-y: auto;}
-.time-body .time-right{width: calc(70% - 20upx);margin-left: 20upx;}
+.addressInfo{border-top: 16upx solid #224d7a;}
+.addressInfo .empty-data{display: flex;align-items: center;font-size: 28upx;width: 100%;}
+.addressInfo .empty-data .contact-name{display: flex;align-items: center;font-size: 30upx;color: #333;margin-bottom: 20upx;}
+.addressInfo .empty-data .contact-name .mobile{margin-left: 20upx;}
+.addressInfo .empty-data .desc{font-size: 26upx;color: #666;}
+.addressInfo .empty-data .left image{width: 40upx;height: 40upx;margin-right: 20upx;vertical-align: middle;}
+.addressInfo .empty-data .right image{width: 40upx;height: 40upx;vertical-align: middle;}
+.addressInfo .empty-data .right{margin-left: auto;margin-right: 0;}
+.time-body{height: 30vh;display: flex;align-items: center;}
+.time-body .time-left{width: 30%;background-color: #F5FAFD;height: 100%;overflow-y: auto;}
+
+.time-body .time-left .time-left-item{padding: 10upx;text-align: center;}
+.time-body .time-left .time-left-item.active{background-color: #fff;color: #224d7a;}
+.time-body .time-left .time-left-item.active .name{color: #224d7a;}
+.time-body .time-left .time-left-item.active .desc{color: #224d7a;}
+.time-body .time-left .time-left-item .name{font-size: 28upx;color: #333;}
+.time-body .time-left .time-left-item .desc{font-size: 24upx;color: #666;}
+
+.time-body .time-right{width: calc(70% - 80upx);padding:0 40upx;background-color: #fff;height: 100%;overflow-y: auto;}
+.time-body .time-right .time-right-item{background-color: #F6FAFD;border: 2upx solid #ccc;height: 66upx;line-height: 66upx;text-align: center;font-size: 28upx;color: #333;margin-top: 20upx;border-radius: 10upx;}
+.time-body .time-right .time-right-item.active{color: #224d7a;border: 2upx solid #224d7a;}
+
 .time-select .title{height: 100upx;line-height: 100upx;display: flex;align-items: center;justify-content: space-between;font-size: 28upx;padding: 0 20upx;font-weight: bold;}
 .time-select image{width: 40upx;height: 40upx;vertical-align: middle;}
 .time-btn{padding: 20upx;}	
@@ -143,7 +328,7 @@ export default {
 .location .name{font-size: 32upx;color: #333;font-weight: bold;margin-bottom: 20upx;}
 .location .desc{color: #666;font-size: 28upx;display: flex;align-items: center;}
 .location .desc image{width: 40upx;height: 40upx;margin-right: 20upx;}
-.goods,.order-msg{background-color: #fff;border-radius: 20upx;padding: 20upx;width: calc(95% - 40upx);margin: 20upx auto;}
+.goods,.order-msg,.addressInfo{background-color: #fff;border-radius: 20upx;padding: 20upx;width: calc(95% - 40upx);margin: 20upx auto;}
 .goods .goods-info{display: flex;align-items: center;}
 .goods .goods-info .info{flex: 1;margin-left: 20upx;}
 .goods .goods-info .image image{width: 160upx;height: 160upx;}
@@ -157,7 +342,7 @@ export default {
 .order-time .msg{display: flex;align-items: center;font-size: 28upx;color: #333;}
 
 .order-msg .title{color: #333;font-size: 28upx;border-bottom: 2upx solid #f8f8f8;margin-bottom: 20upx;padding-bottom: 20upx;}
-.order-msg .textarea{width: 100%;height: 120upx;font-size: 28upx;}
+.order-msg .textarea{width: 100%;height: 100upx;font-size: 28upx;}
 
 .flx-footer{position: fixed;bottom: 0;background-color: #fff;padding: 20upx;border-top: 2upx solid #f8f8f8;left: 0;right: 0;}
 .flx-footer .footer-safe {height: env(safe-area-inset-bottom);width: 100%;}
@@ -167,4 +352,48 @@ export default {
 .flx-footer .footer-btn text.desc{color: #666;font-size: 24upx;}
 .flx-footer .footer-btn text.money{color: #f00;font-size: 28upx;font-weight: bold;}
 .flx-footer .footer-btn .price{color: #333;font-size: 28upx;}
+
+.goods_skus{
+	padding: 20upx 20upx 0 20upx;
+	background-color: #fff;border-radius: 20upx;width: calc(95% - 40upx);margin: 0 auto;
+}
+.goods_skus .sku_name{
+	font-size: 32upx;
+	color: #000;
+	font-weight: bold;
+	line-height: 60upx;
+	display: flex;
+	align-items: center;
+}
+.goods_skus .sku_name .right{
+	margin-left: auto;
+	margin-right: 0;
+	font-size: 26upx;
+	color: #666;
+	display: flex;
+	align-items: center;
+}
+.goods_skus .sku_name .right image{
+	width: 30upx;
+	height: 30upx;
+	margin-right: 10upx;
+}
+.goods_skus .sku_list{
+	display: flex;
+	align-items: center;
+	margin: 10upx 0;
+	flex-wrap: wrap;
+}
+.goods_skus .sku_list .sku_item.active{
+	background: linear-gradient(90deg, rgba(34, 77, 122, 1) 0%, rgba(25, 97, 173, 1) 100%);
+	color: #fff;
+}
+.goods_skus .sku_list .sku_item{
+	background-color: #f8f8f8;
+	padding: 10upx 20upx;
+	margin-right: 20upx;
+	margin-bottom: 20upx;
+	border-radius: 5upx;
+	font-size: 28upx;
+}
 </style>

+ 2 - 2
pages/order/detail.vue

@@ -72,7 +72,7 @@ export default {
 					Api.detail({"code":lres.code,"order":app.order}).then((res)=>{
 						uni.hideLoading();
 						if (res.code == 0) {
-							return app.$dialog.showSuccess(res.info);
+							return app.$dialog.showSuccess(res.msg);
 						}
 						uni.setStorageSync("user_data", res.data.user)
 						uni.setStorageSync("user_token", res.data.user.access_token)
@@ -95,7 +95,7 @@ page{background-color: #f8f8f8;}
 .dialog-msg .msg-body .title image{width: 60upx;height: 60upx;position: absolute;top: 0;right: 0;}
 .dialog-msg .msg-body .desc{line-height: 48upx;color: #666;font-weight: bold;font-size: 26upx;}
 
-.coupon-item{background-color: #fff;border-radius: 10upx;width: calc(100% - 40upx);margin: 20upx auto;box-shadow: 8px 8px 20px 0 rgba(55, 99, 170, .1);border: 2upx solid #fff;border-radius: 10upx;position: relative;}
+.coupon-item{background-color: #fff;border-radius: 10upx;width: calc(100% - 40upx);margin: 20upx auto;border: 2upx solid #fff;border-radius: 10upx;position: relative;}
 .coupon-item .state-img{position: absolute;right: 0;top: 0;}
 .coupon-item .state-img image{width: 100upx;height: 100upx;}
 .coupon-item .header{padding: 20upx;font-size: 28upx;color: #333;line-height: 48upx;border-bottom: 2upx solid #f8f8f8;}

+ 251 - 0
pages/order/info.vue

@@ -0,0 +1,251 @@
+<template>
+	<view>
+		<block v-if="loading">
+			<view class="skeleton">
+				<view class="skeleton-line max animate" style="height: 200upx;"></view>
+				<view class="skeleton-line animate"></view>
+				<view class="skeleton-line min animate"></view>
+				<view class="skeleton-line min animate"></view>
+				<view class="skeleton-line max animate" style="height: 200upx;"></view>
+				<view class="skeleton-line max animate" style="height: 200upx;"></view>
+			</view>
+		</block>
+		<block v-else>
+			<view class="order-status">
+				<view class="status-name" v-if="orderData.status == 1">已核销</view>
+				<view class="status-name success" v-if="orderData.status == 2">预约中</view>
+				<view class="status-name" v-if="orderData.status == 3">已撤销</view>
+				<view class="status-name" v-if="orderData.status == 4">已完成</view>
+				
+				<view class="status-desc" v-if="orderData.status == 1">团购券已完成核销</view>
+				<view class="status-desc success" v-if="orderData.status == 2">预约中,如有问题可以联系客服</view>
+				<view class="status-desc" v-if="orderData.status == 3">已撤销,可在团购订单中申请退款</view>
+				<view class="status-desc" v-if="orderData.status == 4">服务已完成,欢迎您再次使用</view>
+				
+			</view>
+			<view class="order-goods">
+				<view class="goods-img"><image :src="orderData.goods.product_img"></image></view>
+				<view class="goods-info">
+					<view class="name">{{ orderData.goods.product_name }}</view>
+					<view class="desc">
+						<view class="time" v-if="orderData.end_at">有效期至:{{ orderData.end_at }} </view>
+						<view class="num">x {{ orderData.number?orderData.number:1 }}</view>
+					</view>
+					<view class="total">合计:¥ {{orderData.goods.product_price}}</view>
+				</view>
+			</view>
+			<view class="goods-store" v-if="poiData">
+				<view class="title">预约门店</view>
+				<view class="store-info">
+					<view class="store-left">
+						<view class="name">{{poiData.poi_name}}</view>
+						<view class="address">{{poiData.poi_address}}</view>
+					</view>
+					<view class="store-right">
+						<view class="right-item">
+							<image src="/static/image/map.png"></image>
+							<view class="desc">导航</view>
+						</view>
+					</view>
+				</view>
+			</view>
+			<view class="order-info">
+				<view class="title">订单信息</view>
+				<view class="info-item">
+					<view class="name">订单编号</view>
+					<view class="right">{{ orderData.order_id }} <text @click="copyOrder(orderData.order_id)">复制</text></view>
+				</view>
+				<view class="info-item">
+					<view class="name">下单时间</view>
+					<view class="right">{{ orderData.create_at }}</view>
+				</view>
+			</view>
+			<view class="order-info" v-if="orderData.service_type==1">
+				<view class="title">预约信息</view>
+				<view class="info-item">
+					<view class="name">到店时间</view>
+					<view class="right">{{ orderData.time }}</view>
+				</view>
+			</view>
+			<view class="order-info" v-if="orderData.service_type==2">
+				<view class="title">会员资料</view>
+				<view class="info-item">
+					<view class="name"></view>
+					<view class="right">{{ orderData.username }}<text>{{ orderData.mobile }}</text></view>
+				</view>
+				<view class="address-info">
+					{{ orderData.region }}{{ orderData.address }}
+				</view>
+			</view>
+			
+			<view class="line-footer"></view>
+			<view class="footer">
+				<view class="footer-op" v-if="orderData.status == 1">
+					<view class="footer-right">
+						<view class="btn">已核销</view>
+					</view>
+				</view>
+				<view class="footer-op" v-if="orderData.status == 2">
+					<view class="footer-left" @click="cancelOrder"><text>取消预约</text></view>
+					<view class="footer-right">
+						<pay-button-sdk
+							:mode="1"
+						  :goods-id="orderData.goods.out_id"
+						  :order-id="orderData.order_sn"
+						  :order-status="1"
+						  :refund-total-amount="orderData.goods.product_price*100"
+						  :apply-refund-params="applyRefundParams"
+						/>
+						<view class="btn">服务进行中</view>
+					</view>
+				</view>
+				<view class="footer-op" v-if="orderData.status == 3">
+					<view class="footer-right" @click="toGoods">
+						<view class="btn">已撤销</view>
+					</view>
+				</view>
+				<view class="footer-op" v-if="orderData.status == 4">
+					<view class="footer-right">
+						<view class="btn">已完成</view>
+					</view>
+				</view>
+				<view class="footer-safe"></view>
+			</view>
+		</block>
+	</view>
+</template>
+
+<script>
+var app;
+import * as Api from "@/static/api/order.js";
+export default {
+	data() {
+		return {
+			loading:true,
+			order:"",
+			poiData:null,
+			goodsData:null,
+			orderData:null,
+			storeData:null,
+			orderIdForRefundAmount:"",
+			applyRefundParams:{
+				orderId:""
+			}
+			
+		}
+	},
+	onLoad({order}) {
+		app = this;
+		app.order = order;
+		app.getOrder()
+	},
+	methods: {
+		toRefund(){
+			
+		},
+		applyrefund(event) { 
+			console.log('退款申请',event);
+			const { orderId } = event.detail; 
+			console.log('退款申请-02',orderId);
+			const extra = { orderId }; // 开发者需要透传的参数,可自定义内容 
+			return new Promise(resolve => { 
+				resolve(extra); 
+			}); 
+		},
+		cancelOrder(){
+			app.$dialog.showError("确定要取消该预约吗?",function(res){
+				if (res.confirm) {
+					Api.cancel({"order":app.order}).then((res)=>{
+						if (res.code == 0) {
+							return app.$dialog.showSuccess(res.msg)
+						}
+						app.$dialog.showSuccess(res.msg,"none",function(){
+							app.getOrder()
+						})
+					})
+				}
+			},"取消预约")
+		},
+		getOrder(){
+			Api.orderDetail({"order":app.order}).then((res)=>{
+				app.loading = false;
+				if (res.code !== 1) {
+					app.$dialog.showSuccess(res.msg,function(){
+						uni.navigateBack()
+					});
+					return ;
+				}
+				app.applyRefundParams.orderId = res.data.order_id;
+				app.orderData = res.data
+				app.poiData = res.data.poi;
+			})
+		}
+	}
+}
+</script>
+
+<style>
+
+page{background-color: #f8f8f8;}
+.skeleton{width: 90%;margin: 20upx auto;}
+.line-footer{height: 200upx;}
+
+.address-info{font-size: 28upx;color: #333;}
+.footer{position: fixed;bottom: 0;background-color: #fff;padding: 20upx 20upx 0 20upx;border-top: 2upx solid #f8f8f8;left: 0;right: 0;}
+.footer .footer-op{display: flex;align-items: center;}
+.footer .footer-op .footer-left{display: flex;align-items: center;gap: 10upx;justify-content: center;font-size: 32upx;color: #f00;font-weight: bold;}
+.footer .footer-op .footer-left text{color: #666;font-size: 24upx;font-weight: normal;}
+.footer .footer-op .footer-left .item{flex-direction: column;display: flex;font-size: 24rpx;color: #333;align-items: center;}
+.footer .footer-op .footer-left image{width: 40upx;height: 40upx;}
+
+.footer .footer-op .footer-right{margin-left: auto;margin-right: 0;display: flex;align-items: center;gap: 20upx;}
+.footer .footer-op .footer-right .btn{font-size: 28rpx;height: 80upx;border-radius: 10upx;line-height: 80upx;text-align: center;width: 200upx;color: #333;border: 2upx solid #ccc;}
+.footer .footer-op .footer-right .btn.danger{border:2upx solid #f00;color: #f00;}
+.footer .footer-op .footer-right .btn.full{background-color: #007aff;color: #fff;border:2upx solid #007aff;}
+.footer .footer-safe {height: env(safe-area-inset-bottom);width: 100%;}
+
+.order-status{padding: 40upx 20upx;text-align: center;}
+.order-status .status-name{text-align: center;font-size: 32upx;color: #333;font-weight: bold;display: flex;align-items: center;justify-content: center;}
+.order-status .status-desc{font-size: 24upx;color: #666;margin-top: 20upx;}
+
+.order-info{background-color: #fff;padding: 20upx;margin-top: 20upx;}
+.order-info .title{font-size: 32upx;color: #333;font-weight: bold;margin-bottom: 20upx;}
+.order-info .info-item{height: 80upx;line-height: 80upx;font-size: 28upx;display: flex;align-items: center;}
+.order-info .info-item .right{color: #666;margin-left: auto;margin-right: 0;}
+.order-info .info-item .right text{border: 2upx solid #ccc;color: #333;font-size: 24upx;padding: 0 15upx;margin-left: 20upx;border-radius: 5upx;}
+
+.goods-safe{display: flex;align-items: center;font-size: 24rpx;color: #999;gap: 40upx;background: #fff;border-top: 2upx solid #f8f8f8;padding: 20upx;}
+.goods-safe .safe-item{display: flex;align-items: center;}
+.goods-safe image{width: 30upx;height: 30upx;margin-right: 10upx;}
+
+.order-goods{display: flex;align-items: center;background-color: #fff;padding: 0 20upx;}
+.order-goods image{width: 140upx;height: 140upx;}
+.goods-info{margin-left: 20upx;font-size: 28upx;flex: 1;padding: 20upx 0;}
+.goods-info .name{font-size: 30upx;color: #333;}
+.goods-info .desc{font-size: 24upx;color: #999;display: flex;align-items: center;justify-content: space-between;margin: 20upx 0;}
+.goods-info .total{font-size: 30upx;color: #333;text-align: right;font-weight: bold;}
+
+.home-store{margin: 20upx auto;display: flex;align-items: center;background-color: #fff;border-radius: 10upx;display: flex;align-items: center;padding: 30upx;}
+.home-store .store-right{width: 120upx;height: 120upx;background-color: #fff;text-align: center;display: flex;align-items: center;justify-content: center;margin-left: auto;margin-right: 0;border-radius: 10upx;}
+.home-store .store-right image{width: 60upx;height: 60upx;}
+.home-store .left{display: flex;align-items: center;}
+.home-store .left image{width: 60upx;height: 60upx;margin-right: 20upx;}
+.home-store .right {margin-left: auto;margin-right: 0;display: flex;align-items: center;}
+.home-store .right image{width: 50upx;height: 50upx;}
+.home-store .name{font-size: 32upx;color: #000;font-weight: bold;}
+.home-store .desc{font-size: 26upx;color: #666;margin-top: 20upx;}
+.home-store .status{color: #333;font-size: 28upx;padding:5upx 15upx;border-radius: 10upx;margin-left: 10upx;}
+.home-store .status.error{background-color: #fef0f0;color: #f56c6c;}
+.service-popup .item{height: 100upx;line-height: 100upx;text-align: center;font-size: 28upx;color: #333;border-bottom: 2upx solid #f8f8f8;}
+.service-popup .item .btn{background-color: #fff;border: 0;height: 100upx;line-height: 100upx;text-align: center;font-size: 28upx;color: #333;}
+.service-popup .item .btn::after{border: 0;}
+.service-popup .foot{height: 100upx;line-height: 100upx;text-align: center;font-size: 28upx;color: #333;border-top: 20upx solid #f8f8f8;}
+
+.goods-store{background-color: #fff;padding: 0 20upx;margin-top: 20upx;}
+.goods-store .title{line-height: 80upx;font-size: 32rpx;color: #333;font-weight: bold;display: flex;align-items: center;border-bottom: 2upx solid #f8f8f8;}
+.goods-store .store-info{display: flex;align-items: center;padding: 20upx 0;}
+.goods-store .store-info .store-right{margin-left: auto;margin-right: 0;font-size: 24rpx;color: #999;}
+.goods-store .store-info .store-right image{width: 50upx;height: 50upx;margin-bottom: 10upx;}
+.goods-store .store-info .store-left .name{font-size: 30rpx;color: #333;font-weight: bold;line-height: 80upx;}
+.goods-store .store-info .store-left .address{font-size: 24rpx;color: #999;}
+</style>

+ 59 - 9
pages/order/order.vue

@@ -4,15 +4,41 @@
 			<view class="header-tabs">
 				<view @click="checkType(0)" :class="tabType==0?'tab-item active':'tab-item'">全部</view>
 				<view @click="checkType(1)" :class="tabType==1?'tab-item active':'tab-item'">已核销</view>
-				<view @click="checkType(2)" :class="tabType==2?'tab-item active':'tab-item'">已撤销</view>
-				<view @click="checkType(3)" :class="tabType==3?'tab-item active':'tab-item'">已完成</view>
+				<view @click="checkType(2)" :class="tabType==2?'tab-item active':'tab-item'">预约中</view>
+				<view @click="checkType(3)" :class="tabType==3?'tab-item active':'tab-item'">已撤销</view>
+				<view @click="checkType(4)" :class="tabType==4?'tab-item active':'tab-item'">已完成</view>
 			</view>
 		</view>
-		<view class="order-body">
-			<view class="empty-data" v-if="dataList.length == 0">
-				<image src="/static/image/order_none.png" mode="widthFix"></image>
-				<view class="name">还没有订单</view>
-			</view>
+		<view class="order-body">
+			<z-paging ref="paging" show-refresher-update-time v-model="dataList" @query="queryList" :fixed="false">
+				<view class="order-item" v-for="(item,indx) in dataList" :key="indx">
+					<view class="item-header" @click="toDetail(item.order_sn)">
+						<view class="order-status" v-if="item.status == 1">已核销</view>
+						<view class="order-status success" v-if="item.status == 2">预约中</view>
+						<view class="order-status" v-if="item.status == 3">已撤销</view>
+						<view class="order-status" v-if="item.status == 4">已完成</view>
+						<view class="order-time">订单号 :{{ item.order_id }}</view>
+					</view>
+					<view class="order-goods" @click="toDetail(item.order_sn)">
+						<view class="goods-img"><image :src="item.goods.product_img"></image></view>
+						<view class="goods-info">
+							<view class="name">{{ item.goods.product_name }}</view>
+							<view class="desc">
+								<view class="time" v-if="item.end_at">有效期至:{{ item.end_at }} </view>
+								<view class="num">x {{ item.number?item.number:1 }}</view>
+							</view>
+							<view class="total">合计:¥ {{ item.goods.product_price }}</view>
+						</view>
+					</view>
+					<view class="order-footer">
+						<view class="footer-l">{{item.create_at}}</view>
+						<view class="footer-r">
+							<view class="btn blue" v-if="item.status == 2" @click="toDetail(item.order_sn)">取消预约</view>
+							<view class="btn danger" v-else @click="toDetail(item.order_sn)">详情</view>
+						</view>
+					</view>
+				</view>
+			</z-paging>
 		</view>
 	</view>
 </template>
@@ -31,7 +57,12 @@ export default {
 	onLoad() {
 		app = this;
 	},
-	methods: {
+	methods: {
+		toDetail(order){
+			uni.navigateTo({
+				url:"/pages/order/info?order="+order
+			})
+		},
 		checkType(type){
 			app.tabType = type;
 			app.queryList(1,10);
@@ -103,5 +134,24 @@ page{
 			}
 		}
 	}
-}
+}
+
+.order-footer{display: flex;text-align: right;padding: 20upx 0;border-top: 2upx solid #f8f8f8;align-items: center;}
+.order-footer .footer-l{font-size: 28upx;color: #666;}
+.order-footer .footer-r{display: flex;margin-left: auto;margin-right: 0;flex: 1;justify-content: end;gap: 20upx;}
+.order-footer .btn{width: 160upx;height: 60upx;line-height: 60upx;text-align: center;border: 2upx solid #ccc;color: #333;font-size: 28upx;border-radius: 10upx;}
+.order-footer .btn.danger{border:2upx solid #f00;color: #f00;}
+.order-footer .btn.blue{border:2upx solid #007aff;color: #007aff;}
+
+.order-item{background-color: #fff;padding: 0 20upx;border-radius: 10upx;margin-top: 20upx;}
+.order-item .item-header{display: flex;align-items: center;height: 80upx;line-height: 80upx;border-bottom: 2upx solid #f8f8f8;}
+.order-item .item-header .order-status{font-size: 28upx;color: #f00;}
+.order-item .item-header .order-status.success{color: #007aff;}
+.order-item .item-header .order-time{font-size: 24upx;color: #999;margin-left: auto;margin-right: 0;}
+.order-item .order-goods{display: flex;align-items: center;}
+.order-item .order-goods image{width: 140upx;height: 140upx;}
+.order-item .goods-info{margin-left: 20upx;font-size: 28upx;flex: 1;padding: 20upx 0;}
+.order-item .goods-info .name{font-size: 30upx;color: #333;}
+.order-item .goods-info .desc{font-size: 24upx;color: #999;display: flex;align-items: center;justify-content: space-between;margin: 20upx 0;}
+.order-item .goods-info .total{font-size: 30upx;color: #333;text-align: right;font-weight: bold;}
 </style>

+ 11 - 3
pages/order/store.vue

@@ -64,14 +64,22 @@ export default {
 			app.disabled = true;
 			var poi = app.storeData[app.checkIndex];
 			uni.navigateTo({
-				url:"/pages/order/confirm?order="+app.order+"&poi_id="+poi.poi_id+"&poi_name="+poi.poi_name+"&juli="+poi.juli
+				url:"/pages/order/confirm?order="+app.order+"&poi_id="+poi.poi_id+"&poi_name="+poi.poi_name+"&juli="+poi.juli,
+				success() {
+					app.disabled = false;
+				}
 			})
 		},
 		checkStore(index){
 			app.checkIndex = index;
 		},
-		tel(){
-			
+		tel(){
+			if (!app.storeInfo.service_mobile){
+				return app.$dialog.showSuccess("客服电话尚未配置")
+			}
+			uni.makePhoneCall({
+				phoneNumber:app.storeInfo.service_mobile
+			})
 		},
 		locaJump(longitude,latitude){
 			uni.openLocation({

+ 203 - 0
pages/user/address.vue

@@ -0,0 +1,203 @@
+<template>
+	<view>
+		<view class="address-list">
+			<z-paging ref="paging" show-refresher-update-time v-model="dataList" @query="queryList" :fixed="false">
+				<view class="list-item" v-for="(item,index) in dataList" :key="index">
+					<view class="item-left" @click="checkAddress(item)">
+						<view class="title"><text v-if="item.is_default == 1">默认</text> {{item.region}}</view>
+						<view class="name">{{item.address}}</view>
+						<view class="mobile">{{item.username}}<text>{{item.mobile}}</text></view>
+					</view>
+					<view class="item-right">
+						<view class="icon" @click="edit(item)"><image src="/static/image/edit.png"></image></view>
+						<view class="icon" @click="del(item.id)"><image src="/static/image/del.png"></image></view>
+					</view>
+				</view>
+			</z-paging>
+		</view>
+		<view class="flx-footer">
+			<view class="check-btn"><button class="btn" :disabled="disabled" @click="add">{{disabled?'处理中...':'新增地址'}}</button></view>
+			<view class="footer-safe"></view>
+		</view>
+		<uni-popup ref="popup" type="bottom" borderRadius="10px 10px 0 0" backgroundColor="#F8F8F8">
+			<view class="time-select">
+				<view class="title">{{mode=='add'?'新增':'编辑'}}地址
+					<view class="close" @click="close()"><image src="/static/image/round_close.png"></image></view> 
+				</view>
+			</view>
+			<view class="goods-body">
+				<view class="goods-form">
+					<view class="form-title">会员姓名</view>
+					<view class="form-input">
+						<input placeholder="请输入会员姓名" v-model="formData.username" class="input" />
+					</view>
+				</view>
+				<view class="goods-form">
+					<view class="form-title">联系电话</view>
+					<view class="form-input">
+						<input placeholder="请输入联系电话" v-model="formData.mobile" class="input" />
+					</view>
+				</view>
+				<view class="goods-form">
+					<view class="form-title">联系地区</view>
+					<view class="form-input">
+						<picker @change="bindPickerChange" mode="region">
+							<view class="region-name">{{regionName?regionName:'请选择'}}</view>
+						</picker>
+					</view>
+				</view>
+				<view class="goods-form">
+					<view class="form-title">详细地址</view>
+					<view class="form-input">
+						<input placeholder="请输入详细地址" v-model="formData.address" class="input" />
+					</view>
+				</view>
+			</view>
+			<view class="time-btn">
+				<button class="btn" :disabled="disabled" @click="submit">{{disabled?'处理中...':'确认'}}</button>
+			</view>
+		</uni-popup>
+	</view>
+</template>
+
+<script>
+var app;
+import * as Api from "@/static/api/address.js";
+import form from "@/static/js/form.js";
+export default {
+	data() {
+		return {
+			type:1,
+			mode:"add",
+			regionName:null,
+			formData:{},
+			disabled:false,
+			dataList:[]
+		}
+	},
+	onLoad({type}) {
+		app = this;
+		app.type = type;
+	},
+	methods: {
+		queryList(pageNo, pageSize){
+			var formData = {};
+			formData.page = pageNo;
+			formData.size = pageSize;
+			Api.data(formData).then((res)=>{
+				uni.hideLoading();
+				if (res.code !== 1) {
+					this.$refs.paging.complete(false);
+					return false;
+				}
+				this.$refs.paging.complete(res.data.rows);
+			})
+		},
+		checkAddress(data){
+			if (app.type == 2) {
+				var pages = getCurrentPages();
+				//获取上一个页面实例对象
+				let beforePage = pages[pages.length - 2];
+				//触发上一个页面中的getUserInfo方法
+				beforePage.$vm.getBackInfo(data);
+				uni.navigateBack();
+			}
+		},
+		del(id){
+			app.$dialog.showError("确定要删除该地址信息吗?",function(res){
+				if (res.confirm) {
+					Api.del({"id":id}).then((resp)=>{
+						if (resp.code == 0) {
+							return app.$dialog.showSuccess(resp.msg);
+						}
+						app.$dialog.showSuccess(resp.msg);
+						app.queryList(1,10);
+					})
+				}
+			});
+		},
+		edit(data){
+			app.formData = data;
+			app.mode = "edit";
+			app.regionName = data.region
+			app.$refs.popup.open()
+		},
+		bindPickerChange(e){
+			var name = "";
+			var regionData = e.detail.value;
+			regionData.forEach((item)=>{
+				name += item
+			})
+			app.regionName = name;
+		},
+		close(){
+			app.$refs.popup.close()
+		},
+		add(){
+			app.mode = "add";
+			app.$refs.popup.open()
+		},
+		submit(){
+			var {formData} = this;
+			formData.region = app.regionName;
+			var submitData = JSON.parse(JSON.stringify(formData))
+			var validation = form.validation(submitData,[
+				{name:"username",rule:["required"],msg:["请输入姓名"]},
+				{name:"mobile",rule:["required","isMobile"],msg:["请输入手机号","手机号格式错误"]},
+				{name:"region",rule:["required"],msg:["请选择地区"]},
+				{name:"address",rule:["required"],msg:["请输入详细地址"]}
+			]);
+			if(validation) return app.$dialog.showSuccess(validation);
+			app.disabled = true;
+			Api.save(submitData).then((res)=>{
+				app.disabled = false;
+				if (res.code == 0) {
+					return app.$dialog.showSuccess(res.msg);
+				}
+				app.$refs.popup.close()
+				app.$dialog.showSuccess(res.msg);
+				app.queryList(1,10);
+			})
+		}
+	}
+}
+</script>
+
+<style>
+.address-list{height: 100vh;}
+.address-list .list-item{background-color: #fff;margin-top: 20upx;display: flex;align-items: center;justify-content: space-between;padding: 20upx;}
+.address-list .list-item .title{font-size: 24upx;color: #666;margin-bottom: 20upx;}
+.address-list .list-item .name{font-size: 28upx;color: #333;margin-bottom: 20upx;}
+.address-list .list-item .mobile{font-size: 28upx;color: #666;margin-bottom: 20upx;}
+.address-list .list-item .mobile text{margin-left: 20upx;}
+.address-list .list-item .item-right{display: flex;align-items: center;gap: 20upx;}
+.address-list .list-item .item-right .icon{width: 60upx;height: 60upx;background-color: #f8f8f8;border-radius: 30upx;text-align: center;justify-content: center;align-items: center;display: flex;}
+.address-list .list-item .item-right image{width: 40upx;height: 40upx;}
+.empty-data{
+	display: flex;
+	height: 80vh;
+	align-items: center;
+	justify-content: center;
+	flex-direction: column;
+	font-size: 28upx;
+	color: #666;
+}
+.empty-data image{
+	width: 50%;
+}
+.time-select .title{height: 100upx;line-height: 100upx;display: flex;align-items: center;justify-content: space-between;font-size: 32upx;padding: 0 20upx;font-weight: bold;}
+.time-select image{width: 40upx;height: 40upx;vertical-align: middle;}
+.time-btn{padding: 20upx;}	
+.goods-body{padding: 20upx;}
+.goods-body .goods-title{font-size: 28upx;color: #333;line-height: 80upx;}
+.goods-body .goods-title text{color: #f00;}
+.goods-body .form-title{margin-top: 40upx;font-size: 28upx;color: #666;}
+.goods-form{margin-bottom: 20upx;}
+.goods-form .form-input{border: 2upx solid #ccc;height: 80upx;margin-top: 20upx;padding: 0 15upx;}
+.region-name{height: 80upx;line-height: 80upx;font-size: 24upx;}
+.goods-form .form-input .input{font-size: 24upx;height: 80upx;}
+
+.flx-footer{position: fixed;bottom: 0;background-color: #fff;padding: 20upx;border-top: 2upx solid #f8f8f8;left: 0;right: 0;}
+.flx-footer .footer-safe {height: env(safe-area-inset-bottom);width: 100%;}
+.flx-footer .btn,.time-btn .btn{font-size: 28rpx;height: 80upx;border-radius: 10upx;line-height: 80upx;text-align: center;width: 100%;color: #333;background-color: #224d7a;color: #fff;border:2upx solid #224d7a;}
+</style>

+ 18 - 16
pages/user/user.vue

@@ -21,13 +21,13 @@
 				<view class="icon"><image src="/static/image/info.png"></image></view>
 				<view class="name">个人信息</view>
 				<view class="right"><image src="/static/image/right.png"></image></view>
-			</view>
-			<view class="menu-item">
+			</view> -->
+			<navigator hover-class="none" url="/pages/user/address?type=1" class="menu-item">
 				<view class="icon"><image src="/static/image/address.png"></image></view>
 				<view class="name">会员地址</view>
 				<view class="right"><image src="/static/image/right.png"></image></view>
-			</view>
-			<view class="menu-item" @click="showService()">
+			</navigator>
+			<!-- <view class="menu-item" @click="showService()">
 				<view class="icon"><image src="/static/image/service.png"></image></view>
 				<view class="name">客服</view>
 				<view class="right"><image src="/static/image/right.png"></image></view>
@@ -47,25 +47,27 @@
 </template>
 
 <script>
-var app;
+var app;
+import * as Api from "@/static/api/user.js";
 export default {
 	data() {
 		return {
-			userInfo:null,
-			storeData:{}
+			userInfo:null
 		}
 	},
-	onShow() {
-		var userInfo = uni.getStorageSync("user_data")
-		if (userInfo) {
-			this.userInfo = userInfo;
-		}
-	},
 	onLoad() {
-		app = this;
-		app.storeData = uni.getStorageSync("contact");
+		app = this;
+		app.getData()
 	},
-	methods: {
+	methods: {
+		getData(){
+			Api.info({}).then((res)=>{
+				if (res.code == 0) {
+					return app.$dialog.showSuccess(res.msg)
+				}
+				app.userInfo = res.data;
+			})
+		},
 		outLogin(order){
 			app.$dialog.showError("确定要退出登录吗",function(res){
 				if (res.confirm) {

BIN
static/.DS_Store


+ 19 - 0
static/api/address.js

@@ -0,0 +1,19 @@
+import request from '@/static/js/request.js'
+
+const apiUri = {
+	data: '/address/data',
+	save: '/address/save',
+	del: '/address/del'
+}
+
+export function data(param) {
+	return request.request(apiUri.data,'GET', param,false,true,false)
+}
+
+export function save(param) {
+	return request.request(apiUri.save,'POST', param,false,true,false)
+}
+
+export function del(param) {
+	return request.request(apiUri.del,'POST', param,false,true,false)
+}

+ 18 - 3
static/api/order.js

@@ -2,9 +2,17 @@ import request from '@/static/js/request.js'
 
 const apiUri = {
 	store: '/order/store',
-	detail: '/confirm/detail',
+	detail: '/confirm/detail',
+	submit: '/confirm/submit',
+	order: '/order/data',
+	orderDetail: '/order/detail',
+	cancel: '/order/cancel',
 }
 
+export function cancel(param) {
+	return request.request(apiUri.cancel,'POST', param,false,true,false)
+}
+
 export function store(param) {
 	return request.request(apiUri.store,'POST', param,false,true,false)
 }
@@ -13,7 +21,14 @@ export function detail(param) {
 	return request.request(apiUri.detail,'POST', param,false,true,false)
 }
 
+export function orderDetail(param) {
+	return request.request(apiUri.orderDetail,'GET', param,false,true,false)
+}
+
+export function submit(param) {
+	return request.request(apiUri.submit,'POST', param,false,true,false)
+}
 
-export function license(param) {
-	return request.request(apiUri.license,'POST', param,false,true,false)
+export function order(param) {
+	return request.request(apiUri.order,'GET', param,false,true,false)
 }

BIN
static/image/del.png


BIN
static/image/edit.png


+ 1 - 1
static/js/common.js

@@ -1,6 +1,6 @@
 export default {
 	shopName(){
-		return "曦成自助核销";
+		return "";
 	},
 	clearUri(url){
 		var userInfo = uni.getStorageSync("user_data");

+ 2 - 2
static/js/request.js

@@ -13,8 +13,8 @@ const axg = {
 		return '/api';
 		// #endif
 		// #ifdef MP
-		// return 'https://apiv.jsshuita.com.cn/mini'
-		return 'http://127.0.0.1:8190/api/dy'
+		return 'https://miniapi.jsshuita.com.cn/api/dy'
+		// return 'http://127.0.0.1:8190/api/dy'
 		// #endif
 	},
 	toast: function(text, duration, success) { 

+ 13 - 0
uni.promisify.adaptor.js

@@ -0,0 +1,13 @@
+uni.addInterceptor({
+  returnValue (res) {
+    if (!(!!res && (typeof res === "object" || typeof res === "function") && typeof res.then === "function")) {
+      return res;
+    }
+    return new Promise((resolve, reject) => {
+      res.then((res) => {
+        if (!res) return resolve(res) 
+        return res[0] ? reject(res[0]) : resolve(res[1])
+      });
+    });
+  },
+});

+ 0 - 5
uni_modules/uview-ui/libs/config/config.js

@@ -1,11 +1,6 @@
 // 此版本发布于2024-03-17
 const version = '2.0.37'
 
-// 开发环境才提示,生产环境不会提示
-if (process.env.NODE_ENV === 'development') {
-	console.log(`\n %c uView V${version} %c https://uviewui.com/ \n\n`, 'color: #ffffff; background: #3c9cff; padding:5px 0; border-radius: 5px;');
-}
-
 export default {
     v: version,
     version,

+ 0 - 0
unpackage/dist/build/.automator/mp-toutiao/.automator.json


+ 4 - 0
unpackage/dist/build/mp-toutiao/app.js

@@ -0,0 +1,4 @@
+
+require('./common/runtime.js')
+require('./common/vendor.js')
+require('./common/main.js')

+ 48 - 0
unpackage/dist/build/mp-toutiao/app.json

@@ -0,0 +1,48 @@
+{
+  "pages": [
+    "pages/index/index",
+    "pages/order/order",
+    "pages/user/user",
+    "pages/order/confirm",
+    "pages/order/detail",
+    "pages/user/license",
+    "pages/order/store",
+    "pages/user/address",
+    "pages/order/info"
+  ],
+  "subPackages": [],
+  "window": {
+    "navigationBarTextStyle": "black",
+    "navigationBarTitleText": "团购自助兑换",
+    "navigationBarBackgroundColor": "#ffffff",
+    "backgroundColor": "#F8F8F8"
+  },
+  "tabBar": {
+    "backgroundColor": "#ffffff",
+    "borderStyle": "white",
+    "color": "#666666",
+    "selectedColor": "#224d7a",
+    "list": [
+      {
+        "iconPath": "/static/image/coupon.png",
+        "selectedIconPath": "/static/image/coupon-fill.png",
+        "pagePath": "pages/index/index",
+        "text": "首页"
+      },
+      {
+        "iconPath": "/static/image/order.png",
+        "selectedIconPath": "/static/image/order-fill.png",
+        "pagePath": "pages/order/order",
+        "text": "订单"
+      },
+      {
+        "iconPath": "/static/image/user.png",
+        "selectedIconPath": "/static/image/user-fill.png",
+        "pagePath": "pages/user/user",
+        "text": "我的"
+      }
+    ]
+  },
+  "component2": true,
+  "usingComponents": {}
+}

+ 3 - 0
unpackage/dist/build/mp-toutiao/app.ttss

@@ -0,0 +1,3 @@
+@import './common/main.ttss';
+
+[data-custom-hidden="true"],[bind-data-custom-hidden="true"]{display: none !important;}

+ 1 - 0
unpackage/dist/build/mp-toutiao/common/main.js

@@ -0,0 +1 @@
+(global["webpackJsonp"]=global["webpackJsonp"]||[]).push([["common/main"],{"30d7":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o={onLaunch:function(){console.log("App Launch")},onShow:function(){console.log("App Show")},onHide:function(){console.log("App Hide")}};t.default=o},"403a":function(e,t,n){},"626d":function(e,t,n){"use strict";(function(e,t){var o=n("47a9"),r=o(n("7ca3"));n("9861");var u=o(n("b091")),c=o(n("b89e")),a=o(n("d60c")),i=o(n("3240"));function f(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,o)}return n}n("e016"),e.__webpack_require_UNI_MP_PLUGIN__=n,i.default.use(c.default),i.default.prototype.$dialog=a.default,i.default.config.productionTip=!1,u.default.mpType="app";var l=new i.default(function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?f(Object(n),!0).forEach((function(t){(0,r.default)(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):f(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}({},u.default));t(l).$mount()}).call(this,n("a261")["default"],n("a261")["createApp"])},7229:function(e,t,n){"use strict";var o=n("403a"),r=n.n(o);r.a},9499:function(e,t,n){"use strict";n.r(t);var o=n("30d7"),r=n.n(o);for(var u in o)["default"].indexOf(u)<0&&function(e){n.d(t,e,(function(){return o[e]}))}(u);t["default"]=r.a},b091:function(e,t,n){"use strict";n.r(t);var o=n("9499");for(var r in o)["default"].indexOf(r)<0&&function(e){n.d(t,e,(function(){return o[e]}))}(r);n("7229");var u=n("828b"),c=Object(u["a"])(o["default"],void 0,void 0,!1,null,null,null,!1,void 0,void 0);t["default"]=c.exports}},[["626d","common/runtime","common/vendor"]]]);

+ 1 - 0
unpackage/dist/build/mp-toutiao/common/main.ttss

@@ -0,0 +1 @@
+page::after{position:fixed;content:'';left:-1000px;top:-1000px;-webkit-animation:shadow-preload .1s;-webkit-animation-delay:3s;animation:shadow-preload .1s;animation-delay:3s}@-webkit-keyframes shadow-preload{0%{background-image:url(https://cdn4.dcloud.net.cn/4f554d794f4545775179556c644851354f54466a5a575a684d5441324d5441305a444a694d44453d/img/shadow-grey.png)}100%{background-image:url(https://cdn4.dcloud.net.cn/4f554d794f4545775179556c644851354f54466a5a575a684d5441324d5441305a444a694d44453d/img/shadow-grey.png)}}@keyframes shadow-preload{0%{background-image:url(https://cdn4.dcloud.net.cn/4f554d794f4545775179556c644851354f54466a5a575a684d5441324d5441305a444a694d44453d/img/shadow-grey.png)}100%{background-image:url(https://cdn4.dcloud.net.cn/4f554d794f4545775179556c644851354f54466a5a575a684d5441324d5441305a444a694d44453d/img/shadow-grey.png)}}

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 2 - 0
unpackage/dist/build/mp-toutiao/common/runtime.js


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
unpackage/dist/build/mp-toutiao/common/vendor.js


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
unpackage/dist/build/mp-toutiao/pages/index/index.js


+ 6 - 0
unpackage/dist/build/mp-toutiao/pages/index/index.json

@@ -0,0 +1,6 @@
+{
+  "navigationBarTitleText": "团购自助兑换",
+  "usingComponents": {
+    "u-empty": "/uni_modules/uview-ui/components/u-empty/u-empty"
+  }
+}

+ 1 - 0
unpackage/dist/build/mp-toutiao/pages/index/index.ttml

@@ -0,0 +1 @@
+<view class="content"><block tt:if="{{coupon.length==0}}"><view class="empty-data"><u-empty vue-id="8dda190e-1" mode="order" icon="/static/image/order_none.png" text="暂无抖音团购订单" bind:__l="__l"></u-empty></view></block><block tt:else><view class="coupon-list"><block tt:for="{{coupon}}" tt:for-item="item" tt:for-index="indx" tt:key="indx"><view class="coupon-item"><view class="header">{{"订单编号 "+item.order_id}}</view><view class="body"><view class="img"><image src="{{item.product_img}}"></image></view><view class="info"><view class="name">{{item.product_name}}</view><view class="desc">{{"x "+item.count+"张"}}</view><view class="desc">{{"有效期至"+item.end_at}}</view></view></view><view class="footer"><view class="state"></view><button class="btn" type="primary" data-event-opts="{{[['tap',[['toDetail',['$0'],[[['coupon','',indx,'order_id']]]]]]]}}" bindtap="__e">立即使用</button></view><view class="state-img"><image src="/static/image/no.png" mode="widthFix"></image></view></view></block></view></block></view>

+ 1 - 0
unpackage/dist/build/mp-toutiao/pages/index/index.ttss

@@ -0,0 +1 @@
+page{background-color:#f8f8f8}.empty-data{height:100vh;display:flex;align-items:center;justify-content:center}.coupon-item{background-color:#fff;border-radius:10rpx;width:calc(95% - 40rpx);margin:20rpx auto;border:2rpx solid #fff;border-radius:10rpx;position:relative}.coupon-item .state-img{position:absolute;right:0;top:0}.coupon-item .state-img image{width:100rpx;height:100rpx}.coupon-item .header{padding:20rpx;font-size:28rpx;color:#333;line-height:48rpx;border-bottom:2rpx solid #f8f8f8}.coupon-item .footer{padding:20rpx;border-top:2rpx solid #f8f8f8;display:flex;justify-content:space-between}.coupon-item .footer .state{flex:1}.coupon-item .footer .btn{width:50%;font-size:28rpx}.coupon-item .body{display:flex;align-items:center;margin:20rpx 0}.coupon-item .img image{width:160rpx;height:160rpx}.coupon-item .info{margin-left:20rpx}.coupon-item .name{font-size:32rpx;color:#333;line-height:46rpx}.coupon-item .desc{color:#666;font-size:28rpx;line-height:48rpx}

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
unpackage/dist/build/mp-toutiao/pages/order/confirm.js


+ 7 - 0
unpackage/dist/build/mp-toutiao/pages/order/confirm.json

@@ -0,0 +1,7 @@
+{
+  "navigationBarTitleText": "确认订单",
+  "usingComponents": {
+    "u-skeleton": "/uni_modules/uview-ui/components/u-skeleton/u-skeleton",
+    "uni-popup": "/uni_modules/uni-popup/components/uni-popup/uni-popup"
+  }
+}

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
unpackage/dist/build/mp-toutiao/pages/order/confirm.ttml


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
unpackage/dist/build/mp-toutiao/pages/order/confirm.ttss


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
unpackage/dist/build/mp-toutiao/pages/order/detail.js


+ 6 - 0
unpackage/dist/build/mp-toutiao/pages/order/detail.json

@@ -0,0 +1,6 @@
+{
+  "navigationBarTitleText": "团购券",
+  "usingComponents": {
+    "u-skeleton": "/uni_modules/uview-ui/components/u-skeleton/u-skeleton"
+  }
+}

+ 1 - 0
unpackage/dist/build/mp-toutiao/pages/order/detail.ttml

@@ -0,0 +1 @@
+<view><block tt:if="{{orderData}}"><view class="coupon-list"><view class="coupon-item"><view class="header">{{"订单编号 "+orderData.order_id}}</view><view class="body"><view class="img"><image src="{{orderData.product_img}}"></image></view><view class="info"><view class="name">{{orderData.product_name}}</view><view class="desc">{{"x "+orderData.count+"张"}}</view><view class="desc">{{"有效期至"+orderData.end_at}}</view></view></view><view class="footer"><view class="state"></view><button class="btn" type="primary" data-event-opts="{{[['tap',[['toDetail',['$0'],['orderData.order_id']]]]]}}" bindtap="__e">立即使用</button></view><view class="state-img"><image src="/static/image/no.png" mode="widthFix"></image></view></view><navigator class="tips" hover-class="none" url="/pages/user/license">小程序资质亮照</navigator></view></block><block tt:else><view><u-skeleton vue-id="a2b31fcc-1" rows="3" title="{{true}}" loading="{{true}}" bind:__l="__l"></u-skeleton></view></block><block tt:if="{{msgDialog}}"><view class="dialog-msg"><view class="mark"></view><view class="msg-body"><view class="title">第三方服务声明<image src="/static/image/round_close.png" data-event-opts="{{[['tap',[['e0',['$event']]]]]}}" bindtap="__e"></image></view><view class="desc">本商品信息、交易以及售后服务由第三方提供,如由问题请联系在线客服或电话客服</view></view></view></block></view>

+ 1 - 0
unpackage/dist/build/mp-toutiao/pages/order/detail.ttss

@@ -0,0 +1 @@
+page{background-color:#f8f8f8}.dialog-msg .mark{position:fixed;top:0;left:0;right:0;bottom:0;z-index:90;background-color:rgba(0,0,0,.3)}.dialog-msg .msg-body{position:fixed;background-color:#fff;z-index:99;left:5%;right:5%;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%);border-radius:10rpx;padding:40rpx}.dialog-msg .msg-body .title{text-align:center;line-height:48rpx;color:#333;font-weight:700;margin-bottom:20rpx;position:relative;padding:20rpx 0}.dialog-msg .msg-body .title image{width:60rpx;height:60rpx;position:absolute;top:0;right:0}.dialog-msg .msg-body .desc{line-height:48rpx;color:#666;font-weight:700;font-size:26rpx}.coupon-item{background-color:#fff;border-radius:10rpx;width:calc(100% - 40rpx);margin:20rpx auto;border:2rpx solid #fff;border-radius:10rpx;position:relative}.coupon-item .state-img{position:absolute;right:0;top:0}.coupon-item .state-img image{width:100rpx;height:100rpx}.coupon-item .header{padding:20rpx;font-size:28rpx;color:#333;line-height:48rpx;border-bottom:2rpx solid #f8f8f8}.coupon-item .footer{padding:20rpx;border-top:2rpx solid #f8f8f8;display:flex;justify-content:space-between}.coupon-item .footer .state{flex:1}.coupon-item .footer .btn{width:50%;font-size:28rpx}.coupon-item .body{display:flex;align-items:center;margin:20rpx 0}.coupon-item .img image{width:160rpx;height:160rpx}.coupon-item .info{margin-left:20rpx}.coupon-item .name{font-size:32rpx;color:#333;line-height:46rpx}.coupon-item .desc{color:#666;font-size:28rpx;line-height:48rpx}.tips{text-align:center;line-height:80rpx;color:#666;font-size:28rpx}

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
unpackage/dist/build/mp-toutiao/pages/order/info.js


+ 4 - 0
unpackage/dist/build/mp-toutiao/pages/order/info.json

@@ -0,0 +1,4 @@
+{
+  "navigationBarTitleText": "预约详情",
+  "usingComponents": {}
+}

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
unpackage/dist/build/mp-toutiao/pages/order/info.ttml


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
unpackage/dist/build/mp-toutiao/pages/order/info.ttss


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
unpackage/dist/build/mp-toutiao/pages/order/order.js


+ 6 - 0
unpackage/dist/build/mp-toutiao/pages/order/order.json

@@ -0,0 +1,6 @@
+{
+  "navigationBarTitleText": "订单",
+  "usingComponents": {
+    "z-paging": "/uni_modules/z-paging/components/z-paging/z-paging"
+  }
+}

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
unpackage/dist/build/mp-toutiao/pages/order/order.ttml


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
unpackage/dist/build/mp-toutiao/pages/order/order.ttss


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
unpackage/dist/build/mp-toutiao/pages/order/store.js


+ 4 - 0
unpackage/dist/build/mp-toutiao/pages/order/store.json

@@ -0,0 +1,4 @@
+{
+  "navigationBarTitleText": "选择门店",
+  "usingComponents": {}
+}

+ 1 - 0
unpackage/dist/build/mp-toutiao/pages/order/store.ttml

@@ -0,0 +1 @@
+<view><view class="search"><image src="/static/image/search.png"></image><input class="search-input" type="text" placeholder="请输入关键字" data-event-opts="{{[['confirm',[['getStore',['$event']]]],['input',[['__set_model',['','keyword','$event',[]]]]]]}}" value="{{keyword}}" bindconfirm="__e" bindinput="__e"/></view><view class="store-list"><block tt:for="{{storeData}}" tt:for-item="item" tt:for-index="indx" tt:key="indx"><view data-event-opts="{{[['tap',[['checkStore',[indx]]]]]}}" class="{{(checkIndex==indx?'store-item active':'store-item')}}" bindtap="__e"><view class="item-left"><view class="name">{{item.poi_name}}</view><view class="desc">{{item.poi_address}}</view><block tt:if="{{storeInfo.status==1}}"><view class="desc">{{storeInfo.service_at_start+"-"+storeInfo.service_at_end}}</view></block><block tt:else><view class="desc">休息中</view></block></view><view class="item-right"><view class="top"><view data-event-opts="{{[['tap',[['tel']]]]}}" class="icon-img" bindtap="__e"><image src="/static/image/tel.png"></image></view><view data-event-opts="{{[['tap',[['locaJump',['$0','$1'],[[['storeData','',indx,'longitude']],[['storeData','',indx,'latitude']]]]]]]}}" class="icon-img" bindtap="__e"><image src="/static/image/map.png"></image></view></view><view class="footer">{{"距离"+item.juli+"公里"}}</view></view><view class="check"><image src="/static/image/check.png"></image></view></view></block></view><view class="flx-footer"><view class="check-btn"><button class="btn" disabled="{{disabled}}" data-event-opts="{{[['tap',[['checkOrder',['$event']]]]]}}" bindtap="__e">{{disabled?'处理中...':'确 认'}}</button></view><view class="footer-safe"></view></view></view>

+ 1 - 0
unpackage/dist/build/mp-toutiao/pages/order/store.ttss

@@ -0,0 +1 @@
+.search{padding:20rpx;display:flex;align-items:center;background-color:#fff;width:calc(95% - 60rpx);margin:20rpx auto;border-radius:60rpx}.search image{width:50rpx;height:46rpx}.search .search-input{border-radius:30rpx;font-size:28rpx;height:60rpx;margin-left:20rpx}.store-item{background-color:#fff;width:calc(95% - 40rpx);padding:20rpx;border-radius:20rpx;display:flex;align-items:center;justify-content:space-between;margin:20rpx auto;position:relative}.store-item.active{border:2rpx solid #224d7a}.store-item .check{display:none;position:absolute;top:0;right:0;background-color:#224d7a;width:40rpx;height:40rpx;border-radius:0 20rpx 0 20rpx}.store-item .check image{width:30rpx;height:30rpx;display:flex;align-items:center;justify-content:center;padding:5rpx}.store-item.active .check{display:block}.store-item .item-left{flex:1}.store-item .name{font-size:32rpx;color:#333;line-height:48rpx;font-weight:700}.store-item .desc{font-size:24rpx;color:#666;line-height:36rpx;margin-top:10rpx}.store-item .item-right{text-align:center}.store-item .item-right .footer{font-size:24rpx;color:#666}.store-item .item-right .top{display:flex;align-items:center;gap:20rpx;margin-bottom:20rpx}.store-item .item-right .top .icon-img{width:60rpx;height:60rpx;background-color:#f8f8f8;border-radius:60rpx;display:flex;align-items:center;justify-content:center}.store-item .item-right .top .icon-img image{width:40rpx;height:40rpx}.flx-footer{position:fixed;bottom:0;background-color:#fff;padding:20rpx;border-top:2rpx solid #f8f8f8;left:0;right:0}.flx-footer .footer-safe{height:env(safe-area-inset-bottom);width:100%}.flx-footer .btn{font-size:28rpx;height:80rpx;border-radius:10rpx;line-height:80rpx;text-align:center;width:100%;color:#333;background-color:#224d7a;color:#fff;border:2rpx solid #224d7a}.flx-footer .btn[disabled],.flx-footer .btn.disabled{background-color:rgba(34,77,122,.3)}

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
unpackage/dist/build/mp-toutiao/pages/user/address.js


+ 7 - 0
unpackage/dist/build/mp-toutiao/pages/user/address.json

@@ -0,0 +1,7 @@
+{
+  "navigationBarTitleText": "会员地址",
+  "usingComponents": {
+    "z-paging": "/uni_modules/z-paging/components/z-paging/z-paging",
+    "uni-popup": "/uni_modules/uni-popup/components/uni-popup/uni-popup"
+  }
+}

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
unpackage/dist/build/mp-toutiao/pages/user/address.ttml


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
unpackage/dist/build/mp-toutiao/pages/user/address.ttss


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
unpackage/dist/build/mp-toutiao/pages/user/license.js


+ 4 - 0
unpackage/dist/build/mp-toutiao/pages/user/license.json

@@ -0,0 +1,4 @@
+{
+  "navigationBarTitleText": "资质亮照",
+  "usingComponents": {}
+}

+ 1 - 0
unpackage/dist/build/mp-toutiao/pages/user/license.ttml

@@ -0,0 +1 @@
+<view><block tt:if="{{loading}}"><block><view class="skeleton"><view class="skeleton-line max animate" style="height:200rpx;"></view><view class="skeleton-line animate"></view><view class="skeleton-line min animate"></view><view class="skeleton-line min animate"></view><view class="skeleton-line max animate" style="height:200rpx;"></view><view class="skeleton-line max animate" style="height:200rpx;"></view></view></block></block><block tt:else><block><view class="info-item"><view class="title">营业执照</view><view data-event-opts="{{[['tap',[['preview',['$event']]]]]}}" class="img" bindtap="__e"><image src="{{license}}" mode="widthFix"></image></view></view><view class="info-item"><view class="title">特别提示</view><view class="info">商家资质图片为官方展示<text>严禁下载复印</text>,违者后果自负</view></view></block></block></view>

+ 1 - 0
unpackage/dist/build/mp-toutiao/pages/user/license.ttss

@@ -0,0 +1 @@
+page{background-color:#f8f8f8}.info-item{background-color:#fff;padding:20rpx;margin-bottom:20rpx}.info-item .title{font-size:30rpx;color:#333;font-weight:700;line-height:80rpx;border-bottom:2rpx solid #f8f8f8}.info-item .info{font-size:28rpx;color:#666;line-height:60rpx}.info-item .info text{color:red}.info-item image{width:100%}

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
unpackage/dist/build/mp-toutiao/pages/user/user.js


+ 4 - 0
unpackage/dist/build/mp-toutiao/pages/user/user.json

@@ -0,0 +1,4 @@
+{
+  "navigationBarTitleText": "我的",
+  "usingComponents": {}
+}

+ 1 - 0
unpackage/dist/build/mp-toutiao/pages/user/user.ttml

@@ -0,0 +1 @@
+<view><block tt:if="{{userInfo}}"><view class="user-header"><view class="avatar-btn"><image src="{{userInfo?userInfo.avatar:'https://inmei-print.oss-cn-guangzhou.aliyuncs.com/logo.png'}}"></image></view><view class="user-info"><view class="name">{{userInfo.nickname}}</view></view></view></block><block tt:else><view class="user-header"><view class="avatar-btn"><image src="https://inmei-print.oss-cn-guangzhou.aliyuncs.com/logo.png"></image></view><view class="user-info"><view data-event-opts="{{[['tap',[['toLogin',['$event']]]]]}}" class="name" bindtap="__e">请先登录</view></view></view></block><view class="user-menu"><navigator class="menu-item" hover-class="none" url="/pages/user/address?type=1"><view class="icon"><image src="/static/image/address.png"></image></view><view class="name">会员地址</view><view class="right"><image src="/static/image/right.png"></image></view></navigator><navigator class="menu-item" hover-class="none" url="/pages/user/license"><view class="icon"><image src="/static/image/zizhi.png"></image></view><view class="name">服务资质</view><view class="right"><image src="/static/image/right.png"></image></view></navigator><view data-event-opts="{{[['tap',[['outLogin',['$event']]]]]}}" class="menu-item" bindtap="__e"><view class="icon"><image src="/static/image/out.png"></image></view><view class="name">退出</view><view class="right"><image src="/static/image/right.png"></image></view></view></view></view>

+ 1 - 0
unpackage/dist/build/mp-toutiao/pages/user/user.ttss

@@ -0,0 +1 @@
+page{background-color:#f8f8f8}.user-header{background-color:#005bac;padding:40rpx;display:flex;align-items:center;background:linear-gradient(90deg,#094d89,#007aff);width:calc(95% - 80rpx);margin:40rpx auto;border-radius:10rpx}.user-header image{width:100rpx;height:100rpx;border-radius:100rpx}.user-header .user-info{margin-left:20rpx}.user-header .name{font-size:32rpx;color:#fff}.user-header .desc{font-size:24rpx;color:#f8f8f8;margin-top:20rpx}.user-menu{width:95%;margin:40rpx auto;border-radius:10rpx;background-color:#fff}.user-menu .menu-item{height:100rpx;line-height:100rpx;display:flex;align-items:center;font-size:28rpx;color:#333;padding:0 20rpx;border-bottom:2rpx solid #f8f8f8}.user-menu .menu-item .icon{margin-right:20rpx;display:flex;align-items:center;justify-content:center}.user-menu .menu-item .right{margin-right:0;margin-left:auto}.user-menu .menu-item .icon image{width:40rpx;height:40rpx}.user-menu .menu-item .right image{width:40rpx;height:40rpx}.service-popup .item{height:100rpx;line-height:100rpx;text-align:center;font-size:28rpx;color:#333;border-bottom:2rpx solid #f8f8f8}.service-popup .item .btn{background-color:#fff;border:0;height:100rpx;line-height:100rpx;text-align:center;font-size:28rpx;color:#333}.service-popup .item .btn::after{border:0}.service-popup .foot{height:100rpx;line-height:100rpx;text-align:center;font-size:28rpx;color:#333;border-top:20rpx solid #f8f8f8}

+ 11 - 0
unpackage/dist/build/mp-toutiao/project.config.json

@@ -0,0 +1,11 @@
+{
+  "setting": {
+    "urlCheck": true,
+    "es6": false,
+    "postcss": false,
+    "minified": false,
+    "newFeature": true
+  },
+  "appid": "tt991cefa106104d2b01",
+  "projectname": "核销工具DY"
+}

+ 5 - 0
unpackage/dist/build/mp-toutiao/project.private.config.json

@@ -0,0 +1,5 @@
+{
+    "setting": {
+        "urlCheck": false
+    }
+}

BIN
unpackage/dist/build/mp-toutiao/static/.DS_Store


+ 19 - 0
unpackage/dist/build/mp-toutiao/static/api/address.js

@@ -0,0 +1,19 @@
+import request from '@/static/js/request.js'
+
+const apiUri = {
+	data: '/address/data',
+	save: '/address/save',
+	del: '/address/del'
+}
+
+export function data(param) {
+	return request.request(apiUri.data,'GET', param,false,true,false)
+}
+
+export function save(param) {
+	return request.request(apiUri.save,'POST', param,false,true,false)
+}
+
+export function del(param) {
+	return request.request(apiUri.del,'POST', param,false,true,false)
+}

+ 19 - 0
unpackage/dist/build/mp-toutiao/static/api/home.js

@@ -0,0 +1,19 @@
+import request from '@/static/js/request.js'
+
+const apiUri = {
+	data: '/home/login',
+	detail: '/order/life',
+	license: '/home/license'
+}
+
+export function data(param) {
+	return request.request(apiUri.data,'POST', param,false,true,false)
+}
+
+export function detail(param) {
+	return request.request(apiUri.detail,'POST', param,false,true,false)
+}
+
+export function license(param) {
+	return request.request(apiUri.license,'POST', param,false,true,false)
+}

+ 34 - 0
unpackage/dist/build/mp-toutiao/static/api/order.js

@@ -0,0 +1,34 @@
+import request from '@/static/js/request.js'
+
+const apiUri = {
+	store: '/order/store',
+	detail: '/confirm/detail',
+	submit: '/confirm/submit',
+	order: '/order/data',
+	orderDetail: '/order/detail',
+	cancel: '/order/cancel',
+}
+
+export function cancel(param) {
+	return request.request(apiUri.cancel,'POST', param,false,true,false)
+}
+
+export function store(param) {
+	return request.request(apiUri.store,'POST', param,false,true,false)
+}
+
+export function detail(param) {
+	return request.request(apiUri.detail,'POST', param,false,true,false)
+}
+
+export function orderDetail(param) {
+	return request.request(apiUri.orderDetail,'GET', param,false,true,false)
+}
+
+export function submit(param) {
+	return request.request(apiUri.submit,'POST', param,false,true,false)
+}
+
+export function order(param) {
+	return request.request(apiUri.order,'GET', param,false,true,false)
+}

+ 18 - 0
unpackage/dist/build/mp-toutiao/static/api/user.js

@@ -0,0 +1,18 @@
+import request from '@/static/js/request.js'
+
+const apiUri = {
+	info: '/user/info',
+	order: '/order/data'
+}
+
+export function info(param) {
+	return request.request(apiUri.info,'GET', param,false,true,false)
+}
+
+export function order(param) {
+	return request.request(apiUri.order,'GET', param,false,true,false)
+}
+
+export function license(param) {
+	return request.request(apiUri.license,'POST', param,false,true,false)
+}

BIN
unpackage/dist/build/mp-toutiao/static/image/address.png


BIN
unpackage/dist/build/mp-toutiao/static/image/check.png


BIN
unpackage/dist/build/mp-toutiao/static/image/coupon-fill.png


BIN
unpackage/dist/build/mp-toutiao/static/image/coupon.png


BIN
unpackage/dist/build/mp-toutiao/static/image/del.png


BIN
unpackage/dist/build/mp-toutiao/static/image/edit.png


BIN
unpackage/dist/build/mp-toutiao/static/image/info.png


BIN
unpackage/dist/build/mp-toutiao/static/image/location.png


BIN
unpackage/dist/build/mp-toutiao/static/image/map.png


BIN
unpackage/dist/build/mp-toutiao/static/image/no.png


BIN
unpackage/dist/build/mp-toutiao/static/image/order-fill.png


BIN
unpackage/dist/build/mp-toutiao/static/image/order.png


BIN
unpackage/dist/build/mp-toutiao/static/image/order_none.png


BIN
unpackage/dist/build/mp-toutiao/static/image/out.png


BIN
unpackage/dist/build/mp-toutiao/static/image/right.png


BIN
unpackage/dist/build/mp-toutiao/static/image/round_close.png


BIN
unpackage/dist/build/mp-toutiao/static/image/search.png


BIN
unpackage/dist/build/mp-toutiao/static/image/service.png


BIN
unpackage/dist/build/mp-toutiao/static/image/tel.png


BIN
unpackage/dist/build/mp-toutiao/static/image/user-fill.png


BIN
unpackage/dist/build/mp-toutiao/static/image/user.png


BIN
unpackage/dist/build/mp-toutiao/static/image/zizhi.png


+ 154 - 0
unpackage/dist/build/mp-toutiao/static/js/common.js

@@ -0,0 +1,154 @@
+export default {
+	shopName(){
+		return "";
+	},
+	clearUri(url){
+		var userInfo = uni.getStorageSync("user_data");
+		if(!userInfo){
+			uni.showLoading({
+				title:"加载中..."
+			});
+			setTimeout(function(){
+				uni.hideLoading();
+				uni.$u.route({
+					url:'/pages/user/user',
+					type:"switchTab",
+					animationType:"slide-in-bottom"
+				});
+			},800);
+			return ;
+		}
+		uni.$u.route({
+			url:url,
+			animationType:"slide-in-bottom",
+			animationDuration:300
+		});
+	},
+	jumpUri(url,type,param){
+		var userInfo = uni.getStorageSync("user_data");
+		var cacheShop = this.shopId();
+		if(!userInfo){
+			setTimeout(function(){
+				uni.hideLoading();
+				uni.$u.route({
+					url:'/pages/user/login?store='+cacheShop,
+					type:"navigateTo",
+					animationType:"slide-in-bottom"
+				});
+			},800);
+			return ;
+		}
+		if(type == 1 && !userInfo){
+			uni.showToast({
+				title:"请先登录",
+				icon:"none"
+			});
+			return true;
+		}
+		uni.$u.route(url,param);
+	},
+	//判断是否登录
+	navTo: function(url,param) {
+		uni.$u.route(url,param);
+	},
+	//判断是否登录
+	isLogin: function() {
+		return uni.getStorageSync("user") ? true : false
+	},
+	
+	/**
+	 * 操作成功提示框
+	 * @param {*} msg 
+	 * @param {*} callback 
+	 * @param {*} icon 
+	 */
+	showSuccess(msg,icon,callback){
+		// #ifdef APP-PLUS
+		plus.nativeUI.toast(msg);
+		// #endif
+		// #ifdef MP
+		uni.showToast({
+			title: msg,
+			icon: icon?icon:'none',
+			mask: true,
+			duration: 1500,
+			success() {
+				callback && (setTimeout(function() {
+					callback();
+				}, 1500));
+			}
+		});
+		// #endif
+	},
+
+	/**
+	 * 操作错误提示
+	 * @param {*} msg 
+	 * @param {*} showCancel 
+	 * @param {*} callback 
+	 * @param {*} title 
+	 */
+	showError(msg,callback,title = "友情提示",showCancel = true){
+		uni.showModal({
+			title: title,
+			content: msg,
+			showCancel: showCancel,
+			success(res) {
+				callback && callback(res);
+			}
+		});
+	},
+	
+	showConfirm(msg,callback,title,yes,cancel){
+		plus.nativeUI.confirm(msg, function(e){
+				callback && callback(e);
+			},
+			{"title":title,"buttons":[yes?yes:"确定",cancel?cancel:"取消"]}
+		);
+	},
+	
+	showSysAlert(msg,callback,title,showCancel){
+		plus.nativeUI.alert(msg,callback,title,showCancel);
+	},
+	showSysMsg(msg){
+		plus.nativeUI.toast(msg);
+	},
+	/**
+	 * loading
+	 * @param {Object} msg
+	 * @param {Object} callback
+	 */
+	loading(msg,callback){
+		uni.showLoading({
+			title:msg ?? '请求中...',
+			mask:true,
+			success(res) {
+				callback && callback(res);
+			}
+		})
+	},
+	hideLoad(){
+		uni.hideLoading();
+	},
+	formatDate(value) {
+		const data = new Date(value);
+		const month = data.getMonth() + 1;
+		const day = data.getDate();
+		const year = data.getFullYear();
+		const hours = data.getHours();
+		const minutes = data.getMinutes();
+		const seconds = data.getSeconds();
+		const formattedTime = `${year}-${month}-${day}`;
+		// const formattedTime = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
+		return formattedTime;
+	},
+	formatMoney(num) {
+		if (num == 0) return "¥0.00";
+		return Intl.NumberFormat("zh-CN", {
+			style: "currency",
+			currency: "CNY",
+			minimumFractionDigits: 2,
+			maximumFractionDigits: 2,
+		}).format(num / 100);
+	}
+}

+ 267 - 0
unpackage/dist/build/mp-toutiao/static/js/form.js

@@ -0,0 +1,267 @@
+/**
+ * 表单验证
+ * @author dingyong
+ * @version 1.4.0
+ **/
+
+const form = {
+	//当出现错误时返回错误消息,否则返回空即为验证通过
+	/*
+	 formData:Object 表单对象。{key:value,key:value},key==rules.name
+	 rules: Array [{name:name,rule:[],msg:[]},{name:name,rule:[],msg:[]}]
+			name:name 属性=> 元素的名称
+			rule:字符串数组 ["required","isMobile","isEmail","isCarNo","isIdCard","isAmount","isNum","isChinese","isEnglish",isEnAndNo","isSpecial","isEmoji",""isDate","isUrl","isSame:key","range:[1,9]","minLength:9","maxLength:Number"]
+			msg:数组 []。 与数组 rule 长度相同,对应的错误提示信息
+	*/
+	validation: function(formData, rules) {
+		for (let item of rules) {
+			let key = item.name;
+			let rule = item.rule;
+			let msgArr = item.msg;
+			if (!key || !rule || rule.length === 0 || !msgArr || msgArr.length === 0) {
+				continue;
+			}
+			for (let i = 0, length = rule.length; i < length; i++) {
+				let ruleItem = rule[i];
+				let msg = msgArr[i];
+				if (!ruleItem || !msg) {
+					continue;
+				}
+				//数据处理
+				let value = null;
+				if (~ruleItem.indexOf(":")) {
+					let temp = ruleItem.split(":");
+					ruleItem = temp[0];
+					value = temp[1];
+				}
+				let isError = false;
+				switch (ruleItem) {
+					case "required":
+						isError = form._isNullOrEmpty(formData[key]);
+						break;
+					case "isMobile":
+						isError = !form._isMobile(formData[key]);
+						break;
+					case "isEmail":
+						isError = !form._isEmail(formData[key]);
+						break;
+					case "isCarNo":
+						isError = !form._isCarNo(formData[key]);
+						break;
+					case "isIdCard":
+						isError = !form._isIdCard(formData[key]);
+						break;
+					case "isAmount":
+						isError = !form._isAmount(formData[key]);
+						break;
+					case "isNum":
+						isError = !form._isNum(formData[key]);
+						break;
+					case "isChinese":
+						isError = !form._isChinese(formData[key]);
+						break;
+					case "isEnglish":
+						isError = !form._isEnglish(formData[key]);
+						break;
+					case "isEnAndNo":
+						isError = !form._isEnAndNo(formData[key]);
+						break;
+					case "isEnOrNo":
+						isError = !form._isEnOrNo(formData[key]);
+						break;
+					case "isSpecial":
+						isError = form._isSpecial(formData[key]);
+						break;
+					case "isEmoji":
+						isError = form._isEmoji(formData[key]);
+						break;
+					case "isDate":
+						isError = !form._isDate(formData[key]);
+						break;
+					case "isUrl":
+						isError = !form._isUrl(formData[key]);
+						break;
+					case "isSame":
+						isError = !form._isSame(formData[key], formData[value]);
+						break;
+					case "range":
+						let range = null;
+						try {
+							range = JSON.parse(value);
+							if (range.length <= 1) {
+								throw new Error("range值传入有误!")
+							}
+						} catch (e) {
+							return "range值传入有误!"
+						}
+						isError = !form._isRange(formData[key], range[0], range[1])
+						break;
+					case "minLength":
+						isError = !form._minLength(formData[key], value)
+						break;
+					case "maxLength":
+						isError = !form._maxLength(formData[key], value)
+						break;
+					default:
+						break;
+				}
+				if (isError) {
+					return msg;
+				}
+			}
+		}
+		return "";
+	},
+	_isNullOrEmpty: function(value) {
+		return (value === null || value === '' || value === undefined) ? true : false;
+	},
+	_isMobile: function(value) {
+		return /^(?:13\d|14\d|15\d|16\d|17\d|18\d|19\d)\d{5}(\d{3}|\*{3})$/.test(value);
+	},
+	_isEmail: function(value) {
+		return /^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/.test(value);
+	},
+	_isCarNo: function(value) {
+		// 新能源车牌
+		const xreg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}(([0-9]{5}[DF]$)|([DF][A-HJ-NP-Z0-9][0-9]{4}$))/;
+		// 旧车牌
+		const creg = /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳]{1}$/;
+		if (value.length === 7) {
+			return creg.test(value);
+		} else if (value.length === 8) {
+			return xreg.test(value);
+		} else {
+			return false;
+		}
+	},
+	_isIdCard: function(value) {
+		let idCard = value;
+		if (idCard.length == 15) {
+			return this.__isValidityBrithBy15IdCard;
+		} else if (idCard.length == 18) {
+			let arrIdCard = idCard.split("");
+			if (this.__isValidityBrithBy18IdCard(idCard) && this.__isTrueValidateCodeBy18IdCard(arrIdCard)) {
+				return true;
+			} else {
+				return false;
+			}
+		} else {
+			return false;
+		}
+	},
+	__isTrueValidateCodeBy18IdCard: function(arrIdCard) {
+		let sum = 0;
+		let Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1];
+		let ValideCode = [1, 0, 10, 9, 8, 7, 6, 5, 4, 3, 2];
+		if (arrIdCard[17].toLowerCase() == 'x') {
+			arrIdCard[17] = 10;
+		}
+		for (let i = 0; i < 17; i++) {
+			sum += Wi[i] * arrIdCard[i];
+		}
+		let valCodePosition = sum % 11;
+		if (arrIdCard[17] == ValideCode[valCodePosition]) {
+			return true;
+		} else {
+			return false;
+		}
+	},
+	__isValidityBrithBy18IdCard: function(idCard18) {
+		let year = idCard18.substring(6, 10);
+		let month = idCard18.substring(10, 12);
+		let day = idCard18.substring(12, 14);
+		let temp_date = new Date(year, parseFloat(month) - 1, parseFloat(day));
+		if (temp_date.getFullYear() != parseFloat(year) || temp_date.getMonth() != parseFloat(month) - 1 || temp_date.getDate() !=
+			parseFloat(day)) {
+			return false;
+		} else {
+			return true;
+		}
+	},
+	__isValidityBrithBy15IdCard: function(idCard15) {
+		let year = idCard15.substring(6, 8);
+		let month = idCard15.substring(8, 10);
+		let day = idCard15.substring(10, 12);
+		let temp_date = new Date(year, parseFloat(month) - 1, parseFloat(day));
+
+		if (temp_date.getYear() != parseFloat(year) || temp_date.getMonth() != parseFloat(month) - 1 || temp_date.getDate() !=
+			parseFloat(day)) {
+			return false;
+		} else {
+			return true;
+		}
+	},
+	_isAmount: function(value) {
+		//金额,只允许保留两位小数
+		return /^([0-9]*[.]?[0-9])[0-9]{0,1}$/.test(value);
+	},
+	_isNum: function(value) {
+		//只能为数字
+		return /^[0-9]+$/.test(value);
+	},
+	_isChinese: function(value) {
+		let reg = /.*[\u4e00-\u9fa5]+.*$/;
+		return value !== "" && reg.test(value) && !form._isSpecial(value) && !form._isEmoji(value)
+	},
+	_isEnglish: function(value) {
+		return /^[a-zA-Z]*$/.test(value)
+	},
+	_isEnAndNo: function(value) {
+		//8~20位数字和字母组合
+		return /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$/.test(value);
+	},
+	_isEnOrNo: function(value) {
+		//英文或者数字
+		let reg = /.*[\u4e00-\u9fa5]+.*$/;
+		let result = true;
+		if (reg.test(value) || form._isSpecial(value) || form._isEmoji(value)) {
+			result = false
+		}
+		return result
+	},
+	_isSpecial: function(value) {
+		//是否包含特殊字符
+		let regEn = /[`~!@#$%^&*()_+<>?:"{},.\/;'[\]]/im,
+			regCn = /[·!#¥(——):;“”‘、,|《。》?、【】[\]]/im;
+		if (regEn.test(value) || regCn.test(value)) {
+			return true;
+		}
+		return false;
+	},
+	_isEmoji: function(value) {
+		//是否包含表情
+		return /\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDE4F]/g.test(value);
+	},
+	_isDate: function(value) {
+		//2019-10-12
+		const reg =
+			/^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$/;
+		return reg.test(value);
+	},
+	_isUrl: function(value) {
+		return /^((https?|ftp|file):\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/.test(value);
+	},
+	_isSame: function(value1, value2) {
+		return value1 === value2
+	},
+	_isRange: function(value, range1, range2) {
+		if ((!range1 && range1 != 0) && (!range2 && range2 != 0)) {
+			return true;
+		} else if (!range1 && range1 != 0) {
+			return value <= range2
+		} else if (!range2 && range2 != 0) {
+			return value >= range1
+		} else {
+			return value >= range1 && value <= range2
+		}
+	},
+	_minLength: function(value, min) {
+		return value.length >= Number(min)
+	},
+	_maxLength: function(value, max) {
+		return value.length <= Number(max)
+	}
+};
+module.exports = {
+	validation: form.validation
+};

+ 226 - 0
unpackage/dist/build/mp-toutiao/static/js/request.js

@@ -0,0 +1,226 @@
+/**
+ * 常用方法封装 请求,文件上传等
+ * @author echo. 
+ **/
+
+const axg = {
+	shopId: function() {
+		return "10108618787549";
+	},
+	//接口地址
+	interfaceUrl: function() {
+		// #ifdef H5
+		return '/api';
+		// #endif
+		// #ifdef MP
+		return 'https://miniapi.jsshuita.com.cn/api/dy'
+		// return 'http://127.0.0.1:8190/api/dy'
+		// #endif
+	},
+	toast: function(text, duration, success) { 
+		// #ifdef APP-PLUS
+		plus.nativeUI.toast(text || "出错啦~");
+		// #endif
+		// #ifndef MP
+		uni.showToast({
+			title: text || "出错啦~",
+			icon: success ? 'success' : 'none',
+			duration: duration || 2000
+		})
+		// #endif
+	},
+	modal: function(title, content, showCancel, callback, confirmColor, confirmText) {
+		uni.showModal({
+			title: title || '提示',
+			content: content,
+			showCancel: showCancel,
+			cancelColor: "#555",
+			confirmColor: confirmColor || "#5677fc",
+			confirmText: confirmText || "确定",
+			success(res) {
+				if (res.confirm) {
+					callback && callback(true)
+				} else {
+					callback && callback(false)
+				}
+			}
+		})
+	},
+	isAndroid: function() {
+		const res = uni.getSystemInfoSync();
+		if(res.platform.toLocaleLowerCase() == 'android')
+		{
+			return true;
+		}
+		return false;
+	},
+	isPhoneX: function() {
+		const res = uni.getSystemInfoSync();
+		let iphonex = false;
+		let models=['iphonex','iphonexr','iphonexsmax','iphone11','iphone11pro','iphone11promax']
+		const model=res.model.replace(/\s/g,"").toLowerCase()
+		if (models.includes(model)) {
+			iphonex = true;
+		}
+		return iphonex;
+	},
+	constNum: function() {
+		let time = 0;
+		// #ifdef APP-PLUS
+		time = this.isAndroid() ? 300 : 0;
+		// #endif
+		return time
+	},
+	delayed: null,
+	/**
+	 * 请求数据处理
+	 * @param string url 请求地址
+	 * @param string method 请求方式
+	 *  GET or POST
+	 * @param {*} postData 请求参数
+	 * @param bool isDelay 是否延迟显示loading
+	 * @param bool isForm 数据格式
+	 *  true: 'application/x-www-form-urlencoded'
+	 *  false:'application/json'
+	 * @param bool hideLoading 是否隐藏loading
+	 *  true: 隐藏
+	 *  false:显示
+	 */
+	request: function(url, method, postData, isDelay, isForm, hideLoading) {
+		//接口请求
+		let loadding = false;
+		axg.delayed && uni.hideLoading();
+		clearTimeout(axg.delayed);
+		axg.delayed = null;
+		if (!hideLoading) {
+			axg.delayed = setTimeout(() => {
+				uni.showLoading({
+					mask: true,
+					title: '请求中...',
+					success(res) {
+						loadding = true
+					}
+				})
+			}, isDelay ? 1000 : 0)
+		}
+		var header = {
+			'Content-Type': isForm ? 'application/x-www-form-urlencoded' : 'application/json',
+			'authorization': "Bearer "+axg.getToken(),
+			'platform': "mini"
+		}
+		// postData.shop = axg.shopId();
+		axg.toast(axg.interfaceUrl() + url)
+		
+		return new Promise((resolve, reject) => {
+			uni.request({
+				url: axg.interfaceUrl() + url,
+				data: postData,
+				header: header,
+				method: method, //'GET','POST'
+				dataType: 'json',
+				success: (res) => {
+					clearTimeout(axg.delayed)
+					axg.delayed = null;
+					uni.hideLoading()
+					if (loadding && !hideLoading) {
+						uni.hideLoading()
+					}
+					// if (res.data && res.data.code == 401) {
+					// 	uni.showToast({
+					// 		title: res.data.msg,
+					// 		icon: 'none',
+					// 		mask: true,
+					// 		duration: 1500,
+					// 		success() {
+					// 			// uni.navigateTo({
+					// 			// 	url:"/pages/user/login"
+					// 			// });
+					// 			uni.clearStorageSync();
+					// 		}
+					// 	});
+					// 	return ;
+					// }
+					resolve(res.data)
+				},
+				fail: (res) => {
+					clearTimeout(axg.delayed)
+					axg.delayed = null;
+					axg.toast("网络不给力,请稍后再试~")
+					reject(res)
+				}
+			})
+		})
+	},
+	/**
+	 * 上传文件
+	 * @param string url 请求地址
+	 * @param string src 文件路径
+	 */
+	uploadFile: function(url, src, param) {
+		return new Promise((resolve, reject) => {
+			const uploadTask = uni.uploadFile({
+				url: axg.interfaceUrl() + url,
+				filePath: src,
+				name: 'file',
+				header: {
+					'authorization': "Bearer "+axg.getToken(),
+					'platform': "mini"
+				},
+				formData:param,
+				success: function(res) {
+					uni.hideLoading()
+					let d = JSON.parse(res.data.replace(/\ufeff/g, "") || "{}")
+					if (d.code == 200) {
+						//返回图片地址
+						let fileObj = d.data;
+						resolve(fileObj)
+					} else {
+						axg.toast(res.msg);
+					}
+				},
+				fail: function(res) {
+					console.log('上传错误:',res)
+					reject(res)
+					axg.toast(res.msg);
+				}
+			})
+		})
+	},
+	tuiJsonp: function(url, callback, callbackname) {
+		// #ifdef H5
+		window[callbackname] = callback;
+		let tuiScript = document.createElement("script");
+		tuiScript.src = url;
+		tuiScript.type = "text/javascript";
+		document.head.appendChild(tuiScript);
+		document.head.removeChild(tuiScript);
+		// #endif
+	},
+	//设置用户信息
+	setUserInfo: function(mobile, token) {
+		//uni.setStorageSync("thorui_token", token)
+		uni.setStorageSync("user_token", mobile)
+	},
+	//获取token
+	getToken() {
+		return uni.getStorageSync("user_token") || 'None'
+	},
+	//判断是否登录
+	isLogin: function() {
+		return uni.getStorageSync("user_token") ? true : false
+	},
+	//跳转页面,校验登录状态
+	href(url, isVerify) {
+		if (isVerify && !axg.isLogin()) {
+			uni.navigateTo({
+				url: '/pages/user/login/login'
+			})
+		} else {
+			uni.navigateTo({
+				url: url
+			});
+		}
+	}
+}
+
+export default axg

BIN
unpackage/dist/build/mp-toutiao/static/logo.png


Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 0 - 0
unpackage/dist/build/mp-toutiao/uni_modules/uni-popup/components/uni-popup/uni-popup.js


+ 6 - 0
unpackage/dist/build/mp-toutiao/uni_modules/uni-popup/components/uni-popup/uni-popup.json

@@ -0,0 +1,6 @@
+{
+  "component": true,
+  "usingComponents": {
+    "uni-transition": "/uni_modules/uni-transition/components/uni-transition/uni-transition"
+  }
+}

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно