hwq 3 роки тому
батько
коміт
b717af3d10
100 змінених файлів з 6397 додано та 7502 видалено
  1. 0 3
      .gitignore
  2. 3 7
      .hbuilderx/launch.json
  3. 17 12
      App.vue
  4. 0 3
      androidPrivacy.json
  5. 276 0
      api/activity.js
  6. 0 36
      api/address.js
  7. 0 27
      api/award.js
  8. 0 26
      api/cart.js
  9. 0 10
      api/category.js
  10. 0 29
      api/coupon.js
  11. 0 18
      api/favorite.js
  12. 66 0
      api/functionalUnit.js
  13. 0 37
      api/groupBooking.js
  14. 0 16
      api/index.js
  15. 0 29
      api/integral.js
  16. 10 3
      api/login.js
  17. 0 73
      api/merchant.js
  18. 0 26
      api/moments.js
  19. 0 38
      api/money.js
  20. 0 10
      api/myteam.js
  21. 64 14
      api/order.js
  22. 94 0
      api/product.js
  23. 0 59
      api/received.js
  24. 0 19
      api/reply.js
  25. 0 18
      api/seckill.js
  26. 3 1
      api/set.js
  27. 0 10
      api/shareQrCode.js
  28. 0 14
      api/shoping.js
  29. 0 27
      api/sign.js
  30. 113 19
      api/user.js
  31. 20 61
      api/wallet.js
  32. 10 13
      api/wx.js
  33. 57 0
      components/Loading/index.vue
  34. 0 36
      components/canvasLove/canvasLove.vue
  35. 120 0
      components/countDown/index.vue
  36. 36 0
      components/emptyPage.vue
  37. 118 0
      components/home/index.vue
  38. 630 0
      components/jyf-parser/jyf-parser.vue
  39. 97 0
      components/jyf-parser/libs/CssHandler.js
  40. 535 0
      components/jyf-parser/libs/MpHtmlParser.js
  41. 80 0
      components/jyf-parser/libs/config.js
  42. 0 0
      components/jyf-parser/libs/handler.wxs
  43. 501 0
      components/jyf-parser/libs/trees.vue
  44. 0 133
      components/mix-list-cell.vue
  45. 0 6
      components/mix-loading/mix-loading.vue
  46. 421 0
      components/newlist/nowList.vue
  47. 68 0
      components/returnButton.vue
  48. 246 0
      components/seckill/seckill.vue
  49. 164 170
      components/share.vue
  50. 5 11
      components/tki-qrcode/qrcode.js
  51. 13 20
      components/uni-countdown/uni-countdown.vue
  52. 188 0
      components/uni-countdown/uni-countdowns.vue
  53. 124 0
      components/uni-fav/uni-fav.vue
  54. 0 0
      components/uni-icons/uni-icons.vue
  55. 2 2
      components/uni-list-item/uni-list-item.vue
  56. 33 33
      components/uni-load-more/uni-load-more.vue
  57. 43 8
      components/uni-notice-bar/uni-notice-bar.vue
  58. 4 0
      components/uni-number-box.vue
  59. 0 22
      components/uni-popup/message.js
  60. 0 25
      components/uni-popup/popup.js
  61. 3 26
      components/uni-popup/uni-popup-dialog.vue
  62. 263 0
      components/uni-popup/uni-popup-ori.vue
  63. 262 145
      components/uni-popup/uni-popup-share.vue
  64. 87 118
      components/uni-popup/uni-popup.vue
  65. 244 0
      components/uni-steps/uni-steps.vue
  66. 1 1
      components/wangding-pickerAddress/wangding-pickerAddress.vue
  67. 0 280
      components/xuan-popup/xuan-popup.vue
  68. 18 0
      config/app.js
  69. 32 0
      config/cache.js
  70. 0 34
      interceptor.js
  71. 39 0
      libs/log.js
  72. 84 0
      libs/login.js
  73. 253 0
      libs/wechat.js
  74. 0 2
      main.js
  75. 26 123
      manifest.json
  76. 0 30
      node_modules/jweixin-module/README.md
  77. 0 0
      node_modules/jweixin-module/out/index.js
  78. 0 60
      node_modules/jweixin-module/package.json
  79. 0 11
      package-lock.json
  80. 146 499
      pages.json
  81. 0 220
      pages/address/address.vue
  82. 0 331
      pages/address/addressManage.vue
  83. 0 173
      pages/address/shopList.vue
  84. 0 350
      pages/award/award.vue
  85. 0 313
      pages/award/withdmoenys.vue
  86. 0 332
      pages/award/withdrawal.vue
  87. 336 637
      pages/cart/cart.vue
  88. 128 0
      pages/category/articleList.vue
  89. 87 195
      pages/category/category.vue
  90. 97 0
      pages/category/detail.vue
  91. 130 0
      pages/category/flList.vue
  92. 0 167
      pages/contract/agreement.vue
  93. 0 252
      pages/contract/privacy.vue
  94. 0 137
      pages/contract/start.vue
  95. 0 376
      pages/coupon/consumer.vue
  96. 0 307
      pages/coupon/coupon.vue
  97. 0 372
      pages/coupon/details.vue
  98. 0 332
      pages/detail/detail.vue
  99. 0 167
      pages/favorites/favorites.vue
  100. 0 388
      pages/groupBooking/detail.vue

+ 0 - 3
.gitignore

@@ -1,3 +0,0 @@
-unpackage/debug
-unpackage/dist
-unpackage/resources

+ 3 - 7
.hbuilderx/launch.json

@@ -2,21 +2,17 @@
   // launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数
     "version": "0.0",
     "configurations": [{
-     	"app-plus" : 
-     	{
-     		"launchtype" : "local"
-     	},
      	"default" : 
      	{
-     		"launchtype" : "local"
+     		"launchtype" : "remote"
      	},
      	"h5" : 
      	{
-     		"launchtype" : "local"
+     		"launchtype" : "remote"
      	},
      	"mp-weixin" : 
      	{
-     		"launchtype" : "local"
+     		"launchtype" : "remote"
      	},
      	"type" : "uniCloud"
      }

+ 17 - 12
App.vue

@@ -4,14 +4,20 @@
  */
 import { mapMutations } from 'vuex';
 // #ifdef H5
-import { weixindata } from './utils/wxAuthorized';
+import { weixindata, setRouter } from './utils/wxAuthorized';
 // #endif
 // #ifdef APP-PLUS
 import { getUpApp } from './utils/upApp.js';
 // #endif
 export default {
 	data() {
-		return {};
+		return {
+			/* 保存微信信息 */
+			appData: {}
+		};
+	},
+	methods: {
+		...mapMutations('user', ['setUserInfo', 'login', 'hasLogin'])
 	},
 	onLaunch: function(urlObj) {
 		let obj = this;
@@ -19,17 +25,18 @@ export default {
 		let userInfo = uni.getStorageSync('userInfo') || '';
 		// 判断是否拥有用户信息
 		if (userInfo.uid) {
-			// 更新登录信息
-			obj.login();
 			//更新登陆状态
 			uni.getStorage({
 				key: 'userInfo',
 				success: res => {
 					obj.setUserInfo(res.data);
+					obj.login(res.data);
 				}
 			});
 		}
 		// #ifdef H5
+		// 保存路由对象
+		setRouter(this.$router);
 		//判断是否已经缓存浏览器
 		let bool = uni.getStorageSync('weichatBrowser') || '';
 		if (bool === '') {
@@ -62,16 +69,12 @@ export default {
 	},
 	onHide: function() {
 		// console.log('App Hide');
-	},
-	methods: {
-		...mapMutations('user', ['setUserInfo', 'login', 'hasLogin'])
 	}
 };
 </script>
 
 <style lang="scss">
 /*全局公共样式和字体图标*/
-@import 'uview-ui/index.scss';
 @import '/static/css/cmy.css';
 view,
 scroll-view,
@@ -99,10 +102,6 @@ image,
 video {
 	box-sizing: border-box;
 }
-page {
-	width: 0;
-	min-width: 100%;
-}
 /* 骨架屏替代方案 */
 .Skeleton {
 	background: #f3f3f3;
@@ -125,6 +124,7 @@ page {
 		}
 	}
 }
+
 // 设置富文本中图片最大宽度
 uni-rich-text img {
 	max-width: 100% !important;
@@ -255,4 +255,9 @@ button[type='default'] {
 uni-page-wrapper {
 	background-color: $page-color-base;
 }
+page {
+	background-color: $page-color-base;
+	// 设置默认字体
+	font-family: PingFang SC, STHeitiSC-Light, Helvetica-Light, arial, sans-serif, Droid Sans Fallback;
+}
 </style>

+ 0 - 3
androidPrivacy.json

@@ -1,3 +0,0 @@
-{
-    "prompt" : "template"
-}

+ 276 - 0
api/activity.js

@@ -0,0 +1,276 @@
+import request from "@/utils/request.js";
+/**
+ * 
+ * 所有活动接口 包括:拼团,砍价,秒杀
+ * 
+*/
+// 砍价产品详情
+export function getBargainDetail(data,id) {
+	return request({
+		url: '/api/bargain/detail/' + id,
+		method: 'get',
+		data
+	});
+}
+
+/**
+ * 砍价产品详情
+ */
+// export function getBargainDetail(id) {
+//   return request.get("bargain/detail/" + id);
+// }
+
+//砍价 砍价帮总人数、剩余金额、进度条、已经砍掉的价格
+export function postBargainHelpCount(data) {
+	return request({
+		url: '/api/bargain/help/count',
+		method: 'post',
+		data
+	});
+}
+
+/**
+ * 砍价 砍价帮总人数、剩余金额、进度条、已经砍掉的价格
+ */
+// export function postBargainHelpCount(data) {
+//   return request.post("bargain/help/count", data);
+// }
+
+//砍价 开启砍价用户信息
+export function postBargainStartUser(data) {
+	return request({
+		url: '/api/bargain/start/user',
+		method: 'post',
+		data
+	});
+}
+
+/**
+ * 砍价 开启砍价用户信息
+ */
+// export function postBargainStartUser(data) {
+//   return request.post("bargain/start/user", data);
+// }
+
+//砍价开启
+export function postBargainStart(data) {
+	return request({
+		url: '/api/bargain/start',
+		method: 'post',
+		data
+	});
+}
+
+/**
+ * 砍价开启
+ */
+// export function postBargainStart(bargainId) {
+//   return request.post("bargain/start", { bargainId: bargainId});
+// }
+
+// 砍价 砍掉金额
+export function postBargainHelpPrice(data) {
+	return request({
+		url: '/api/bargain/help/price',
+		method: 'post',
+		data
+	});
+}
+
+/**
+ * 砍价 砍掉金额
+ */
+// export function postBargainHelpPrice(data) {
+//   return request.post("bargain/help/price", data);
+// }
+
+// 砍价 帮助好友砍价
+export function postBargainHelp(data) {
+	return request({
+		url: '/api/bargain/help',
+		method: 'post',
+		data
+	});
+}
+
+/**
+ * 砍价 帮助好友砍价
+ */
+// export function postBargainHelp(data) {
+//   return request.post("bargain/help", data);
+// }
+
+// 砍价 砍价帮
+export function postBargainHelpList(data) {
+	return request({
+		url: '/api/bargain/help/list',
+		method: 'post',
+		data
+	});
+}
+
+
+/**
+ * 砍价 砍价帮
+ */
+// export function postBargainHelpList(data) {
+//   return request.post("bargain/help/list", data);
+// }
+
+// 砍价 观看/分享/参与次数
+export function postBargainShare(data) {
+	return request({
+		url: '/api/bargain/share',
+		method: 'post',
+		data
+	});
+}
+
+/**
+ * 砍价 观看/分享/参与次数
+ */
+// export function postBargainShare(bargainId) {
+//   return request.post("bargain/share", { bargainId: bargainId});
+// }
+
+// 砍价列表(已参与)
+export function getBargainUserList(data) {
+	return request({
+		url: '/api/bargain/user/list',
+		method: 'get',
+		data
+	});
+}
+
+/**
+ * 
+ * 砍价列表(已参与)
+ * @param object data
+*/
+// export function getBargainUserList(data){
+//   return request.get('bargain/user/list',data);
+// }
+
+// 砍价取消
+export function getBargainUserCancel(data) {
+	return request({
+		url: '/api/bargain/user/cancel',
+		method: 'post',
+		data
+	});
+}
+
+/**
+ * 砍价取消
+ */
+// export function getBargainUserCancel(data) {
+//   return request.post("/bargain/user/cancel", data);
+// }
+
+
+
+
+
+/**
+ * 拼团列表
+ * 
+*/
+export function getCombinationList(data) {
+  return request.get('combination/list', data,{noAuth:true});
+}
+
+/**
+ * 拼团详情
+ * 
+*/
+export function getCombinationDetail(id) {
+  return request.get('combination/detail/'+id);
+}
+
+/**
+ * 拼团 开团
+ */
+export function getCombinationPink(id) {
+  return request.get("combination/pink/" + id);
+}
+
+/**
+ * 拼团 取消开团
+ */
+export function postCombinationRemove(data) {
+  return request.post("combination/remove",data);
+}
+
+/**
+ * 砍价列表
+ */
+export function getBargainList(data) {
+  return request.get("bargain/list", data,{noAuth:true});
+}
+
+
+/**
+ * 
+ * 取消砍价
+ * @param int bargainId
+*/
+export function bargainUserCancel(bargainId){
+  return request.post('bargain/user/cancel', { bargainId: bargainId})
+}
+
+/**
+ * 秒杀产品时间区间
+ * 
+*/
+export function getSeckillIndexTime(){
+  return request.get('seckill/index',{},{noAuth:true});
+}
+
+/**
+ * 秒杀产品列表
+ * @param int time
+ * @param object data
+*/
+export function getSeckillList(time,data){
+  return request.get('seckill/list/'+time,data,{noAuth:true});
+}
+
+/**
+ * 秒杀产品详情
+ * @param int id
+*/
+export function getSeckillDetail(id){
+  return request.get('seckill/detail/'+id);
+}
+
+/**
+ * 砍价海报
+ * @param object data
+ * 
+*/
+export function getBargainPoster(data){
+  return request.post('bargain/poster',data)
+}
+
+/**
+ * 拼团海报
+ * @param object data
+ * 
+*/
+export function getCombinationPoster(data){
+  return request.post('combination/poster',data)
+}
+
+/**
+ * 获取秒杀小程序二维码
+ */
+export function seckillCode(id,data) {
+  return request.get("seckill/code/"+id,data);
+}
+
+/**
+ * 获取拼团小程序二维码
+ */
+export function scombinationCode(id) {
+  return request.get("combination/code/"+id);
+}

+ 0 - 36
api/address.js

@@ -1,36 +0,0 @@
-import request from '@/utils/request'
-
-export function getAddressList(data) {
-	return request({
-		url: '/api/address/list',
-		method: 'get',
-		data
-	});
-}
-export function addressEdit(data) {
-	return request({
-		url: '/api/address/edit',
-		method: 'post',
-		data
-	});
-}
-// 删除地址
-export function addressDel(data) {
-	return request({
-		url: '/api/address/del',
-		method: 'post',
-		data
-	});
-}
-
-// 获取门店信息
-// export function addressDel(data) {
-// 	return request({
-// 		url: '/api/address/del',
-// 		method: 'post',
-// 		data
-// 	});
-// }
-
-
-

+ 0 - 27
api/award.js

@@ -1,27 +0,0 @@
-import request from '@/utils/request'
-
-// 佣金明细
-export function spreadCommission(data,type) {
-	return request({
-		url: '/api/spread/commission/'+type,
-		method: 'get',
-		data
-	});
-}
-
-// 修改购物车数量
-export function getCartNum(data) {
-	return request({
-		url: '/api/cart/num',
-		method: 'post',
-		data
-	});
-}
-//删除购物车
-export function cartDel(data) {
-	return request({
-		url: '/api/cart/del',
-		method: 'post',
-		data
-	});
-}

+ 0 - 26
api/cart.js

@@ -1,26 +0,0 @@
-import request from '@/utils/request'
-
-export function getCartList(data) {
-	return request({
-		url: '/api/cart/list',
-		method: 'get',
-		data
-	});
-}
-
-// 修改购物车数量
-export function getCartNum(data) {
-	return request({
-		url: '/api/cart/num',
-		method: 'post',
-		data
-	});
-}
-//删除购物车
-export function cartDel(data) {
-	return request({
-		url: '/api/cart/del',
-		method: 'post',
-		data
-	});
-}

+ 0 - 10
api/category.js

@@ -1,10 +0,0 @@
-import request from '@/utils/request'
-
-// 获取商品分类
-export function getList(data) {
-	return request({
-		url: '/api/category',
-		method: 'get',
-		data
-	});
-}

+ 0 - 29
api/coupon.js

@@ -1,29 +0,0 @@
-import request from '@/utils/request'
-
-//获取优惠券列表
-export function getCouponsList(data,types) {
-	//优惠券状态 0全部 1未使用 2已使用
-	return request({
-		url: '/api/coupons/user/'+types,
-		method: 'get',
-		data
-	});
-}
-
-//领取优惠券
-export function setCoupons(data) {
-	return request({
-		url: '/api/coupon/receive',
-		method: 'post',
-		data
-	});
-}
-
-//获取可使用优惠券
-export function couponsOrder(data,price) {
-	return request({
-		url: '/api/coupons/order/'+price,
-		method: 'get',
-		data
-	});
-}

+ 0 - 18
api/favorite.js

@@ -1,18 +0,0 @@
-import request from '@/utils/request'
-
-//获取收藏夹列表
-export function getcollectList(data) {
-	return request({
-		url: '/api/collect/user',
-		method: 'get',
-		data
-	});
-}
-// 取消收藏
-export function delcollect(data) {
-	return request({
-		url: '/api/collect/del',
-		method: 'post',
-		data
-	});
-}

+ 66 - 0
api/functionalUnit.js

@@ -0,0 +1,66 @@
+import request from '@/utils/request'
+
+//获取优惠券列表
+export function getCouponsList(data,types) {
+	//优惠券状态 0全部 1未使用 2已使用
+	return request({
+		url: '/api/coupons/user/'+types,
+		method: 'get',
+		data
+	});
+}
+
+//领取优惠券
+export function setCoupons(data) {
+	return request({
+		url: '/api/coupon/receive',
+		method: 'post',
+		data
+	});
+}
+
+//获取可使用优惠券
+export function couponsOrder(data,price) {
+	return request({
+		url: '/api/coupons/order/'+price,
+		method: 'get',
+		data
+	});
+}
+
+
+//	积分列表
+export function integrallist(data) {
+	return request({
+		url: '/api/integral/list',
+		method: 'get',
+		data
+	});
+}
+
+
+// 获取签到列表
+export function signList(data) {
+	return request({
+		url: '/api/sign/list',
+		method: 'get',
+		data
+	});
+}
+// 点击签到
+export function integral(data) {
+	return request({
+		url: '/api/sign/integral',
+		method: 'post',
+		data
+	});
+}
+
+// 签到信息
+export function signUser(data) {
+	return request({
+		url: '/api/sign/user',
+		method: 'post',
+		data
+	});
+}

+ 0 - 37
api/groupBooking.js

@@ -1,37 +0,0 @@
-import request from '@/utils/request'
-
-// 获取拼团列表
-export function getCombinationList(data) {
-	return request({
-		url: '/api/combination/list',
-		method: 'get',
-		data
-	});
-}
-
-//取消拼团
-export function getCombinationLisRemove(data,id) {
-	return request({
-		url: '/api/combination/remove'+id,
-		method: 'get',
-		data
-	});
-}
-
-//拼团开团页面数据
-export function getCombinationLisPink(data,id) {
-	return request({
-		url: '/api/combination/pink/'+id,
-		method: 'get',
-		data
-	});
-}
-
-// 获取拼团海报
-export function getCombinationPoster(data) {
-	return request({
-		url: '/api/combination/poster',
-		method: 'post',
-		data
-	});
-}

+ 0 - 16
api/index.js

@@ -33,20 +33,4 @@ export function loadIndexs(data) {
 		data
 	});
 }
-//获取门店列表
-export function store_list(data) {
-	return request({
-		url: '/api/store_list',
-		method: 'get',
-		data
-	});
-}
 
-//获取门店信息
-export function getStore(data) {
-	return request({
-		url: '/api/store',
-		method: 'get',
-		data
-	});
-}

+ 0 - 29
api/integral.js

@@ -1,29 +0,0 @@
-import request from '@/utils/request'
-
-//	积分列表
-export function integrallist(data) {
-	return request({
-		url: '/api/integral/list',
-		method: 'get',
-		data
-	});
-}
-
-//	积分列表
-export function rechList(data) {
-	return request({
-		url: '/api/rech',
-		method: 'get',
-		data
-	});
-}
-//	消费券列表
-export function consumerList(data) {
-	return request({
-		url: '/api/consumer/list',
-		method: 'get',
-		data
-	});
-}
-
-

+ 10 - 3
api/login.js

@@ -44,6 +44,7 @@ export function loginMobile(data) {
 		data
 	});
 }
+// #ifdef APP-PLUS
 // 微信授权登录
 export function loginWx(data) {
 	return request({
@@ -52,6 +53,12 @@ export function loginWx(data) {
 		data
 	});
 }
-
-
-
+// #endif
+//绑定手机号
+export function bangding(data) {
+	return request({
+		url: '/api/binding',
+		method: 'POST',
+		data
+	});
+}

+ 0 - 73
api/merchant.js

@@ -1,73 +0,0 @@
-import request from '@/utils/request'
-
-//店铺订单列表
-export function merchantList(data) {
-	return request({
-		url: '/api/admin/order/list',
-		method: 'get',
-		data
-	});
-}
-
-//店铺订单详情
-export function detail(data,id) {
-	return request({
-		url: '/api/admin/order/detail/'+id,
-		method: 'get',
-		data
-	});
-}
-
-// 店铺订单每月统计数据
-export function shop_data(data) {
-	return request({
-		url: '/api/admin/order/month',
-		method: 'get',
-		data
-	});
-}
-
-// 店铺信息
-export function my(data) {
-	return request({
-		url: '/api/store/my',
-		method: 'post',
-		data
-	});
-}
-
-// 店铺会员列表
-export function member(data) {
-	return request({
-		url: '/api/store/member',
-		method: 'post',
-		data
-	});
-}
-
-// 店铺商品列表
-export function goods(data) {
-	return request({
-		url: '/api/store/goods',
-		method: 'post',
-		data
-	});
-}
-
-//订单核销
-export function verific(data) {
-	return request({
-		url: '/api/order/order_verific',
-		method: 'post',
-		data
-	});
-}
-
-//卡片兑换
-export function verification(data) {
-	return request({
-		url: '/api/user/verification',
-		method: 'post',
-		data
-	});
-}

+ 0 - 26
api/moments.js

@@ -1,26 +0,0 @@
-import request from '@/utils/request'
-
-export function category(data) {
-	return request({
-		url: '/api/article/category/list',
-		method: 'get',
-		data
-	});
-}
-export function article(data,cid) {
-	return request({
-		url: '/api/article/list/'+cid,
-		method: 'get',
-		data
-	});
-}
-export function details(data,id) {
-	return request({
-		url: '/api/article/details/'+id,
-		method: 'get',
-		data
-	});
-}
-
-
-

+ 0 - 38
api/money.js

@@ -1,38 +0,0 @@
-import request from '@/utils/request'
-
-
-// 统计金额
-export function computedOrderkey(data) {
-	return request({
-		url: '/api/order/computed/'+data.orderkey,
-		method: 'post',
-		data
-	});
-}
-
-// 创建订单
-export function createOrderkey(data,key) {
-	return request({
-		url: '/api/order/create/'+key,
-		method: 'post',
-		data
-	});
-}
-// 账户余额
-export function balance(data) {
-	return request({
-		url: '/api/user/balance',
-		method: 'get',
-		data
-	});
-}
-
-// 订单支付
-export function orderPay(data) {
-	return request({
-		url: '/api/order/pay',
-		method: 'post',
-		data
-	});
-}
-

+ 0 - 10
api/myteam.js

@@ -1,10 +0,0 @@
-import request from '@/utils/request'
-
-// 获取我的团队
-export function spreadPeople(data) {
-	return request({
-		url: '/api/spread/people',
-		method:'post',
-		data
-	});
-}

+ 64 - 14
api/order.js

@@ -1,6 +1,5 @@
 import request from '@/utils/request'
 import {upFilse} from '@/utils/request'
-
 // 订单确认
 export function confirm(data) {
 	return request({
@@ -9,7 +8,55 @@ export function confirm(data) {
 		data
 	});
 }
-
+//获取可使用优惠券
+export function couponsOrder(data,price) {
+	return request({
+		url: '/api/coupons/order/'+price,
+		method: 'get',
+		data
+	});
+}
+//获取优惠券列表
+export function getCouponsList(data,types) {
+	//优惠券状态 0全部 1未使用 2已使用
+	return request({
+		url: '/api/coupons/user/'+types,
+		method: 'get',
+		data
+	});
+}
+//提交评论
+export function order_comment(data) {
+	return request({
+		url: '/api/order/comment',
+		method: 'post',
+		data
+	});
+}
+//订单产品信息
+export function product(data) {
+	return request({
+		url: '/api/order/product',
+		method: 'post',
+		data
+	});
+}
+// 快递查询
+export function express_query(data) {
+	return request({
+		url: '/api/order/express_query',
+		method: 'get',
+		data
+	});
+}
+//上传图片
+export function upload(data) {
+	return upFilse({
+		url: '/api/upload/image',
+		method: 'post',
+		data
+	});
+}
 // 订单列表
 export function orderList(data) {
 	return request({
@@ -59,7 +106,6 @@ export function refundReason(data) {
 		method: 'get',
 		data
 	});
-	
 }
 
 // 确认收货
@@ -70,27 +116,31 @@ export function orderTake(data) {
 		data
 	});
 }
-//提交评论
-export function product(data) {
+
+// 订单支付
+export function orderPay(data) {
 	return request({
-		url: '/api/order/product',
+		url: '/api/order/pay',
 		method: 'post',
 		data
 	});
 }
-//上传图片
-export function upload(data) {
-	return upFilse({
-		url: '/api/upload/image',
+
+// 创建订单
+export function createOrderkey(data,key) {
+	return request({
+		url: '/api/order/create/'+key,
 		method: 'post',
 		data
 	});
 }
-//提交评论
-export function order_comment(data) {
+
+// 统计订单金额
+export function computedOrderkey(data) {
 	return request({
-		url: '/api/order/comment',
+		url: '/api/order/computed/'+data.orderkey,
 		method: 'post',
 		data
 	});
-}
+}
+

+ 94 - 0
api/product.js

@@ -27,6 +27,15 @@ export function goodsDetail(data, id) {
 		data
 	});
 }
+
+// 砍价列表
+export function getBargainList(data) {
+	return request({
+		url: '/api/bargain/list',
+		method: 'get',
+		data
+	});
+}
 // 加入购物车
 export function cartAdd(data) {
 	return request({
@@ -72,6 +81,8 @@ export function groomList(data,type) {
 		data
 	});
 }
+
+
 // 获取秒杀商品详细
 export function seckillGoods(data,id) {
 	return request({
@@ -80,6 +91,7 @@ export function seckillGoods(data,id) {
 		data
 	});
 }
+
 // 获取拼团商品详细
 export function groupGoods(data,id) {
 	return request({
@@ -90,3 +102,85 @@ export function groupGoods(data,id) {
 }
 
 
+// 获取商品分类
+export function getCategoryList(data) {
+	return request({
+		url: '/api/category',
+		method: 'get',
+		data
+	});
+}
+
+
+// 获取拼团列表
+export function getCombinationList(data) {
+	return request({
+		url: '/api/combination/list',
+		method: 'get',
+		data
+	});
+}
+
+//取消拼团
+export function getCombinationLisRemove(data,id) {
+	return request({
+		url: '/api/combination/remove'+id,
+		method: 'get',
+		data
+	});
+}
+
+//拼团开团页面数据
+export function getCombinationLisPink(data,id) {
+	return request({
+		url: '/api/combination/pink/'+id,
+		method: 'get',
+		data
+	});
+}
+
+// 获取拼团海报
+export function getCombinationPoster(data) {
+	return request({
+		url: '/api/combination/poster',
+		method: 'post',
+		data
+	});
+}
+
+
+// 获取秒杀分类
+export function getSeckillClass(data) {
+	return request({
+		url: '/api/seckill/index',
+		method: 'get',
+		data
+	});
+}
+// 获取秒杀列表
+export function getSeckillList(data,id) {
+	return request({
+		url: '/api/seckill/list/'+id,
+		method: 'get',
+		data
+	});
+}
+
+
+// 产品评价数量和好评度
+export function reply_config(data,id) {
+	return request({
+		url: '/api/reply/config/'+id,
+		method: 'get',
+		data
+	});
+}
+// 获取产品评论
+export function reply_list(data,id) {
+	return request({
+		url: '/api/reply/list/'+id,
+		method: 'get',
+		data
+	});
+}
+

+ 0 - 59
api/received.js

@@ -1,59 +0,0 @@
-import request from '@/utils/request'
-
-
-// 获取商户收款码
-export function receivedCollectionCode(data,id) {
-	return request({
-		url: '/api/received/collection_code',
-		method: 'get',
-		data
-	});
-}
-// 获取付款码
-export function receivedPaymentCode(data,id) {
-	return request({
-		url: '/api/received/payment_code',
-		method: 'get',
-		data
-	});
-}
-// 检测是否有效
-export function receivedCodeState(data,id) {
-	return request({
-		url: '/api/received/code_state',
-		method: 'post',
-		data
-	});
-}
-// 创建订单
-export function receivedPaymentCreate(data,id) {
-	return request({
-		url: '/api/received/payment_create',
-		method: 'post',
-		data
-	});
-}
-// 我的订单
-export function receivedLst(data,id) {
-	return request({
-		url: '/api/received/lst',
-		method: 'get',
-		data
-	});
-}
-// 收款记录
-export function collectionLst(data,id) {
-	return request({
-		url: '/api/received/collection_lst',
-		method: 'post',
-		data
-	});
-}
-// 已提醒
-export function collectionSetTip(data,id) {
-	return request({
-		url: '/api/received/collection_set_tip',
-		method: 'post',
-		data
-	});
-}

+ 0 - 19
api/reply.js

@@ -1,19 +0,0 @@
-import request from '@/utils/request'
-
-
-// 产品评价数量和好评度
-export function reply_config(data,id) {
-	return request({
-		url: '/api/reply/config/'+id,
-		method: 'get',
-		data
-	});
-}
-// 获取产品评论
-export function reply_list(data,id) {
-	return request({
-		url: '/api/reply/list/'+id,
-		method: 'get',
-		data
-	});
-}

+ 0 - 18
api/seckill.js

@@ -1,18 +0,0 @@
-import request from '@/utils/request'
-
-// 获取秒杀分类
-export function getClass(data) {
-	return request({
-		url: '/api/seckill/index',
-		method: 'get',
-		data
-	});
-}
-// 获取秒杀列表
-export function getList(data,id) {
-	return request({
-		url: '/api/seckill/list/'+id,
-		method: 'get',
-		data
-	});
-}

+ 3 - 1
api/set.js

@@ -34,6 +34,7 @@ export function binding(data) {
 		data
 	});
 }
+// #ifdef APP-PLUS
 //苹果生成账户
 export function applelogin(data) {
 	return request({
@@ -41,4 +42,5 @@ export function applelogin(data) {
 		method: 'post',
 		data
 	});
-}
+}
+// #endif

+ 0 - 10
api/shareQrCode.js

@@ -1,10 +0,0 @@
-import request from '@/utils/request'
-
-// 邀请用户
-export function spreadBanner(data) {
-	return request({
-		url: '/api/spread/banner',
-		method: 'get',
-		data
-	});
-}

+ 0 - 14
api/shoping.js

@@ -1,14 +0,0 @@
-import request from '@/utils/request'
-
-
-// 获取店铺信息
-export function getShoping(data) {
-	return request({
-		url: '/api/merchant',
-		method: 'get',
-		data
-	});
-}
-
-
-

+ 0 - 27
api/sign.js

@@ -1,27 +0,0 @@
-import request from '@/utils/request'
-
-// 获取签到列表
-export function signList(data) {
-	return request({
-		url: '/api/sign/list',
-		method: 'get',
-		data
-	});
-}
-// 点击签到
-export function integral(data) {
-	return request({
-		url: '/api/sign/integral',
-		method: 'post',
-		data
-	});
-}
-
-// 签到信息
-export function signUser(data) {
-	return request({
-		url: '/api/sign/user',
-		method: 'post',
-		data
-	});
-}

+ 113 - 19
api/user.js

@@ -9,53 +9,147 @@ export function orderData(data) {
 	});
 }
 
-// 订单统计信息
-export function orderVerific(data) {
+// 获取用户信息
+export function getUserInfo(data) {
 	return request({
-		url: '/api/order/order_verific',
-		method: 'post',
+		url: '/api/userinfo',
+		method: 'get',
 		data
 	});
 }
 
-// 获取用户信息
-export function userinfo(data) {
+// 用户分享图
+export function spreadBanner(data) {
 	return request({
-		url: '/api/userinfo',
+		url: '/api/spread/banner',
 		method: 'get',
 		data
 	});
 }
-//获取会员
-export function getVip(data) {
+
+// 获取地址列表
+export function getAddressList(data) {
 	return request({
-		url: '/api/level/lst',
+		url: '/api/address/list',
 		method: 'get',
 		data
 	});
 }
-//开通会员
-export function becomeVip(data) {
+// 修改地址
+export function addressEdit(data) {
 	return request({
-		url: '/api/level/recharge',
+		url: '/api/address/edit',
 		method: 'post',
 		data
 	});
 }
-// 获取用户信息
-export function getUserInfo(data) {
+// 删除地址
+export function addressDel(data) {
 	return request({
-		url: '/api/userinfo',
+		url: '/api/address/del',
+		method: 'post',
+		data
+	});
+}
+// 设为默认地址
+export function setAddressDefault(data) {
+	return request({
+		url: '/api/address/default/set',
+		method: 'post',
+		data
+	});
+}
+// 购物车列表
+export function getCartList(data) {
+	return request({
+		url: '/api/cart/list',
 		method: 'get',
 		data
 	});
 }
 
-// 用户分享图
-export function spreadBanner(data) {
+// 修改购物车数量
+export function getCartNum(data) {
 	return request({
-		url: '/api/spread/banner',
+		url: '/api/cart/num',
+		method: 'post',
+		data
+	});
+}
+//删除购物车
+export function cartDel(data) {
+	return request({
+		url: '/api/cart/del',
+		method: 'post',
+		data
+	});
+}
+//获取二维码
+export function service(data) {
+	return request({
+		url: '/api/service',
+		method: 'GET',
+		data
+	})
+}
+//获取收藏夹列表
+export function getcollectList(data) {
+	return request({
+		url: '/api/collect/user',
 		method: 'get',
 		data
 	});
 }
+// 取消收藏
+export function delcollect(data) {
+	return request({
+		url: '/api/collect/del',
+		method: 'post',
+		data
+	});
+}
+
+//我的推广
+export function spread(data) {
+	return request({
+		url: '/api/spread/people',
+		method: 'POST',
+		data
+	});
+}
+
+//文章分类
+export function articleList(data) {
+	return request({
+		url: '/api/article/category/list',
+		method: 'GET',
+		data
+	});
+}
+
+//文章列表
+export function article(data,id) {
+	return request({
+		url: '/api/article/list/'+id,
+		method: 'GET',
+		data
+	});
+}
+
+//文章详情
+export function details(data,id) {
+	return request({
+		url: '/api/article/details/'+id,
+		method: 'GET',
+		data
+	});
+}
+
+//用户修改信息
+export function edit(data) {
+	return request({
+		url: '/api/user/edit',
+		method: 'post',
+		data
+	});
+}

+ 20 - 61
api/wallet.js

@@ -7,7 +7,7 @@ export function spreadCommission(data,state) {
 		method: 'get',
 		data
 	});
-} 
+}
 
 // 获取账户余额
 export function userBalance(data) {
@@ -26,24 +26,6 @@ export function extractCash(data) {
 		data
 	});
 }
-// 转入
-export function rechargemoneys(data) {
-	return request({
-		url: '/api/user/do',
-		method: 'get',
-		data
-	});
-}
-
-//佣金转余额
-export function extractCashs(data) {
-	return request({
-		url: '/api/recharge/wechat',
-		method: 'post',
-		data
-	});
-}
-
 
 // 提现信息
 export function extractBank(data) {
@@ -53,17 +35,8 @@ export function extractBank(data) {
 		data
 	});
 }
-// 佣金信息
-export function commission(data) {
-	return request({
-		url: '/api/commission',
-		method: 'get',
-		data
-	});
-}
-
-
-// 充值
+// #ifdef H5
+// 公众号充值
 export function rechargeWechat(data) {
 	return request({
 		url: '/api/recharge/wechat',
@@ -71,47 +44,33 @@ export function rechargeWechat(data) {
 		data
 	});
 }
-// 获取提现支付宝账号
-export function aliInfo(data) {
+// #endif
+// #ifdef MP
+// 小程序充值
+export function rechargeRoutine(data) {
 	return request({
-		url: '/api/ali/info',
-		method: 'get',
-		data
-	});
-}
-//获取默认银行卡账号
-export function bankInfo(data) {
-	return request({
-		url: '/api/bank/info',
-		method: 'get',
-		data
-	});
-}
-// 保存提现支付宝账号
-export function setAliInfo(data) {
-	return request({
-		url: '/api/ali/edit',
+		url: '/api/recharge/routine',
 		method: 'post',
 		data
 	});
 }
-//保存默认银行卡账号
-export function setBankInfo(data) {
+// #endif
+
+
+// 账户余额
+export function balance(data) {
 	return request({
-		url: '/api/bank/edit',
-		method: 'post',
+		url: '/api/user/balance',
+		method: 'get',
 		data
 	});
 }
 
-// 获取充值金额列表
-export function getRechargeList(data) {
+// 修改用户信息
+export function userEdit(data) {
 	return request({
-		url: '/api/recharge/index',
-		method: 'get',
+		url: '/api/user/edit',
+		method: 'post',
 		data
 	});
-}
-
-
-
+}

+ 10 - 13
api/wx.js

@@ -1,25 +1,22 @@
 import request from '@/utils/request'
-import store from '@/store';
 // #ifdef H5
-//微信配置
-export function wechatConfig(data) {
+// 微信分享信息
+export function share(data) {
 	return request({
-		url: '/api/wechat/config',
+		url: '/api/share',
 		method: 'get',
-		data:{
-			url:window.location.href
-		}
+		data
 	});
 }
-// 微信分享信息
-export function share(data) {
+//微信配置
+export function wechatConfig(data) {
 	return request({
-		url: '/api/share',
+		url: '/api/wechat/config',
 		method: 'get',
 		data
 	});
 }
-// 微信h5code地址
+// 微信code地址
 export function wechatAuth(data) {
 	return request({
 		url: '/api/wechat/auth',
@@ -29,7 +26,7 @@ export function wechatAuth(data) {
 }
 // #endif
 // #ifdef MP-WEIXIN
-// 微信小程序code地址
+// 微信code地址
 export function wechatMpAuth(data) {
 	return request({
 		url: '/api/wechat/mp_auth',
@@ -37,4 +34,4 @@ export function wechatMpAuth(data) {
 		data
 	});
 }
-// #endif
+// #endif

+ 57 - 0
components/Loading/index.vue

@@ -0,0 +1,57 @@
+<template>
+	<view>
+		<view class="Loads acea-row row-center-wrapper" v-if="loading && !loaded" style="margin-top: .2rem;">
+			<view v-if="loading">
+				<view class="iconfont icon-jiazai loading acea-row row-center-wrapper"></view>
+				正在加载中
+			</view>
+			<view v-else>
+				上拉加载更多
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "Loading",
+		props: {
+			loaded: {
+				type: Boolean,
+				default: false
+			},
+			loading: {
+				type: Boolean,
+				default: false
+			}
+		}
+	};
+</script>
+<style>
+	.Loads {
+	  height: 80upx;
+	  font-size: 25upx;
+	  color: #000;
+	}
+	.Loads .iconfont {
+	  font-size: 30upx;
+	  margin-right: 10upx;
+	  height: 32upx;
+	  line-height: 32upx;
+	}
+	/*加载动画*/
+	@keyframes load {
+	  from {
+	    transform: rotate(0deg);
+	  }
+	  to {
+	    transform: rotate(360deg);
+	  }
+	}
+	.loadingpic {
+	  animation: load 3s linear 1s infinite;
+	}
+	.loading {
+	  animation: load linear 1s infinite;
+	}
+</style>

+ 0 - 36
components/canvasLove/canvasLove.vue

@@ -1,36 +0,0 @@
-<template>
-	<canvas class="canvasBox" :id="'canvasId_' + canvasId"></canvas>
-</template>
-
-<script>
-export default {
-	props: {
-		canvasId: {
-			type: String,
-			default: '1'
-		}
-	},
-	data() {
-		return {
-			canvasObj: value
-		};
-	},
-	created() {
-		// 保存画布对象
-		this.canvasObj = uni.createCanvasContext('canvasId' + this.canvasId, this);
-		
-		// 获取可使用窗口宽度
-		let width = uni.getSystemInfoSync().windowWidth 
-		this.width = `${width}px` 
-		
-	}
-};
-</script>
-
-<style>
-	.canvasBox{
-		width: 110rpx;
-		height: 370rpx;
-	}
-	
-</style>

+ 120 - 0
components/countDown/index.vue

@@ -0,0 +1,120 @@
+<template>
+	<view class="time" :style="justifyLeft">
+		<text class="red" v-if="tipText">{{ tipText }}</text>
+		<text class="styleAll" v-if="isDay === true">{{ day }}</text>
+		<text class="timeTxt red" v-if="dayText">{{ dayText }}</text>
+		<text class="styleAll">{{ hour }}</text>
+		<text class="timeTxt red" v-if="hourText">{{ hourText }}</text>
+		<text class="styleAll">{{ minute }}</text>
+		<text class="timeTxt red" v-if="minuteText">{{ minuteText }}</text>
+		<text class="styleAll">{{ second }}</text>
+		<text class="timeTxt red" v-if="secondText">{{ secondText }}</text>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "countDown",
+		props: {
+			justifyLeft: {
+				type: String,
+				default: ""
+			},
+			//距离开始提示文字
+			tipText: {
+				type: String,
+				default: "倒计时"
+			},
+			dayText: {
+				type: String,
+				default: "天"
+			},
+			hourText: {
+				type: String,
+				default: "时"
+			},
+			minuteText: {
+				type: String,
+				default: "分"
+			},
+			secondText: {
+				type: String,
+				default: "秒"
+			},
+			datatime: {
+				type: Number,
+				default: 0
+			},
+			isDay: {
+				type: Boolean,
+				default: true
+			}
+		},
+		data: function() {
+			return {
+				day: "00",
+				hour: "00",
+				minute: "00",
+				second: "00"
+			};
+		},
+		created: function() {
+			this.show_time();
+		},
+		mounted: function() {},
+		methods: {
+			show_time: function() {
+				let that = this;
+
+				function runTime() {
+					//时间函数
+					let intDiff = that.datatime - Date.parse(new Date()) / 1000; //获取数据中的时间戳的时间差;
+					let day = 0,
+						hour = 0,
+						minute = 0,
+						second = 0;
+					if (intDiff > 0) {
+						//转换时间
+						if (that.isDay === true) {
+							day = Math.floor(intDiff / (60 * 60 * 24));
+						} else {
+							day = 0;
+						}
+						hour = Math.floor(intDiff / (60 * 60)) - day * 24;
+						minute = Math.floor(intDiff / 60) - day * 24 * 60 - hour * 60;
+						second =
+							Math.floor(intDiff) -
+							day * 24 * 60 * 60 -
+							hour * 60 * 60 -
+							minute * 60;
+						if (hour <= 9) hour = "0" + hour;
+						if (minute <= 9) minute = "0" + minute;
+						if (second <= 9) second = "0" + second;
+						that.day = day;
+						that.hour = hour;
+						that.minute = minute;
+						that.second = second;
+					} else {
+						that.day = "00";
+						that.hour = "00";
+						that.minute = "00";
+						that.second = "00";
+					}
+				}
+				runTime();
+				setInterval(runTime, 1000);
+			}
+		}
+	};
+</script>
+
+<style>
+	.time{
+		display: flex;
+		justify-content: center;
+	} 
+	.red{
+		color: #fc4141;
+		margin: 0 4rpx;
+	}
+</style>

+ 36 - 0
components/emptyPage.vue

@@ -0,0 +1,36 @@
+<template>
+	<view class="empty-box">
+		<image src="/static/images/empty-box.png"></image>
+		<view class="txt">{{title}}</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		props: {
+			title: {
+				type: String,
+				default: '暂无记录',
+			},
+		},
+	}
+	
+</script>
+
+<style lang="scss">
+	.empty-box{
+		display: flex;
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+		margin-top: 200rpx;
+		image{
+			width: 414rpx;
+			height: 240rpx;
+		}
+		.txt{
+			font-size: 26rpx;
+			color: #999;
+		}
+	}
+</style>

+ 118 - 0
components/home/index.vue

@@ -0,0 +1,118 @@
+<template>
+	<view style="touch-action: none;">
+		<view class="home" style="position:fixed;" :style="{ top: top + 'px', bottom: bottom }" id="right-nav" @touchmove.stop.prevent="setTouchMove">
+			<view class="homeCon bg-color-red" :class="homeActive === true ? 'on' : ''" v-if="homeActive">
+				<navigator hover-class='none' url='/pages/index/index' open-type='switchTab' class='iconfont icon-shouye-xianxing'></navigator>
+				<navigator hover-class='none' url='/pages/order_addcart/order_addcart' open-type='switchTab' class='iconfont icon-caigou-xianxing'></navigator>
+				<navigator hover-class='none' url='/pages/user/index' open-type='switchTab' class='iconfont icon-yonghu1'></navigator>
+			</view>
+			<view @click="open" class="pictrueBox">
+				<view class="pictrue">
+					<image :src="
+              homeActive === true
+                ? '/static/images/close.gif'
+                : '/static/images/open.gif'
+            "
+					 class="image" />
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+	import {
+		mapGetters
+	} from "vuex";
+	export default {
+		name: "Home",
+		props: {},
+		data: function() {
+			return {
+				top: "",
+				bottom: ""
+			};
+		},
+		computed: mapGetters(["homeActive"]),
+		methods: {
+			setTouchMove(e) {
+				var that = this;
+				if (e.touches[0].clientY < 545 && e.touches[0].clientY > 66) {
+					that.top = e.touches[0].clientY
+					// that.setData({
+					// 	top: e.touches[0].clientY
+					// })
+				}
+			},
+			open: function() {
+				this.homeActive ?
+					this.$store.commit("CLOSE_HOME") :
+					this.$store.commit("OPEN_HOME");
+			}
+		},
+		created() {
+			this.bottom = "50px";
+		}
+	};
+</script>
+
+<style scoped>
+	.pictrueBox {
+		width: 130rpx;
+		height: 120rpx;
+	}
+
+	/*返回主页按钮*/
+	.home {
+		position: fixed;
+		color: white;
+		text-align: center;
+		z-index: 9999;
+		right: 15rpx;
+		display: flex;
+	}
+
+	.home .homeCon {
+		border-radius: 50rpx;
+		opacity: 0;
+		height: 0;
+		color: #e93323;
+		width: 0;
+	}
+
+	.home .homeCon.on {
+		opacity: 1;
+		animation: bounceInRight 0.5s cubic-bezier(0.215, 0.610, 0.355, 1.000);
+		width: 300rpx;
+		height: 86rpx;
+		margin-bottom: 20rpx;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		background: #f44939 !important;
+	}
+
+	.home .homeCon .iconfont {
+		font-size: 48rpx;
+		color: #fff;
+		display: inline-block;
+		margin: 0 auto;
+	}
+
+	.home .pictrue {
+		width: 86rpx;
+		height: 86rpx;
+		border-radius: 50%;
+		margin: 0 auto;
+	}
+
+	.home .pictrue .image {
+		width: 100%;
+		height: 100%;
+		border-radius: 50%;
+		transform: rotate(90deg);
+		ms-transform: rotate(90deg);
+		moz-transform: rotate(90deg);
+		webkit-transform: rotate(90deg);
+		o-transform: rotate(90deg);
+	}
+</style>

+ 630 - 0
components/jyf-parser/jyf-parser.vue

@@ -0,0 +1,630 @@
+<template>
+	<view>
+		<slot v-if="!nodes.length" />
+		<!--#ifdef APP-PLUS-NVUE-->
+		<web-view id="_top" ref="web" :style="'margin-top:-2px;height:'+height+'px'" @onPostMessage="_message" />
+		<!--#endif-->
+		<!--#ifndef APP-PLUS-NVUE-->
+		<view id="_top" :style="showAm+(selectable?';user-select:text;-webkit-user-select:text':'')">
+			<!--#ifdef H5 || MP-360-->
+			<div :id="'rtf'+uid"></div>
+			<!--#endif-->
+			<!--#ifndef H5 || MP-360-->
+			<trees :nodes="nodes" :lazyLoad="lazyLoad" :loading="loadingImg" />
+			<!--#endif-->
+		</view>
+		<!--#endif-->
+	</view>
+</template>
+
+<script>
+	// #ifndef H5 || APP-PLUS-NVUE || MP-360
+	import trees from './libs/trees';
+	var cache = {},
+		// #ifdef MP-WEIXIN || MP-TOUTIAO
+		fs = uni.getFileSystemManager ? uni.getFileSystemManager() : null,
+		// #endif
+		Parser = require('./libs/MpHtmlParser.js');
+	var dom;
+	// 计算 cache 的 key
+	function hash(str) {
+		for (var i = str.length, val = 5381; i--;)
+			val += (val << 5) + str.charCodeAt(i);
+		return val;
+	}
+	// #endif
+	// #ifdef H5 || APP-PLUS-NVUE || MP-360
+	var windowWidth = uni.getSystemInfoSync().windowWidth,
+		cfg = require('./libs/config.js');
+	// #endif
+	// #ifdef APP-PLUS-NVUE
+	var weexDom = weex.requireModule('dom');
+	// #endif
+	/**
+	 * Parser 富文本组件
+	 * @tutorial https://github.com/jin-yufeng/Parser
+	 * @property {String} html 富文本数据
+	 * @property {Boolean} autopause 是否在播放一个视频时自动暂停其他视频
+	 * @property {Boolean} autoscroll 是否自动给所有表格添加一个滚动层
+	 * @property {Boolean} autosetTitle 是否自动将 title 标签中的内容设置到页面标题
+	 * @property {Number} compress 压缩等级
+	 * @property {String} domain 图片、视频等链接的主域名
+	 * @property {Boolean} lazyLoad 是否开启图片懒加载
+	 * @property {String} loadingImg 图片加载完成前的占位图
+	 * @property {Boolean} selectable 是否开启长按复制
+	 * @property {Object} tagStyle 标签的默认样式
+	 * @property {Boolean} showWithAnimation 是否使用渐显动画
+	 * @property {Boolean} useAnchor 是否使用锚点
+	 * @property {Boolean} useCache 是否缓存解析结果
+	 * @event {Function} parse 解析完成事件
+	 * @event {Function} load dom 加载完成事件
+	 * @event {Function} ready 所有图片加载完毕事件
+	 * @event {Function} error 错误事件
+	 * @event {Function} imgtap 图片点击事件
+	 * @event {Function} linkpress 链接点击事件
+	 * @author JinYufeng
+	 * @version 20200728
+	 * @listens MIT
+	 */
+	export default {
+		name: 'parser',
+		data() {
+			return {
+				// #ifdef H5 || MP-360
+				uid: this._uid,
+				// #endif
+				// #ifdef APP-PLUS-NVUE
+				height: 1,
+				// #endif
+				// #ifndef APP-PLUS-NVUE
+				showAm: '',
+				// #endif
+				nodes: []
+			}
+		},
+		// #ifndef H5 || APP-PLUS-NVUE || MP-360
+		components: {
+			trees
+		},
+		// #endif
+		props: {
+			html: String,
+			autopause: {
+				type: Boolean,
+				default: true
+			},
+			autoscroll: Boolean,
+			autosetTitle: {
+				type: Boolean,
+				default: true
+			},
+			// #ifndef H5 || APP-PLUS-NVUE || MP-360
+			compress: Number,
+			loadingImg: String,
+			useCache: Boolean,
+			// #endif
+			domain: String,
+			lazyLoad: Boolean,
+			selectable: Boolean,
+			tagStyle: Object,
+			showWithAnimation: Boolean,
+			useAnchor: Boolean
+		},
+		watch: {
+			html(html) {
+				this.setContent(html);
+			}
+		},
+		created() {
+			// 图片数组
+			this.imgList = [];
+			this.imgList.each = function(f) {
+				for (var i = 0, len = this.length; i < len; i++)
+					this.setItem(i, f(this[i], i, this));
+			}
+			this.imgList.setItem = function(i, src) {
+				if (i == void 0 || !src) return;
+				// #ifndef MP-ALIPAY || APP-PLUS
+				// 去重
+				if (src.indexOf('http') == 0 && this.includes(src)) {
+					var newSrc = src.split('://')[0];
+					for (var j = newSrc.length, c; c = src[j]; j++) {
+						if (c == '/' && src[j - 1] != '/' && src[j + 1] != '/') break;
+						newSrc += Math.random() > 0.5 ? c.toUpperCase() : c;
+					}
+					newSrc += src.substr(j);
+					return this[i] = newSrc;
+				}
+				// #endif
+				this[i] = src;
+				// 暂存 data src
+				if (src.includes('data:image')) {
+					var filePath, info = src.match(/data:image\/(\S+?);(\S+?),(.+)/);
+					if (!info) return;
+					// #ifdef MP-WEIXIN || MP-TOUTIAO
+					filePath = `${wx.env.USER_DATA_PATH}/${Date.now()}.${info[1]}`;
+					fs && fs.writeFile({
+						filePath,
+						data: info[3],
+						encoding: info[2],
+						success: () => this[i] = filePath
+					})
+					// #endif
+					// #ifdef APP-PLUS
+					filePath = `_doc/parser_tmp/${Date.now()}.${info[1]}`;
+					var bitmap = new plus.nativeObj.Bitmap();
+					bitmap.loadBase64Data(src, () => {
+						bitmap.save(filePath, {}, () => {
+							bitmap.clear()
+							this[i] = filePath;
+						})
+					})
+					// #endif
+				}
+			}
+		},
+		mounted() {
+			// #ifdef H5 || MP-360
+			this.document = document.getElementById('rtf' + this._uid);
+			// #endif
+			// #ifndef H5 || APP-PLUS-NVUE || MP-360
+			if (dom) this.document = new dom(this);
+			// #endif
+			// #ifdef APP-PLUS-NVUE
+			this.document = this.$refs.web;
+			setTimeout(() => {
+				// #endif
+				if (this.html) this.setContent(this.html);
+				// #ifdef APP-PLUS-NVUE
+			}, 30)
+			// #endif
+		},
+		beforeDestroy() {
+			// #ifdef H5 || MP-360
+			if (this._observer) this._observer.disconnect();
+			// #endif
+			this.imgList.each(src => {
+				// #ifdef APP-PLUS
+				if (src && src.includes('_doc')) {
+					plus.io.resolveLocalFileSystemURL(src, entry => {
+						entry.remove();
+					});
+				}
+				// #endif
+				// #ifdef MP-WEIXIN || MP-TOUTIAO
+				if (src && src.includes(uni.env.USER_DATA_PATH))
+					fs && fs.unlink({
+						filePath: src
+					})
+				// #endif
+			})
+			clearInterval(this._timer);
+		},
+		methods: {
+			// 设置富文本内容
+			setContent(html, append) {
+				// #ifdef APP-PLUS-NVUE
+				if (!html)
+					return this.height = 1;
+				if (append)
+					this.$refs.web.evalJs("var b=document.createElement('div');b.innerHTML='" + html.replace(/'/g, "\\'") +
+						"';document.getElementById('parser').appendChild(b)");
+				else {
+					html =
+						'<meta charset="utf-8" /><meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no"><style>html,body{width:100%;height:100%;overflow:hidden}body{margin:0}</style><base href="' +
+						this.domain + '"><div id="parser"' + (this.selectable ? '>' : ' style="user-select:none">') + this._handleHtml(html).replace(/\n/g, '\\n') +
+						'</div><script>"use strict";function e(e){if(window.__dcloud_weex_postMessage||window.__dcloud_weex_){var t={data:[e]};window.__dcloud_weex_postMessage?window.__dcloud_weex_postMessage(t):window.__dcloud_weex_.postMessage(JSON.stringify(t))}}document.body.onclick=function(){e({action:"click"})},' +
+						(this.showWithAnimation ? 'document.body.style.animation="_show .5s",' : '') +
+						'setTimeout(function(){e({action:"load",text:document.body.innerText,height:document.getElementById("parser").scrollHeight})},50);\x3c/script>';
+					this.$refs.web.evalJs("document.write('" + html.replace(/'/g, "\\'") + "');document.close()");
+				}
+				this.$refs.web.evalJs(
+					'var t=document.getElementsByTagName("title");t.length&&e({action:"getTitle",title:t[0].innerText});for(var o,n=document.getElementsByTagName("style"),r=1;o=n[r++];)o.innerHTML=o.innerHTML.replace(/body/g,"#parser");for(var a,c=document.getElementsByTagName("img"),s=[],i=0==c.length,d=0,l=0,g=0;a=c[l];l++)parseInt(a.style.width||a.getAttribute("width"))>' +
+					windowWidth + '&&(a.style.height="auto"),a.onload=function(){++d==c.length&&(i=!0)},a.onerror=function(){++d==c.length&&(i=!0),' + (cfg.errorImg ? 'this.src="' + cfg.errorImg + '",' : '') +
+					'e({action:"error",source:"img",target:this})},a.hasAttribute("ignore")||"A"==a.parentElement.nodeName||(a.i=g++,s.push(a.src),a.onclick=function(){e({action:"preview",img:{i:this.i,src:this.src}})});e({action:"getImgList",imgList:s});for(var u,m=document.getElementsByTagName("a"),f=0;u=m[f];f++)u.onclick=function(){var t,o=this.getAttribute("href");if("#"==o[0]){var n=document.getElementById(o.substr(1));n&&(t=n.offsetTop)}return e({action:"linkpress",href:o,offset:t}),!1};for(var h,y=document.getElementsByTagName("video"),v=0;h=y[v];v++)h.style.maxWidth="100%",h.onerror=function(){e({action:"error",source:"video",target:this})}' +
+					(this.autopause ? ',h.onplay=function(){for(var e,t=0;e=y[t];t++)e!=this&&e.pause()}' : '') +
+					';for(var _,p=document.getElementsByTagName("audio"),w=0;_=p[w];w++)_.onerror=function(){e({action:"error",source:"audio",target:this})};' +
+					(this.autoscroll ? 'for(var T,E=document.getElementsByTagName("table"),B=0;T=E[B];B++){var N=document.createElement("div");N.style.overflow="scroll",T.parentNode.replaceChild(N,T),N.appendChild(T)}' : '') +
+					'var x=document.getElementById("parser");clearInterval(window.timer),window.timer=setInterval(function(){i&&clearInterval(window.timer),e({action:"ready",ready:i,height:x.scrollHeight})},350)'
+				)
+				this.nodes = [1];
+				// #endif
+				// #ifdef H5 || MP-360
+				if (!html) {
+					if (this.rtf && !append) this.rtf.parentNode.removeChild(this.rtf);
+					return;
+				}
+				var div = document.createElement('div');
+				if (!append) {
+					if (this.rtf) this.rtf.parentNode.removeChild(this.rtf);
+					this.rtf = div;
+				} else {
+					if (!this.rtf) this.rtf = div;
+					else this.rtf.appendChild(div);
+				}
+				div.innerHTML = this._handleHtml(html, append);
+				for (var styles = this.rtf.getElementsByTagName('style'), i = 0, style; style = styles[i++];) {
+					style.innerHTML = style.innerHTML.replace(/body/g, '#rtf' + this._uid);
+					style.setAttribute('scoped', 'true');
+				}
+				// 懒加载
+				if (!this._observer && this.lazyLoad && IntersectionObserver) {
+					this._observer = new IntersectionObserver(changes => {
+						for (let item, i = 0; item = changes[i++];) {
+							if (item.isIntersecting) {
+								item.target.src = item.target.getAttribute('data-src');
+								item.target.removeAttribute('data-src');
+								this._observer.unobserve(item.target);
+							}
+						}
+					}, {
+						rootMargin: '500px 0px 500px 0px'
+					})
+				}
+				var _ts = this;
+				// 获取标题
+				var title = this.rtf.getElementsByTagName('title');
+				if (title.length && this.autosetTitle)
+					uni.setNavigationBarTitle({
+						title: title[0].innerText
+					})
+				// 图片处理
+				this.imgList.length = 0;
+				var imgs = this.rtf.getElementsByTagName('img');
+				for (let i = 0, j = 0, img; img = imgs[i]; i++) {
+					if (parseInt(img.style.width || img.getAttribute('width')) > windowWidth)
+						img.style.height = 'auto';
+					var src = img.getAttribute('src');
+					if (this.domain && src) {
+						if (src[0] == '/') {
+							if (src[1] == '/')
+								img.src = (this.domain.includes('://') ? this.domain.split('://')[0] : '') + ':' + src;
+							else img.src = this.domain + src;
+						} else if (!src.includes('://')) img.src = this.domain + '/' + src;
+					}
+					if (!img.hasAttribute('ignore') && img.parentElement.nodeName != 'A') {
+						img.i = j++;
+						_ts.imgList.push(img.src || img.getAttribute('data-src'));
+						img.onclick = function() {
+							var preview = true;
+							this.ignore = () => preview = false;
+							_ts.$emit('imgtap', this);
+							if (preview) {
+								uni.previewImage({
+									current: this.i,
+									urls: _ts.imgList
+								});
+							}
+						}
+					}
+					img.onerror = function() {
+						if (cfg.errorImg)
+							_ts.imgList[this.i] = this.src = cfg.errorImg;
+						_ts.$emit('error', {
+							source: 'img',
+							target: this
+						});
+					}
+					if (_ts.lazyLoad && this._observer && img.src && img.i != 0) {
+						img.setAttribute('data-src', img.src);
+						img.removeAttribute('src');
+						this._observer.observe(img);
+					}
+				}
+				// 链接处理
+				var links = this.rtf.getElementsByTagName('a');
+				for (var link of links) {
+					link.onclick = function() {
+						var jump = true,
+							href = this.getAttribute('href');
+						_ts.$emit('linkpress', {
+							href,
+							ignore: () => jump = false
+						});
+						if (jump && href) {
+							if (href[0] == '#') {
+								if (_ts.useAnchor) {
+									_ts.navigateTo({
+										id: href.substr(1)
+									})
+								}
+							} else if (href.indexOf('http') == 0 || href.indexOf('//') == 0)
+								return true;
+							else
+								uni.navigateTo({
+									url: href
+								})
+						}
+						return false;
+					}
+				}
+				// 视频处理
+				var videos = this.rtf.getElementsByTagName('video');
+				_ts.videoContexts = videos;
+				for (let video, i = 0; video = videos[i++];) {
+					video.style.maxWidth = '100%';
+					video.onerror = function() {
+						_ts.$emit('error', {
+							source: 'video',
+							target: this
+						});
+					}
+					video.onplay = function() {
+						if (_ts.autopause)
+							for (let item, i = 0; item = _ts.videoContexts[i++];)
+								if (item != this) item.pause();
+					}
+				}
+				// 音频处理
+				var audios = this.rtf.getElementsByTagName('audio');
+				for (var audio of audios)
+					audio.onerror = function() {
+						_ts.$emit('error', {
+							source: 'audio',
+							target: this
+						});
+					}
+				// 表格处理
+				if (this.autoscroll) {
+					var tables = this.rtf.getElementsByTagName('table');
+					for (var table of tables) {
+						let div = document.createElement('div');
+						div.style.overflow = 'scroll';
+						table.parentNode.replaceChild(div, table);
+						div.appendChild(table);
+					}
+				}
+				if (!append) this.document.appendChild(this.rtf);
+				this.$nextTick(() => {
+					this.nodes = [1];
+					this.$emit('load');
+				});
+				setTimeout(() => this.showAm = '', 500);
+				// #endif
+				// #ifndef APP-PLUS-NVUE
+				// #ifndef H5 || MP-360
+				var nodes;
+				if (!html) return this.nodes = [];
+				var parser = new Parser(html, this);
+				// 缓存读取
+				if (this.useCache) {
+					var hashVal = hash(html);
+					if (cache[hashVal])
+						nodes = cache[hashVal];
+					else {
+						nodes = parser.parse();
+						cache[hashVal] = nodes;
+					}
+				} else nodes = parser.parse();
+				this.$emit('parse', nodes);
+				if (append) this.nodes = this.nodes.concat(nodes);
+				else this.nodes = nodes;
+				if (nodes.length && nodes.title && this.autosetTitle)
+					uni.setNavigationBarTitle({
+						title: nodes.title
+					})
+				if (this.imgList) this.imgList.length = 0;
+				this.videoContexts = [];
+				this.$nextTick(() => {
+					(function f(cs) {
+						for (var i = cs.length; i--;) {
+							if (cs[i].top) {
+								cs[i].controls = [];
+								cs[i].init();
+								f(cs[i].$children);
+							}
+						}
+					})(this.$children)
+					this.$emit('load');
+				})
+				// #endif
+				var height;
+				clearInterval(this._timer);
+				this._timer = setInterval(() => {
+					// #ifdef H5 || MP-360
+					this.rect = this.rtf.getBoundingClientRect();
+					// #endif
+					// #ifndef H5 || MP-360
+					uni.createSelectorQuery().in(this)
+						.select('#_top').boundingClientRect().exec(res => {
+							if (!res) return;
+							this.rect = res[0];
+							// #endif
+							if (this.rect.height == height) {
+								this.$emit('ready', this.rect)
+								clearInterval(this._timer);
+							}
+							height = this.rect.height;
+							// #ifndef H5 || MP-360
+						});
+					// #endif
+				}, 350);
+				if (this.showWithAnimation && !append) this.showAm = 'animation:_show .5s';
+				// #endif
+			},
+			// 获取文本内容
+			getText(ns = this.nodes) {
+				var txt = '';
+				// #ifdef APP-PLUS-NVUE
+				txt = this._text;
+				// #endif
+				// #ifdef H5 || MP-360
+				txt = this.rtf.innerText;
+				// #endif
+				// #ifndef H5 || APP-PLUS-NVUE || MP-360
+				for (var i = 0, n; n = ns[i++];) {
+					if (n.type == 'text') txt += n.text.replace(/&nbsp;/g, '\u00A0').replace(/&lt;/g, '<').replace(/&gt;/g, '>')
+						.replace(/&amp;/g, '&');
+					else if (n.type == 'br') txt += '\n';
+					else {
+						// 块级标签前后加换行
+						var block = n.name == 'p' || n.name == 'div' || n.name == 'tr' || n.name == 'li' || (n.name[0] == 'h' && n.name[1] >
+							'0' && n.name[1] < '7');
+						if (block && txt && txt[txt.length - 1] != '\n') txt += '\n';
+						if (n.children) txt += this.getText(n.children);
+						if (block && txt[txt.length - 1] != '\n') txt += '\n';
+						else if (n.name == 'td' || n.name == 'th') txt += '\t';
+					}
+				}
+				// #endif
+				return txt;
+			},
+			// 锚点跳转
+			in (obj) {
+				if (obj.page && obj.selector && obj.scrollTop) this._in = obj;
+			},
+			navigateTo(obj) {
+				if (!this.useAnchor) return obj.fail && obj.fail('Anchor is disabled');
+				// #ifdef APP-PLUS-NVUE
+				if (!obj.id)
+					weexDom.scrollToElement(this.$refs.web);
+				else
+					this.$refs.web.evalJs('var pos=document.getElementById("' + obj.id +
+						'");if(pos)post({action:"linkpress",href:"#",offset:pos.offsetTop+' + (obj.offset || 0) + '})');
+				obj.success && obj.success();
+				// #endif
+				// #ifndef APP-PLUS-NVUE
+				var d = ' ';
+				// #ifdef MP-WEIXIN || MP-QQ || MP-TOUTIAO
+				d = '>>>';
+				// #endif
+				var selector = uni.createSelectorQuery().in(this._in ? this._in.page : this).select((this._in ? this._in.selector :
+					'#_top') + (obj.id ? `${d}#${obj.id},${this._in?this._in.selector:'#_top'}${d}.${obj.id}` : '')).boundingClientRect();
+				if (this._in) selector.select(this._in.selector).scrollOffset().select(this._in.selector).boundingClientRect();
+				else selector.selectViewport().scrollOffset();
+				selector.exec(res => {
+					if (!res[0]) return obj.fail && obj.fail('Label not found')
+					var scrollTop = res[1].scrollTop + res[0].top - (res[2] ? res[2].top : 0) + (obj.offset || 0);
+					if (this._in) this._in.page[this._in.scrollTop] = scrollTop;
+					else uni.pageScrollTo({
+						scrollTop,
+						duration: 300
+					})
+					obj.success && obj.success();
+				})
+				// #endif
+			},
+			// 获取视频对象
+			getVideoContext(id) {
+				// #ifndef APP-PLUS-NVUE
+				if (!id) return this.videoContexts;
+				else
+					for (var i = this.videoContexts.length; i--;)
+						if (this.videoContexts[i].id == id) return this.videoContexts[i];
+				// #endif
+			},
+			// #ifdef H5 || APP-PLUS-NVUE || MP-360
+			_handleHtml(html, append) {
+				if (!append) {
+					// 处理 tag-style 和 userAgentStyles
+					var style = '<style>@keyframes _show{0%{opacity:0}100%{opacity:1}}img{max-width:100%}';
+					for (var item in cfg.userAgentStyles)
+						style += `${item}{${cfg.userAgentStyles[item]}}`;
+					for (item in this.tagStyle)
+						style += `${item}{${this.tagStyle[item]}}`;
+					style += '</style>';
+					html = style + html;
+				}
+				// 处理 rpx
+				if (html.includes('rpx'))
+					html = html.replace(/[0-9.]+\s*rpx/g, $ => (parseFloat($) * windowWidth / 750) + 'px');
+				return html;
+			},
+			// #endif
+			// #ifdef APP-PLUS-NVUE
+			_message(e) {
+				// 接收 web-view 消息
+				var d = e.detail.data[0];
+				switch (d.action) {
+					case 'load':
+						this.$emit('load');
+						this.height = d.height;
+						this._text = d.text;
+						break;
+					case 'getTitle':
+						if (this.autosetTitle)
+							uni.setNavigationBarTitle({
+								title: d.title
+							})
+						break;
+					case 'getImgList':
+						this.imgList.length = 0;
+						for (var i = d.imgList.length; i--;)
+							this.imgList.setItem(i, d.imgList[i]);
+						break;
+					case 'preview':
+						var preview = true;
+						d.img.ignore = () => preview = false;
+						this.$emit('imgtap', d.img);
+						if (preview)
+							uni.previewImage({
+								current: d.img.i,
+								urls: this.imgList
+							})
+						break;
+					case 'linkpress':
+						var jump = true,
+							href = d.href;
+						this.$emit('linkpress', {
+							href,
+							ignore: () => jump = false
+						})
+						if (jump && href) {
+							if (href[0] == '#') {
+								if (this.useAnchor)
+									weexDom.scrollToElement(this.$refs.web, {
+										offset: d.offset
+									})
+							} else if (href.includes('://'))
+								plus.runtime.openWeb(href);
+							else
+								uni.navigateTo({
+									url: href
+								})
+						}
+						break;
+					case 'error':
+						if (d.source == 'img' && cfg.errorImg)
+							this.imgList.setItem(d.target.i, cfg.errorImg);
+						this.$emit('error', {
+							source: d.source,
+							target: d.target
+						})
+						break;
+					case 'ready':
+						this.height = d.height;
+						if (d.ready) uni.createSelectorQuery().in(this).select('#_top').boundingClientRect().exec(res => {
+							this.rect = res[0];
+							this.$emit('ready', res[0]);
+						})
+						break;
+					case 'click':
+						this.$emit('click');
+						this.$emit('tap');
+				}
+			},
+			// #endif
+		}
+	}
+</script>
+
+<style>
+	@keyframes _show {
+		0% {
+			opacity: 0;
+		}
+
+		100% {
+			opacity: 1;
+		}
+	}
+
+	/* #ifdef MP-WEIXIN */
+	:host {
+		display: block;
+		overflow: scroll;
+		-webkit-overflow-scrolling: touch;
+	}
+
+	/* #endif */
+</style>

+ 97 - 0
components/jyf-parser/libs/CssHandler.js

@@ -0,0 +1,97 @@
+const cfg = require('./config.js'),
+	isLetter = c => (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
+
+function CssHandler(tagStyle) {
+	var styles = Object.assign(Object.create(null), cfg.userAgentStyles);
+	for (var item in tagStyle)
+		styles[item] = (styles[item] ? styles[item] + ';' : '') + tagStyle[item];
+	this.styles = styles;
+}
+CssHandler.prototype.getStyle = function(data) {
+	this.styles = new parser(data, this.styles).parse();
+}
+CssHandler.prototype.match = function(name, attrs) {
+	var tmp, matched = (tmp = this.styles[name]) ? tmp + ';' : '';
+	if (attrs.class) {
+		var items = attrs.class.split(' ');
+		for (var i = 0, item; item = items[i]; i++)
+			if (tmp = this.styles['.' + item])
+				matched += tmp + ';';
+	}
+	if (tmp = this.styles['#' + attrs.id])
+		matched += tmp + ';';
+	return matched;
+}
+module.exports = CssHandler;
+
+function parser(data, init) {
+	this.data = data;
+	this.floor = 0;
+	this.i = 0;
+	this.list = [];
+	this.res = init;
+	this.state = this.Space;
+}
+parser.prototype.parse = function() {
+	for (var c; c = this.data[this.i]; this.i++)
+		this.state(c);
+	return this.res;
+}
+parser.prototype.section = function() {
+	return this.data.substring(this.start, this.i);
+}
+// 状态机
+parser.prototype.Space = function(c) {
+	if (c == '.' || c == '#' || isLetter(c)) {
+		this.start = this.i;
+		this.state = this.Name;
+	} else if (c == '/' && this.data[this.i + 1] == '*')
+		this.Comment();
+	else if (!cfg.blankChar[c] && c != ';')
+		this.state = this.Ignore;
+}
+parser.prototype.Comment = function() {
+	this.i = this.data.indexOf('*/', this.i) + 1;
+	if (!this.i) this.i = this.data.length;
+	this.state = this.Space;
+}
+parser.prototype.Ignore = function(c) {
+	if (c == '{') this.floor++;
+	else if (c == '}' && !--this.floor) this.state = this.Space;
+}
+parser.prototype.Name = function(c) {
+	if (cfg.blankChar[c]) {
+		this.list.push(this.section());
+		this.state = this.NameSpace;
+	} else if (c == '{') {
+		this.list.push(this.section());
+		this.Content();
+	} else if (c == ',') {
+		this.list.push(this.section());
+		this.Comma();
+	} else if (!isLetter(c) && (c < '0' || c > '9') && c != '-' && c != '_')
+		this.state = this.Ignore;
+}
+parser.prototype.NameSpace = function(c) {
+	if (c == '{') this.Content();
+	else if (c == ',') this.Comma();
+	else if (!cfg.blankChar[c]) this.state = this.Ignore;
+}
+parser.prototype.Comma = function() {
+	while (cfg.blankChar[this.data[++this.i]]);
+	if (this.data[this.i] == '{') this.Content();
+	else {
+		this.start = this.i--;
+		this.state = this.Name;
+	}
+}
+parser.prototype.Content = function() {
+	this.start = ++this.i;
+	if ((this.i = this.data.indexOf('}', this.i)) == -1) this.i = this.data.length;
+	var content = this.section();
+	for (var i = 0, item; item = this.list[i++];)
+		if (this.res[item]) this.res[item] += ';' + content;
+		else this.res[item] = content;
+	this.list = [];
+	this.state = this.Space;
+}

+ 535 - 0
components/jyf-parser/libs/MpHtmlParser.js

@@ -0,0 +1,535 @@
+/**
+ * html 解析器
+ * @tutorial https://github.com/jin-yufeng/Parser
+ * @version 20200728
+ * @author JinYufeng
+ * @listens MIT
+ */
+const cfg = require('./config.js'),
+	blankChar = cfg.blankChar,
+	CssHandler = require('./CssHandler.js'),
+	windowWidth = uni.getSystemInfoSync().windowWidth;
+var emoji;
+
+function MpHtmlParser(data, options = {}) {
+	this.attrs = {};
+	this.CssHandler = new CssHandler(options.tagStyle, windowWidth);
+	this.data = data;
+	this.domain = options.domain;
+	this.DOM = [];
+	this.i = this.start = this.audioNum = this.imgNum = this.videoNum = 0;
+	options.prot = (this.domain || '').includes('://') ? this.domain.split('://')[0] : 'http';
+	this.options = options;
+	this.state = this.Text;
+	this.STACK = [];
+	// 工具函数
+	this.bubble = () => {
+		for (var i = this.STACK.length, item; item = this.STACK[--i];) {
+			if (cfg.richOnlyTags[item.name]) {
+				if (item.name == 'table' && !Object.hasOwnProperty.call(item, 'c')) item.c = 1;
+				return false;
+			}
+			item.c = 1;
+		}
+		return true;
+	}
+	this.decode = (val, amp) => {
+		var i = -1,
+			j, en;
+		while (1) {
+			if ((i = val.indexOf('&', i + 1)) == -1) break;
+			if ((j = val.indexOf(';', i + 2)) == -1) break;
+			if (val[i + 1] == '#') {
+				en = parseInt((val[i + 2] == 'x' ? '0' : '') + val.substring(i + 2, j));
+				if (!isNaN(en)) val = val.substr(0, i) + String.fromCharCode(en) + val.substr(j + 1);
+			} else {
+				en = val.substring(i + 1, j);
+				if (cfg.entities[en] || en == amp)
+					val = val.substr(0, i) + (cfg.entities[en] || '&') + val.substr(j + 1);
+			}
+		}
+		return val;
+	}
+	this.getUrl = url => {
+		if (url[0] == '/') {
+			if (url[1] == '/') url = this.options.prot + ':' + url;
+			else if (this.domain) url = this.domain + url;
+		} else if (this.domain && url.indexOf('data:') != 0 && !url.includes('://'))
+			url = this.domain + '/' + url;
+		return url;
+	}
+	this.isClose = () => this.data[this.i] == '>' || (this.data[this.i] == '/' && this.data[this.i + 1] == '>');
+	this.section = () => this.data.substring(this.start, this.i);
+	this.parent = () => this.STACK[this.STACK.length - 1];
+	this.siblings = () => this.STACK.length ? this.parent().children : this.DOM;
+}
+MpHtmlParser.prototype.parse = function() {
+	if (emoji) this.data = emoji.parseEmoji(this.data);
+	for (var c; c = this.data[this.i]; this.i++)
+		this.state(c);
+	if (this.state == this.Text) this.setText();
+	while (this.STACK.length) this.popNode(this.STACK.pop());
+	return this.DOM;
+}
+// 设置属性
+MpHtmlParser.prototype.setAttr = function() {
+	var name = this.attrName.toLowerCase(),
+		val = this.attrVal;
+	if (cfg.boolAttrs[name]) this.attrs[name] = 'T';
+	else if (val) {
+		if (name == 'src' || (name == 'data-src' && !this.attrs.src)) this.attrs.src = this.getUrl(this.decode(val, 'amp'));
+		else if (name == 'href' || name == 'style') this.attrs[name] = this.decode(val, 'amp');
+		else if (name.substr(0, 5) != 'data-') this.attrs[name] = val;
+	}
+	this.attrVal = '';
+	while (blankChar[this.data[this.i]]) this.i++;
+	if (this.isClose()) this.setNode();
+	else {
+		this.start = this.i;
+		this.state = this.AttrName;
+	}
+}
+// 设置文本节点
+MpHtmlParser.prototype.setText = function() {
+	var back, text = this.section();
+	if (!text) return;
+	text = (cfg.onText && cfg.onText(text, () => back = true)) || text;
+	if (back) {
+		this.data = this.data.substr(0, this.start) + text + this.data.substr(this.i);
+		let j = this.start + text.length;
+		for (this.i = this.start; this.i < j; this.i++) this.state(this.data[this.i]);
+		return;
+	}
+	if (!this.pre) {
+		// 合并空白符
+		var flag, tmp = [];
+		for (let i = text.length, c; c = text[--i];)
+			if (!blankChar[c]) {
+				tmp.unshift(c);
+				if (!flag) flag = 1;
+			} else {
+				if (tmp[0] != ' ') tmp.unshift(' ');
+				if (c == '\n' && flag == void 0) flag = 0;
+			}
+		if (flag == 0) return;
+		text = tmp.join('');
+	}
+	this.siblings().push({
+		type: 'text',
+		text: this.decode(text)
+	});
+}
+// 设置元素节点
+MpHtmlParser.prototype.setNode = function() {
+	var node = {
+			name: this.tagName.toLowerCase(),
+			attrs: this.attrs
+		},
+		close = cfg.selfClosingTags[node.name];
+	if (this.options.nodes.length) node.type = 'node';
+	this.attrs = {};
+	if (!cfg.ignoreTags[node.name]) {
+		// 处理属性
+		var attrs = node.attrs,
+			style = this.CssHandler.match(node.name, attrs, node) + (attrs.style || ''),
+			styleObj = {};
+		if (attrs.id) {
+			if (this.options.compress & 1) attrs.id = void 0;
+			else if (this.options.useAnchor) this.bubble();
+		}
+		if ((this.options.compress & 2) && attrs.class) attrs.class = void 0;
+		switch (node.name) {
+			case 'a':
+			case 'ad': // #ifdef APP-PLUS
+			case 'iframe':
+				// #endif
+				this.bubble();
+				break;
+			case 'font':
+				if (attrs.color) {
+					styleObj['color'] = attrs.color;
+					attrs.color = void 0;
+				}
+				if (attrs.face) {
+					styleObj['font-family'] = attrs.face;
+					attrs.face = void 0;
+				}
+				if (attrs.size) {
+					var size = parseInt(attrs.size);
+					if (size < 1) size = 1;
+					else if (size > 7) size = 7;
+					var map = ['xx-small', 'x-small', 'small', 'medium', 'large', 'x-large', 'xx-large'];
+					styleObj['font-size'] = map[size - 1];
+					attrs.size = void 0;
+				}
+				break;
+			case 'embed':
+				// #ifndef APP-PLUS
+				var src = node.attrs.src || '',
+					type = node.attrs.type || '';
+				if (type.includes('video') || src.includes('.mp4') || src.includes('.3gp') || src.includes('.m3u8'))
+					node.name = 'video';
+				else if (type.includes('audio') || src.includes('.m4a') || src.includes('.wav') || src.includes('.mp3') || src.includes(
+						'.aac'))
+					node.name = 'audio';
+				else break;
+				if (node.attrs.autostart)
+					node.attrs.autoplay = 'T';
+				node.attrs.controls = 'T';
+				// #endif
+				// #ifdef APP-PLUS
+				this.bubble();
+				break;
+				// #endif
+			case 'video':
+			case 'audio':
+				if (!attrs.id) attrs.id = node.name + (++this[`${node.name}Num`]);
+				else this[`${node.name}Num`]++;
+				if (node.name == 'video') {
+					if (this.videoNum > 3)
+						node.lazyLoad = 1;
+					if (attrs.width) {
+						styleObj.width = parseFloat(attrs.width) + (attrs.width.includes('%') ? '%' : 'px');
+						attrs.width = void 0;
+					}
+					if (attrs.height) {
+						styleObj.height = parseFloat(attrs.height) + (attrs.height.includes('%') ? '%' : 'px');
+						attrs.height = void 0;
+					}
+				}
+				if (!attrs.controls && !attrs.autoplay) attrs.controls = 'T';
+				attrs.source = [];
+				if (attrs.src) {
+					attrs.source.push(attrs.src);
+					attrs.src = void 0;
+				}
+				this.bubble();
+				break;
+			case 'td':
+			case 'th':
+				if (attrs.colspan || attrs.rowspan)
+					for (var k = this.STACK.length, item; item = this.STACK[--k];)
+						if (item.name == 'table') {
+							item.c = void 0;
+							break;
+						}
+		}
+		if (attrs.align) {
+			styleObj['text-align'] = attrs.align;
+			attrs.align = void 0;
+		}
+		// 压缩 style
+		var styles = style.split(';');
+		style = '';
+		for (var i = 0, len = styles.length; i < len; i++) {
+			var info = styles[i].split(':');
+			if (info.length < 2) continue;
+			let key = info[0].trim().toLowerCase(),
+				value = info.slice(1).join(':').trim();
+			if (value[0] == '-' || value.includes('safe'))
+				style += `;${key}:${value}`;
+			else if (!styleObj[key] || value.includes('import') || !styleObj[key].includes('import'))
+				styleObj[key] = value;
+		}
+		if (node.name == 'img') {
+			if (attrs.src && !attrs.ignore) {
+				if (this.bubble())
+					attrs.i = (this.imgNum++).toString();
+				else attrs.ignore = 'T';
+			}
+			if (attrs.ignore) {
+				style += ';-webkit-touch-callout:none';
+				styleObj['max-width'] = '100%';
+			}
+			var width;
+			if (styleObj.width) width = styleObj.width;
+			else if (attrs.width) width = attrs.width.includes('%') ? attrs.width : attrs.width + 'px';
+			if (width) {
+				styleObj.width = width;
+				attrs.width = '100%';
+				if (parseInt(width) > windowWidth) {
+					styleObj.height = '';
+					if (attrs.height) attrs.height = void 0;
+				}
+			}
+			if (styleObj.height) {
+				attrs.height = styleObj.height;
+				styleObj.height = '';
+			} else if (attrs.height && !attrs.height.includes('%'))
+				attrs.height += 'px';
+		}
+		for (var key in styleObj) {
+			var value = styleObj[key];
+			if (!value) continue;
+			if (key.includes('flex') || key == 'order' || key == 'self-align') node.c = 1;
+			// 填充链接
+			if (value.includes('url')) {
+				var j = value.indexOf('(');
+				if (j++ != -1) {
+					while (value[j] == '"' || value[j] == "'" || blankChar[value[j]]) j++;
+					value = value.substr(0, j) + this.getUrl(value.substr(j));
+				}
+			}
+			// 转换 rpx
+			else if (value.includes('rpx'))
+				value = value.replace(/[0-9.]+\s*rpx/g, $ => parseFloat($) * windowWidth / 750 + 'px');
+			else if (key == 'white-space' && value.includes('pre') && !close)
+				this.pre = node.pre = true;
+			style += `;${key}:${value}`;
+		}
+		style = style.substr(1);
+		if (style) attrs.style = style;
+		if (!close) {
+			node.children = [];
+			if (node.name == 'pre' && cfg.highlight) {
+				this.remove(node);
+				this.pre = node.pre = true;
+			}
+			this.siblings().push(node);
+			this.STACK.push(node);
+		} else if (!cfg.filter || cfg.filter(node, this) != false)
+			this.siblings().push(node);
+	} else {
+		if (!close) this.remove(node);
+		else if (node.name == 'source') {
+			var parent = this.parent();
+			if (parent && (parent.name == 'video' || parent.name == 'audio') && node.attrs.src)
+				parent.attrs.source.push(node.attrs.src);
+		} else if (node.name == 'base' && !this.domain) this.domain = node.attrs.href;
+	}
+	if (this.data[this.i] == '/') this.i++;
+	this.start = this.i + 1;
+	this.state = this.Text;
+}
+// 移除标签
+MpHtmlParser.prototype.remove = function(node) {
+	var name = node.name,
+		j = this.i;
+	// 处理 svg
+	var handleSvg = () => {
+		var src = this.data.substring(j, this.i + 1);
+		if (!node.attrs.xmlns) src = ' xmlns="http://www.w3.org/2000/svg"' + src;
+		var i = j;
+		while (this.data[j] != '<') j--;
+		src = this.data.substring(j, i).replace("viewbox", "viewBox") + src;
+		var parent = this.parent();
+		if (node.attrs.width == '100%' && parent && (parent.attrs.style || '').includes('inline'))
+			parent.attrs.style = 'width:300px;max-width:100%;' + parent.attrs.style;
+		this.siblings().push({
+			name: 'img',
+			attrs: {
+				src: 'data:image/svg+xml;utf8,' + src.replace(/#/g, '%23'),
+				style: (/vertical[^;]+/.exec(node.attrs.style) || []).shift(),
+				ignore: 'T'
+			}
+		})
+	}
+	if (node.name == 'svg' && this.data[j] == '/') return handleSvg(this.i++);
+	while (1) {
+		if ((this.i = this.data.indexOf('</', this.i + 1)) == -1) {
+			if (name == 'pre' || name == 'svg') this.i = j;
+			else this.i = this.data.length;
+			return;
+		}
+		this.start = (this.i += 2);
+		while (!blankChar[this.data[this.i]] && !this.isClose()) this.i++;
+		if (this.section().toLowerCase() == name) {
+			// 代码块高亮
+			if (name == 'pre') {
+				this.data = this.data.substr(0, j + 1) + cfg.highlight(this.data.substring(j + 1, this.i - 5), node.attrs) + this.data
+					.substr(this.i - 5);
+				return this.i = j;
+			} else if (name == 'style')
+				this.CssHandler.getStyle(this.data.substring(j + 1, this.i - 7));
+			else if (name == 'title')
+				this.DOM.title = this.data.substring(j + 1, this.i - 7);
+			if ((this.i = this.data.indexOf('>', this.i)) == -1) this.i = this.data.length;
+			if (name == 'svg') handleSvg();
+			return;
+		}
+	}
+}
+// 节点出栈处理
+MpHtmlParser.prototype.popNode = function(node) {
+	// 空白符处理
+	if (node.pre) {
+		node.pre = this.pre = void 0;
+		for (let i = this.STACK.length; i--;)
+			if (this.STACK[i].pre)
+				this.pre = true;
+	}
+	var siblings = this.siblings(),
+		len = siblings.length,
+		childs = node.children;
+	if (node.name == 'head' || (cfg.filter && cfg.filter(node, this) == false))
+		return siblings.pop();
+	var attrs = node.attrs;
+	// 替换一些标签名
+	if (cfg.blockTags[node.name]) node.name = 'div';
+	else if (!cfg.trustTags[node.name]) node.name = 'span';
+	// 处理列表
+	if (node.c && (node.name == 'ul' || node.name == 'ol')) {
+		if ((node.attrs.style || '').includes('list-style:none')) {
+			for (let i = 0, child; child = childs[i++];)
+				if (child.name == 'li')
+					child.name = 'div';
+		} else if (node.name == 'ul') {
+			var floor = 1;
+			for (let i = this.STACK.length; i--;)
+				if (this.STACK[i].name == 'ul') floor++;
+			if (floor != 1)
+				for (let i = childs.length; i--;)
+					childs[i].floor = floor;
+		} else {
+			for (let i = 0, num = 1, child; child = childs[i++];)
+				if (child.name == 'li') {
+					child.type = 'ol';
+					child.num = ((num, type) => {
+						if (type == 'a') return String.fromCharCode(97 + (num - 1) % 26);
+						if (type == 'A') return String.fromCharCode(65 + (num - 1) % 26);
+						if (type == 'i' || type == 'I') {
+							num = (num - 1) % 99 + 1;
+							var one = ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX'],
+								ten = ['X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC'],
+								res = (ten[Math.floor(num / 10) - 1] || '') + (one[num % 10 - 1] || '');
+							if (type == 'i') return res.toLowerCase();
+							return res;
+						}
+						return num;
+					})(num++, attrs.type) + '.';
+				}
+		}
+	}
+	// 处理表格的边框
+	if (node.name == 'table') {
+		var padding = attrs.cellpadding,
+			spacing = attrs.cellspacing,
+			border = attrs.border;
+		if (node.c) {
+			this.bubble();
+			attrs.style = (attrs.style || '') + ';display:table';
+			if (!padding) padding = 2;
+			if (!spacing) spacing = 2;
+		}
+		if (border) attrs.style = `border:${border}px solid gray;${attrs.style || ''}`;
+		if (spacing) attrs.style = `border-spacing:${spacing}px;${attrs.style || ''}`;
+		if (border || padding || node.c)
+			(function f(ns) {
+				for (var i = 0, n; n = ns[i]; i++) {
+					if (n.type == 'text') continue;
+					var style = n.attrs.style || '';
+					if (node.c && n.name[0] == 't') {
+						n.c = 1;
+						style += ';display:table-' + (n.name == 'th' || n.name == 'td' ? 'cell' : (n.name == 'tr' ? 'row' : 'row-group'));
+					}
+					if (n.name == 'th' || n.name == 'td') {
+						if (border) style = `border:${border}px solid gray;${style}`;
+						if (padding) style = `padding:${padding}px;${style}`;
+					} else f(n.children || []);
+					if (style) n.attrs.style = style;
+				}
+			})(childs)
+		if (this.options.autoscroll) {
+			var table = Object.assign({}, node);
+			node.name = 'div';
+			node.attrs = {
+				style: 'overflow:scroll'
+			}
+			node.children = [table];
+		}
+	}
+	this.CssHandler.pop && this.CssHandler.pop(node);
+	// 自动压缩
+	if (node.name == 'div' && !Object.keys(attrs).length && childs.length == 1 && childs[0].name == 'div')
+		siblings[len - 1] = childs[0];
+}
+// 状态机
+MpHtmlParser.prototype.Text = function(c) {
+	if (c == '<') {
+		var next = this.data[this.i + 1],
+			isLetter = c => (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z');
+		if (isLetter(next)) {
+			this.setText();
+			this.start = this.i + 1;
+			this.state = this.TagName;
+		} else if (next == '/') {
+			this.setText();
+			if (isLetter(this.data[++this.i + 1])) {
+				this.start = this.i + 1;
+				this.state = this.EndTag;
+			} else this.Comment();
+		} else if (next == '!' || next == '?') {
+			this.setText();
+			this.Comment();
+		}
+	}
+}
+MpHtmlParser.prototype.Comment = function() {
+	var key;
+	if (this.data.substring(this.i + 2, this.i + 4) == '--') key = '-->';
+	else if (this.data.substring(this.i + 2, this.i + 9) == '[CDATA[') key = ']]>';
+	else key = '>';
+	if ((this.i = this.data.indexOf(key, this.i + 2)) == -1) this.i = this.data.length;
+	else this.i += key.length - 1;
+	this.start = this.i + 1;
+	this.state = this.Text;
+}
+MpHtmlParser.prototype.TagName = function(c) {
+	if (blankChar[c]) {
+		this.tagName = this.section();
+		while (blankChar[this.data[this.i]]) this.i++;
+		if (this.isClose()) this.setNode();
+		else {
+			this.start = this.i;
+			this.state = this.AttrName;
+		}
+	} else if (this.isClose()) {
+		this.tagName = this.section();
+		this.setNode();
+	}
+}
+MpHtmlParser.prototype.AttrName = function(c) {
+	if (c == '=' || blankChar[c] || this.isClose()) {
+		this.attrName = this.section();
+		if (blankChar[c])
+			while (blankChar[this.data[++this.i]]);
+		if (this.data[this.i] == '=') {
+			while (blankChar[this.data[++this.i]]);
+			this.start = this.i--;
+			this.state = this.AttrValue;
+		} else this.setAttr();
+	}
+}
+MpHtmlParser.prototype.AttrValue = function(c) {
+	if (c == '"' || c == "'") {
+		this.start++;
+		if ((this.i = this.data.indexOf(c, this.i + 1)) == -1) return this.i = this.data.length;
+		this.attrVal = this.section();
+		this.i++;
+	} else {
+		for (; !blankChar[this.data[this.i]] && !this.isClose(); this.i++);
+		this.attrVal = this.section();
+	}
+	this.setAttr();
+}
+MpHtmlParser.prototype.EndTag = function(c) {
+	if (blankChar[c] || c == '>' || c == '/') {
+		var name = this.section().toLowerCase();
+		for (var i = this.STACK.length; i--;)
+			if (this.STACK[i].name == name) break;
+		if (i != -1) {
+			var node;
+			while ((node = this.STACK.pop()).name != name) this.popNode(node);
+			this.popNode(node);
+		} else if (name == 'p' || name == 'br')
+			this.siblings().push({
+				name,
+				attrs: {}
+			});
+		this.i = this.data.indexOf('>', this.i);
+		this.start = this.i + 1;
+		if (this.i == -1) this.i = this.data.length;
+		else this.state = this.Text;
+	}
+}
+module.exports = MpHtmlParser;

+ 80 - 0
components/jyf-parser/libs/config.js

@@ -0,0 +1,80 @@
+/* 配置文件 */
+var cfg = {
+	// 出错占位图
+	errorImg: null,
+	// 过滤器函数
+	filter: null,
+	// 代码高亮函数
+	highlight: null,
+	// 文本处理函数
+	onText: null,
+	// 实体编码列表
+	entities: {
+		quot: '"',
+		apos: "'",
+		semi: ';',
+		nbsp: '\xA0',
+		ensp: '\u2002',
+		emsp: '\u2003',
+		ndash: '–',
+		mdash: '—',
+		middot: '·',
+		lsquo: '‘',
+		rsquo: '’',
+		ldquo: '“',
+		rdquo: '”',
+		bull: '•',
+		hellip: '…'
+	},
+	blankChar: makeMap(' ,\xA0,\t,\r,\n,\f'),
+	boolAttrs: makeMap('allowfullscreen,autoplay,autostart,controls,ignore,loop,muted'),
+	// 块级标签,将被转为 div
+	blockTags: makeMap('address,article,aside,body,caption,center,cite,footer,header,html,nav,pre,section'),
+	// 将被移除的标签
+	ignoreTags: makeMap('area,base,canvas,frame,iframe,input,link,map,meta,param,script,source,style,svg,textarea,title,track,wbr'),
+	// 只能被 rich-text 显示的标签
+	richOnlyTags: makeMap('a,colgroup,fieldset,legend,table'),
+	// 自闭合的标签
+	selfClosingTags: makeMap('area,base,br,col,circle,ellipse,embed,frame,hr,img,input,line,link,meta,param,path,polygon,rect,source,track,use,wbr'),
+	// 信任的标签
+	trustTags: makeMap('a,abbr,ad,audio,b,blockquote,br,code,col,colgroup,dd,del,dl,dt,div,em,fieldset,h1,h2,h3,h4,h5,h6,hr,i,img,ins,label,legend,li,ol,p,q,source,span,strong,sub,sup,table,tbody,td,tfoot,th,thead,tr,title,ul,video'),
+	// 默认的标签样式
+	userAgentStyles: {
+		address: 'font-style:italic',
+		big: 'display:inline;font-size:1.2em',
+		blockquote: 'background-color:#f6f6f6;border-left:3px solid #dbdbdb;color:#6c6c6c;padding:5px 0 5px 10px',
+		caption: 'display:table-caption;text-align:center',
+		center: 'text-align:center',
+		cite: 'font-style:italic',
+		dd: 'margin-left:40px',
+		mark: 'background-color:yellow',
+		pre: 'font-family:monospace;white-space:pre;overflow:scroll',
+		s: 'text-decoration:line-through',
+		small: 'display:inline;font-size:0.8em',
+		u: 'text-decoration:underline'
+	}
+}
+
+function makeMap(str) {
+	var map = Object.create(null),
+		list = str.split(',');
+	for (var i = list.length; i--;)
+		map[list[i]] = true;
+	return map;
+}
+
+// #ifdef MP-WEIXIN
+if (wx.canIUse('editor')) {
+	cfg.blockTags.pre = void 0;
+	cfg.ignoreTags.rp = true;
+	Object.assign(cfg.richOnlyTags, makeMap('bdi,bdo,caption,rt,ruby'));
+	Object.assign(cfg.trustTags, makeMap('bdi,bdo,caption,pre,rt,ruby'));
+}
+// #endif
+
+// #ifdef APP-PLUS
+cfg.ignoreTags.iframe = void 0;
+Object.assign(cfg.trustTags, makeMap('embed,iframe'));
+// #endif
+
+module.exports = cfg;

+ 0 - 0
uview-ui/components/u-parse/libs/handler.wxs → components/jyf-parser/libs/handler.wxs


+ 501 - 0
components/jyf-parser/libs/trees.vue

@@ -0,0 +1,501 @@
+<template>
+	<view :class="'interlayer '+(c||'')" :style="s">
+		<block v-for="(n, i) in nodes" v-bind:key="i">
+			<!--图片-->
+			<view v-if="n.name=='img'" :class="'_img '+n.attrs.class" :style="n.attrs.style" :data-attrs="n.attrs" @tap="imgtap">
+				<rich-text v-if="ctrl[i]!=0" :nodes="[{attrs:{src:loading&&(ctrl[i]||0)<2?loading:(lazyLoad&&!ctrl[i]?placeholder:(ctrl[i]==3?errorImg:n.attrs.src||'')),alt:n.attrs.alt||'',width:n.attrs.width||'',style:'-webkit-touch-callout:none;max-width:100%;display:block'+(n.attrs.height?';height:'+n.attrs.height:'')},name:'img'}]" />
+				<image class="_image" :src="lazyLoad&&!ctrl[i]?placeholder:n.attrs.src" :lazy-load="lazyLoad"
+				 :show-menu-by-longpress="!n.attrs.ignore" :data-i="i" :data-index="n.attrs.i" data-source="img" @load="loadImg"
+				 @error="error" />
+			</view>
+			<!--文本-->
+			<text v-else-if="n.type=='text'" decode>{{n.text}}</text>
+			<!--#ifndef MP-BAIDU-->
+			<text v-else-if="n.name=='br'">\n</text>
+			<!--#endif-->
+			<!--视频-->
+			<view v-else-if="((n.lazyLoad&&!n.attrs.autoplay)||(n.name=='video'&&!loadVideo))&&ctrl[i]==undefined" :id="n.attrs.id" :class="'_video '+(n.attrs.class||'')"
+			 :style="n.attrs.style" :data-i="i" @tap="_loadVideo" />
+			<video v-else-if="n.name=='video'" :id="n.attrs.id" :class="n.attrs.class" :style="n.attrs.style" :autoplay="n.attrs.autoplay||ctrl[i]==0"
+			 :controls="n.attrs.controls" :loop="n.attrs.loop" :muted="n.attrs.muted" :poster="n.attrs.poster" :src="n.attrs.source[ctrl[i]||0]"
+			 :unit-id="n.attrs['unit-id']" :data-id="n.attrs.id" :data-i="i" data-source="video" @error="error" @play="play" />
+			<!--音频-->
+			<audio v-else-if="n.name=='audio'" :ref="n.attrs.id" :class="n.attrs.class" :style="n.attrs.style" :author="n.attrs.author"
+			 :autoplay="n.attrs.autoplay" :controls="n.attrs.controls" :loop="n.attrs.loop" :name="n.attrs.name" :poster="n.attrs.poster"
+			 :src="n.attrs.source[ctrl[i]||0]" :data-i="i" :data-id="n.attrs.id" data-source="audio"
+			 @error.native="error" @play.native="play" />
+			<!--链接-->
+			<view v-else-if="n.name=='a'" :id="n.attrs.id" :class="'_a '+(n.attrs.class||'')" hover-class="_hover" :style="n.attrs.style"
+			 :data-attrs="n.attrs" @tap="linkpress">
+				<trees class="_span" c="_span" :nodes="n.children" />
+			</view>
+			<!--广告-->
+			<!--<ad v-else-if="n.name=='ad'" :class="n.attrs.class" :style="n.attrs.style" :unit-id="n.attrs['unit-id']" :appid="n.attrs.appid" :apid="n.attrs.apid" :type="n.attrs.type" :adpid="n.attrs.adpid" data-source="ad" @error="error" />-->
+			<!--列表-->
+			<view v-else-if="n.name=='li'" :id="n.attrs.id" :class="n.attrs.class" :style="(n.attrs.style||'')+';display:flex;flex-direction:row'">
+				<view v-if="n.type=='ol'" class="_ol-bef">{{n.num}}</view>
+				<view v-else class="_ul-bef">
+					<view v-if="n.floor%3==0" class="_ul-p1">█</view>
+					<view v-else-if="n.floor%3==2" class="_ul-p2" />
+					<view v-else class="_ul-p1" style="border-radius:50%">█</view>
+				</view>
+				<trees class="_li" c="_li" :nodes="n.children" :lazyLoad="lazyLoad" :loading="loading" />
+			</view>
+			<!--表格-->
+			<view v-else-if="n.name=='table'&&n.c" :id="n.attrs.id" :class="n.attrs.class" :style="(n.attrs.style||'')+';display:table'">
+				<view v-for="(tbody, o) in n.children" v-bind:key="o" :class="tbody.attrs.class" :style="(tbody.attrs.style||'')+(tbody.name[0]=='t'?';display:table-'+(tbody.name=='tr'?'row':'row-group'):'')">
+					<view v-for="(tr, p) in tbody.children" v-bind:key="p" :class="tr.attrs.class" :style="(tr.attrs.style||'')+(tr.name[0]=='t'?';display:table-'+(tr.name=='tr'?'row':'cell'):'')">
+						<trees v-if="tr.name=='td'" :nodes="tr.children" />
+						<trees v-else v-for="(td, q) in tr.children" v-bind:key="q" :class="td.attrs.class" :c="td.attrs.class" :style="(td.attrs.style||'')+(td.name[0]=='t'?';display:table-'+(td.name=='tr'?'row':'cell'):'')"
+						 :s="(td.attrs.style||'')+(td.name[0]=='t'?';display:table-'+(td.name=='tr'?'row':'cell'):'')" :nodes="td.children" />
+					</view>
+				</view>
+			</view>
+			<!--#ifdef APP-PLUS-->
+			<iframe v-else-if="n.name=='iframe'" :style="n.attrs.style" :allowfullscreen="n.attrs.allowfullscreen" :frameborder="n.attrs.frameborder"
+			 :width="n.attrs.width" :height="n.attrs.height" :src="n.attrs.src" />
+			<embed v-else-if="n.name=='embed'" :style="n.attrs.style" :width="n.attrs.width" :height="n.attrs.height" :src="n.attrs.src" />
+			<!--#endif-->
+			<!--富文本-->
+			<!--#ifdef MP-WEIXIN || MP-QQ || APP-PLUS-->
+			<rich-text v-else-if="handler.use(n)" :id="n.attrs.id" :class="'_p __'+n.name" :nodes="[n]" />
+			<!--#endif-->
+			<!--#ifndef MP-WEIXIN || MP-QQ || APP-PLUS-->
+			<rich-text v-else-if="!n.c" :id="n.attrs.id" :nodes="[n]" style="display:inline" />
+			<!--#endif-->
+			<trees v-else :class="(n.attrs.id||'')+' _'+n.name+' '+(n.attrs.class||'')" :c="(n.attrs.id||'')+' _'+n.name+' '+(n.attrs.class||'')"
+			 :style="n.attrs.style" :s="n.attrs.style" :nodes="n.children" :lazyLoad="lazyLoad" :loading="loading" />
+		</block>
+	</view>
+</template>
+<script module="handler" lang="wxs" src="./handler.wxs"></script>
+<script>
+	global.Parser = {};
+	import trees from './trees'
+	const errorImg = require('../libs/config.js').errorImg;
+	export default {
+		components: {
+			trees
+		},
+		name: 'trees',
+		data() {
+			return {
+				ctrl: [],
+				placeholder: 'data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="300" height="225"/>',
+				errorImg,
+				loadVideo: typeof plus == 'undefined',
+				// #ifndef MP-ALIPAY
+				c: '',
+				s: ''
+				// #endif
+			}
+		},
+		props: {
+			nodes: Array,
+			lazyLoad: Boolean,
+			loading: String,
+			// #ifdef MP-ALIPAY
+			c: String,
+			s: String
+			// #endif
+		},
+		mounted() {
+			for (this.top = this.$parent; this.top.$options.name != 'parser'; this.top = this.top.$parent);
+			this.init();
+		},
+		// #ifdef APP-PLUS
+		beforeDestroy() {
+			this.observer && this.observer.disconnect();
+		},
+		// #endif
+		methods: {
+			init() {
+				for (var i = this.nodes.length, n; n = this.nodes[--i];) {
+					if (n.name == 'img') {
+						this.top.imgList.setItem(n.attrs.i, n.attrs.src);
+						// #ifdef APP-PLUS
+						if (this.lazyLoad && !this.observer) {
+							this.observer = uni.createIntersectionObserver(this).relativeToViewport({
+								top: 500,
+								bottom: 500
+							});
+							setTimeout(() => {
+								this.observer.observe('._img', res => {
+									if (res.intersectionRatio) {
+										for (var j = this.nodes.length; j--;)
+											if (this.nodes[j].name == 'img')
+												this.$set(this.ctrl, j, 1);
+										this.observer.disconnect();
+									}
+								})
+							}, 0)
+						}
+						// #endif
+					} else if (n.name == 'video' || n.name == 'audio') {
+						var ctx;
+						if (n.name == 'video') {
+							ctx = uni.createVideoContext(n.attrs.id
+								// #ifndef MP-BAIDU
+								, this
+								// #endif
+							);
+						} else if (this.$refs[n.attrs.id])
+							ctx = this.$refs[n.attrs.id][0];
+						if (ctx) {
+							ctx.id = n.attrs.id;
+							this.top.videoContexts.push(ctx);
+						}
+					}
+				}
+				// #ifdef APP-PLUS
+				// APP 上避免 video 错位需要延时渲染
+				setTimeout(() => {
+					this.loadVideo = true;
+				}, 1000)
+				// #endif
+			},
+			play(e) {
+				var contexts = this.top.videoContexts;
+				if (contexts.length > 1 && this.top.autopause)
+					for (var i = contexts.length; i--;)
+						if (contexts[i].id != e.currentTarget.dataset.id)
+							contexts[i].pause();
+			},
+			imgtap(e) {
+				var attrs = e.currentTarget.dataset.attrs;
+				if (!attrs.ignore) {
+					var preview = true,
+						data = {
+							id: e.target.id,
+							src: attrs.src,
+							ignore: () => preview = false
+						};
+					global.Parser.onImgtap && global.Parser.onImgtap(data);
+					this.top.$emit('imgtap', data);
+					if (preview) {
+						var urls = this.top.imgList,
+							current = urls[attrs.i] ? parseInt(attrs.i) : (urls = [attrs.src], 0);
+						uni.previewImage({
+							current,
+							urls
+						})
+					}
+				}
+			},
+			loadImg(e) {
+				var i = e.currentTarget.dataset.i;
+				if (this.lazyLoad && !this.ctrl[i]) {
+					// #ifdef QUICKAPP-WEBVIEW
+					this.$set(this.ctrl, i, 0);
+					this.$nextTick(function() {
+						// #endif
+						// #ifndef APP-PLUS
+						this.$set(this.ctrl, i, 1);
+						// #endif
+						// #ifdef QUICKAPP-WEBVIEW
+					})
+					// #endif
+				} else if (this.loading && this.ctrl[i] != 2) {
+					// #ifdef QUICKAPP-WEBVIEW
+					this.$set(this.ctrl, i, 0);
+					this.$nextTick(function() {
+						// #endif
+						this.$set(this.ctrl, i, 2);
+						// #ifdef QUICKAPP-WEBVIEW
+					})
+					// #endif
+				}
+			},
+			linkpress(e) {
+				var jump = true,
+					attrs = e.currentTarget.dataset.attrs;
+				attrs.ignore = () => jump = false;
+				global.Parser.onLinkpress && global.Parser.onLinkpress(attrs);
+				this.top.$emit('linkpress', attrs);
+				if (jump) {
+					// #ifdef MP
+					if (attrs['app-id']) {
+						return uni.navigateToMiniProgram({
+							appId: attrs['app-id'],
+							path: attrs.path
+						})
+					}
+					// #endif
+					if (attrs.href) {
+						if (attrs.href[0] == '#') {
+							if (this.top.useAnchor)
+								this.top.navigateTo({
+									id: attrs.href.substring(1)
+								})
+						} else if (attrs.href.indexOf('http') == 0 || attrs.href.indexOf('//') == 0) {
+							// #ifdef APP-PLUS
+							plus.runtime.openWeb(attrs.href);
+							// #endif
+							// #ifndef APP-PLUS
+							uni.setClipboardData({
+								data: attrs.href,
+								success: () =>
+									uni.showToast({
+										title: '链接已复制'
+									})
+							})
+							// #endif
+						} else
+							uni.navigateTo({
+								url: attrs.href,
+								fail() {
+									uni.switchTab({
+										url: attrs.href,
+									})
+								}
+							})
+					}
+				}
+			},
+			error(e) {
+				var target = e.currentTarget,
+					source = target.dataset.source,
+					i = target.dataset.i;
+				if (source == 'video' || source == 'audio') {
+					// 加载其他 source
+					var index = this.ctrl[i] ? this.ctrl[i].i + 1 : 1;
+					if (index < this.nodes[i].attrs.source.length)
+						this.$set(this.ctrl, i, index);
+					if (e.detail.__args__)
+						e.detail = e.detail.__args__[0];
+				} else if (errorImg && source == 'img') {
+					this.top.imgList.setItem(target.dataset.index, errorImg);
+					this.$set(this.ctrl, i, 3);
+				}
+				this.top && this.top.$emit('error', {
+					source,
+					target,
+					errMsg: e.detail.errMsg
+				});
+			},
+			_loadVideo(e) {
+				this.$set(this.ctrl, e.target.dataset.i, 0);
+			}
+		}
+	}
+</script>
+
+<style>
+	/* 在这里引入自定义样式 */
+
+	/* 链接和图片效果 */
+	._a {
+		display: inline;
+		padding: 1.5px 0 1.5px 0;
+		color: #366092;
+		word-break: break-all;
+	}
+
+	._hover {
+		text-decoration: underline;
+		opacity: 0.7;
+	}
+
+	._img {
+		display: inline-block;
+		max-width: 100%;
+		overflow: hidden;
+	}
+
+	/* #ifdef MP-WEIXIN */
+	:host {
+		display: inline;
+	}
+
+	/* #endif */
+
+	/* #ifndef MP-ALIPAY || APP-PLUS */
+	.interlayer {
+		display: inherit;
+		flex-direction: inherit;
+		flex-wrap: inherit;
+		align-content: inherit;
+		align-items: inherit;
+		justify-content: inherit;
+		width: 100%;
+		white-space: inherit;
+	}
+
+	/* #endif */
+
+	._b,
+	._strong {
+		font-weight: bold;
+	}
+
+	/* #ifndef MP-ALIPAY */
+	._blockquote,
+	._div,
+	._p,
+	._ol,
+	._ul,
+	._li {
+		display: block;
+	}
+	
+	/* #endif */
+
+	._code {
+		font-family: monospace;
+	}
+
+	._del {
+		text-decoration: line-through;
+	}
+
+	._em,
+	._i {
+		font-style: italic;
+	}
+
+	._h1 {
+		font-size: 2em;
+	}
+
+	._h2 {
+		font-size: 1.5em;
+	}
+
+	._h3 {
+		font-size: 1.17em;
+	}
+
+	._h5 {
+		font-size: 0.83em;
+	}
+
+	._h6 {
+		font-size: 0.67em;
+	}
+
+	._h1,
+	._h2,
+	._h3,
+	._h4,
+	._h5,
+	._h6 {
+		display: block;
+		font-weight: bold;
+	}
+
+	._image {
+		display: block;
+		width: 100%;
+		height: 360px;
+		margin-top: -360px;
+		opacity: 0;
+	}
+
+	._ins {
+		text-decoration: underline;
+	}
+
+	._li {
+		flex: 1;
+		width: 0;
+	}
+
+	._ol-bef {
+		width: 36px;
+		margin-right: 5px;
+		text-align: right;
+	}
+
+	._ul-bef {
+		display: block;
+		margin: 0 12px 0 23px;
+		line-height: normal;
+	}
+
+	._ol-bef,
+	._ul-bef {
+		flex: none;
+		user-select: none;
+	}
+
+	._ul-p1 {
+		display: inline-block;
+		width: 0.3em;
+		height: 0.3em;
+		overflow: hidden;
+		line-height: 0.3em;
+	}
+
+	._ul-p2 {
+		display: inline-block;
+		width: 0.23em;
+		height: 0.23em;
+		border: 0.05em solid black;
+		border-radius: 50%;
+	}
+
+	._q::before {
+		content: '"';
+	}
+
+	._q::after {
+		content: '"';
+	}
+
+	._sub {
+		font-size: smaller;
+		vertical-align: sub;
+	}
+
+	._sup {
+		font-size: smaller;
+		vertical-align: super;
+	}
+
+	/* #ifdef MP-ALIPAY || APP-PLUS || QUICKAPP-WEBVIEW */
+	._abbr,
+	._b,
+	._code,
+	._del,
+	._em,
+	._i,
+	._ins,
+	._label,
+	._q,
+	._span,
+	._strong,
+	._sub,
+	._sup {
+		display: inline;
+	}
+
+	/* #endif */
+
+	/* #ifdef MP-WEIXIN || MP-QQ */
+	.__bdo,
+	.__bdi,
+	.__ruby,
+	.__rt {
+		display: inline-block;
+	}
+
+	/* #endif */
+	._video {
+		position: relative;
+		display: inline-block;
+		width: 300px;
+		height: 225px;
+		background-color: black;
+	}
+
+	._video::after {
+		position: absolute;
+		top: 50%;
+		left: 50%;
+		margin: -15px 0 0 -15px;
+		content: '';
+		border-color: transparent transparent transparent white;
+		border-style: solid;
+		border-width: 15px 0 15px 30px;
+	}
+</style>

+ 0 - 133
components/mix-list-cell.vue

@@ -1,133 +0,0 @@
-<template>
-	<view class="content">
-		
-		<view class="mix-list-cell" :class="border" @click="eventClick" hover-class="cell-hover"  :hover-stay-time="50">
-			<image
-				v-if="icon"
-				class="cell-icon"
-				:style="[{
-					color: iconColor,
-				}]"
-				:src='icon'
-				mode='aspectFit'
-			></image>
-			<text class="cell-tit clamp">{{title}}</text>
-			<text v-if="tips" class="cell-tip">{{tips}}</text>
-			<text class="cell-more yticon"
-				:class="typeList[navigateType]"
-			></text>
-		</view>
-
-	</view>
-</template>
- 
-<script>
-	/**
-	 *  简单封装了下, 应用范围比较狭窄,可以在此基础上进行扩展使用
-	 *  比如加入image, iconSize可控等
-	 */
-	export default {
-		data() {
-			return {
-				typeList: {
-					left: 'icon-zuo',
-					right: 'icon-you',
-					up: 'icon-shang',
-					down: 'icon-xia'
-				},
-			}
-		},
-		props: {
-			// 图标
-			icon: {
-				type: String,
-				default: ''
-			},
-			// 标题
-			title: {
-				type: String,
-				default: '标题'
-			},
-			// 右侧角标内容
-			tips: {
-				type: String,
-				default: ''
-			},
-			// 是否显示右侧角标
-			showType:{
-				type: Boolean,
-				default: true
-			},
-			// 右侧角标类型
-			navigateType: {
-				type: String,
-				default: 'right'
-			},
-			// 边框
-			border: {
-				type: String,
-				default: 'border-bottom-light'
-			},
-			// 点击时背景颜色
-			hoverClass: {
-				type: String,
-				default: 'cell-hover'
-			},
-			// 图标颜色
-			iconColor: {
-				type: String,
-				default: '#333'
-			}
-		},
-		methods: {
-			eventClick(){
-				this.$emit('eventClick');
-			}
-		},
-	}
-</script>
-
-<style lang='scss'>
-
-	.icon .mix-list-cell.b-b:after{
-		left: 30rpx;
-	}
-	.mix-list-cell{
-		display:flex;
-		align-items:baseline;
-		padding: 20rpx $page-row-spacing;
-		line-height:60rpx;
-		position:relative;
-		
-		&.cell-hover{
-			background:#fafafa;
-		}
-		&.b-b:after{
-			left: 30rpx;
-		}
-
-		.cell-icon{
-			align-self:center;
-			width:58rpx;
-			max-height:36rpx;
-			font-size:38rpx;
-			padding-right: 20rpx;
-		}
-		.cell-more{
-			align-self: center;
-			font-size:30rpx;
-			color:$font-color-base;
-			margin-left:$uni-spacing-row-sm;
-		}
-		.cell-tit{
-			flex: 1;
-			font-size: $font-base;
-			color: $font-color-dark;
-			margin-right:10rpx;
-		}
-		.cell-tip{
-			font-size: $font-sm+2rpx;
-			color: $font-color-light;
-		}
-	}
-</style>

Різницю між файлами не показано, бо вона завелика
+ 0 - 6
components/mix-loading/mix-loading.vue


+ 421 - 0
components/newlist/nowList.vue

@@ -0,0 +1,421 @@
+<template>
+	<view class="other">
+		<view class="other-1">大家还在拼</view>
+		
+		<view class="preferred_item" v-for="item in recommendedlist" @click.stop="ToKaiTuan(item)">
+			<view class="flex_item" style="overflow: hidden;">
+				<view class="tlist-img">
+					<view class="leftImgIcon">AA团</view>
+					<!-- <view class="leftImgIcon" v-if="sid == 129">达人团</view> -->
+					<view class="img"><image :src="item.image" mode="scaleToFill"></image></view>
+				</view>
+				<view class="tlist-img " v-for="imgItem in item.images">
+					<view class="img"><image :src="imgItem" mode="scaleToFill"></image></view>
+				</view>
+			</view>
+			<view class="goods_name">
+				<view class="goods_title flex_item">
+					<view class="text">{{ item.min_people }}人团</view>
+					<view class="title">{{ item.title }}</view>
+				</view>
+				<view class="goods-height">
+					<!-- <view class="goods_num clamp">{{ item.info }}</view> -->
+					<view class="flex goods-peplo">
+						<view class="goods-tip flex_item">
+							<view class="peplo">库存剩{{ item.percent | parseIntTo }}%</view>
+							<view class="make">{{ item.mark }}</view>
+						</view>
+						<view class="right flex_item">
+							<image src="/static/icon/hot.png" mode="aspectFill"></image>
+							<text>已拼{{ item.sales }}份</text>
+						</view>
+					</view>
+				</view>
+				<view class="price flex">
+					<view class="price_list">
+						<view class="price-red">
+							<text>单人仅付:</text>
+							<text class="moneyIcon">¥</text>
+							<text class="money">{{ item.price }}</text>
+							<text class="moneyType">/{{ item.unit_name }}</text>
+							<!-- <text class="outMoney">¥{{ item.product_price }}</text> -->
+						</view>
+					</view>
+					<view class="img position-relative" @click.stop="ToKaiTuan(item)">去开团</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	props: {
+		recommendedlist: {
+			type: Array,
+			default: function() {
+				return {
+				};
+			}
+		}
+	},
+	data() {
+		return {};
+	},
+	filters: {
+		parseIntTo(percent) {
+			percent = +percent * 100;
+			if (percent % 1 === 0) {
+				return percent;
+			} else {
+				percent = percent.toFixed(1);
+				return percent;
+			}
+		}
+	},
+	methods: {
+		// 去开团
+		ToKaiTuan(item) {
+			console.log(8754847)
+			let id = item.id;
+			uni.navigateTo({
+				url: '/pages/product/productGroup?id=' + id
+			});
+		},
+	}
+};
+</script>
+
+<style lang="scss">
+.other{
+		.other-1{
+			font-size:27rpx;
+			color:#333333;
+			line-height: 55rpx;
+		}
+		
+		.preferred_item {
+			width: 100%;
+			height: 100%;
+			padding: 25rpx 25rpx;
+			position: relative;
+			background-color: #FFFFFF;
+			border-radius: 15rpx;
+			margin-bottom: 15rpx;
+			.tlist-img {
+				width: 225rpx;
+				position: relative;
+				margin-right: 15rpx;
+				.leftImgIcon {
+					position: absolute;
+					top: 0;
+					left: 0;
+					font-size: 22rpx;
+					font-family: PingFangSC;
+					color: rgba(148, 71, 34, 1);
+					background: rgba(254, 242, 111, 1);
+					z-index: 99;
+					border-radius: 5rpx;
+					padding: 5rpx 10rpx;
+				}
+				.img {
+					width: 210rpx;
+					height: 210rpx;
+					image {
+						width: 100%;
+						height: 100%;
+						border-radius: 20rpx;
+					}
+				}
+				.stock {
+					margin-top: 13rpx;
+					font-size: 26rpx;
+					background: #fff1ee;
+					width: 100%;
+					color: #fb4912;
+					padding: 6rpx 0;
+					border-radius: 5rpx;
+					justify-content: center;
+					align-items: center;
+					position: absolute;
+					left: 0;
+					bottom: 0;
+					.img {
+						width: 20rpx;
+						height: 20rpx;
+						flex-shrink: 0;
+					}
+					.stock-num {
+						padding-left: 7rpx;
+						font-size: 22rpx;
+						border-radius: 5rpx;
+						height: 32rpx;
+						line-height: 32rpx;
+					}
+				}
+			}
+			.goods_name {
+				.goods_title {
+					padding-top: 15rpx;
+					color:rgba(0,0,0,1);
+					// white-space: nowrap;
+					// overflow: hidden;
+					// text-overflow: ellipsis;
+					font-size:32rpx;
+					color: $font-color-dark;
+					// height: 70rpx;
+					align-items: baseline;
+					.text{
+						border-radius: 8rpx;
+						border: 2rpx solid #FF1A27;
+						color: #FF1A27;
+						padding:0rpx 10rpx;
+						font-size: 26rpx !important;
+						margin-right: 15rpx;
+						
+					}
+					.title {
+						width: 80%;
+						overflow : hidden;
+						text-overflow: ellipsis;
+						display: -webkit-box;
+						-webkit-line-clamp: 2;
+						-webkit-box-orient: vertical;
+					}
+				}
+				.goods-height {
+					min-height: 60rpx;
+				}
+				.goods_num {
+					font-size: 26rpx;
+					color: #8f8f97;
+					padding-bottom: 15rpx;
+				}
+				.goods-peplo {
+					height: 45rpx;
+					margin-top: 15rpx;
+					.right {
+						color:#8e8e8e;
+						font-size: 24rpx;
+						width:195rpx;
+						image {
+							width: 30rpx;
+							height: 33rpx;
+							margin-right: 15rpx;
+						}
+					}
+					.goods-tip {
+						.peplo {
+							background:linear-gradient(14deg,rgba(255,116,37,1),rgba(255,30,41,1));
+							padding: 5rpx 10rpx;
+							color: #ffffff;
+							border-top-left-radius:8rpx;
+							border-bottom-left-radius: 8rpx;
+						}
+						.make {
+							background-color: #fef26f;
+							color: #944722;
+							border-top-right-radius: 8rpx;
+							border-bottom-right-radius: 8rpx;
+						}
+						.make,
+						.peplo {
+							font-size: $font-sm;
+							padding: 5rpx 10rpx;
+						}
+					}
+				}
+				.price {
+					font-size: 28rpx;
+					position: relative;
+					padding-top: 15rpx;
+					.price_list {
+						.price-red {
+							font-size: 30rpx !important;
+							font-family: Source Han Sans CN;
+							color: rgba(253, 27, 42, 1);
+							font-size: $font-base;
+							font-weight: bold;
+							.moneyIcon {
+								font-weight: normal !important; 
+							}
+							.money {
+								font-size: 58rpx;
+							}
+							.moneyType {
+								font-weight: 400;
+							}
+							.outMoney {
+								font-weight: 400;
+								text-decoration: line-through;
+								color: rgba(142, 142, 142, 1);
+							}
+						}
+						.price-green {
+							color: #2dbd59;
+							font-size: 26rpx !important;
+							font-weight: bold;
+							text {
+								background: linear-gradient(45deg, rgba(21, 197, 52, 1), rgba(21, 197, 52, 1));
+								color: #ffffff;
+								padding: 0rpx 10rpx;
+								border-radius: 7rpx;
+								font-size: 24rpx !important;
+								margin-left: 15rpx;
+							}
+						}
+					}
+					.img {
+						width: 265rpx;
+						height: 74rpx;
+						line-height: 74rpx;
+						// background:linear-gradient(14deg,rgba(255,116,37,1),rgba(255,30,41,1));
+						background: linear-gradient(270deg, rgba(181,116,242, 1) 0%, rgba(139,86,254, 1) 100%);
+						border-radius: 99rpx;
+						color: #ffffff;
+						font-size: $font-lg;
+						text-align: center;
+					}
+					.img1{
+						background-color: #D3D3D3;
+						width: 265rpx;
+						height: 74rpx;
+						line-height: 74rpx;
+						border-radius: 99rpx;
+						color: #ffffff;
+						font-size: $font-lg;
+						text-align: center;
+					}
+					.tomorrow {
+						background: #29a66e;
+						color: #ffffff;
+						border-radius: 25rpx;
+						padding: 10rpx 25rpx;
+					}
+				}
+			}
+		}
+		
+		
+		.other-2{
+			width: 100%;
+			background:#ffffff;
+			padding: 10rpx 15rpx ;
+			border-radius: 20rpx;
+			.content-row{
+				padding: 10rpx 0;
+				.row-1{
+					width: 210rpx;
+					position: relative;
+					margin-right: 20rpx;
+					text-align: center;
+					.row-1-1{
+						text-align: center;
+						height:40rpx;
+						background:#fff1ee;
+						border-radius:6rpx;
+						font-size:22rpx;
+						font-weight:500;
+						color:#fb4912;
+						line-height:40rpx;
+						image{
+							width: 23rpx;
+							height: 23rpx;
+							margin-right: 5rpx;
+						}
+					}
+					.img1{
+						width:170rpx;
+						height:170rpx;
+						border-radius:10rpx;
+					}
+					.img2{
+						position: absolute;
+						top: 0;
+						left: 16rpx;
+						width:80rpx;
+						height:32rpx;
+						border-radius:5px;
+					}
+				}
+				.row-2{
+					padding: 20rpx 0 20rpx 0;
+					width:calc(100% - 210rpx);
+					position: relative;
+					
+					border-bottom: 1px solid #EAEAEA;
+					.word-1{
+						font-size:32rpx;
+						font-weight:bold;
+						color:#141821;
+						margin-left: 10rpx;
+						overflow: hidden;
+						text-overflow: ellipsis;
+						white-space: nowrap;
+					}
+					.word-2{
+						margin-top: 10rpx;
+						font-size:24rpx;
+						color:#979797;
+					}
+					.word-3{
+						margin-top: 10rpx;
+						position: relative;
+						font-size:20rpx;
+						color:#ffffff;
+						image{
+							width: 235rpx;
+							height: 50rpx;
+						}
+						.word-3-1{
+							position: absolute;
+							top:8px;
+							left:2px;
+							width: 230rpx;
+							text-align: center;
+							.word-3-1-1{
+								display: inline-block;
+								color:#FD1B2A;
+								width: 50%;
+							}
+							
+						}
+					}
+					.word-4{
+						margin-top: 15rpx;
+						font-size:23rpx;
+						color:#fd1b2a;
+						margin-left: 10rpx;
+						text{
+							font-size:23rpx;
+							font-weight:bold;
+						}
+						.word-4-1{
+							font-size:36rpx;
+						}
+					}
+					.word-5{
+						margin-top: 15rpx;
+						font-size:21rpx;
+						color:#868686;
+					}
+					.button{
+						width:145rpx;
+						height:60rpx;
+						background:linear-gradient(14deg,#ff7425,#ff1e29);
+						border-radius:30rpx;
+						font-size:27rpx;
+						font-weight:bold;
+						color:#ffffff;
+						line-height:60rpx;
+						text-align: center;
+						
+						position: absolute;
+						bottom: 20rpx;
+						right: 0;
+					}
+				}
+			}
+		}
+	}
+</style>

+ 68 - 0
components/returnButton.vue

@@ -0,0 +1,68 @@
+<template>
+	<view class="content">
+		<view class="retun-Box" @click="navTo('/pages/order/order?state=0')">
+			<image class="return-img" src=".././static/tabBar/dingdan.png"></image>
+			<view class="return-text">订单</view>
+		</view>
+		<view class="retun-Box" @click="GoHome">
+			<image class="return-img" src=".././static/tabBar/home.png" ></image>
+			<view class="return-text">首页</view>
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	props: {
+		
+	},
+	data() {
+		return {
+			
+		}
+	},
+	methods: {
+		navTo(url) {
+			uni.navigateTo({
+				url: url
+			})
+		},
+		GoHome() {
+			// uni.navigateTo({
+			// 	url: '/pages/groupBooking/index'
+			// })
+			uni.switchTab({
+				url: '/pages/index/index'
+			})
+		}
+	}
+}
+</script>
+
+<style lang="scss">
+.content {
+	position: fixed;
+	right: 0;
+	bottom: 330rpx;
+	.retun-Box {
+		border-radius: 50%;
+		background: #FFFFFF;
+		width: 100rpx;
+		height: 100rpx;
+		margin-top: 30rpx;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
+		box-shadow: 0 6rpx 20rpx #888888;
+		.return-img {
+			width: 40rpx;
+			height: 40rpx;
+		}
+		.return-text {
+			font-size: $font-sm;
+			margin-top: 8rpx;
+		}
+	}
+}
+</style>

+ 246 - 0
components/seckill/seckill.vue

@@ -0,0 +1,246 @@
+<template>
+	<view class="seckill-section m-t" v-if="show">
+		<view class="s-header">
+			<view class="f-left-icon"></view>
+			<view class="tit-box"><text class="tit">限时秒杀</text></view>
+			<view class="tip-box">
+				<text class="tip" v-if="status == 1">{{ showTime }}点场结束</text>
+				<text class="tip" v-if="status == 2">距离下场开始</text>
+				<text class="tip" v-if="status == 0">当天活动已结束</text>
+				<uni-countdown v-if="status == 1 || status == 2" :show-day="false" :hour="stopTimeH" :minute="stopTimeM" :second="stopTimeS"></uni-countdown>
+			</view>
+			<view class="textNav iconfont iconenter" @click="navTo('/pages/product/seckill')">更多</view>
+		</view>
+		<scroll-view class="floor-list" scroll-x>
+			<view class="scoll-wrapper position-relative" @click="navTo('/pages/product/seckill')">
+				<view v-for="(item, index) in list" :key="index" class="floor-item">
+					<image class="list-image" :src="item.image" mode="aspectFill"></image>
+					<text class="title clamp">{{ item.title }}</text>
+					<text class="price">¥{{ item.price }}</text>
+				</view>
+				<view v-if="list.length == 0" class="floor-item ">
+					<image class="list-image" mode="aspectFill"></image>
+					<text class="title clamp"></text>
+					<text class="price"></text>
+				</view>
+				<view v-if="list.length == 0" class="noGoodsBg"><view>敬请期待</view></view>
+			</view>
+		</scroll-view>
+	</view>
+</template>
+
+<script>
+import uniCountdown from '@/components/uni-countdown/uni-countdown.vue';
+import { getSeckillList, getSeckillClass } from '@/api/product.js';
+import { timeComputed } from '@/utils/rocessor.js';
+export default {
+	components: {
+		uniCountdown
+	},
+	data() {
+		return {
+			list: [],
+			page: 1,
+			limit: 10,
+			showTime: '', //显示的时间
+			showTImeId: '', //显示时间id用于查询数据
+			stopTimeH: 0,
+			stopTimeM: 0,
+			stopTimeS: 0,
+			// 判断是否所有活动已经结束
+			stop: false, //活动是否已经结束
+			show: false, //是否显示活动
+			status: 0 //获取状态值1为有活动开始中 2为活动未开始 0为活动已经结束
+		};
+	},
+	created: function(e) {
+		// 载入分类
+		this.getClass();
+	},
+	methods: {
+		navTo(url) {
+			uni.navigateTo({
+				url
+			});
+		},
+		getList() {
+			getSeckillList(
+				{
+					page: this.page,
+					limit: this.limit
+				},
+				this.showTImeId
+			)
+				.then(e => {
+					this.list = e.data;
+				})
+				.catch(e => {
+					console.log(e);
+				});
+		},
+		getClass() {
+			let obj = this;
+			getSeckillClass({})
+				.then(({ data }) => {
+					let arr = data.seckillTime;
+					// 用于判断是否有数据
+					let showDate = false;
+					for (var i = 0; i < arr.length; i++) {
+						let ar = arr[i];
+						if (ar.status === 1 || ar.status === 2) {
+							obj.status = ar.status;
+							// 保存要显示的场次时间
+							obj.showTime = ar.time;
+							// 保存要显示活动商品的id
+							obj.showTImeId = ar.id;
+							// 保存当前状态值
+							// 计算倒计时时间
+							if (ar.status === 1) {
+								obj.timeComputed(ar.stop * 1000);
+							} else {
+								// 获取需要开始
+								let arTime = ar.time.split(':');
+								let h = arTime[0];
+								let m = arTime[1];
+								let time = new Date();
+								// 设置时间
+								time.setHours(h, m, 0);
+								obj.timeComputed(time.getTime());
+							}
+							// 获取商品列表
+							obj.getList();
+							// 保存当前有活动在举行
+							showDate = true;
+							// 任务查询结束跳出循环
+							break;
+						}
+					}
+					// 判断是否有活动
+					if (arr.length > 0) {
+						obj.show = true;
+					}
+					// 判断今天活动是否已经全部结束
+					if (!showDate) {
+						// 保存活动结束最后一个小时的活动商品
+						obj.showTImeId = arr[arr.length - 1].id;
+						// 活动已经结束
+						obj.status = 0;
+						// 获取结束时的商品
+						obj.getList();
+						console.log(obj.status);
+					}
+					// 如果所有场次均已经结束
+				})
+				.catch(e => {
+					uni.showModal({
+						title: JSON.stringify(e)
+					});
+				});
+		},
+		// 计算倒计时时间
+		timeComputed(da) {
+			let obj = this;
+			let stopTime = timeComputed(da)
+			obj.stopTimeH =stopTime.hours;
+			obj.stopTimeM = stopTime.minutes;
+			obj.stopTimeS =stopTime.seconds;
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+/* 秒杀专区 */
+.seckill-section {
+	padding: 4rpx 30rpx 24rpx;
+	.s-header {
+		display: flex;
+		align-items: center;
+		height: 92rpx;
+		line-height: 1;
+		.tit-box {
+			flex-shrink: 0;
+		}
+		.tit {
+			@extend %font-title;
+		}
+		.f-left-icon {
+			@extend %f-left-icon;
+		}
+		.textNav {
+			line-height: 1;
+			padding: 15rpx 0;
+			flex-shrink: 0;
+			flex-grow: 1;
+			min-width: 100rpx;
+		}
+		.tip-box {
+			flex-grow: 1;
+			display: flex;
+			justify-content: flex-start;
+			align-items: center;
+		}
+		.tip {
+			font-size: $font-sm;
+			color: $font-color-light;
+			padding-left: 10rpx;
+			padding-right: 10rpx;
+		}
+		.timer {
+			display: inline-block;
+			width: 40rpx;
+			height: 36rpx;
+			text-align: center;
+			line-height: 36rpx;
+			margin-right: 14rpx;
+			font-size: $font-sm + 2rpx;
+			color: #fff;
+			border-radius: 2px;
+			background: rgba(0, 0, 0, 0.8);
+		}
+		.iconenter {
+			font-size: $font-sm;
+			color: $font-color-light;
+			flex: 1;
+			text-align: right;
+		}
+	}
+	.floor-list {
+		white-space: nowrap;
+		background-color: white;
+		padding: 20rpx;
+		border-radius: 5rpx;
+		box-shadow: $box-shadow;
+	}
+	.scoll-wrapper {
+		display: flex;
+		align-items: flex-start;
+		.noGoodsBg {
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			height: 100%;
+			position: absolute;
+			top: 0;
+			left: 0;
+			width: 100%;
+			color: $font-color-light;
+		}
+		.floor-item {
+			width: 150rpx;
+			margin-right: 20rpx;
+			font-size: $font-sm + 2rpx;
+			color: $font-color-dark;
+			line-height: 1.8;
+			.list-image {
+				width: 150rpx;
+				height: 150rpx;
+				border-radius: 6rpx;
+			}
+			.price {
+				color: $color-red;
+			}
+		}
+	}
+}
+</style>

+ 164 - 170
components/share.vue

@@ -1,202 +1,196 @@
 <template>
-	<view v-if="show" class="mask" @click="toggleMask" @touchmove.stop.prevent="stopPrevent"
-		:style="{backgroundColor: backgroundColor}"
-	>
-		<view 
+	<view v-if="show" class="mask" @click="toggleMask" @touchmove.stop.prevent="stopPrevent" :style="{ backgroundColor: backgroundColor }">
+		<view
 			class="mask-content"
 			@click.stop.prevent="stopPrevent"
-			:style="[{
-				height: config.height, 
-				transform: transform
-			}]"
+			:style="[
+				{
+					height: config.height,
+					transform: transform
+				}
+			]"
 		>
 			<scroll-view class="view-content" scroll-y>
-				<view class="share-header">
-					分享到
-				</view>
+				<view class="share-header">分享到</view>
 				<view class="share-list">
-					<view 
-						v-for="(item, index) in shareList" :key="index"
-						class="share-item" 
-						@click="shareToFriend(item.text)"
-					>
-						<image :src="item.icon" mode=""></image>
-						<text>{{item.text}}</text>
+					<view v-for="(item, index) in shareList" :key="index" class="share-item" @click="shareToFriend(item.text)">
+						<image class="itemImage" :src="item.icon" mode=""></image>
+						<text class="itemText">{{ item.text }}</text>
 					</view>
 				</view>
 			</scroll-view>
-			<view class="bottom b-t" @click="toggleMask">取消</view>
+			<view class="bottomButtom b-t" @click="toggleMask">取消</view>
 		</view>
 	</view>
 </template>
 
 <script>
-	export default {
-		data() {
-			return {
-				transform: 'translateY(50vh)',
-				timer: 0,
-				backgroundColor: 'rgba(0,0,0,0)',
-				show: false,
-				config: {},
-			};
+export default {
+	data() {
+		return {
+			transform: 'translateY(50vh)',
+			timer: 0,
+			backgroundColor: 'rgba(0,0,0,0)',
+			show: false,
+			config: {}
+		};
+	},
+	props: {
+		contentHeight: {
+			type: Number,
+			default: 0
 		},
-		props:{
-			contentHeight:{
-				type: Number,
-				default: 0
-			},
-			//是否是tabbar页面
-			hasTabbar:{
-				type: Boolean,
-				default: false
-			},
-			shareList:{
-				type: Array,
-				default: function(){
-					return [];
-				}
-			}
+		//是否是tabbar页面
+		hasTabbar: {
+			type: Boolean,
+			default: false
 		},
-		created() {
-			const height = uni.upx2px(this.contentHeight) + 'px';
-			this.config = {
-				height: height,
-				transform: `translateY(${height})`,
-				backgroundColor: 'rgba(0,0,0,.4)',
+		shareList: {
+			type: Array,
+			default: function() {
+				return [];
+			}
+		}
+	},
+	created() {
+		const height = uni.upx2px(this.contentHeight) + 'px';
+		this.config = {
+			height: height,
+			transform: `translateY(${height})`,
+			backgroundColor: 'rgba(0,0,0,.4)'
+		};
+		this.transform = this.config.transform;
+	},
+	methods: {
+		toggleMask() {
+			//防止高频点击
+			if (this.timer == 1) {
+				return;
+			}
+			this.timer = 1;
+			setTimeout(() => {
+				this.timer = 0;
+			}, 500);
+
+			if (this.show) {
+				this.transform = this.config.transform;
+				this.backgroundColor = 'rgba(0,0,0,0)';
+				setTimeout(() => {
+					this.show = false;
+					this.hasTabbar && uni.showTabBar();
+				}, 200);
+				return;
+			}
+
+			this.show = true;
+			//等待mask重绘完成执行
+			if (this.hasTabbar) {
+				uni.hideTabBar({
+					success: () => {
+						setTimeout(() => {
+							this.backgroundColor = this.config.backgroundColor;
+							this.transform = 'translateY(0px)';
+						}, 10);
+					}
+				});
+			} else {
+				setTimeout(() => {
+					this.backgroundColor = this.config.backgroundColor;
+					this.transform = 'translateY(0px)';
+				}, 10);
 			}
-			this.transform = this.config.transform;
 		},
-		methods:{
-			toggleMask(){
-				//防止高频点击
-				if(this.timer == 1){
-					return;
-				}
-				this.timer = 1;
-				setTimeout(()=>{
-					this.timer = 0;
-				}, 500)
-				
-				if(this.show){
-					this.transform = this.config.transform;
-					this.backgroundColor = 'rgba(0,0,0,0)';
-					setTimeout(()=>{
-						this.show = false;
-						this.hasTabbar && uni.showTabBar();
-					}, 200)
-					return;
-				}
-				
-				this.show = true;
-				//等待mask重绘完成执行
-				if(this.hasTabbar){
-					uni.hideTabBar({
-						success: () => {
-							setTimeout(()=>{
-								this.backgroundColor = this.config.backgroundColor;
-								this.transform = 'translateY(0px)';
-							}, 10)
-						}
-					});
-				}else{
-					setTimeout(()=>{
-						this.backgroundColor = this.config.backgroundColor;
-						this.transform = 'translateY(0px)';
-					}, 10)
-				}
-			},
-			//防止冒泡和滚动穿透
-			stopPrevent(){},
-			//分享操作
-			shareToFriend(type){
-				this.$api.msg(`分享给${type}`);
-				this.toggleMask();
-			},
+		//防止冒泡和滚动穿透
+		stopPrevent() {},
+		//分享操作
+		shareToFriend(type) {
+			this.$api.msg(`分享给${type}`);
+			this.toggleMask();
 		}
 	}
+};
 </script>
 
-<style lang='scss'>
-	.mask{
-		position:fixed;
+<style lang="scss">
+.mask {
+	position: fixed;
+	left: 0;
+	top: 0;
+	right: 0;
+	bottom: 0;
+	display: flex;
+	justify-content: center;
+	align-items: flex-end;
+	z-index: 998;
+	transition: 0.3s;
+	.bottomButtom {
+		position: absolute;
 		left: 0;
-		top: 0;
-		right: 0;
 		bottom: 0;
-		display:flex;
+		display: flex;
 		justify-content: center;
-		align-items: flex-end;
-		z-index: 998;
-		transition: .3s;
-		.bottom{
-			position:absolute;
-			left: 0;
-			bottom: 0;
-			display:flex;
-			justify-content: center;
-			align-items: center;
-			width: 100%;
-			height: 90rpx;
-			background: #fff;
-			z-index: 9;
-			font-size: $font-base + 2rpx;
-			color: $font-color-dark;
-		}
-	}
-	
-	.mask-content{
+		align-items: center;
 		width: 100%;
-		height: 580rpx;
-		transition: .3s;
+		height: 90rpx;
 		background: #fff;
-		&.has-bottom{
-			padding-bottom: 90rpx;
-		}
-		.view-content{
-			height: 100%;
-		}
+		z-index: 9;
+		font-size: $font-base + 2rpx;
+		color: $font-color-dark;
 	}
-	.share-header{
-		height: 110rpx;
-		font-size: $font-base+2rpx;
-		color: font-color-dark;
-		display:flex;
-		align-items:center;
-		justify-content: center;
-		padding-top: 10rpx;
-		&:before, &:after{
-			content: '';
-			width: 240rpx;
-			heighg: 0;
-			border-top: 1px solid $border-color-base;
-			transform: scaleY(.5);
-			margin-right: 30rpx;
-		}
-		 &:after{
-			 margin-left: 30rpx;
-			 margin-right: 0;
-		 }
+}
+.mask-content {
+	width: 100%;
+	height: 580rpx;
+	transition: 0.3s;
+	background: #fff;
+	&.has-bottom {
+		padding-bottom: 90rpx;
 	}
-	.share-list{
-		display:flex;
-		flex-wrap: wrap;
+	.view-content {
+		height: 100%;
 	}
-	.share-item{
-		min-width: 33.33%;
-		display:flex;
-		flex-direction: column;
-		justify-content: center;
-		align-items: center;
-		height: 180rpx;
-		image{
-			width: 80rpx;
-			height: 80rpx;
-			margin-bottom: 16rpx;
-		}
-		text{
-			font-size: $font-base;
-			color: $font-color-base;
-		}
+}
+.share-header {
+	height: 110rpx;
+	font-size: $font-base + 2rpx;
+	color: font-color-dark;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	padding-top: 10rpx;
+	&:before,
+	&:after {
+		content: '';
+		width: 240rpx;
+		heighg: 0;
+		border-top: 1px solid $border-color-base;
+		transform: scaleY(0.5);
+		margin-right: 30rpx;
+	}
+	&:after {
+		margin-left: 30rpx;
+		margin-right: 0;
+	}
+}
+.share-list {
+	display: flex;
+	flex-wrap: wrap;
+}
+.share-item {
+	min-width: 33.33%;
+	display: flex;
+	flex-direction: column;
+	justify-content: center;
+	align-items: center;
+	height: 180rpx;
+	.itemImage {
+		width: 80rpx;
+		height: 80rpx;
+		margin-bottom: 16rpx;
+	}
+	.itemText {
+		font-size: $font-base;
+		color: $font-color-base;
 	}
+}
 </style>

+ 5 - 11
components/tki-qrcode/qrcode.js

@@ -58,7 +58,6 @@ let QRCode = {};
         this.make();
     }
     QRCodeAlg.prototype = {
-		
         constructor: QRCodeAlg,
         /**
          * 获取二维码矩阵大小
@@ -1085,7 +1084,7 @@ let QRCode = {};
         }
         // 创建canvas
         let createCanvas = function (options) {
-            if(options.showLoading){
+            if (options.showLoading) {
                 uni.showLoading({
                     title: options.loadingText,
                     mask: true
@@ -1151,14 +1150,7 @@ let QRCode = {};
                             quality: Number(1),
                             success: function (res) {
                                 if (options.cbResult) {
-                                    // 由于官方还没有统一此接口的输出字段,所以先判定下  支付宝为 res.apFilePath
-                                    if (!empty(res.tempFilePath)) {
-                                        options.cbResult(res.tempFilePath)
-                                    } else if (!empty(res.apFilePath)) {
-                                        options.cbResult(res.apFilePath)
-                                    } else {
-                                        options.cbResult(res.tempFilePath)
-                                    }
+                                    options.cbResult(res.tempFilePath)
                                 }
                             },
                             fail: function (res) {
@@ -1167,7 +1159,9 @@ let QRCode = {};
                                 }
                             },
                             complete: function () {
-                                uni.hideLoading();
+                                if (options.showLoading){
+                                    uni.hideLoading();
+                                }
                             },
                         }, options.context);
                     }, options.text.length + 100);

+ 13 - 20
components/uni-countdown/uni-countdown.vue

@@ -38,22 +38,10 @@
 				type: String,
 				default: '#000000'
 			},
-			day: {
-				type: Number,
-				default: 0
-			},
-			hour: {
-				type: Number,
-				default: 0
-			},
-			minute: {
-				type: Number,
-				default: 0
-			},
-			second: {
-				type: Number,
-				default: 0
-			}
+			day:0,
+			hour:0,
+			minute:0,
+			second:0
 		},
 		data() {
 			return {
@@ -106,6 +94,7 @@
 				} else {
 					this.timeUp()
 				}
+				hour = hour + (day*24)
 				if (day < 10) {
 					day = '0' + day
 				}
@@ -141,6 +130,7 @@
 			changeFlag() {
 				if (!this.syncFlag) {
 					this.seconds = this.toSeconds(this.day, this.hour, this.minute, this.second)
+					console.log(this.seconds)
 					this.startData();
 					this.syncFlag = true;
 				}
@@ -150,8 +140,8 @@
 </script>
 <style lang="scss" scoped>
 	@import '~@/uni.scss';
-	$countdown-height: 48rpx;
-	$countdown-width: 52rpx;
+	$countdown-height: 40rpx;
+	$countdown-width: 40rpx;
 
 	.uni-countdown {
 		/* #ifndef APP-NVUE */
@@ -159,7 +149,9 @@
 		/* #endif */
 		flex-direction: row;
 		justify-content: flex-start;
-		padding: 2rpx 0;
+		position: relative;
+		top: 5rpx;
+		left: 15rpx;
 	}
 
 	.uni-countdown__splitor {
@@ -181,8 +173,9 @@
 		width: $countdown-width;
 		height: $countdown-height;
 		line-height: $countdown-height;
-		margin: 5rpx;
+		// margin: 5rpx;
 		text-align: center;
 		font-size: $uni-font-size-sm;
+		border-radius: 8rpx;
 	}
 </style>

+ 188 - 0
components/uni-countdown/uni-countdowns.vue

@@ -0,0 +1,188 @@
+<template>
+	<view class="uni-countdown">
+		<text v-if="showDay" :style="{ borderColor: borderColor, color: color, backgroundColor: backgroundColor }" class="uni-countdown__number">{{ d }}</text>
+		<text v-if="showDay" :style="{ color: splitorColor }" class="uni-countdown__splitor">天</text>
+		<text :style="{ borderColor: borderColor, color: color, backgroundColor: backgroundColor }" class="uni-countdown__number">{{ h }}</text>
+		<text :style="{ color: splitorColor }" class="uni-countdown__splitor">{{ showColon ? ':' : '时' }}</text>
+		<text :style="{ borderColor: borderColor, color: color, backgroundColor: backgroundColor }" class="uni-countdown__number">{{ i }}</text>
+		<text :style="{ color: splitorColor }" class="uni-countdown__splitor">{{ showColon ? ':' : '分' }}</text>
+		<text :style="{ borderColor: borderColor, color: color, backgroundColor: backgroundColor }" class="uni-countdown__number">{{ s }}</text>
+		<text v-if="!showColon" :style="{ color: splitorColor }" class="uni-countdown__splitor">秒</text>
+	</view>
+</template>
+<script>
+	export default {
+		name: 'UniCountdown',
+		props: {
+			showDay: {
+				type: Boolean,
+				default: true
+			},
+			showColon: {
+				type: Boolean,
+				default: true
+			},
+			backgroundColor: {
+				type: String,
+				default: '#FFFFFF'
+			},
+			borderColor: {
+				type: String,
+				default: '#000000'
+			},
+			color: {
+				type: String,
+				default: '#000000'
+			},
+			splitorColor: {
+				type: String,
+				default: '#000000'
+			},
+			day: {
+				type: Number,
+				default: 0
+			},
+			hour: {
+				type: Number,
+				default: 0
+			},
+			minute: {
+				type: Number,
+				default: 0
+			},
+			second: {
+				type: Number,
+				default: 0
+			}
+		},
+		data() {
+			return {
+				timer: null,
+				syncFlag: false,
+				d: '00',
+				h: '00',
+				i: '00',
+				s: '00',
+				leftTime: 0,
+				seconds: 0
+			}
+		},
+		watch: {
+			day(val) {
+				this.changeFlag()
+			},
+			hour(val) {
+				this.changeFlag()
+			},
+			minute(val) {
+				this.changeFlag()
+			},
+			second(val) {
+				this.changeFlag()
+			}
+		},
+		created: function(e) {
+			this.startData();
+		},
+		beforeDestroy() {
+			clearInterval(this.timer)
+		},
+		methods: {
+			toSeconds(day, hours, minutes, seconds) {
+				return day * 60 * 60 * 24 + hours * 60 * 60 + minutes * 60 + seconds
+			},
+			timeUp() {
+				clearInterval(this.timer)
+				this.$emit('timeup')
+			},
+			countDown() {
+				let seconds = this.seconds
+				let [day, hour, minute, second] = [0, 0, 0, 0]
+				if (seconds > 0) {
+					day = Math.floor(seconds / (60 * 60 * 24))
+					hour = Math.floor(seconds / (60 * 60)) - (day * 24)
+					minute = Math.floor(seconds / 60) - (day * 24 * 60) - (hour * 60)
+					second = Math.floor(seconds) - (day * 24 * 60 * 60) - (hour * 60 * 60) - (minute * 60)
+				} else {
+					this.timeUp()
+				}
+				if (day < 10) {
+					day = '0' + day
+				}
+				if (hour < 10) {
+					hour = '0' + hour
+				}
+				if (minute < 10) {
+					minute = '0' + minute
+				}
+				if (second < 10) {
+					second = '0' + second
+				}
+				this.d = day
+				this.h = hour
+				this.i = minute
+				this.s = second
+			},
+			startData() {
+				this.seconds = this.toSeconds(this.day, this.hour, this.minute, this.second)
+				if (this.seconds <= 0) {
+					return
+				}
+				this.countDown()
+				this.timer = setInterval(() => {
+					this.seconds--
+					if (this.seconds < 0) {
+						this.timeUp()
+						return
+					}
+					this.countDown()
+				}, 1000)
+			},
+			changeFlag() {
+				if (!this.syncFlag) {
+					this.seconds = this.toSeconds(this.day, this.hour, this.minute, this.second)
+					this.startData();
+					this.syncFlag = true;
+				}
+			}
+		}
+	}
+</script>
+<style lang="scss" scoped>
+	@import '~@/uni.scss';
+	$countdown-height: 48rpx;
+	$countdown-width: 52rpx;
+
+	.uni-countdown {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		justify-content: flex-start;
+		padding: 2rpx 0;
+	}
+
+	.uni-countdown__splitor {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		justify-content: center;
+		line-height: $countdown-height;
+		padding: 5rpx;
+		font-size: $uni-font-size-sm;
+	}
+
+	.uni-countdown__number {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		justify-content: center;
+		align-items: center;
+		width: $countdown-width;
+		height: $countdown-height;
+		line-height: $countdown-height;
+		margin: 5rpx;
+		text-align: center;
+		font-size: $uni-font-size-sm;
+	}
+</style>

+ 124 - 0
components/uni-fav/uni-fav.vue

@@ -0,0 +1,124 @@
+<template>
+	<view :class="[circle === true || circle === 'true' ? 'uni-fav--circle' : '']" :style="[{ backgroundColor: checked ? bgColorChecked : bgColor }]"
+	 @click="onClick" class="uni-fav">
+		<!-- #ifdef MP-ALIPAY -->
+		<view class="uni-fav-star" v-if="!checked && (star === true || star === 'true')">
+			<uni-icons :color="fgColor" :style="{color: checked ? fgColorChecked : fgColor}" size="14" type="star-filled" />
+		</view>
+		<!-- #endif -->
+		<!-- #ifndef MP-ALIPAY -->
+		<uni-icons :color="fgColor" :style="{color: checked ? fgColorChecked : fgColor}" class="uni-fav-star" size="14" type="star-filled"
+		 v-if="!checked && (star === true || star === 'true')" />
+		<!-- #endif -->
+		<text :style="{color: checked ? fgColorChecked : fgColor}" class="uni-fav-text">{{ checked ? contentText.contentFav : contentText.contentDefault }}</text>
+	</view>
+</template>
+
+<script>
+	import uniIcons from "../uni-icons/uni-icons.vue";
+	export default {
+		name: "UniFav",
+		components: {
+			uniIcons
+		},
+		props: {
+			star: {
+				type: [Boolean, String],
+				default: true
+			},
+			bgColor: {
+				type: String,
+				default: "#eeeeee"
+			},
+			fgColor: {
+				type: String,
+				default: "#666666"
+			},
+			bgColorChecked: {
+				type: String,
+				default: "#007aff"
+			},
+			fgColorChecked: {
+				type: String,
+				default: "#FFFFFF"
+			},
+			circle: {
+				type: [Boolean, String],
+				default: false
+			},
+			checked: {
+				type: Boolean,
+				default: false
+			},
+			contentText: {
+				type: Object,
+				default () {
+					return {
+						contentDefault: "收藏",
+						contentFav: "已收藏"
+					};
+				}
+			}
+		},
+		watch: {
+			checked() {
+				if (uni.report) {
+					if (this.checked) {
+						uni.report("收藏", "收藏");
+					} else {
+						uni.report("取消收藏", "取消收藏");
+					}
+				}
+			}
+		},
+		methods: {
+			onClick() {
+				this.$emit("click");
+			}
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	$fav-height: 25px;
+
+	.uni-fav {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+		justify-content: center;
+		width: 60px;
+		height: $fav-height;
+		line-height: $fav-height;
+		text-align: center;
+		border-radius: 3px;
+	}
+
+	.uni-fav--circle {
+		border-radius: 30px;
+	}
+
+	.uni-fav-star {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		height: $fav-height;
+		line-height: 24px;
+		margin-right: 3px;
+		align-items: center;
+		justify-content: center;
+	}
+
+	.uni-fav-text {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		height: $fav-height;
+		line-height: $fav-height;
+		align-items: center;
+		justify-content: center;
+		font-size: $uni-font-size-base;
+	}
+</style>

Різницю між файлами не показано, бо вона завелика
+ 0 - 0
components/uni-icons/uni-icons.vue


+ 2 - 2
components/uni-list-item/uni-list-item.vue

@@ -21,7 +21,7 @@
 			</view>
 			<view v-if="showBadge || showArrow || showSwitch" class="uni-list-item__extra">
 				<uni-badge v-if="showBadge" :type="badgeType" :text="badgeText" />
-				<switch v-if="showSwitch" :color="switchColor" :disabled="disabled" :checked="switchChecked" @change="onSwitchChange" />
+				<switch class="itemSwitch" v-if="showSwitch" :color="switchColor" :disabled="disabled" :checked="switchChecked" @change="onSwitchChange" />
 				<uni-icons v-if="showArrow" :size="20" class="uni-icon-wrapper" color="#bbb" type="arrowright" />
 			</view>
 		</view>
@@ -220,7 +220,7 @@
 		width: $uni-img-size-base;
 	}
 	// 修改switch默认大小
-	switch{
+	.itemSwitch{
 		transform: translateX(16rpx) scale(.84);
 	}
 	.uni-list-item__slot{

+ 33 - 33
components/uni-load-more/uni-load-more.vue

@@ -1,23 +1,23 @@
 <template>
 	<view class="uni-load-more">
 		<view class="uni-load-more__img" v-show="status === 'loading' && showIcon">
-			<view class="load1">
-				<view :style="{background:color}"></view>
-				<view :style="{background:color}"></view>
-				<view :style="{background:color}"></view>
-				<view :style="{background:color}"></view>
+			<view class="load1 load">
+				<view class="item" :style="{background:color}"></view>
+				<view class="item" :style="{background:color}"></view>
+				<view class="item" :style="{background:color}"></view>
+				<view class="item" :style="{background:color}"></view>
 			</view>
-			<view class="load2">
-				<view :style="{background:color}"></view>
-				<view :style="{background:color}"></view>
-				<view :style="{background:color}"></view>
-				<view :style="{background:color}"></view>
+			<view class="load2 load">
+				<view class="item" :style="{background:color}"></view>
+				<view class="item"  :style="{background:color}"></view>
+				<view class="item" :style="{background:color}"></view>
+				<view class="item" :style="{background:color}"></view>
 			</view>
-			<view class="load3">
-				<view :style="{background:color}"></view>
-				<view :style="{background:color}"></view>
-				<view :style="{background:color}"></view>
-				<view :style="{background:color}"></view>
+			<view class="load3 load">
+				<view class="item" :style="{background:color}"></view>
+				<view class="item" :style="{background:color}"></view>
+				<view class="item" :style="{background:color}"></view>
+				<view class="item" :style="{background:color}"></view>
 			</view>
 		</view>
 		<text class="uni-load-more__text" :style="{color:color}">{{status === 'more' ? contentText.contentdown : (status === 'loading' ? contentText.contentrefresh : contentText.contentnomore)}}</text>
@@ -80,11 +80,11 @@
 		margin-right: 10px
 	}
 
-	.uni-load-more__img>view {
+	.uni-load-more__img>.load {
 		position: absolute
 	}
 
-	.uni-load-more__img>view view {
+	.uni-load-more__img>.load .item {
 		width: 6px;
 		height: 2px;
 		border-top-left-radius: 1px;
@@ -96,25 +96,25 @@
 		animation: load 1.56s ease infinite
 	}
 
-	.uni-load-more__img>view view:nth-child(1) {
+	.uni-load-more__img>.load .item:nth-child(1) {
 		transform: rotate(90deg);
 		top: 2px;
 		left: 9px
 	}
 
-	.uni-load-more__img>view view:nth-child(2) {
+	.uni-load-more__img>.load .item:nth-child(2) {
 		transform: rotate(180deg);
 		top: 11px;
 		right: 0
 	}
 
-	.uni-load-more__img>view view:nth-child(3) {
+	.uni-load-more__img>.load .item:nth-child(3) {
 		transform: rotate(270deg);
 		bottom: 2px;
 		left: 9px
 	}
 
-	.uni-load-more__img>view view:nth-child(4) {
+	.uni-load-more__img>.load .item:nth-child(4) {
 		top: 11px;
 		left: 0
 	}
@@ -134,51 +134,51 @@
 		transform: rotate(60deg)
 	}
 
-	.load1 view:nth-child(1) {
+	.load1 .item:nth-child(1) {
 		animation-delay: 0s
 	}
 
-	.load2 view:nth-child(1) {
+	.load2 .item:nth-child(1) {
 		animation-delay: .13s
 	}
 
-	.load3 view:nth-child(1) {
+	.load3 .item:nth-child(1) {
 		animation-delay: .26s
 	}
 
-	.load1 view:nth-child(2) {
+	.load1 .item:nth-child(2) {
 		animation-delay: .39s
 	}
 
-	.load2 view:nth-child(2) {
+	.load2 .item:nth-child(2) {
 		animation-delay: .52s
 	}
 
-	.load3 view:nth-child(2) {
+	.load3 .item:nth-child(2) {
 		animation-delay: .65s
 	}
 
-	.load1 view:nth-child(3) {
+	.load1 .item:nth-child(3) {
 		animation-delay: .78s
 	}
 
-	.load2 view:nth-child(3) {
+	.load2 .item:nth-child(3) {
 		animation-delay: .91s
 	}
 
-	.load3 view:nth-child(3) {
+	.load3 .item:nth-child(3) {
 		animation-delay: 1.04s
 	}
 
-	.load1 view:nth-child(4) {
+	.load1 .item:nth-child(4) {
 		animation-delay: 1.17s
 	}
 
-	.load2 view:nth-child(4) {
+	.load2 .item:nth-child(4) {
 		animation-delay: 1.3s
 	}
 
-	.load3 view:nth-child(4) {
+	.load3 .item:nth-child(4) {
 		animation-delay: 1.43s
 	}
 

+ 43 - 8
components/uni-notice-bar/uni-notice-bar.vue

@@ -33,6 +33,27 @@
 	const dom = weex.requireModule('dom');
 	const animation = weex.requireModule('animation');
 	// #endif
+
+	/**
+	 * NoticeBar 自定义导航栏
+	 * @description 通告栏组件
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=30
+	 * @property {Number} speed 文字滚动的速度,默认100px/秒
+	 * @property {String} text 显示文字
+	 * @property {String} backgroundColor 背景颜色
+	 * @property {String} color 文字颜色
+	 * @property {String} moreColor 查看更多文字的颜色
+	 * @property {String} moreText 设置“查看更多”的文本
+	 * @property {Boolean} single = [true|false] 是否单行
+	 * @property {Boolean} scrollable = [true|false] 是否滚动,为true时,NoticeBar为单行
+	 * @property {Boolean} showIcon = [true|false] 是否显示左侧喇叭图标
+	 * @property {Boolean} showClose = [true|false] 是否显示左侧关闭按钮
+	 * @property {Boolean} showGetMore = [true|false] 是否显示右侧查看更多图标,为true时,NoticeBar为单行
+	 * @event {Function} click 点击 NoticeBar 触发事件
+	 * @event {Function} close 关闭 NoticeBar 触发事件
+	 * @event {Function} getmore 点击”查看更多“时触发事件
+	 */
+
 	export default {
 		name: 'UniNoticeBar',
 		components: {
@@ -53,7 +74,7 @@
 			},
 			speed: {
 				// 默认1s滚动100px
-				type: [String, Number],
+				type: Number,
 				default: 100
 			},
 			color: {
@@ -66,27 +87,27 @@
 			},
 			single: {
 				// 是否单行
-				type: [String, Boolean],
+				type: [Boolean, String],
 				default: false
 			},
 			scrollable: {
 				// 是否滚动,添加后控制单行效果取消
-				type: [String, Boolean],
+				type: [Boolean, String],
 				default: false
 			},
 			showIcon: {
 				// 是否显示左侧icon
-				type: [String, Boolean],
+				type: [Boolean, String],
 				default: false
 			},
 			showGetMore: {
 				// 是否显示右侧查看更多
-				type: [String, Boolean],
+				type: [Boolean, String],
 				default: false
 			},
 			showClose: {
 				// 是否显示左侧关闭按钮
-				type: [String, Boolean],
+				type: [Boolean, String],
 				default: false
 			}
 		},
@@ -139,7 +160,9 @@
 						textWidth = 0;
 					let textQuery = new Promise((resolve, reject) => {
 						uni.createSelectorQuery()
+							// #ifndef MP-ALIPAY
 							.in(this)
+							// #endif
 							.select(`#${this.elId}`)
 							.boundingClientRect()
 							.exec(ret => {
@@ -149,7 +172,9 @@
 					})
 					let boxQuery = new Promise((resolve, reject) => {
 						uni.createSelectorQuery()
+							// #ifndef MP-ALIPAY
 							.in(this)
+							// #endif
 							.select(`#${this.elIdBox}`)
 							.boundingClientRect()
 							.exec(ret => {
@@ -284,6 +309,13 @@
 		flex-direction: row;
 	}
 
+	/* #ifndef APP-NVUE */
+	.uni-noticebar__content-wrapper--scrollable {
+		position: relative;
+		height: 18px;
+	}
+	/* #endif */
+
 	.uni-noticebar__content--scrollable {
 		/* #ifdef APP-NVUE */
 		flex: 0;
@@ -317,7 +349,7 @@
 		lines: 1;
 		/* #endif */
 		/* #ifndef APP-NVUE */
-		display: inline-block;
+		display: block;
 		width: 100%;
 		white-space: nowrap;
 		/* #endif */
@@ -331,7 +363,10 @@
 		padding-left: 750rpx;
 		/* #endif */
 		/* #ifndef APP-NVUE */
-		display: inline-block;
+		position: absolute;
+		display: block;
+		height: 18px;
+		line-height: 18px;
 		white-space: nowrap;
 		padding-left: 100%;
 		animation: notice 10s 0s linear infinite both;

+ 4 - 0
components/uni-number-box.vue

@@ -78,6 +78,10 @@
 					index: this.index
 				}
 				this.$emit('eventChange', data);
+			},
+			value(number) {
+				console.log(number)
+				this.inputValue = number;
 			}
 		},
 		methods: {

+ 0 - 22
components/uni-popup/message.js

@@ -1,22 +0,0 @@
-export default {
-	created() {
-		if (this.type === 'message') {
-			// 不显示遮罩
-			this.maskShow = false 
-			// 获取子组件对象
-			this.childrenMsg = null
-		}
-	},
-	methods: {
-		customOpen() {
-			if (this.childrenMsg) {
-				this.childrenMsg.open()
-			}
-		},
-		customClose() {
-			if (this.childrenMsg) {
-				this.childrenMsg.close()
-			}
-		}
-	}
-}

+ 0 - 25
components/uni-popup/popup.js

@@ -1,25 +0,0 @@
-import message from './message.js';
-// 定义 type 类型:弹出类型:top/bottom/center
-const config = {
-	// 顶部弹出
-	top:'top',
-	// 底部弹出
-	bottom:'bottom',
-	// 居中弹出
-	center:'center',
-	// 消息提示
-	message:'top',
-	// 对话框
-	dialog:'center',
-	// 分享
-	share:'bottom',
-}
-
-export default {
-	data(){
-		return {
-			config:config
-		}
-	},
-	mixins: [message],
-}

+ 3 - 26
components/uni-popup/uni-popup-dialog.vue

@@ -5,12 +5,7 @@
 		</view>
 		<view class="uni-dialog-content">
 			<text class="uni-dialog-content-text" v-if="mode === 'base'">{{content}}</text>
-			<input v-else class="uni-dialog-input" v-model="val" type="text" :placeholder="placeholder" :focus="focus">
-		</view>
-		<view class="uni-dialog-picker" v-if="isSkm">
-			<picker @change="bindPickerChange" :value="index" :range="array">
-				<view class="picker-val">支付方式:{{array[index]}}</view>
-			</picker>
+			<input v-else class="uni-dialog-input" v-model="val" type="text" :placeholder="placeholder" :focus="focus" >
 		</view>
 		<view class="uni-dialog-button-group">
 			<view class="uni-dialog-button" @click="close">
@@ -90,19 +85,13 @@
 			beforeClose: {
 				type: Boolean,
 				default: false
-			},
-			isSkm: {
-				type: Boolean,
-				default: false
 			}
 		},
 		data() {
 			return {
 				dialogType: 'error',
 				focus: false,
-				val: "",
-				array: ['余额','消费券','积分'],
-				index:0
+				val: ""
 			}
 		},
 		inject: ['popup'],
@@ -117,7 +106,7 @@
 			},
 			value(val) {
 				this.val = val
-			},
+			}
 		},
 		created() {
 			// 对话框遮罩不可点击
@@ -153,11 +142,6 @@
 					return
 				}
 				this.popup.close()
-			},
-			// 改变支付方式
-			bindPickerChange(e) {
-				this.index = e.target.value
-				this.$emit('changeShowPayType',this.index)
 			}
 		}
 	}
@@ -256,11 +240,4 @@
 	.uni-popup__info {
 		color: #909399;
 	}
-	.picker-val {
-		padding: 0rpx 0 30rpx 30rpx;
-		// text-align: center;
-		font-size: 14px;
-		width: 100%;
-		// background-color: red;
-	}
 </style>

+ 263 - 0
components/uni-popup/uni-popup-ori.vue

@@ -0,0 +1,263 @@
+<template>
+	<view v-if="showPopup" class="uni-popup" @touchmove.stop.prevent="clear">
+		<uni-transition :mode-class="['fade']" :styles="maskClass" :duration="duration" :show="showTrans" @click="onTap" />
+		<uni-transition :mode-class="ani" :styles="transClass" :duration="duration" :show="showTrans" @click="onTap">
+			<view class="uni-popup__wrapper-box" @click.stop="clear">
+				<slot />
+			</view>
+		</uni-transition>
+	</view>
+</template>
+
+<script>
+	import uniTransition from '../uni-transition/uni-transition.vue'
+
+	/**
+	 * PopUp 弹出层
+	 * @description 弹出层组件,为了解决遮罩弹层的问题
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=329
+	 * @property {String} type = [top|center|bottom] 弹出方式
+	 * 	@value top 顶部弹出
+	 * 	@value center 中间弹出
+	 * 	@value bottom 底部弹出
+	 * @property {Boolean} animation = [ture|false] 是否开启动画
+	 * @property {Boolean} maskClick = [ture|false] 蒙版点击是否关闭弹窗
+	 * @event {Function} change 打开关闭弹窗触发,e={show: false}
+	 */
+
+	export default {
+		name: 'UniPopup',
+		components: {
+			uniTransition
+		},
+		props: {
+			// 开启动画
+			animation: {
+				type: Boolean,
+				default: true
+			},
+			// 弹出层类型,可选值,top: 顶部弹出层;bottom:底部弹出层;center:全屏弹出层
+			type: {
+				type: String,
+				default: 'center'
+			},
+			// maskClick
+			maskClick: {
+				type: Boolean,
+				default: true
+			}
+		},
+		data() {
+			return {
+				duration: 300,
+				ani: [],
+				showPopup: false,
+				showTrans: false,
+				maskClass: {
+					'position': 'fixed',
+					'bottom': 0,
+					'top': 0,
+					'left': 0,
+					'right': 0,
+					'backgroundColor': 'rgba(0, 0, 0, 0.4)'
+				},
+				transClass: {
+					'position': 'fixed',
+					'left': 0,
+					'right': 0,
+				}
+			}
+		},
+		watch: {
+			type: {
+				handler: function(newVal) {
+					switch (this.type) {
+						case 'top':
+							this.ani = ['slide-top']
+							this.transClass = {
+								'position': 'fixed',
+								'left': 0,
+								'right': 0,
+							}
+							break
+						case 'bottom':
+							this.ani = ['slide-bottom']
+							this.transClass = {
+								'position': 'fixed',
+								'left': 0,
+								'right': 0,
+								'bottom': 0
+							}
+							break
+						case 'center':
+							this.ani = ['zoom-out', 'fade']
+							this.transClass = {
+								'position': 'fixed',
+								/* #ifndef APP-NVUE */
+								'display': 'flex',
+								'flexDirection': 'column',
+								/* #endif */
+								'bottom': 0,
+								'left': 0,
+								'right': 0,
+								'top': 0,
+								'justifyContent': 'center',
+								'alignItems': 'center'
+							}
+
+							break
+					}
+				},
+				immediate: true
+			}
+		},
+		created() {
+			if (this.animation) {
+				this.duration = 300
+			} else {
+				this.duration = 0
+			}
+		},
+		methods: {
+			clear(e) {
+				// TODO nvue 取消冒泡
+				e.stopPropagation()
+			},
+			open() {
+				this.showPopup = true
+				this.$nextTick(() => {
+					clearTimeout(this.timer)
+					this.timer = setTimeout(() => {
+						this.showTrans = true
+					}, 50);
+				})
+				this.$emit('change', {
+					show: true
+				})
+			},
+			close(type) {
+				this.showTrans = false
+				this.$nextTick(() => {
+					clearTimeout(this.timer)
+					this.timer = setTimeout(() => {
+						this.$emit('change', {
+							show: false
+						})
+						this.showPopup = false
+					}, 300)
+				})
+			},
+			onTap() {
+				if (!this.maskClick) return
+				this.close()
+			}
+		}
+	}
+</script>
+<style lang="scss" scoped>
+	.uni-popup {
+		position: fixed;
+		/* #ifdef H5 */
+		top: var(--window-top);
+		/* #endif */
+		/* #ifndef H5 */
+		top: 0;
+		/* #endif */
+		bottom: 0;
+		left: 0;
+		right: 0;
+		/* #ifndef APP-NVUE */
+		z-index: 99;
+		/* #endif */
+	}
+
+	.uni-popup__mask {
+		position: absolute;
+		top: 0;
+		bottom: 0;
+		left: 0;
+		right: 0;
+		background-color: $uni-bg-color-mask;
+		opacity: 0;
+	}
+
+	.mask-ani {
+		transition-property: opacity;
+		transition-duration: 0.2s;
+	}
+
+	.uni-top-mask {
+		opacity: 1;
+	}
+
+	.uni-bottom-mask {
+		opacity: 1;
+	}
+
+	.uni-center-mask {
+		opacity: 1;
+	}
+
+	.uni-popup__wrapper {
+		/* #ifndef APP-NVUE */
+		display: block;
+		/* #endif */
+		position: absolute;
+	}
+
+	.top {
+		top: 0;
+		left: 0;
+		right: 0;
+		transform: translateY(-500px);
+	}
+
+	.bottom {
+		bottom: 0;
+		left: 0;
+		right: 0;
+		transform: translateY(500px);
+	}
+
+	.center {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		flex-direction: column;
+		/* #endif */
+		bottom: 0;
+		left: 0;
+		right: 0;
+		top: 0;
+		justify-content: center;
+		align-items: center;
+		transform: scale(1.2);
+		opacity: 0;
+	}
+
+	.uni-popup__wrapper-box {
+		/* #ifndef APP-NVUE */
+		display: block;
+		/* #endif */
+		position: relative;
+	}
+
+	.content-ani {
+		// transition: transform 0.3s;
+		transition-property: transform, opacity;
+		transition-duration: 0.2s;
+	}
+
+
+	.uni-top-content {
+		transform: translateY(0);
+	}
+
+	.uni-bottom-content {
+		transform: translateY(0);
+	}
+
+	.uni-center-content {
+		transform: scale(1);
+		opacity: 1;
+	}
+</style>

+ 262 - 145
components/uni-popup/uni-popup-share.vue

@@ -1,165 +1,282 @@
 <template>
-	<view class="uni-popup-share">
-		<view class="uni-share-title"><text class="uni-share-title-text">{{title}}</text></view>
-		<view class="uni-share-content">
-			<view class="uni-share-content-box">
-				<view class="uni-share-content-item" v-for="(item,index) in bottomData" :key="index" @click.stop="select(item,index)">
-					<image class="uni-share-image" :src="item.icon" mode="aspectFill"></image>
-					<text class="uni-share-text">{{item.text}}</text>
+	<view>
+		<uni-popup-ori ref="showshare" type="bottom">
+			<view class="uni-share">
+				<text class="uni-share-title">分享到</text>
+				<view class="uni-share-content">
+					<view v-for="(item, index) in bottomData" :key="index" class="uni-share-content-box" @click="shareTo(item.name)">
+						<view class="uni-share-content-image"><image :src="item.icon" class="content-image" mode="widthFix" /></view>
+						<text class="uni-share-content-text">{{ item.text }}</text>
+					</view>
 				</view>
-
+				<text class="uni-share-btn" @click="cancel()">取消分享</text>
+			</view>
+		</uni-popup-ori>
+		<uni-popup-ori ref="showPast" type="center" class="popupPast">
+			<view class="backPop">
+				<view class="popPast">
+					<view class="popTitle">口令已复制</view>
+					<view class="popContent">
+						<view>{{ describe }}</view>
+					</view>
+					<view class="popBtn" @click="goWhere(1)" v-if="popType == 'wx'">
+						<!-- <image src="../../static/spend/wxin.png" mode="widthFix"></image> -->
+						<view>去微信粘贴给好友</view>
+					</view>
+					<view class="popBtn" @click="goWhere(2)" v-if="popType == 'timeline'">
+						<!-- <image src="../../static/spend/wechat.png" mode="widthFix"></image> -->
+						<view>粘贴到朋友圈</view>
+					</view>
+				</view>
+				<icon type="cancel" size="26" color="white" style="margin-top: 40rpx;" @click="cancelPo" />
 			</view>
-		</view>
-		<view class="uni-share-button-box">
-			<button class="uni-share-button" @click="close">取消</button>
-		</view>
+		</uni-popup-ori>
 	</view>
 </template>
 
 <script>
-	export default {
-		name: 'UniPopupShare',
-		props: {
-			title: {
-				type: String,
-				default: '分享到'
-			}
-		},
-		inject: ['popup'],
-		data() {
-			return {
-				bottomData: [{
-						text: '微信',
-						icon: 'https://img-cdn-qiniu.dcloud.net.cn/uni-ui/grid-2.png',
-						name: 'wx'
-					},
-					{
-						text: '支付宝',
-						icon: 'https://img-cdn-qiniu.dcloud.net.cn/uni-ui/grid-8.png',
-						name: 'wx'
-					},
-					{
-						text: 'QQ',
-						icon: 'https://img-cdn-qiniu.dcloud.net.cn/uni-ui/gird-3.png',
-						name: 'qq'
-					},
-					{
-						text: '新浪',
-						icon: 'https://img-cdn-qiniu.dcloud.net.cn/uni-ui/grid-1.png',
-						name: 'sina'
-					},
-					{
-						text: '百度',
-						icon: 'https://img-cdn-qiniu.dcloud.net.cn/uni-ui/grid-7.png',
-						name: 'copy'
-					},
-					{
-						text: '其他',
-						icon: 'https://img-cdn-qiniu.dcloud.net.cn/uni-ui/grid-5.png',
-						name: 'more'
+import uniPopupOri from '@/components/uni-popup/uni-popup-ori.vue';
+import { mapState, mapMutations } from 'vuex';
+import { getActionPage } from '@/utils/loginUtils.js';
+export default {
+	name: 'SharePopup',
+	components: {
+		uniPopupOri
+	},
+	props: ['opt', 'type','option'],
+	data() {
+		return {
+			describe: '',
+			shareoption: '',
+			bottomData: [
+				{
+					text: '微信',
+					icon: '../../static/spend/wxin.png',
+					name: 'wx'
+				},
+				{
+					text: '朋友圈',
+					icon: '../../static/spend/wechat.png',
+					name: 'timeline'
+				}
+			],
+			popType: '',
+			uid: ''
+		};
+	},
+	computed: {
+		...mapState(['userInfo', 'baseURL'])
+	},
+	mounted() {},
+	methods: {
+		loadData() {
+			try {
+				let prePage = getActionPage();
+				var path = prePage.route;
+				this.uid = this.userInfo.uid;
+				//获取object转化成
+				var parm = '';
+				var i = 0;
+				var option = this.option; //其他页面传值
+				console.log(option,'option')
+				if(this.type == 4){
+					parm = parm + '?' + 'promo_code=' + option;
+				}else{
+					for (let item in option) {
+						//拼接参数
+						if (i == 0) {
+							parm = '?' + item + '=' + option[item];
+						} else {
+							parm = parm + '&' + item + '=' + option[item];
+						}
+						i++;
 					}
-				]
+				}
+				if(this.type == 4){
+					var url = 'pages/index/index' + parm;
+				}else{
+					var url = path + parm;
+				}
+				console.log(path,'path')
+				console.log(parm,'parm')
+				//用后台加密
+				//第一个参数是判断是不是我们的链接
+				//第二个参数是访问地址
+				//第三个参数是,类型,type:0商品,type=1拼团,type=2邀请注册,type=3邀请好友参团,type=4邀请好友助力
+				//第四个参数是share的id
+				console.log(option,'option')
+				if(this.type == 4){
+					this.describe = this.baseURL + '@' + url + '@' + this.type + '@' + this.uid + '@复制这段话进入美美赚,自动打开页面';
+				}else{
+					this.describe = this.baseURL + '@' + url + '@' + this.type + '@' + this.uid + '@复制这段话进入美美赚,自动打开页面';
+				}
+				console.log(this.describe);
+				let obj = this;
+				// #ifndef H5
+				uni.setClipboardData({
+					data: this.describe,
+					  success: function () {
+					        uni.hideToast();
+					    }
+				});
+				// #endif
+			} catch (e) {
+				console.log(e);
+				//TODO handle the exception
 			}
 		},
-		created() {},
-		methods: {
-			/**
-			 * 选择内容
-			 */
-			select(item, index) {
-				this.$emit('select', {
-					item,
-					index
-				}, () => {
-					this.popup.close()
-				})
-			},
-			/**
-			 * 关闭窗口
-			 */
-			close() {
-				this.popup.close()
-			}
+		goWhere(type) {
+			this.$api.msg('复制成功');
+		},
+		cancelPo() {
+			this.$nextTick(() => {
+				this.$refs['showPast'].close();
+			});
+		},
+		shareTo(name) {
+			this.popType = name;
+			this.$nextTick(() => {
+				this.$refs.showPast.open();
+				this.$refs['showshare'].close();
+			});
+		},
+		cancel() {
+			this.$nextTick(() => {
+				this.$refs['showshare'].close();
+			});
+		},
+		open() {
+			this.$nextTick(() => {
+				this.$refs['showshare'].open();
+			});
 		}
 	}
+};
 </script>
 <style lang="scss" scoped>
-	.uni-popup-share {
-		background-color: #fff;
-	}
-	.uni-share-title {
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		flex-direction: row;
-		align-items: center;
-		justify-content: center;
-		height: 40px;
+.backPop {
+	padding: 0rpx 25rpx;
+	display: flex;
+	flex-direction: column;
+	justify-content: center;
+	align-items: center;
+}
+.popupPast {
+	display: flex;
+	flex-direction: column;
+	justify-content: center;
+	align-items: center;
+	text-align: center;
+}
+.popPast {
+	display: flex;
+	flex-direction: column;
+	justify-content: center;
+	padding: 40rpx 30rpx;
+	width: 90%;
+	background-color: white;
+	border-radius: 18rpx;
+	align-items: center;
+	.popTitle {
+		color: #2f2f2f;
+		font-size: 32rpx;
+		font-weight: bold;
+		margin-bottom: 40rpx;
 	}
-	.uni-share-title-text {
-		font-size: 14px;
-		color: #666;
-	}
-	.uni-share-content {
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		flex-direction: row;
-		justify-content: center;
-		padding-top: 10px;
-	}
-	
-	.uni-share-content-box {
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		flex-direction: row;
-		flex-wrap: wrap;
-		width: 360px;
+	.popContent {
+		background-color: #f4f4f4;
+		padding: 30rpx 24rpx;
+		border-radius: 16rpx;
+		view {
+			font-size: 24rpx;
+			color: #939393;
+		}
+		margin-bottom: 40rpx;
 	}
-	
-	.uni-share-content-item {
-		width: 90px;
-		/* #ifndef APP-NVUE */
+	.popBtn {
 		display: flex;
-		/* #endif */
-		flex-direction: column;
-		justify-content: center;
-		padding: 10px 0;
 		align-items: center;
+		padding: 20rpx 40rpx;
+		background-color: #04be02;
+		border-radius: 60rpx;
+		image {
+			width: 36rpx;
+		}
+		view {
+			color: white;
+			font-size: 36rpx;
+			margin-left: 10rpx;
+		}
 	}
-	
-	.uni-share-content-item:active {
-		background-color: #f5f5f5;
-	}
-	
-	.uni-share-image {
-		width: 30px;
-		height: 30px;
-	}
-	
-	.uni-share-text {
-		margin-top: 10px;
-		font-size: 14px;
-		color: #3B4144;
-	}
-	
-	.uni-share-button-box {
-		/* #ifndef APP-NVUE */
-		display: flex;
-		/* #endif */
-		flex-direction: row;
-		padding: 10px 15px;
-	}
-	
-	.uni-share-button {
-		flex: 1;
-		border-radius: 50px;
-		color: #666;
-		font-size: 16px;
-	}
-	
-	.uni-share-button::after {
-		border-radius: 50px;
-	}
+}
+/* 底部分享 */
+.uni-share {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	flex-direction: column;
+	/* #endif */
+	background-color: #fff;
+}
+
+.uni-share-title {
+	line-height: 60rpx;
+	font-size: 24rpx;
+	padding: 15rpx 0;
+	text-align: center;
+}
+
+.uni-share-content {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	flex-direction: row;
+	flex-wrap: wrap;
+	justify-content: center;
+	padding: 15px;
+}
+
+.uni-share-content-box {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	flex-direction: column;
+	align-items: center;
+	width: 200rpx;
+}
+
+.uni-share-content-image {
+	/* #ifndef APP-NVUE */
+	display: flex;
+	/* #endif */
+	flex-direction: row;
+	justify-content: center;
+	align-items: center;
+	width: 60rpx;
+	height: 60rpx;
+	overflow: hidden;
+	border-radius: 10rpx;
+}
+
+.content-image {
+	width: 60rpx;
+	height: 60rpx;
+}
+
+.uni-share-content-text {
+	font-size: 26rpx;
+	color: #333;
+	padding-top: 5px;
+	padding-bottom: 10px;
+}
+
+.uni-share-btn {
+	height: 90rpx;
+	line-height: 90rpx;
+	font-size: 14px;
+	border-top-color: #f5f5f5;
+	border-top-width: 1px;
+	border-top-style: solid;
+	text-align: center;
+	color: #666;
+}
 </style>

+ 87 - 118
components/uni-popup/uni-popup.vue

@@ -1,7 +1,6 @@
 <template>
-	<view v-if="showPopup" class="uni-popup" :class="[popupstyle]" @touchmove.stop.prevent="clear">
-		<uni-transition v-if="maskShow" :mode-class="['fade']" :styles="maskClass" :duration="duration" :show="showTrans"
-		 @click="onTap" />
+	<view v-if="showPopup" class="uni-popup" @touchmove.stop.prevent="clear">
+		<uni-transition :mode-class="['fade']" :styles="maskClass" :duration="duration" :show="showTrans" @click="onTap" />
 		<uni-transition :mode-class="ani" :styles="transClass" :duration="duration" :show="showTrans" @click="onTap">
 			<view class="uni-popup__wrapper-box" @click.stop="clear">
 				<slot />
@@ -12,7 +11,7 @@
 
 <script>
 	import uniTransition from '../uni-transition/uni-transition.vue'
-	import popup from './popup.js'
+
 	/**
 	 * PopUp 弹出层
 	 * @description 弹出层组件,为了解决遮罩弹层的问题
@@ -21,9 +20,6 @@
 	 * 	@value top 顶部弹出
 	 * 	@value center 中间弹出
 	 * 	@value bottom 底部弹出
-	 * 	@value message 消息提示
-	 * 	@value dialog 对话框
-	 * 	@value share 底部分享示例
 	 * @property {Boolean} animation = [ture|false] 是否开启动画
 	 * @property {Boolean} maskClick = [ture|false] 蒙版点击是否关闭弹窗
 	 * @event {Function} change 打开关闭弹窗触发,e={show: false}
@@ -41,7 +37,6 @@
 				default: true
 			},
 			// 弹出层类型,可选值,top: 顶部弹出层;bottom:底部弹出层;center:全屏弹出层
-			// message: 消息提示 ; dialog : 对话框
 			type: {
 				type: String,
 				default: 'center'
@@ -52,30 +47,6 @@
 				default: true
 			}
 		},
-		provide() {
-			return {
-				popup: this
-			}
-		},
-		mixins: [popup],
-		watch: {
-			/**
-			 * 监听type类型
-			 */
-			type: {
-				handler: function(newVal) {
-					this[this.config[newVal]]()
-				},
-				immediate: true
-			},
-			/**
-			 * 监听遮罩是否可点击
-			 * @param {Object} val
-			 */
-			maskClick(val) {
-				this.mkclick = val
-			}
-		},
 		data() {
 			return {
 				duration: 300,
@@ -94,14 +65,53 @@
 					'position': 'fixed',
 					'left': 0,
 					'right': 0,
+				}
+			}
+		},
+		watch: {
+			type: {
+				handler: function(newVal) {
+					switch (this.type) {
+						case 'top':
+							this.ani = ['slide-top']
+							this.transClass = {
+								'position': 'fixed',
+								'left': 0,
+								'right': 0,
+							}
+							break
+						case 'bottom':
+							this.ani = ['slide-bottom']
+							this.transClass = {
+								'position': 'fixed',
+								'left': 0,
+								'right': 0,
+								'bottom': 0
+							}
+							break
+						case 'center':
+							this.ani = ['zoom-out', 'fade']
+							this.transClass = {
+								'position': 'fixed',
+								/* #ifndef APP-NVUE */
+								'display': 'flex',
+								'flexDirection': 'column',
+								/* #endif */
+								'bottom': 0,
+								'left': 0,
+								'right': 0,
+								'top': 0,
+								'justifyContent': 'center',
+								'alignItems': 'center'
+							}
+
+							break
+					}
 				},
-				maskShow: true,
-				mkclick: true,
-				popupstyle: 'top'
+				immediate: true
 			}
 		},
 		created() {
-			this.mkclick = this.maskClick
 			if (this.animation) {
 				this.duration = 300
 			} else {
@@ -116,91 +126,30 @@
 			open() {
 				this.showPopup = true
 				this.$nextTick(() => {
-					new Promise(resolve => {
-						clearTimeout(this.timer)
-						this.timer = setTimeout(() => {
-							this.showTrans = true
-							// fixed by mehaotian 兼容 app 端
-							this.$nextTick(() => {
-								resolve();
-							})
-						}, 50);
-					}).then(res => {
-						// 自定义打开事件
-						clearTimeout(this.msgtimer)
-						this.msgtimer = setTimeout(() => {
-							this.customOpen && this.customOpen()
-						}, 100)
-						this.$emit('change', {
-							show: true,
-							type: this.type
-						})
-					})
+					clearTimeout(this.timer)
+					this.timer = setTimeout(() => {
+						this.showTrans = true
+					}, 50);
+				})
+				this.$emit('change', {
+					show: true
 				})
 			},
 			close(type) {
 				this.showTrans = false
 				this.$nextTick(() => {
-					this.$emit('change', {
-						show: false,
-						type: this.type
-					})
 					clearTimeout(this.timer)
-					// 自定义关闭事件
-					this.customOpen && this.customClose()
 					this.timer = setTimeout(() => {
+						this.$emit('change', {
+							show: false
+						})
 						this.showPopup = false
 					}, 300)
 				})
 			},
 			onTap() {
-				if (!this.mkclick) return
+				if (!this.maskClick) return
 				this.close()
-			},
-			/**
-			 * 顶部弹出样式处理
-			 */
-			top() {
-				this.popupstyle = 'top'
-				this.ani = ['slide-top']
-				this.transClass = {
-					'position': 'fixed',
-					'left': 0,
-					'right': 0,
-				}
-			},
-			/**
-			 * 底部弹出样式处理
-			 */
-			bottom() {
-				this.popupstyle = 'bottom'
-				this.ani = ['slide-bottom']
-				this.transClass = {
-					'position': 'fixed',
-					'left': 0,
-					'right': 0,
-					'bottom': 0
-				}
-			},
-			/**
-			 * 中间弹出样式处理
-			 */
-			center() {
-				this.popupstyle = 'center'
-				this.ani = ['zoom-out', 'fade']
-				this.transClass = {
-					'position': 'fixed',
-					/* #ifndef APP-NVUE */
-					'display': 'flex',
-					'flexDirection': 'column',
-					/* #endif */
-					'bottom': 0,
-					'left': 0,
-					'right': 0,
-					'top': 0,
-					'justifyContent': 'center',
-					'alignItems': 'center'
-				}
 			}
 		}
 	}
@@ -208,6 +157,15 @@
 <style lang="scss" scoped>
 	.uni-popup {
 		position: fixed;
+		/* #ifdef H5 */
+		top: var(--window-top);
+		/* #endif */
+		/* #ifndef H5 */
+		top: 0;
+		/* #endif */
+		bottom: 0;
+		left: 0;
+		right: 0;
 		/* #ifndef APP-NVUE */
 		z-index: 99;
 		/* #endif */
@@ -248,16 +206,32 @@
 	}
 
 	.top {
-		/* #ifdef H5 */
-		top: var(--window-top);
-		/* #endif */
-		/* #ifndef H5 */
 		top: 0;
-		/* #endif */
+		left: 0;
+		right: 0;
+		transform: translateY(-500px);
 	}
 
 	.bottom {
 		bottom: 0;
+		left: 0;
+		right: 0;
+		transform: translateY(500px);
+	}
+
+	.center {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		flex-direction: column;
+		/* #endif */
+		bottom: 0;
+		left: 0;
+		right: 0;
+		top: 0;
+		justify-content: center;
+		align-items: center;
+		transform: scale(1.2);
+		opacity: 0;
 	}
 
 	.uni-popup__wrapper-box {
@@ -265,11 +239,6 @@
 		display: block;
 		/* #endif */
 		position: relative;
-		/* iphonex 等安全区设置,底部安全区适配 */
-		/* #ifndef APP-NVUE */
-		padding-bottom: constant(safe-area-inset-bottom);
-		padding-bottom: env(safe-area-inset-bottom);
-		/* #endif */
 	}
 
 	.content-ani {

+ 244 - 0
components/uni-steps/uni-steps.vue

@@ -0,0 +1,244 @@
+<template>
+	<view class="uni-steps">
+		<view :class="[direction==='column'?'uni-steps__column':'uni-steps__row']">
+			<view :class="[direction==='column'?'uni-steps__column-text-container':'uni-steps__row-text-container']">
+				<view v-for="(item,index) in options" :key="index" :class="[direction==='column'?'uni-steps__column-text':'uni-steps__row-text']">
+					<text :style="{color:index<=active?activeColor:deactiveColor}" :class="[direction==='column'?'uni-steps__column-title':'uni-steps__row-title']">{{item.status}}</text>
+					<text :style="{color:index<=active?activeColor:deactiveColor}" :class="[direction==='column'?'uni-steps__column-desc':'uni-steps__row-desc']">{{item.context}}</text>
+					<text :style="{color:index<=active?activeColor:deactiveColor}" :class="[direction==='column'?'uni-steps__column-desc':'uni-steps__row-desc']">{{item.time}}</text>
+				</view>
+			</view>
+			<view :class="[direction==='column'?'uni-steps__column-container':'uni-steps__row-container']">
+				<view :class="[direction==='column'?'uni-steps__column-line-item':'uni-steps__row-line-item']" v-for="(item,index) in options"
+				 :key="index">
+					<view :class="[direction==='column'?'uni-steps__column-line':'uni-steps__row-line',direction==='column'?'uni-steps__column-line--before':'uni-steps__row-line--before']"
+					 :style="{backgroundColor:index<=active&&index!==0?activeColor:index===0?'transparent':deactiveColor}"></view>
+					<view :class="[direction==='column'?'uni-steps__column-check':'uni-steps__row-check']" v-if="index === active">
+						<uni-icons :color="activeColor" type="checkbox-filled" size="14"></uni-icons>
+					</view>
+					<view :class="[direction==='column'?'uni-steps__column-circle':'uni-steps__row-circle']" v-else :style="{backgroundColor:index<active?activeColor:deactiveColor}"></view>
+					<view :class="[direction==='column'?'uni-steps__column-line':'uni-steps__row-line',direction==='column'?'uni-steps__column-line--after':'uni-steps__row-line--after']"
+					 :style="{backgroundColor:index<active&&index!==options.length-1?activeColor:index===options.length-1?'transparent':deactiveColor}"></view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import uniIcons from '../uni-icons/uni-icons.vue'
+	export default {
+		name: 'UniSteps',
+		components: {
+			uniIcons
+		},
+		props: {
+			direction: {
+				// 排列方向 row column
+				type: String,
+				default: 'row'
+			},
+			activeColor: {
+				// 激活状态颜色
+				type: String,
+				default: '#1aad19'
+			},
+			deactiveColor: {
+				// 未激活状态颜色
+				type: String,
+				default: '#999999'
+			},
+			active: {
+				// 当前步骤
+				type: Number,
+				default: 0
+			},
+			options: {
+				type: Array,
+				default () {
+					return []
+				}
+			} // 数据
+		},
+		data() {
+			return {}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.uni-steps {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		width: 100%;
+		/* #endif */
+		/* #ifdef APP-NVUE */
+		flex: 1;
+		/* #endif */
+		flex-direction: column;
+	}
+
+	.uni-steps__row {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+	}
+
+	.uni-steps__column {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row-reverse;
+	}
+
+	.uni-steps__row-text-container {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+	}
+
+	.uni-steps__column-text-container {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		flex: 1;
+	}
+
+	.uni-steps__row-text {
+		/* #ifndef APP-NVUE */
+		display: inline-flex;
+		/* #endif */
+		flex: 1;
+		flex-direction: column;
+	}
+
+	.uni-steps__column-text {
+		padding: 6px 0px;
+		border-bottom-style: solid;
+		border-bottom-width: 1px;
+		border-bottom-color: $uni-border-color;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+	}
+
+	.uni-steps__row-title {
+		font-size: $uni-font-size-base;
+		line-height: 16px;
+		text-align: center;
+	}
+
+	.uni-steps__column-title {
+		font-size: $uni-font-size-base;
+		text-align: left;
+		line-height: 18px;
+	}
+
+	.uni-steps__row-desc {
+		font-size: 12px;
+		line-height: 14px;
+		text-align: center;
+	}
+
+	.uni-steps__column-desc {
+		font-size: $uni-font-size-sm;
+		text-align: left;
+		line-height: 18px;
+	}
+
+	.uni-steps__row-container {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+	}
+
+	.uni-steps__column-container {
+		/* #ifndef APP-NVUE */
+		display: inline-flex;
+		/* #endif */
+		width: 30px;
+		flex-direction: column;
+	}
+
+	.uni-steps__row-line-item {
+		/* #ifndef APP-NVUE */
+		display: inline-flex;
+		/* #endif */
+		flex-direction: row;
+		flex: 1;
+		height: 14px;
+		line-height: 14px;
+		align-items: center;
+		justify-content: center;
+	}
+
+	.uni-steps__column-line-item {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		flex: 1;
+		align-items: center;
+		justify-content: center;
+	}
+
+	.uni-steps__row-line {
+		flex: 1;
+		height: 1px;
+		background-color: $uni-text-color-grey;
+	}
+
+	.uni-steps__column-line {
+		width: 1px;
+		background-color: $uni-text-color-grey;
+	}
+
+	.uni-steps__row-line--after {
+		transform: translateX(1px);
+	}
+
+	.uni-steps__column-line--after {
+		flex: 1;
+		transform: translate(0px, 1px);
+	}
+
+	.uni-steps__row-line--before {
+		transform: translateX(-1px);
+	}
+
+	.uni-steps__column-line--before {
+		height: 6px;
+		transform: translate(0px, -1px);
+	}
+
+	.uni-steps__row-circle {
+		width: 5px;
+		height: 5px;
+		border-radius: 100px;
+		background-color: $uni-text-color-grey;
+		margin: 0px 3px;
+	}
+
+	.uni-steps__column-circle {
+		width: 5px;
+		height: 5px;
+		border-radius: 100px;
+		background-color: $uni-text-color-grey;
+		margin: 4px 0px 5px 0px;
+	}
+
+	.uni-steps__row-check {
+		margin: 0px 6px;
+	}
+
+	.uni-steps__column-check {
+		height: 14px;
+		line-height: 14px;
+		margin: 2px 0px;
+	}
+</style>

+ 1 - 1
components/wangding-pickerAddress/wangding-pickerAddress.vue

@@ -6,7 +6,7 @@
 
 <script>
 	import AllAddress from './data.js'
-	let selectVal = ['','','']
+	let selectVal = ['','',''];
 	
 	export default {
 		data() {

+ 0 - 280
components/xuan-popup/xuan-popup.vue

@@ -1,280 +0,0 @@
-<!-- 
- *属性 isdistance 每个弹窗之间是否有间距
- *数组形式传值
- *type,类型 success warn info err loading(string)
- *content,内容(string)
- *timeout,消失时间(Number)
- *isClick,是否点击消失(Boolean)
- -->
-<template>
-	<view class="popup_list">
-		<view v-for="(items,index) of popup_list" :id="items.uuid" :key="items.uuid" >
-			<view class="mpopup" :style="{ background: items.color ,top:index*distance+45+'px'}" :class="[items.animator,items.typeClass]" @click="close(items.uuid,index)">
-				<view class="pic"><image class="icon" mode="aspectFit" :src="items.icon"></image></view>
-				<text class="text" :style="{ color: items.colortext }">{{ items.content }}</text>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	export default{
-		data(){
-			return{
-				popup_list:[],//弹窗数组
-				distance:65//每个弹窗之间间距
-			}
-		},
-		props:{
-			//是否有间距
-			isdistance:{
-				type:Boolean,
-				default:true
-			},
-			
-		},
-		methods:{
-			init:function(list){			
-				if (list.type == 'success') {
-					list.icon = '../../static/xuan-popup/success.png';
-					list.typeClass='mpopup-success';
-					return list;
-				}
-				if (list.type == 'warn') {
-					list.icon = '../../static/xuan-popup/warn.png';
-					list.typeClass='mpopup-warn';
-					return list;
-				}
-				if (list.type == 'info') {
-					list.icon = '../../static/xuan-popup/info.png';
-					list.typeClass='mpopup-info';
-					return list;
-				}
-				if (list.type == 'err') {
-					list.icon = '../../static/xuan-popup/err.png';
-					list.typeClass='mpopup-err';
-					return list;
-				}
-				if (list.type == 'loading') {
-					list.icon = '../../static/xuan-popup/loading.png';
-					list.typeClass='mpopup-loading';
-					return list;
-				}
-			},
-			open:function(list){
-				if(!this.isdistance){this.distance=0}
-				//生成uuid
-				let uuid=this.guid();
-				list.uuid=uuid;
-				//添加动画
-				list.animator='fade_Down';
-				//判断是否可点击消失/可控制消失
-				if(typeof(list.isClick)!='boolean'){list.isClick=false;}
-				//if(typeof(list.isControl)!='boolean'){list.isControl=false;}
-				
-				//初始化
-				let new_list=this.init(list);		
-				//添加进数组
-				this.popup_list.push(new_list);
-		
-				if(!new_list.isClick){
-					this.disappear(new_list.uuid,new_list.timeout);
-				}//可点击消失
-				else{
-					this.$emit('uuidCallback',new_list.uuid);
-				}
-				// else if(new_list.isControl){
-				// 	this.$emit('Callback',new_list.uuid);
-				// }
-				
-			},
-			//自动消失
-			disappear:function(uuid,timeout){
-				//退出动画之后,短暂延迟后移除本元素
-				this.fade_out_animator(uuid,timeout).then(res=>{
-					setTimeout(()=>{
-						for(let i=0;i<this.popup_list.length;i++){
-							if(this.popup_list[i].uuid==res){
-								//移除本元素
-								this.popup_list.splice(i,1);
-								this.$forceUpdate()
-							}
-						}
-					},250)
-				});
-			},
-			fade_out_animator:function(uuid,timeout){
-				//timeout秒后退出
-				if(!timeout||typeof(timeout)!='number'){timeout=3000;}
-				return new Promise(res=>{
-					setTimeout(()=>{
-						for(let i=0;i<this.popup_list.length;i++){
-							if(this.popup_list[i].uuid==uuid){
-								//添加退出动画
-								this.popup_list[i].animator='fade_Top';
-								res(uuid);
-							}
-						}
-					},timeout)
-				})
-			},
-			//可控制关闭的弹出框
-			close:function(uuid,ind){
-				if(ind){
-					if(!this.popup_list[ind].isClick){return}
-				}
-				this.remove_element(uuid).then((res)=>{
-					setTimeout(()=>{
-						for(let i=0;i<this.popup_list.length;i++){
-							if(this.popup_list[i].uuid==res){
-								//移除本元素
-								this.popup_list.splice(i,1);
-								this.$emit('closeCallback',uuid);
-								this.$forceUpdate()
-							}
-						}
-					},250)
-				})
-			},
-			//控制移除元素
-			remove_element:function(uuid){
-				return new Promise(res=>{
-					for (var i = 0; i < this.popup_list.length; i++) {
-						if(this.popup_list[i].uuid==uuid){
-							this.popup_list[i].animator='fade_Top';
-							res(uuid)
-							break;
-						} 
-					}
-				})
-				
-			},
-			//更新
-			update:function(update_list){
-				for (var i = 0; i < this.popup_list.length; i++) {
-					if(this.popup_list[i].uuid==update_list.uuid){
-						this.popup_list[i].type=update_list.type;
-						this.init(this.popup_list[i]);
-						this.popup_list[i].content=update_list.content;
-						break;
-					} 
-				}
-			},
-			//生成uuid
-			guid:function() {
-			    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
-			        var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
-			        return v.toString(16);
-			    });
-			}
-		}
-	}
-</script>
-
-<style lang="scss">
-	.mpopup{
-		display: flex;
-		flex-direction: row;
-		text-align: center;
-		justify-content: center;
-		align-items: center;
-		min-height: 45px;
-		width: 550rpx;
-		transition :all .5s;
-		position: fixed;
-		left: 0;
-		right: 0;
-		margin: 0 auto;
-		border-radius: 5px;	
-		z-index:998;
-		.pic{
-			display: flex;
-			text-align: center;
-			justify-content: center;
-			width: 15px;
-			height: 15px;
-			margin: auto 20px auto 0;
-			.icon{
-				width: 100%;
-				height: auto;
-			}
-		}
-		.text{
-			margin: auto 20px auto 0;
-			width: 65%;
-			font-size: 16px;
-		}
-	}
-	.mpopup-success{
-		background: #f0f9eb;
-		border: 1px solid #e1f3d8;
-		color: #67c23a;
-	}
-	.mpopup-err{
-		background: #fef0f0;
-		border: 1px solid #fde2e2;
-		color: #f56c6c;
-	}
-	.mpopup-warn{
-		background: #fdf6ec;
-		border: 1px solid #faecd8;
-		color: #e6a23c;
-	}
-	.mpopup-info{
-		background: #edf2fc;
-		border: 1px solid #ebeef5;
-		color: #909399;
-	}
-	.mpopup-loading{
-		background: #e2f5ff;
-		border: 1px solid #ceeeff;
-		color: #5cbaff;
-		image{
-			animation: rotate360 1.5s ease infinite;
-		}
-	}
-	.fade_Down{
-		animation: fadeInDown 0.6s both;
-	}
-	.fade_Top{
-		animation: fadeInTop 0.5s forwards;
-	}
-	/*从上到下*/
-	@keyframes fadeInDown
-	{
-	    from {
-	        opacity: 0;
-	        -webkit-transform: translate(0,-100px); 
-	        transform: stranslate(0,-100px); 
-	    }
-	    to {
-	        opacity:1;
-	        -webkit-transform: translate(0,10px);
-	        transform: stranslate(0,10px);
-	    }
-	}
-	/*从下到上*/
-	@keyframes fadeInTop
-	{
-	    from {
-	        opacity:1;
-	        -webkit-transform: translate(0,10px); 
-	        transform: stranslate(0,10px);
-	    }
-	    to {
-	
-			opacity: 0;
-			-webkit-transform: translate(0,-100px);
-			transform: stranslate(0,-100px);
-	    }
-	}
-	@keyframes rotate360
-	{
-		from {
-			transform: rotate(0);
-		}
-		to{
-			transform: rotate(360deg);
-		}
-	}
-</style>

+ 18 - 0
config/app.js

@@ -0,0 +1,18 @@
+module.exports = {
+	// 请求域名 格式: https://您的域名
+	
+	HTTP_REQUEST_URL:'http://base.liuniu946.com',
+
+	
+	
+	// #ifdef H5
+	// HTTP_REQUEST_URL: window.location.protocol+"//"+window.location.host,
+	// #endif
+	HEADER:{
+		'content-type': 'application/json'
+	},
+	// 回话密钥名称 请勿修改此配置
+	TOKENNAME: 'Authori-zation',
+	// 缓存时间 0 永久
+	EXPIRE:0,
+};

+ 32 - 0
config/cache.js

@@ -0,0 +1,32 @@
+module.exports = {
+	//token
+	LOGIN_STATUS: 'LOGIN_STATUS_TOKEN',
+	// uid
+	UID:'UID',
+	//�û�
+	USER_INFO: 'USER_INFO',
+	//token�����¼�
+	EXPIRES_TIME: 'EXPIRES_TIME',
+	//�Ƿ���Ȩ
+	WX_AUTH: 'WX_AUTH',
+	//���ں���Ȩcode
+	STATE_KEY: 'wx_authorize_state',
+	//�û�����
+	LOGINTYPE: 'loginType',
+	//���ں���ת����
+	BACK_URL: 'login_back_url',
+	// ����code
+	STATE_R_KEY: 'roution_authorize_state',
+	//��ȨlogoС����
+	LOGO_URL: 'LOGO_URL',
+	//模板缓存
+	SUBSCRIBE_MESSAGE: 'SUBSCRIBE_MESSAGE',
+
+	TIPS_KEY: 'TIPS_KEY',
+
+	SPREAD: 'spread',
+	//缓存经度
+	CACHE_LONGITUDE: 'LONGITUDE',
+	//缓存纬度
+	CACHE_LATITUDE: 'LATITUDE',
+}

+ 0 - 34
interceptor.js

@@ -1,34 +0,0 @@
-// 应用打开后拦截
-const loadRouter = function() {
-	// 获取上个页面
-	let pages = getCurrentPages();
-	let prePage = pages[pages.length - 2];
-	// #ifdef H5
-	let page =  prePage;
-	// #endif
-	// #ifdef APP-PLUS
-	let page = prePage.$vm;
-	// #endif
-	interceptor(page,prePage)
-}
-// 路由拦截
-/**
- * @param {Object} now 当前页面
- * @param {Object} before 上一个页面
- */
-const interceptor = function(now,before) {
-	// 获取用户信息判断是否登录过
-	let userInfo = uni.getStorageSync('userInfo') || '';
-	// 判断是否需要拦截
-	let state = uni.getStorageSync('loginInterceptor');
-	// 判断是否需要拦截
-	if (state) {
-		// 拦截条件
-		if (!userInfo.id) {
-			uni.navigateTo({
-				url: '/pages/public/login'
-			})
-		}
-	}
-}
-export default loadRouter

+ 39 - 0
libs/log.js

@@ -0,0 +1,39 @@
+
+const logLength=100;//缓存存储上限
+const name = 'log';//缓存名字
+export function addLog (data,content='') {
+	let log = uni.getStorageSync(name)||[];
+	log.unshift({
+		title:data,
+		content:content
+	});
+	uni.setStorageSync(name,log);
+	initLog(log);
+}
+
+
+export function delLog () {
+	return uni.setStorageSync(name,'');
+}
+
+export function getLog () {
+	return uni.getStorageSync(name);
+}
+
+export function initLog (log) {
+	if(log.length>logLength){
+		const newarr = log.slice(log.length-logLength);
+		uni.setStorageSync(name,newarr);
+	}
+}
+export function showLog (log) {
+	
+	let str = '';
+	uni.getStorageSync(name).forEach((e) => {
+		str+=e.title+':'+JSON.stringify(e.content)
+	})
+	uni.showModal({
+		title:"日志",
+		content:str
+	})
+}

+ 84 - 0
libs/login.js

@@ -0,0 +1,84 @@
+import store from "../store";
+import Cache from '../utils/cache';
+// #ifdef H5 || APP-PLUS
+import {
+	isWeixin
+} from "../utils";
+import auth from './wechat';
+// #endif
+
+import {
+	LOGIN_STATUS,
+	USER_INFO,
+	EXPIRES_TIME,
+	STATE_R_KEY
+} from './../config/cache';
+
+function prePage() {
+	let pages = getCurrentPages();
+	let prePage = pages[pages.length - 2];
+	// #ifdef H5
+	return prePage;
+	// #endif
+	return prePage.$vm;
+}
+
+export function toLogin(push, pathLogin) {
+	// store.commit("LOGOUT");
+	let path = prePage();
+	if (path) {
+		path = path.router;
+		if (path == undefined) {
+			path = location.pathname;
+		}
+	}
+	// #ifdef H5
+	else {
+		path = location.pathname;
+	}
+	// #endif
+
+	if (!pathLogin)
+		pathLogin = '/page/users/login/index'
+	Cache.set('login_back_url', path);
+	// #ifdef H5 || APP-PLUS
+	if (isWeixin()) {
+		auth.oAuth();
+	} else {
+		if (path !== pathLogin) {
+			push ? uni.navigateTo({
+				url: '/pages/users/login/index'
+			}) : uni.reLaunch({
+				url: '/pages/users/login/index'
+			});
+		}
+	}
+	// #endif
+
+	// #ifdef MP 
+
+
+	// #endif
+}
+
+
+export function checkLogin() {
+	let token = Cache.get(LOGIN_STATUS);
+	let expiresTime = Cache.get(EXPIRES_TIME);
+	let newTime = Math.round(new Date() / 1000);
+	if (expiresTime < newTime || !token) {
+		Cache.clear(LOGIN_STATUS);
+		Cache.clear(EXPIRES_TIME);
+		Cache.clear(USER_INFO);
+		Cache.clear(STATE_R_KEY);
+		return false;
+	} else {
+		store.commit('UPDATE_LOGIN', token);
+		let userInfo = Cache.get(USER_INFO, true);
+		if (userInfo) {
+			store.commit('UPDATE_USERINFO', userInfo);
+		}
+		return true;
+	}
+
+}

+ 253 - 0
libs/wechat.js

@@ -0,0 +1,253 @@
+// #ifdef H5
+import WechatJSSDK from "@/plugin/jweixin-module/index.js";
+// #endif
+
+import {
+	wechatConfig,
+	wechatAuth
+} from "@/api/wx.js";
+import {
+	WX_AUTH,
+	STATE_KEY,
+	LOGINTYPE,
+	BACK_URL
+} from '@/config/cache';
+import {
+	parseQuery
+} from '@/utils';
+import store from '@/store';
+import Cache from '@/utils/cache';
+
+class AuthWechat {
+	// #ifdef H5
+	constructor() {
+		//微信实例化对象
+		this.instance = WechatJSSDK;
+		//是否实例化
+		this.status = false;
+
+		this.initConfig = {};
+
+	}
+	// #endif
+	
+	isAndroid(){
+		let u = navigator.userAgent;
+		return u.indexOf('Android') > -1 || u.indexOf('Adr') > -1;
+	}
+
+	/**
+	 * 初始化wechat(分享配置)
+	 */
+	wechat() {
+		return new Promise((resolve, reject) => {
+			// if (this.status && !this.isAndroid()) return resolve(this.instance);
+			wechatConfig()
+				.then(res => {
+					this.instance.config(res.data);
+					this.initConfig = res.data;
+					this.status = true;
+					this.instance.ready(() => {
+						resolve(this.instance);
+					})
+				}).catch(err => {
+					console.log(err);
+					this.status = false;
+					reject(err);
+				});
+		});
+	}
+
+	/**
+	 * 验证是否初始化
+	 */
+	verifyInstance() {
+		let that = this;
+		return new Promise((resolve, reject) => {
+			if (that.instance === null && !that.status) {
+				that.wechat().then(res => {
+					resolve(that.instance);
+				}).catch(() => {
+					return reject();
+				})
+			} else {
+				return resolve(that.instance);
+			}
+		})
+	}
+	// 微信公众号的共享地址
+	openAddress() {
+		return new Promise((resolve, reject) => {
+			this.wechat().then(wx => {
+				this.toPromise(wx.openAddress).then(res => {
+					resolve(res);
+				}).catch(err => {
+					reject(err);
+				});
+			}).catch(err => {
+				reject(err);
+			})
+		});
+	}
+
+	/**
+	 * 微信支付
+	 * @param {Object} config
+	 */
+	pay(config) {
+		return new Promise((resolve, reject) => {
+			this.wechat().then((wx) => {
+				this.toPromise(wx.chooseWXPay, config).then(res => {
+					resolve(res);
+				}).catch(res => {
+					reject(res);
+				});
+			}).catch(res => {
+				reject(res);
+			});
+		});
+	}
+
+	toPromise(fn, config = {}) {
+		return new Promise((resolve, reject) => {
+			fn({
+				...config,
+				success(res) {
+					resolve(res);
+				},
+				fail(err) {
+					reject(err);
+				},
+				complete(err) {
+					reject(err);
+				},
+				cancel(err) {
+					reject(err);
+				}
+			});
+		});
+	}
+
+	/**
+	 * 自动去授权
+	 */
+	oAuth() {
+		if (uni.getStorageSync(WX_AUTH) && store.state.app.token) return;
+		const {
+			code
+		} = parseQuery();
+		if (!code) return this.toAuth();
+	}
+
+	clearAuthStatus() {
+
+	}
+
+	/**
+	 * 授权登陆获取token
+	 * @param {Object} code
+	 */
+	auth(code) {
+		return new Promise((resolve, reject) => {
+			let loginType = Cache.get(LOGINTYPE);
+			wechatAuth(code, parseInt(Cache.get("spread")), loginType)
+				.then(({
+					data
+				}) => {
+					let expires_time = data.expires_time.substring(0, 19);
+					expires_time = expires_time.replace(/-/g, '/');
+					expires_time = new Date(expires_time).getTime();
+					let newTime = Math.round(new Date() / 1000);
+					store.commit("LOGIN", {
+						token: data.token,
+						time: expires_time - newTime
+					});
+					Cache.set(WX_AUTH, code);
+					Cache.clear(STATE_KEY);
+					loginType && Cache.clear(LOGINTYPE);
+					resolve();
+				})
+				.catch(reject);
+		});
+	}
+
+	/**
+	 * 获取跳转授权后的地址
+	 * @param {Object} appId
+	 */
+	getAuthUrl(appId) {
+		const redirect_uri = encodeURIComponent(
+			`${location.origin}/pages/auth/index?back_url=` +
+			encodeURIComponent(
+				encodeURIComponent(
+					uni.getStorageSync(BACK_URL) ?
+					uni.getStorageSync(BACK_URL) :
+					location.pathname + location.search
+				)
+			)
+		);
+		uni.removeStorageSync(BACK_URL);
+		const state = encodeURIComponent(
+			("" + Math.random()).split(".")[1] + "authorizestate"
+		);
+		uni.setStorageSync(STATE_KEY, state);
+		return `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appId}&redirect_uri=${redirect_uri}&response_type=code&scope=snsapi_userinfo&state=${state}#wechat_redirect`;
+	}
+
+	/**
+	 * 跳转自动登陆
+	 */
+	toAuth() {
+		let that = this;
+		this.wechat().then(wx => {
+			location.href = this.getAuthUrl(that.initConfig.appId);
+		})
+	}
+
+	/**
+	 * 绑定事件
+	 * @param {Object} name 事件名
+	 * @param {Object} config 参数
+	 */
+	wechatEvevt(name, config) {
+		let that = this;
+		return new Promise((resolve, reject) => {
+			let configDefault = {
+				fail(res) {
+					console.log(res,11111);
+					if (that.instance) return reject({
+						is_ready: true,
+						wx: that.instance
+					});
+					that.verifyInstance().then(wx => {
+						return reject({
+							is_ready: true,
+							wx: wx
+						});
+					})
+				},
+				success(res) {
+					return resolve(res,2222);
+				}
+			};
+			Object.assign(configDefault, config);
+			that.wechat().then(wx => {
+				if (typeof name === 'object') {
+					name.forEach(item => {
+						wx[item] && wx[item](configDefault)
+					})
+				} else {
+					wx[name] && wx[name](configDefault)
+				}
+			})
+		});
+	}
+
+	isWeixin() {
+		return navigator.userAgent.toLowerCase().indexOf("micromessenger") !== -1;
+	}
+
+}
+
+export default new AuthWechat();
+

+ 0 - 2
main.js

@@ -1,8 +1,6 @@
 import Vue from 'vue'
 import store from './store'
 import App from './App'
-import uView from "uview-ui";
-Vue.use(uView);
 /**
  *  所有测试用数据均存放于根目录json.js
  *  

+ 26 - 123
manifest.json

@@ -1,13 +1,10 @@
 {
-    "name" : "满园春线上商城",
-    "appid" : "__UNI__BDCC031",
+    "name" : "鼎立足行",
+    "appid" : "__UNI__F0EBD91",
     "description" : "",
     "versionName" : "1.0.0",
-    "versionCode" : 100,
+    "versionCode" : "100",
     "transformPx" : false,
-    "uniStatistics" : {
-        "enable" : false //全局关闭  
-    },
     "app-plus" : {
         /* 5+App特有相关 */
         "usingComponents" : true,
@@ -17,123 +14,41 @@
             "autoclose" : true,
             "delay" : 0
         },
-        "modules" : {
-            "OAuth" : {},
-            "Share" : {},
-            "Payment" : {},
-            "Geolocation" : {},
-            "Maps" : {}
-        },
+        "modules" : {},
         /* 模块配置 */
         "distribute" : {
             /* 应用发布信息 */
             "android" : {
                 /* android打包配置 */
                 "permissions" : [
-                    "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
-                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
                     "<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
+                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
                     "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.INTERNET\"/>",
-                    "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
-                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>",
+                    "<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
                     "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
                     "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
-                    "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>"
+                    "<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>"
                 ],
-                "abiFilters" : [ "armeabi-v7a", "arm64-v8a", "x86" ],
-                "autoSdkPermissions" : true
+                "abiFilters" : [ "armeabi-v7a", "arm64-v8a", "x86" ]
             },
             "ios" : {
-                "idfa" : false,
-                "capabilities" : {
-                    "entitlements" : {
-                        "com.apple.developer.associated-domains" : [ "applinks:yrh.liuniu946.com" ]
-                    }
-                }
+                "idfa" : false
             },
             /* ios打包配置 */
             "sdkConfigs" : {
                 "maps" : {},
                 "oauth" : {
                     "weixin" : {
-                        "appid" : "wx3ff7aa4ad9ada474",
-                        "appsecret" : "05b46c28ed0efe79de119a559b4de1c3",
-                        "UniversalLinks" : "https://yrh.liuniu946.com/links/"
-                    }
-                },
-                "payment" : {
-                    "weixin" : {
-                        "appid" : "wx3ff7aa4ad9ada474",
-                        "UniversalLinks" : "https://yrh.liuniu946.com/links/"
-                    },
-                    "alipay" : {
-                        "__platform__" : [ "ios", "android" ]
-                    }
-                },
-                "share" : {
-                    "weixin" : {
-                        "appid" : "wx3ff7aa4ad9ada474",
-                        "UniversalLinks" : "https://yrh.liuniu946.com/links/"
-                    }
-                },
-                "ad" : {},
-                "geolocation" : {},
-                "speech" : {},
-                "push" : {}
-            },
-            "icons" : {
-                "android" : {
-                    "hdpi" : "unpackage/res/icons/72x72.png",
-                    "xhdpi" : "unpackage/res/icons/96x96.png",
-                    "xxhdpi" : "unpackage/res/icons/144x144.png",
-                    "xxxhdpi" : "unpackage/res/icons/192x192.png"
-                },
-                "ios" : {
-                    "appstore" : "unpackage/res/icons/1024x1024.png",
-                    "ipad" : {
-                        "app" : "unpackage/res/icons/76x76.png",
-                        "app@2x" : "unpackage/res/icons/152x152.png",
-                        "notification" : "unpackage/res/icons/20x20.png",
-                        "notification@2x" : "unpackage/res/icons/40x40.png",
-                        "proapp@2x" : "unpackage/res/icons/167x167.png",
-                        "settings" : "unpackage/res/icons/29x29.png",
-                        "settings@2x" : "unpackage/res/icons/58x58.png",
-                        "spotlight" : "unpackage/res/icons/40x40.png",
-                        "spotlight@2x" : "unpackage/res/icons/80x80.png"
-                    },
-                    "iphone" : {
-                        "app@2x" : "unpackage/res/icons/120x120.png",
-                        "app@3x" : "unpackage/res/icons/180x180.png",
-                        "notification@2x" : "unpackage/res/icons/40x40.png",
-                        "notification@3x" : "unpackage/res/icons/60x60.png",
-                        "settings@2x" : "unpackage/res/icons/58x58.png",
-                        "settings@3x" : "unpackage/res/icons/87x87.png",
-                        "spotlight@2x" : "unpackage/res/icons/80x80.png",
-                        "spotlight@3x" : "unpackage/res/icons/120x120.png"
+                        "appid" : "",
+                        "appsecret" : "",
+                        "UniversalLinks" : ""
                     }
                 }
-            },
-            "splashscreen" : {
-                "android" : {
-                    "hdpi" : "unpackage/res/app图/启动图/480x762.png",
-                    "xhdpi" : "unpackage/res/app图/启动图/720x1242.png",
-                    "xxhdpi" : "unpackage/res/app图/启动图/1080x1882.png"
-                },
-                "ios" : {
-                    "iphone" : {
-                        "portrait-896h@3x" : "D:/app项目文件/满园春/app图/启动图/1242x2688.png",
-                        "portrait-896h@2x" : "D:/app项目文件/满园春/app图/启动图/828x1792.png",
-                        "iphonex" : "D:/app项目文件/满园春/app图/启动图/1125x2436.png",
-                        "retina55" : "D:/app项目文件/满园春/app图/启动图/1242x2208.png",
-                        "retina47" : "D:/app项目文件/满园春/app图/启动图/750x1334.png",
-                        "retina40" : "D:/app项目文件/满园春/app图/启动图/640x1136.png"
-                    },
-                    "storyboard" : "unpackage/res/CustomStoryboard.zip"
-                },
-                "iosStyle" : "storyboard",
-                "androidStyle" : "default"
             }
         }
     },
@@ -143,13 +58,14 @@
     "mp-weixin" : {
         /* 小程序特有相关 */
         "usingComponents" : true,
-        "appid" : "",
+        "appid" : "wx6bfd5975487b2e53",
         "setting" : {
-            "urlCheck" : true
+            "urlCheck" : false,
+            "minified" : true
         }
     },
     "h5" : {
-        "title" : "满园春线上商城",
+        "title" : "商城",
         "domain" : "",
         "router" : {
             "base" : "/index/",
@@ -158,24 +74,11 @@
         "devServer" : {
             "proxy" : {
                 "/api" : {
-                    // "target" : "http://m.manyuanchunjia.com/api", //请求的目标域名
-                    "target" : "http://myc.frp.liuniu946.com/api", //请求的目标域名
-                    "changeOrigin" : true,
-                    // "secure": false,
-                    "pathRewrite" : {}
-                }
-            },
-            "https" : false
-        },
-        "optimization" : {
-            "treeShaking" : {
-                "enable" : true
-            }
-        },
-        "sdkConfigs" : {
-            "maps" : {
-                "qqmap" : {
-                    "key" : "VYZBZ-P2TRG-RMIQ3-ITAIN-2DKBK-CKFQQ"
+                    "target" : "https://dlzx.liuniu946.com/api",
+                    // "changeOrigin": true,
+                    "pathRewrite" : {
+                        "/api" : "" // rewrite path
+                    }
                 }
             }
         }

+ 0 - 30
node_modules/jweixin-module/README.md

@@ -1,30 +0,0 @@
-# jweixin-module
-
-微信JS-SDK
-
-## 安装
-
-### NPM
-
-```shell
-npm install jweixin-module --save
-```
-
-### UMD
-
-```http
-https://unpkg.com/jweixin-module/out/index.js
-```
-
-## 使用
-
-```js
-var wx = require('jweixin-module')
-wx.ready(function(){
-    // TODO
-});
-```
-
-## 完整API
-
->[微信JS-SDK说明文档](https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115)

Різницю між файлами не показано, бо вона завелика
+ 0 - 0
node_modules/jweixin-module/out/index.js


+ 0 - 60
node_modules/jweixin-module/package.json

@@ -1,60 +0,0 @@
-{
-  "_from": "jweixin-module",
-  "_id": "jweixin-module@1.4.1",
-  "_inBundle": false,
-  "_integrity": "sha512-2R2oa1lYhAsclfjKSf3DP4ZiP1dcrQUbM7aklbeJA+UAg/LS7MqoA6UbTy1cs4sbB34z62K4bKW0Z9iazD8ejg==",
-  "_location": "/jweixin-module",
-  "_phantomChildren": {},
-  "_requested": {
-    "type": "tag",
-    "registry": true,
-    "raw": "jweixin-module",
-    "name": "jweixin-module",
-    "escapedName": "jweixin-module",
-    "rawSpec": "",
-    "saveSpec": null,
-    "fetchSpec": "latest"
-  },
-  "_requiredBy": [
-    "#USER",
-    "/"
-  ],
-  "_resolved": "https://registry.npmjs.org/jweixin-module/-/jweixin-module-1.4.1.tgz",
-  "_shasum": "1fc8fa42622243f6c35651d272cd587debf56cd1",
-  "_spec": "jweixin-module",
-  "_where": "D:\\工作\\项目\\appBase",
-  "author": {
-    "name": "Shengqiang Guo"
-  },
-  "bugs": {
-    "url": "https://github.com/zhetengbiji/jweixin-module/issues"
-  },
-  "bundleDependencies": false,
-  "deprecated": false,
-  "description": "微信JS-SDK",
-  "devDependencies": {
-    "textfile": "^1.2.0",
-    "uglify-js": "^3.4.9"
-  },
-  "homepage": "https://github.com/zhetengbiji/jweixin-module#readme",
-  "keywords": [
-    "wxjssdk",
-    "weixin",
-    "jweixin",
-    "wechat",
-    "jssdk",
-    "wx"
-  ],
-  "license": "ISC",
-  "main": "out/index.js",
-  "name": "jweixin-module",
-  "repository": {
-    "type": "git",
-    "url": "git+https://github.com/zhetengbiji/jweixin-module.git"
-  },
-  "scripts": {
-    "build": "node build",
-    "prepublish": "npm run build"
-  },
-  "version": "1.4.1"
-}

+ 0 - 11
package-lock.json

@@ -1,11 +0,0 @@
-{
-  "requires": true,
-  "lockfileVersion": 1,
-  "dependencies": {
-    "jweixin-module": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/jweixin-module/-/jweixin-module-1.4.1.tgz",
-      "integrity": "sha512-2R2oa1lYhAsclfjKSf3DP4ZiP1dcrQUbM7aklbeJA+UAg/LS7MqoA6UbTy1cs4sbB34z62K4bKW0Z9iazD8ejg=="
-    }
-  }
-}

+ 146 - 499
pages.json

@@ -1,16 +1,30 @@
 {
-	"easycom": {
-			"^u-(.*)": "@/uview-ui/components/u-$1/u-$1.vue"
-		},
 	"pages": [{
 			"path": "pages/index/index",
 			"style": {
-				"navigationBarTitleText": "满园春商城",
+				// #ifdef H5
+				"navigationStyle": "custom",
+				// #endif
 				"app-plus": {
-					"titleNView": false
-				}
+					"titleNView": {
+						"type": "default",
+						"searchInput": {
+							"backgroundColor": "#ffffff",
+							"borderRadius": "16px",
+							"placeholder": "请输入关键字",
+							"disabled": true,
+							"placeholderColor": "#B5B5B5",
+							"align": "center"
+						}
+					}
+				},
+				"navigationBarTitleText": "鼎立足行",
+				"navigationBarBackgroundColor":"#0fc8e4",
+				"navigationBarTextStyle":"white",
+				"enablePullDownRefresh": true
 			}
-		}, {
+		},
+		{
 			"path": "pages/public/register",
 			"style": {
 				"navigationBarTitleText": "注册",
@@ -20,17 +34,7 @@
 					}
 				}
 			}
-		},
-		{
-			"path": "pages/moments/details",
-			"style": {
-				"navigationBarTitleText": "文章页",
-				"app-plus": {
-					"titleNView": false
-				}
-			}
-		},
-		{
+		}, {
 			"path": "pages/public/login",
 			"style": {
 				"navigationBarTitleText": "登录",
@@ -53,332 +57,91 @@
 			}
 		},
 		{
-			"path": "pages/public/forget",
-			"style": {
-				"navigationBarTitleText": "忘记密码",
-				"app-plus": {
-					"titleNView": {
-						"type": "transparent"
-					}
-				}
-			}
-		}, {
-			"path": "pages/product/classify",
+			"path": "pages/user/team",
 			"style": {
-				"navigationStyle": "custom",
+				"navigationBarTitleText": "我的推广",
 				"app-plus": {
-					"titleNView": {
-						"type": "transparent"
-					}
-				}
-			}
-		}, {
-			"path": "pages/product/giftBag",
-			"style": {
-				"navigationBarTitleText": "联盟礼包"
-			}
-		}, {
-			"path": "pages/myteam/myteam",
-			"style": {
-				"navigationBarTitleText": "我的团队",
-				"app-plus":{
 					"titleNView": false
 				}
 			}
 		},
 		{
-			"path": "pages/merchant/merchant",
+			"path": "pages/index/vip",
 			"style": {
-				"navigationBarTextStyle": "white",
-				"navigationBarBackgroundColor": "#75E5B6",
-				"navigationBarTitleText": "商家中心",
-				"app-plus": {
-					"titleNView": {
-						//隐藏title
-						// "type": "transparent"
-
-					}
-				}
+				"navigationBarTitleText": "升级礼包"
 			}
 		},
 		{
-			"path": "pages/merchant/order",
+			"path": "pages/category/articleList",
 			"style": {
-				"navigationBarTitleText": "订单管理",
-				"navigationBarBackgroundColor": "#52C696",
-				"navigationBarTextStyle": "white"
+				"navigationBarTitleText": "产品百科"
 			}
 		},
 		{
-			"path": "pages/product/product",
-			"style": {
-				"navigationBarTitleText": "详情展示",
-				"app-plus": {
-					"titleNView": {
-						"type": "transparent"
-					}
-				}
-			}
-		}, {
-			"path": "pages/product/search",
+			"path": "pages/category/flList",
 			"style": {
-				"enablePullDownRefresh": true,
-				// #ifdef MP
-				"navigationStyle": "custom",
-				// #endif
-				//#ifdef H5
-				"navigationStyle":"default",
-				//#endif
-				// #ifndef MP
-				"app-plus": {
-					"titleNView": {
-						"searchInput": {
-							"backgroundColor": "rgba(231, 231, 231,.7)",
-							"borderRadius": "16px",
-							"placeholder": "请输入关键字",
-							"disabled": false,
-							"placeholderColor": "#606266",
-							"align": "left"
-						},
-						"buttons": [{
-							"text": "搜索",
-							"fontSize": "14",
-							"color": "#303133",
-							"background": "rgba(0,0,0,0)",
-							"width": "40px"
-						}]
-					}
-				},
-				// #endif
-				"navigationBarTitleText": "搜索"
-			}
-		}, 
-		{
-			"path": "pages/set/about",
-			"style": {
-				"navigationBarTitleText": "关于我们"
-			}
-		},
-		{
-			"path": "pages/set/phone",
-			"style": {
-				"navigationBarTitleText": "绑定手机号"
+				"navigationBarTitleText": "百科列表"
 			}
 		},
 		{
-			"path": "pages/product/reply",
-			"style": {
-				"navigationBarTitleText": "评论"
-			}
-		}, {
-			"path": "pages/order/evaluate",
+			"path": "pages/category/detail",
 			"style": {
-				"navigationBarTitleText": "评论"
+				"navigationBarTitleText": "详情"
 			}
 		},
 		{
-			"path": "pages/userinfo/userinfo",
-			"style": {
-				"navigationBarTitleText": "修改资料"
-			}
-		}, {
-			"path": "pages/cart/cart",
-			"style": {
-				"navigationBarTitleText": "购物车"
-			}
-		}, {
-			"path": "pages/user/user",
-			"style": {
-				// #ifndef MP-WEIXIN
-				"navigationStyle": "custom",
-				"app-plus": {
-					"bounce": "none",
-					"titleNView": false
-					// {
-					//         "type": "transparent",
-					//         "buttons": [{
-					//                         "fontSrc": "/static/yticon.ttf",
-					//                         "text": "\ue60f",
-					//                         "fontSize": "24",
-					//                         "color": "#303133",
-					//                         "width": "46px",
-					//                         "background": "rgba(0,0,0,0)"
-					//                 },
-					//                 {
-					//                         "fontSrc": "/static/yticon.ttf",
-					//                         "text": "\ue744",
-					//                         "fontSize": "28",
-					//                         "color": "#303133",
-					//                         "background": "rgba(0,0,0,0)",
-					//                         "redDot": true
-					//                 }
-					//         ]
-					// }
-				},
-				// #endif
-				"navigationBarTitleText": "个人中心"
-			}
-		}, {
-			"path": "pages/detail/detail",
+			"path": "pages/public/forget",
 			"style": {
-				"navigationBarTitleText": "",
+				"navigationBarTitleText": "忘记密码",
 				"app-plus": {
 					"titleNView": {
 						"type": "transparent"
 					}
 				}
 			}
-		}, {
-			"path": "pages/order/order",
-			"style": {
-				"navigationBarTitleText": "我的订单",
-				"app-plus": {
-					"bounce": "none"
-				}
-			}
-		}, {
-			"path": "pages/order/refundOrder",
-			"style": {
-				"navigationBarTitleText": "退款订单",
-				"app-plus": {
-					"bounce": "none"
-				}
-			}
-		}, {
-			"path": "pages/order/orderDetail",
-			"style": {
-				"navigationBarTitleText": "订单详情",
-				"app-plus": {
-					"bounce": "none"
-				}
-			}
-		}, 
+		},
+
+
+
+
 		{
-			"path": "pages/merchant/orderDetail",
-			"style": {
-				"navigationBarTitleText": "订单详情",
-				"app-plus": {
-					"bounce": "none"
-				}
-			}
-		},{
-			"path": "pages/order/orderRefund",
-			"style": {
-				"navigationBarTitleText": "申请退款"
-			}
-		}, {
-			"path": "pages/order/createOrder",
-			"style": {
-				"navigationBarTitleText": "创建订单"
-			}
-		}, {
-			"path": "pages/address/address",
-			"style": {
-				"navigationBarTitleText": "收货地址"
-			}
-		}, {
-			"path": "pages/address/shopList",
+			"path": "pages/product/reply",
 			"style": {
-				"navigationBarTitleText": "门店列表",
+				"navigationBarTitleText": "商品评价",
 				"app-plus": {
 					"titleNView": {
-						"searchInput": {
-							"backgroundColor": "rgba(231, 231, 231,.7)",
-							"borderRadius": "16px",
-							"placeholder": "请输入关键字",
-							"placeholderColor": "#606266",
-							"align": "left"
-						},
-						"buttons": [{
-							"text": "搜索",
-							"fontSize": "14",
-							"color": "#303133",
-							"background": "rgba(0,0,0,0)",
-							"width": "40px"
-						}]
+						"type": "transparent"
 					}
 				}
 			}
-		}, {
-			"path": "pages/address/addressManage",
-			"style": {
-				"navigationBarTitleText": "新增修改地址"
-			}
-		}, {
-			"path": "pages/money/pay",
-			"style": {
-				"navigationBarTitleText": "支付"
-			}
 		},
 		{
-			"path": "pages/money/paySuccess",
-			"style": {
-				"navigationBarTitleText": "支付成功"
-			}
-		}, {
-			"path": "pages/award/award",
-			"style": {
-				"navigationBarTitleText": "我的佣金",
-				"app-plus": {
-					"titleNView": false
-				}
-			}
-		}, {
-			"path": "pages/award/withdrawal",
-			"style": {
-				"navigationBarTitleText": "奖励提现"
-			}
-		}, {
-			"path": "pages/scoreAccumulate/scoreAccumulate",
-			"style": {
-				"navigationBarTitleText": "我的积分",
-				"app-plus": {
-					"titleNView": false
-				}
-			}
-		}, {
-			"path": "pages/notice/notice",
-			"style": {
-				"navigationBarTitleText": "通知"
-			}
-		}, {
-			"path": "pages/category/category",
+			"path": "pages/product/product",
 			"style": {
-				"navigationBarTitleText": "分类",
-				//#ifdef H5
-				"navigationStyle":"default",
-				//#endif
+				"navigationBarTitleText": "详情展示",
 				"app-plus": {
-					"bounce": "none",
 					"titleNView": {
-						"searchInput": {
-							"backgroundColor": "rgba(231, 231, 231,.7)",
-							"borderRadius": "16px",
-							"placeholder": "商品搜索",
-							"disabled": true,
-							"placeholderColor": "#606266",
-							"align": "left"
-						}
+						"type": "transparent"
 					}
 				}
 			}
-		}, {
+		},
+
+		{
 			"path": "pages/product/list",
 			"style": {
+				"enablePullDownRefresh": true,
 				"navigationBarTitleText": "商品列表"
 			}
 		},
 		{
-			"path": "pages/product/listSearch",
+			"path": "pages/product/search",
 			"style": {
 				"enablePullDownRefresh": true,
-				// #ifdef MP
+				// #ifdef APP-PLUS
 				"navigationStyle": "custom",
 				// #endif
-				//#ifdef H5
-				"navigationStyle":"default",
-				//#endif
-				// #ifndef MP
+				// #ifndef MP || APP-PLUS
 				"app-plus": {
 					"titleNView": {
 						"searchInput": {
@@ -399,323 +162,210 @@
 					}
 				},
 				// #endif
-				"navigationBarTitleText": "商品列表"
+				"navigationBarTitleText": "搜索"
 			}
 		},
 		{
-			"path": "pages/wallet/wallet",
+			"path": "pages/product/classify",
 			"style": {
-				"navigationBarTitleText": "我的余额",
+				"navigationStyle": "custom",
 				"app-plus": {
-					"titleNView": false
+					"titleNView": {
+						"type": "transparent"
+					}
 				}
 			}
 		},
 		{
-			"path": "pages/wallet/freezeList",
+			"path": "pages/set/set",
 			"style": {
-				"navigationBarTitleText": "冻结记录"
+				"navigationBarTitleText": "设置"
 			}
 		},
 		{
-			"path": "pages/wallet/account",
+			"path": "pages/set/address",
 			"style": {
-				"navigationBarTitleText": "提现账号"
+				"navigationBarTitleText": "收货地址"
 			}
 		},
 		{
-			"path": "pages/wallet/withdrawal",
+			"path": "pages/set/addressManage",
 			"style": {
-				"navigationBarTitleText": "余额提现"
+				"navigationBarTitleText": ""
 			}
 		},
+
 		{
-			"path": "pages/wallet/recharge",
+			"path": "pages/set/password",
 			"style": {
-				"navigationBarTitleText": "充值"
+				"navigationBarTitleText": "修改密码"
 			}
 		},
 		{
-			"path": "pages/favorites/favorites",
+			"path": "pages/set/userinfo",
 			"style": {
-				"navigationBarTitleText": "收藏夹"
+				"navigationBarTitleText": "修改资料"
 			}
 		}, {
-			"path": "pages/sign/index",
-			"style": {
-				"navigationBarTitleText": "每日签到",
-				"app-plus": {
-					"titleNView": {
-						"type": "transparent"
-					}
-				}
-			}
-		},
-		{
-			"path": "pages/redirect/redirect",
+			"path": "pages/cart/cart",
 			"style": {
-				"navigationBarTitleText": "微信登录跳转页面",
-				"app-plus": {
-					"titleNView": false
-				}
+				"navigationBarTitleText": "购物车"
 			}
 		},
+
 		{
-			"path": "pages/prefecture/integral",
+			"path": "pages/user/user",
 			"style": {
-				"navigationBarTitleText": "积分兑换"
+				// #ifndef MP-WEIXIN
+				"navigationStyle": "custom",
+				// "app-plus": {
+				// 	"bounce": "none",
+				// 	"titleNView": {
+				// 		"type": "transparent",
+				// 		"buttons": [{
+				// 				"fontSrc": "/static/yticon.ttf",
+				// 				"text": "\ue60f",
+				// 				"fontSize": "24",
+				// 				"color": "#303133",
+				// 				"width": "46px",
+				// 				"background": "rgba(0,0,0,0)"
+				// 			},
+				// 			{
+				// 				"fontSrc": "/static/yticon.ttf",
+				// 				"text": "\ue744",
+				// 				"fontSize": "28",
+				// 				"color": "#303133",
+				// 				"background": "rgba(0,0,0,0)",
+				// 				"redDot": true
+				// 			}
+				// 		]
+				// 	}
+				// },
+				// #endif
+				"navigationBarTitleText": "个人中心"
 			}
 		},
 		{
-			"path": "pages/shareQrCode/index",
+			"path": "pages/user/award",
 			"style": {
-				"navigationBarTitleText": "邀请好友",
+				"navigationBarTitleText": "我的余额",
 				"app-plus": {
-					"titleNView": {
-						"type": "transparent"
-					}
+					"titleNView": false
 				}
 			}
 		},
 		{
-			"path": "pages/shareQrCode/wechatQr",
+			"path": "pages/user/withdrawal",
 			"style": {
-				"navigationBarTitleText": "关注公众号"
-			}
-		},
-		{
-			"path": "pages/seckill/seckill",
-			"style": {
-				"navigationBarTitleText": "限时抢购"
+				"navigationBarTitleText": "奖励提现"
 			}
 		},
+
 		{
-			"path": "pages/groupBooking/index",
+			"path": "pages/user/favorites",
 			"style": {
-				"enablePullDownRefresh": true,
-				"navigationBarTitleText": "超值拼团"
+				"navigationBarTitleText": "收藏夹"
 			}
 		},
 		{
-			"path": "pages/groupBooking/detail",
+			"path": "pages/order/order",
 			"style": {
-				"navigationBarTitleText": "拼团详细",
+				"navigationBarTitleText": "我的订单",
 				"app-plus": {
-					"titleNView": false
+					"bounce": "none"
 				}
 			}
 		},
 		{
-			"path": "pages/groupBooking/inviteImg",
+			"path": "pages/order/expressInfo",
 			"style": {
-				"navigationBarTitleText": "拼团邀请图",
-				"app-plus": {
-					"titleNView": false
-				}
-			}
-		}, {
-			"path": "pages/award/withdmoenys",
-			"style": {
-				"navigationBarTitleText": "转余额"
-			}
-		},
-		// {
-		// 	"path": "pages/coupon/details",
-		// 	"style": {
-		// 		"navigationBarTitleText": "付款",
-		// 		"app-plus": {
-		// 			"titleNView":{
-		// 				"backgroundColor": "#5DBC7C",
-		// 				"titleColor":"#FFFFFF"
-		// 			}
-		// 		},
-		// 		"h5":{
-		// 			"titleNView":{
-		// 				"backgroundColor": "#5DBC7C",
-		// 				"titleColor":"#FFFFFF"
-		// 			}
-		// 		}
-		// 	}
-		// },
-		{
-			"path": "pages/received/index",
-			"style": {
-				"navigationBarTitleText": "收付款",
-				"app-plus": {
-					"titleNView": {
-						"backgroundColor": "#5DBC7C",
-						"titleColor": "#FFFFFF"
-					}
-				},
-				"h5": {
-					"titleNView": {
-						"backgroundColor": "#5DBC7C",
-						"titleColor": "#FFFFFF"
-					}
-				}
+				"navigationBarTitleText": "快递详情"
 			}
 		},
 		{
-			"path": "pages/received/list",
+			"path": "pages/order/orderDetail",
 			"style": {
-				"navigationBarTitleText": "收付款记录",
+				"navigationBarTitleText": "订单详情",
 				"app-plus": {
-					"titleNView": {
-						"backgroundColor": "#5DBC7C",
-						"titleColor": "#FFFFFF"
-					}
-				},
-				"h5": {
-					"titleNView": {
-						"backgroundColor": "#5DBC7C",
-						"titleColor": "#FFFFFF"
-					}
-				}
-			}
-		},
-		// {
-		// 	"path": "pages/received/paySuccess",
-		// 	"style": {
-		// 		"navigationBarTitleText": "付款成功",
-		// 		"app-plus": {
-		// 			"titleNView":{
-		// 				"backgroundColor": "#5DBC7C",
-		// 				"titleColor":"#FFFFFF"
-		// 			}
-		// 		},
-		// 		"h5":{
-		// 			"titleNView":{
-		// 				"backgroundColor": "#5DBC7C",
-		// 				"titleColor":"#FFFFFF"
-		// 			}
-		// 		}
-		// 	}
-		// },
-		{
-			"path": "pages/coupon/consumer",
-			"style": {
-				"navigationBarTitleText": "我的消费券",
-				"app-plus":{
-					"titleNView": false
+					"bounce": "none"
 				}
 			}
 		},
 		{
-			"path": "pages/shoping/index",
+			"path": "pages/order/evaluate",
 			"style": {
-				"navigationBarTitleText": "店铺信息",
-				"app-plus": {
-					"titleNView": false
-				}
+				"navigationBarTitleText": "评论"
 			}
 		},
 		{
-			"path": "pages/shoping/list",
+			"path": "pages/order/orderRefund",
 			"style": {
-				"navigationBarTitleText": "店铺列表"
-				
+				"navigationBarTitleText": "申请退款"
 			}
 		},
 		{
-			"path": "pages/contract/agreement",
+			"path": "pages/order/createOrder",
 			"style": {
-				"navigationBarTitleText": "注册协议"
+				"navigationBarTitleText": "创建订单"
+			}
+		}, {
+			"path": "pages/money/pay",
+			"style": {
+				"navigationBarTitleText": "支付"
 			}
 		},
 		{
-			"path": "pages/contract/privacy",
+			"path": "pages/money/paySuccess",
 			"style": {
-				"navigationBarTitleText": "隐私政策"
+				"navigationBarTitleText": "支付成功"
 			}
 		},
 		{
-			"path": "pages/contract/start",
+			"path": "pages/money/wallet",
 			"style": {
-				"navigationBarTitleText": "授权页",
+				"navigationBarTitleText": "我的佣金",
 				"app-plus": {
 					"titleNView": false
 				}
 			}
-		}
-
-		, {
-			"path": "pages/merchant/commodity",
-			"style": {
-				"navigationBarTitleText": "商品管理"
-				// ,"app-plus": {
-				// 	"titleNView": false
-				// }
-			}
-
-		}, {
-			"path": "pages/merchant/vipDetail",
-			"style": {
-				"navigationBarBackgroundColor": "#72E3B4",
-				"navigationBarTextStyle": "white",
-				"navigationBarTitleText": "店铺会员",
-				"enablePullDownRefresh": false
-			}
-
 		},
 		{
-			"path": "pages/merchant/storeQr",
+			"path": "pages/money/account",
 			"style": {
-				"navigationBarBackgroundColor": "#72E3B4",
-				"navigationBarTextStyle": "white",
-				"navigationBarTitleText": "店铺二维码",
-				"enablePullDownRefresh": false
+				"navigationBarTitleText": "提现账号"
 			}
 		},
 		{
-			"path": "pages/merchant/finance",
+			"path": "pages/money/withdrawal",
 			"style": {
-				"navigationBarBackgroundColor": "#ffffff",
-				"navigationBarTextStyle": "black",
-				"navigationBarTitleText": "店铺财务",
-				"enablePullDownRefresh": false
+				"navigationBarTitleText": "提现"
 			}
 		},
 		{
-			"path": "pages/merchant/onlineOrder",
+			"path": "pages/money/recharge",
 			"style": {
-				"navigationBarBackgroundColor": "#ffffff",
-				"navigationBarTextStyle": "black",
-				"navigationBarTitleText": "在线下单",
-				"enablePullDownRefresh": false
+				"navigationBarTitleText": "充值"
 			}
 		},
 		{
-			"path": "pages/wallet/openMember",
-			"style": {
-				"navigationBarBackgroundColor": "#363533",
-				"navigationBarTextStyle": "white",
-				"navigationBarTitleText": "开通会员",
-				"enablePullDownRefresh": false
-			}
-		}, {
-			"path": "pages/merchant/storeData",
+			"path": "pages/category/category",
 			"style": {
-				"navigationBarBackgroundColor": "#72E3B4",
-				"navigationBarTextStyle": "white",
-				"navigationBarTitleText": "店铺数据",
-				"enablePullDownRefresh": false
+				"navigationBarTitleText": "品牌故事"
 			}
 		},
 		{
-			"path": "pages/prefecture/detail",
+			"path": "pages/redirect/redirect",
 			"style": {
-				"navigationBarTitleText": "兑换详情",
+				"navigationBarTitleText": "微信登录跳转页面",
 				"app-plus": {
-					"titleNView": {
-						"type": "transparent"
-					}
+					"titleNView": false
 				}
 			}
 		},
 		{
-			"path": "pages/prefecture/voucher",
+			"path": "pages/user/shareQrCode",
 			"style": {
-				"navigationBarTitleText": "消费券兑换"
+				"navigationBarTitleText": "邀请好友"
 			}
 		}
 	],
@@ -723,14 +373,11 @@
 		"navigationBarTextStyle": "black",
 		"navigationBarTitleText": "uni-app",
 		"navigationBarBackgroundColor": "#FFFFFF",
-		//#ifdef H5
-		"navigationStyle":"custom",
-		//#endif
 		"backgroundColor": "#f8f8f8"
 	},
 	"tabBar": {
 		"color": "#C0C4CC",
-		"selectedColor": "#5DBC7C",
+		"selectedColor": "#5ad5eb",
 		"borderStyle": "black",
 		"backgroundColor": "#ffffff",
 		"list": [{
@@ -743,7 +390,7 @@
 				"pagePath": "pages/category/category",
 				"iconPath": "static/tabBar/tab-cate.png",
 				"selectedIconPath": "static/tabBar/tab-cate-current.png",
-				"text": "分类"
+				"text": "品牌故事"
 			},
 			{
 				"pagePath": "pages/cart/cart",

+ 0 - 220
pages/address/address.vue

@@ -1,220 +0,0 @@
-<template>
-	<view class="content b-t">
-		<view class="list" v-for="(item, index) in addressList" :key="index" @click="checkAddress(item)">
-			<view class="wrapper">
-				<view class="address-box">
-					<text class="name">{{ item.real_name }}</text>
-					<text class="mobile">{{ item.phone }}</text>
-				</view>
-				<view class="u-box">
-					<text class="address">{{ item.province + item.city + item.district }} {{ item.detail }}</text>
-				</view>
-			</view>
-			<view class="buttom">
-				<view class="default-buttom" @click.stop="defaultUp(item,index)">
-					<view class="iconfont iconroundcheckfill checkbox" :class="{ checked: item.is_default == 1 }"></view>
-					<text class="text">设为默认地址</text>
-				</view>
-				<view class="operation">
-					<view @click.stop="addAddress('edit', item)">
-						<text class="iconfont iconedit"></text>
-						<text class="text">编辑</text>
-					</view>
-					<view class="blank"></view>
-					<view @click.stop="delAddress(item)">
-						<text class="iconfont icondelete"></text>
-						<text class="text">删除</text>
-					</view>
-				</view>
-			</view>
-		</view>
-		<button class="add-btn" @click="addAddress('add')">新增地址</button>
-	</view>
-</template>
-
-<script>
-import { getAddressList, addressEdit,addressDel } from '@/api/address.js';
-export default {
-	data() {
-		return {
-			source: 0,
-			addressList: []
-		};
-	},
-	onLoad(option) {
-		this.source = option.source||0
-		this.loadAddress();
-	},
-	methods: {
-		// 加载地址
-		loadAddress() {
-			getAddressList({
-				page: 1,
-				limit: 100
-			}).then(({ data }) => {
-				this.addressList = data;
-			});
-		},
-		// 设为默认地址
-		defaultUp(data,ind) {
-			this.addressList=this.addressList.map((e) => {
-				e.is_default=0
-				return e
-			})
-			this.addressList[ind].is_default=1
-			addressEdit({
-				type: 1,
-				longitude: data.longitude,
-				latitude: data.latitude,
-				real_name: data.real_name,
-				phone: data.phone,
-				address: {
-					province: data.province,
-					city: data.city,
-					district: data.district
-				},
-				detail: data.detail,
-				is_default: 1,
-				id: data.id,
-				type: 1,
-			}).then(({ data }) => {
-				this.loadAddress();
-			}).catch((e) => {
-				console.log(e);
-			});
-		},
-		//删除地址
-		delAddress(item) {
-			addressDel({
-				id:item.id
-			}).then(({data})=>{
-				this.$api.msg('删除成功')
-			})
-			let s = this.addressList.indexOf(item);
-			this.addressList.splice(s, 1);
-		},
-		//选择地址
-		checkAddress(item) {
-			if (this.source == 1) {
-				//this.$api.prePage()获取上一页实例,在App.vue定义
-				this.$api.prePage().addressData = item;
-				uni.navigateBack();
-			}
-		},
-		// 添加地址
-		addAddress(type, item) {
-			uni.navigateTo({
-				url: `/pages/address/addressManage?type=${type}&data=${JSON.stringify(item)}`
-			});
-		},
-		//添加或修改成功之后回调
-		refreshList() {
-			// 重新加载地址
-			this.loadAddress()
-		}
-	}
-};
-</script>
-
-<style lang="scss">
-page {
-	padding-bottom: 120rpx;
-	padding-top: 20rpx;
-}
-.content {
-	position: relative;
-}
-.list {
-	align-items: center;
-	padding: 20rpx 30rpx;
-	background: #fff;
-	margin: 20rpx;
-	margin-top: 0;
-	.buttom {
-		display: flex;
-		align-items: center;
-		justify-content: space-between;
-		padding-top: 10rpx;
-		.checkbox {
-			font-size: 44rpx;
-			line-height: 1;
-			padding: 4rpx;
-			color: $font-color-disabled;
-			background: #fff;
-			border-radius: 50px;
-		}
-		.checkbox.checked {
-			color: $base-color;
-		}
-		.default-buttom {
-			display: flex;
-			align-items: center;
-		}
-		.operation {
-			display: flex;
-			align-items: center;
-			.blank {
-				width: 30rpx;
-			}
-		}
-		.text {
-			padding-left: 10rpx;
-			font-size: 24rpx;
-			color: #666666;
-		}
-	}
-}
-.wrapper {
-	display: flex;
-	flex-direction: column;
-	flex: 1;
-	border-bottom: 1px solid #f0f0f0;
-	padding-bottom: 20rpx;
-}
-.address-box {
-	display: flex;
-	align-items: center;
-	justify-content: space-between;
-	.address {
-		font-size: $font-base + 2rpx;
-		color: $font-color-dark;
-	}
-	.mobile {
-		font-size: $font-base;
-		color: rgba(51, 51, 51, 1);
-	}
-}
-.u-box {
-	font-size: $font-base;
-	color: $font-color-light;
-	margin-top: 16rpx;
-	.name {
-		margin-right: 30rpx;
-	}
-}
-.icon-bianji {
-	display: flex;
-	align-items: center;
-	height: 80rpx;
-	font-size: 40rpx;
-	color: $font-color-light;
-	padding-left: 30rpx;
-}
-
-.add-btn {
-	position: fixed;
-	left: 30rpx;
-	right: 30rpx;
-	bottom: 16rpx;
-	z-index: 95;
-	display: flex;
-	align-items: center;
-	justify-content: center;
-	width: 690rpx;
-	height: 80rpx;
-	font-size: $font-lg;
-	color: #fff;
-	background-color: $base-color;
-	border-radius: 10rpx;
-}
-</style>

+ 0 - 331
pages/address/addressManage.vue

@@ -1,331 +0,0 @@
-<template>
-	<view class="content">
-		<view class="row b-b">
-			<text class="tit">联系人</text>
-			<input class="input" type="text" v-model="addressData.name" placeholder="收货人姓名" placeholder-class="placeholder" />
-		</view>
-		<view class="row b-b">
-			<text class="tit">手机号</text>
-			<input class="input" type="number" v-model="addressData.mobile" placeholder="收货人手机号码" placeholder-class="placeholder" />
-		</view>
-		<view class="row b-b">
-			<text class="tit">地址</text>
-			<!-- <picker mode="multiSelector" :range="arrDate" @change="cityChange">
-				<view>{{ addressDetail || '请选择地址(点击选择地址)' }}</view>
-			</picker> -->
-			<pickerAddress class="input"  @change="onCityClick">{{ addressDetail || '请选择地址(点击选择地址)' }}</pickerAddress>
-		</view>
-		<view class="row b-b" @click="clickMap">
-			<text class="tit">定位</text>
-			<input class="input" type="text" v-model="addressLocation.name" disabled="disabled" placeholder="请在列表选择要定位的地址" placeholder-class="placeholder" />
-			<text class="iconfont iconlocation"></text>
-		</view>
-		<view class="row b-b">
-			<text class="tit">门牌号</text>
-			<input class="input" type="text" v-model="addressData.area" placeholder="请填写精确地址方便快速送到" placeholder-class="placeholder" />
-		</view>
-
-		<uni-list class="margin-t-20">
-			<uni-list-item
-				title="设为默认"
-				:switch-checked="addressData.default"
-				:show-switch="true"
-				:show-arrow="false"
-				switch-color="#5dbc7c"
-				@switchChange="switchChange"
-			></uni-list-item>
-		</uni-list>
-
-		<button class="add-btn" @click="confirm">提交</button>
-	</view>
-</template>
-
-<script>
-import uniList from '@/components/uni-list/uni-list.vue';
-import uniListItem from '@/components/uni-list-item/uni-list-item.vue';
-import uniPopup from '@/components/uni-popup/uni-popup.vue';
-import pickerAddress from '@/components/wangding-pickerAddress/wangding-pickerAddress.vue';
-import { addressEdit } from '@/api/address.js';
-import { openMap } from '@/utils/rocessor.js';
-export default {
-	components: {
-		uniList,
-		uniListItem,
-		pickerAddress,
-		uniPopup
-	},
-	data() {
-		return {
-			addressDetail: '',
-			addressData: {
-				name: '',
-				mobile: '',
-				address: {
-					province: '',
-					city: '',
-					district: ''
-				},
-				area: '',
-				default: false
-			},
-			// 定位地址
-			addressLocation: {
-				name: '',
-				address: '',
-				errMsg: 'chooseLocation:ok',
-				latitude: '',
-				longitude: '',
-				name: '',
-				// 判断是否地址选择页进入
-				isIndex: false
-			},
-			arrDate:[
-				['浙江省'],
-				['台州市'],
-				['椒江区','黄岩区','路桥区','温岭市','临海市','玉环县'],
-			],
-		};
-	},
-	onLoad(option) {
-		let title = '新增收货地址';
-		// #ifdef MP
-		// 获取地图权限
-		uni.authorize({
-			scope: 'scope.userLocation',
-			success: res => {}
-		});
-		// #endif
-		if (option.isIndex == 3) {
-			this.isIndex = true;
-		}
-		if (option.type === 'edit') {
-			title = '编辑收货地址';
-			let data = JSON.parse(option.data);
-			console.log(data);
-			let arr = data.detail.split(',')
-			let len = arr.length - 1
-			this.addressLocation.name = arr[0]
-			this.addressLocation.latitude = data.latitude
-			this.addressLocation.longitude = data.longitude
-			this.addressData = {
-				name: data.real_name,
-				mobile: data.phone,
-				address: {
-					province: data.province,
-					city: data.city,
-					district: data.district
-				},
-				area: data.detail.split(',')[len],
-				default: data.is_default == 1,
-				id: data.id
-			};
-			this.addressDetail = data.province + data.city + data.district;
-		}
-		this.manageType = option.type;
-		uni.setNavigationBarTitle({
-			title
-		});
-	},
-	methods: {
-		// 选中经纬度
-		clickMap() {
-			uni.showLoading({
-				title: '加载中'
-			});
-			let obj = this;
-			// #ifndef APP-PLUS
-			uni.chooseLocation({
-				type: 'gcj02',
-				success: function(res) {
-					obj.addressLocation.name = res.name;
-					console.log('位置名称:' + res.name);
-					console.log('详细地址:' + res.address);
-					console.log('纬度:' + res.latitude);
-					console.log('经度:' + res.longitude);
-					obj.addressLocation.latitude = res.latitude;
-					obj.addressLocation.longitude = res.longitude;
-				}
-			});
-			// #endif
-			// #ifdef APP-PLUS
-			uni.hideLoading();
-			uni.getLocation({
-				type: 'gcj02',
-				success(e) {
-					uni.chooseLocation({
-						latitude: e.latitude,
-						longitude: e.longitude,
-						success(e) {
-							obj.addressLocation = e;
-							console.log(e,"123456")
-						},
-						fail(e) {
-							uni.showModal({
-								title:'地址选择错误',
-								content:JSON.parse(e)
-							})
-							console.log(e);
-						}
-					});
-				},fail(e) {
-					uni.showModal({
-						title:'定位错误',
-						content:JSON.parse(e)
-					})
-				}
-			});
-			// uni.chooseLocation()
-			// #endif
-			
-		},
-		// 选中城市切换
-		onCityClick({ data }) {
-			let address = this.addressData.address;
-			address.province = data[0];
-			address.city = data[1];
-			address.district = data[2];
-			this.addressDetail = data.join(',');
-		},
-		
-		// 选择地址
-		cityChange:function(e) {
-			console.log(e)
-			let address = this.addressData.address;
-			let type1 = e.detail.value[0];
-			let type2 = e.detail.value[1];
-			let type3 = e.detail.value[2];
-			address.province = this.arrDate[0][type1];
-			console.log(address.province)
-			address.city = this.arrDate[1][type2];
-			console.log(address.city)
-			address.district = this.arrDate[2][type3];
-			console.log(address.district)
-			this.addressDetail = address.province + ' ' + address.city + ' ' + address.district;
-		},
-		
-		// 设置是否为默认地址
-		switchChange(e) {
-			this.addressData.default = e.value;
-		},
-		//提交
-		confirm() {
-			let obj = this;
-			let data = this.addressData;
-			if (!data.name) {
-				this.$api.msg('请填写收货人姓名');
-				return;
-			}
-			if (!/(^1[3|4|5|7|8][0-9]{9}$)/.test(data.mobile)) {
-				this.$api.msg('请输入正确的手机号码');
-				return;
-			}
-			if (!data.address) {
-				this.$api.msg('请在地图选择所在位置');
-				return;
-			}
-			if (!data.area) {
-				this.$api.msg('请填写门牌号信息');
-				return;
-			}
-			if(data.area.length<4){
-				this.$api.msg('请填写具体信息精确到门牌号');
-				return;
-			}
-			if(obj.addressLocation.longitude == '') {
-				this.$api.msg('请选择正确的定位地址');
-				return;
-			}
-			if(obj.addressLocation.latitude == '') {
-				this.$api.msg('请选择正确的定位地址');
-				return;
-			}
-			//this.$api.prePage()获取上一页实例,可直接调用上页所有数据和方法,在App.vue定义
-			addressEdit({
-				type: 1,
-				real_name: data.name,
-				phone: data.mobile,
-				address: {
-					province: data.address.province,
-					city: data.address.city,
-					district: data.address.district
-				},
-				detail: obj.addressLocation.name + ',' + data.area,
-				is_default: data.default,
-				id: data.id || '',
-				longitude: obj.addressLocation.longitude,
-				latitude: obj.addressLocation.latitude,
-			}).then(function(e) {
-				uni.showToast({
-					title: '提交成功',
-					duration: 2000,
-					icon: 'none'
-				});
-				setTimeout(function() {
-					console.log('返回');
-					uni.navigateBack();
-				}, 800);
-
-				obj.$api.prePage().refreshList();
-			});
-		}
-	}
-};
-</script>
-
-<style lang="scss">
-page {
-	background: $page-color-base;
-	padding-top: 16rpx;
-}
-
-.row {
-	display: flex;
-	align-items: center;
-	position: relative;
-	padding: 0 30rpx;
-	height: 110rpx;
-	background: #fff;
-
-	.tit {
-		flex-shrink: 0;
-		width: 120rpx;
-		font-size: 30rpx;
-		color: $font-color-dark;
-	}
-	.input {
-		flex: 1;
-		font-size: 30rpx;
-		color: $font-color-dark;
-	}
-	.iconlocation {
-		font-size: 36rpx;
-		color: $font-color-light;
-	}
-}
-.default-row {
-	margin-top: 16rpx;
-	.tit {
-		flex: 1;
-	}
-	switch {
-		transform: translateX(16rpx) scale(0.9);
-	}
-}
-.add-btn {
-	display: flex;
-	align-items: center;
-	justify-content: center;
-	width: 690rpx;
-	height: 80rpx;
-	margin: 60rpx auto;
-	font-size: $font-lg;
-	color: #fff;
-	background-color: $base-color;
-	border-radius: 10rpx;
-	// box-shadow: 1px 2px 5px rgba(219, 63, 96, 0.4);
-}
-
-.alert-box {
-	background-color: #ffffff;
-}
-</style>

+ 0 - 173
pages/address/shopList.vue

@@ -1,173 +0,0 @@
-<template>
-	<view class="content b-t">
-		<view class="list" v-for="(item, index) in addressList" :key="index" @click="checkAddress(item)">
-			<view class="wrapper">
-				<view class="address-box">
-					<text class="name">{{ item.name }}</text>
-					<text class="mobile">{{ item.phone }}</text>
-				</view>
-				<view class="u-box">
-					<view class="address">{{ item.address }}</view>
-					<view class="address">{{ item.detailed_address }}</view>
-				</view>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-import { getAddressList } from '@/api/address.js';
-export default {
-	data() {
-		return {
-			source: 0,
-			addressList: [], //显示的地址数据
-			value: '', //保存查询值
-			addressListAll: [] //保存地址数据
-		};
-	},
-	// #ifdef APP-PLUS || H5
-	onNavigationBarButtonTap(e) {
-		if (e.text === '搜索') {
-			this.searchAddressList();
-		}
-	},
-	// 监听原生标题栏搜索输入框输入内容变化事件
-	onNavigationBarSearchInputChanged(e) {
-		this.value = e.text;
-	},
-	// 监听原生标题栏搜索输入框搜索事件,用户点击软键盘上的“搜索”按钮时触发
-	onNavigationBarSearchInputConfirmed() {
-		this.searchAddressList();
-	},
-	// #endif
-	onLoad(option) {
-		this.addressListAll = this.addressList = this.$api.prePage().system_store;
-		console.log(this.addressListAll);
-	},
-	methods: {
-		// 地址查询功能
-		searchAddressList() {
-			let obj = this;
-			obj.addressList = obj.addressListAll.filter(e => {
-				// 判断客户是否有输入值并且能查询到
-				if (e.name.indexOf(obj.value) >= 0 && obj.value) {
-					return true;
-				} else if (obj.value.length == 0) {
-					return true;
-				}
-			});
-			console.log(obj.addressList);
-		},
-		//选择地址
-		checkAddress(item) {
-			// 设置商品页面地址
-			this.$api.prePage().shopAddress = item;
-			uni.navigateBack();
-		}
-	}
-};
-</script>
-
-<style lang="scss">
-page {
-	padding-bottom: 120rpx;
-	padding-top: 20rpx;
-}
-.content {
-	position: relative;
-}
-.list {
-	align-items: center;
-	padding: 20rpx 30rpx;
-	background: #fff;
-	margin: 20rpx;
-	margin-top: 0;
-	.buttom {
-		display: flex;
-		align-items: center;
-		justify-content: space-between;
-		padding-top: 10rpx;
-		.checkbox {
-			font-size: 44rpx;
-			line-height: 1;
-			padding: 4rpx;
-			color: $font-color-disabled;
-			background: #fff;
-			border-radius: 50px;
-		}
-		.checkbox.checked {
-			color: $base-color;
-		}
-		.default-buttom {
-			display: flex;
-			align-items: center;
-		}
-		.operation {
-			display: flex;
-			align-items: center;
-			.blank {
-				width: 30rpx;
-			}
-		}
-		.text {
-			padding-left: 10rpx;
-			font-size: 24rpx;
-			color: #666666;
-		}
-	}
-}
-.wrapper {
-	display: flex;
-	flex-direction: column;
-	flex: 1;
-	// border-bottom: 1px solid #f0f0f0;
-	// padding-bottom: 20rpx;
-}
-.address-box {
-	display: flex;
-	align-items: center;
-	justify-content: space-between;
-	.address {
-		font-size: $font-base + 2rpx;
-		color: $font-color-dark;
-	}
-	.mobile {
-		font-size: $font-base;
-		color: rgba(51, 51, 51, 1);
-	}
-}
-.u-box {
-	font-size: $font-base;
-	color: $font-color-light;
-	margin-top: 16rpx;
-	.name {
-		margin-right: 30rpx;
-	}
-}
-.icon-bianji {
-	display: flex;
-	align-items: center;
-	height: 80rpx;
-	font-size: 40rpx;
-	color: $font-color-light;
-	padding-left: 30rpx;
-}
-
-.add-btn {
-	position: fixed;
-	left: 30rpx;
-	right: 30rpx;
-	bottom: 16rpx;
-	z-index: 95;
-	display: flex;
-	align-items: center;
-	justify-content: center;
-	width: 690rpx;
-	height: 80rpx;
-	font-size: $font-lg;
-	color: #fff;
-	background-color: $base-color;
-	border-radius: 10rpx;
-}
-</style>

+ 0 - 350
pages/award/award.vue

@@ -1,350 +0,0 @@
-<template>
-	<view class="content">
-		<view class="content-money">
-			<view class="money-box">
-				<view class="bg"><image src="../../static/img/yong.png" mode=""></image></view>
-				<view class="body-title">
-					<view class="goback-box" @click="toBack"><image class="goback" src="../../static/icon/fanhui.png" mode=""></image></view>
-					<view class="header">我的佣金</view>
-				</view>
-				<view>
-					<view class="money">{{ money | getMoneyStyle }}</view>
-				</view>
-			</view>
-			<!-- <view class="moneyTx" @click="navto('./withdrawal')">提现</view> -->
-			<!-- <view class="moneyTxs" @click="navto('./withdmoenys')" >转余额</view> -->
-			<!-- <view class="flex buttom-box">
-				<view class="buttom" @click="navto('./withdrawal')">
-					<view class="icon"><image class="icon-img" src="/static/icon/i6.png" mode="aspectFit"></image></view>
-					<text class="font-size-sm">提现</text>
-				</view>
-				<view class="interval"></view>
-				<view class="buttom" @click="navto('./withdmoenys')">
-					<view class="icon"><image class="icon-img" src="/static/icon/i7.png" mode="aspectFit"></image></view>
-					<text class="font-size-sm">转余额</text>
-				</view>
-			</view> -->
-		</view>
-		<view class="navbar">
-			<view v-for="(item, index) in navList" :key="index" class="nav-item" :class="{ current: tabCurrentIndex === index }" @click="tabClick(index)">{{ item.text }}</view>
-		</view>
-		<swiper :current="tabCurrentIndex" :style="{ height: maxheight + 'px' }" class="swiper-box" duration="300" @change="changeTab">
-			<swiper-item class="tab-content" v-for="(tabItem, tabIndex) in navList" :key="tabIndex">
-				<scroll-view class="list-scroll-content" scroll-y @scrolltolower="loadData">
-					<!-- 空白页 -->
-					<empty v-if="tabItem.loaded === true && tabItem.orderList.length === 0"></empty>
-
-					<!-- 订单列表 -->
-					<view v-for="(item, index) in tabItem.orderList" :key="index" class="order-item flex">
-						<view class="title-box">
-							<view class="title">
-								<text>{{ item.title }}</text>
-							</view>
-							<view class="time">
-								<text>{{ item.add_time }}</text>
-							</view>
-						</view>
-						<view class="money">
-							<text>{{ (item.pm == 0 ? '-' : '+') + item.number }}</text>
-						</view>
-					</view>
-					<uni-load-more :status="tabItem.loadingType"></uni-load-more>
-				</scroll-view>
-			</swiper-item>
-		</swiper>
-		<view class="btn" @click="navto('/pages/award/withdrawal')">立即提现</view>
-	</view>
-</template>
-
-<script>
-import { spreadCommission, extractBank } from '@/api/wallet.js';
-import { mapState, mapMutations } from 'vuex';
-import { getMoneyStyle } from '@/utils/rocessor.js';
-import uniLoadMore from '@/components/uni-load-more/uni-load-more.vue';
-import empty from '@/components/empty';
-export default {
-	filters: {
-		getMoneyStyle
-	},
-	components: {
-		empty,
-		uniLoadMore
-	},
-	onReady() {
-		// 初始化获取页面宽度
-		uni.createSelectorQuery()
-			.select('.content')
-			.fields(
-				{
-					size: true
-				},
-				data => {
-					// 保存头部高度
-					this.maxheight = data.height - Math.floor((data.width / 750) * 570);
-					console.log(this.maxheight);
-				}
-			)
-			.exec();
-	},
-	data() {
-		return {
-			// 头部图高度
-			maxheight: '',
-			tabCurrentIndex: 0,
-			navList: [
-				{
-					state: 0,
-					text: '收入',
-					loadingType: 'more',
-					orderList: [],
-					page: 1, //当前页数
-					limit: 10 //每次信息条数
-				},
-				{
-					state: 1,
-					text: '支出',
-					loadingType: 'more',
-					orderList: [],
-					page: 1, //当前页数
-					limit: 10 //每次信息条数
-				}
-			],
-			money: '', //可提现佣金
-			freezeMoney: '' //冻结中的佣金
-		};
-	},
-	onLoad(options) {},
-	onShow() {
-		this.loadData();
-		// 获取用户余额
-		extractBank({}).then(({ data }) => {
-			this.money = data.commissionCount;
-			// 冻结佣金
-			this.freezeMoney = data.freezePrice;
-		});
-	},
-	methods: {
-		// 页面跳转
-		navto(e) {
-			uni.navigateTo({
-				url: e
-			});
-		},
-		//返回上一页面
-		toBack() {
-			console.log(111);
-			uni.navigateBack({});
-		},
-		//获取收入支出信息
-		async loadData(source) {
-			//这里是将订单挂载到tab列表下
-			let index = this.tabCurrentIndex;
-			let navItem = this.navList[index];
-			let state = navItem.state + 3;
-			if (source === 'tabChange' && navItem.loaded === true) {
-				//tab切换只有第一次需要加载数据
-				return;
-			}
-			if (navItem.loadingType === 'loading') {
-				//防止重复加载
-				return;
-			}
-			// 修改当前对象状态为加载中
-			navItem.loadingType = 'loading';
-
-			spreadCommission(
-				{
-					page: navItem.page,
-					limit: navItem.limit
-				},
-				state
-			)
-				.then(({ data }) => {
-					if (data.length > 0) {
-						navItem.orderList = navItem.orderList.concat(data[0].list);
-						console.log(navItem.orderList);
-						navItem.page++;
-					}
-					if (navItem.limit == data.length) {
-						//判断是否还有数据, 有改为 more, 没有改为noMore
-						navItem.loadingType = 'more';
-						return;
-					} else {
-						//判断是否还有数据, 有改为 more, 没有改为noMore
-						navItem.loadingType = 'noMore';
-					}
-					uni.hideLoading();
-					this.$set(navItem, 'loaded', true);
-				})
-				.catch(e => {
-					console.log(e);
-				});
-		},
-
-		//swiper 切换
-		changeTab(e) {
-			this.tabCurrentIndex = e.target.current;
-			this.loadData('tabChange');
-		},
-		//顶部tab点击
-		tabClick(index) {
-			this.tabCurrentIndex = index;
-		}
-	}
-};
-</script>
-
-<style lang="scss">
-page {
-	background: #ffffff;
-	height: 100%;
-}
-.content-money {
-	padding-bottom: 30rpx;
-	background: $page-color-base;
-}
-.money-box {
-	background-color: $base-color;
-	padding-top: var(--status-bar-height);
-	height: 468rpx;
-	color: #ffffff;
-	text-align: center;
-	justify-content: center;
-	position: relative;
-	.body-title {
-		height: 80rpx;
-		text-align: center;
-		font-size: 35rpx;
-		position: relative;
-		.header {
-			position: absolute;
-			left: 0;
-			top: 0;
-			width: 100%;
-			font-size: 36rpx;
-			font-family: PingFang SC;
-			font-weight: bold;
-			color: #fffeff;
-			height: 80rpx;
-			font-size: 32rpx;
-			font-weight: 700;
-			z-index: 9;
-			display: flex;
-			justify-content: center;
-			align-items: center;
-		}
-		.goback-box {
-			position: absolute;
-			z-index: 10;
-			left: 24rpx;
-			top: 0;
-			height: 80rpx;
-			display: flex;
-			align-items: center;
-		}
-		.goback {
-			width: 30rpx;
-			height: 36rpx;
-		}
-	}
-	.bg {
-		position: absolute;
-		top: 0;
-		left: 0;
-		width: 100%;
-		height: 100%;
-		image {
-			width: 100%;
-			height: 100%;
-		}
-	}
-	.money {
-		position: relative;
-		z-index: 10;
-		font-size: 56rpx;
-		height: 388rpx;
-		line-height: 288rpx;
-	}
-}
-
-.navbar {
-	display: flex;
-	height: 40px;
-	padding: 0 5px;
-	background: #fff;
-	box-shadow: 0 1px 5px rgba(0, 0, 0, 0.06);
-	position: relative;
-	z-index: 10;
-	.nav-item {
-		flex: 1;
-		display: flex;
-		justify-content: center;
-		align-items: center;
-		height: 100%;
-		font-size: 15px;
-		color: $font-color-dark;
-		position: relative;
-		&.current {
-			color: $base-color;
-			&:after {
-				content: '';
-				position: absolute;
-				left: 50%;
-				bottom: 0;
-				transform: translateX(-50%);
-				width: 44px;
-				height: 0;
-				border-bottom: 2px solid $base-color;
-			}
-		}
-	}
-}
-// 列表
-
-.swiper-box {
-	padding-top: 10rpx;
-	.order-item {
-		padding: 20rpx 30rpx;
-		line-height: 1.5;
-		.title-box {
-			.title {
-				font-size: $font-lg;
-				color: $font-color-base;
-			}
-			.time {
-				font-size: $font-base;
-				color: $font-color-light;
-			}
-		}
-		.money {
-			color: #fd5b23;
-			font-size: $font-lg;
-		}
-	}
-}
-.list-scroll-content {
-	height: 100%;
-}
-.content {
-	height: 100%;
-	.empty-content {
-		background-color: #ffffff;
-	}
-}
-.btn {
-	position: fixed;
-	bottom: 40rpx;
-	left: 50%;
-	width: 674rpx;
-	height: 88rpx;
-	background: #52c696;
-	border-radius: 44rpx;
-	margin-left: -337rpx;
-	font-size: 36rpx;
-	font-family: PingFang SC;
-	font-weight: bold;
-	text-align: center;
-	line-height: 88rpx;
-	color: #ffffff;
-}
-</style>

+ 0 - 313
pages/award/withdmoenys.vue

@@ -1,313 +0,0 @@
-<template>
-	<view class="content">
-		<uni-notice-bar single="true" text="每月25号到月底可提现上月结算余额"></uni-notice-bar>
-		<view class="content-money">
-			<view class="flex ">
-				<view class="buttom">
-					<view class="icon">{{ money | getMoneyStyle }}</view>
-					<text class="text">可提现佣金</text>
-				</view>
-				<view class="interval"></view>
-				<view class="buttom">
-					<view class=" icon">{{ freeze | getMoneyStyle }}</view>
-					<text class="text">待审核提现佣金</text>
-				</view>
-			</view>
-		</view>
-		<view class="row-box">
-			<view class="title">转账金额</view>
-			<view class="row">
-				<text class="tit">¥</text>
-				<input class="input" type="number" v-model="withdrawal" placeholder='转入金额' placeholder-class="placeholder" />
-				<view class="buttom" @click="withdrawal = money">全部转账</view>
-			</view>
-		</view>
-		<!-- #ifndef MP-WEIXIN -->
-		<!--
-		<view class="list">
-			<radio-group @change="tabRadio">
-				 <label>
-					<view class="box">
-						<view class="icon iconfont iconweixin1"></view>
-						<view class="title-box">
-							<view class="title"><text>提现至微信</text></view>
-						</view>
-						<view class="right"><radio value="weixin" color="#5dbc7c" :checked="type == 'weixin'" /></view>
-					</view>
-				</label> 
-				<label>
-					
-					<view class="box">
-						<view class="icon iconfont iconzhifubao"></view>
-						<view class="title-box">
-							<view class="title">
-								<text v-if="aliData.fullname">提现至支付宝</text>
-								<text v-else>请创建支付宝账号</text>
-							</view>
-							<view class="node">
-								<text v-if="aliData.fullname">真实姓名({{ aliData.fullname }})</text>
-							</view>
-						</view>
-						<view class="right"><radio value="alipay" color="#5dbc7c" :checked="type == 'alipay'" /></view>
-					</view>
-				</label>
-				<label>
-					<view class="box">
-						<view class="icon iconfont"><image class="icon-img" src="/static/icon/i8.png" mode="aspectFit"></image></view>
-						<view class="title-box">
-							<view class="title">
-								<text v-if="bankData.bankno">{{ bankData.bank + ' ' + bankData.bankno }}</text>
-								<text v-else>请创建银行账号</text>
-							</view>
-							<view class="node">
-								<text v-if="bankData.fullname">真实姓名({{ bankData.fullname }})</text>
-							</view>
-						</view>
-						<view class="right"><radio value="bank" color="#5dbc7c" :checked="type == 'bank'" /></view>
-					</view>
-				</label>
-			</radio-group>
-		</view>-->
-		<!-- #endif -->
-		<button class="add-btn up" :class="{'action':loding}" @click="!loding?confirm():''">转入</button>
-	</view>
-</template>
-
-<script>
-import { getMoneyStyle } from '@/utils/rocessor.js';
-import { extractCashs, extractBank, aliInfo, bankInfo } from '@/api/wallet.js';
-import uniNoticeBar from '@/components/uni-notice-bar/uni-notice-bar.vue';
-export default {
-	filters: {
-		getMoneyStyle
-	},
-	components: {
-		uniNoticeBar
-	},
-	data() {
-		return {
-			type: 'bank', //提现方式
-			money: '0.00', //可提现金额
-			freeze: '0.0', //冻结金额
-			withdrawal: '', //提现金额
-			minPrice: '', //最少提现金额
-			aliData: {},
-			bankData: {},
-			// #ifdef H5
-			weichatBsrowser: false,
-			// #endif
-			loding:false,
-		};
-	},
-	onLoad(options) {
-		// #ifdef H5
-		this.weichatBsrowser = uni.getStorageSync('weichatBrowser');
-		// #endif
-		//加载提现信息
-		this.loadData();
-		// 加载提款账号信息
-		this.loadAli();
-		this.loadBank();
-	},
-	methods: {
-		// 更新数据
-		dataUp(){
-			this.loadAli();
-			this.loadBank();
-		},
-		//加载数据
-		async loadAli(source) {
-			aliInfo({}).then(e => {
-				this.aliData = e.data;
-			});
-		},
-		// 加载银行卡信息
-		async loadBank() {
-			bankInfo({}).then(e => {
-				this.bankData = e.data;
-			});
-		},
-		// 加载余额信息
-		async loadData() {
-			extractBank({}).then(({ data }) => {
-				this.money = data.commissionCount;
-				this.freeze =data.incommissionCount
-			});
-		},
-		// 跳转
-		navTo(url) {
-			uni.navigateTo({
-				url: url
-			});
-		},
-		// 切换选中对象
-		tabRadio(e) {
-			this.type = e.detail.value;
-		},
-		// 提交
-		confirm() {
-			let obj = this;
-			obj.loding = true;
-			let data = {
-				from:"weixinh5", //
-				price: this.withdrawal, //金额
-				type: 1 //0佣金1余额
-			}
-			extractCashs(data)
-				.then(e => {
-					// 允许按钮点击
-					obj.loding = false;
-					// 初始化提现金额
-					obj.withdrawal = ''
-					uni.showToast({
-						title: '提交成功',
-						duration: 2000,
-						position: 'top'
-					});
-					
-				})
-				.catch(e => {
-					obj.loding = false;
-					console.log();
-				});
-		}
-	}
-};
-</script>
-
-<style lang="scss">
-page {
-	height: 100%;
-}
-.content-money {
-	padding: 30rpx 0;
-	background: #ffffff;
-}
-.flex {
-	background-color: #ffffff;
-	text-align: center;
-	margin: 0 30rpx;
-	border-radius: $border-radius-sm;
-	.buttom {
-		font-size: $font-lg;
-		width: 50%;
-	}
-	.interval {
-		width: 2px;
-		height: 60rpx;
-		background-color: #eeeeee;
-	}
-	.icon {
-		background-size: 100%;
-		font-size: 42rpx;
-		color: $font-color-dark;
-		font-weight: bold;
-		background-repeat: no-repeat;
-		background-position: center;
-	}
-	.text {
-		color: $font-color-light;
-	}
-}
-
-.row-box {
-	margin-top: 30rpx;
-	padding: 20rpx 30rpx;
-	background: #fff;
-	.title {
-		font-size: $font-base + 2rpx;
-		color: $font-color-dark;
-	}
-	.row {
-		display: flex;
-		align-items: center;
-		position: relative;
-		height: 80rpx;
-		.tit {
-			flex-shrink: 0;
-			width: 40rpx;
-			font-size: 30rpx;
-			color: $font-color-dark;
-		}
-		.input {
-			flex: 1;
-			font-size: 30rpx;
-			color: $font-color-dark;
-		}
-		.iconlocation {
-			font-size: 36rpx;
-			color: $font-color-light;
-		}
-
-		.buttom {
-			color: $font-color-spec;
-			font-size: $font-base;
-		}
-	}
-}
-.add-btn {
-	&.modified {
-		color: $base-color;
-	}
-	&.up {
-		background-color: $base-color;
-		color: #fff;
-	}
-	&.action{
-		background-color: $color-gray;
-	}
-	display: flex;
-	align-items: center;
-	justify-content: center;
-	width: 690rpx;
-	height: 80rpx;
-	margin: 0 auto;
-	margin-top: 30rpx;
-	font-size: $font-lg;
-	border-radius: 10rpx;
-	// box-shadow: 1px 2px 5px rgba(219, 63, 96, 0.4);
-}
-
-.list {
-	padding-left: 30rpx;
-	margin-top: 30rpx;
-	background-color: #ffffff;
-	.box {
-		display: flex;
-		align-items: center;
-		width: 100%;
-		height: 120rpx;
-		border-bottom: 1px solid $border-color-light;
-		.icon {
-			font-size: 48rpx;
-			padding-right: 20rpx;
-			.icon-img {
-				height: 50rpx;
-				width: 50rpx;
-			}
-		}
-		.iconweixin1 {
-			color: #18bf16;
-		}
-		.iconzhifubao {
-			color: #08aaec;
-		}
-		.title-box {
-			flex-grow: 1;
-			text-align: left;
-			.title {
-				font-size: $font-base + 2rpx;
-				color: $font-color-base;
-			}
-			.node {
-				font-size: $font-sm;
-				color: $font-color-light;
-			}
-		}
-	}
-}
-/deep/ .uni-radio-input {
-	width: 45rpx;
-	height: 45rpx;
-}
-</style>

+ 0 - 332
pages/award/withdrawal.vue

@@ -1,332 +0,0 @@
-<template>
-	<view class="content">
-		<!-- <uni-notice-bar single="true" text="每月25号到月底可提现上月结算余额"></uni-notice-bar> -->
-		<view class="content-money">
-			<view class="flex ">
-				<view class="buttom">
-					<view class="icon">{{ money | getMoneyStyle }}</view>
-					<text class="text">可提现佣金</text>
-				</view>
-				<view class="interval"></view>
-				<view class="buttom">
-					<view class=" icon">{{ freeze | getMoneyStyle }}</view>
-					<text class="text">待审核提现佣金</text>
-				</view>
-			</view>
-		</view>
-		<view class="row-box">
-			<view class="title">提现金额</view>
-			<view class="row">
-				<text class="tit">¥</text>
-				<input class="input" type="number" v-model="withdrawal" :placeholder="'最低提现金额' + minPrice + '元'" placeholder-class="placeholder" />
-				<view class="buttom" @click="withdrawal = money">全部提现</view>
-			</view>
-		</view>
-		<!-- <view class="row-box">
-			<view class="title">手续费</view>
-			<view class="row">
-				<text class="tit">¥</text>
-				<view class="placeholder">{{ withdrawal * 0.01*charge }}</view>
-			</view>
-		</view> -->
-		<!-- #ifndef MP-WEIXIN -->
-		<view class="list">
-			<radio-group @change="tabRadio">
-				<label>
-					<view class="box">
-						<view class="icon iconfont iconweixin1"></view>
-						<view class="title-box">
-							<view class="title"><text>提现至微信</text></view>
-						</view>
-						<view class="right"><radio value="weixin" color="#5dbc7c" :checked="type == 'weixin'" /></view>
-					</view>
-				</label>
-				<label>
-					<view class="box">
-						<view class="icon iconfont iconzhifubao"></view>
-						<view class="title-box">
-							<view class="title">
-								<text v-if="aliData.fullname">提现至支付宝</text>
-								<text v-else>请创建支付宝账号</text>
-							</view>
-							<view class="node">
-								<text v-if="aliData.fullname">真实姓名({{ aliData.fullname }})</text>
-							</view>
-						</view>
-						<view class="right"><radio value="alipay" color="#5dbc7c" :checked="type == 'alipay'" /></view>
-					</view>
-				</label>
-				<label>
-					<view class="box">
-						<view class="icon iconfont"><image class="icon-img" src="/static/icon/i8.png" mode="aspectFit"></image></view>
-						<view class="title-box">
-							<view class="title">
-								<text v-if="bankData.bankno">{{ bankData.bank + ' ' + bankData.bankno }}</text>
-								<text v-else>请创建银行账号</text>
-							</view>
-							<view class="node">
-								<text v-if="bankData.fullname">真实姓名({{ bankData.fullname }})</text>
-							</view>
-						</view>
-						<view class="right"><radio value="bank" color="#5dbc7c" :checked="type == 'bank'" /></view>
-					</view>
-				</label>
-			</radio-group>
-		</view>
-		<!-- #endif -->
-		<button class="add-btn up" @click="confirm">提交申请</button>
-		<button class="add-btn modified" @click="navTo('/pages/wallet/account')">账号管理</button>
-	</view>
-</template>
-
-<script>
-import { getMoneyStyle } from '@/utils/rocessor.js';
-import { extractCash, extractBank, aliInfo, bankInfo } from '@/api/wallet.js';
-import uniNoticeBar from '@/components/uni-notice-bar/uni-notice-bar.vue';
-export default {
-	filters: {
-		getMoneyStyle
-	},
-	components: {
-		uniNoticeBar
-	},
-	data() {
-		return {
-			type: 'weixin', //提现方式
-			money: '0.00', //可提现金额
-			freeze: '0.0', //冻结金额
-			withdrawal: '', //提现金额
-			minPrice: '', //最少提现金额
-			aliData: {},
-			bankData: {},
-			charge:0,
-			// #ifdef H5
-			weichatBsrowser: false
-			// #endif
-		};
-	},
-	onLoad(options) {
-		// #ifdef H5
-		this.weichatBsrowser = uni.getStorageSync('weichatBrowser');
-		// #endif
-		//加载提现信息
-		this.loadData();
-		// 加载提款账号信息
-		this.loadAli();
-		this.loadBank();
-	},
-	methods: {
-		// 更新数据
-		dataUp() {
-			this.loadAli();
-			this.loadBank();
-		},
-		//加载数据
-		async loadAli(source) {
-			aliInfo({}).then(e => {
-				this.aliData = e.data;
-			});
-		},
-		// 加载银行卡信息
-		async loadBank() {
-			bankInfo({}).then(e => {
-				this.bankData = e.data;
-			});
-		},
-		// 加载余额信息
-		async loadData() {
-			extractBank({}).then(({ data }) => {
-				this.money = data.commissionCount;
-				this.minPrice = data.minPrice;
-				this.freeze = data.incommissionCount;
-				this.charge = data.cash_out;
-			});
-		},
-		// 跳转
-		navTo(url) {
-			uni.navigateTo({
-				url: url
-			});
-		},
-		// 切换选中对象
-		tabRadio(e) {
-			this.type = e.detail.value;
-		},
-		// 提交
-		confirm() {
-			let obj = this;
-			let data = {
-				extract_type: obj.type, //bank -银行卡 alipay-支付宝 weixin-微信
-				money: obj.withdrawal, //金额
-				money_type: 0 //0佣金1余额
-			};
-			if (+obj.withdrawal < +obj.minPrice) {
-				uni.showToast({
-					title: '提现金额不可少于' + obj.minPrice,
-					duration: 2000,
-					mask: false,
-					icon: 'none'
-				});
-				return;
-			}
-			if (obj.type == 'alipay') {
-				data.name = obj.aliData.fullname;
-				data.alipay_code = obj.aliData.alino;
-			}
-			if (obj.type == 'bank') {
-				data.name = obj.bankData.fullname;
-				data.bankname = obj.bankData.bank;
-				data.cardnum = obj.bankData.bankno;
-			}
-
-			extractCash(data)
-				.then(e => {
-					uni.showToast({
-						title: '提交成功',
-						duration: 2000,
-						position: 'top'
-					});
-					// 清空提现金额
-					obj.withdrawal = '';
-				})
-				.catch(e => {
-					console.log();
-				});
-		}
-	}
-};
-</script>
-
-<style lang="scss">
-page {
-	height: 100%;
-}
-.content-money {
-	padding: 30rpx 0;
-	background: #ffffff;
-}
-.flex {
-	background-color: #ffffff;
-	text-align: center;
-	margin: 0 30rpx;
-	border-radius: $border-radius-sm;
-	.buttom {
-		font-size: $font-lg;
-		width: 50%;
-	}
-	.interval {
-		width: 2px;
-		height: 60rpx;
-		background-color: #eeeeee;
-	}
-	.icon {
-		background-size: 100%;
-		font-size: 42rpx;
-		color: $font-color-dark;
-		font-weight: bold;
-		background-repeat: no-repeat;
-		background-position: center;
-	}
-	.text {
-		color: $font-color-light;
-	}
-}
-
-.row-box {
-	margin-top: 30rpx;
-	padding: 20rpx 30rpx;
-	background: #fff;
-	.title {
-		font-size: $font-base + 2rpx;
-		color: $font-color-dark;
-	}
-	.row {
-		display: flex;
-		align-items: center;
-		position: relative;
-		height: 80rpx;
-		.tit {
-			flex-shrink: 0;
-			width: 40rpx;
-			font-size: 30rpx;
-			color: $font-color-dark;
-		}
-		.input {
-			flex: 1;
-			font-size: 30rpx;
-			color: $font-color-dark;
-		}
-		.iconlocation {
-			font-size: 36rpx;
-			color: $font-color-light;
-		}
-
-		.buttom {
-			color: $font-color-spec;
-			font-size: $font-base;
-		}
-	}
-}
-.add-btn {
-	&.modified {
-		color: $base-color;
-	}
-	&.up {
-		background-color: $base-color;
-		color: #fff;
-	}
-	display: flex;
-	align-items: center;
-	justify-content: center;
-	width: 690rpx;
-	height: 80rpx;
-	margin: 0 auto;
-	margin-top: 30rpx;
-	font-size: $font-lg;
-	border-radius: 10rpx;
-	// box-shadow: 1px 2px 5px rgba(219, 63, 96, 0.4);
-}
-
-.list {
-	padding-left: 30rpx;
-	margin-top: 30rpx;
-	background-color: #ffffff;
-	.box {
-		display: flex;
-		align-items: center;
-		width: 100%;
-		height: 120rpx;
-		border-bottom: 1px solid $border-color-light;
-		.icon {
-			font-size: 48rpx;
-			padding-right: 20rpx;
-			.icon-img {
-				height: 50rpx;
-				width: 50rpx;
-			}
-		}
-		.iconweixin1 {
-			color: #18bf16;
-		}
-		.iconzhifubao {
-			color: #08aaec;
-		}
-		.title-box {
-			flex-grow: 1;
-			text-align: left;
-			.title {
-				font-size: $font-base + 2rpx;
-				color: $font-color-base;
-			}
-			.node {
-				font-size: $font-sm;
-				color: $font-color-light;
-			}
-		}
-	}
-}
-/deep/ .uni-radio-input {
-	width: 45rpx;
-	height: 45rpx;
-}
-</style>

+ 336 - 637
pages/cart/cart.vue

@@ -5,8 +5,7 @@
 			<image src="/static/error/emptyCart.png" class="emptyImg" mode="aspectFit"></image>
 			<view v-if="hasLogin" class="empty-tips">
 				空空如也
-				<navigator class="navigator" v-if="hasLogin" url="../index/index" open-type="switchTab">随便逛逛>
-				</navigator>
+				<navigator class="navigator" v-if="hasLogin" url="../index/index" open-type="switchTab">随便逛逛></navigator>
 			</view>
 			<view v-else class="empty-tips">
 				空空如也
@@ -14,30 +13,26 @@
 			</view>
 		</view>
 		<view v-else>
-			<!-- 购物车头部 -->
-			<view class="cart-hand flex">
-				<view class="hand-tit">
-					购物车共 <text>{{ ' '+cartList.length}} 件</text>商品
-				</view>
-				<view class="hand-btn" @click="clearCart()">
-					清空购物车
-				</view>
-			</view>
 			<!-- 列表 -->
 			<view class="cart-list">
 				<block v-for="(item, index) in cartList" :key="item.id">
 					<view class="cart-item" :class="{ 'b-b': index !== cartList.length - 1 }">
 						<view class="image-wrapper">
-							<image :src="item.productInfo.image" :class="[item.loaded]" mode="aspectFill" lazy-load
-								@load="onImageLoad('cartList', index)" @error="onImageError('cartList', index)"></image>
-							<view class="iconfont iconroundcheckfill checkbox" :class="{ checked: item.checked }"
-								@click="check('item', index)"></view>
+							<image
+								:src="item.productInfo.image"
+								:class="[item.loaded]"
+								mode="aspectFill"
+								lazy-load
+								@load="onImageLoad('cartList', index)"
+								@error="onImageError('cartList', index)"
+							></image>
+							<view class="iconfont iconroundcheckfill checkbox" :class="{ checked: item.checked }" @click="check('item', index)"></view>
 						</view>
 						<view class="item-right">
 							<text class="clamp title">{{ item.productInfo.store_name }}</text>
-							<!-- <text class="attr">{{ item.productInfo.attrInfo.suk }}</text> -->
+							<text class="attr">{{ item.attr_val }}</text>
 							<text class="price">¥{{ item.productInfo.price }}</text>
-							<!-- <uni-number-box
+							<uni-number-box
 								class="step"
 								:min="1"
 								:max="item.productInfo.stock"
@@ -46,26 +41,20 @@
 								:isMin="item.cart_num === 1"
 								:index="index"
 								@eventChange="numberChange"
-							></uni-number-box> -->
-							<view class="munbox flex">
-								<image src="../../static/icon/reduce.png" mode="" @click="reduce(item,index)"></image>
-								<input type="munber" :value="item.cart_num*1" disabled />
-								<image src="../../static/icon/add.png" mode="" @click="add(item)"></image>
-							</view>
+							></uni-number-box>
 						</view>
-						<!-- <text class="del-btn iconfont iconclose" @click="deleteCartItem(index)"></text> -->
+						<text class="del-btn iconfont iconclose" @click="deleteCartItem(index)"></text>
 					</view>
 				</block>
 			</view>
 			<!-- 底部菜单栏 -->
 			<view class="action-section">
 				<view class="checkbox">
-					<view class="iconfont iconroundcheckfill icon-checked-box" @click="check('all')"
-						:class="{ 'icon-checked': allChecked }"></view>
-					<!-- <view class="clear-btn" @click="allChecked ? clearCart() : ''" :class="{ show: allChecked }"><text>清空</text></view> -->
+					<view class="iconfont iconroundcheckfill icon-checked-box" @click="check('all')" :class="{ 'icon-checked': allChecked }"></view>
+					<view class="clear-btn" @click="allChecked ? clearCart() : ''" :class="{ show: allChecked }"><text>清空</text></view>
 				</view>
 				<view class="total-box">
-					<text class="price">合计:¥{{ total }}</text>
+					<text class="price">¥{{ total }}</text>
 					<!-- <text class="coupon">
 						已优惠
 						<text>74.35</text>
@@ -79,652 +68,362 @@
 </template>
 
 <script>
-	import {
-		getCartList,
-		getCartNum,
-		cartDel
-	} from '@/api/cart.js';
-	import {
-		mapState
-	} from 'vuex';
-	import uniNumberBox from '@/components/uni-number-box.vue';
-	import {
-		saveUrl,
-		interceptor
-	} from '@/utils/loginUtils.js';
-	export default {
-		components: {
-			uniNumberBox
-		},
-		data() {
-			return {
-				total: 0, //总价格
-				allChecked: false, //全选状态  true|false
-				empty: false, //空白页现实  true|false
-				cartList: [],
-				code: '', //商品条码
-			};
-		},
-		onShow() {
-			// 只有登录时才加载数据
-			if (this.hasLogin) {
-				this.loadData();
+import { getCartList, getCartNum, cartDel } from '@/api/user.js';
+import { mapState } from 'vuex';
+import uniNumberBox from '@/components/uni-number-box.vue';
+import { saveUrl, interceptor } from '@/utils/loginUtils.js';
+export default {
+	components: {
+		uniNumberBox
+	},
+	data() {
+		return {
+			total: 0, //总价格
+			allChecked: false, //全选状态  true|false
+			empty: false, //空白页现实  true|false
+			cartList: []
+		};
+	},
+	onShow() {
+		// 只有登录时才加载数据
+		if (this.hasLogin) {
+			this.loadData();
+		}
+	},
+	watch: {
+		//显示空白页
+		cartList(e) {
+			let empty = e.length === 0 ? true : false;
+			if (this.empty !== empty) {
+				this.empty = empty;
 			}
+		}
+	},
+	computed: {
+		...mapState('user', ['hasLogin'])
+	},
+	methods: {
+		//请求数据
+		async loadData() {
+			let obj = this;
+			getCartList({})
+				.then(function(e) {
+					// 获取当前购物车物品增加数量
+					let nub = obj.cartList.length;
+					// 获取之前对象数组
+					let aArray = obj.cartList.reverse();
+					// 获取返回数据对象数组
+					let bArray = e.data.valid.reverse();
+					obj.cartList = bArray
+						.map((item, ind) => {
+							// 设置返回数据默认为勾选状态
+							item.checked = true;
+							// 获取相同数组之前对象的数据
+							let carlist = aArray[ind];
+							// 判断之前是否已经加载完毕
+							if (carlist && carlist.loaded == 'loaded') {
+								item.loaded = 'loaded';
+							}
+							return item;
+						})
+						.reverse();
+					obj.calcTotal(); //计算总价
+				})
+				.catch(function(e) {
+					console.log(e);
+				});
 		},
-		watch: {
-			//显示空白页
-			cartList(e) {
-				let empty = e.length === 0 ? true : false;
-				if (this.empty !== empty) {
-					this.empty = empty;
-				}
-			}
+		//监听image加载完成
+		onImageLoad(key, index) {
+			// 修改载入完成后图片class样式
+			this.$set(this[key][index], 'loaded', 'loaded');
 		},
-		computed: {
-			...mapState(['weichatObj']),
-			...mapState('user', ['hasLogin'])
+		//监听image加载失败
+		onImageError(key, index) {
+			this[key][index].image = '/static/error/errorImage.jpg';
 		},
-		methods: {
-			reduce(item, index) {
-				if (item.cart_num == 1) {
-					uni.showModal({
-						content: '删除该商品?',
-						success: e => {
-							if (e.confirm) {
-								this.deleteCartItem(index)
-							}
-						}
-					});
-
-				} else {
-					item.cart_num--
-					this.newNumberChange(item)
-				}
-			},
-			add(item) {
-				console.log(item)
-				if (item.productInfo.stock > item.cart_num) {
-					item.cart_num++
-					this.newNumberChange(item)
-				} else {
-					return
-				}
-			},
-			//请求数据
-			async loadData() {
-				let obj = this;
-				getCartList({})
-					.then(function(e) {
-						// 获取当前购物车物品增加数量
-						let nub = obj.cartList.length;
-						// 获取之前对象数组
-						let aArray = obj.cartList.reverse();
-						// 获取返回数据对象数组
-						let bArray = e.data.valid.reverse();
-						obj.cartList = bArray
-							.map((item, ind) => {
-								// 设置返回数据默认为勾选状态
-								item.checked = true;
-								// 获取相同数组之前对象的数据
-								let carlist = aArray[ind];
-								// 判断之前是否已经加载完毕
-								if (carlist && carlist.loaded == 'loaded') {
-									item.loaded = 'loaded';
-								}
-								return item;
-							})
-							.reverse();
-						obj.calcTotal(); //计算总价
-					})
-					.catch(function(e) {
-						console.log(e);
-					});
-			},
-			//监听image加载完成
-			onImageLoad(key, index) {
-				// 修改载入完成后图片class样式
-				this.$set(this[key][index], 'loaded', 'loaded');
-			},
-			//监听image加载失败
-			onImageError(key, index) {
-				this[key][index].image = '/static/error/errorImage.jpg';
-			},
-			// 跳转到登录页
-			navToLogin() {
-				// 保存地址
-				saveUrl();
-				// 登录拦截
-				interceptor();
-			},
-			//选中状态处理
-			check(type, index) {
-				if (type === 'item') {
-					this.cartList[index].checked = !this.cartList[index].checked;
-				} else {
-					const checked = !this.allChecked;
-					const list = this.cartList;
-					list.forEach(item => {
-						item.checked = checked;
-					});
-					this.allChecked = checked;
-				}
-				this.calcTotal(type);
-			},
-			//数量
-			numberChange(data) {
-				let arr = this.cartList[data.index];
-				arr.cart_num = data.number;
-				getCartNum({
-						id: arr.id,
-						number: data.number
-					})
-					.then(e => {
-						console.log(e);
-					})
-					.catch(function(e) {
-						console.log(e);
-					});
-				this.calcTotal();
-			},
-			newNumberChange(item) {
-				getCartNum({
-						id: item.id,
-						number: item.cart_num
-					})
-					.then(e => {
-						console.log(e);
-					})
-					.catch(function(e) {
-						console.log(e);
-					});
-				this.calcTotal();
-			},
-			//删除
-			deleteCartItem(index) {
-				let list = this.cartList;
-				let row = list[index];
-				let id = row.id;
-				cartDel({
-					ids: id
-				});
-				this.cartList.splice(index, 1);
-				uni.hideLoading();
-				this.calcTotal();
-			},
-			//清空
-			clearCart() {
-				uni.showModal({
-					content: '清空购物车?',
-					success: e => {
-						if (e.confirm) {
-							let st = this.cartList.map(e => {
-								return e.id;
-							});
-							cartDel({
-								ids: st.join(',')
-							}).then(e => {
-								console.log(e);
-							});
-							this.cartList = [];
-						}
-					}
-				});
-			},
-			//计算总价
-			calcTotal() {
-				let list = this.cartList;
-				if (list.length === 0) {
-					this.empty = true;
-					return;
-				}
-				let total = 0;
-				let checked = true;
+		// 跳转到登录页
+		navToLogin() {
+			// 保存地址
+			saveUrl();
+			// 登录拦截
+			interceptor();
+		},
+		//选中状态处理
+		check(type, index) {
+			if (type === 'item') {
+				this.cartList[index].checked = !this.cartList[index].checked;
+			} else {
+				const checked = !this.allChecked;
+				const list = this.cartList;
 				list.forEach(item => {
-					if (item.checked === true) {
-						total += item.productInfo.price * item.cart_num;
-					} else if (checked === true) {
-						checked = false;
-					}
+					item.checked = checked;
 				});
 				this.allChecked = checked;
-				this.total = Number(total.toFixed(2));
-			},
-			//创建订单
-			createOrder() {
-				let list = this.cartList;
-				let goodsData = [];
-				list.forEach(item => {
-					if (item.checked) {
-						goodsData.push(item.id);
-					}
-				});
-
-				uni.navigateTo({
-					url: '/pages/order/createOrder?id=' + goodsData.join(',')
-				});
-			},
-		}
-	};
-</script>
-
-<style lang="scss">
-	.container {
-		padding-bottom: 134rpx;
-		background-color: $page-color-base;
-
-		/* 空白页 */
-		.empty {
-			position: fixed;
-			left: 0;
-			top: 0;
-			width: 100%;
-			height: 100vh;
-			padding-bottom: 100rpx;
-			display: flex;
-			justify-content: center;
-			flex-direction: column;
-			align-items: center;
-			background: #fff;
-
-			.emptyImg {
-				width: 300rpx;
-				height: 250rpx;
-				margin-bottom: 30rpx;
 			}
-
-			.empty-tips {
-				display: flex;
-				font-size: $font-sm + 2rpx;
-				color: $font-color-disabled;
-
-				.navigator {
-					color: $uni-color-primary;
-					margin-left: 16rpx;
+			this.calcTotal(type);
+		},
+		//数量
+		numberChange(data) {
+			let arr = this.cartList[data.index];
+			arr.cart_num = data.number;
+			getCartNum({ id: arr.id, number: data.number })
+				.then(e => {
+					console.log(e);
+				})
+				.catch(function(e) {
+					console.log(e);
+				});
+			this.calcTotal();
+		},
+		//删除
+		deleteCartItem(index) {
+			let list = this.cartList;
+			let row = list[index];
+			let id = row.id;
+			cartDel({
+				ids: id
+			});
+			this.cartList.splice(index, 1);
+			uni.hideLoading();
+			this.calcTotal();
+		},
+		//清空
+		clearCart() {
+			uni.showModal({
+				content: '清空购物车?',
+				success: e => {
+					if (e.confirm) {
+						let st = this.cartList.map(e => {
+							return e.id;
+						});
+						cartDel({
+							ids: st.join(',')
+						}).then(e => {
+							console.log(e);
+						});
+						this.cartList = [];
+					}
 				}
+			});
+		},
+		//计算总价
+		calcTotal() {
+			let list = this.cartList;
+			if (list.length === 0) {
+				this.empty = true;
+				return;
 			}
-		}
-	}
-
-	/* 购物车列表项 */
-	.cart-item {
-		width: 710rpx;
-		height: 210rpx;
-		background: #FFFFFF;
-		box-shadow: 0px 0px 10rpx 0rpx rgba(0, 0, 0, 0.1);
-		border-radius: 10rpx;
-		margin: 20rpx auto;
-
-		display: flex;
-		position: relative;
-		padding: 30rpx 26rpx 30rpx 80rpx;
-
-		.image-wrapper {
-			width: 150rpx;
-			height: 150rpx;
-			flex-shrink: 0;
-			position: relative;
-
-			image {
-				border-radius: 8rpx;
-			}
-		}
-
-		.checkbox {
-			display: flex;
-			position: absolute;
-			top: 0;
-			bottom: 0;
-			left: -65rpx;
-			margin: auto 0;
-			height: 50rpx;
-			z-index: 8;
-			font-size: 44rpx;
-			line-height: 1;
-			padding: 4rpx;
-			color: $font-color-disabled;
-			background: #fff;
-			border-radius: 50px;
-		}
-
-		.item-right {
-			display: flex;
-			flex-direction: column;
-			flex: 1;
-			overflow: hidden;
-			position: relative;
-			padding-left: 30rpx;
-
-			.munbox {
-				width: 144rpx;
-				height: 44rpx;
-				position: absolute;
-				bottom: 0;
-				right: 0;
-
-				input {
-					display: inline-block;
-					text-align: center;
+			let total = 0;
+			let checked = true;
+			list.forEach(item => {
+				if (item.checked === true) {
+					total += item.productInfo.price * item.cart_num;
+				} else if (checked === true) {
+					checked = false;
 				}
-
-				image {
-					flex-shrink: 0;
-					width: 44rpx;
-					height: 44rpx;
+			});
+			this.allChecked = checked;
+			this.total = Number(total.toFixed(2));
+		},
+		//创建订单
+		createOrder() {
+			let list = this.cartList;
+			let goodsData = [];
+			list.forEach(item => {
+				if (item.checked) {
+					goodsData.push(item.id);
 				}
-			}
-
-			.title,
-			.price {
-				font-size: $font-base + 2rpx;
-				color: $font-color-dark;
-				height: 40rpx;
-				line-height: 40rpx;
-			}
-
-			.attr {
-				font-size: $font-sm + 2rpx;
-				color: $font-color-light;
-				height: 50rpx;
-				line-height: 50rpx;
+			});
 
-				font-size: 26rpx;
-				font-family: PingFang SC;
-				font-weight: bold;
-				color: #999999;
-			}
-
-			.price {
-				// height: 50rpx;
-				// line-height: 50rpx;
-				padding-top: 20rpx;
-				font-size: 34rpx;
-				font-family: PingFang SC;
-				font-weight: bold;
-				color: #FF4C4C;
-			}
-
-			.step {
-				margin-top: 20rpx;
-			}
-
-			.title {
-				font-size: 34rpx;
-				font-family: PingFang SC;
-				font-weight: bold;
-				color: #333333;
-			}
-		}
-
-		.del-btn {
-			padding: 4rpx 10rpx;
-			font-size: 34rpx;
-			height: 50rpx;
-			color: $font-color-light;
+			uni.navigateTo({
+				url: '/pages/order/createOrder?id=' + goodsData.join(',')
+			});
 		}
 	}
+};
+</script>
 
-	/* 底部栏 */
-	.action-section {
-		/* #ifdef H5 */
-		margin-bottom: 97rpx;
-		/* #endif */
+<style lang="scss">
+.container {
+	padding-bottom: 134rpx;
+	background-color: $page-color-base;
+	/* 空白页 */
+	.empty {
 		position: fixed;
-		left: 0rpx;
-		bottom: 0rpx;
-		z-index: 95;
+		left: 0;
+		top: 0;
+		width: 100%;
+		height: 100vh;
+		padding-bottom: 100rpx;
 		display: flex;
+		justify-content: center;
+		flex-direction: column;
 		align-items: center;
-		width: 750rpx;
-		height: 100rpx;
-		padding: 0 30rpx;
-		// background: rgba(255, 255, 255, 0.9);
 		background: #fff;
-
-		// box-shadow: 0 0 20rpx 0 rgba(0, 0, 0, 0.5);
-		// border-radius: 16rpx;
-		.checkbox {
-			height: 52rpx;
-			position: relative;
-
-			.icon-checked-box {
-				border-radius: 50rpx;
-				background-color: #ffffff;
-				width: 52rpx;
-				height: 100%;
-				position: relative;
-				z-index: 5;
-				font-size: 53rpx;
-				line-height: 1;
-				color: $font-color-light;
-
-				&::after {
-					content: '全选';
-					width: 100rpx;
-					position: absolute;
-					top: 0;
-					bottom: 0;
-					left: 52rpx;
-					margin: auto;
-					line-height: 1.5;
-					padding-left: 10rpx;
-					font-size: 32rpx;
-					font-family: PingFang SC;
-					font-weight: bold;
-					color: #767477;
-				}
-			}
-
-			.icon-checked {
-				color: $base-color;
-			}
+		.emptyImg {
+			width: 300rpx;
+			height: 250rpx;
+			margin-bottom: 30rpx;
 		}
-
-		.clear-btn {
-			position: absolute;
-			left: 26rpx;
-			top: 0;
-			z-index: 4;
-			width: 0;
-			height: 52rpx;
-			line-height: 52rpx;
-			padding-left: 38rpx;
-			font-size: $font-base;
-			color: #fff;
-			background: $font-color-disabled;
-			border-radius: 0 50px 50px 0;
-			opacity: 0;
-			transition: 0.2s;
-
-			&.show {
-				opacity: 1;
-				width: 120rpx;
-			}
-		}
-
-		.total-box {
-			flex: 1;
+		.empty-tips {
 			display: flex;
-			flex-direction: column;
-			text-align: right;
-			padding-right: 40rpx;
-			color: #FF6F0F;
-			font-weight: bold;
-
-			.price {
-				font-size: 32rpx;
-
-				// font-size: $font-lg;
-				// color: $font-color-dark;
-
-			}
-
-			.coupon {
-				font-size: $font-sm;
-
-				// color: $font-color-light;
-				text {
-					font-weight: bold;
-					color: $font-color-dark;
-				}
+			font-size: $font-sm + 2rpx;
+			color: $font-color-disabled;
+			.navigator {
+				color: $uni-color-primary;
+				margin-left: 16rpx;
 			}
 		}
-
-		.confirm-btn {
-			padding: 0 38rpx;
-			margin: 0;
-			border-radius: 100px;
-			height: 76rpx;
-			line-height: 76rpx;
-			font-size: $font-base + 2rpx;
-			background: $base-color;
-			font-weight: bold;
+	}
+}
+/* 购物车列表项 */
+.cart-item {
+	display: flex;
+	position: relative;
+	padding: 30rpx 40rpx;
+	.image-wrapper {
+		width: 230rpx;
+		height: 230rpx;
+		flex-shrink: 0;
+		position: relative;
+		image {
+			border-radius: 8rpx;
 		}
 	}
-
-	/* 复选框选中状态 */
-	.action-section .checkbox.checked,
-	.cart-item .checkbox.checked {
-		color: $base-color;
+	.checkbox {
+		position: absolute;
+		left: -16rpx;
+		top: -16rpx;
+		z-index: 8;
+		font-size: 44rpx;
+		line-height: 1;
+		padding: 4rpx;
+		color: $font-color-disabled;
+		background: #fff;
+		border-radius: 50px;
 	}
-
-	.cart-hand {
-		width: 750rpx;
-		height: 88rpx;
-		background: #FFFFFF;
-		font-size: 30rpx;
-		font-family: PingFang SC;
-		font-weight: bold;
-		color: #333333;
-		line-height: 88rpx;
-		padding-left: 28rpx;
-		padding-right: 26rpx;
-		position:sticky;
-		top: 10rpx;
-		z-index: 99;
-		.hand-tit {
-			text {
-				color: #FF4C4C;
-			}
-
+	.item-right {
+		display: flex;
+		flex-direction: column;
+		flex: 1;
+		overflow: hidden;
+		position: relative;
+		padding-left: 30rpx;
+		.title,
+		.price {
+			font-size: $font-base + 2rpx;
+			color: $font-color-dark;
+			height: 40rpx;
+			line-height: 40rpx;
 		}
-
-		.hand-btn {
-			width: 164rpx;
-			height: 62rpx;
-			border: 2rpx solid #FF4C4C;
-			border-radius: 31rpx;
-			font-size: 26rpx;
-			font-family: PingFang SC;
-			font-weight: bold;
-			color: #FF4C4C;
-			line-height: 62rpx;
-			text-align: center;
+		.attr {
+			font-size: $font-sm + 2rpx;
+			color: $font-color-light;
+			height: 50rpx;
+			line-height: 50rpx;
 		}
-	}
-
-	.btm-btn {
-		z-index: 95;
-		display: flex;
-		position: fixed;
-		bottom: 0;
-		text-align: center;
-		font-size: 32rpx;
-		font-family: PingFang SC;
-		font-weight: bold;
-		color: #FFFFFF;
-		line-height: 97rpx;
-		width: 750rpx;
-
-		.btn-item {
-			height: 100%;
-			width: 50%;
-			background-color: #31332d;
+		.price {
+			height: 50rpx;
+			line-height: 50rpx;
 		}
-
-		.btn-item1 {
-			background-color: #5DBC7C;
+		.step {
+			margin-top: 20rpx;
 		}
 	}
-
-	.cart-list {
-		// padding-top: 88rpx;
-		padding-bottom: 97rpx;
+	.del-btn {
+		padding: 4rpx 10rpx;
+		font-size: 34rpx;
+		height: 50rpx;
+		color: $font-color-light;
 	}
-
-	.hx-wrapper {
-		width: 536rpx;
-		height: 630rpx;
+}
+/* 底部栏 */
+.action-section {
+	/* #ifdef H5 */
+	margin-bottom: 100rpx;
+	/* #endif */
+	position: fixed;
+	left: 30rpx;
+	bottom: 30rpx;
+	z-index: 95;
+	display: flex;
+	align-items: center;
+	width: 690rpx;
+	height: 100rpx;
+	padding: 0 30rpx;
+	background: rgba(255, 255, 255, 0.9);
+	box-shadow: 0 0 20rpx 0 rgba(0, 0, 0, 0.5);
+	border-radius: 16rpx;
+	.checkbox {
+		height: 52rpx;
 		position: relative;
-
-		// background-color: #fff;
-		.hx-img {
-			width: 536rpx;
-			height: 281rpx;
-
-			image {
-				width: 536rpx;
-				height: 281rpx;
-			}
-		}
-
-		.hx-close {
-			position: absolute;
-			left: 243rpx;
-			bottom: -80rpx;
+		.icon-checked-box {
+			border-radius: 50rpx;
+			background-color: #ffffff;
 			width: 52rpx;
-			height: 52rpx;
-
-			image {
-				width: 52rpx;
-				height: 52rpx;
-			}
+			height: 100%;
+			position: relative;
+			z-index: 5;
+			font-size: 53rpx;
+			line-height: 1;
+			color: $font-color-light;
 		}
-
-		.hx-body {
-			width: 536rpx;
-			height: 349rpx;
-			background-color: #fff;
-			border-radius: 0 0 10rpx 10rpx;
-
-			.hx-title {
-				width: 536rpx;
-				font-size: 36rpx;
-				font-weight: 500;
-				color: #333333;
-				line-height: 1;
-				padding-top: 42rpx;
-				text-align: center;
-			}
-
-			input {
-				width: 439rpx;
-				height: 68rpx;
-				background: #DBF3E9;
-				border-radius: 10rpx;
-				margin: 39rpx auto 0;
-				padding-left: 26rpx;
-
-				.hx-placeholder {
-					font-size: 26rpx;
-					font-weight: 500;
-					color: #52C696;
-				}
-			}
-
-			.hx-btn {
-				margin: 44rpx auto 0;
-				width: 353rpx;
-				height: 71rpx;
-				background: #52C696;
-				border-radius: 34rpx;
-				font-size: 36rpx;
-				font-weight: 500;
-				color: #F8F9F9;
-				line-height: 71rpx;
-				text-align: center;
+		.icon-checked {
+			color: $base-color;
+		}
+	}
+	.clear-btn {
+		position: absolute;
+		left: 26rpx;
+		top: 0;
+		z-index: 4;
+		width: 0;
+		height: 52rpx;
+		line-height: 52rpx;
+		padding-left: 38rpx;
+		font-size: $font-base;
+		color: #fff;
+		background: $font-color-disabled;
+		border-radius: 0 50px 50px 0;
+		opacity: 0;
+		transition: 0.2s;
+		&.show {
+			opacity: 1;
+			width: 120rpx;
+		}
+	}
+	.total-box {
+		flex: 1;
+		display: flex;
+		flex-direction: column;
+		text-align: right;
+		padding-right: 40rpx;
+		.price {
+			font-size: $font-lg;
+			color: $font-color-dark;
+		}
+		.coupon {
+			font-size: $font-sm;
+			color: $font-color-light;
+			text {
+				color: $font-color-dark;
 			}
-
-
 		}
 	}
+	.confirm-btn {
+		padding: 0 38rpx;
+		margin: 0;
+		border-radius: 100px;
+		height: 76rpx;
+		line-height: 76rpx;
+		font-size: $font-base + 2rpx;
+		background: $base-color;
+	}
+}
+/* 复选框选中状态 */
+.action-section .checkbox.checked,
+.cart-item .checkbox.checked {
+	color: $base-color;
+}
 </style>

+ 128 - 0
pages/category/articleList.vue

@@ -0,0 +1,128 @@
+<template>
+	<view class="content">
+		<view class="main">
+			<view v-for="(item, index) in list">
+				<view class="item flex" @click="navToList(item.id)">
+					<!-- <view class="item-left"><image :src="item.image" mode=""></image></view>-->
+					<view class="item-left"><image :src="item.image_input[0]" mode=""></image></view>
+					<view class="item-right">
+						<view class="item-font clamp">{{item.title}}</view>
+						<view class="item-time">更新时间:{{item.add_time}}</view>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+import { article,articleList } from '@/api/user.js';
+import { getTime } from '@/utils/rocessor.js';
+export default {
+	data() {
+		return {
+			list: []
+		};
+	},
+	onLoad() {
+		this.loadData();
+	},
+	methods: {
+		// 载入数据
+		async loadData() {
+			let obj = this;
+			article({page:1,limit:1000},5).then(({data}) =>{
+			// articleList({page:1,limit:1000}).then(({data}) =>{
+				this.list = data.filter(e => {
+					console.log(e.id,'123456789')
+					return (e.id !== 0 && e.id !== 4 )
+				})
+			})
+		},
+		navToList(id) {
+			uni.navigateTo({
+				url:'/pages/category/detail?id=' + id
+				// url: '/pages/category/flList?id=' + id
+			});
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+page,
+.content {
+	height: auto;
+	min-height: 100%;
+	background: #f5f5f5;
+}
+.main {
+	margin-top: 20rpx;
+	background: #ffffff;
+	.first {
+		padding: 50rpx 0 18rpx;
+		margin: 0 22rpx;
+		border-bottom: 1px solid #e0e0e0;
+		.title {
+			font-size: 32rpx;
+			font-family: PingFang SC;
+			font-weight: bold;
+			color: #333333;
+		}
+		.image {
+			width: 710rpx;
+			height: 400rpx;
+			background: #4cd964;
+			margin-top: 20rpx;
+			image {
+				width: 100%;
+				height: 100%;
+			}
+		}
+		.time {
+			margin-top: 20rpx;
+			font-size: 26rpx;
+			font-family: PingFang SC;
+			font-weight: 500;
+			color: #666666;
+		}
+	}
+	.item {
+		padding: 26rpx 0 18rpx;
+		margin: 0 22rpx;
+		justify-content: flex-start;
+		align-items: flex-start;
+		border-bottom: 1px solid #e0e0e0;
+		.item-left {
+			width: 224rpx;
+			height: 160rpx;
+			background: #DC4D46;
+			image {
+				width: 100%;
+				height: 100%;
+			}
+		}
+		.item-right {
+			width: 458rpx;
+			height: 160rpx;
+			margin-left: 24rpx;
+			padding: 18rpx 0;
+			display: flex;
+			flex-direction: column;
+			justify-content: space-between;
+			.item-font {
+				font-size: 32rpx;
+				font-family: PingFang SC;
+				font-weight: bold;
+				color: #333333;
+			}
+			.item-time {
+				font-size: 28rpx;
+				font-family: PingFang SC;
+				font-weight: 500;
+				color: #666666;
+			}
+		}
+	}
+}
+</style>

+ 87 - 195
pages/category/category.vue

@@ -1,143 +1,46 @@
 <template>
 	<view class="content">
-		<scroll-view scroll-y class="left-aside">
-			<view v-for="item in flist" :key="item.id" class="f-item b-b" :class="{ active: item.id === currentId }" @click="tabtap(item)">{{ item.cate_name }}</view>
-		</scroll-view>
-		<scroll-view scroll-with-animation scroll-y class="right-aside" @scroll="asideScroll" :scroll-top="tabScrollTop">
-			<view v-for="item in flist" :key="item.id" class="s-list" :id="'main-' + item.id">
-				<text class="s-item">{{ item.cate_name }}</text>
-				<view class="t-list ">
-					<view @click="navToList(item.id, titem.id)" class="t-item" v-for="titem in slist" :key="titem.id">
-						<image :src="titem.pic"></image>
-						<text>{{ titem.cate_name }}</text>
+		<view class="main">
+			<view v-for="(item, index) in list">
+				<view class="first" v-if="index == 0" @click="navToList(item.id)">
+					<view class="title">{{item.title}}</view>
+					<view class="image"><image :src="item.image_input[0]" mode=""></image></view>
+					<view class="time">更新时间:{{item.add_time}}</view>
+				</view>
+				<view class="item flex" @click="navToList(item.id)" v-else>
+					<view class="item-left"><image :src="item.image_input[0]" mode=""></image></view>
+					<view class="item-right">
+						<view class="item-font clamp">{{item.title}}</view>
+						<view class="item-time">更新时间:{{item.add_time}}</view>
 					</view>
 				</view>
 			</view>
-		</scroll-view>
+		</view>
 	</view>
 </template>
 
 <script>
-import { getList } from '@/api/category.js';
+import { article } from '@/api/user.js';
 export default {
 	data() {
 		return {
-			sizeCalcState: false,
-			tabScrollTop: 0,
-			currentId: 1,
-			flist: [],
-			slist: [],
-			// tlist: []
+			list: []
 		};
 	},
 	onLoad() {
 		this.loadData();
 	},
-	// #ifndef MP
-	// 监听导航栏输入框点击事件
-	onNavigationBarSearchInputClicked(e) {
-		uni.navigateTo({
-			url:'/pages/product/search',
-		})
-	},
-	// #endif
 	methods: {
 		// 载入数据
 		async loadData() {
 			let obj = this;
-			getList({})
-				.then(({ data }) => {
-					console.log(data,'data++++++++++')
-					this.flist = data.map(function (s) {
-								return s
-							});
-					console.log(this.flist,'1111111')
-					data.forEach(function(e) {
-						obj.slist.push(...e.children.map(function (s) {
-								return s
-							}));
-					});
-					console.log(obj.slist,'22222222')
-					// data.forEach(function(e) {
-					// 	e.children.forEach(function(es) {
-					// 		obj.tlist.push(...es.children.map(function (s) {
-					// 			return s
-					// 		}))
-					// 	});
-					// });
-				})
-				.catch(err => {
-					console.log(err);
-				});
-		},
-		//一级分类点击
-		tabtap(item) {
-			// 判断有没有初始化页面高度对象数据
-			if (!this.sizeCalcState) {
-				this.calcSize();
-			}
-			// 获取当前点击的id
-			this.currentId = item.id;
-			let index = this.slist.findIndex(sitem => sitem.pid === item.id);
-			this.tabScrollTop = this.slist[index].top;
-		},
-		//右侧栏滚动
-		asideScroll(e) {
-			// 判断有没有初始化页面高度对象数据
-			if (!this.sizeCalcState) {
-				this.calcSize();
-			}
-			let scrollTop = e.detail.scrollTop;
-			let box = 0; //列表包裹框高度初始化
-			let bottom = 10; //距离页面底部多少像素左侧列表切换到最后一个一级分类
-			// 查询当前页面对象
-			let view = uni.createSelectorQuery().select('.content');
-			view.fields(
-				{
-					id: true,
-					dataset: true,
-					rect: true,
-					size: true,
-					scrollOffset: true
-				},
-				function(e) {
-					// 保存包裹框高度
-					box = e.height;
-				}
-			).exec();
-			// 获取所有距离顶部大于滚轮距离页面高度的所有分类
-			let tabs = this.slist.filter(item => item.top <= scrollTop).reverse();
-			if (tabs.length > 0) {
-				// 判断是否已经到达滚轮底部
-				if (box + scrollTop + bottom >= e.detail.scrollHeight) {
-					this.currentId = this.slist[this.slist.length - 1].pid;
-				} else {
-					this.currentId = tabs[0].pid;
-				}
-			}
+			article({page:1,limit:1000},4).then(({data}) =>{
+				this.list = data
+			})
 		},
-		//计算右侧栏每个tab的高度等信息
-		calcSize() {
-			let h = 0;
-			this.slist.forEach(item => {
-				let view = uni.createSelectorQuery().select('#main-' + item.id);
-				view.fields(
-					{
-						size: true
-					},
-					data => {
-						item.top = h;
-						h += data.height;
-						item.bottom = h;
-					}
-				).exec();
-			});
-			this.sizeCalcState = true;
-		},
-		navToList(sid, tid) {
-			// 点击导航跳转到详细页面
+		navToList(id) {
 			uni.navigateTo({
-				url: `/pages/product/listSearch?fid=${this.currentId}&sid=${sid}&tid=${tid}`
+				url: '/pages/category/detail?id=' + id
 			});
 		}
 	}
@@ -147,87 +50,76 @@ export default {
 <style lang="scss">
 page,
 .content {
-	height: 100%;
-	background-color: #f8f8f8;
+	height: auto;
+	min-height: 100%;
+	background: #f5f5f5;
 }
-
-.content {
-	display: flex;
-}
-.left-aside {
-	flex-shrink: 0;
-	width: 200rpx;
-	height: 100%;
-	background-color: #fff;
-}
-.f-item {
-	display: flex;
-	align-items: center;
-	justify-content: center;
-	width: 100%;
-	height: 100rpx;
-	font-size: 28rpx;
-	color: $font-color-base;
-	position: relative;
-	&.active {
-		color: $base-color;
-		background: #f8f8f8;
-		&:before {
-			content: '';
-			position: absolute;
-			left: 0;
-			top: 50%;
-			transform: translateY(-50%);
-			height: 36rpx;
-			width: 8rpx;
-			background-color: $base-color;
-			border-radius: 0 4px 4px 0;
-			opacity: 0.8;
+.main {
+	margin-top: 20rpx;
+	background: #ffffff;
+	.first {
+		padding: 50rpx 0 18rpx;
+		margin: 0 22rpx;
+		border-bottom: 1px solid #e0e0e0;
+		.title {
+			font-size: 32rpx;
+			font-family: PingFang SC;
+			font-weight: bold;
+			color: #333333;
+		}
+		.image {
+			width: 710rpx;
+			height: 400rpx;
+			background: #4cd964;
+			margin-top: 20rpx;
+			image {
+				width: 100%;
+				height: 100%;
+			}
+		}
+		.time {
+			margin-top: 20rpx;
+			font-size: 26rpx;
+			font-family: PingFang SC;
+			font-weight: 500;
+			color: #666666;
 		}
 	}
-}
-
-.right-aside {
-	flex: 1;
-	overflow: hidden;
-	padding-left: 20rpx;
-	padding-right: 20rpx;
-}
-.s-item {
-	display: flex;
-	align-items: center;
-	height: 70rpx;
-	padding-top: 8rpx;
-	font-size: 28rpx;
-	color: $font-color-dark;
-}
-.t-list {
-	display: flex;
-	flex-wrap: wrap;
-	border-radius: 15rpx;
-	width: 100%;
-	background: #fff;
-	padding-top: 12rpx;
-	&:after {
-		content: '';
-		flex: 99;
-		height: 0;
-	}
-}
-.t-item {
-	flex-shrink: 0;
-	display: flex;
-	justify-content: center;
-	align-items: center;
-	flex-direction: column;
-	width: 171rpx;
-	font-size: 26rpx;
-	color: #666;
-	padding-bottom: 20rpx;
-
-	image {
-		width: 140rpx;
-		height: 140rpx;
+	.item {
+		padding: 26rpx 0 18rpx;
+		margin: 0 22rpx;
+		justify-content: flex-start;
+		align-items: flex-start;
+		border-bottom: 1px solid #e0e0e0;
+		.item-left {
+			width: 224rpx;
+			height: 160rpx;
+			image {
+				width: 100%;
+				height: 100%;
+			}
+		}
+		.item-right {
+			width: 458rpx;
+			height: 160rpx;
+			margin-left: 24rpx;
+			padding: 18rpx 0;
+			display: flex;
+			flex-direction: column;
+			justify-content: space-between;
+			.item-font {
+				font-size: 32rpx;
+				font-family: PingFang SC;
+				font-weight: bold;
+				color: #333333;
+			}
+			.item-time {
+				font-size: 28rpx;
+				font-family: PingFang SC;
+				font-weight: 500;
+				color: #666666;
+			}
+		}
 	}
 }
 </style>

+ 97 - 0
pages/category/detail.vue

@@ -0,0 +1,97 @@
+<template>
+	<view class="center">
+		<view class="title clamp">{{ item.title }}</view>
+		<view class="time">{{ item.add_time }}</view>
+		<view class="main" v-for="(ls, index) in item.content" :key="index">
+			<view v-if="ls.type == 'rich-text'" v-html="ls.value" class="main"></view>
+			<video v-if="ls.type == 'video' && ls.value" :src="ls.value" style="width:100%;height: 300px" frameborder="0"></video>
+		</view>
+	</view>
+</template>
+
+<script>
+import { details } from '@/api/user.js';
+export default {
+	data() {
+		return {
+			id: '',
+			item: ''
+		};
+	},
+	onLoad(option) {
+		this.id = option.id;
+		this.loadData();
+	},
+	methods: {
+		loadData() {
+			details({}, this.id).then(({ data }) => {
+				console.log(data);
+				data.content = data.content.replace(/<img/g, '<img class="rich-img"').replace(/<p>\s*<img/g, '<p class="pHeight"><img');
+				data.content = this.getVideo(data.content);
+				this.item = data;
+			});
+		},
+		// 富文本视频解析
+		getVideo(data) {
+			let videoList = [];
+			let videoReg = /<video.*?(?:>|\/>)/gi; //匹配到字符串中的 video 标签
+			let srcReg = /src=[\'\"]?([^\'\"]*)[\'\"]?/i; //匹配到字符串中的 video 标签 的路径
+			let arr = data.match(videoReg) || []; // arr 为包含所有video标签的数组
+			let articleList = data.split('</video>'); // 把字符串  从视频标签分成数组
+			arr.forEach((item, index) => {
+				var src = item.match(srcReg);
+				videoList.push(src[1]); //所要显示的字符串中 所有的video 标签 的路径
+			});
+			let needArticleList = [];
+			articleList.forEach((item, index) => {
+				if (item != '' && item != undefined) {
+					//  常见的标签渲染
+					needArticleList.push({
+						type: 'rich-text',
+						value: item + '</video>'
+					});
+				}
+				let articleListLength = articleList.length; // 插入到原有video 标签位置
+				if (index < articleListLength && videoList[index] != undefined) {
+					needArticleList.push({
+						type: 'video',
+						value: videoList[index]
+					});
+				}
+			});
+			return needArticleList;
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+.center {
+	min-height: 100%;
+	height: auto;
+	background: #ffffff;
+	padding: 30rpx 24rpx 0;
+}
+.title {
+	font-size: 32rpx;
+	font-family: PingFang SC;
+	font-weight: bold;
+	color: #333333;
+}
+.time {
+	font-size: 24rpx;
+	font-family: PingFangSC;
+	font-weight: 500;
+	color: #999999;
+	margin-top: 40rpx;
+}
+.main {
+	margin-top: 60rpx;
+}
+/deep/ .main {
+	.rich-img {
+		width: 100% !important;
+		height: auto;
+	}
+}
+</style>

+ 130 - 0
pages/category/flList.vue

@@ -0,0 +1,130 @@
+<template>
+	<view class="content">
+		<view class="main">
+			<view v-for="(item, index) in list">
+				<view class="item flex" @click="navToList(item.id)">
+					<view class="item-left"><image :src="item.image" mode=""></image></view>
+					<view class="item-right">
+						<view class="item-font clamp">{{item.title}}</view>
+						<view class="item-time">更新时间:{{item.add_time}}</view>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+import { article } from '@/api/user.js';
+import { getTime } from '@/utils/rocessor.js';
+export default {
+	data() {
+		return {
+			list: [],
+			id:'',
+		};
+	},
+	onLoad(option) {
+		this.id = option.id
+		this.loadData();
+	},
+	methods: {
+		// 载入数据
+		async loadData() {
+			let obj = this;
+			article({page:1,limit:1000},obj.id).then(({data}) =>{
+				this.list = data.filter(e => {
+					console.log(e.id,'123456789')
+					return (e.id !== 0 && e.id !== 4 )
+				})
+				this.list.forEach(e =>{
+					e.add_time = getTime(e.add_time)
+				})
+			})
+		},
+		navToList(id) {
+			uni.navigateTo({
+				url: '/pages/category/detail?id=' + id
+			});
+		}
+	}
+};
+</script>
+
+<style lang="scss">
+page,
+.content {
+	height: auto;
+	min-height: 100%;
+	background: #f5f5f5;
+}
+.main {
+	margin-top: 20rpx;
+	background: #ffffff;
+	.first {
+		padding: 50rpx 0 18rpx;
+		margin: 0 22rpx;
+		border-bottom: 1px solid #e0e0e0;
+		.title {
+			font-size: 32rpx;
+			font-family: PingFang SC;
+			font-weight: bold;
+			color: #333333;
+		}
+		.image {
+			width: 710rpx;
+			height: 400rpx;
+			background: #4cd964;
+			margin-top: 20rpx;
+			image {
+				width: 100%;
+				height: 100%;
+			}
+		}
+		.time {
+			margin-top: 20rpx;
+			font-size: 26rpx;
+			font-family: PingFang SC;
+			font-weight: 500;
+			color: #666666;
+		}
+	}
+	.item {
+		padding: 26rpx 0 18rpx;
+		margin: 0 22rpx;
+		justify-content: flex-start;
+		align-items: flex-start;
+		border-bottom: 1px solid #e0e0e0;
+		.item-left {
+			width: 224rpx;
+			height: 160rpx;
+			background: #DC4D46;
+			image {
+				width: 100%;
+				height: 100%;
+			}
+		}
+		.item-right {
+			width: 458rpx;
+			height: 160rpx;
+			margin-left: 24rpx;
+			padding: 18rpx 0;
+			display: flex;
+			flex-direction: column;
+			justify-content: space-between;
+			.item-font {
+				font-size: 32rpx;
+				font-family: PingFang SC;
+				font-weight: bold;
+				color: #333333;
+			}
+			.item-time {
+				font-size: 28rpx;
+				font-family: PingFang SC;
+				font-weight: 500;
+				color: #666666;
+			}
+		}
+	}
+}
+</style>

+ 0 - 167
pages/contract/agreement.vue

@@ -1,167 +0,0 @@
-<template>
-	<view class="box">
-		<view class="title pt20 pb30">满园春商城用户/会员注册协议</view>
-		<view class="content">欢迎您访问并使用满园春商城服务平台!本协议是您与满园春商城平台所有者就满园春商城平台服务的相关事宜所订立的协议。</view>
-		<view class="content">
-			为维护您自身权益,请您仔细阅读本协议,您点击“同意并继续”按钮后,本协议即构成对双方具有约束力的法律文件; 阅读本协议过程中,
-			如您不同意本协议或其中任何条款的约定,您应立即停止注册程序。
-		</view>
-		<view class="title">一、定义</view>
-		<view class="content">1.1 、满园春商城平台:指由浙江龍信贸易有限公司运营的网络交易平台, 包括公众号,小程序,域名为www.tzlxsc.com的网站及App。</view>
-		<view class="content">1.2 、满园春商城平台用户:指满园春商城平台各项服务的使用者。</view>
-		<view class="content">1.3 、满园春商城平台会员:指与满园春商城平台签订《满园春商城平台服务协议》并完成注册流程的用户。</view>
-		<view class="content">1.4 、满园春商城平台供应商: 指通过满园春商城平台发布货物信息或/并通过该平台销售货物的会员。</view>
-		<view class="content">1.5 、满园春商城平台采购商: 指通过满园春商城平台发布采购货物信息或/并通过该平台采购货物的会员。</view>
-		<view class="content">1.6 、满园春商城平台托运方: 指通过满园春商城平台发布发货信息或/并通过该平台委托承运商运输货物的会员。</view>
-		<view class="content">1.7 、满园春商城平台承运商: 指通过满园春商城平台发布车辆信息或/并通过该平台接受托运方的委托,提供运输服务的会员。</view>
-		<view class="title">二、账户注册、注册信息的保管与使用</view>
-		<view class="content">2.1 、注册者资格</view>
-		<view class="content">
-			您确认,在您开始注册程序使用满园春商城平台服务前,您是具备中华人民共和国法律规定的完全民事权利能力和完全民事行为能力的自然人、法人或其他组织。
-			若您不具备前述主体资格,则您及您的监护人应当承担因此而导致的一切后果。
-		</view>
-		<view class="content">2.2 、账户说明</view>
-		<view class="content">2.2.1 当您按照注册页面提示填写信息、阅读并同意本协议且完成会员注册程序后,您才能成为满园春商城平台的会员。</view>
-		<view class="content">
-			2.2.2
-			您确认,您所填写/提供的注册资料是真实、准确、完整、合法有效的,且您保证本平台可以通过该等信息与您本人进行联系。如您的注册信息有变更,请及时予以更新。如您提供的注册资料不合法、不真实、不准确、不详尽,因此而引起的责任、后果将全部由您承担。
-		</view>
-		<view class="content">2.3 注册信息的保管与使用</view>
-		<view class="content">
-			2.3.1 您提供的注册信息,满园春商城平台(以下也简称为“本平台”)将按照中华人民共和国法律、
-			法规的相关规定,采取技术和制度等手段为您妥善保管。除非得到您的授权或者按照法律及其程序要求进行透露外,本平台将保证您的信息安全。
-		</view>
-		<view class="content">
-			2.3.2
-			本平台承诺仅根据本平台的服务目的使用您的信息。服务目的包括但不限于交易确认、客户回访、政策更新、发送促销信息等,除此之外,本平台将对您的信息保密。如您认为本平台超越了正常服务范围使用了您的信息,请您立即与本平台的客服中心联系,本平台将立即予以核实、纠正。
-		</view>
-		<view class="content">
-			2.3.3
-			在您注册成功后,将产生用户名和密码等账户信息,您的账户信息由您保管,您可以根据本平台的规定改变您的密码等账户信息。本平台任何时候均不会主动要求您提供您的账户。因此,
-			请您务必保管好您的账户,谨慎合理的使用您的用户名和密码。如果因为您主动泄露、
-			遭受他人攻击、诈骗或因管理不善造成账户(包括但不限于注册账户和密码、支付账户和密码等)被复制、盗用及其他行为而导致的损失及后果,均由您自行承担。
-		</view>
-		<view class="content">2.3.4 您不得将在本平台注册获得的账户转让或借给他人使用,否则,由此产生的全部责任均由您承担。</view>
-		<view class="content">
-			2.3.5 除本平台存在过错外,您应对您账户下的所有行为后果(包括但不限于在线签署各类协议、发布信息、出售或购买商品、提供或接受物流运输服务、披露信息等)负责。
-		</view>
-		<view class="title">三、满园春商城平台的权利和义务</view>
-		<view class="content">
-			3.1 满园春商城平台有义务在现有技术上维护整满园春商城平台网站的正常运行,保障交易数据 的安全、可靠,按约定的服务内容和标准向您提供服务,并保证努力提升和改进技术。
-		</view>
-		<view class="content">3.2 若您在本平台做出下列行为的,本平台有权做出相应的处理,并且无须事先通知您 或取得您的同意:</view>
-		<view class="content">
-			3.2.1 本平台有权审阅或审查您的注册资料、信息发布、采购交易、物流服务行为,若 发现存在任何问题或疑问,本平台均有权向您发出询问及要求改正的通知或者直接作出删除
-			信息、冻结或关闭账户、取消订单等处理;
-		</view>
-		<view class="content">
-			3.2.2 若您存在以下行为或违反本协议其他约定或违反国家法律、法规、地方规章的行 为时,
-			本平台有权删除信息、禁止您发言、限制您出售或订购、限制提供或接受物流运输服务、注销您的账户,并且有权按照相关法律规定移交有关司法、行政机关处理:
-		</view>
-		<view class="content">
-			①发布或以电子邮件或以其他方式传送存在欺诈、虚假等恶意内容的信息或侵犯公共利 益、可能严重损害满园春商城平台利益、侵犯其他用户合法利益及他人人身财产权利内容的信息;
-		</view>
-		<view class="content">②进行与网上购物无关或不是以购物为目的或与提供或接受物流运输服务无关,试图扰乱正常购物、物流秩序;</view>
-		<view class="content">③干扰或破坏满园春商城平台或与满园春商城平台相连的服务器和网络。</view>
-		<view class="content">
-			3.4 若您在满园春商城平台上的采购交易、物流服务与其他用户发生纠纷或诉讼的,用户通过司法机关或行政机关依照法定程序要求满园春商城平台提供相关数据,
-			满园春商城平台应积极配合并提供有关资料。
-		</view>
-		<view class="title">四、会员的权利和义务</view>
-		<view class="content">
-			4.1
-			会员有权根据本协议的约定,以及满园春商城平台网站上发布的相关规则在满园春商城平台上查询商品信息、订购具体商品、查询物流信息、提供或接受物流服务、发表使用体验、参与商品讨论、
-			物流体验、 参加满园春商城平台网站的有关活动,以及使用满园春商城平台提供的其他服务。
-		</view>
-		<view class="content">4.2 会员应当保证在出售/购买商品提供/接受物流运输服务过程中遵守诚实信用原则,不扰乱网上交易的正常秩序。</view>
-		<view class="content">4.3 会员同意严格遵守以下义务:</view>
-		<view class="content">
-			①不得传输或发表: 煽动抗拒、 破坏宪法和法律、 行政法规实施的言论,煽动颠覆国家政权,推翻社会主义制度的言论,煽动分裂国家、破坏国家统一的言论,煽动民族仇恨、民
-			族歧视、破坏民族团结的言论;
-		</view>
-		<view class="content">②不得利用满园春商城平台从事洗钱、窃取商业秘密、窃取个人信息等违法犯罪活动;</view>
-		<view class="content">③不得捏造或者歪曲事实,散步谣言,扰乱社会秩序;</view>
-		<view class="content">④不得传输或发表任何封建迷信、邪教、淫秽、色情、赌博、暴力、恐怖、教唆犯罪等 不文明的信息资料;</view>
-		<view class="content">⑤不得公然侮辱他人或者捏造事实诽谤他人或者进行其他恶意共计;</view>
-		<view class="content">⑥其他违反宪法和法律、行政法规规定的。</view>
-		<view class="content">4.4 未经满园春商城平台书面同意,会员不得在满园春商城平台网站上发布任何形式的广告。</view>
-		<view class="content">4.5 遵守满园春商城平台制定的规则。</view>
-		<view class="title">五、责任限制</view>
-		<view class="content">
-			5.1
-			满园春商城平台仅限在“按现状”和“按现有”的基础上向用户提供满园春商城平台服务。但无法对由于信息网络设备维护、连接故障、电脑、通讯或其他系统的故障,罢工,暴乱、骚乱,灾难性天气(如火灾、洪水、风暴等),爆炸,战争、政府行为,司法行政机关的命令或因第三方原因而造成的损害结果承担责任。
-		</view>
-		<view class="content">
-			5.2 在法律法规所允许的限度内,因使用满园春商城平台服务而引起的任何损害或经济损失,
-			满园春商城平台承担的全部责任均不超过就用户出售/购买的与该索赔有关的商品、提供/接受的物流运输服务等所实际获得的直接收益。
-		</view>
-		<view class="title">六、知识产权</view>
-		<view class="content">
-			6.1 满园春商城平台网站上所刊登的资料信息(如文字、图标、标识、按钮图标、图像、数据 编辑和软件)均是满园春商城平台运营方及其关联方的财产,受中国和国际知识产权法的保护。
-		</view>
-		<view class="content">
-			6.2 除法律另有强制性规定外,未经满园春商城平台运营方明确的特别书面许可,任何单位 或个人均不得以任何方式非法地全部或部分复制、转载、引用或用作其他用途。
-		</view>
-		<view class="content">6.3 会员在满园春商城平台上发表的文章、言论仅代表其本人的观点,与满园春商城平台无关,因此所产生的责任由作者本人承担。</view>
-		<view class="content">七、协议的变更</view>
-		<view class="content">
-			满园春商城可根据国家法律法规变化及维护交易秩序、保护消费者权益需要,不时修改本协议、补充协议,变更后的协议、补充协议(下称“变更事项”)将通过法定程序并以本协议约定的方式通知您。
-		</view>
-		<view class="content">如您不同意变更事项,您有权于变更事项确定的生效日前联系满园春商城客服反馈意见。如反馈意见得以采纳,满园春商城将酌情调整变更事项。</view>
-		<view class="content">
-			如您对已生效的变更事项仍不同意的,
-			您应当于变更事项确定的生效之日起停止使用满园春商城平台服务,变更事项对您不产生效力;如您在变更事项生效后仍继续使用满园春商城平台服务,则视为您同意已生效的变更事项。
-		</view>
-		<view class="title">八、通知</view>
-		<view class="content">您同意满园春商城以以下合理的方式向您送达各类通知:</view>
-		<view class="content">(一)公示的文案;</view>
-		<view class="content">(二)站内信、客户端推送的消息;</view>
-		<view class="content">(三)根据您预留于满园春商城平台的联系方式发出的电子邮件、短信、函件等。</view>
-		<view class="title">九、协议终止</view>
-		<view class="content">
-			9.1
-			会员有权向满园春商城平台提出注销账户的申请,经满园春商城平台运营方审核同意后,由满园春商城平台注销该申请注销的账户,则本协议即告终止。账户注销后,满园春商城平台没有义务为申请注销者保留或披露账户中的任何信息。
-		</view>
-		<view class="content">9.2 出现下列情况时,满园春商城平台可以通过注销您的账户的方式单方解除本协议:</view>
-		<view class="content">①您违反本协议约定,满园春商城平台运营者依据违约条款终止本协议的;</view>
-		<view class="content">②您盗用他人账户、发布违禁信息、 骗取他人财物、销售假冒伪劣产品、扰乱市场秩序、 采取不正当手段牟利等行为,满园春商城平台对您的账户予以查封的;</view>
-		<view class="content">③除上述情形外,因您多次违反满园春商城平台的相关规定且情节严重,满园春商城平台对您的账户予以查封的;</view>
-		<view class="content">④满园春商城平台认为需要终止本协议的其他情况。</view>
-		<view class="content">9.3 本协议终止后,满园春商城平台仍享有下列权利:</view>
-		<view class="content">①继续保存您的注册信息及您使用满园春商城平台服务期间的所有交易信息;</view>
-		<view class="content">②您在满园春商城平台服务期间存在违法行为或违反本协议的行为的,满园春商城平台运营者仍有追究您责任的权利。</view>
-		<view class="title">十、法律适用、争议解决及其他</view>
-		<view class="content">
-			10.1 法律适用:本协议的订立、执行、解释、修订、补充及争议均适用中华人民共和 国法律(不包括香港、澳门、台湾地区)。如法律无相关规定的,参照商业惯例及/或行业惯 例。
-		</view>
-		<view class="content">
-			10.2 争议解决:本协议履行过程中若发生争议,由满园春商城平台与您友好协商解决。协商 不成时,任何一方均可向满园春商城平台所有者住所地人民法院(即浙江省台州市椒江区人民法院)提
-			起诉讼。
-		</view>
-		<view class="content">10.3 本协议内容中以黑体、加粗等方式显著标识的条款,请您着重阅读。</view>
-		<view class="title">十一、协议的修改</view>
-		<view class="content">
-			11.1
-			满园春商城有权随时修改本协议的任何条款,一旦本协议的内容发生变动,满园春商城将会直接在满园春商城站上公布修改之后的协议内容,该公布行为视为满园春商城已经通知用户修改内容。满园春商城也可通过其他适当方式向用户提示修改内容。
-		</view>
-		<view class="content pb30">11.2	如果不同意满园春商城对本协议相关条款所做的修改,\用户有权停止使用网络服务。如果用户继续使用网络服务,则视为用户接受满园春商城对本协议相关条款所做的修改。</view>
-	</view>
-</template>
-
-<script></script>
-
-<style>
-	.box{
-		padding: 30rpx;
-	}
-.title {
-	font-size: 32rpx;
-	font-weight: 700;
-	line-height: 2;
-}
-.content {
-	font-size: 28rpx;
-	color: #666;
-	line-height: 2;
-}
-</style>

+ 0 - 252
pages/contract/privacy.vue

@@ -1,252 +0,0 @@
-<template>
-	<view class="box">
-		<view class="title">“满园春线上商城”隐私政策</view>
-		  <view class="pb10">公司名称:浙江满园春日用品销售有限公司</view>
-		  <view class="pb10">注册地址:浙江省台州市纬一路69号1幢西边第一间2楼
-</view>
-		  <view class="pb10">办公地址:浙江省台州市纬一路69号1幢西边第一间2楼
-</view>
-		  <view class="pb10">联系电话:15068611048
-</view>
-		  <view class="pb10">更新时间:2021年09月27日</view>
-		  <view class="pb10">生效时间:2021年09月27日</view>
-		<view class="title">提示条款</view>
-		<view class="content">
-			“满园春商城”及其关联公司(以下简称“我们”)深知个人信息对您的重要性,并会尽力保护您的个人信息安全可靠,我们致力于维持您对我们的信任,恪守以下原则,保护您的个人信息:权责一致原则,目的明确原则,选择同意原则,最少够用原则,确保安全原则,主体参与原则,公开透明原则等等。同时我们承诺,我们将按业界成熟的安全解决方案,采取相应的安全保护措施来保护您的个人信息。鉴此,我们制定本《隐私政策》(下称“本政策
-			/本隐私政策”)并提醒您:
-		</view>
-		<view class="content">
-			本政策适用于“满园春商城”产品或服务。如我们关联公司的产品或服务中使用了“满园春商城”提供的产品或服务(例如直接使用“满园春商城”账户登录)但未设独立隐私政策的,则本政策同样适用于该部分产品或服务。
-			需要特别说明的是,本政策不适用于其他第三方向您提供的服务,也不适用于“满园春商城”中已另行独立设置隐私政策的产品或服务。
-		</view>
-		<view class="content">
-			在使用“满园春商城”各项产品或服务前,请您务必仔细阅读并透彻理解本政策,在确认充分理解并同意后使用相关产品或服务。一旦您开始使用“满园春商城”各项产品或服务,即表示您已充分理解并同意本政策。如对本政策内容有任何疑问、意见或建议,您可通过“满园春商城”提供的各种联系方式与我们联系。
-		</view>
-		<view class="title">本隐私政策部分将帮助您了解以下内容:</view>
-		<view class="content">1、我们如何收集和使用您的个人信息</view>
-		<view class="content">2、我们如何使用 Cookie 和同类技术</view>
-		<view class="content">3、我们如何共享、转让、公开披露您的个人信息</view>
-		<view class="content">4、我们如何保护您的个人信息</view>
-		<view class="content">5、您如何管理您的个人信息</view>
-		<view class="content">6、我们如何处理未成年人的个人信息</view>
-		<view class="content">7、您的个人信息如何在全球范围转移</view>
-		<view class="content">8、本隐私政策如何更新</view>
-		<view class="content">9、如何联系我们</view>
-		<view class="title">一、我们如何收集和使用您的个人信息</view>
-		<view class="content">
-			个人信息是指以电子或者其他方式记录的能够单独或者与其他信息结合识别特定自然人身份或者反映特定自然人活动情况的各种信息,我们会出于本政策所述的以下目的,收集和使用您的个人信息:
-		</view>
-		<view class="title">(一) 帮助您成为我们的用户</view>
-		<view class="content">为完成创建账号,以便我们为您提供服务,您需要提供以下信息:您的手机号码、头像、昵称、性别,并创建用户名和密码。</view>
-		<view class="title">(二)为您展示和推送商品或服务</view>
-		<view class="content">
-			为改善我们的产品或服务、向您提供个性化的信息搜索及交易服务,我们会根据您的浏览及搜索记录、设备信息、位置信息、交易信息,提取您的浏览、搜索偏好、行为习惯、位置信息等特征,基于特征标签进行间接人群画像并展示、推送信息。
-		</view>
-		<view class="content">如果您不想接受我们给您发送的商业广告,您可随时通过点击相应按钮取消。</view>
-		<view class="title">(三)向您提供商品或服务</view>
-		<view class="content">1、您向我们提供的信息</view>
-		<view class="content">
-			您在注册账户或使用我们的服务时,向我们提供的相关个人信息,例如电话号码、电子邮件、银行卡号或支付宝账号等;您通过我们的服务向其他方提供的共享信息,以及您使用我们的服务时所储存的信息。向“满园春商城”提供该其他方的前述个人信息之前,您需确保您已经取得其授权同意。您在使用我们的人脸识别分类服务时明确同意开启人物相册功能后向我们提供的本地相册信息。
-		</view>
-		<view class="content">2、我们在您使用服务过程中收集的信息</view>
-		<view class="content">为向您提供更契合您需求的页面展示和搜索结果、了解产品适配性、识别账号异常状态,我们会收集关于您使用</view>
-		<view class="content">的服务以及使用方式的信息并将这些信息进行关联,这些信息包括:</view>
-		<view class="content">
-			设备信息:我们会根据您在软件安装及使用中授予的具体权限,接收并记录您所使用的设备相关信息(例如设备型号、操作系统版本、设备设置、唯一设备标识符等软硬件特征信息)、设备所在位置相关信息(例如IP
-			地址、GPS位置以及能够提供相关信息的Wi-Fi
-			接入点、蓝牙和基站等传感器信息)。日志信息:当您使用我们的网站或客户端提供的产品或服务时,我们会自动收集您对我们服务的详细使用情况,作为有关网络日志保存。例如您的搜索查询内容、IP地址、浏览器的类型、电信运营商、使用的语言、访问日期和时间及您访问的网页记录等。请注意,单独的设备信息、日志信息等是无法识别特定自然人身份的信息。如果我们将这类非个人信息与其他信息结合用于识别特定自然人身份,或者将其与个人信息结合使用,则在结合使用期间,这类非个人信息将被视为个人信息,除取得您授权或法律法规另有规定外,我们会将该类个人信息做匿名化、去标识化处理。当您与我们联系时,我们可能会保存您的通信/通话记录和内容或您留下的联系方式等信息,以便与您联系或帮助您解决问题,或记录相关问题的处理方案及结果。
-		</view>
-		<view class="content">3、我们通过间接获得方式收集到的您的个人信息</view>
-		<view class="content">
-			您可通过“满园春商城”账号在我们提供的链接入口使用我们关联公司提供的产品或服务,为便于我们基于关联账号共同向您提供一站式服务并便于您统一进行管理,我们在“满园春商城”集中展示您的信息或推荐您感兴趣的信息。当您通过我们产品或服务使用上述服务时,您授权我们根据实际业务及合作需要从我们关联公司处接收、汇总、分析我们确认其来源合法或您授权同意其向我们提供的您的个人信息或交易信息。如您拒绝提供上述信息或拒绝授权,可能无法使用我们关联公司的相应产品或服务,或者无法展示相关信息,但不影响使用“满园春商城”扫人/找人、贴标签、聊天等核心服务。
-		</view>
-		<view class="title">(四)为您提供安全保障</view>
-		<view class="content">
-			为提高您使用我们及我们关联公司、合作伙伴提供服务的安全性,保护您或其他用户或公众的人身财产安全免遭侵害,更好地预防钓鱼网站、欺诈、网络漏洞、计算机病毒、网络攻击、网络侵入等安全风险,更准确地识别违反法律法规或“满园春商城”相关协议规则的情况,我们可能使用或整合您的用户信息、交易信息、设备信息、有关网络日志以及我们关联公司、合作伙伴取得您授权或依据法律共享的信息,来综合判断您账户及交易风险、进行身份验证、检测及防范安全事件,并依法采取必要的记录、审计、分析、处置措施。
-		</view>
-		<view class="title">(五)其他用途</view>
-		<view class="content">我们将信息用于本政策未载明的其他用途,或者将基于特定目的收集而来的信息用于其他目的时,会事先征求您的同意。</view>
-		<view class="title">(六)征得授权同意的例外</view>
-		<view class="content">根据相关法律法规规定,以下情形中收集您的个人信息无需征得您的授权同意:</view>
-		<view class="content">1、与国家安全、国防安全有关的;</view>
-		<view class="content">2、与公共安全、公共卫生、重大公共利益有关的;</view>
-		<view class="content">3、与犯罪侦查、起诉、审判和判决执行等有关的;</view>
-		<view class="content">4、出于维护个人信息主体或其他个人的生命、财产等重大合法权益但又很难得到您本人同意的;</view>
-		<view class="content">5、所收集的个人信息是您自行向社会公众公开的;</view>
-		<view class="content">6、从合法公开披露的信息中收集个人信息的,如合法的新闻报道、政府信息公开等渠道;</view>
-		<view class="content">7、根据您的要求签订合同所必需的;</view>
-		<view class="content">8、用于维护所提供的产品或服务的安全稳定运行所必需的,例如发现、处置产品或服务的故障;</view>
-		<view class="content">9、为合法的新闻报道所必需的;</view>
-		<view class="content">10、学术研究机构基于公共利益开展统计或学术研究所必要,且对外提供学术研究或描述的结果时,对结果中所</view>
-		<view class="content">包含的个人信息进行去标识化处理的;</view>
-		<view class="content">11、法律法规规定的其他情形。</view>
-		<view class="content">如我们停止运营“满园春商城”产品或服务,我们将及时停止继续收集您个人信息的活动,将停止运营的通知以逐</view>
-		<view class="content">一送达或公告的形式通知您,对所持有的个人信息进行删除或匿名化处理。</view>
-		<view class="title">二、我们如何使用 Cookie 和同类技术</view>
-		<view class="title">(一)Cookie</view>
-		<view class="content">
-			为确保网站正常运转、为您获得更轻松的访问体验、向您推荐您可能感兴趣的内容,我们会在您的计算机或移动设备上存储名为 Cookie 的小数据文件。Cookie
-			通常包含标识符、站点名称以及一些号码和字符。借助于Cookie,网站能够存储您的偏好等数据。
-		</view>
-		<view class="title">(二)网站信标和像素标签</view>
-		<view class="content">
-			除 Cookie
-			外,我们还会在网站上使用网站信标和像素标签等其他同类技术。例如,我们向您发送的电子邮件可能含有链接至我们网站内容的地址链接,如果您点击该链接,我们则会跟踪此次点击,帮助我们了解您的产品或
-			服务偏好以便于我们主动改善客户服务体验。网站信标通常是一种嵌入到网站或电子邮件中的透明图像。借助于电子邮件中的像素标签,我们能够获知电子邮件是否被打开。如果您不希望自己的活动以这种方式被追踪,则可以随时从我们的寄信名单中退订。
-		</view>
-		<view class="title">三、我们如何共享、转让、公开披露您的个人信息</view>
-		<view class="title">(一)共享</view>
-		<view class="content">我们不会与“满园春商城”服务提供者以外的公司、组织和个人共享您的个人信息,但以下情况除外:</view>
-		<view class="content">1、在获取明确同意的情况下共享:获得您的明确同意后,我们会与其他方共享您的个人信息。</view>
-		<view class="content">2、在法定情形下的共享:我们可能会根据法律法规规定、诉讼争议解决需要,或按行政、司法机关依法提出的要求,对外共享您的个人信息。</view>
-		<view class="content">
-			3、与关联公司间共享:为便于我们基于关联账号共同向您提供服务,推荐您可能感兴趣的信息或保护“满园春商城”关联公司或其他用户或公众的人身财产安全免遭侵害,您的个人信息可能会与我们的关联公司共享。我们只会共享必要的个人信息(如为便于您使用“满园春商城”账号使用我们关联公司产品或服务,我们会向关联公司共享您必要的账户信息),如果我们共享您的个人敏感信息或关联公司改变个人信息的使用及处理目的,将再次征求您的授权同意。
-		</view>
-		<view class="content">
-			4、与授权合作伙伴共享:仅为实现本隐私政策中声明的目的,我们的某些服务将由我们和授权合作伙伴共同提供。我们可能会与合作伙伴共享您的某些个人信息,以提供更好的客户服务和用户体验。例如安排合作伙伴提供服务。我们仅会出于合法、正当、必要、特定、明确的目的共享您的个人信息,并且只会共享提供服务所必要的个人信息。我们的合作伙伴无权将共享的个人信息用于与产品或服务无关的其他用途。
-			目前,我们的授权合作伙伴包括以下类型:
-		</view>
-		<view class="content">
-			(1)广告、分析服务类的授权合作伙伴。除非得到您的许可,否则我们不会将您的个人身份信息(指可以识别您身份的信息,例如姓名或电子邮箱,通过这些信息可以联系到您或识别您的身份)与提供广告、分析服务的合作伙伴共享。我们会向这些合作伙伴提供有关其广告覆盖面和有效性的信息,而不会提供您的个人身份信息,或者我们将这些信息进行汇总,以便它不会识别您个人。例如,只有在广告主同意遵守我们的广告发布准则后,我们才可能会告诉广告主他们广告的效果如何,或者有多少人看了他们广告或在看到广告后安装了应用,或者向这些合作伙伴提供不能识别个人身份的统计信息(例如“男性,25-29岁,位于北京”),帮助他们了解其受众或顾客。
-		</view>
-		<view class="content">
-			(2)供应商、服务提供商和其他合作伙伴。我们将信息发送给支持我们业务的供应商、服务提供商和其他合作伙伴,这些支持包括提供技术基础设施服务、分析我们服务的使用方式、衡量广告和服务的有效性、提供客户服务、支付便利或进行学术研究和调查。
-			对我们与之共享个人信息的公司、组织和个人,我们会与其签署严格的数据保护协定,要求他们按照我们的说明、本隐私政策以及其他任何相关的保密和安全措施来处理个人信息。
-		</view>
-		<view class="title">(二)转让</view>
-		<view class="content">我们不会将您的个人信息转让给任何公司、组织和个人,但以下情况除外:</view>
-		<view class="content">1、在获取明确同意的情况下转让:获得您的明确同意后,我们会向其他方转让您的个人信息;</view>
-		<view class="content">
-			2、在涉及合并、收购或破产清算情形,或其他涉及合并、收购或破产清算情形时,如涉及到个人信息转让,我们会要求新的持有您个人信息的公司、组织继续受本政策的约束,否则我们将要求该公司、组织和个人重新向您征求授权同意。
-		</view>
-		<view class="title">(三)公开披露</view>
-		<view class="content">我们仅会在以下情况下,公开披露您的个人信息:</view>
-		<view class="content">1、获得您明确同意或基于您的主动选择,我们可能会公开披露您的个人信息;</view>
-		<view class="content">
-			2、如果我们确定您出现违反法律法规或严重违反“满园春商城”相关协议规则的情况,或为保护“满园春商城”及其关联公司用户或公众的人身财产安全免遭侵害,我们可能依据法律法规或“满园春商城”相关协议规则征得您同意的情况下披露关于您的个人信息,包括相关违规行为以及“满园春商城”已对您采取的措施。
-		</view>
-		<view class="title">(四)共享、转让、公开披露个人信息时事先征得授权同意的例外</view>
-		<view class="content">以下情形中,共享、转让、公开披露您的个人信息无需事先征得您的授权同意:</view>
-		<view class="content">1、与国家安全、国防安全有关的;</view>
-		<view class="content">2、与公共安全、公共卫生、重大公共利益有关的;</view>
-		<view class="content">3、与犯罪侦查、起诉、审判和判决执行等有关的;</view>
-		<view class="content">4、出于维护您或其他个人的生命、财产等重大合法权益但又很难得到本人同意的;</view>
-		<view class="content">5、您自行向社会公众公开的个人信息;</view>
-		<view class="content">6、从合法公开披露的信息中收集个人信息的,如合法的新闻报道、政府信息公开等渠道。</view>
-		<view class="content">
-			根据法律规定,共享、转让经去标识化处理的个人信息,且确保数据接收方无法复原并重新识别个人信息主体的,不属于个人信息的对外共享、转让及公开披露行为,对此类数据的保存及处理将无需另行向您通知并征得您的同意。
-		</view>
-		<view class="title">四、我们如何保护您的个人信息安全</view>
-		<view class="content">
-			(一)我们已采取符合业界通用解决方案、合理可行的安全防护措施保护您提供的个人信息安全,防止个人信息遭到未经授权访问、公开披露、使用、修改、损坏或丢失。例如,在您的浏览器与服务器之间交换数据(如信用卡信息)时受
-			SSL(Secure Socket
-			Layer)协议加密保护;我们会使用加密技术提高个人信息的安全性;我们会使用受信赖的保护机制防止个人信息遭到恶意攻击;我们会部署访问控制机制,尽力确保只有授权人员才可访问个人信息;以及我们会举办安全和隐私保护培训课程,加强员工对于保护个人信息重要性的认识。
-		</view>
-		<view class="content">
-			(二)我们有行业先进的以数据为核心,围绕数据生命周期进行的数据安全管理体系,从组织建设、制度设计、人员管理、产品技术等方面多维度提升整个系统的安全性。
-		</view>
-		<view class="content">
-			(三)我们会采取合理可行的措施,尽力避免收集无关的个人信息。我们只会在达成本政策所述目的所需的期限内保留您的个人信息,除非需要延长保留期或受到法律的允许。
-		</view>
-		<view class="content">
-			(四)互联网并非绝对安全的环境,我们强烈建议您不要使用非“满园春商城”推荐的通信方式发送个人信息。您可以通过我们的服务建立联系和相互分享。当您通过我们的服务创建交流、交易或分享时,您可以自主选择沟通、交易或分享的对象,作为能够看到您的交易内容、联络方式、交流信息或分享内容等相关信息的第三方。
-			如您发现自己的个人信息尤其是您的账户或密码发生泄露,请您立即联络“满园春商城”用户服务的相关人员,以便我们根据您的申请采取相应措施。
-			请注意,您在使用我们服务时自愿共享甚至公开分享的信息,可能会涉及您或他人的个人信息甚至个人敏感信息,如您选择上传包含个人信息的图片。请您更加谨慎地考虑,是否在使用我们的服务时共享甚至公开分享相关信息。
-			请使用复杂密码,协助我们保证您的账号安全。我们将尽力保障您发送给我们的任何信息的安全性。 同时,我们还将按照监管部门要求,上报个人信息安全事件的处置情况。
-		</view>
-		<view class="title">五、您如何管理您的个人信息</view>
-		<view class="content">您可以通过以下方式访问及管理您的个人信息:</view>
-		<view class="content">(一)访问您的个人信息</view>
-		<view class="content">
-			您有权访问您的个人信息,法律法规规定的例外情况除外。您可以通过以下方式自行访问您的个人信息:
-			个人资料—如果您希望访问或编辑您个人资料中的昵称、头像、签名、性别等,您可以通过登录账户通过-“编辑”执行此类操作。
-			如果您无法通过上述路径访问该等个人信息,您可以加入QQ群““满园春商城”用户反馈群‘与我们取得联系。
-		</view>
-		<view class="content">(二)更正或补充您的个人信息</view>
-		<view class="content">
-			当您发现我们处理的关于您的个人信息有错误时,您有权要求我们做出更正或补充。您可以通过本条“(一)访问您的个人信息”中列明的方式提出更正或补充申请。
-		</view>
-		<view class="content">(三)删除您的个人信息</view>
-		<view class="content">您可以通过本条“(一)访问您的个人信息”中列明的方式删除您的部分个人信息。</view>
-		<view class="content">在以下情形中,您可以向我们提出删除个人信息的请求:</view>
-		<view class="content">1、如果我们处理个人信息的行为违反法律法规;</view>
-		<view class="content">2、如果我们收集、使用您的个人信息,却未征得您的明确同意;</view>
-		<view class="content">3、如果我们处理个人信息的行为严重违反了与您的约定;</view>
-		<view class="content">4、如果您不再使用我们的产品或服务;</view>
-		<view class="content">5、如果我们永久不再为您提供产品或服务。</view>
-		<view class="content">
-			若我们决定响应您的删除请求,我们还将同时尽可能通知从我们处获得您的个人信息的主体,要求其及时删除,除非法律法规另有规定,或这些主体获得您的独立授权。
-			当您从我们的服务中删除信息后,我们可能不会立即从备份系统中删除相应的信息,但会在备份更新时删除这些信息。
-		</view>
-		<view class="content">(四)改变您授权同意的范围</view>
-		<view class="content">
-			每个业务功能需要一些基本的个人信息才能得以完成(见本隐私政策“第一条”)。除此之外,对于额外个人信息的收集和使用,您可以在设置或与“满园春商城”客服联系给予或收回您的授权同意。
-			当您收回同意后,我们将不再处理相应的个人信息。但您收回同意的决定,不会影响此前基于您的授权而开展的个人信息处理。
-		</view>
-		<view class="content">(五)约束信息系统自动决策</view>
-		<view class="content">
-			在某些业务功能中,我们可能仅依据信息系统、算法等在内的非人工自动决策机制做出决定。如果这些决定显著影响您的合法权益,您有权要求我们做出解释,我们也将在不侵害“满园春商城”商业秘密或其他用户权益、社会公共利益的前提下提供申诉方法。
-		</view>
-		<view class="content">(六)响应您的上述请求</view>
-		<view class="content">
-			为保障安全,您可能需要提供书面请求,或以其他方式证明您的身份。我们可能会先要求您验证自己的身份,然后再处理您的请求。
-			我们将在30天内做出答复。如您不满意,还可以通过“满园春商城”客服发起投诉。
-			对于您合理的请求,我们原则上不收取费用,但对多次重复、超出合理限度的请求,我们将视情收取一定成本费用。对于那些无端重复、需要过多技术手段(例如,需要开发新系统或从根本上改变现行惯例)、给他人合法权益带来风险或者非常不切实际的请求,我们可能会予以拒绝。
-			在以下情形中,按照法律法规要求,我们将无法响应您的请求:
-		</view>
-		<view class="content">1、与国家安全、国防安全有关的;</view>
-		<view class="content">2、与公共安全、公共卫生、重大公共利益有关的;</view>
-		<view class="content">3、与犯罪侦查、起诉、审判和执行判决等有关的;</view>
-		<view class="content">4、有充分证据表明个人信息主体存在主观恶意或滥用权利的;</view>
-		<view class="content">5、响应您的请求将导致您或其他个人、组织的合法权益受到严重损害的;</view>
-		<view class="content">6、涉及商业秘密的。</view>
-		<view class="title">六、我们如何处理未成年人的个人信息</view>
-		<view class="content">
-			如果没有父母或监护人的同意,未成年人不得创建自己的用户账户。如您为未成年人的,建议您请您的父母或监护人仔细阅读本隐私政策,并在征得您的父母或监护人同意的前提下使用我们的服务或向我们提供信息。
-			对于经父母或监护人同意使用我们的产品或服务而收集未成年人个人信息的情况,我们只会在法律法规允许、父母或监护人明确同意或者保护未成年人所必要的情况下使用、共享、转让或披露此信息。
-		</view>
-		<view class="title">七、您的个人信息如何在全球范围转移</view>
-		<view class="content">我们在中华人民共和国境内运营中收集和产生的个人信息,存储在中国境内,以下情形除外:</view>
-		<view class="content">1、法律法规有明确规定;</view>
-		<view class="content">2、获得您的明确授权;</view>
-		<view class="content">3、您通过互联网进行跨境直播/发布动态等个人主动行为。</view>
-		<view class="content">针对以上情形,我们会确保依据本隐私政策对您的个人信息提供足够的保护。</view>
-		<view class="title">八、本隐私政策如何更新</view>
-		<view class="content">我们的隐私政策可能变更。</view>
-		<view class="content">
-			未经您明确同意,我们不会限制您按照本隐私政策所应享有的权利。对于重大变更,我们会提供显著的通知(包括我们会通过“满园春商城”公示的方式进行通知甚至向您提供弹窗提示)。
-			本政策所指的重大变更包括但不限于:
-		</view>
-		<view class="content">1、我们的服务模式发生重大变化。如处理个人信息的目的、处理的个人信息类型、个人信息的使用方式等;</view>
-		<view class="content">2、我们在控制权等方面发生重大变化。如并购重组等引起的所有者变更等;</view>
-		<view class="content">3、个人信息共享、转让或公开披露的主要对象发生变化;</view>
-		<view class="content">4、您参与个人信息处理方面的权利及其行使方式发生重大变化;</view>
-		<view class="content">5、我们负责处理个人信息安全的责任部门、联络方式及投诉渠道发生变化时;</view>
-		<view class="content">6、个人信息安全影响评估报告表明存在高风险时。</view>
-		<view class="content pb30">我们还会将本隐私政策的旧版本存档,供您查阅。</view>
-	</view>
-</template>
-
-<script>
-	export default {};
-</script>
-
-<style>
-	.box{
-		padding: 30rpx;
-	}
-.title {
-	font-size: 32rpx;
-	font-weight: 700;
-	line-height: 2;
-	
-}
-.content {
-	font-size: 28rpx;
-	color: #666;
-	line-height: 2;
-}
-.pb10{
-	font-size: 28rpx;
-}
-</style>

+ 0 - 137
pages/contract/start.vue

@@ -1,137 +0,0 @@
-<template>
-	<view class="start">
-		<view class="background"></view>
-		<view class="popup">
-			<view class="title">温馨提示</view>
-			<scroll-view :scroll-y="true" class="content">
-				<text>欢迎使用满园春线上商城。我们非常重视您的用户权益和个人信息的保护,在您使用满园春线上商城服务前,请认真阅读</text>
-				<text class="money" @click="goUser">《用户协议》</text>
-				<text>和</text>
-				<text class="money" @click="goYs">《隐私政策》</text>
-				<text>
-					全部条款。我们将通过上述协议向您说明我们如何为您提供服务并保障您的用户权益,
-					如何收集、使用、保存、共享和保护您的相关信息,以及我们为您提供的访问、更正、删除和申诉您信息相关问题的方式。
-					我们会严格按照您的授权,在上述协议约定的范围内收集、存储和使用您的注册信息、设备信息、位置信息、日志信息或其他经您授权的信息。
-					您点击“同意并继续”视为您已同意上述协议的全部内容
-				</text>
-			</scroll-view>
-			<view class="button flex">
-				<text class="disagree" @click="disagree">不同意</text>
-				<text class="agree" @click="agree">同意并继续</text>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-export default {
-	data() {
-		return {};
-	},
-	onLoad() {
-		let agree = uni.getStorageSync('agree');
-		if (agree) {
-			// this.agree()
-			uni.redirectTo({ url: '/pages/index/index' });
-		}
-	},
-	methods: {
-		//前往用户协议
-		goUser() {
-			uni.navigateTo({ url: './agreement' });
-		},
-		goYs() {
-			uni.navigateTo({ url: './privacy' });
-		},
-		//不同意
-		disagree() {
-			plus.runtime.quit();
-		},
-		//同意
-		agree() {
-			uni.setStorageSync('agree', true);
-			uni.switchTab({
-				url: '/pages/index/index',
-				success(e) {
-					console.log(e);
-				},
-				fail(e) {
-					console.log(e);
-				}
-			});
-		}
-	}
-};
-</script>
-
-<style lang="scss">
-.money {
-	color: $base-color;
-}
-.disagree {
-	padding: 10rpx 30rpx;
-	font-size: 28rpx;
-	width: 200rpx;
-	height: 64rpx;
-	color: $base-color;
-	border-radius: 999rpx;
-	border: 2rpx solid $base-color;
-}
-.agree {
-	padding: 10rpx 30rpx;
-	width: 210rpx;
-	height: 64rpx;
-	font-size: 28rpx;
-	color: #fff;
-	background-color: $base-color;
-	border-radius: 999rpx;
-	border: 2rpx solid $base-color;
-}
-.button {
-	position: absolute;
-	left: 0;
-	right: 0;
-	bottom: 0;
-	z-index: 0;
-	display: flex;
-	padding: 24rpx;
-	justify-content: center;
-	text-align: center;
-	justify-content: space-around;
-}
-.content {
-	position: absolute;
-	left: 0;
-	right: 0;
-	top: 100rpx;
-	bottom: 120rpx;
-	z-index: 0;
-	font-size: 28rpx;
-	padding: 0 50rpx;
-	line-height: 44rpx;
-}
-.title {
-	font-size: 36rpx;
-	padding: 20rpx 50rpx;
-}
-.background {
-	position: fixed;
-	left: 0;
-	right: 0;
-	top: 0;
-	bottom: 0;
-	z-index: 0;
-	background-color: rgba(0, 0, 0, 0.4);
-}
-.popup {
-	position: absolute;
-	z-index: 0;
-	left: 50%;
-	top: 50%;
-	transform: translate3d(-50%, -50%, 0);
-	width: 600rpx;
-	height: 700rpx;
-	background-color: #fff;
-	border-radius: 30rpx;
-}
-</style>

+ 0 - 376
pages/coupon/consumer.vue

@@ -1,376 +0,0 @@
-<template>
-	<view class="content">
-		<view class="content-money">
-			<view class="money-box">
-				<view class="bg"><image src="../../static/img/consumer.png" mode=""></image></view>
-				<view class="body-title">
-					<view class="goback-box" @click="toBack"><image class="goback" src="../../static/icon/fanhui.png" mode=""></image></view>
-					<view class="header">我的消费券</view>
-				</view>
-				<view>
-					<view class="money">{{ money | getMoneyStyle }}</view>
-				</view>
-			</view>
-		</view>
-		<view class="navbar">
-			<view v-for="(item, index) in navList" :key="index" class="nav-item" :class="{ current: tabCurrentIndex === index }" @click="tabClick(index)">{{ item.text }}</view>
-		</view>
-		<swiper :current="tabCurrentIndex" :style="{ height: maxheight + 'px' }" class="swiper-box" duration="300" @change="changeTab" >
-			<swiper-item class="tab-content" v-for="(tabItem, tabIndex) in navList" :key="tabIndex">
-				<scroll-view class="list-scroll-content" scroll-y @scrolltolower="loadData">
-					<!-- 空白页 -->
-					<empty v-if="tabItem.loaded === true && tabItem.orderList.length === 0"></empty>
-
-					<!-- 订单列表 -->
-					<view class="itemList" v-for="(items, indexs) in tabItem.orderList" :key="indexs">
-						<!-- <view class='font-size-lg padding-l-30 bg-gray padding-v-10'>
-							{{items.time}}
-						</view> -->
-						<view v-for="(item, index) in items.list" :key="index" class="order-item flex">
-							<view class="title-box">
-								<view class="title">
-									<text>{{ item.title }}</text>
-								</view>
-								<view class="time">
-									<text>{{ item.add_time }}</text>
-								</view>
-							</view>
-							<view class="money">
-								<text>{{ (item.pm == 0 ? '-' : '+') + item.number }}</text>
-							</view>
-						</view>
-					</view>
-					<uni-load-more :status="tabItem.loadingType"></uni-load-more>
-				</scroll-view>
-			</swiper-item>
-		</swiper>
-	</view>
-</template>
-
-<script>
-import { getUserInfo } from '@/api/login.js';
-import { spreadCommission, userBalance, rechargemoneys } from '@/api/wallet.js';
-// import { mapState } from 'vuex';
-import { getMoneyStyle } from '@/utils/rocessor.js';
-import uniLoadMore from '@/components/uni-load-more/uni-load-more.vue';
-import empty from '@/components/empty';
-// #ifdef H5
-import { weixindata } from '@/utils/wxAuthorized';
-// #endif
-export default {
-	filters: {
-		getMoneyStyle
-	},
-
-	components: {
-		empty,
-		uniLoadMore
-	},
-	// computed: {
-	// 	...mapState(['weichatObj'])
-	// },
-	onReady() {
-		let obj = this;
-		// 初始化获取页面高度
-		uni.createSelectorQuery()
-			.select('.content')
-			.fields(
-				{
-					size: true
-				},
-				data => {
-					// 初始化获取头部高度
-					uni.createSelectorQuery()
-						.select('.content-money')
-						.fields(
-							{
-								size: true
-							},
-							es => {
-								// 保存头部高度
-								obj.maxheight = data.height - es.height - 40;
-							}
-						)
-						.exec();
-				}
-			)
-			.exec();
-	},
-	data() {
-		return {
-			// 头部图高度
-			maxheight: '',
-			tabCurrentIndex: 0,
-			navList: [
-				{
-					state: 6,
-					text: '支出',
-					loadingType: 'more',
-					orderList: [],
-					page: 1, //当前页数
-					limit: 10 //每次信息条数
-				},
-				{
-					state: 5,
-					text: '收入',
-					loadingType: 'more',
-					orderList: [],
-					page: 1, //当前页数
-					limit: 10 //每次信息条数
-				}
-			],
-			money: ''
-		};
-	},
-	onLoad(options) {
-		let bool = uni.getStorageSync('weichatBrowser');
-		if (bool) {
-			// 加载微信信息
-			weixindata();
-		}
-	},
-	onShow() {
-		this.loadData();
-		// 获取用户余额
-		// userBalance({}).then(({ data }) => {
-		// 	this.money = data.now_money;
-		// });
-		getUserInfo().then(({data}) => {
-			this.money = data.consumer;
-		})
-	},
-	methods: {
-		// ToChangeInto() {
-		// 	// #ifdef H5
-		// 	this.weichatObj.scanQRCode({
-		// 		needResult: 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
-		// 		scanType: ['qrCode', 'barCode'], // 可以指定扫二维码还是一维码,默认二者都有
-		// 		success: function(res) {
-		// 			let result = JSON.parse(res.resultStr);
-
-		// 			rechargemoneys({
-		// 				id: result.id,
-		// 				money: result.money
-		// 			})
-		// 				.then(({ data }) => {
-		// 					uni.showModal({
-		// 						title: '标题',
-		// 						content: '成功',
-		// 						showCancel: false
-		// 					});
-		// 				})
-		// 				.catch(e => {
-		// 					console.log(e);
-		// 				});
-		// 		}
-		// 	});
-		// 	// #endif
-		// },
-		// 页面跳转
-		navto(e) {
-			uni.navigateTo({
-				url: e
-			});
-		},
-		//获取收入支出信息
-		async loadData(source) {
-			//这里是将订单挂载到tab列表下
-			let index = this.tabCurrentIndex;
-			let navItem = this.navList[index];
-			let state = navItem.state;
-			if (source === 'tabChange' && navItem.loaded === true) {
-				//tab切换只有第一次需要加载数据
-				return;
-			}
-			if (navItem.loadingType === 'loading') {
-				//防止重复加载
-				return;
-			}
-			// 修改当前对象状态为加载中
-			navItem.loadingType = 'loading';
-
-			spreadCommission(
-				{
-					page: navItem.page,
-					limit: navItem.limit
-				},
-				state
-			)
-				.then(({ data }) => {
-					if (data.length > 0) {
-						navItem.orderList = navItem.orderList.concat(data);
-						console.log(navItem.orderList);
-						navItem.page++;
-					}
-					if (navItem.limit == data.length) {
-						//判断是否还有数据, 有改为 more, 没有改为noMore
-						navItem.loadingType = 'more';
-						return;
-					} else {
-						//判断是否还有数据, 有改为 more, 没有改为noMore
-						navItem.loadingType = 'noMore';
-					}
-					uni.hideLoading();
-					this.$set(navItem, 'loaded', true);
-				})
-				.catch(e => {
-					console.log(e);
-				});
-		},
-		//返回上一页面
-		toBack() {
-			console.log(111);
-			uni.navigateBack({});
-		},
-		//swiper 切换
-		changeTab(e) {
-			this.tabCurrentIndex = e.target.current;
-			this.loadData('tabChange');
-		},
-		//顶部tab点击
-		tabClick(index) {
-			this.tabCurrentIndex = index;
-		}
-	}
-};
-</script>
-
-<style lang="scss">
-page {
-	background: #ffffff;
-	height: 100%;
-	padding: 0;
-}
-.content-money {
-	padding-bottom: 30rpx;
-	background: $page-color-base;
-}
-.money-box {
-	background-color: $base-color;
-	padding-top: var(--status-bar-height);
-	height: 468rpx;
-	color: #ffffff;
-	text-align: center;
-	justify-content: center;
-	position: relative;
-	.body-title {
-		height: 80rpx;
-		text-align: center;
-		font-size: 35rpx;
-		position: relative;
-		.header {
-			position: absolute;
-			left: 0;
-			top: 0;
-			width: 100%;
-			font-size: 36rpx;
-			font-family: PingFang SC;
-			font-weight: bold;
-			color: #fffeff;
-			height: 80rpx;
-			font-size: 32rpx;
-			font-weight: 700;
-			z-index: 9;
-			display: flex;
-			justify-content: center;
-			align-items: center;
-		}
-		.goback-box {
-			position: absolute;
-			z-index: 10;
-			left: 24rpx;
-			top: 0;
-			height: 80rpx;
-			display: flex;
-			align-items: center;
-		}
-		.goback {
-			width: 30rpx;
-			height: 36rpx;
-		}
-	}
-	.bg {
-		position: absolute;
-		top: 0;
-		left: 0;
-		width: 100%;
-		height: 100%;
-		image {
-			width: 100%;
-			height: 100%;
-		}
-	}
-	.money {
-		position: relative;
-		z-index: 10;
-		font-size: 56rpx;
-		height: 388rpx;
-		line-height: 288rpx;
-	}
-}
-
-.navbar {
-	display: flex;
-	height: 40px;
-	padding: 0 5px;
-	background: #fff;
-	box-shadow: 0 1px 5px rgba(0, 0, 0, 0.06);
-	position: relative;
-	z-index: 10;
-	.nav-item {
-		flex: 1;
-		display: flex;
-		justify-content: center;
-		align-items: center;
-		height: 100%;
-		font-size: 15px;
-		color: $font-color-dark;
-		position: relative;
-		&.current {
-			color: $base-color;
-			&:after {
-				content: '';
-				position: absolute;
-				left: 50%;
-				bottom: 0;
-				transform: translateX(-50%);
-				width: 44px;
-				height: 0;
-				border-bottom: 2px solid $base-color;
-			}
-		}
-	}
-}
-// 列表
-
-.swiper-box {
-	padding-top: 10rpx;
-	.order-item {
-		padding: 20rpx 30rpx;
-		line-height: 1.5;
-		.title-box {
-			.title {
-				font-size: $font-lg;
-				color: $font-color-base;
-			}
-			.time {
-				font-size: $font-base;
-				color: $font-color-light;
-			}
-		}
-		.money {
-			color: #fd5b23;
-			font-size: $font-lg;
-		}
-	}
-}
-.list-scroll-content {
-	height: 100%;
-}
-.content {
-	height: 100%;
-	.empty-content {
-		background-color: #ffffff;
-	}
-}
-</style>

+ 0 - 307
pages/coupon/coupon.vue

@@ -1,307 +0,0 @@
-<template>
-	<view class="content">
-		<view class="navbar">
-			<view v-for="(item, index) in navList" :key="index" class="nav-item" :class="{ current: tabCurrentIndex === index }" @click="tabClick(index)">{{ item.text }}</view>
-		</view>
-		<swiper :current="tabCurrentIndex" class="swiper-box" duration="300" @change="changeTab">
-			<swiper-item class="tab-content" v-for="(tabItem, tabIndex) in navList" :key="tabIndex">
-				<!-- 空白页 -->
-				<empty v-if="tabItem.loaded === true && tabItem.orderList.length === 0"></empty>
-				<view v-for="(item, index) in tabItem.orderList" :key="index" class="row flex">
-					<view class="list-money flex">
-						<image :src="item._type == 2 ? '/static/img/img08.png' : '/static/img/img07.png'" mode="scaleToFill"></image>
-						<view class="list-money-text">
-							<view class="tit" :class="{ action: item._type == 2 }">
-								<text>{{ +item.coupon_price.replace(',', '') }}</text>
-							</view>
-							<view class="price">
-								<text>满{{ +item.use_min_price.replace(',', '') }}元</text>
-							</view>
-						</view>
-					</view>
-					<view class="list-interval position-relative">
-						<view class="bottom"></view>
-						<view class="top"></view>
-					</view>
-					<view class="row_list_right">
-						<view class="right_top">
-							<!-- <text class="right_name">【满减券】</text> -->
-							<text class="right_title" :class="{ action: item._type == 2 }">{{ item.coupon_title }}</text>
-						</view>
-						<view class="right_time">
-							<text>{{ item._add_time }}-{{ item._end_time }}</text>
-						</view>
-						<view class="right_use action" v-if="item._type == 2">
-							<text>{{ item._msg }}</text>
-						</view>
-						<view class="right_use noAction" v-if="item._type == 0">
-							<text>{{ item._msg }}</text>
-						</view>
-					</view>
-				</view>
-				<uni-load-more :status="tabItem.loadingType"></uni-load-more>
-			</swiper-item>
-		</swiper>
-	</view>
-</template>
-
-<script>
-import uniLoadMore from '@/components/uni-load-more/uni-load-more.vue';
-import empty from '@/components/empty';
-import { getCouponsList } from '@/api/coupon.js';
-export default {
-	components: {
-		uniLoadMore,
-		empty
-	},
-	data() {
-		return {
-			tabCurrentIndex: 0,
-			navList: [
-				{
-					state: 0,
-					text: '全部',
-					loadingType: 'more',
-					orderList: [],
-					page: 1, //当前页数
-					limit: 10 //每次信息条数
-				},
-				{
-					state: 1,
-					text: '未使用',
-					loadingType: 'more',
-					orderList: [],
-					page: 1, //当前页数
-					limit: 10 //每次信息条数
-				},
-				{
-					state: 2,
-					text: '已使用',
-					loadingType: 'more',
-					orderList: [],
-					page: 1, //当前页数
-					limit: 10 //每次信息条数
-				}
-			]
-		};
-	},
-	onLoad(options) {
-		this.loadData();
-	},
-	methods: {
-		// 返回首页
-		navTo() {
-			uni.switchTab({
-				url: '/pages/index/index'
-			});
-		},
-		//获取订单列表
-		loadData(source) {
-			//这里是将订单挂载到tab列表下
-			let index = this.tabCurrentIndex;
-			let navItem = this.navList[index];
-			let state = navItem.state;
-			if (source === 'tabChange' && navItem.loaded === true) {
-				//tab切换只有第一次需要加载数据
-				return;
-			}
-			if (navItem.loadingType === 'loading') {
-				//防止重复加载
-				return;
-			}
-			// 修改当前对象状态为加载中
-			navItem.loadingType = 'loading';
-			getCouponsList(
-				{
-					page: navItem.page,
-					limit: navItem.limit
-				},
-				index
-			)
-				.then(({ data }) => {
-					navItem.orderList = navItem.orderList.concat(data);
-					console.log(navItem.orderList);
-					navItem.page++;
-					if (navItem.limit == data.length) {
-						//判断是否还有数据, 有改为 more, 没有改为noMore
-						navItem.loadingType = 'more';
-						return;
-					} else {
-						//判断是否还有数据, 有改为 more, 没有改为noMore
-						navItem.loadingType = 'noMore';
-					}
-					uni.hideLoading();
-					this.$set(navItem, 'loaded', true);
-				})
-				.catch(e => {
-					console.log(e);
-				});
-		},
-
-		//swiper 切换
-		changeTab(e) {
-			this.tabCurrentIndex = e.target.current;
-			this.loadData('tabChange');
-		},
-		//顶部tab点击
-		tabClick(index) {
-			this.tabCurrentIndex = index;
-		}
-	}
-};
-</script>
-
-<style lang="scss">
-// 卡卷可用时颜色
-$card-color-action: #fc4141;
-
-.swiper-box {
-	height: calc(100% - 40px);
-	.tab-content {
-		padding: 25rpx 0px;
-		font-size: 28rpx;
-		color: #1b1b1b;
-	}
-}
-.row {
-	border-radius: 15rpx;
-	margin: 0 25rpx;
-	margin-bottom: 25rpx;
-	height: 200rpx;
-	overflow: hidden;
-	background-color: #ffffff;
-	.list-interval {
-		border: 1px dashed $border-color-light;
-		height: 100%;
-		.top,
-		.bottom {
-			border-radius: 100rpx;
-			width: 30rpx;
-			height: 30rpx;
-			position: absolute;
-			background-color: $page-color-base;
-			right: -15rpx;
-		}
-		.top {
-			top: -18rpx;
-		}
-		.bottom {
-			bottom: -18rpx;
-		}
-	}
-	.list-money {
-		height: 100%;
-		image {
-			height: 100%;
-			width: 20rpx;
-		}
-		.list-money-text {
-			width: 220rpx;
-			padding: 0 25rpx;
-			text-align: center;
-			color: $font-color-light;
-			.tit {
-				padding: 15rpx 0rpx;
-				font-size: 55rpx;
-				font-weight: bold;
-				&.action {
-					color: $card-color-action;
-				}
-			}
-			.price {
-				padding-bottom: 25rpx;
-			}
-		}
-	}
-	.row_list_right {
-		flex-grow: 1;
-		padding-left: 25rpx;
-		line-height: 1;
-		.right_time {
-			color: $font-color-light;
-			font-size: $font-sm;
-		}
-		.right_use {
-			margin: 15rpx 0;
-			padding: 10rpx;
-			width: 140rpx;
-			text-align: center;
-			border-radius: 50rpx;
-			color: #fff;
-			font-size: $font-sm - 4rpx;
-			&.action {
-				background-color: $card-color-action;
-			}
-			&.noAction {
-				background-color: $color-gray;
-			}
-		}
-		.right_top {
-			margin: 15rpx 0;
-			font-size: $font-lg;
-			height: 50rpx;
-			color: $font-color-light;
-			.right_name {
-				font-weight: bold;
-			}
-			.right_title {
-				font-weight: bold;
-				&.action {
-					color: $font-color-base;
-				}
-			}
-		}
-	}
-
-	.iconlocation {
-		font-size: 36rpx;
-		color: $font-color-light;
-	}
-}
-page,
-.content {
-	background: $page-color-base;
-	height: 100%;
-}
-
-.navbar {
-	display: flex;
-	height: 40px;
-	padding: 0 5px;
-	background: #fff;
-	box-shadow: 0 1px 5px rgba(0, 0, 0, 0.06);
-	position: relative;
-	z-index: 10;
-	.nav-item {
-		flex: 1;
-		display: flex;
-		justify-content: center;
-		align-items: center;
-		height: 100%;
-		font-size: 15px;
-		color: $font-color-dark;
-		position: relative;
-		&.current {
-			color: #bc253a;
-			&:after {
-				content: '';
-				position: absolute;
-				left: 50%;
-				bottom: 0;
-				transform: translateX(-50%);
-				width: 44px;
-				height: 0;
-				border-bottom: 2px solid #bc253a;
-			}
-		}
-	}
-}
-/* load-more */
-.uni-load-more {
-	display: flex;
-	flex-direction: row;
-	height: 80rpx;
-	align-items: center;
-	justify-content: center;
-}
-</style>

+ 0 - 372
pages/coupon/details.vue

@@ -1,372 +0,0 @@
-<template>
-	<view class="content">
-		<!-- <view class="flex_item coupon">
-			<view class="coupon_img"><image src="/static/xpy/025.png"></image></view>
-			<view class="coupon_name">
-				<view class="coupon_text">星拼乐100元商城购物卡通用元商城购物卡通用</view>
-				<view class="coupon_money">¥100</view>
-			</view>
-		</view> -->
-		<view class="row-box">
-			<view class="title">付款金额</view>
-			<view class="row">
-				<text class="tit">¥</text>
-				<input class="input" type="number" v-model="money" placeholder="请输入转让金额" placeholder-class="placeholder" />
-			</view>
-			<button class="add-btn up" :class="{ 'active-bg': payLoding }" @click="!payLoding ? confirm() : ''">生成二维码</button>
-		</view>
-		<view class="coupon_transfer" v-if="showcode">
-			<view class="erwema">
-				<tki-qrcodes
-					:cid="cid"
-					ref="qrcode"
-					:val="val"
-					:size="size"
-					:unit="unit"
-					:background="background"
-					:foreground="foreground"
-					:pdground="pdground"
-					:icon="icon"
-					:iconSize="iconSize"
-					:lv="lv"
-					:onval="onval"
-					:loadMake="loadMake"
-					:usingComponents="usingComponents"
-					@result="qrR"
-				></tki-qrcodes>
-			</view>
-			<view class="upload" @click="upload()">复制二维码</view>
-			<view class="transfer">通过扫描此二维码转让购物卡</view>
-			<!-- 	<view class="transfer_image" @click="baocun(image)"><image :src="image"></image></view> -->
-		</view>
-		<!-- <view class="orderDetialBox">
-			<view class="f-header m-t">
-				<view class="f-left-ic····························on"></view>
-				<view class="tit-box"><text class="tit">卡片信息</text></view>
-			</view>
-			<view class="item flex">
-				<view class="title-left flex">
-					<text class="title">订单编号:</text>
-					<view class="text">45875487854</view>
-				</view>
-			</view>
-			<view class="item flex">
-				<view class="title-left flex">
-					<text class="title">付款时间:</text>
-					<view class="text">2018-09-09 12:00:31</view>
-				</view>
-			</view>
-			<view class="item flex">
-				<view class="title-left flex">
-					<text class="title">拼中时间:</text>
-					<view class="text">2018-09-09 12:00:31</view>
-				</view>
-			</view>
-		</view> -->
-	</view>
-</template>
-
-<script>
-import { rechargemoneys } from '@/api/wallet.js';
-import tkiQrcodes from '@/components/tki-qrcode/tki-qrcode.vue';
-import { orderDetail } from '@/api/order.js';
-export default {
-	components: { tkiQrcodes },
-	props: {
-		qrval: {
-			// 要生成的二维码值
-			type: String
-		}
-	},
-	data() {
-		return {
-			image: 'http://img03.taobaocdn.com/tfscom/TB2Drm1jVXXXXakXpXXXXXXXXXX_!!2-dgshop.png_300x300.jpg',
-			payLoding: false, //是否加载中
-			showcode: false, //显示二维码页面
-			money: '',
-			url: '',
-			uid: '',
-			qrsize: 120, // 二维码大小
-			cid: 'tki-qrcode-canvas', //canvasId,页面存在多个二维码组件时需设置不同的ID
-			size: 180, //生成的二维码大小
-			unit: 'upx', //大小单位尺寸
-			// show: true,//默认使用组件中的image标签显示二维码
-			val: '', //要生成的内容
-			background: '#ffffff', //二维码背景色
-			foreground: '#333333', //二维码前景色
-			pdground: '#333333', //二维码角标色
-			icon: '', //二维码图标URL(必须是本地图片,网络图需要先下载至本地)
-			iconSize: 40, //二维码图标大小
-			lv: 3, //容错级别
-			onval: true, //监听val值变化自动重新生成二维码
-			loadMake: false, //组件初始化完成后自动生成二维码,val需要有值
-			usingComponents: false, //是否使用了自定义组件模式(主要是为了修复非自定义组件模式时 v-if 无法生成二维码的问题)
-			showLoading: false, //是否显示loading
-			loadingText: '二维码生成中', //loading文字
-			src: '', // 二维码生成后的图片地址或base64
-			ratio: 1, //页面比例用于计算
-			ctxSrc: '', //要显示的图片
-			loading: true, //是否载入图片中
-			canHeight: '',
-			canWeidth: ''
-		};
-	},
-	onLoad() {
-		this.loadlist;
-		let value = uni.getStorageSync('userInfo');
-		this.uid = value.uid;
-	},
-	methods: {
-		// 創建二维码
-		creatQrcode() {
-			console.log(this.$refs.qrcode._makeCode);
-			this.$refs.qrcode._makeCode();
-		},
-		// 保存二维码到图库
-		saveQrcode() {
-			this.$refs.qrcode._saveCode();
-		},
-		// 生成二维码后返回base64
-		qrR(res) {
-			this.src = res;
-		},
-		//清空二维码(清空二维码会触发result回调 返回值为空)
-		clearQrcode(e) {
-			this.$refs.qrcode._clearCode();
-			this.val = '';
-		},
-		// 载入订单详细
-		loadlist() {},
-		// 提交
-		confirm() {
-			let obj = this;
-			if (!obj.money || obj.money == '') {
-				uni.showToast({
-					title: '请填写转让金额',
-					icon: 'none',
-					duration: 2000
-				});
-				return;
-			}
-			obj.showcode = true;
-			obj.payLoding = true;
-			/**rechargemoneys({
-				money: obj.money,
-			})
-				.then(e => {
-					 console.log(e.data)
-					 obj.val='{"url":"'+e.data.url+'"}';
-				})
-				.catch(e => {
-					uni.showModal({
-						title: '失败',
-						content: '转入失败',
-						content: JSON.stringify(e),
-						showCancel: false
-					});
-				});**/
-
-			obj.val = '{"money":"' + obj.money + '","id":"' + obj.uid + '"}';
-			this.$nextTick(function() {
-				this.creatQrcode();
-			});
-		},
-		upload() {
-			this.$refs.qrcode._saveCode();
-		}
-	}
-};
-</script>
-
-<style lang="scss">
-page {
-	background: $page-color-base;
-}
-.asdf {
-	width: 110rpx;
-	height: 110rpx;
-}
-.content {
-	border-top: 2rpx solid #f2f3f5;
-}
-// 订单详细
-.orderDetialBox {
-	margin-top: 20rpx;
-	padding: 0 30rpx;
-	background-color: #ffffff;
-	font-size: $font-base;
-	color: $font-color-base;
-	.item {
-		height: 80rpx;
-		.text {
-			padding-left: 10rpx;
-		}
-		.buttom-right {
-			width: 180rpx;
-			border-radius: 99rpx;
-			padding: 10rpx;
-			text-align: center;
-			border: 1px solid $border-color-light;
-		}
-	}
-}
-
-// 标题头
-.f-header {
-	display: flex;
-	align-items: center;
-	height: 80rpx;
-	.tit-box {
-		@extend %font-title-box;
-		border-bottom: 2rpx solid #f0f0f0;
-		padding: 25rpx 0rpx;
-	}
-	.tit {
-		@extend %font-title;
-	}
-	.f-left-icon {
-		@extend %f-left-icon;
-	}
-}
-// 共有底部高度
-$btHeight: 100rpx;
-.btHeight {
-	height: $btHeight;
-}
-.coupon {
-	width: 100%;
-	background-color: #ffffff;
-	padding: 25rpx 25rpx;
-	font-size: 30rpx;
-	.coupon_img {
-		width: 200rpx;
-		height: 118rpx;
-		margin-right: 15rpx;
-		image {
-			width: 100%;
-			height: 100%;
-		}
-	}
-	.coupon_name {
-		height: 118rpx;
-		width: 70%;
-		.coupon_text {
-			padding-bottom: 25rpx;
-			white-space: nowrap;
-			overflow: hidden;
-			text-overflow: ellipsis;
-			font-weight: bold;
-			color: rgba(51, 51, 51, 1);
-		}
-		.coupon_money {
-			font-weight: 500;
-			color: rgba(102, 102, 102, 1);
-			.coupon_time {
-				padding-left: 25rpx;
-			}
-		}
-	}
-}
-.coupon_transfer {
-	background-color: #ffffff;
-	padding: 40rpx 25rpx;
-	width: 100%;
-	height: 100%;
-	margin-top: 25rpx;
-}
-.transfer_image {
-	width: 100%;
-	height: 220rpx;
-	text-align-last: center;
-}
-.transfer_image image {
-	width: 220rpx;
-	height: 220rpx;
-}
-.upload {
-	width: 28%;
-	background: linear-gradient(90deg, rgba(253, 59, 51, 1) 0%, rgba(254, 75, 52, 1) 100%);
-	border-radius: 10rpx;
-	color: #ffffff;
-	font-size: 26rpx;
-	margin: 25rpx auto;
-	padding: 20rpx 30rpx;
-	text-align: center;
-}
-.transfer {
-	width: 100%;
-	text-align: center;
-	font-size: 26rpx;
-}
-.row-box {
-	margin-top: 30rpx;
-	padding: 20rpx 30rpx;
-	background: #fff;
-	.title {
-		font-size: $font-base + 2rpx;
-		color: $font-color-dark;
-		padding-bottom: 25rpx;
-	}
-	.row {
-		display: flex;
-		align-items: center;
-		position: relative;
-		height: 80rpx;
-		.tit {
-			flex-shrink: 0;
-			width: 40rpx;
-			font-size: 30rpx;
-			color: $font-color-dark;
-		}
-		.input {
-			flex: 1;
-			font-size: 30rpx;
-			color: $font-color-dark;
-		}
-		.iconlocation {
-			font-size: 36rpx;
-			color: $font-color-light;
-		}
-
-		.buttom {
-			color: $font-color;
-			font-size: $font-base;
-		}
-	}
-}
-.add-btn {
-	&.modified {
-		color: $base-color;
-	}
-	&.up {
-		background: #5dbc7c;
-		border-radius: 40px;
-		color: #fff;
-	}
-	&.to {
-		border: 1px solid rgba(252, 42, 63, 1);
-		border-radius: 40px;
-		border-radius: 40px;
-		color: #fc2a3f;
-	}
-	display: flex;
-	align-items: center;
-	justify-content: center;
-	width: 560rpx;
-	height: 75rpx;
-	margin: 0 auto;
-	margin-top: 25rpx;
-	font-size: $font-lg;
-	border-radius: 10rpx;
-	// box-shadow: 1px 2px 5px rgba(219, 63, 96, 0.4);
-}
-.erwema {
-	width: 135px;
-	height: 140px;
-	background-color: #ffffff;
-	display: flex;
-	justify-content: center;
-	align-items: center;
-	margin: 0rpx auto;
-}
-</style>

+ 0 - 332
pages/detail/detail.vue

@@ -1,332 +0,0 @@
-<template>
-	<view>
-		<swiper class="carousel" indicator-dots=true circular=true interval="3000" duration="700">
-			<swiper-item v-for="(item,index) in data.imgList" :key="index">
-				<view class="image-wrapper">
-					<image
-						:src="item.src" 
-						:class="item.loaded" 
-						mode="aspectFill"
-						@load="imageOnLoad('imgList', index)" 
-					></image>
-				</view>
-			</swiper-item>
-		</swiper>
-		<view class="scroll-view-wrapper">
-			<scroll-view class="episode-panel" :class="{Skeleton:!loaded}" scroll-x>
-				<view v-for="(item, index) in data.episodeList" :key="index"
-					:class="{current: currentEpd===item}"
-					@click="changeEpd(index)"
-				>
-					{{item}}
-				</view>
-			</scroll-view>
-		</view>
-		<view class="info">
-			<view class="title">
-				<text :class="{Skeleton:!loaded}">{{data.title}}</text>
-				<text :class="{Skeleton:!loaded}">{{data.title2}}</text>
-			</view>
-			<text class="yticon icon-xia"></text>
-		</view>
-		<view class="actions">
-			<text class="yticon icon-fenxiang2" @click="share"></text>
-			<text class="yticon icon-Group-"></text>
-			<text class="yticon icon-shoucang" :class="{active: data.favorite}" @click="favorite"></text>
-		</view>
-
-		<!-- 猜你喜欢 -->
-		<view class="guess">
-			<view class="section-tit">猜你喜欢</view>
-			<view class="guess-list">
-				<view 
-					v-for="(item, index) in data.guessList" :key="index"
-					class="guess-item"
-				>
-					<view class="image-wrapper">
-						<image 
-							:src="item.src" 
-							:class="item.loaded" 
-							mode="aspectFill"
-							@load="imageOnLoad('guessList', index)" 
-						></image>
-					</view>
-					<text class='title clamp' :class="{Skeleton:!loaded}">{{item.title}}</text>
-					<text class="clamp" :class="{Skeleton:!loaded}">{{item.title2}}</text>
-				</view>
-			</view>
-		</view>
-		<!-- 评论 -->
-		<view class="evalution">
-			<view class="section-tit">评论</view>
-			<view class="eva-list" :class="{Skeleton:!loaded}">
-				<view  v-for="(item, index) in data.evaList" :key="index"
-					class="eva-item"
-				>
-					<image :src="item.src" mode="aspectFill"></image>
-					<view class="eva-right">
-						<text>{{item.nickname}}</text>
-						<text>{{item.time}}</text>
-						<view class="zan-box">
-							<text>{{item.zan}}</text>
-							<text class="yticon icon-shoucang"></text>
-						</view>
-						<text class="content">{{item.content}}</text>
-					</view>
-				</view>
-			</view>
-		</view>
-		<!-- 分享 -->
-		<share 
-			ref="share" 
-			:contentHeight="580"
-			:shareList="shareList"
-		></share>
-	</view>
-</template>
-
-<script>
-	import share from '@/components/share';
-	export default {
-		components: {
-			share
-		},
-		data() {
-			return {
-				loaded: false,
-				currentEpd: 1,
-				data: {
-					guessList: [{},{},{},{}] 
-				},
-				shareList: []
-			};
-		},
-		async onLoad(){
-			let detailData = await this.$api.json('detailData');
-			let shareList = await this.$api.json('shareList');
-			this.loaded = true;
-			this.data = detailData;
-			this.shareList = shareList;
-			uni.setNavigationBarTitle({
-				title: detailData.title
-			})
-		},
-		methods:{
-			imageOnLoad(key,index){
-				this.$set(this.data[key][index], 'loaded', 'loaded');
-			},
-			changeEpd(index){
-				let list = this.data.episodeList;
-				let epd = list[index];
-				this.$api.msg(`切换到第${epd}项`);
-				this.currentEpd = epd;
-			},
-			//分享
-			share(){
-				this.$refs.share.toggleMask();	
-			},
-			//收藏
-			favorite(){
-				this.data.favorite = !this.data.favorite;
-			}
-		},
-		//处理遮罩层物理返回键
-		onBackPress(){
-			if(this.$refs.share.show){
-				this.$refs.share.toggleMask();
-				return true;
-			}
-		}
-	}
-</script>
-
-<style lang="scss">
-	page{
-		background: $page-color-base;
-	}
-
-	.carousel {
-		height: 200px;
-		.image-wrapper{
-			display: flex;
-			justify-content: center;
-			align-content: center;
-			width: 100%;
-			height: 100%;
-			overflow: hidden;
-
-			image {
-				width: 100%;
-				height: 100%;
-			}
-		}
-	}
-	.scroll-view-wrapper{
-		display:flex;
-		align-items:center;
-		height: 90rpx;
-		padding: 20rpx 0 20rpx 40rpx;
-		background: #fff;
-	}
-	.episode-panel {
-		white-space: nowrap;
-		width: 100%;
-		view {
-			display: inline-block;
-			margin-right: 30rpx;
-			width: 56rpx;
-			font-size: $font-lg;
-			color: $font-color-base;
-			&.current{
-				color: #07a7a7;
-			}
-		}
-	}
-
-	.info {
-		display: flex;
-		align-items: center;
-		padding: 10rpx 40rpx;
-		background: #fff;
-
-		.title {
-			flex: 1;
-			display: flex;
-			flex-direction: column;
-			font-size: $font-lg + 4rpx;
-			color: $font-color-dark;
-
-			text:last-child {
-				font-size: $font-sm;
-				color: $font-color-light;
-				margin-top: 4rpx;
-				&.Skeleton{
-					width:220rpx;
-				}
-			}
-		} 
-		.yticon {
-			font-size: 44rpx;
-			color: $font-color-base;
-			margin: 0 10rpx 0 30rpx;
-		}
-	}
-
-	.actions {
-		padding: 10rpx 28rpx;
-		background: #fff;
-
-		.yticon {
-			font-size: 46rpx;
-			color: $font-color-base;
-			padding: 10rpx 12rpx;
-			&.active{
-				color: #ff4443;
-			}
-			&:nth-child(2) {
-				font-size: 50rpx;
-			}
-		}
-	}
-
-	.section-tit {
-		font-size: $font-base+2rpx;
-		color: $font-color-dark;
-		margin-bottom: 30rpx;
-		text-align:center;
-	}
-
-	.guess {
-		display: flex;
-		flex-direction: column;
-		justify-content: center;
-		align-items: center;
-		padding: 30rpx 40rpx 10rpx;
-		margin-top: 16rpx;
-		background: #fff;
-	}
-
-	.guess-list {
-		display: flex;
-		flex-wrap: wrap;
-		width: 100%;
-	}
-	.guess-item {
-		display: flex;
-		flex-direction: column;
-		flex: 1;
-		overflow: hidden;
-		min-width: 40%;
-		margin-right: 26rpx;
-		padding-bottom: 40rpx;
-	
-		&:nth-child(2n) {
-			margin-right: 0;
-		}
-	
-		image {
-			width: 100%;
-			height: 200rpx;
-			border-radius: 10rpx;
-		}
-	
-		text {
-			font-size: $font-sm;
-			color: $font-color-light;
-			&.Skeleton{
-				width: 180rpx;
-				&.title{
-					width: 140rpx;
-				}
-			}
-			&.title{
-				font-size: $font-base+2rpx;
-				color: $font-color-dark;
-				margin-top:16rpx;
-				margin-bottom: 8rpx;
-			}
-		}
-	}
-	.evalution{
-		display:flex;
-		flex-direction:column;
-		background: #fff;
-		margin-top: 16rpx;
-		padding: 40rpx 0;
-	}
-
-	.eva-item{
-		display:flex;
-		padding: 20rpx 40rpx;
-		image{
-			width: 60rpx;
-			height: 60rpx;
-			border-radius: 50px;
-			flex-shrink: 0;
-			margin-right: 24rpx;
-		}
-	}
-	.eva-right{
-		display:flex;
-		flex-direction:column;
-		flex: 1;
-		font-size: $font-sm + 2rpx;
-		color: $font-color-light;
-		position:relative;
-		.zan-box{
-			display:flex;
-			align-items:base-line;
-			position:absolute;
-			top: 10rpx;
-			right: 10rpx;
-			.yticon{
-				margin-left: 8rpx; 
-			}
-		}
-		.content{
-			font-size: $font-base;
-			color: #333;
-			padding-top:20rpx;
-		}
-	}
-</style>

+ 0 - 167
pages/favorites/favorites.vue

@@ -1,167 +0,0 @@
-<template>
-	<view class="container">
-		<!-- 空白页 -->
-		<empty v-if="favoriteList.length < 1"></empty>
-		<view class="favorites flex" v-for="ls in favoriteList" @click="toproduct(ls.pid)">
-			<view class="favorites_img"><image :src="ls.image"></image></view>
-			<view class="favorites_list">
-				<view class="favorites_name">{{ ls.store_name }}</view>
-				<view class="favorites_peice flex">
-					<view>
-						<text>¥{{ ls.price }}</text>
-					</view>
-					<view @click.prevent.stop="del(ls.pid)" v-show="delshow" class="icon_del">
-						<text class="iconfont icondelete"></text>
-						<text>取消</text>
-					</view>
-				</view>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-import { getcollectList, delcollect } from '@/api/favorite.js';
-import uniLoadMore from '@/components/uni-load-more/uni-load-more.vue';
-import empty from '@/components/empty';
-export default {
-	components: {
-		uniLoadMore,
-		empty
-	},
-	data() {
-		return {
-			tabCurrentIndex: 0,
-			favoriteList: '',
-			delshow: true
-		};
-	},
-	onLoad() {
-		this.loadData();
-	},
-	methods: {
-		//获取收藏夹列表
-		loadData() {
-			let obj = this;
-			getcollectList({
-				page: '1',
-				limit: '10'
-			})
-				.then(function(e) {
-					obj.favoriteList = e.data;
-					console.log(obj.favoriteList);
-				})
-				.catch(function(e) {
-					console.log(e);
-				});
-		},
-		//删除收藏夹商品
-		del(item) {
-			let obj = this;
-			uni.showModal({
-				title: '提示',
-				content: '是否取消收藏该商品',
-				success: e => {
-					if (e.confirm) {
-						delcollect({
-							id: item,
-							category: 'product'
-						})
-							.then(function(e) {
-								uni.showToast({
-									title: '已取消收藏',
-									duration: 1500,
-								});
-								obj.loadData();
-							})
-							.catch(function(e) {
-								console.log(e);
-							});
-					}
-				}
-			});
-		},
-		//跳转商品详情页
-		toproduct(item) {
-			let id = item;
-			uni.navigateTo({
-				url: `/pages/product/product?id=${id}`
-			});
-		}
-		// //跳转忘记密码
-		// forget() {
-		// 	uni.navigateTo({
-		// 		url: `/pages/public/forget`
-		// 	});
-		// },
-		// // 后退
-		// navBack() {
-		// 	uni.navigateBack();
-		// }
-	}
-};
-</script>
-
-<style lang="scss">
-page {
-	height: 100%;
-}
-%flex-center {
-	display: flex;
-	flex-direction: column;
-	justify-content: center;
-	align-items: center;
-}
-%section {
-	display: flex;
-	justify-content: space-around;
-	align-content: center;
-	background: #fff;
-	border-radius: 10rpx;
-}
-.container {
-	height: 100%;
-	background-color: $page-color-base;
-	padding: 15rpx 0rpx;
-	font-size: 28rpx;
-}
-.favorites {
-	width: 90%;
-	background-color: #ffffff;
-	// height:100%;
-	border-radius: 15rpx;
-	margin: 15rpx auto;
-	padding: 25rpx 25rpx;
-	margin-bottom: 25rpx;
-}
-.favorites_img {
-	width: 80px !important;
-	height: 80px;
-}
-.favorites_img image {
-	width: 100%;
-	height: 100%;
-}
-.favorites_list {
-	width: 70%;
-	padding-left: 20rpx;
-}
-.icon_del {
-	color: $font-color-base;
-	z-index: 9999;
-	font-weight: bold;
-}
-.favorites_name {
-	height: 80rpx;
-	overflow: hidden;
-	text-overflow: ellipsis;
-	display: -webkit-box;
-	-webkit-box-orient: vertical;
-	-webkit-line-clamp: 2;
-}
-.favorites_peice {
-	margin-top: 25rpx;
-	color: #db1935;
-	font-weight: bold;
-}
-</style>

+ 0 - 388
pages/groupBooking/detail.vue

@@ -1,388 +0,0 @@
-<template>
-	<view class="box">
-		<!-- 拼团 -->
-		<view class="lyy-a">
-			<view class="lyy-a-p">
-				<view class="lyy-a-f">
-					<view><image :src="goods.image" class="lyy-a-tu" /></view>
-					<view class="lyy-a-z">
-						<view class="lyy-a-word lyy-a-word2">{{ goods.title }}</view>
-						<view class="flex money-box">
-							<view class="lyy-a-f lyy-a-word margin-r-20">
-								<view class="lyy-a-word3">¥{{ goods.price }}</view>
-							</view>
-							<view class="lyy-a-tu2 lyy-a-f padding-c-20 border-radius-all">
-								<view class="lyy-a-tu3"><image src="http://lxscimg.liuniu946.com/2019-11-02_5dbd110b5928a.png" class="lyy-a-tu5"></image></view>
-								<view class="lyy-a-tu4 flex-shrink-false">{{ goods.people }}人拼</view>
-							</view>
-						</view>
-					</view>
-				</view>
-			</view>
-		</view>
-		<view class="lyy-hx"></view>
-		<!-- 第二部分 -->
-		<view class="lyy-b padding-t-20">
-			<view class="lyy-b-p">
-				<view class="lyy-b-jz flex">
-					<view class="image1"><view class="lyy-b-word">剩余时间</view></view>
-				</view>
-				<view class="lyy-b-jz flex">
-					<uni-countdown
-						v-if="pinkBool==0"
-						color="#FFFFFF"
-						splitor-color="#FC5B62"
-						background-color="#FC5B62"
-						border-color="#FC5B62"
-						:show-day="false"
-						:hour="stopTime.stopTimeH"
-						:minute="stopTime.stopTimeM"
-						:second="stopTime.stopTimeS"
-					></uni-countdown>
-				</view>
-				<view class="lyy-b-jz flex">
-					<span class="lyy-b-word2">{{ pinkT.people }}</span>
-					<span class="lyy-b-word3">人成团,还差{{ peopleNub }}人</span>
-				</view>
-				<view class="lyy-b-jz flex">
-					<view class="cmy-user-box">
-						<view class="user-list">
-							<view class="lyy-y bg-gray"><image :src="pinkT.avatar" class="user-list-img" /></view>
-							<view class="lyy-y-word clamp">{{ pinkT.nickname }}</view>
-						</view>
-						<view class="user-list" v-for="(l, i) in peopleNub" :key="i">
-							<view class="lyy-y bg-gray"></view>
-							<view class="lyy-y-word clamp">待邀请</view>
-						</view>
-					</view>
-				</view>
-				<view class="lyy-b-jz flex">
-					<view class="lyy-b-but" v-if="status == 1&&pinkBool==0" @click="invitation">邀请好友参团</view>
-					<view class="lyy-b-but" v-if="status == 0&&pinkBool==0" @click="goBuy">立即加入</view>
-					<!-- <view class="lyy-b-but" @click="goBuy">立即加入</view> -->
-					<view class="lyy-b-but bg-gray" v-if="pinkBool==-1">拼团失败</view>
-					<view class="lyy-b-but" v-if="pinkBool==1">拼团成功</view>
-				</view>
-			</view>
-		</view>
-		<view class="lyy-hx"></view>
-		<!-- 第三部分 -->
-		<view class="lyy-c">
-			<view class="lyy-c-p">
-				<view class="lyy-c-word">
-					<view>拼团规则:</view>
-					<view>1.点击商品进入商品详情,通过超值拼团进入订单支付 页,用户付款成功后,按页面提示分享给微信好友。</view>
-					<view>2.好友通过分享,加入超值拼团,完成订单支付,待达成 拼团人数后,拼团成功。</view>
-				</view>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-import uniCountdown from '@/components/uni-countdown/uni-countdown.vue';
-import { getCombinationLisPink } from '@/api/groupBooking.js';
-import { groupGoods } from '@/api/product.js';
-import { timeComputed } from '@/utils/rocessor.js';
-import { mapState } from 'vuex';
-// 倒计时
-export default {
-	computed: {
-		// 还需要报名的人数
-		peopleNub() {
-			return  this.pinkT.people - 1 - this.people.length 
-		}
-	},
-	data() {
-		return {
-			gp_id: 0, //拼团商品id
-			goods: {}, //商品信息
-			pinkT: {}, //拼团团长信息
-			people: [], //拼团成员信息
-			people_num: 0, //总共需要多少人
-			endTime: 0, //剩余时间
-			status: 0, //判断是否为团长
-			gid: 0,
-			user_info: {}, //当前用户信息
-			// 倒计时
-			stopTime: {
-				stopTimeH: 0,
-				stopTimeM: 0,
-				stopTimeS: 0
-			},
-			pinkBool:0,//拼团状态0为待拼团 -1为拼团失败 1为拼团成功
-			userBool: 0 ,//判断用户是否已经参与拼团 0未参加 1为已参加
-			spread:'',//默认没有邀请人
-			userInfo:{}//当前用户信息
-		};
-	},
-	onLoad(e) {
-		// 保存拼团订单id
-		this.gp_id = e.id;
-		// 判断是否有人邀请
-		if (e.spread) {
-			// 存储邀请人
-			this.spread = e.spread;
-			uni.setStorageSync('spread', option.spread);
-		}
-	},
-	onShow() {
-		this.getData();
-	},
-	components: {
-		uniCountdown
-	},
-	methods: {
-		//前往参团
-		goBuy() {
-			let _self = this;
-			uni.navigateTo({
-				url: '/pages/order/createOrder?pinkId='+this.gp_id+'&type=pink'+'&pid='+this.goods.product_id+'&gid='+this.goods.id+'&merid='+this.goods.mer_id
-			});
-		},
-		//邀请参团
-		invitation() {
-			let obj = this;
-			// 判断拼团是否已经结束
-			if (obj.userBool == 0) {
-				uni.showModal({
-					title: '提示',
-					content: '该拼团已经结束!',
-					showCancel: false,
-					success: res => {},
-					fail: () => {},
-					complete: () => {}
-				});
-				return;
-			}
-			uni.navigateTo({
-				url: '/pages/groupBooking/inviteImg?id='+this.pinkT.id+'&spread='+this.userInfo.uid,
-				success: res => {},
-				fail: (e) => {
-					console.log(e);
-				},
-				complete: () => {}
-			});
-		},
-		// #ifdef H5
-		// 加载微信html5页面分享方法
-		shareDate() {
-			let obj = this;
-			// 判断是否微信浏览器
-			let bool = uni.getStorageSync('weichatBrowser') || '';
-			if (bool) {
-				// 过滤微信强制添加的链接地址
-				url = url.replace('?from=singlemessage', '');
-				let data = {
-					link: url, // 分享链接
-					imgUrl: obj.goodsObjact.image, // 分享图标
-					desc: obj.goodsObjact.store_info,
-					title: obj.goodsObjact.store_name,
-					success: function() {}
-				};
-				obj.weichatObj.updateAppMessageShareData(data);
-				obj.weichatObj.updateTimelineShareData(data);
-			}
-		},
-		// #endif
-		// 获取拼团信息
-		getData() {
-			let obj = this;
-			// let data = {gp_id:_self.gp_id},
-			getCombinationLisPink({}, this.gp_id).then(e => {
-				let r = e.data;
-				// 保存拼团商品详细
-				obj.goods = r.store_combination;
-				// 保存团长信息
-				obj.pinkT = r.pinkT;
-				/* 计算倒计时 */
-				obj.timeComputed(obj.pinkT.stop_time * 1000);
-				// 获取拼团用户列表
-				obj.people = r.pinkAll;
-				// 获取当前是否已参与过这个拼团
-				obj.userBool = r.userBool;
-				// 判断当前用户是否为团长
-				if (r.pinkT.uid == r.userInfo.uid) {
-					// 显示邀请好用选项
-					obj.status = 1;
-				}
-				// 保存当前登录用户信息
-				obj.userInfo = r.userInfo;
-				// 获取拼团是否已经过期
-				obj.pinkBool = r.pinkBool
-				// #ifdef H5
-				// 加载微信分享配置
-				this.shareDate();
-				// #endif
-			});
-		},
-		// 计算倒计时时间
-		timeComputed(da) {
-			let obj = this;
-			let stopTime = timeComputed(da);
-			obj.stopTime.stopTimeH = stopTime.hours;
-			obj.stopTime.stopTimeM = stopTime.minutes;
-			obj.stopTime.stopTimeS = stopTime.seconds;
-		},
-	}
-};
-</script>
-
-<style lang="scss">
-.box {
-	/* #ifdef APP-PLUS | MP */
-	padding-top: var(--status-bar-height);
-	/* #endif */
-}
-.lyy-c {
-	width: 100%;
-	background: rgba(255, 255, 255, 1);
-	.lyy-c-word {
-		font-size: 28rpx;
-		color: rgba(102, 102, 102, 1);
-		line-height: 50rpx;
-	}
-
-	.lyy-c-p {
-		padding: 39rpx 30rpx;
-	}
-}
-
-.lyy-wrap {
-	background-color: #f4f4f4;
-}
-
-.lyy-hx {
-	height: 14rpx;
-}
-
-.image1 {
-	width: 200rpx;
-	height: 33rpx;
-	background: url('http://lxscimg.liuniu946.com/2019-11-02_5dbd0e10a2160.png') center center no-repeat;
-	background-size: 200rpx auto;
-}
-
-.lyy-b {
-	width: 100%;
-	background-color: white;
-	.lyy-b-p {
-		padding: 30rpx 45rpx;
-		.lyy-b-word2,
-		.lyy-b-word3 {
-			font-size: 28rpx;
-			font-weight: bold;
-		}
-		.lyy-b-word2 {
-			color: #fc5b62;
-		}
-		.lyy-b-word3 {
-			color: #1d2023;
-		}
-		.lyy-b-jz {
-			width: 100%;
-			justify-content: center;
-			margin-bottom: 20rpx;
-			.lyy-y {
-				width: 80rpx;
-				height: 80rpx;
-				margin: 0px 15rpx;
-				border-radius: 40rpx;
-				overflow: hidden;
-				.user-list-img {
-					width: 100%;
-					height: 100%;
-				}
-			}
-			.lyy-y-word {
-				margin-top: 10rpx;
-				font-size: 28rpx;
-				text-align: center;
-				width: 110rpx;
-			}
-			.lyy-b-but {
-				width: 550rpx;
-				height: 80rpx;
-				background: #fc5b62;
-				border-radius: 100rpx;
-				text-align: center;
-				color: white;
-				line-height: 80rpx;
-				font-size: 32rpx;
-			}
-			.cmy-user-box {
-				.user-list {
-					display: inline-block;
-					line-height: 1;
-				}
-			}
-		}
-		.lyy-b-word {
-			text-align: center;
-			font-size: 26rpx;
-			color: rgba(29, 32, 35, 1);
-		}
-	}
-}
-
-// 商品列表样式
-.lyy-a {
-	width: 100%;
-	background-color: white;
-	.lyy-a-p {
-		padding: 22rpx 30rpx;
-		.lyy-a-f {
-			display: flex;
-			align-items: center;
-			.lyy-a-f2 {
-				flex: 1;
-			}
-			.lyy-a-tu {
-				width: 122rpx;
-				height: 122rpx;
-			}
-			.lyy-a-z {
-				padding-left: 30rpx;
-				flex-grow: 1;
-				.money-box {
-					justify-content: flex-start;
-					.lyy-a-tu2 {
-						background: rgba(255, 255, 255, 1);
-						border: 1rpx solid #fc5b62;
-						.lyy-a-tu3 {
-							background-color: #fc5b62;
-							padding: 2px 4px 0px 4px;
-							text-align: center;
-							height: 26rpx;
-							.lyy-a-tu5 {
-								width: 20rpx;
-								height: 20rpx;
-								display: block;
-							}
-						}
-						.lyy-a-tu4 {
-							margin-left: 2px;
-							font-size: 10px;
-							color: #fc5b62;
-							padding: 0px 10rpx;
-							text-align: center;
-						}
-					}
-				}
-				.lyy-a-word {
-					line-height: 56rpx;
-					.lyy-a-word3 {
-						font-size: 28rpx;
-						font-weight: bold;
-						color: #fc5b62;
-					}
-				}
-				.lyy-a-word2 {
-					font-size: 30rpx;
-					color: rgba(29, 32, 35, 1);
-				}
-			}
-		}
-	}
-}
-</style>

Деякі файли не було показано, через те що забагато файлів було змінено