فهرست منبع

commit -m 呵呵商城first-提交

zhengjinyi 4 سال پیش
والد
کامیت
6afceaa8a3
100فایلهای تغییر یافته به همراه27858 افزوده شده و 2 حذف شده
  1. 190 0
      App.vue
  2. 18 2
      README.md
  3. 76 0
      common/config/addressdata.js
  4. 174 0
      common/config/authorize.js
  5. 183 0
      common/config/common.js
  6. 395 0
      common/config/utilsTools.js
  7. 61 0
      common/config/wxLogin.js
  8. 365 0
      common/css/common.scss
  9. 3 0
      common/css/iconfont.scss
  10. 2 0
      common/css/style/icon.css
  11. 2480 0
      common/css/style/thorui.css
  12. 4673 0
      common/json/data.json.js
  13. 7 0
      components/clipboard/clipboard.min.js
  14. 55 0
      components/clipboard/clipboard.thorui.js
  15. 267 0
      components/clipboard/formValidation.js
  16. 25 0
      components/clipboard/utils.js
  17. 107 0
      components/cm-custom/au-custom.vue
  18. 122 0
      components/cm-custom/cm-custom.vue
  19. 148 0
      components/cm-custom/cm-drag.vue
  20. 114 0
      components/cm-custom/cu-custom.vue
  21. 159 0
      components/cm-custom/custom-d.vue
  22. 229 0
      components/cm-custom/custom-p.vue
  23. 160 0
      components/cm-custom/index-custom.vue
  24. 182 0
      components/cm-custom/ws-custom.vue
  25. 202 0
      components/cm-module/creatOrder/address.vue
  26. 201 0
      components/cm-module/creatOrder/choiceAddress.vue
  27. 171 0
      components/cm-module/creatOrder/freight.vue
  28. 348 0
      components/cm-module/creatOrder/goodsList.vue
  29. 511 0
      components/cm-module/creatOrder/sellerFreight.vue
  30. 696 0
      components/cm-module/creatOrder/sellerInvoice.vue
  31. 440 0
      components/cm-module/creatOrder/sellerRegulations.vue
  32. 209 0
      components/cm-module/headerNavbar/header-back.vue
  33. 237 0
      components/cm-module/headerNavbar/header-poduct.vue
  34. 162 0
      components/cm-module/headerNavbar/headerNavbar.vue
  35. 157 0
      components/cm-module/homeIndex/banner.vue
  36. 160 0
      components/cm-module/homeIndex/customer.vue
  37. 0 0
      components/cm-module/homeIndex/pageFloor.vue
  38. 427 0
      components/cm-module/listTemplate/classifyProductList.vue
  39. 953 0
      components/cm-module/listTemplate/immediatelyList.vue
  40. 51 0
      components/cm-module/listTemplate/listSkeleton.vue
  41. 477 0
      components/cm-module/listTemplate/productList.vue
  42. 39 0
      components/cm-module/listTemplate/richTextTemplate.vue
  43. 235 0
      components/cm-module/orderDetails/activipopu.vue
  44. 470 0
      components/cm-module/orderDetails/goodsList.vue
  45. 181 0
      components/cm-module/orderDetails/logisticsRecord.vue
  46. 167 0
      components/cm-module/orderDetails/orderAddress.vue
  47. 225 0
      components/cm-module/orderDetails/orderButton.vue
  48. 260 0
      components/cm-module/orderDetails/orderInformation.vue
  49. 203 0
      components/cm-module/orderDetails/orderListButton.vue
  50. 149 0
      components/cm-module/orderDetails/paymentRecord.vue
  51. 120 0
      components/cm-module/orderDetails/refundRecord.vue
  52. 125 0
      components/cm-module/orderDetails/transfeRecord.vue
  53. 263 0
      components/cm-module/productDetails/cm-activipopu.vue
  54. 79 0
      components/cm-module/productDetails/cm-attributes.vue
  55. 133 0
      components/cm-module/productDetails/cm-parameter.vue
  56. 358 0
      components/cm-module/productDetails/cm-price.vue
  57. 84 0
      components/cm-module/productDetails/cm-service.vue
  58. 233 0
      components/cm-module/productDetails/evaluate.vue
  59. 175 0
      components/cm-module/productDetails/instrument-recommend.vue
  60. 179 0
      components/cm-module/productDetails/recommend.vue
  61. 125 0
      components/cm-module/scrollTop/scrollTop.vue
  62. 152 0
      components/cm-module/search/fuzzySearch.vue
  63. 80 0
      components/empty.vue
  64. 158 0
      components/jyf-Parser/CssHandler.js
  65. 411 0
      components/jyf-Parser/DomHandler.js
  66. 240 0
      components/jyf-Parser/Parser.js
  67. 218 0
      components/jyf-Parser/Tokenizer.js
  68. 41 0
      components/jyf-Parser/api.js
  69. 70 0
      components/jyf-Parser/handler.sjs
  70. 72 0
      components/jyf-Parser/handler.wxs
  71. 405 0
      components/jyf-Parser/index.vue
  72. 363 0
      components/jyf-Parser/trees.vue
  73. 262 0
      components/keyboard/keyboard.vue
  74. 33 0
      components/modal-layer.vue
  75. 242 0
      components/mpvue-citypicker/mpvueCityPicker.vue
  76. 202 0
      components/share.vue
  77. 185 0
      components/thorui/tui-actionsheet/tui-actionsheet.vue
  78. 134 0
      components/thorui/tui-alert/tui-alert.vue
  79. 155 0
      components/thorui/tui-badge/tui-badge.vue
  80. 387 0
      components/thorui/tui-bottom-navigation/tui-bottom-navigation.vue
  81. 96 0
      components/thorui/tui-bottom-popup/tui-bottom-popup.vue
  82. 203 0
      components/thorui/tui-bubble-popup/tui-bubble-popup.vue
  83. 401 0
      components/thorui/tui-button/tui-button.vue
  84. 562 0
      components/thorui/tui-calendar/tui-calendar.js
  85. 814 0
      components/thorui/tui-calendar/tui-calendar.vue
  86. 211 0
      components/thorui/tui-card/tui-card.vue
  87. 166 0
      components/thorui/tui-collapse/tui-collapse.vue
  88. 257 0
      components/thorui/tui-countdown/tui-countdown.vue
  89. 537 0
      components/thorui/tui-datetime/tui-datetime.vue
  90. 103 0
      components/thorui/tui-divider/tui-divider.vue
  91. 98 0
      components/thorui/tui-drawer/tui-drawer.vue
  92. 69 0
      components/thorui/tui-dropdown-list/tui-dropdown-list.vue
  93. 137 0
      components/thorui/tui-grid-item/tui-grid-item.vue
  94. 44 0
      components/thorui/tui-grid/tui-grid.vue
  95. 55 0
      components/thorui/tui-icon/tui-icon.vue
  96. 78 0
      components/thorui/tui-loading/tui-loading.vue
  97. 166 0
      components/thorui/tui-loadmore/tui-loadmore.vue
  98. 374 0
      components/thorui/tui-modal/tui-modal.vue
  99. 174 0
      components/thorui/tui-navigation-bar/tui-navigation-bar.vue
  100. 103 0
      components/thorui/tui-no-data/tui-no-data.vue

+ 190 - 0
App.vue

@@ -0,0 +1,190 @@
+<script>
+/**
+ * vuex管理登陆状态,具体可以参考官方登陆模板示例
+ */
+import Vue from 'vue'
+import { mapState, mapMutations } from 'vuex'
+import authorize from '@/common/config/authorize.js'
+import wxLogin from '@/common/config/wxLogin.js'
+export default {
+	onLaunch: function() {
+		let self = this
+		uni.getSystemInfo({
+			success: function(e) {
+				let modelmes = e.model
+				self.$store.commit('setWindowHeight', e.windowHeight)
+				if (
+					modelmes.search('iPhone 11') != -1 ||
+					modelmes.search('iPhone 11 Pro Max') != -1 ||
+					modelmes.search('iPhone X') != -1
+				) {
+					//XS,XR,XS MAX均可以适配
+					self.$store.dispatch('setVariableFun', true)
+				} else {
+					self.$store.dispatch('setVariableFun', false)
+				}
+				// #ifndef MP
+				Vue.prototype.StatusBar = e.statusBarHeight
+				if (e.platform == 'android') {
+					Vue.prototype.CustomBar = e.statusBarHeight + 50
+					Vue.prototype.platformClass = true
+				} else {
+					Vue.prototype.CustomBar = e.statusBarHeight + 45
+					Vue.prototype.platformClass = false
+				}
+				// #endif
+
+				// #ifdef MP-WEIXIN || MP-QQ
+				console.log(e.platform)
+				if (e.platform == 'android') {
+					Vue.prototype.platformClass = 'left'
+					self.$store.dispatch('setVariableFun', false)
+				} else {
+					Vue.prototype.platformClass = 'center'
+					self.$store.dispatch('setIsIphoneFun', true)
+				}
+				Vue.prototype.StatusBar = e.statusBarHeight
+				Vue.prototype.fontSizeSetting = e.fontSizeSetting
+				Vue.prototype.screenWidth = e.screenWidth
+				let capsule = wx.getMenuButtonBoundingClientRect()
+				Vue.prototype.capsule = capsule
+				if (capsule) {
+					Vue.prototype.Custom = capsule
+					// Vue.prototype.capsuleSafe = uni.upx2px(750) - capsule.left + uni.upx2px(750) - capsule.right;
+					Vue.prototype.CustomBar = capsule.bottom + capsule.top - e.statusBarHeight
+				} else {
+					Vue.prototype.CustomBar = e.statusBarHeight + 50
+				}
+				// #endif
+				// #ifdef MP-ALIPAY
+				Vue.prototype.StatusBar = e.statusBarHeight
+				Vue.prototype.CustomBar = e.statusBarHeight + e.titleBarHeight
+				// #endif
+			}
+		})
+		this.refresh()
+		if (uni.getStorageSync('isActivityStatus')) {
+			const lockTime = uni.getStorageSync('lockTime')
+			const eTime = this.diffTime(lockTime)
+			this.$store.dispatch('setActivityFn', eTime)
+		} else {
+			this.$store.dispatch('setActivityFn', true)
+		}
+	},
+	methods: {
+		...mapMutations(['login','logout']),
+		async getWxAuthorize() {
+			const wechatCode = await authorize.getCode('weixin')
+			this.UserService.userInfoLogin({ 
+				code: wechatCode ,
+			})
+			.then(response => {
+				this.login(response.data)
+				this.$store.commit('updateStatus', response.data)
+			})
+			.catch(error => {
+				uni.setStorage({
+					//缓存游客用户openid
+					key: 'openid',
+					data: error.data.openid
+				})
+				this.logout()
+			})
+		},
+		refresh() {
+			let TIME = 20 * 60 * 1000
+			setInterval(() => {
+				authorize.getSetting()
+				.then(res => {
+					// console.log('是否已授权',res);//0:为取消授权 1:为已授权 2:为未操作
+					if (res == 1) {
+						this.getWxAuthorize()
+					} else {
+						console.log('授权失败============>:' + '用户取消授权或者未操作')
+					}
+				})
+				.catch(error => {
+					console.log('授权失败============>:' + '用户授权失败,提醒用户重新授权')
+				})
+			}, TIME)
+		},
+		diffTime(t) {
+			let date = Date.now()
+			return date - t < 2 * 60 * 1000 ? false : true
+		}
+	}
+}
+</script>
+
+<style lang="scss">
+/*每个页面公共css */
+@import '@/common/css/common.scss';
+@import '@/common/css/iconfont.scss';
+@import '@/common/css/style/thorui.css';
+@import '@/common/css/style/icon.css';
+
+view,
+scroll-view,
+swiper,
+swiper-item,
+cover-view,
+cover-image,
+icon,
+text,
+rich-text,
+progress,
+button,
+checkbox,
+form,
+input,
+label,
+radio,
+slider,
+switch,
+textarea,
+navigator,
+audio,
+camera,
+image,
+video {
+	// box-sizing: border-box;
+}
+// page {
+//   width: 100%;
+//   height: 100%;
+//   background: #fff;
+//   filter: grayscale(100%);
+//   filter: gray;
+//   filter: progid:DXImageTransform.Microsoft.BasicImage(grayscale=1);
+//   --toast-default-width: 114px;
+// }
+page {
+	height: 100%;
+	background-color: #ffffff;
+}
+/* 骨架屏替代方案 */
+.Skeleton {
+	background: #f3f3f3;
+	padding: 20upx 0;
+	border-radius: 8upx;
+}
+
+.clamp {
+	overflow: hidden;
+	text-overflow: ellipsis;
+	white-space: nowrap;
+	display: block;
+}
+
+.common-hover {
+	background: #f5f5f5;
+}
+/* input 样式 */
+.input-placeholder {
+	color: #999999;
+}
+
+.placeholder {
+	color: #999999;
+}
+</style>

+ 18 - 2
README.md

@@ -1,3 +1,19 @@
-# caimei-applets-hehe
+caimei-applets-caimei --采美商城小程序
+
+项目介绍
+	-维沙采购商城小程序是用Dcloud推出的uni-app开发的一款小程序
+软件架构
+	-HBuild-X  微信开发者工具
+前端框架API
+	-uni-app  Vue.js  微信Api
+目录结构
+			
+运行项目
+	-下载安装HBuild-X
+	-导入项目文件
+	-点击运行到小程序模拟器->微信开发者工具(自动会编译打包开大微信开发者工具运行)
+使用说明
+
+这是一个基于uni-app的项目,所以要用HBuild-X 来打开预览(支持小程序、安卓、苹果)
+
 
- 采美呵呵商城小程序项目

+ 76 - 0
common/config/addressdata.js

@@ -0,0 +1,76 @@
+/*
+ *请求获取省市区
+ *已提供给地区选择picker组件使用
+ */
+import { queryAddressInformation } from '@/services/public.js'
+const provinceData = []
+const cityData = []
+const areaData = []
+
+queryAddressInformation().then(res => {
+	let list = res.data
+	list.forEach(item => {
+		let xxx = handleCitys(item)
+		provinceData.push(item)
+		cityData.push(xxx.e)
+		areaData.push(xxx.f)
+		let list = res.data
+		list.forEach(item => {
+			let xxx = handleCitys(item)
+			provinceData.push(item)
+			cityData.push(xxx.e)
+			areaData.push(xxx.f)
+		})
+	})
+	//获取市后继续处理
+	function handleCitys(data) {
+		const x = []
+		const s = []
+		if (data.cityList.length) {
+			data.cityList.forEach(item => {
+				let xxx = handleTowns(item)
+				s.push(xxx)
+				x.push(item)
+			})
+		} else {
+			s.push([{
+				name: ''
+			}])
+			x.push([{
+				name: ''
+			}])
+		}
+		return {
+			e: x,
+			f: s,
+		}
+	}
+	//获取区后继续处理
+	function handleTowns(data) {
+		const x = []
+		data.townList.forEach(item => {
+			x.push(item)
+		})
+		return x
+	}
+
+	function handleData3(data) {
+		const xxx = []
+		data.forEach(item => {
+			const ooo = []
+			item.forEach(opt => {
+				opt.forEach(z => {
+					ooo.push(z)
+				})
+			})
+			xxx.push(ooo)
+		})
+		return xxx
+	}
+
+})
+module.exports = {
+	provinceData,
+	cityData,
+	areaData
+}

+ 174 - 0
common/config/authorize.js

@@ -0,0 +1,174 @@
+//authorize.js
+import api from './utilsTools.js'
+
+//判断是否登陆 通过检测sessionkey是否过期 1未过期 0已过期
+const checkSessionKey = () => {
+	return new Promise((resolve, reject) => {
+		const user = uni.getStorageSync('user') // 用户缓存信息
+		if (user) {
+			uni.checkSession({
+				success() {
+					resolve(1) //状态未过期
+				},
+				fail() {
+					resolve(0) //状态已过期
+				}
+			})
+		} else {
+			resolve(2) //未存贮
+		}
+	})
+}
+
+// 登录授权
+const login = (params) => {
+	return new Promise((resolve, reject) => {
+		authDo(params).then(res => {
+			if (res.statusCode && res.statusCode != 200) {
+				reject('网络错误,请检查一下网络')
+				return
+			}
+			if (res.data.code != 0) {
+				reject('登录失败')
+				return
+			}
+			let user = res.data.data.user
+			uni.setStorageSync('user', user) //储存用户信息到本地
+			resolve(user)
+		})
+	})
+}
+
+// 查询用户信息 write by self
+const authDo = function(params) {
+	return new Promise(function(resolve, reject) {
+		uni.request({
+			url: api.requestUrl + '/login/doLogin',
+			data: params,
+			method: 'POST',
+			header: {
+				'content-type': 'application/x-www-form-urlencoded'
+			},
+			success: function(res) {
+				resolve(res)
+			},
+			fail: function() {
+				reject('保存用户信息失败')
+			}
+		})
+	})
+}
+
+// 获取服务商信息 uni-app是聚合开发 所以先获得是什么小程序 原生的不用这个
+const getProvider = () => {
+	return new Promise((resolve, reject) => {
+		uni.getProvider({
+			service: 'oauth', //服务类型  登录授权
+			success: function(res) {
+				resolve(res.provider[0])
+			},
+			fail: function() {
+				reject('获取服务商失败')
+			}
+		})
+	})
+}
+
+
+// 获取code
+const getCode = provider => {
+	return new Promise((resolve, reject) => {
+		if (!provider) {
+			reject('获取缺少provider参数')
+		}
+		uni.login({
+			provider: provider,
+			success: function(loginRes) {
+				if (loginRes && loginRes.code) {
+					resolve(loginRes.code)
+				} else {
+					reject('获取code失败')
+					uni.navigateTo({
+						url: '/pages/tabBar/home/index'
+					})
+				}
+			},
+			fail: function() {
+				reject('获取code失败')
+			}
+		})
+	})
+}
+
+// 是否开启了获取用户名授权 当用户一开始拒绝了 需再次提醒授权
+const getSetting = function() {
+	return new Promise((resolve, reject) => {
+		// uni.getSetting({
+		// 	success: function(res) {
+		// 		let authSetting = res.authSetting
+		// 		if (authSetting['scope.userInfo']) {
+		// 			resolve(1)
+		// 			return
+		// 		} //授权成功
+		// 		if (authSetting['scope.userInfo'] === false) {
+		// 			resolve(0)
+		// 			return
+		// 		} //拒绝授权
+		// 		resolve(2) //2未操作
+		// 	},
+		// 	fail: function() {
+		// 		reject('获取用户授权失败')
+		// 	}
+		// })
+	})
+}
+
+// 获取用户信息
+const getUserInfo = (provider) => {
+	return new Promise((resolve, reject) => {
+		if (!provider) {
+			reject('获取缺少provider参数')
+			return
+		}
+		uni.getUserInfo({
+			provider: provider,
+			success: (detail) => {
+				if (detail.iv != '') {
+					resolve(detail)
+				} else {
+					reject(0) //用户点击拒绝授权
+				}
+			},
+			fail: (error) => {
+				reject(0) //如果用户拒绝过授权 直接走fail
+			}
+		})
+	})
+}
+
+// 获取用户登录状态
+const checkLogin = () => {
+	return new Promise((resolve, reject) => {
+		uni.checkSession({
+			success() {
+				resolve(1)
+				console.log('登录成功')
+			},
+			fail(err) {
+				reject(0)
+			}
+		})
+	})
+}
+
+
+
+export default {
+	getProvider,
+	getSetting,
+	checkSessionKey,
+	getCode,
+	login,
+	getUserInfo,
+	checkLogin
+}

+ 183 - 0
common/config/common.js

@@ -0,0 +1,183 @@
+//公共js,主要做表单验证,以及基本方法封装
+const utils = {
+	isNullOrEmpty: function(value) {
+		//是否为空
+		return (value === null || value === '' || value === undefined) ? true : false;
+	},
+	trim: function(value) {
+		//去空格
+		return value.replace(/(^\s*)|(\s*$)/g, "");
+	},
+	isEmail: function(value){
+		//是否为邮箱
+		 return RegExp(/^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/).test(value);
+	},
+	isMobile: function(value) {
+		//是否为手机号
+		return RegExp(/^1[1-9][0-9]{9}$/).test(value);
+	},
+	isFloat: function(value) {
+		//金额,只允许保留两位小数
+		return RegExp(/^([0-9]*[.]?[0-9])[0-9]{0,1}$/).test(value);
+	},
+	isNum: function(value) {
+		//是否全为数字
+		return RegExp(/^[0-9]+$/).test(value);
+	},
+	isEmailCode:function(value) {
+	    return RegExp(/^\d{4}$/).test(value);
+	},
+	isMobileCode:function(value) {
+	    return RegExp(/^\d{6}$/).test(value);
+	},
+	isCredit:function(value) {//统一社会信用代码
+	    return RegExp(/^[0-9A-HJ-NPQRTUWXY]{2}\\d{6}[0-9A-HJ-NPQRTUWXY]{10}$/).test(value);
+	},
+	checkPwd: function(value) {
+		//密码为8~20位数字和字母组合
+		return RegExp(/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$/).test(value);
+	},
+	hidePhone:function(value) {
+		return value.replace(/^(\d{3})\d{4}(\d+)/,"$1****$2")
+	},
+	interceptHtmlFn: function(value){
+		return value.replace(/<[^>]+>/g,"")
+	},
+	desensitizationName:function(value){
+		if(null != value && value != undefined){
+			if(value.length <= 3){
+				let ruten = value.substring(1);
+				return value.replace(ruten,'**');
+			} else if(value.length > 3 && value.length <= 6){
+				let ruten = value.substring(2);
+				return value.replace(ruten,'**');
+			} 
+		} else {
+			return "";
+		}
+	},
+	formatNum: function(num) {
+		//格式化手机号码
+		if (utils.isMobile(num)) {
+			num = num.replace(/^(\d{3})\d{4}(\d{4})$/, '$1****$2')
+		}
+		return num;
+	},
+	rmoney: function(money) {
+		//金额格式化
+		return parseFloat(money).toFixed(2).toString().split('').reverse().join('').replace(/(\d{3})/g, '$1,').replace(
+			/\,$/, '').split('').reverse().join('');
+	},
+	bankRegex:function(num){
+		let bankNum = ''
+		bankNum = num.replace(/\D/g, '').replace(/(....)(?=.)/g, '$1 ');
+		return bankNum
+	},
+	checkData:function(value){
+		let data;
+		if(value == null || value ==""){
+			data = ''
+		}else{
+			data = value
+		}
+		return data
+	},
+	formatDate: function(formatStr, fdate) {
+		//日期格式化
+		if (fdate) {
+			if (~fdate.indexOf('.')) {
+				fdate = fdate.substring(0, fdate.indexOf('.'));
+			}
+			fdate = fdate.toString().replace('T', ' ').replace(/\-/g, '/');
+			var fTime, fStr = 'ymdhis';
+			if (!formatStr)
+				formatStr = "y-m-d h:i:s";
+			if (fdate)
+				fTime = new Date(fdate);
+			else
+				fTime = new Date();
+			var month = fTime.getMonth() + 1;
+			var day = fTime.getDate();
+			var hours = fTime.getHours();
+			var minu = fTime.getMinutes();
+			var second = fTime.getSeconds();
+			month = month < 10 ? '0' + month : month;
+			day = day < 10 ? '0' + day : day;
+			hours = hours < 10 ? ('0' + hours) : hours;
+			minu = minu < 10 ? '0' + minu : minu;
+			second = second < 10 ? '0' + second : second;
+			var formatArr = [
+				fTime.getFullYear().toString(),
+				month.toString(),
+				day.toString(),
+				hours.toString(),
+				minu.toString(),
+				second.toString()
+			]
+			for (var i = 0; i < formatArr.length; i++) {
+				formatStr = formatStr.replace(fStr.charAt(i), formatArr[i]);
+			}
+			return formatStr;
+		} else {
+			return "";
+		}
+	},
+	throttle: function(fn, gapTime) {
+	  if (gapTime == null || gapTime == undefined) {
+	    gapTime = 1500
+	  }
+	
+	  let _lastTime = null
+	
+	  // 返回新的函数
+	  return function () {
+	    let _nowTime = +new Date()
+	    if (_nowTime - _lastTime > gapTime || !_lastTime) {
+	      fn.apply(this, arguments) //将this和参数传给原函数
+	      _lastTime = _nowTime
+	    }
+	  }
+	},
+	
+	debounce: function(fn, delay, isImmediate) {
+	  var timer = null;  //初始化timer,作为计时清除依据
+	  return function() {
+	    var context = this;  //获取函数所在作用域this
+	    var args = arguments;  //取得传入参数
+	    clearTimeout(timer);
+	    if(isImmediate && timer === null) {
+	        //时间间隔外立即执行
+	        fn.apply(context,args);
+	      timer = 0;
+	      return;
+	    }
+	    timer = setTimeout(function() {
+	      fn.apply(context,args);
+	      timer = null;
+	    }, delay);
+	  }
+	}
+
+}
+
+module.exports = {
+	isNullOrEmpty: utils.isNullOrEmpty,
+	trim: utils.trim,
+	isMobile: utils.isMobile,
+	isEmail: utils.isEmail,
+	isFloat: utils.isFloat,
+	isNum: utils.isNum,
+	isEmailCode:utils.isEmailCode,
+	isMobileCode:utils.isMobileCode,
+	checkPwd: utils.checkPwd,
+	formatNum:utils.formatNum,
+	rmoney: utils.rmoney,
+	formatDate: utils.formatDate,
+	bankRegex: utils.bankRegex,
+	checkData:utils.checkData,
+	hidePhone:utils.hidePhone,
+	interceptHtmlFn:utils.interceptHtmlFn,
+	desensitizationName:utils.desensitizationName,
+	throttle: utils.throttle,
+	debounce: utils.debounce
+}

+ 395 - 0
common/config/utilsTools.js

@@ -0,0 +1,395 @@
+/**
+ * @Time 2019-12-12
+ * @Author Zhengjingyi
+ * @Action 全局公共方法
+ */
+import requestUrl from '@/services/config.env.js'
+const caimeiApi = {
+	/**
+	 * @封装公共get数据请求方法无加载动画
+	 * @方法参数:请求地址,请求后台需要的参数字段,回调函数
+	 * @自定义请求头信息
+	 */
+	get:function(url,data,callback){
+		 uni.request({
+			url: requestUrl + url,
+			data:data,
+			header: {
+				'Accept': 'application/json',
+				'Content-Type': 'application/x-www-form-urlencoded', 
+				'X-Token': uni.getStorageSync('token') ? uni.getStorageSync('token') : 'token',
+				'cookie': uni.getStorageSync('sessionid')
+			},
+			method: 'GET',
+			success: (response) => {
+				if(response.statusCode !== 200){
+					uni.showToast({icon: 'none',title:'服务器连接错误',duration: 2000})
+					callback(response.statusCode)
+				}else{
+					callback(response.data)
+				}
+			},
+			fail: (error) => {
+				if (error) {
+					uni.showToast({icon: 'none',title: '网络错误,请稍后重试',duration: 2000})
+				}
+			}
+		 })
+	},
+	/**
+	 * @封装公共get数据请求方法有加载动画
+	 * @方法参数:请求地址,请求后台需要的参数字段,回调函数
+	 * @自定义请求头信息
+	 */
+	lodingGet:function(url,data,callback){
+		 uni.showLoading({mask: true,title:'加载中~',})
+		 uni.request({
+			url: requestUrl + url,
+			data:data,
+			header: {
+				'Accept': 'application/json',
+				'Content-Type': 'application/x-www-form-urlencoded', 
+				'X-Token': uni.getStorageSync('token') ? uni.getStorageSync('token') : 'token',
+				'cookie': uni.getStorageSync('sessionid')
+			},
+			method: 'GET',
+			success: (response) => {
+				if(response.statusCode !== 200){
+					uni.showToast({icon: 'none',title: '服务器连接错误',duration: 2000})
+					callback(response.statusCode)
+				}else{
+					callback(response.data)
+				}
+			},
+			fail: (error) => {
+				if (error) {
+					uni.showToast({icon: 'none',title: '网络错误,请稍后重试',duration: 2000})
+				}
+			},
+			complete: () => {
+				setTimeout(function () {
+					uni.hideLoading()
+				}, 250)
+			}
+		 })
+	},
+	/**
+	 * @封装公共post数据请求方法
+	 * @方法参数:请求地址,请求后台需要的参数字段,回调函数
+	 */
+	post:function(url,data,loadingStatus,callback){
+		if(loadingStatus){uni.showLoading({mask: true,title:'加载中~'})}
+		uni.request({
+			url: requestUrl+url,
+			data:data,
+			header: {
+				'Accept': 'application/json',
+				// 'Content-Type': 'application/x-www-form-urlencoded',
+				'Content-Type': 'application/json',
+			},
+			method: 'POST',
+			success: (response) => {
+				console.log(response)
+				if(loadingStatus){uni.hideLoading()}
+				const result = response.data
+				callback(result)
+			},
+			fail: (error) => {
+				uni.hideLoading()
+				if (error) {
+					uni.showToast({icon: 'none',title: '网络错误,请稍后重试',duration: 2000})
+				}
+			}
+		})
+	},
+	getComStorage:function(key){// 获取本地Storage
+		return new Promise(function(resolve,reject) {
+			uni.getStorage({
+				key: key,
+				success: function (res){
+					resolve(res.data)
+				},
+				fail: function(res){
+					reject(false)
+				}
+			})
+		})
+	},
+	setStorage:function(key,data){// 存储本地Storage
+		return new Promise(function(resolve,reject) {
+			uni.setStorage({
+				key: key,
+				data:data,
+				success: function (res){
+				}
+			})
+		})
+	},
+	getStorage:function(){// 获取本地userInfo
+		return new Promise(function(resolve,reject) {
+			uni.getStorage({
+				key: 'userInfo',
+				success: function (res){
+					resolve(res.data)
+				},
+				fail: function(res){
+					reject(false)
+				}
+			})
+		})
+	},
+	getStorageAddressKey:function(){// 获取本地地址信息
+		return new Promise(function(resolve,reject) {
+			uni.getStorage({
+				key: 'address_key',
+				success: function (res){
+					resolve(res.data)
+				}
+			})
+		})
+	},
+	loginStatus:function(){
+	// 获取用户是否登陆 1:已登陆,否则未登陆
+		return new Promise(function(resolve,reject) {
+			uni.getStorage({
+				key: 'userInfo',
+				success: function (res){
+					if(res.data.code == '1'){
+						resolve(true)
+					} else {
+						resolve(false)
+					}
+				}
+			})
+		})
+	},
+	navToListPage:function({type,value,id,lType} = {}){	
+	// 跳转到列表页
+		if(lType=='4'){
+			const pages = getCurrentPages()
+			const prevPage = pages[pages.length-2]
+			prevPage.refresh = true
+			prevPage.listData = {
+				type: type,
+				from: value,
+				id: id
+			}
+			uni.navigateBack({
+				delta: 1
+			})
+		}else{
+			uni.navigateTo({
+				url:`/pages/goods/goods?type=${type}&from=${value}&id=${id}`
+			})
+		}
+	},
+	navigateToGoods:function({type,value,id,lType} = {}){
+	// 跳转到列表页
+		if(lType=='4'){
+			const pages = getCurrentPages()
+			const prevPage = pages[pages.length-2]
+			prevPage.refresh = true
+			prevPage.listData = {
+				type: type,
+				from: value,
+				id: id
+			}
+			uni.navigateBack({
+				delta: 1
+			})
+		}else{
+			uni.navigateTo({
+				url:`/pages/goods/goods-classify?type=${type}&from=${value}&id=${id}`
+			})
+		}
+	},
+	FlooryNavigateTo:function(pros){
+		if(pros.listType == 1){
+			if(pros.product.productCategory == '1'){
+				uni.navigateTo({
+				  	url:`/pages/goods/product?id=${pros.product.productID}`
+				})
+			}else{
+				uni.navigateTo({
+				  	url:`/second/pages/product/product-details?id=${pros.product.productID}`
+				})
+			}
+		}else{
+			/**
+			 * 页面跳转类型
+			 * 1、二级页面,2、搜索项目仪器,3、直播页面,4、自由页面,5、商品详情,6、仪器项目详情,7、供应商主页
+			 * 8、专题活动页,9、二手市场介绍,10、二手商品列表,11、二手商品发布,12、商品搜索,13、信息详情
+			 * 14、品牌招商介绍页,15、维修保养介绍页,16、首页,17、注册页,18、信息中心,19、供应商列表
+			 **/
+			if(pros.linkType){
+				console.log(pros.linkType)
+				const typeMap = {
+				 	1:`/pages/goods/goods-instrument?linkId=${pros.linkParam.id}`,
+				 	2:`/pages/goods/instrument-details?id=${pros.linkParam.id}`,
+					4:`/h5/pages/activity/activity?title=${pros.crmTitle}&link=${pros.crmLink}`,
+				 	5:`/pages/goods/product?id=${pros.linkParam.id}`,
+				 	7:`/supplier/pages/user/my-shop?shopId=${pros.linkParam.id}`,
+				 	8:'/h5/pages/activity/activity-list',
+				 	9:'/second/pages/form/introduce',
+				 	10:'/second/pages/product/product-list',
+				 	11:'/second/pages/form/form',
+				 	12:`/search/pages/search/search?keyWord=${pros.linkParam.keyword}`,
+				 	13:`/h5/pages/article/path?link=${pros.link}`,
+				 	14:`/h5/pages/article/path?link=${pros.link}`,
+				 	15:`/h5/pages/article/path?link=${pros.link}`,
+				 	17:'/pages/login/register-select',
+				 	18:`/h5/pages/article/path?link=${pros.link}`,
+				 	19:`/search/pages/search/search-supplier?keyWord=${pros.linkParam.keyword}`,
+					21:'/h5/pages/activity/meobohui'
+					
+				}
+				const url = typeMap[pros.linkType]
+				uni.navigateTo({
+				  	url:url
+				})
+			}
+		}
+	},
+	BannerNavigateTo:function(linkType,linkId,linkHref,keyword){//楼层跳转判断
+		if(linkType){
+			const typeMap = {
+				1:`/pages/goods/goods-instrument?linkId=${linkId}`,
+				2:`/pages/goods/instrument-details?id=${linkId}`,
+				4:`/h5/pages/activity/activity?id=${linkId}`,
+				5:`/pages/goods/product?id=${linkId}`,
+				7:`/supplier/pages/user/my-shop?shopId=${linkId}`,
+				8:'/h5/pages/activity/activity-list',
+				9:'/second/pages/form/introduce',
+				10:'/second/pages/product/product-list',
+				11:'/second/pages/form/form',
+				12:`/search/pages/search/search?keyWord=${keyword}`,
+				13:`/h5/pages/article/path?link=${linkHref}`,
+				14:`/h5/pages/article/path?link=${linkHref}`,
+				15:`/h5/pages/article/path?link=${linkHref}`,
+				17:'/pages/login/register-select',
+				18:`/h5/pages/article/path?link=${linkHref}`,
+				19:`/search/pages/search/search-supplier?keyWord=${keyword}`,
+				21:'/h5/pages/activity/meobohui'
+			}
+			const url = typeMap[linkType]
+			uni.navigateTo({
+			 	url:url
+			})
+		}
+	},
+	navigateTo:function(url){
+		//路由跳转:页面之间路由跳转
+		uni.navigateTo({
+			url:url
+		})
+	},
+	redirectTo:function(url){
+	//路由跳转:关闭当前页跳转到新页面	
+		uni.redirectTo({
+			url:url
+		})
+	},
+	switchTabTo:function(url){
+	//路由跳转:底部 tab页
+		uni.switchTab({
+			url:url
+		})
+	},
+	isNumber:function(value){//验证是否为数字
+	    var patrn = /^(-)?\d+(\.\d+)?$/
+	    if (patrn.exec(value) == null || value == '') {
+	         return false
+	    } else {
+	         return true  
+		}	 
+	},
+	getWindowHeight:function(){
+		// 获取窗口高度
+		const {windowHeight, pixelRatio} = wx.getSystemInfoSync()
+		return windowHeight
+	},
+	adaptRichTextImg:function(res){
+		/**
+		 *@富文本实现图片自适应
+		 *@style再添加自适应样式
+		 */ 
+		const html = res.replace(/<img[^>]*>/gi,function(match,capture){			
+			let match1 = match.replace(/<img*/gi, '<img style="width:100% !important;height:auto !important;float:left !important;"'),
+				results = match1.replace(/style=/gi, 'style="width:100%;height:auto;float:left;"')
+			return results
+		})
+		return html	
+	},
+	FormatMoney:function(num){
+		// 金额千分位
+		return num.toString().replace(/\d+/, function (n) { // 先提取整数部分
+			return n.replace(/(\d)(?=(\d{3})+$)/g, function ($1) { // 对整数部分添加分隔符
+				return $1 + ','
+			})
+		})
+	},
+	formatDate:function(){
+		//获取当前时间
+		let date = new Date()
+		let y = date.getFullYear()
+		let MM = date.getMonth() + 1
+		MM = MM < 10 ? ('0' + MM) : MM
+		let d = date.getDate()
+		d = d < 10 ? ('0' + d) : d
+		let h = date.getHours()
+		h = h < 10 ? ('0' + h) : h
+		let m = date.getMinutes()
+		m = m < 10 ? ('0' + m) : m
+		let s = date.getSeconds()
+		s = s < 10 ? ('0' + s) : s
+	    return y + '-' + MM + '-' + d + ' ' + h + ':' + m + ':' + s
+	},
+	regexSets:function() {
+		let sets = {
+			'companyName': /^[\u4e00-\u9fa5\(\)()\s\da-zA-Z&]{2,50}$/gi,
+			'phoneAndTelephone': /^([1]\d{10}|([\((]?0[0-9]{2,3}[)\)]?[-]?)?([2-9][0-9]{6,7})+(\-[0-9]{1,4})?)$/,
+			'bankNum': /^([1-9]{1})(\d{18})$/,
+			'invalidChar': /^[\s\u4e00-\u9fa5a-z0-9_-]{0,}$/
+		}
+		return sets
+	},
+	timestampToTime:function(timestamp) {
+		// 时间戳转日期
+	   let date = new Date(timestamp * 1000)//时间戳为10位需*1000,时间戳为13位的话不需乘1000
+	   let Y = date.getFullYear() + '-'
+	   let M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1) : date.getMonth()+1) + '-'
+	   let D = (date.getDate() < 10 ? '0'+date.getDate() : date.getDate()) + ' '
+	   let h = (date.getHours() < 10 ? '0'+date.getHours() : date.getHours()) + ':'
+	   let m = (date.getMinutes() < 10 ? '0'+date.getMinutes() : date.getMinutes()) + ':'
+	   let s = (date.getSeconds() < 10 ? '0'+date.getSeconds() : date.getSeconds())
+	   return `${Y}${M}${D}${h}${m}${s}`
+	}
+}
+
+/**
+ *@导出
+ */ 
+module.exports = {
+	get: caimeiApi.get,
+	post: caimeiApi.post,
+	lodingGet: caimeiApi.lodingGet,
+	isNumber: caimeiApi.isNumber,
+	FormatMoney: caimeiApi.FormatMoney,
+	navigateTo: caimeiApi.navigateTo,
+	redirectTo: caimeiApi.redirectTo,
+	switchTabTo: caimeiApi.switchTabTo,
+	formatDate: caimeiApi.formatDate,
+	loginStatus: caimeiApi.loginStatus,
+	setStorage: caimeiApi.setStorage,
+	getStorage: caimeiApi.getStorage,
+	getComStorage: caimeiApi.getComStorage,
+	navToListPage: caimeiApi.navToListPage,
+	navigateToGoods: caimeiApi.navigateToGoods,
+	getWindowHeight: caimeiApi.getWindowHeight,
+	adaptRichTextImg: caimeiApi.adaptRichTextImg,
+	getStorageAddressKey: caimeiApi.getStorageAddressKey,
+	regexSets: caimeiApi.regexSets,
+	timestampToTime: caimeiApi.timestampToTime,
+	BannerNavigateTo:caimeiApi.BannerNavigateTo,
+	FlooryNavigateTo:caimeiApi.FlooryNavigateTo 
+}

+ 61 - 0
common/config/wxLogin.js

@@ -0,0 +1,61 @@
+import store from '@/store/index.js'
+import authorize from '@/common/config/authorize.js'
+import {
+	userInfoLogin
+} from '@/services/user.service.js'
+// 根据微信的code获取用户登录状态:1已登录过 -1未登录过
+const wxLoginAuthorize = function() {
+	authorize.getCode('weixin').then(wechatcode => {
+		console.log('code:' + wechatcode)
+		authorize.getUserInfo('weixin').then(wxResponse => {
+			userInfoLogin({
+				code: wechatcode
+			}).then(response => {
+				store.commit('updateStatus', response.data)
+				store.commit('login', response.data)
+			}).catch(error => {
+				console.log(error)
+				store.commit('logout', error.data)
+				store.commit('updateStatus', error.data)
+			})
+		})
+	})
+}
+const wxLoginQuick = function() { // 根据微信的code获取用户登录状态:1已登录过 -1未登录过跳转
+	authorize.getCode('weixin').then(wechatcode => {
+		// 根据微信的code获取用户登录状态:1已登录过 -1未登录过
+		authorize.getUserInfo('weixin').then(wxResponse => {
+			userInfoLogin({
+				code: wechatcode,
+				encryptedData: wxResponse.encryptedData,
+				iv: wxResponse.iv
+			}).then(response => {
+				console.log(response)
+				store.commit('updateStatus', response.data)
+				store.commit('login', response.data)
+				store.commit('wxLogin', wxResponse.userInfo)
+				if (response.data.userIdentity == 1) {
+					uni.navigateTo({
+						url: '/seller/pages/index/index'
+					})
+				} else if (response.data.userIdentity === 3) {
+					uni.navigateTo({
+						url: '/supplier/pages/index/index'
+					})
+				} else {
+					uni.switchTab({
+						url: '/pages/tabBar/user/user'
+					})
+				}
+			}).catch(error => {
+				store.commit('logout', error.data)
+				store.commit('updateStatus', error.data)
+				store.commit('wxLogin', wxResponse.userInfo)
+			})
+		})
+	})
+}
+export default {
+	wxLoginAuthorize,
+	wxLoginQuick
+}

+ 365 - 0
common/css/common.scss

@@ -0,0 +1,365 @@
+.clearfix:after {
+  content: ".";
+  display: block;
+  height: 0;
+  clear: both;
+  visibility: hidden;
+}
+.container{
+	width: 100%;
+	height: 100%;
+}
+/*android一像素兼容*/
+::-webkit-scrollbar{
+	width: 0;
+	height: 0;
+	color: transparent;
+	display:none;
+}
+button {
+	display: block;
+	margin-left: auto;
+	margin-right: auto;
+	padding-left: 0;
+	padding-right: 0;
+	box-sizing: border-box;
+	font-size: $font-size-28;
+	text-align: center;
+	text-decoration: none;
+	line-height: 36rpx;
+	border-radius: 0;
+	-webkit-tap-highlight-color: transparent;
+	overflow: hidden;
+	color: $text-color;
+	background-color: #FFFFFF;
+}
+
+button::after{
+    border: none;
+    border-radius:  0;
+}
+/*输入框样式*/ 
+.text-input{
+	display: flex;
+	align-items: center;
+	position: relative;
+	width: 654rpx;
+	height: 40rpx;
+	padding: 24rpx;
+	margin: 0 auto;
+	background: #F7F7F7;
+	.input{
+		width: 100%;
+		height: 100%;
+		background: #F7F7F7;
+		font-size: $font-size-28;
+		line-height: 40rpx;
+		color: #333333;
+	}
+	&.b-b{
+		margin: 32rpx 0;
+	}
+}
+/*空列表显示样式*/ 
+.empty-container {
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	flex-direction: column;
+	position: fixed;
+	left: 0;
+	top: 0;
+	right: 0;
+	bottom: 0;
+	background: $bg-color;
+	// padding-bottom: 120rpx;
+	border-top: 1px solid #EBEBEB;
+	.club-empty-image{
+		width: 200rpx;
+		height: 200rpx;
+		margin-bottom: 20rpx;
+	}
+	&-image {
+		width: 200rpx;
+		height: 200rpx;
+		margin-bottom: 10rpx;
+		margin-top: -120rpx;
+	}
+	.error-text{
+		font-size: $font-size-28;
+		color: #999999;
+		line-height: 88rpx;
+	}
+	.txt{
+		font-size: $font-size-28;
+		color: #999999;
+		line-height: 44rpx;
+	}
+	.login-btn{
+		width: 600rpx;
+		height: 88rpx;
+		font-size: $font-size-28;
+		line-height: 88rpx;
+		color: #FFFFFF;
+		margin: 0 auto;
+		text-align: center;
+		background: $btn-confirm;
+		border-radius: 44rpx;
+		margin-top: 40rpx;
+	}
+}
+/*弹窗*/
+ .model-warp.none{
+	 display: none;
+ }
+ .model-warp.show{
+	 display: block;
+ }
+ .model-warp{
+	width: 100%;
+	height: 100%;
+	background: rgba(0,0,0,.5);
+	position: fixed;
+	top: 0;
+	left: 0;
+	z-index: 8888;
+	transition: all 0.4s;
+	&.none{
+		display: none;			
+	}
+	&.show{
+		display: block;
+	}
+	.model-alert{
+		width: 518rpx;
+		height: 280rpx;
+		position: absolute;
+		background: $bg-color;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		top: 0;
+		margin: auto;
+		border-radius: 20rpx;
+		.alert-content{
+			width: 466rpx;
+			height: 100rpx;
+			padding: 40rpx 26rpx;
+			.t-h1,.t-p{
+				font-size: $font-size-28;
+				line-height: 40rpx;
+				color: #333333;
+				text-align:justify;
+				padding: 10rpx;
+			}
+			.t-h1{
+				border-bottom: 1px solid $border-color;
+			}
+		}
+		.model-content{
+			width: 466rpx;
+			height: 152rpx;
+			padding: 40rpx 26rpx;	
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+			.sm{
+				display: flex;
+				flex: 1;
+				line-height: 152rpx;
+				flex-direction: column;
+				align-items: center;
+				text-align: center;
+				font-size: $font-size-28;
+				color: #333333;
+			}
+		}
+		.alert-btn{
+			width: 80%;
+			height: 70rpx;
+			display: flex;
+			margin: 0 auto;
+			.btn{
+				flex: 1;
+				line-height: 70rpx;
+				font-size: $font-size-28;
+				text-align: center;
+				color: #FFFFFF;
+				border-radius: 10rpx;
+				padding: 0;
+				margin: 0 15rpx;
+				&.btn-cancel{
+					background: $btn-cancel;
+				}
+				&.btn-confirm{
+					background: $btn-confirm;
+				}
+			}
+		}
+	}
+}
+/*
+ *上滑加载更多
+ */ 
+.load-more {
+    font-size: $font-size-24;
+    color: #666;
+    text-align: center;
+    width: 100%;
+}
+/*底部loading*/
+.loading-wrapper {
+	width: 100%;
+	height: 60rpx;
+	padding: 25rpx 0;
+	color: #333;
+	font-size: 24rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+}
+.loading-wrapper-now text {
+	margin-left: 6rpx;
+	font-weight: bold;
+}
+.loading-wrapper-btm {
+	color: #eee;
+	.btm-text {
+		color: #333;
+		padding: 0 10rpx;
+	}
+}
+/*富文本样式调整*/
+.product-rich-text{
+	rich-text.h4,rich-text.p,rich-text.h2{
+		padding: 0 24rpx;
+	}
+}
+.rich-text-temp {
+	rich-text.div, rich-text.h4, rich-text.p {
+		line-height: 58rpx;
+	}
+	rich-text.h4, rich-text.p {
+		font-size: 30rpx;
+	}
+	rich-text.div {
+		margin-bottom: 30rpx;
+		font-size: 28rpx;
+	}
+	rich-text.img {
+		width: 100%;
+		height: auto;
+	}
+}
+.form-item {
+	display: flex;
+	color: $text-color;
+	margin-top: 74rpx;
+	font-size: 26rpx;
+	.asterisk {
+		color: #FF2A2A;
+		margin-right: 10rpx;
+	}
+}
+
+// 表单提交button
+.submit-btn {
+	position: fixed;
+	left: 24rpx;
+	right: 24rpx;
+	bottom: 34rpx;
+	z-index: 95;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	width: 702rpx;
+	height: 88rpx;
+	font-size: $font-size-28;
+	line-height: 88rpx;
+	color: #FFFFFF;
+	text-align: center;
+	background: $btn-confirm;
+	border-radius: 44rpx;
+}
+// 小红点
+.uni-badge--small {
+	-webkit-transform: scale(.8);
+	-ms-transform: scale(.8);
+	transform: scale(.8);
+	-webkit-transform-origin: center center;
+	-ms-transform-origin: center center;
+	transform-origin: center center;
+}
+.uni-badge {
+	font-family: 'Helvetica Neue', Helvetica, sans-serif;
+	-webkit-box-sizing: border-box;
+	box-sizing: border-box;
+	font-size: 12px;
+	line-height: 1;
+	display: inline-block;
+	padding: 3px 6px;
+	color: #333;
+	border-radius: 100px;
+	background-color: #f1f1f1;
+}
+.uni-badge-error {
+	color: #fff;
+	background-color: #dd524d;
+}
+/* 加入购物模态层*/
+	@keyframes showPopup {
+		0% {
+			opacity: 0;
+		}
+		100% {
+			opacity: 1;
+		}
+	}
+	@keyframes hidePopup {
+		0% {
+			opacity: 1;
+		}
+		100% {
+			opacity: 0;
+		}
+	}
+	@keyframes showLayer {
+		0% {
+			transform: translateY(0);
+		}
+		100% {
+			transform: translateY(-100%);
+		}
+	}
+	@keyframes hideLayer {
+		0% {
+			transform: translateY(-100%);
+		}
+		100% {
+			transform: translateY(0);
+		}
+	}
+	@keyframes showAmnation {
+		0% {
+			top: -12rpx;
+			opacity: 0;
+		}
+		50% {
+			top: -60rpx;
+			opacity: 1;
+		}
+		100% {
+			top: -100rpx;
+			opacity: 0;
+		}
+	}
+	@keyframes hideAmnation {
+		0% {
+			top: -100rpx;
+			opacity: 0;
+		}
+		100% {
+			top: -12rpx;
+			opacity: 0;
+		}
+	}

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 3 - 0
common/css/iconfont.scss


تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 2 - 0
common/css/style/icon.css


+ 2480 - 0
common/css/style/thorui.css

@@ -0,0 +1,2480 @@
+/* Thor UI 基础组件 样式*/
+
+/*!
+ * =====================================================
+ * Thor UI v1.5.0 (https://www.thorui.cn/)
+ * =====================================================
+ */
+.tui-mask {
+	width: 100%;
+	height: 100%;
+	position: fixed;
+	top: 0;
+	left: 0;
+	background: rgba(0, 0, 0, 0.4);
+	z-index: 999;
+}
+
+.tui-ellipsis {
+	overflow: hidden;
+	white-space: nowrap;
+	text-overflow: ellipsis;
+}
+
+.tui-ellipsis-2 {
+	display: -webkit-box;
+	overflow: hidden;
+	white-space: normal !important;
+	text-overflow: ellipsis;
+	word-wrap: break-word;
+	-webkit-line-clamp: 2;
+	-webkit-box-orient: vertical;
+}
+
+.tui-opcity {
+	opacity: 0.5;
+}
+
+.tui-scale-small {
+	transform: scale(0.9);
+	transform-origin: center center;
+}
+
+.tui-height-full {
+	height: 100%;
+}
+
+.tui-width-full {
+	width: 100%;
+}
+
+.tui-ptop-zero {
+	padding-top: 0;
+}
+
+.tui-pbottom-zero {
+	padding-bottom: 0;
+}
+
+.tui-pleft-zero {
+	padding-left: 0;
+}
+
+.tui-pright-zero {
+	padding-right: 0;
+}
+
+
+/* color start*/
+
+.tui-color-primary {
+	color: #5677fc;
+}
+
+.tui-color-success {
+	color: #19be6b;
+}
+
+.tui-color-warning {
+	color: #ff7900;
+}
+
+.tui-color-error {
+	color: #EB0909;
+}
+
+.tui-color-blue {
+	color: #007AFF;
+}
+
+.tui-color-blue {
+	color: #007AFF;
+}
+
+.tui-color-white {
+	color: #ffffff;
+}
+
+.tui-color-pink {
+	color: #f74d54;
+}
+
+.tui-primary {
+	background-color: #5677fc !important;
+	color: #fff;
+}
+
+.tui-light-primary {
+	background-color: #5c8dff !important;
+	color: #fff;
+}
+
+.tui-dark-primary {
+	background-color: #4a67d6 !important;
+	color: #fff;
+}
+
+.tui-dLight-primary {
+	background-color: #4e77d9 !important;
+	color: #fff;
+}
+
+.tui-danger {
+	background-color: #ff0000 !important;
+	color: #fff;
+}
+
+.tui-warning {
+	background-color: #ff7900 !important;
+	color: #fff;
+}
+
+.tui-blue {
+	background-color: #007AFF !important;
+	color: #fff;
+}
+
+.tui-green {
+	background-color: #19be6b !important;
+	color: #fff;
+}
+
+.tui-black {
+	background-color: #000 !important;
+	color: #fff;
+}
+
+.tui-white {
+	background-color: #fff !important;
+	color: #333 !important;
+}
+
+.tui-translucent {
+	background-color: rgba(0, 0, 0, 0.7);
+}
+
+.tui-light-black {
+	background-color: #333 !important;
+}
+
+.tui-gray {
+	background-color: #80848f;
+}
+
+.tui-phcolor-gray {
+	background-color: #ccc !important;
+}
+
+.tui-divider-gray {
+	background-color: #eaeef1 !important;
+}
+
+.tui-btn-gray {
+	background-color: #ededed !important;
+	color: #999 !important;
+}
+
+.tui-hover-gray {
+	background-color: #f7f7f9 !important;
+}
+
+.tui-bg-gray {
+	background-color: #fafafa !important;
+}
+
+.tui-light-blue {
+	background-color: #ecf6fd;
+	color: #4dabeb !important;
+}
+
+.tui-light-brownish {
+	background-color: #fcebef;
+	color: #8a5966 !important;
+}
+
+.tui-light-orange {
+	background-color: #fef5eb;
+	color: #faa851 !important;
+}
+
+.tui-light-green {
+	background-color: #e8f6e8;
+	color: #44cf85 !important;
+}
+
+/* color end*/
+
+
+/* flex start */
+
+.tui-flex {
+	display: -webkit-flex;
+	display: flex;
+}
+
+.tui-flex-1 {
+	flex: 1;
+}
+
+.tui-align-center {
+	justify-content: center;
+}
+
+.tui-align-left {
+	justify-content: flex-start !important;
+}
+
+.tui-align-right {
+	justify-content: flex-end !important;
+}
+
+.tui-align-between {
+	justify-content: space-between !important;
+}
+
+.tui-align-around {
+	justify-content: space-around !important;
+}
+
+.tui-vertical-center {
+	align-items: center;
+}
+
+.tui-vertical-top {
+	align-items: flex-start;
+}
+
+.tui-vertical-top {
+	align-items: flex-end;
+}
+
+.tui-center {
+	display: flex;
+	align-items: center;
+	justify-content: center;
+}
+
+.tui-line-feed {
+	flex-direction: row;
+	flex-wrap: wrap;
+}
+
+.tui-col-12 {
+	width: 100%;
+}
+
+.tui-col-11 {
+	width: 91.66666667%;
+}
+
+.tui-col-10 {
+	width: 83.33333333%;
+}
+
+.tui-col-9 {
+	width: 75%;
+}
+
+.tui-col-8 {
+	width: 66.66666667%;
+}
+
+.tui-col-7 {
+	width: 58.33333333%;
+}
+
+.tui-col-6 {
+	width: 50%;
+}
+
+.tui-col-5 {
+	width: 41.66666667%;
+}
+
+.tui-col-4 {
+	width: 33.33333333%;
+}
+
+.tui-col-3 {
+	width: 25%;
+}
+
+.tui-col-2 {
+	width: 16.66666667%;
+}
+
+.tui-col-1 {
+	width: 8.33333333%;
+}
+
+/* flex end */
+
+
+/* icon start */
+.tui-icon {
+	font-family: 'thoruiFont' !important;
+	font-style: normal;
+	-webkit-font-smoothing: antialiased;
+	text-align: center;
+	text-decoration: none;
+	font-size: 32px;
+	color: #999;
+}
+
+.tui-icon-about:before {
+	content: '\e772';
+}
+
+.tui-icon-about-fill:before {
+	content: '\e771';
+}
+
+.tui-icon-add:before {
+	content: '\e770';
+}
+
+.tui-icon-add-fill:before {
+	content: '\e76f';
+}
+
+.tui-icon-addmessage:before {
+	content: '\e76e';
+}
+
+.tui-icon-addressbook:before {
+	content: '\e76d';
+}
+
+.tui-icon-agree:before {
+	content: '\e76c';
+}
+
+.tui-icon-agree-fill:before {
+	content: '\e76b';
+}
+
+.tui-icon-alarm:before {
+	content: '\e76a';
+}
+
+.tui-icon-alarm-fill:before {
+	content: '\e769';
+}
+
+.tui-icon-alipay:before {
+	content: '\e768';
+}
+
+.tui-icon-android:before {
+	content: '\e767';
+}
+
+.tui-icon-applets:before {
+	content: '\e766';
+}
+
+.tui-icon-arrowdown:before {
+	content: '\e765';
+}
+
+.tui-icon-arrowleft:before {
+	content: '\e764';
+}
+
+.tui-icon-arrowright:before {
+	content: '\e763';
+}
+
+.tui-icon-arrowup:before {
+	content: '\e762';
+}
+
+.tui-icon-attestation:before {
+	content: '\e761';
+}
+
+.tui-icon-back:before {
+	content: '\e760';
+}
+
+.tui-icon-bag:before {
+	content: '\e75f';
+}
+
+.tui-icon-bag-fill:before {
+	content: '\e75e';
+}
+
+.tui-icon-balloon:before {
+	content: '\e75d';
+}
+
+.tui-icon-bankcard:before {
+	content: '\e75c';
+}
+
+.tui-icon-bankcard-fill:before {
+	content: '\e75b';
+}
+
+.tui-icon-bottom:before {
+	content: '\e75a';
+}
+
+.tui-icon-calendar:before {
+	content: '\e759';
+}
+
+.tui-icon-camera:before {
+	content: '\e758';
+}
+
+.tui-icon-camera-fill:before {
+	content: '\e757';
+}
+
+.tui-icon-camera-add:before {
+	content: '\e756';
+}
+
+.tui-icon-card:before {
+	content: '\e755';
+}
+
+.tui-icon-card-fill:before {
+	content: '\e754';
+}
+
+.tui-icon-cart:before {
+	content: '\e753';
+}
+
+.tui-icon-cart-fill:before {
+	content: '\e752';
+}
+
+.tui-icon-category:before {
+	content: '\e751';
+}
+
+.tui-icon-category-fill:before {
+	content: '\e750';
+}
+
+.tui-icon-check:before {
+	content: '\e74f';
+}
+
+.tui-icon-circle:before {
+	content: '\e74e';
+}
+
+.tui-icon-circle-fill:before {
+	content: '\e74d';
+}
+
+.tui-icon-circle-selected:before {
+	content: '\e74c';
+}
+
+.tui-icon-clock:before {
+	content: '\e74b';
+}
+
+.tui-icon-clock-fill:before {
+	content: '\e74a';
+}
+
+.tui-icon-close:before {
+	content: '\e749';
+}
+
+.tui-icon-close-fill:before {
+	content: '\e748';
+}
+
+.tui-icon-community:before {
+	content: '\e747';
+}
+
+.tui-icon-community-fill:before {
+	content: '\e746';
+}
+
+.tui-icon-computer:before {
+	content: '\e745';
+}
+
+.tui-icon-computer-fill:before {
+	content: '\e744';
+}
+
+.tui-icon-coupon:before {
+	content: '\e743';
+}
+
+.tui-icon-delete:before {
+	content: '\e742';
+}
+
+.tui-icon-deletekey:before {
+	content: '\e741';
+}
+
+.tui-icon-dingtalk:before {
+	content: '\e740';
+}
+
+.tui-icon-dissatisfied:before {
+	content: '\e73f';
+}
+
+.tui-icon-down:before {
+	content: '\e73e';
+}
+
+.tui-icon-download:before {
+	content: '\e73d';
+}
+
+.tui-icon-edit:before {
+	content: '\e73c';
+}
+
+.tui-icon-ellipsis:before {
+	content: '\e73b';
+}
+
+.tui-icon-enlarge:before {
+	content: '\e73a';
+}
+
+.tui-icon-evaluate:before {
+	content: '\e739';
+}
+
+.tui-icon-exchange:before {
+	content: '\e738';
+}
+
+.tui-icon-explain:before {
+	content: '\e737';
+}
+
+.tui-icon-explain-fill:before {
+	content: '\e736';
+}
+
+.tui-icon-explore:before {
+	content: '\e735';
+}
+
+.tui-icon-explore-fill:before {
+	content: '\e734';
+}
+
+.tui-icon-eye:before {
+	content: '\e733';
+}
+
+.tui-icon-feedback:before {
+	content: '\e732';
+}
+
+.tui-icon-fingerprint:before {
+	content: '\e730';
+}
+
+.tui-icon-friendadd:before {
+	content: '\e72f';
+}
+
+.tui-icon-friendadd-fill:before {
+	content: '\e72e';
+}
+
+.tui-icon-gps:before {
+	content: '\e72d';
+}
+
+.tui-icon-histogram:before {
+	content: '\e72c';
+}
+
+.tui-icon-home:before {
+	content: '\e72b';
+}
+
+.tui-icon-home-fill:before {
+	content: '\e72a';
+}
+
+.tui-icon-house:before {
+	content: '\e729';
+}
+
+.tui-icon-imface:before {
+	content: '\e728';
+}
+
+.tui-icon-imkeyboard:before {
+	content: '\e727';
+}
+
+.tui-icon-immore:before {
+	content: '\e726';
+}
+
+.tui-icon-imvoice:before {
+	content: '\e725';
+}
+
+.tui-icon-ios:before {
+	content: '\e724';
+}
+
+.tui-icon-kefu:before {
+	content: '\e723';
+}
+
+.tui-icon-label:before {
+	content: '\e722';
+}
+
+.tui-icon-label-fill:before {
+	content: '\e721';
+}
+
+.tui-icon-like:before {
+	content: '\e720';
+}
+
+.tui-icon-like-fill:before {
+	content: '\e71f';
+}
+
+.tui-icon-link:before {
+	content: '\e71e';
+}
+
+.tui-icon-listview:before {
+	content: '\e71d';
+}
+
+.tui-icon-loading:before {
+	content: '\e71c';
+}
+
+.tui-icon-location:before {
+	content: '\e71b';
+}
+
+.tui-icon-mail:before {
+	content: '\e71a';
+}
+
+.tui-icon-mail-fill:before {
+	content: '\e719';
+}
+
+.tui-icon-manage:before {
+	content: '\e718';
+}
+
+.tui-icon-manage-fill:before {
+	content: '\e717';
+}
+
+.tui-icon-member:before {
+	content: '\e716';
+}
+
+.tui-icon-member-fill:before {
+	content: '\e715';
+}
+
+.tui-icon-message:before {
+	content: '\e714';
+}
+
+.tui-icon-message-fill:before {
+	content: '\e713';
+}
+
+.tui-icon-mobile:before {
+	content: '\e712';
+}
+
+.tui-icon-moments:before {
+	content: '\e711';
+}
+
+.tui-icon-more:before {
+	content: '\e710';
+}
+
+.tui-icon-more-fill:before {
+	content: '\e70f';
+}
+
+.tui-icon-narrow:before {
+	content: '\e70e';
+}
+
+.tui-icon-news:before {
+	content: '\e70d';
+}
+
+.tui-icon-news-fill:before {
+	content: '\e70c';
+}
+
+.tui-icon-nodata:before {
+	content: '\e70b';
+}
+
+.tui-icon-notice:before {
+	content: '\e699';
+}
+
+.tui-icon-notice-fill:before {
+	content: '\e698';
+}
+
+.tui-icon-offline:before {
+	content: '\e697';
+}
+
+.tui-icon-offline-fill:before {
+	content: '\e696';
+}
+
+.tui-icon-oppose:before {
+	content: '\e695';
+}
+
+.tui-icon-oppose-fill:before {
+	content: '\e694';
+}
+
+.tui-icon-order:before {
+	content: '\e693';
+}
+
+.tui-icon-partake:before {
+	content: '\e692';
+}
+
+.tui-icon-people:before {
+	content: '\e691';
+}
+
+.tui-icon-people-fill:before {
+	content: '\e690';
+}
+
+.tui-icon-pic:before {
+	content: '\e68f';
+}
+
+.tui-icon-pic-fill:before {
+	content: '\e68e';
+}
+
+.tui-icon-picture:before {
+	content: '\e68d';
+}
+
+.tui-icon-pie:before {
+	content: '\e68c';
+}
+
+.tui-icon-play:before {
+	content: '\e68b';
+}
+
+.tui-icon-plus:before {
+	content: '\e689';
+}
+
+.tui-icon-polygonal:before {
+	content: '\e688';
+}
+
+.tui-icon-position:before {
+	content: '\e687';
+}
+
+.tui-icon-position-fill:before {
+	content: '\e686';
+}
+
+.tui-icon-pwd:before {
+	content: '\e685';
+}
+
+.tui-icon-qq:before {
+	content: '\e684';
+}
+
+.tui-icon-qrcode:before {
+	content: '\e682';
+}
+
+.tui-icon-redpacket:before {
+	content: '\e681';
+}
+
+.tui-icon-redpacket-fill:before {
+	content: '\e680';
+}
+
+.tui-icon-reduce:before {
+	content: '\e67f';
+}
+
+.tui-icon-refresh:before {
+	content: '\e67e';
+}
+
+.tui-icon-revoke:before {
+	content: '\e67d';
+}
+
+.tui-icon-satisfied:before {
+	content: '\e67c';
+}
+
+.tui-icon-screen:before {
+	content: '\e67b';
+}
+
+.tui-icon-search:before {
+	content: '\e67a';
+}
+
+.tui-icon-search-2:before {
+	content: '\e679';
+}
+
+.tui-icon-send:before {
+	content: '\e678';
+}
+
+.tui-icon-service:before {
+	content: '\e677';
+}
+
+.tui-icon-service-fill:before {
+	content: '\e676';
+}
+
+.tui-icon-setup:before {
+	content: '\e675';
+}
+
+.tui-icon-setup-fill:before {
+	content: '\e674';
+}
+
+.tui-icon-share:before {
+	content: '\e673';
+}
+
+.tui-icon-share-fill:before {
+	content: '\e672';
+}
+
+.tui-icon-shield:before {
+	content: '\e671';
+}
+
+.tui-icon-shop:before {
+	content: '\e670';
+}
+
+.tui-icon-shop-fill:before {
+	content: '\e66f';
+}
+
+.tui-icon-shut:before {
+	content: '\e66e';
+}
+
+.tui-icon-signin:before {
+	content: '\e66d';
+}
+
+.tui-icon-sina:before {
+	content: '\e66c';
+}
+
+.tui-icon-skin:before {
+	content: '\e66b';
+}
+
+.tui-icon-soso:before {
+	content: '\e669';
+}
+
+.tui-icon-square:before {
+	content: '\e668';
+}
+
+.tui-icon-square-fill:before {
+	content: '\e667';
+}
+
+.tui-icon-square-selected:before {
+	content: '\e666';
+}
+
+.tui-icon-star:before {
+	content: '\e665';
+}
+
+.tui-icon-star-fill:before {
+	content: '\e664';
+}
+
+.tui-icon-strategy:before {
+	content: '\e663';
+}
+
+.tui-icon-sweep:before {
+	content: '\e662';
+}
+
+.tui-icon-time:before {
+	content: '\e661';
+}
+
+.tui-icon-time-fill:before {
+	content: '\e660';
+}
+
+.tui-icon-todown:before {
+	content: '\e65f';
+}
+
+.tui-icon-toleft:before {
+	content: '\e65e';
+}
+
+.tui-icon-tool:before {
+	content: '\e65d';
+}
+
+.tui-icon-top:before {
+	content: '\e65c';
+}
+
+.tui-icon-toright:before {
+	content: '\e65b';
+}
+
+.tui-icon-towardsleft:before {
+	content: '\e65a';
+}
+
+.tui-icon-towardsright:before {
+	content: '\e659';
+}
+
+.tui-icon-towardsright-fill:before {
+	content: '\e658';
+}
+
+.tui-icon-transport:before {
+	content: '\e657';
+}
+
+.tui-icon-transport-fill:before {
+	content: '\e656';
+}
+
+.tui-icon-turningdown:before {
+	content: '\e654';
+}
+
+.tui-icon-turningleft:before {
+	content: '\e653';
+}
+
+.tui-icon-turningright:before {
+	content: '\e652';
+}
+
+.tui-icon-turningup:before {
+	content: '\e651';
+}
+
+.tui-icon-unreceive:before {
+	content: '\e650';
+}
+
+.tui-icon-unseen:before {
+	content: '\e64f';
+}
+
+.tui-icon-up:before {
+	content: '\e64e';
+}
+
+.tui-icon-upload:before {
+	content: '\e64c';
+}
+
+.tui-icon-video:before {
+	content: '\e64b';
+}
+
+.tui-icon-voice:before {
+	content: '\e649';
+}
+
+.tui-icon-voice-fill:before {
+	content: '\e648';
+}
+
+.tui-icon-voipphone:before {
+	content: '\e647';
+}
+
+.tui-icon-wallet:before {
+	content: '\e646';
+}
+
+.tui-icon-warning:before {
+	content: '\e645';
+}
+
+.tui-icon-wealth:before {
+	content: '\e644';
+}
+
+.tui-icon-wealth-fill:before {
+	content: '\e643';
+}
+
+.tui-icon-weather:before {
+	content: '\e642';
+}
+
+.tui-icon-wechat:before {
+	content: '\e641';
+}
+
+.tui-icon-wifi:before {
+	content: '\e640';
+}
+
+/* icon end */
+
+/*Button start*/
+.tui-btn-primary {
+	background: #5677fc !important;
+	color: #fff;
+}
+
+.tui-shadow-primary {
+	box-shadow: 0 10rpx 14rpx 0 rgba(86, 119, 252, 0.2);
+}
+
+.tui-btn-danger {
+	background: #eb0909 !important;
+	color: #fff;
+}
+
+.tui-shadow-danger {
+	box-shadow: 0 10rpx 14rpx 0 rgba(235, 9, 9, 0.2);
+}
+
+.tui-btn-warning {
+	background: #fc872d !important;
+	color: #fff;
+}
+
+.tui-shadow-warning {
+	box-shadow: 0 10rpx 14rpx 0 rgba(252, 135, 45, 0.2);
+}
+
+.tui-btn-green {
+	background: #35b06a !important;
+	color: #fff;
+}
+
+.tui-shadow-green {
+	box-shadow: 0 10rpx 14rpx 0 rgba(53, 176, 106, 0.2);
+}
+
+.tui-btn-blue {
+	background: #007AFF !important;
+	color: #fff;
+}
+
+.tui-shadow-blue {
+	box-shadow: 0 10rpx 14rpx 0 rgba(0, 122, 255, 0.2);
+}
+
+.tui-btn-white {
+	background: #fff !important;
+	color: #333 !important;
+}
+
+.tui-btn-gray {
+	background: #bfbfbf !important;
+	color: #fff !important;
+}
+
+.tui-btn-black {
+	background: #333 !important;
+	color: #fff !important;
+}
+
+.tui-shadow-gray {
+	box-shadow: 0 10rpx 14rpx 0 rgba(191, 191, 191, 0.2);
+}
+
+.tui-hover-gray {
+	background: #f7f7f9 !important;
+}
+
+.tui-black-hover {
+	background: #555 !important;
+	color: #e5e5e5 !important;
+}
+
+/* button start 
+ * 宽高通过覆盖样式改变
+**/
+
+.tui-btn {
+	width: 100%;
+	height: 96rpx;
+	line-height: 96rpx;
+	font-size: 32rpx;
+	position: relative;
+	border: 0 !important;
+	border-radius: 6rpx;
+	padding-left: 0;
+	padding-right: 0;
+	overflow: visible;
+}
+
+.tui-btn-base {
+	width: auto;
+	/* #ifdef MP-ALIPAY */
+	min-width: 200rpx;
+	/* #endif */
+	font-size: 30rpx;
+	height: 70rpx;
+	line-height: 70rpx;
+}
+
+.tui-btn-small {
+	width: auto;
+	/* #ifdef MP-ALIPAY */
+	min-width: 140rpx;
+	/* #endif */
+	font-size: 30rpx;
+	height: 60rpx;
+	line-height: 60rpx;
+}
+
+.tui-btn::after {
+	content: '';
+	position: absolute;
+	width: 200%;
+	height: 200%;
+	transform-origin: 0 0;
+	transform: scale(0.5, 0.5) translateZ(0);
+	box-sizing: border-box;
+	left: 0;
+	top: 0;
+	border-radius: 12rpx;
+	border: 0;
+}
+
+.tui-btn-white::after {
+	border: 1rpx solid #bfbfbf;
+}
+
+.tui-white-hover {
+	background: #e5e5e5 !important;
+	color: #2e2e2e !important;
+}
+
+.tui-dark-disabled {
+	opacity: 0.6 !important;
+	color: #fafbfc !important;
+}
+
+.tui-dark-disabled-outline {
+	opacity: 0.5 !important;
+}
+
+.tui-gray-disabled {
+	background: #f3f3f3 !important;
+	color: #919191 !important;
+	box-shadow: none;
+}
+
+.tui-outline-hover {
+	opacity: 0.5;
+}
+
+.tui-primary-hover {
+	background: #4a67d6 !important;
+	color: #e5e5e5 !important;
+}
+
+.tui-primary-outline::after {
+	border: 1rpx solid #5677fc !important;
+}
+
+.tui-primary-outline {
+	color: #5677fc !important;
+	background: transparent;
+}
+
+.tui-danger-hover {
+	background: #191919 !important;
+	color: #e5e5e5 !important;
+}
+
+.tui-danger-outline {
+	color: #191919 !important;
+	background: transparent;
+}
+
+.tui-danger-outline::after {
+	border: 1rpx solid #191919 !important;
+}
+
+.tui-warning-hover {
+	background: #d67326 !important;
+	color: #e5e5e5 !important;
+}
+
+.tui-warning-outline {
+	color: #fc872d !important;
+	background: transparent;
+}
+
+.tui-warning-outline::after {
+	border: 1px solid #fc872d !important;
+}
+
+.tui-green-hover {
+	background: #2d965a !important;
+	color: #e5e5e5 !important;
+}
+
+.tui-green-outline {
+	color: #35b06a !important;
+	background: transparent;
+}
+
+.tui-green-outline::after {
+	border: 1rpx solid #35b06a !important;
+}
+
+.tui-blue-hover {
+	background: #0062CC !important;
+	color: #e5e5e5 !important;
+}
+
+.tui-blue-outline {
+	color: #007AFF !important;
+	background: transparent;
+}
+
+.tui-blue-outline::after {
+	border: 1rpx solid #007AFF !important;
+}
+
+/* #ifndef APP-NVUE */
+.tui-btn-gradual {
+	background: linear-gradient(90deg, rgb(255, 89, 38), rgb(240, 14, 44)) !important;
+	color: #fff !important;
+}
+
+.tui-shadow-gradual {
+	box-shadow: 0 10rpx 14rpx 0 rgba(235, 9, 9, 0.15);
+}
+
+/* #endif */
+
+.tui-gray-hover {
+	background: #a3a3a3 !important;
+	color: #898989;
+}
+
+/* #ifndef APP-NVUE */
+.tui-gradual-hover {
+	background: linear-gradient(90deg, #d74620, #cd1225) !important;
+	color: #fff !important;
+}
+
+/* #endif */
+
+.tui-gray-outline {
+	color: #999 !important;
+	background: transparent !important;
+}
+
+.tui-white-outline {
+	color: #fff !important;
+	background: transparent !important;
+}
+
+.tui-black-outline {
+	background: transparent !important;
+	color: #333 !important;
+}
+
+.tui-gray-outline::after {
+	border: 1rpx solid #ccc !important;
+}
+
+.tui-white-outline::after {
+	border: 1px solid #fff !important;
+}
+
+.tui-black-outline::after {
+	border: 1px solid #333 !important;
+}
+
+/*圆角 */
+
+.tui-fillet {
+	border-radius: 50rpx;
+}
+
+.tui-btn-white.tui-fillet::after {
+	border-radius: 98rpx;
+}
+
+.tui-outline-fillet::after {
+	border-radius: 98rpx;
+}
+
+/*平角*/
+.tui-rightAngle {
+	border-radius: 0;
+}
+
+.tui-btn-white.tui-rightAngle::after {
+	border-radius: 0;
+}
+
+.tui-outline-rightAngle::after {
+	border-radius: 0;
+}
+
+/*Button end*/
+
+/*Tag start*/
+
+.tui-tag {
+	padding: 16rpx 26rpx;
+	font-size: 28rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	border-radius: 6rpx;
+}
+
+.tui-tag-outline {
+	position: relative;
+	background-color: none;
+	color: #5677fc;
+}
+
+.tui-tag-outline::after {
+	content: '';
+	position: absolute;
+	width: 200%;
+	height: 200%;
+	-webkit-transform-origin: 0 0;
+	transform-origin: 0 0;
+	-webkit-transform: scale(0.5, 0.5);
+	transform: scale(0.5, 0.5);
+	-webkit-box-sizing: border-box;
+	box-sizing: border-box;
+	left: 0;
+	top: 0;
+	border-radius: 12rpx;
+}
+
+.tui-tag-fillet {
+	border-radius: 50rpx;
+}
+
+.tui-white.tui-tag-fillet::after {
+	border-radius: 80rpx;
+}
+
+.tui-tag-outline-fillet::after {
+	border-radius: 80rpx;
+}
+
+.tui-tag-fillet-left {
+	border-radius: 50rpx 0 0 50rpx;
+}
+
+.tui-tag-fillet-right {
+	border-radius: 0 50rpx 50rpx 0;
+}
+
+.tui-tag-fillet-left.tui-tag-outline::after {
+	border-radius: 100rpx 0 0 100rpx;
+}
+
+.tui-tag-fillet-right.tui-tag-outline::after {
+	border-radius: 0 100rpx 100rpx 0;
+}
+
+/*Tag end*/
+
+/*Badge start*/
+.tui-badge-dot {
+	height: 16rpx;
+	width: 16rpx;
+	border-radius: 50%;
+}
+
+.tui-badge {
+	font-size: 24rpx;
+	height: 36rpx;
+	min-width: 12rpx;
+	padding: 0 12rpx;
+	border-radius: 36rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	z-index: 10;
+}
+
+.tui-badge-scale {
+	transform-origin: center center;
+}
+
+/*Badge end*/
+
+/*List start*/
+.tui-list-cell {
+	position: relative;
+	width: 100%;
+	padding: 26rpx 30rpx;
+	background-color: #fff;
+	box-sizing: border-box;
+}
+
+.tui-list-radius {
+	border-radius: 6rpx;
+	overflow: hidden;
+}
+
+.tui-cell-hover {
+	background-color: #f1f1f1 !important;
+}
+
+.tui-list-cell::after {
+	content: '';
+	position: absolute;
+	border-bottom: 1rpx solid #eaeef1;
+	-webkit-transform: scaleY(0.5) translateZ(0);
+	transform: scaleY(0.5) translateZ(0);
+	transform-origin: 0 100%;
+	bottom: 0;
+	right: 0;
+	left: 0;
+}
+
+.tui-line-left::after {
+	left: 30rpx !important;
+}
+
+.tui-line-right::after {
+	right: 30rpx !important;
+}
+
+.tui-cell-unlined::after {
+	border-bottom: 0 !important;
+}
+
+.tui-cell-arrow::before {
+	content: ' ';
+	height: 10px;
+	width: 10px;
+	border-width: 2px 2px 0 0;
+	border-color: #c0c0c0;
+	border-style: solid;
+	-webkit-transform: matrix(0.5, 0.5, -0.5, 0.5, 0, 0);
+	transform: matrix(0.5, 0.5, -0.5, 0.5, 0, 0);
+	position: absolute;
+	top: 50%;
+	margin-top: -6px;
+	right: 30rpx;
+}
+
+.tui-arrow-right::before {
+	right: 0 !important;
+}
+
+.tui-arrow-gray::before {
+	border-color: #666666 !important;
+}
+
+.tui-arrow-white::before {
+	border-color: #ffffff !important;
+}
+
+.tui-arrow-warning::before {
+	border-color: #ff7900 !important;
+}
+
+.tui-arrow-success::before {
+	border-color: #19be6b !important;
+}
+
+.tui-arrow-danger::before {
+	border-color: #eb0909 !important;
+}
+
+/*List end*/
+
+/*Card start*/
+.tui-card {
+	margin: 0 30rpx;
+	font-size: 28rpx;
+	background-color: #fff;
+	border-radius: 10rpx;
+	box-shadow: 0 0 10rpx #eee;
+	box-sizing: border-box;
+	overflow: hidden;
+}
+
+.tui-card-full {
+	margin: 0 !important;
+	border-radius: 0 !important;
+}
+
+.tui-card-full::after {
+	border-radius: 0 !important;
+}
+
+.tui-card-border {
+	position: relative;
+	box-shadow: none !important
+}
+
+.tui-card-border::after {
+	content: ' ';
+	position: absolute;
+	height: 200%;
+	width: 200%;
+	border: 1px solid #ddd;
+	transform-origin: 0 0;
+	-webkit-transform-origin: 0 0;
+	-webkit-transform: scale(0.5);
+	transform: scale(0.5);
+	left: 0;
+	top: 0;
+	border-radius: 20rpx;
+	box-sizing: border-box;
+	pointer-events: none;
+}
+
+.tui-card-header {
+	width: 100%;
+	padding: 20rpx;
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	position: relative;
+	box-sizing: border-box;
+	overflow: hidden;
+	border-top-left-radius: 10rpx;
+	border-top-right-radius: 10rpx;
+}
+
+.tui-card-header::after {
+	content: '';
+	position: absolute;
+	border-bottom: 1rpx solid #eaeef1;
+	-webkit-transform: scaleY(0.5);
+	transform: scaleY(0.5);
+	bottom: 0;
+	right: 0;
+	left: 0;
+	pointer-events: none;
+}
+
+.tui-header-line::after {
+	border-bottom: 0 !important;
+}
+
+.tui-header-thumb {
+	height: 60rpx;
+	width: 60rpx;
+	vertical-align: middle;
+	margin-right: 20rpx;
+	border-radius: 6rpx;
+}
+
+.tui-thumb-circle {
+	border-radius: 50% !important;
+}
+
+.tui-header-title {
+	display: inline-block;
+	font-size: 30rpx;
+	color: #7a7a7a;
+	vertical-align: middle;
+	max-width: 460rpx;
+	overflow: hidden;
+	white-space: nowrap;
+	text-overflow: ellipsis;
+}
+
+.tui-header-right {
+	font-size: 24rpx;
+	color: #b2b2b2;
+}
+
+.tui-card-body {
+	font-size: 32rpx;
+	color: #262b3a;
+	box-sizing: border-box;
+}
+
+.tui-card-footer {
+	font-size: 28rpx;
+	color: #596d96;
+	border-bottom-left-radius: 10rpx;
+	border-bottom-right-radius: 10rpx;
+	box-sizing: border-box;
+}
+
+/*Card end*/
+
+/*Grid start*/
+.tui-grids {
+	width: 100%;
+	position: relative;
+	overflow: hidden;
+}
+
+.tui-grids::after {
+	content: " ";
+	position: absolute;
+	left: 0;
+	top: 0;
+	width: 100%;
+	height: 1px;
+	border-top: 1px solid #eaeef1;
+	-webkit-transform-origin: 0 0;
+	transform-origin: 0 0;
+	-webkit-transform: scaleY(0.5);
+	transform: scaleY(0.5);
+}
+
+.tui-border-top::after {
+	border-top: 0 !important;
+}
+
+.tui-grid {
+	position: relative;
+	padding: 40rpx 20rpx;
+	box-sizing: border-box;
+	background: #fff;
+	float: left;
+}
+
+.tui-grid-2 {
+	width: 50%;
+}
+
+.tui-grid-3 {
+	width: 33.333333333%;
+}
+
+.tui-grid-4 {
+	width: 25%;
+	padding: 30rpx 20rpx !important;
+}
+
+.tui-grid-5 {
+	width: 20%;
+	padding: 20rpx !important;
+}
+
+.tui-grid-2:nth-of-type(2n)::before {
+	width: 0;
+	border-right: 0;
+}
+
+.tui-grid-3:nth-of-type(3n)::before {
+	width: 0;
+	border-right: 0;
+}
+
+.tui-grid-4:nth-of-type(4n)::before {
+	width: 0;
+	border-right: 0;
+}
+
+.tui-grid-5:nth-of-type(5n)::before {
+	width: 0;
+	border-right: 0;
+}
+
+.tui-grid::before {
+	content: " ";
+	position: absolute;
+	right: 0;
+	top: 0;
+	width: 1px;
+	bottom: 0;
+	border-right: 1px solid #eaeef1;
+	-webkit-transform-origin: 100% 0;
+	transform-origin: 100% 0;
+	-webkit-transform: scaleX(0.5);
+	transform: scaleX(0.5);
+}
+
+.tui-grid::after {
+	content: " ";
+	position: absolute;
+	left: 0;
+	bottom: 0;
+	right: 0;
+	height: 1px;
+	border-bottom: 1px solid #eaeef1;
+	-webkit-transform-origin: 0 100%;
+	transform-origin: 0 100%;
+	-webkit-transform: scaleY(0.5);
+	transform: scaleY(0.5);
+}
+
+.tui-grid-bottom::after {
+	height: 0 !important;
+	border-bottom: 0 !important
+}
+
+.tui-grid-bg {
+	position: relative;
+	padding: 0;
+	width: 100%;
+	box-sizing: border-box;
+}
+
+.tui-item-hover {
+	background-color: #f7f7f9 !important;
+}
+
+/*Grid end*/
+
+/*Loading start*/
+.tui-loading-init {
+	min-width: 200rpx;
+	min-height: 200rpx;
+	max-width: 500rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	flex-direction: column;
+	position: fixed;
+	top: 50%;
+	left: 50%;
+	transform: translate(-50%, -50%);
+	z-index: 9999;
+	font-size: 26rpx;
+	color: #fff;
+	background-color: rgba(0, 0, 0, 0.7);
+	border-radius: 10rpx;
+}
+
+.tui-loading-center {
+	width: 50rpx;
+	height: 50rpx;
+	border: 3px solid #fff;
+	border-radius: 50%;
+	margin: 0 6px;
+	display: inline-block;
+	vertical-align: middle;
+	clip-path: polygon(0% 0%, 100% 0%, 100% 40%, 0% 40%);
+	animation: rotate 1s linear infinite;
+	margin-bottom: 36rpx;
+}
+
+.tui-loadmore-tips {
+	text-align: center;
+	padding: 0 20rpx;
+	box-sizing: border-box;
+}
+
+@-webkit-keyframes rotate {
+	from {
+		transform: rotatez(0deg);
+	}
+
+	to {
+		transform: rotatez(360deg);
+	}
+}
+
+@keyframes rotate {
+	from {
+		transform: rotatez(0deg);
+	}
+
+	to {
+		transform: rotatez(360deg);
+	}
+}
+
+.tui-loadmore {
+	width: 48%;
+	margin: 1.5em auto;
+	line-height: 1.5em;
+	font-size: 24rpx;
+	text-align: center;
+}
+
+.tui-loading-1 {
+	margin: 0 5px;
+	width: 20px;
+	height: 20px;
+	display: inline-block;
+	vertical-align: middle;
+	-webkit-animation: a 1s steps(12) infinite;
+	animation: a 1s steps(12) infinite;
+	background: transparent url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjAiIGhlaWdodD0iMTIwIiB2aWV3Qm94PSIwIDAgMTAwIDEwMCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgxMDB2MTAwSDB6Ii8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTlFOUU5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTMwKSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iIzk4OTY5NyIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgzMCAxMDUuOTggNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjOUI5OTlBIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDYwIDc1Ljk4IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0EzQTFBMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSg5MCA2NSA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNBQkE5QUEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoMTIwIDU4LjY2IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0IyQjJCMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgxNTAgNTQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjQkFCOEI5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDE4MCA1MCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDMkMwQzEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTE1MCA0NS45OCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDQkNCQ0IiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTEyMCA0MS4zNCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNEMkQyRDIiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTkwIDM1IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0RBREFEQSIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgtNjAgMjQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTJFMkUyIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKC0zMCAtNS45OCA2NSkiLz48L3N2Zz4=) no-repeat;
+	background-size: 100%;
+}
+
+@-webkit-keyframes a {
+	0% {
+		-webkit-transform: rotate(0deg);
+		transform: rotate(0deg);
+	}
+
+	to {
+		-webkit-transform: rotate(1turn);
+		transform: rotate(1turn);
+	}
+}
+
+@keyframes a {
+	0% {
+		-webkit-transform: rotate(0deg);
+		transform: rotate(0deg);
+	}
+
+	to {
+		-webkit-transform: rotate(1turn);
+		transform: rotate(1turn);
+	}
+}
+
+.tui-loadmore-tips {
+	display: inline-block;
+	vertical-align: middle;
+}
+
+.tui-loading-2 {
+	width: 28rpx;
+	height: 28rpx;
+	border: 1px solid #8f8d8e;
+	border-radius: 50%;
+	margin: 0 6px;
+	display: inline-block;
+	vertical-align: middle;
+	clip-path: polygon(0% 0%, 100% 0%, 100% 30%, 0% 30%);
+	animation: rotate 1s linear infinite;
+}
+
+@-webkit-keyframes rotate {
+	from {
+		transform: rotatez(0deg);
+	}
+
+	to {
+		transform: rotatez(360deg);
+	}
+}
+
+@keyframes rotate {
+	from {
+		transform: rotatez(0deg);
+	}
+
+	to {
+		transform: rotatez(360deg);
+	}
+}
+
+.tui-loading-3 {
+	display: inline-block;
+	margin: 0 6px;
+	vertical-align: middle;
+	width: 28rpx;
+	height: 28rpx;
+	background: 0 0;
+	border-radius: 50%;
+	border: 2px solid;
+	border-color: #e5e5e5 #e5e5e5 #e5e5e5 #8f8d8e;
+	animation: tui-rotate 0.7s linear infinite;
+}
+
+.tui-loading-3.tui-loading-primary {
+	border-color: #e5e5e5 #e5e5e5 #e5e5e5 #5677fc;
+}
+
+.tui-loading-3.tui-loading-green {
+	border-color: #e5e5e5 #e5e5e5 #e5e5e5 #19be6b;
+}
+
+.tui-loading-3.tui-loading-orange {
+	border-color: #e5e5e5 #e5e5e5 #e5e5e5 #ff7900;
+}
+
+.tui-loading-3.tui-loading-red {
+	border-color: #ededed #ededed #ededed #ed3f14;
+}
+
+@-webkit-keyframes tui-rotate {
+	0% {
+		transform: rotate(0);
+	}
+
+	100% {
+		transform: rotate(360deg);
+	}
+}
+
+@keyframes tui-rotate {
+	0% {
+		transform: rotate(0);
+	}
+
+	100% {
+		transform: rotate(360deg);
+	}
+}
+
+.tui-loadmore-none {
+	width: 50%;
+	margin: 1.5em auto;
+	line-height: 1.5em;
+	font-size: 24rpx;
+	display: flex;
+	justify-content: center;
+}
+
+.tui-nomore {
+	width: 100%;
+	height: 100%;
+	position: relative;
+	display: flex;
+	justify-content: center;
+	margin-top: 10rpx;
+	padding-bottom: 6rpx;
+}
+
+.tui-nomore::before {
+	content: ' ';
+	position: absolute;
+	border-bottom: 1rpx solid #e5e5e5;
+	-webkit-transform: scaleY(0.5);
+	transform: scaleY(0.5);
+	width: 100%;
+	top: 18rpx;
+	left: 0;
+}
+
+.tui-nomore-text {
+	color: #999;
+	font-size: 24rpx;
+	text-align: center;
+	padding: 0 18rpx;
+	height: 36rpx;
+	line-height: 36rpx;
+	position: relative;
+	z-index: 1;
+}
+
+.tui-nomore-dot {
+	position: relative;
+	text-align: center;
+	-webkit-display: flex;
+	display: flex;
+	-webkit-justify-content: center;
+	justify-content: center;
+	margin-top: 10rpx;
+	padding-bottom: 6rpx;
+}
+
+.tui-nomore-dot::before {
+	content: '';
+	position: absolute;
+	border-bottom: 1rpx solid #e5e5e5;
+	-webkit-transform: scaleY(0.5);
+	transform: scaleY(0.5);
+	width: 360rpx;
+	top: 18rpx;
+}
+
+.tui-dot-text {
+	position: relative;
+	color: #e5e5e5;
+	font-size: 10px;
+	text-align: center;
+	width: 50rpx;
+	height: 36rpx;
+	line-height: 36rpx;
+	-webkit-transform: scale(0.8);
+	transform: scale(0.8);
+	-webkit-transform-origin: center center;
+	transform-origin: center center;
+	z-index: 1;
+}
+
+/*Loading end*/
+
+/*Footer start*/
+.tui-footer {
+	width: 100%;
+	overflow: hidden;
+	padding: 30rpx 24rpx;
+	box-sizing: border-box;
+	font-size: 24rpx;
+	color: #A7A7A7;
+}
+
+.tui-fixed {
+	position: fixed;
+	z-index: 9999;
+	/* #ifdef H5 */
+	bottom: 0;
+	/* #endif */
+	/* #ifndef H5 */
+	bottom: env(safe-area-inset-bottom);
+	/* #endif */
+}
+
+.tui-footer-link {
+	color: #596d96;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	font-size: 28rpx;
+}
+
+.tui-link {
+	position: relative;
+	padding: 0 18rpx;
+	line-height: 1;
+}
+
+.tui-link::before {
+	content: " ";
+	position: absolute;
+	right: 0;
+	top: 0;
+	width: 1px;
+	bottom: 0;
+	border-right: 1px solid #d3d3d3;
+	-webkit-transform-origin: 100% 0;
+	transform-origin: 100% 0;
+	-webkit-transform: scaleX(0.5);
+	transform: scaleX(0.5);
+}
+
+.tui-link:last-child::before {
+	border-right: 0 !important
+}
+
+.tui-link-hover {
+	opacity: 0.5
+}
+
+.tui-footer-copyright {
+	font-size: 24rpx;
+	color: #A7A7A7;
+	line-height: 1;
+	text-align: center;
+	padding-top: 16rpx
+}
+
+/*Footer end*/
+
+
+/*layout start*/
+
+/*形状*/
+.tui-triangle {
+	border: 16rpx solid;
+	width: 0;
+	height: 0;
+}
+
+.tui-triangle-left {
+	border-color: transparent #5c8dff transparent transparent;
+}
+
+.tui-triangle-right {
+	border-color: transparent transparent transparent #5c8dff;
+}
+
+.tui-triangle-top {
+	border-color: transparent transparent #5c8dff transparent;
+}
+
+.tui-triangle-bottom {
+	border-color: #5c8dff transparent transparent transparent;
+}
+
+
+.tui-parallelogram {
+	width: 100rpx;
+	height: 50rpx;
+	transform: skew(-10deg);
+	background: #19be6b;
+	margin-left: 10rpx;
+}
+
+.tui-crescent {
+	width: 60rpx;
+	height: 60rpx;
+	border-radius: 50%;
+	box-shadow: 12rpx 12rpx 0 0 yellowgreen;
+}
+
+/*聊天框*/
+.tui-chatbox {
+	max-width: 60%;
+	border-radius: 10rpx;
+	position: relative;
+	padding: 20rpx 26rpx;
+	font-size: 28rpx;
+	color: #fff;
+	/* word-break: break-all;
+  word-wrap: break-word; */
+}
+
+.tui-chatbox-left {
+	background: #5c8dff;
+	border: 1rpx solid #5c8dff;
+	display: inline-block;
+}
+
+.tui-chatbox-right {
+	background: #19be6b;
+	border: 1rpx solid #19be6b;
+}
+
+.tui-chatbox::before {
+	content: "";
+	position: absolute;
+	width: 0;
+	height: 0;
+	top: 20rpx;
+	border: 16rpx solid;
+}
+
+.tui-chatbox-left::before {
+	right: 100%;
+	border-color: transparent #5c8dff transparent transparent;
+}
+
+.tui-chatbox-right::before {
+	left: 100%;
+	border-color: transparent transparent transparent #19be6b;
+}
+
+/*checkbox 整体大小  */
+
+/* #ifdef MP-WEIXIN */
+.tui-checkbox .wx-checkbox-input {
+	width: 36rpx;
+	height: 36rpx;
+	border-radius: 50%;
+	margin: 0;
+}
+
+.tui-checkbox .wx-checkbox-input.wx-checkbox-input-checked {
+	background: #F82400;
+	width: 40rpx;
+	height: 40rpx;
+	border: none;
+}
+
+/* #endif */
+
+/* #ifndef MP-WEIXIN */
+>>>.tui-checkbox .uni-checkbox-input {
+	width: 36rpx;
+	height: 36rpx;
+	border-radius: 50% !important;
+	margin: 0;
+	border-color: #d1d1d1 !important;
+}
+
+>>>.tui-checkbox .uni-checkbox-input.uni-checkbox-input-checked {
+	background: #F82400;
+	width: 40rpx;
+	height: 40rpx;
+	border: none;
+}
+
+/* #endif */
+
+/*textarea*/
+
+.tui-textarea-box {
+	border-radius: 4rpx;
+	height: 280rpx;
+	box-sizing: border-box;
+	padding: 20rpx 20rpx 0 20rpx;
+	position: relative;
+}
+
+.tui-textarea-box::after {
+	content: '';
+	position: absolute;
+	height: 200%;
+	width: 200%;
+	border: 1px solid #e6e6e6;
+	transform-origin: 0 0;
+	-webkit-transform-origin: 0 0;
+	-webkit-transform: scale(0.5);
+	transform: scale(0.5);
+	left: 0;
+	top: 0;
+	border-radius: 8rpx;
+	pointer-events: none;
+}
+
+.tui-textarea {
+	height: 210rpx;
+	width: 100%;
+	color: #666;
+	font-size: 28rpx;
+	z-index: 2;
+}
+
+.tui-phcolor-color {
+	color: #ccc !important;
+}
+
+.tui-textarea-counter {
+	font-size: 24rpx;
+	color: #999;
+	text-align: right;
+	height: 40rpx;
+	line-height: 40rpx;
+	padding-top: 4rpx;
+}
+
+/*Input输入框*/
+.tui-input-item {
+	width: 100%;
+	display: flex;
+	align-items: center;
+	font-size: 32rpx;
+
+}
+
+.tui-input {
+	flex: 1;
+	font-size: 32rpx;
+	overflow: visible;
+}
+
+.tui-input-title {
+	min-width: 140rpx;
+	padding-right: 12rpx;
+	flex-shrink: 0;
+}
+
+.tui-phcolor {
+	color: #ccc;
+	font-size: 32rpx;
+	overflow: visible;
+}
+
+.tui-input-border {
+	/* border: 1rpx solid #eaeef1; */
+	padding: 20rpx 30rpx;
+	border-radius: 4rpx;
+	position: relative;
+	font-size: 32rpx;
+}
+
+.tui-input-border::after {
+	content: '';
+	position: absolute;
+	height: 200%;
+	width: 200%;
+	border: 1px solid #e6e6e6;
+	transform-origin: 0 0;
+	-webkit-transform-origin: 0 0;
+	-webkit-transform: scale(0.5);
+	transform: scale(0.5);
+	left: 0;
+	top: 0;
+	border-radius: 8rpx;
+	pointer-events: none;
+}
+
+.tui-text-right {
+	text-align: right;
+}
+
+/*上传*/
+.tui-upload-box {
+	width: 100%;
+	display: flex;
+	flex-wrap: wrap;
+}
+
+.tui-upload-item {
+	width: 220rpx;
+	height: 220rpx;
+	position: relative;
+	margin-right: 20rpx;
+	margin-bottom: 20rpx;
+}
+
+.tui-upload-item:nth-of-type(3n) {
+	margin-right: 0;
+}
+
+.tui-upload-img {
+	width: 220rpx;
+	height: 220rpx;
+	display: block;
+}
+
+.tui-upload-del {
+	position: absolute;
+	right: -18rpx;
+	top: -18rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+}
+
+.tui-upload-add {
+	width: 220rpx;
+	height: 220rpx;
+	font-size: 68rpx;
+	font-weight: 100;
+	color: #888;
+	background-color: #F7F7F7;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	padding: 0;
+}
+
+/* 操作条*/
+.tui-operation {
+	width: 100%;
+	height: 100rpx;
+	box-sizing: border-box;
+	overflow: hidden;
+	background: rgba(255, 255, 255, 0.9);
+	position: relative;
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+}
+
+.tui-operation::before {
+	content: '';
+	position: absolute;
+	top: 0px;
+	right: 0;
+	left: 0;
+	border-top: 1rpx solid #eaeef1;
+	-webkit-transform: scaleY(0.5);
+	transform: scaleY(0.5);
+}
+
+.tui-operation-left {
+	display: flex;
+	align-items: center;
+}
+
+.tui-operation-item {
+	flex: 1;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	flex-direction: column;
+	position: relative;
+}
+
+.tui-operation-text {
+	font-size: 22rpx;
+	color: #333;
+}
+
+.tui-operation-right {
+	flex: 1;
+	height: 100rpx;
+	box-sizing: border-box;
+	padding-top: 0;
+}
+
+.tui-relative {
+	position: relative;
+}
+
+.tui-btn-comment {
+	height: 64rpx;
+	width: 84%;
+	background: #ededed;
+	color: #999;
+	border-radius: 8rpx;
+	font-size: 28rpx;
+	display: flex;
+	align-items: center;
+	padding-left: 20rpx;
+	box-sizing: border-box;
+	padding-top: 0;
+	margin-left: 30rpx;
+}
+
+.tui-chat-operation {
+	background: #F6F6F6 !important;
+	padding-right: 18rpx;
+	box-sizing: border-box;
+}
+
+.tui-input-box {
+	width: 78%;
+	justify-content: flex-start;
+}
+
+.tui-chat-input {
+	background: #fff;
+	height: 72rpx;
+	border-radius: 6rpx;
+	padding-left: 20rpx;
+	padding-right: 20rpx;
+	flex: 1;
+}
+
+.tui-voice-icon {
+	margin-left: 20rpx;
+	margin-right: 20rpx
+}
+
+/*layout end*/

+ 4673 - 0
common/json/data.json.js

@@ -0,0 +1,4673 @@
+const addressList = [
+					{
+						address: "奥术大师大所打撒大是奥术大师大所打撒大是奥术大师大所打撒大是",
+						addressID: 2913,
+						city: "县",
+						cityID: 2,
+						defaultFlag: "1",
+						mobile: "13316418828",
+						phone: null,
+						postalCode: null,
+						province: "北京市",
+						provinceID: 1,
+						shouHuoRen: "郑大大",
+						town: "东城区282",
+						townID: 17,
+						userID: 11063
+					},
+					{
+						address: "奥术大师大所打撒大是奥术大师大所打撒大是奥术大师大所打撒大是",
+						addressID: 2913,
+						city: "县",
+						cityID: 2,
+						defaultFlag: "0",
+						mobile: "13316418828",
+						phone: null,
+						postalCode: null,
+						province: "北京市",
+						provinceID: 1,
+						shouHuoRen: "郑大大",
+						town: "东城区282",
+						townID: 17,
+						userID: 11063
+					},
+				]	
+const cartList = [
+                {
+                    "shopID":10134,
+                    "userID":11052,
+                    "name":"深圳市美轮美奂服务有限公司",
+                    "sname":"美轮美奂",
+                    "nameEn":null,
+                    "site":null,
+                    "ledgerNo":null,
+                    "logo":"",
+                    "rebateAmount":0,
+                    "level":null,
+                    "score":null,
+                    "productCount":null,
+                    "legalPerson":"sdfa",
+                    "businessLicense":null,
+                    "businessLicenseImage":"https://img-b.caimei365.com/group1/M00/03/20/Cmgy62BHHq6AYuqFAAGOILQcRyE628.jpg",
+                    "taxCertificate":null,
+                    "taxCertificateImage":null,
+                    "authorizationCertificateImage":null,
+                    "provinceID":19,
+                    "cityID":202,
+                    "townID":1958,
+                    "address":"广东省深圳市宝安区",
+                    "registeredCapital":12,
+                    "nature":"删掉",
+                    "turnover":123,
+                    "linkMan":"非林峰",
+                    "contractPhone":"",
+                    "contractMobile":"18666666669",
+                    "fax":"",
+                    "zipCode":null,
+                    "linkMan1":"非林峰",
+                    "duty1":null,
+                    "contractPhone1":null,
+                    "contractMobile1":"18666666669",
+                    "contractQQ1":null,
+                    "wechat1":null,
+                    "contractEmail1":"18666666669@qq.com",
+                    "linkMan2":"非林峰",
+                    "duty2":null,
+                    "contractPhone2":null,
+                    "contractMobile2":"18666666669",
+                    "contractQQ2":null,
+                    "wechat2":null,
+                    "contractEmail2":"18666666669@qq.com",
+                    "scope":null,
+                    "info":"啊大噶撒打发",
+                    "productDesc":"暗杀士大夫",
+                    "lng":null,
+                    "lat":null,
+                    "addTime":"2021-03-09 15:07:32",
+                    "auditStatus":"1",
+                    "auditTime":"2021-03-09 03:08:37",
+                    "auditNote":null,
+                    "favoriteTimes":0,
+                    "validFlag":"1",
+                    "payFlag1":null,
+                    "auditFlag1":null,
+                    "payFlag2":null,
+                    "auditFlag2":null,
+                    "payFlag3":null,
+                    "auditFlag3":null,
+                    "note":null,
+                    "status":90,
+                    "sortIndex":null,
+                    "rate1":null,
+                    "rate2":null,
+                    "masterFlag":null,
+                    "erpFlag":null,
+                    "shopSecret":null,
+                    "masterLogo":null,
+                    "cooperateFlag":null,
+                    "bail":null,
+                    "businessScope":"仪器护理类/撒打发",
+                    "socialCreditCode":"123456789987654321",
+                    "mainpro":"产品",
+                    "firstShopType":"1",
+                    "secondShopType":"3",
+                    "medicalPracticeLicenseImg1":"https://img-b.caimei365.com/group1/M00/03/20/Cmgy62BQeHGANhPUAABorQhpGjU343.jpg",
+                    "medicalPracticeLicenseImg2":null,
+                    "medicalPracticeLicenseImg3":null,
+                    "bankAccount":null,
+                    "bankAccountName":null,
+                    "bankName":null,
+                    "ableRebateAmount":0,
+                    "totalPrice":72.1075,
+                    "productsList":[
+                        {
+                            "productID":6421,
+                            "brandID":25,
+                            "tinyTypeID":1120,
+                            "classifyId":null,
+                            "preferredFlag":null,
+                            "selfTypeID":null,
+                            "shopID":10134,
+                            "name":"【测试用】肌本演绎【O4元素破茧疗法】25800 特惠方案",
+                            "aliasName":"【测试用】肌本演绎【O4元素破茧疗法】25800 特惠方案",
+                            "searchKey":"##########",
+                            "productRemarks":null,
+                            "normalPrice":15.25,
+                            "price":15.25,
+                            "highestUserLevelPrice":null,
+                            "lowestUserLevelPrice":null,
+                            "lowestUserLevelID":null,
+                            "price0":null,
+                            "price0Grade":null,
+                            "price0Text":null,
+                            "price0TextFlag":null,
+                            "price1":15.25,
+                            "price1Grade":null,
+                            "price1Text":null,
+                            "price1TextFlag":"2",
+                            "price8":null,
+                            "price8Grade":null,
+                            "price8Text":null,
+                            "price8TextFlag":null,
+                            "ladderPriceFlag":"0",
+                            "price2":null,
+                            "price3":null,
+                            "price4":null,
+                            "price5":null,
+                            "price6":null,
+                            "price7":null,
+                            "fee":null,
+                            "stock":100,
+                            "hasSkuFlag":"1",
+                            "mainImage":"https://img-b.caimei365.com/group1/M00/03/20/Cmgy62BHJGCARS7iAAVlWLR-uKU385.jpg",
+                            "propertiesInfo":null,
+                            "addTime":"2021-03-09 15:32:19",
+                            "updateTime":"2021-03-09 15:32:19",
+                            "classifyAddTime":null,
+                            "sellNumber":0,
+                            "weekSellNumber":null,
+                            "beforeValidFlag":null,
+                            "validFlag":"2",
+                            "favoriteTimes":0,
+                            "commentScore":0,
+                            "commentTimes":0,
+                            "selfRecommendFlag":null,
+                            "sysRecommendFlag":null,
+                            "sortIndex":0,
+                            "featuredFlag":"0",
+                            "featuredSortIndex":null,
+                            "productCode":"sdfsSGZee3336421",
+                            "rate1":null,
+                            "rate2":null,
+                            "unit":"瓶",
+                            "synToERPFlag":null,
+                            "allAreaFlag":"1",
+                            "provinceIDs":"0",
+                            "serviceNumber":"1",
+                            "maxBuyNumber":null,
+                            "virtualFlag":null,
+                            "minBuyNumber":1,
+                            "packageCount":null,
+                            "byFlag":null,
+                            "normalProductFlag":1,
+                            "wholeSaleProductFlag":null,
+                            "promotionProductFlag":null,
+                            "groupBuyProductFlag":null,
+                            "step":1,
+                            "speCommisionFlag":null,
+                            "speCommision":null,
+                            "videourl":null,
+                            "props":null,
+                            "providers":null,
+                            "serviceCommissionRatio":null,
+                            "reCommissionRatio":null,
+                            "pushToERPName":null,
+                            "prodBeans":null,
+                            "useBeansFlag":null,
+                            "privateFlag":null,
+                            "invisibleServiceProviderIDs":null,
+                            "displayOnCRMFlag":null,
+                            "needServiceFlag":null,
+                            "actFlag":0,
+                            "actStatus":null,
+                            "actSort":null,
+                            "actPrice0":null,
+                            "actPrice1":null,
+                            "actPrice2":null,
+                            "actPrice3":null,
+                            "actPrice4":null,
+                            "actPrice5":null,
+                            "actPrice6":null,
+                            "actPrice7":null,
+                            "actType":null,
+                            "actCreateTime":null,
+                            "actFullReduceAmount":null,
+                            "actReduceAmount":null,
+                            "visibility":"3",
+                            "actFullGiftAmount":null,
+                            "actBuyGiftNum":null,
+                            "beginTime":null,
+                            "endTime":null,
+                            "shopIndexModuleID":null,
+                            "onlineTime":null,
+                            "downlineTime":null,
+                            "freePostFlag":"2",
+                            "crmBigTypeId":null,
+                            "crmSmallTypeId":null,
+                            "costPrice":10,
+                            "costProportional":null,
+                            "costCheckFlag":"1",
+                            "precisehKey":null,
+                            "docBoost":null,
+                            "cmbeanFlag":null,
+                            "cmbeanPrice":null,
+                            "cmbeanSort":null,
+                            "tags":"注射",
+                            "surplusTime":null,
+                            "productType":"1",
+                            "machineType":"",
+                            "qualificationImg":"",
+                            "includedTax":"0",
+                            "taxPoint":10,
+                            "supplierTaxPoint":10,
+                            "invoiceType":"3",
+                            "recommendType":"0",
+                            "skuID":null,
+                            "priceType":null,
+                            "combinationID":null,
+                            "combinationSort":null,
+                            "productCategory":"1",
+                            "auditReason":null,
+                            "commodityType":"1",
+                            "retailPrice":15.25,
+                            "discountPrice":null,
+                            "tagsList":null,
+                            "imageList":null,
+                            "productDetail":null,
+                            "productCount":1,
+                            "ladderPriceList":null,
+                            "shop":null,
+                            "sellerCartId":3771,
+                            "productsChecked":false,
+                            "repurchasePriceState":false,
+                            "initProductNum":null,
+                            "totalPrice":null,
+                            "failureState":null,
+                            "smallTypeID":1037,
+                            "bigTypeID":1013,
+                            "typeName":null,
+                            "parametersList":null,
+                            "brandName":null,
+                            "bigTypeName":null,
+                            "smallTypeName":null,
+                            "tinyTypeName":null,
+                            "activityDiscount":null,
+                            "promotions":null,
+                            "giftType":null,
+                            "userIdentity":null,
+                            "isChecked":false,
+                            "detailTalkFlag":null,
+                            "shopName":null,
+                            "beautyActFlag":null
+                        },
+                        {
+                            "productID":6420,
+                            "brandID":25,
+                            "tinyTypeID":null,
+                            "classifyId":null,
+                            "preferredFlag":null,
+                            "selfTypeID":null,
+                            "shopID":10134,
+                            "name":"【测试用】润百颜注射修饰透明质酸钠凝胶1ml",
+                            "aliasName":"【测试用】润百颜注射修饰透明质酸钠凝胶1ml",
+                            "searchKey":"##########",
+                            "productRemarks":null,
+                            "normalPrice":25.75,
+                            "price":25.75,
+                            "highestUserLevelPrice":null,
+                            "lowestUserLevelPrice":null,
+                            "lowestUserLevelID":null,
+                            "price0":null,
+                            "price0Grade":null,
+                            "price0Text":null,
+                            "price0TextFlag":null,
+                            "price1":25.75,
+                            "price1Grade":null,
+                            "price1Text":null,
+                            "price1TextFlag":"2",
+                            "price8":null,
+                            "price8Grade":null,
+                            "price8Text":null,
+                            "price8TextFlag":null,
+                            "ladderPriceFlag":"0",
+                            "price2":null,
+                            "price3":null,
+                            "price4":null,
+                            "price5":null,
+                            "price6":null,
+                            "price7":null,
+                            "fee":null,
+                            "stock":100,
+                            "hasSkuFlag":"1",
+                            "mainImage":"https://img-b.caimei365.com/group1/M00/03/20/Cmgy62BHIIWATL05AAGHUpelz2U374.jpg",
+                            "propertiesInfo":null,
+                            "addTime":"2021-03-09 15:15:45",
+                            "updateTime":"2021-03-09 15:15:45",
+                            "classifyAddTime":null,
+                            "sellNumber":0,
+                            "weekSellNumber":null,
+                            "beforeValidFlag":null,
+                            "validFlag":"2",
+                            "favoriteTimes":0,
+                            "commentScore":0,
+                            "commentTimes":0,
+                            "selfRecommendFlag":null,
+                            "sysRecommendFlag":null,
+                            "sortIndex":0,
+                            "featuredFlag":"0",
+                            "featuredSortIndex":null,
+                            "productCode":"kscz6420",
+                            "rate1":null,
+                            "rate2":null,
+                            "unit":"盒",
+                            "synToERPFlag":null,
+                            "allAreaFlag":"1",
+                            "provinceIDs":"0",
+                            "serviceNumber":"1",
+                            "maxBuyNumber":null,
+                            "virtualFlag":null,
+                            "minBuyNumber":1,
+                            "packageCount":null,
+                            "byFlag":null,
+                            "normalProductFlag":1,
+                            "wholeSaleProductFlag":null,
+                            "promotionProductFlag":null,
+                            "groupBuyProductFlag":null,
+                            "step":1,
+                            "speCommisionFlag":null,
+                            "speCommision":null,
+                            "videourl":null,
+                            "props":null,
+                            "providers":null,
+                            "serviceCommissionRatio":null,
+                            "reCommissionRatio":null,
+                            "pushToERPName":null,
+                            "prodBeans":null,
+                            "useBeansFlag":null,
+                            "privateFlag":null,
+                            "invisibleServiceProviderIDs":null,
+                            "displayOnCRMFlag":null,
+                            "needServiceFlag":null,
+                            "actFlag":0,
+                            "actStatus":null,
+                            "actSort":null,
+                            "actPrice0":null,
+                            "actPrice1":null,
+                            "actPrice2":null,
+                            "actPrice3":null,
+                            "actPrice4":null,
+                            "actPrice5":null,
+                            "actPrice6":null,
+                            "actPrice7":null,
+                            "actType":null,
+                            "actCreateTime":null,
+                            "actFullReduceAmount":null,
+                            "actReduceAmount":null,
+                            "visibility":"3",
+                            "actFullGiftAmount":null,
+                            "actBuyGiftNum":null,
+                            "beginTime":null,
+                            "endTime":null,
+                            "shopIndexModuleID":null,
+                            "onlineTime":null,
+                            "downlineTime":null,
+                            "freePostFlag":"2",
+                            "crmBigTypeId":null,
+                            "crmSmallTypeId":null,
+                            "costPrice":20,
+                            "costProportional":null,
+                            "costCheckFlag":"1",
+                            "precisehKey":null,
+                            "docBoost":null,
+                            "cmbeanFlag":null,
+                            "cmbeanPrice":null,
+                            "cmbeanSort":null,
+                            "tags":"注射",
+                            "surplusTime":null,
+                            "productType":"1",
+                            "machineType":"",
+                            "qualificationImg":"",
+                            "includedTax":"0",
+                            "taxPoint":10,
+                            "supplierTaxPoint":10,
+                            "invoiceType":"2",
+                            "recommendType":"0",
+                            "skuID":null,
+                            "priceType":null,
+                            "combinationID":null,
+                            "combinationSort":null,
+                            "productCategory":"1",
+                            "auditReason":null,
+                            "commodityType":"1",
+                            "retailPrice":28.325,
+                            "discountPrice":null,
+                            "tagsList":null,
+                            "imageList":null,
+                            "productDetail":null,
+                            "productCount":1,
+                            "ladderPriceList":null,
+                            "shop":null,
+                            "sellerCartId":3772,
+                            "productsChecked":false,
+                            "repurchasePriceState":false,
+                            "initProductNum":null,
+                            "totalPrice":null,
+                            "failureState":null,
+                            "smallTypeID":null,
+                            "bigTypeID":1014,
+                            "typeName":null,
+                            "parametersList":null,
+                            "brandName":null,
+                            "bigTypeName":null,
+                            "smallTypeName":null,
+                            "tinyTypeName":null,
+                            "activityDiscount":null,
+                            "promotions":null,
+                            "giftType":null,
+                            "userIdentity":null,
+                            "isChecked":false,
+                            "detailTalkFlag":null,
+                            "shopName":null,
+                            "beautyActFlag":null
+                        },
+                        {
+                            "productID":6419,
+                            "brandID":1,
+                            "tinyTypeID":null,
+                            "classifyId":null,
+                            "preferredFlag":null,
+                            "selfTypeID":null,
+                            "shopID":10134,
+                            "name":"【测试用】Dermaheal HSR 德玛莉肌活丝蕴凝颜精华液",
+                            "aliasName":"【测试用】Dermaheal HSR 德玛莉肌活丝蕴凝颜精华液",
+                            "searchKey":"##########",
+                            "productRemarks":null,
+                            "normalPrice":25.25,
+                            "price":25.25,
+                            "highestUserLevelPrice":null,
+                            "lowestUserLevelPrice":null,
+                            "lowestUserLevelID":null,
+                            "price0":null,
+                            "price0Grade":null,
+                            "price0Text":null,
+                            "price0TextFlag":null,
+                            "price1":25.25,
+                            "price1Grade":null,
+                            "price1Text":null,
+                            "price1TextFlag":"2",
+                            "price8":null,
+                            "price8Grade":null,
+                            "price8Text":null,
+                            "price8TextFlag":null,
+                            "ladderPriceFlag":"0",
+                            "price2":null,
+                            "price3":null,
+                            "price4":null,
+                            "price5":null,
+                            "price6":null,
+                            "price7":null,
+                            "fee":null,
+                            "stock":200,
+                            "hasSkuFlag":"1",
+                            "mainImage":"https://img-b.caimei365.com/group1/M00/03/20/Cmgy62BHH8aAFiGIAAGHr5DovGA124.jpg",
+                            "propertiesInfo":null,
+                            "addTime":"2021-03-09 15:12:28",
+                            "updateTime":"2021-03-09 15:12:28",
+                            "classifyAddTime":null,
+                            "sellNumber":0,
+                            "weekSellNumber":null,
+                            "beforeValidFlag":null,
+                            "validFlag":"2",
+                            "favoriteTimes":0,
+                            "commentScore":0,
+                            "commentTimes":0,
+                            "selfRecommendFlag":null,
+                            "sysRecommendFlag":null,
+                            "sortIndex":0,
+                            "featuredFlag":"0",
+                            "featuredSortIndex":null,
+                            "productCode":"FWLCP6419",
+                            "rate1":null,
+                            "rate2":null,
+                            "unit":"片",
+                            "synToERPFlag":null,
+                            "allAreaFlag":"1",
+                            "provinceIDs":"0",
+                            "serviceNumber":"1",
+                            "maxBuyNumber":null,
+                            "virtualFlag":null,
+                            "minBuyNumber":1,
+                            "packageCount":null,
+                            "byFlag":null,
+                            "normalProductFlag":1,
+                            "wholeSaleProductFlag":null,
+                            "promotionProductFlag":null,
+                            "groupBuyProductFlag":null,
+                            "step":1,
+                            "speCommisionFlag":null,
+                            "speCommision":null,
+                            "videourl":null,
+                            "props":null,
+                            "providers":null,
+                            "serviceCommissionRatio":null,
+                            "reCommissionRatio":null,
+                            "pushToERPName":null,
+                            "prodBeans":null,
+                            "useBeansFlag":null,
+                            "privateFlag":null,
+                            "invisibleServiceProviderIDs":null,
+                            "displayOnCRMFlag":null,
+                            "needServiceFlag":null,
+                            "actFlag":0,
+                            "actStatus":null,
+                            "actSort":null,
+                            "actPrice0":null,
+                            "actPrice1":null,
+                            "actPrice2":null,
+                            "actPrice3":null,
+                            "actPrice4":null,
+                            "actPrice5":null,
+                            "actPrice6":null,
+                            "actPrice7":null,
+                            "actType":null,
+                            "actCreateTime":null,
+                            "actFullReduceAmount":null,
+                            "actReduceAmount":null,
+                            "visibility":"3",
+                            "actFullGiftAmount":null,
+                            "actBuyGiftNum":null,
+                            "beginTime":null,
+                            "endTime":null,
+                            "shopIndexModuleID":null,
+                            "onlineTime":null,
+                            "downlineTime":null,
+                            "freePostFlag":"2",
+                            "crmBigTypeId":null,
+                            "crmSmallTypeId":null,
+                            "costPrice":20,
+                            "costProportional":null,
+                            "costCheckFlag":"1",
+                            "precisehKey":null,
+                            "docBoost":null,
+                            "cmbeanFlag":null,
+                            "cmbeanPrice":null,
+                            "cmbeanSort":null,
+                            "tags":"面膜",
+                            "surplusTime":null,
+                            "productType":"1",
+                            "machineType":"",
+                            "qualificationImg":"",
+                            "includedTax":"0",
+                            "taxPoint":13,
+                            "supplierTaxPoint":13,
+                            "invoiceType":"1",
+                            "recommendType":"0",
+                            "skuID":null,
+                            "priceType":null,
+                            "combinationID":null,
+                            "combinationSort":null,
+                            "productCategory":"1",
+                            "auditReason":null,
+                            "commodityType":"1",
+                            "retailPrice":28.5325,
+                            "discountPrice":null,
+                            "tagsList":null,
+                            "imageList":null,
+                            "productDetail":null,
+                            "productCount":1,
+                            "ladderPriceList":null,
+                            "shop":null,
+                            "sellerCartId":3773,
+                            "productsChecked":false,
+                            "repurchasePriceState":false,
+                            "initProductNum":null,
+                            "totalPrice":null,
+                            "failureState":null,
+                            "smallTypeID":null,
+                            "bigTypeID":1018,
+                            "typeName":null,
+                            "parametersList":null,
+                            "brandName":null,
+                            "bigTypeName":null,
+                            "smallTypeName":null,
+                            "tinyTypeName":null,
+                            "activityDiscount":null,
+                            "promotions":null,
+                            "giftType":null,
+                            "userIdentity":null,
+                            "isChecked":false,
+                            "detailTalkFlag":null,
+                            "shopName":null,
+                            "beautyActFlag":null
+                        }
+                    ],
+                    "businessScopeArray":null,
+                    "mobileCode":null,
+                    "shopBannerList":null,
+                    "productionLicence":null,
+                    "hygienicLicense":null,
+                    "taxLicense":null,
+                    "certificateHonor":null,
+                    "productCertification":null,
+                    "provincialAddress":null,
+                    "promotions":null,
+                    "reducedPrice":null,
+                    "normalNum":null
+                },
+                {
+                    "shopID":10133,
+                    "userID":11051,
+                    "name":"深圳市采美奥泰贸易有限公司",
+                    "sname":"采美奥泰",
+                    "nameEn":null,
+                    "site":null,
+                    "ledgerNo":null,
+                    "logo":"/userfiles/1/images/photo/2021/01/Cmis21__5o-ADIQEAAD1N_9T1C4174.jpg",
+                    "rebateAmount":0,
+                    "level":null,
+                    "score":null,
+                    "productCount":null,
+                    "legalPerson":null,
+                    "businessLicense":null,
+                    "businessLicenseImage":"https://img-b.caimei365.com/group1/M00/03/20/Cmgy62BG9AGARTWcAAAfYeeBGQU924.jpg",
+                    "taxCertificate":"1223132454646556",
+                    "taxCertificateImage":null,
+                    "authorizationCertificateImage":null,
+                    "provinceID":19,
+                    "cityID":202,
+                    "townID":1955,
+                    "address":"红树湾",
+                    "registeredCapital":null,
+                    "nature":null,
+                    "turnover":null,
+                    "linkMan":"郑超",
+                    "contractPhone":null,
+                    "contractMobile":"18666666668",
+                    "fax":null,
+                    "zipCode":null,
+                    "linkMan1":"郑超",
+                    "duty1":null,
+                    "contractPhone1":null,
+                    "contractMobile1":"18666666668",
+                    "contractQQ1":null,
+                    "wechat1":null,
+                    "contractEmail1":"18666666668@qq.com",
+                    "linkMan2":"郑超",
+                    "duty2":null,
+                    "contractPhone2":null,
+                    "contractMobile2":"18666666668",
+                    "contractQQ2":null,
+                    "wechat2":null,
+                    "contractEmail2":"18666666668@qq.com",
+                    "scope":null,
+                    "info":"二恶烷群",
+                    "productDesc":"额外若群",
+                    "lng":null,
+                    "lat":null,
+                    "addTime":"2021-03-09 12:05:24",
+                    "auditStatus":"1",
+                    "auditTime":"2021-03-09 02:01:28",
+                    "auditNote":null,
+                    "favoriteTimes":0,
+                    "validFlag":"1",
+                    "payFlag1":null,
+                    "auditFlag1":null,
+                    "payFlag2":null,
+                    "auditFlag2":null,
+                    "payFlag3":null,
+                    "auditFlag3":null,
+                    "note":null,
+                    "status":90,
+                    "sortIndex":null,
+                    "rate1":null,
+                    "rate2":null,
+                    "masterFlag":null,
+                    "erpFlag":null,
+                    "shopSecret":null,
+                    "masterLogo":null,
+                    "cooperateFlag":null,
+                    "bail":null,
+                    "businessScope":null,
+                    "socialCreditCode":"123456789987654321",
+                    "mainpro":"",
+                    "firstShopType":"2",
+                    "secondShopType":"",
+                    "medicalPracticeLicenseImg1":null,
+                    "medicalPracticeLicenseImg2":null,
+                    "medicalPracticeLicenseImg3":null,
+                    "bankAccount":null,
+                    "bankAccountName":null,
+                    "bankName":null,
+                    "ableRebateAmount":0,
+                    "totalPrice":49.775,
+                    "productsList":[
+                        {
+                            "productID":6418,
+                            "brandID":1,
+                            "tinyTypeID":null,
+                            "classifyId":null,
+                            "preferredFlag":null,
+                            "selfTypeID":null,
+                            "shopID":10133,
+                            "name":"【测试用】EndyMed-3Deep-医学美容多功能相控射频",
+                            "aliasName":"【测试用】EndyMed-3Deep-医学美容多功能相控射频",
+                            "searchKey":"##########",
+                            "productRemarks":null,
+                            "normalPrice":45.25,
+                            "price":45.25,
+                            "highestUserLevelPrice":null,
+                            "lowestUserLevelPrice":null,
+                            "lowestUserLevelID":null,
+                            "price0":null,
+                            "price0Grade":null,
+                            "price0Text":null,
+                            "price0TextFlag":null,
+                            "price1":45.25,
+                            "price1Grade":null,
+                            "price1Text":null,
+                            "price1TextFlag":"2",
+                            "price8":null,
+                            "price8Grade":null,
+                            "price8Text":null,
+                            "price8TextFlag":null,
+                            "ladderPriceFlag":"0",
+                            "price2":null,
+                            "price3":null,
+                            "price4":null,
+                            "price5":null,
+                            "price6":null,
+                            "price7":null,
+                            "fee":null,
+                            "stock":100,
+                            "hasSkuFlag":"1",
+                            "mainImage":"https://img-b.caimei365.com/group1/M00/03/20/Cmgy62BHEMOAFVmsAAGOILQcRyE020.jpg",
+                            "propertiesInfo":null,
+                            "addTime":"2021-03-09 14:08:52",
+                            "updateTime":"2021-03-09 14:08:52",
+                            "classifyAddTime":null,
+                            "sellNumber":0,
+                            "weekSellNumber":null,
+                            "beforeValidFlag":null,
+                            "validFlag":"2",
+                            "favoriteTimes":0,
+                            "commentScore":0,
+                            "commentTimes":0,
+                            "selfRecommendFlag":null,
+                            "sysRecommendFlag":null,
+                            "sortIndex":0,
+                            "featuredFlag":"0",
+                            "featuredSortIndex":null,
+                            "productCode":"SSSXSPRZH6418",
+                            "rate1":null,
+                            "rate2":null,
+                            "unit":"台",
+                            "synToERPFlag":null,
+                            "allAreaFlag":"1",
+                            "provinceIDs":"0",
+                            "serviceNumber":"1",
+                            "maxBuyNumber":null,
+                            "virtualFlag":null,
+                            "minBuyNumber":1,
+                            "packageCount":null,
+                            "byFlag":null,
+                            "normalProductFlag":1,
+                            "wholeSaleProductFlag":null,
+                            "promotionProductFlag":null,
+                            "groupBuyProductFlag":null,
+                            "step":1,
+                            "speCommisionFlag":null,
+                            "speCommision":null,
+                            "videourl":null,
+                            "props":null,
+                            "providers":null,
+                            "serviceCommissionRatio":null,
+                            "reCommissionRatio":null,
+                            "pushToERPName":null,
+                            "prodBeans":null,
+                            "useBeansFlag":null,
+                            "privateFlag":null,
+                            "invisibleServiceProviderIDs":null,
+                            "displayOnCRMFlag":null,
+                            "needServiceFlag":null,
+                            "actFlag":0,
+                            "actStatus":null,
+                            "actSort":null,
+                            "actPrice0":null,
+                            "actPrice1":null,
+                            "actPrice2":null,
+                            "actPrice3":null,
+                            "actPrice4":null,
+                            "actPrice5":null,
+                            "actPrice6":null,
+                            "actPrice7":null,
+                            "actType":null,
+                            "actCreateTime":null,
+                            "actFullReduceAmount":null,
+                            "actReduceAmount":null,
+                            "visibility":"3",
+                            "actFullGiftAmount":null,
+                            "actBuyGiftNum":null,
+                            "beginTime":null,
+                            "endTime":null,
+                            "shopIndexModuleID":null,
+                            "onlineTime":null,
+                            "downlineTime":null,
+                            "freePostFlag":"2",
+                            "crmBigTypeId":null,
+                            "crmSmallTypeId":null,
+                            "costPrice":40,
+                            "costProportional":null,
+                            "costCheckFlag":"1",
+                            "precisehKey":null,
+                            "docBoost":null,
+                            "cmbeanFlag":null,
+                            "cmbeanPrice":null,
+                            "cmbeanSort":null,
+                            "tags":"美容仪",
+                            "surplusTime":null,
+                            "productType":"1",
+                            "machineType":"",
+                            "qualificationImg":"",
+                            "includedTax":"0",
+                            "taxPoint":10,
+                            "supplierTaxPoint":10,
+                            "invoiceType":"2",
+                            "recommendType":"0",
+                            "skuID":null,
+                            "priceType":null,
+                            "combinationID":null,
+                            "combinationSort":null,
+                            "productCategory":"1",
+                            "auditReason":null,
+                            "commodityType":"2",
+                            "retailPrice":49.775,
+                            "discountPrice":null,
+                            "tagsList":null,
+                            "imageList":null,
+                            "productDetail":null,
+                            "productCount":1,
+                            "ladderPriceList":null,
+                            "shop":null,
+                            "sellerCartId":3774,
+                            "productsChecked":false,
+                            "repurchasePriceState":false,
+                            "initProductNum":null,
+                            "totalPrice":null,
+                            "failureState":null,
+                            "smallTypeID":1051,
+                            "bigTypeID":1022,
+                            "typeName":null,
+                            "parametersList":null,
+                            "brandName":null,
+                            "bigTypeName":null,
+                            "smallTypeName":null,
+                            "tinyTypeName":null,
+                            "activityDiscount":null,
+                            "promotions":null,
+                            "giftType":null,
+                            "userIdentity":null,
+                            "isChecked":false,
+                            "detailTalkFlag":null,
+                            "shopName":null,
+                            "beautyActFlag":null
+                        }
+                    ],
+                    "businessScopeArray":null,
+                    "mobileCode":null,
+                    "shopBannerList":null,
+                    "productionLicence":null,
+                    "hygienicLicense":null,
+                    "taxLicense":null,
+                    "certificateHonor":null,
+                    "productCertification":null,
+                    "provincialAddress":null,
+                    "promotions":null,
+                    "reducedPrice":null,
+                    "normalNum":null
+                },
+                {
+                    "shopID":10131,
+                    "userID":11049,
+                    "name":"深圳市肤白貌美服务有限公司",
+                    "sname":"肤白貌美",
+                    "nameEn":null,
+                    "site":null,
+                    "ledgerNo":null,
+                    "logo":"/userfiles/1/images/photo/2021/01/Cmis21__5o-AaNq1AAEriLZ0RzY342.jpg",
+                    "rebateAmount":0,
+                    "level":null,
+                    "score":null,
+                    "productCount":null,
+                    "legalPerson":null,
+                    "businessLicense":null,
+                    "businessLicenseImage":"https://img-b.caimei365.com/group1/M00/03/20/Cmgy62BG8bSALKXAAAAfYeeBGQU840.jpg",
+                    "taxCertificate":"45654654645654645645645645645654",
+                    "taxCertificateImage":null,
+                    "authorizationCertificateImage":null,
+                    "provinceID":19,
+                    "cityID":202,
+                    "townID":3202,
+                    "address":"高傲新村",
+                    "registeredCapital":null,
+                    "nature":null,
+                    "turnover":null,
+                    "linkMan":"吴小研",
+                    "contractPhone":null,
+                    "contractMobile":"18666666666",
+                    "fax":null,
+                    "zipCode":null,
+                    "linkMan1":"吴小研",
+                    "duty1":null,
+                    "contractPhone1":null,
+                    "contractMobile1":"18666666666",
+                    "contractQQ1":null,
+                    "wechat1":null,
+                    "contractEmail1":"18666666666@qq.com",
+                    "linkMan2":"吴小研",
+                    "duty2":null,
+                    "contractPhone2":null,
+                    "contractMobile2":"18666666666",
+                    "contractQQ2":null,
+                    "wechat2":null,
+                    "contractEmail2":"18666666666@qq.com",
+                    "scope":null,
+                    "info":"45",
+                    "productDesc":"4564",
+                    "lng":null,
+                    "lat":null,
+                    "addTime":"2021-03-09 11:55:39",
+                    "auditStatus":"1",
+                    "auditTime":"2021-03-09 01:43:18",
+                    "auditNote":null,
+                    "favoriteTimes":0,
+                    "validFlag":"1",
+                    "payFlag1":null,
+                    "auditFlag1":null,
+                    "payFlag2":null,
+                    "auditFlag2":null,
+                    "payFlag3":null,
+                    "auditFlag3":null,
+                    "note":null,
+                    "status":90,
+                    "sortIndex":null,
+                    "rate1":null,
+                    "rate2":null,
+                    "masterFlag":null,
+                    "erpFlag":null,
+                    "shopSecret":null,
+                    "masterLogo":null,
+                    "cooperateFlag":null,
+                    "bail":null,
+                    "businessScope":null,
+                    "socialCreditCode":"987654321123456666",
+                    "mainpro":"",
+                    "firstShopType":"1",
+                    "secondShopType":"1",
+                    "medicalPracticeLicenseImg1":null,
+                    "medicalPracticeLicenseImg2":null,
+                    "medicalPracticeLicenseImg3":null,
+                    "bankAccount":null,
+                    "bankAccountName":null,
+                    "bankName":null,
+                    "ableRebateAmount":0,
+                    "totalPrice":35.75,
+                    "productsList":[
+                        {
+                            "productID":6416,
+                            "brandID":1,
+                            "tinyTypeID":1120,
+                            "classifyId":null,
+                            "preferredFlag":null,
+                            "selfTypeID":null,
+                            "shopID":10131,
+                            "name":"【测试用】HydraFacial海菲秀 真空负压 深层洁净",
+                            "aliasName":"【测试用】HydraFacial海菲秀 真空负压 深层洁净",
+                            "searchKey":"##########",
+                            "productRemarks":null,
+                            "normalPrice":35.75,
+                            "price":35.75,
+                            "highestUserLevelPrice":null,
+                            "lowestUserLevelPrice":null,
+                            "lowestUserLevelID":null,
+                            "price0":null,
+                            "price0Grade":null,
+                            "price0Text":null,
+                            "price0TextFlag":null,
+                            "price1":35.75,
+                            "price1Grade":null,
+                            "price1Text":null,
+                            "price1TextFlag":"2",
+                            "price8":null,
+                            "price8Grade":null,
+                            "price8Text":null,
+                            "price8TextFlag":null,
+                            "ladderPriceFlag":"0",
+                            "price2":null,
+                            "price3":null,
+                            "price4":null,
+                            "price5":null,
+                            "price6":null,
+                            "price7":null,
+                            "fee":null,
+                            "stock":100,
+                            "hasSkuFlag":"1",
+                            "mainImage":"https://img-b.caimei365.com/group1/M00/03/20/Cmgy62BHDRGAQGhIAAWEI4ChAUg291.jpg",
+                            "propertiesInfo":null,
+                            "addTime":"2021-03-09 13:52:49",
+                            "updateTime":"2021-03-09 13:52:49",
+                            "classifyAddTime":null,
+                            "sellNumber":0,
+                            "weekSellNumber":null,
+                            "beforeValidFlag":null,
+                            "validFlag":"2",
+                            "favoriteTimes":0,
+                            "commentScore":0,
+                            "commentTimes":0,
+                            "selfRecommendFlag":null,
+                            "sysRecommendFlag":null,
+                            "sortIndex":0,
+                            "featuredFlag":"0",
+                            "featuredSortIndex":null,
+                            "productCode":"sdfsSGZee3336416",
+                            "rate1":null,
+                            "rate2":null,
+                            "unit":"台",
+                            "synToERPFlag":null,
+                            "allAreaFlag":"1",
+                            "provinceIDs":"0",
+                            "serviceNumber":"1",
+                            "maxBuyNumber":null,
+                            "virtualFlag":null,
+                            "minBuyNumber":1,
+                            "packageCount":null,
+                            "byFlag":null,
+                            "normalProductFlag":1,
+                            "wholeSaleProductFlag":null,
+                            "promotionProductFlag":null,
+                            "groupBuyProductFlag":null,
+                            "step":1,
+                            "speCommisionFlag":null,
+                            "speCommision":null,
+                            "videourl":null,
+                            "props":null,
+                            "providers":null,
+                            "serviceCommissionRatio":null,
+                            "reCommissionRatio":null,
+                            "pushToERPName":null,
+                            "prodBeans":null,
+                            "useBeansFlag":null,
+                            "privateFlag":null,
+                            "invisibleServiceProviderIDs":null,
+                            "displayOnCRMFlag":null,
+                            "needServiceFlag":null,
+                            "actFlag":0,
+                            "actStatus":null,
+                            "actSort":null,
+                            "actPrice0":null,
+                            "actPrice1":null,
+                            "actPrice2":null,
+                            "actPrice3":null,
+                            "actPrice4":null,
+                            "actPrice5":null,
+                            "actPrice6":null,
+                            "actPrice7":null,
+                            "actType":null,
+                            "actCreateTime":null,
+                            "actFullReduceAmount":null,
+                            "actReduceAmount":null,
+                            "visibility":"3",
+                            "actFullGiftAmount":null,
+                            "actBuyGiftNum":null,
+                            "beginTime":null,
+                            "endTime":null,
+                            "shopIndexModuleID":null,
+                            "onlineTime":null,
+                            "downlineTime":null,
+                            "freePostFlag":"2",
+                            "crmBigTypeId":null,
+                            "crmSmallTypeId":null,
+                            "costPrice":30,
+                            "costProportional":null,
+                            "costCheckFlag":"1",
+                            "precisehKey":null,
+                            "docBoost":null,
+                            "cmbeanFlag":null,
+                            "cmbeanPrice":null,
+                            "cmbeanSort":null,
+                            "tags":"清洁",
+                            "surplusTime":null,
+                            "productType":"2",
+                            "machineType":"1",
+                            "qualificationImg":"https://img-b.caimei365.com/group1/M00/03/20/Cmgy62BHDL2ADbuIAAlLT8OmIlA825.gif",
+                            "includedTax":"1",
+                            "taxPoint":10,
+                            "supplierTaxPoint":10,
+                            "invoiceType":"2",
+                            "recommendType":"0",
+                            "skuID":null,
+                            "priceType":null,
+                            "combinationID":null,
+                            "combinationSort":null,
+                            "productCategory":"1",
+                            "auditReason":null,
+                            "commodityType":"1",
+                            "retailPrice":35.75,
+                            "discountPrice":null,
+                            "tagsList":null,
+                            "imageList":null,
+                            "productDetail":null,
+                            "productCount":1,
+                            "ladderPriceList":null,
+                            "shop":null,
+                            "sellerCartId":3775,
+                            "productsChecked":false,
+                            "repurchasePriceState":false,
+                            "initProductNum":null,
+                            "totalPrice":null,
+                            "failureState":null,
+                            "smallTypeID":1037,
+                            "bigTypeID":1013,
+                            "typeName":null,
+                            "parametersList":null,
+                            "brandName":null,
+                            "bigTypeName":null,
+                            "smallTypeName":null,
+                            "tinyTypeName":null,
+                            "activityDiscount":null,
+                            "promotions":null,
+                            "giftType":null,
+                            "userIdentity":null,
+                            "isChecked":false,
+                            "detailTalkFlag":null,
+                            "shopName":null,
+                            "beautyActFlag":null
+                        }
+                    ],
+                    "businessScopeArray":null,
+                    "mobileCode":null,
+                    "shopBannerList":null,
+                    "productionLicence":null,
+                    "hygienicLicense":null,
+                    "taxLicense":null,
+                    "certificateHonor":null,
+                    "productCertification":null,
+                    "provincialAddress":null,
+                    "promotions":null,
+                    "reducedPrice":null,
+                    "normalNum":null
+                },
+				{
+				    "shopID":10131,
+				    "userID":11049,
+				    "name":"深圳市肤白貌美服务有限公司",
+				    "sname":"肤白貌美",
+				    "nameEn":null,
+				    "site":null,
+				    "ledgerNo":null,
+				    "logo":"/userfiles/1/images/photo/2021/01/Cmis21__5o-AaNq1AAEriLZ0RzY342.jpg",
+				    "rebateAmount":0,
+				    "level":null,
+				    "score":null,
+				    "productCount":null,
+				    "legalPerson":null,
+				    "businessLicense":null,
+				    "businessLicenseImage":"https://img-b.caimei365.com/group1/M00/03/20/Cmgy62BG8bSALKXAAAAfYeeBGQU840.jpg",
+				    "taxCertificate":"45654654645654645645645645645654",
+				    "taxCertificateImage":null,
+				    "authorizationCertificateImage":null,
+				    "provinceID":19,
+				    "cityID":202,
+				    "townID":3202,
+				    "address":"高傲新村",
+				    "registeredCapital":null,
+				    "nature":null,
+				    "turnover":null,
+				    "linkMan":"吴小研",
+				    "contractPhone":null,
+				    "contractMobile":"18666666666",
+				    "fax":null,
+				    "zipCode":null,
+				    "linkMan1":"吴小研",
+				    "duty1":null,
+				    "contractPhone1":null,
+				    "contractMobile1":"18666666666",
+				    "contractQQ1":null,
+				    "wechat1":null,
+				    "contractEmail1":"18666666666@qq.com",
+				    "linkMan2":"吴小研",
+				    "duty2":null,
+				    "contractPhone2":null,
+				    "contractMobile2":"18666666666",
+				    "contractQQ2":null,
+				    "wechat2":null,
+				    "contractEmail2":"18666666666@qq.com",
+				    "scope":null,
+				    "info":"45",
+				    "productDesc":"4564",
+				    "lng":null,
+				    "lat":null,
+				    "addTime":"2021-03-09 11:55:39",
+				    "auditStatus":"1",
+				    "auditTime":"2021-03-09 01:43:18",
+				    "auditNote":null,
+				    "favoriteTimes":0,
+				    "validFlag":"1",
+				    "payFlag1":null,
+				    "auditFlag1":null,
+				    "payFlag2":null,
+				    "auditFlag2":null,
+				    "payFlag3":null,
+				    "auditFlag3":null,
+				    "note":null,
+				    "status":90,
+				    "sortIndex":null,
+				    "rate1":null,
+				    "rate2":null,
+				    "masterFlag":null,
+				    "erpFlag":null,
+				    "shopSecret":null,
+				    "masterLogo":null,
+				    "cooperateFlag":null,
+				    "bail":null,
+				    "businessScope":null,
+				    "socialCreditCode":"987654321123456666",
+				    "mainpro":"",
+				    "firstShopType":"1",
+				    "secondShopType":"1",
+				    "medicalPracticeLicenseImg1":null,
+				    "medicalPracticeLicenseImg2":null,
+				    "medicalPracticeLicenseImg3":null,
+				    "bankAccount":null,
+				    "bankAccountName":null,
+				    "bankName":null,
+				    "ableRebateAmount":0,
+				    "totalPrice":35.75,
+				    "productsList":[
+				        {
+				            "productID":6416,
+				            "brandID":1,
+				            "tinyTypeID":1120,
+				            "classifyId":null,
+				            "preferredFlag":null,
+				            "selfTypeID":null,
+				            "shopID":10131,
+				            "name":"【测试用】HydraFacial海菲秀 真空负压 深层洁净",
+				            "aliasName":"【测试用】HydraFacial海菲秀 真空负压 深层洁净",
+				            "searchKey":"##########",
+				            "productRemarks":null,
+				            "normalPrice":35.75,
+				            "price":35.75,
+				            "highestUserLevelPrice":null,
+				            "lowestUserLevelPrice":null,
+				            "lowestUserLevelID":null,
+				            "price0":null,
+				            "price0Grade":null,
+				            "price0Text":null,
+				            "price0TextFlag":null,
+				            "price1":35.75,
+				            "price1Grade":null,
+				            "price1Text":null,
+				            "price1TextFlag":"2",
+				            "price8":null,
+				            "price8Grade":null,
+				            "price8Text":null,
+				            "price8TextFlag":null,
+				            "ladderPriceFlag":"0",
+				            "price2":null,
+				            "price3":null,
+				            "price4":null,
+				            "price5":null,
+				            "price6":null,
+				            "price7":null,
+				            "fee":null,
+				            "stock":100,
+				            "hasSkuFlag":"1",
+				            "mainImage":"https://img-b.caimei365.com/group1/M00/03/20/Cmgy62BHDRGAQGhIAAWEI4ChAUg291.jpg",
+				            "propertiesInfo":null,
+				            "addTime":"2021-03-09 13:52:49",
+				            "updateTime":"2021-03-09 13:52:49",
+				            "classifyAddTime":null,
+				            "sellNumber":0,
+				            "weekSellNumber":null,
+				            "beforeValidFlag":null,
+				            "validFlag":"2",
+				            "favoriteTimes":0,
+				            "commentScore":0,
+				            "commentTimes":0,
+				            "selfRecommendFlag":null,
+				            "sysRecommendFlag":null,
+				            "sortIndex":0,
+				            "featuredFlag":"0",
+				            "featuredSortIndex":null,
+				            "productCode":"sdfsSGZee3336416",
+				            "rate1":null,
+				            "rate2":null,
+				            "unit":"台",
+				            "synToERPFlag":null,
+				            "allAreaFlag":"1",
+				            "provinceIDs":"0",
+				            "serviceNumber":"1",
+				            "maxBuyNumber":null,
+				            "virtualFlag":null,
+				            "minBuyNumber":1,
+				            "packageCount":null,
+				            "byFlag":null,
+				            "normalProductFlag":1,
+				            "wholeSaleProductFlag":null,
+				            "promotionProductFlag":null,
+				            "groupBuyProductFlag":null,
+				            "step":1,
+				            "speCommisionFlag":null,
+				            "speCommision":null,
+				            "videourl":null,
+				            "props":null,
+				            "providers":null,
+				            "serviceCommissionRatio":null,
+				            "reCommissionRatio":null,
+				            "pushToERPName":null,
+				            "prodBeans":null,
+				            "useBeansFlag":null,
+				            "privateFlag":null,
+				            "invisibleServiceProviderIDs":null,
+				            "displayOnCRMFlag":null,
+				            "needServiceFlag":null,
+				            "actFlag":0,
+				            "actStatus":null,
+				            "actSort":null,
+				            "actPrice0":null,
+				            "actPrice1":null,
+				            "actPrice2":null,
+				            "actPrice3":null,
+				            "actPrice4":null,
+				            "actPrice5":null,
+				            "actPrice6":null,
+				            "actPrice7":null,
+				            "actType":null,
+				            "actCreateTime":null,
+				            "actFullReduceAmount":null,
+				            "actReduceAmount":null,
+				            "visibility":"3",
+				            "actFullGiftAmount":null,
+				            "actBuyGiftNum":null,
+				            "beginTime":null,
+				            "endTime":null,
+				            "shopIndexModuleID":null,
+				            "onlineTime":null,
+				            "downlineTime":null,
+				            "freePostFlag":"2",
+				            "crmBigTypeId":null,
+				            "crmSmallTypeId":null,
+				            "costPrice":30,
+				            "costProportional":null,
+				            "costCheckFlag":"1",
+				            "precisehKey":null,
+				            "docBoost":null,
+				            "cmbeanFlag":null,
+				            "cmbeanPrice":null,
+				            "cmbeanSort":null,
+				            "tags":"清洁",
+				            "surplusTime":null,
+				            "productType":"2",
+				            "machineType":"1",
+				            "qualificationImg":"https://img-b.caimei365.com/group1/M00/03/20/Cmgy62BHDL2ADbuIAAlLT8OmIlA825.gif",
+				            "includedTax":"1",
+				            "taxPoint":10,
+				            "supplierTaxPoint":10,
+				            "invoiceType":"2",
+				            "recommendType":"0",
+				            "skuID":null,
+				            "priceType":null,
+				            "combinationID":null,
+				            "combinationSort":null,
+				            "productCategory":"1",
+				            "auditReason":null,
+				            "commodityType":"1",
+				            "retailPrice":35.75,
+				            "discountPrice":null,
+				            "tagsList":null,
+				            "imageList":null,
+				            "productDetail":null,
+				            "productCount":1,
+				            "ladderPriceList":null,
+				            "shop":null,
+				            "sellerCartId":3775,
+				            "productsChecked":false,
+				            "repurchasePriceState":false,
+				            "initProductNum":null,
+				            "totalPrice":null,
+				            "failureState":null,
+				            "smallTypeID":1037,
+				            "bigTypeID":1013,
+				            "typeName":null,
+				            "parametersList":null,
+				            "brandName":null,
+				            "bigTypeName":null,
+				            "smallTypeName":null,
+				            "tinyTypeName":null,
+				            "activityDiscount":null,
+				            "promotions":null,
+				            "giftType":null,
+				            "userIdentity":null,
+				            "isChecked":false,
+				            "detailTalkFlag":null,
+				            "shopName":null,
+				            "beautyActFlag":null
+				        }
+				    ],
+				    "businessScopeArray":null,
+				    "mobileCode":null,
+				    "shopBannerList":null,
+				    "productionLicence":null,
+				    "hygienicLicense":null,
+				    "taxLicense":null,
+				    "certificateHonor":null,
+				    "productCertification":null,
+				    "provincialAddress":null,
+				    "promotions":null,
+				    "reducedPrice":null,
+				    "normalNum":null
+				},
+				{
+				    "shopID":10131,
+				    "userID":11049,
+				    "name":"深圳市肤白貌美服务有限公司",
+				    "sname":"肤白貌美",
+				    "nameEn":null,
+				    "site":null,
+				    "ledgerNo":null,
+				    "logo":"/userfiles/1/images/photo/2021/01/Cmis21__5o-AaNq1AAEriLZ0RzY342.jpg",
+				    "rebateAmount":0,
+				    "level":null,
+				    "score":null,
+				    "productCount":null,
+				    "legalPerson":null,
+				    "businessLicense":null,
+				    "businessLicenseImage":"https://img-b.caimei365.com/group1/M00/03/20/Cmgy62BG8bSALKXAAAAfYeeBGQU840.jpg",
+				    "taxCertificate":"45654654645654645645645645645654",
+				    "taxCertificateImage":null,
+				    "authorizationCertificateImage":null,
+				    "provinceID":19,
+				    "cityID":202,
+				    "townID":3202,
+				    "address":"高傲新村",
+				    "registeredCapital":null,
+				    "nature":null,
+				    "turnover":null,
+				    "linkMan":"吴小研",
+				    "contractPhone":null,
+				    "contractMobile":"18666666666",
+				    "fax":null,
+				    "zipCode":null,
+				    "linkMan1":"吴小研",
+				    "duty1":null,
+				    "contractPhone1":null,
+				    "contractMobile1":"18666666666",
+				    "contractQQ1":null,
+				    "wechat1":null,
+				    "contractEmail1":"18666666666@qq.com",
+				    "linkMan2":"吴小研",
+				    "duty2":null,
+				    "contractPhone2":null,
+				    "contractMobile2":"18666666666",
+				    "contractQQ2":null,
+				    "wechat2":null,
+				    "contractEmail2":"18666666666@qq.com",
+				    "scope":null,
+				    "info":"45",
+				    "productDesc":"4564",
+				    "lng":null,
+				    "lat":null,
+				    "addTime":"2021-03-09 11:55:39",
+				    "auditStatus":"1",
+				    "auditTime":"2021-03-09 01:43:18",
+				    "auditNote":null,
+				    "favoriteTimes":0,
+				    "validFlag":"1",
+				    "payFlag1":null,
+				    "auditFlag1":null,
+				    "payFlag2":null,
+				    "auditFlag2":null,
+				    "payFlag3":null,
+				    "auditFlag3":null,
+				    "note":null,
+				    "status":90,
+				    "sortIndex":null,
+				    "rate1":null,
+				    "rate2":null,
+				    "masterFlag":null,
+				    "erpFlag":null,
+				    "shopSecret":null,
+				    "masterLogo":null,
+				    "cooperateFlag":null,
+				    "bail":null,
+				    "businessScope":null,
+				    "socialCreditCode":"987654321123456666",
+				    "mainpro":"",
+				    "firstShopType":"1",
+				    "secondShopType":"1",
+				    "medicalPracticeLicenseImg1":null,
+				    "medicalPracticeLicenseImg2":null,
+				    "medicalPracticeLicenseImg3":null,
+				    "bankAccount":null,
+				    "bankAccountName":null,
+				    "bankName":null,
+				    "ableRebateAmount":0,
+				    "totalPrice":35.75,
+				    "productsList":[
+				        {
+				            "productID":6416,
+				            "brandID":1,
+				            "tinyTypeID":1120,
+				            "classifyId":null,
+				            "preferredFlag":null,
+				            "selfTypeID":null,
+				            "shopID":10131,
+				            "name":"【测试用】HydraFacial海菲秀 真空负压 深层洁净",
+				            "aliasName":"【测试用】HydraFacial海菲秀 真空负压 深层洁净",
+				            "searchKey":"##########",
+				            "productRemarks":null,
+				            "normalPrice":35.75,
+				            "price":35.75,
+				            "highestUserLevelPrice":null,
+				            "lowestUserLevelPrice":null,
+				            "lowestUserLevelID":null,
+				            "price0":null,
+				            "price0Grade":null,
+				            "price0Text":null,
+				            "price0TextFlag":null,
+				            "price1":35.75,
+				            "price1Grade":null,
+				            "price1Text":null,
+				            "price1TextFlag":"2",
+				            "price8":null,
+				            "price8Grade":null,
+				            "price8Text":null,
+				            "price8TextFlag":null,
+				            "ladderPriceFlag":"0",
+				            "price2":null,
+				            "price3":null,
+				            "price4":null,
+				            "price5":null,
+				            "price6":null,
+				            "price7":null,
+				            "fee":null,
+				            "stock":100,
+				            "hasSkuFlag":"1",
+				            "mainImage":"https://img-b.caimei365.com/group1/M00/03/20/Cmgy62BHDRGAQGhIAAWEI4ChAUg291.jpg",
+				            "propertiesInfo":null,
+				            "addTime":"2021-03-09 13:52:49",
+				            "updateTime":"2021-03-09 13:52:49",
+				            "classifyAddTime":null,
+				            "sellNumber":0,
+				            "weekSellNumber":null,
+				            "beforeValidFlag":null,
+				            "validFlag":"2",
+				            "favoriteTimes":0,
+				            "commentScore":0,
+				            "commentTimes":0,
+				            "selfRecommendFlag":null,
+				            "sysRecommendFlag":null,
+				            "sortIndex":0,
+				            "featuredFlag":"0",
+				            "featuredSortIndex":null,
+				            "productCode":"sdfsSGZee3336416",
+				            "rate1":null,
+				            "rate2":null,
+				            "unit":"台",
+				            "synToERPFlag":null,
+				            "allAreaFlag":"1",
+				            "provinceIDs":"0",
+				            "serviceNumber":"1",
+				            "maxBuyNumber":null,
+				            "virtualFlag":null,
+				            "minBuyNumber":1,
+				            "packageCount":null,
+				            "byFlag":null,
+				            "normalProductFlag":1,
+				            "wholeSaleProductFlag":null,
+				            "promotionProductFlag":null,
+				            "groupBuyProductFlag":null,
+				            "step":1,
+				            "speCommisionFlag":null,
+				            "speCommision":null,
+				            "videourl":null,
+				            "props":null,
+				            "providers":null,
+				            "serviceCommissionRatio":null,
+				            "reCommissionRatio":null,
+				            "pushToERPName":null,
+				            "prodBeans":null,
+				            "useBeansFlag":null,
+				            "privateFlag":null,
+				            "invisibleServiceProviderIDs":null,
+				            "displayOnCRMFlag":null,
+				            "needServiceFlag":null,
+				            "actFlag":0,
+				            "actStatus":null,
+				            "actSort":null,
+				            "actPrice0":null,
+				            "actPrice1":null,
+				            "actPrice2":null,
+				            "actPrice3":null,
+				            "actPrice4":null,
+				            "actPrice5":null,
+				            "actPrice6":null,
+				            "actPrice7":null,
+				            "actType":null,
+				            "actCreateTime":null,
+				            "actFullReduceAmount":null,
+				            "actReduceAmount":null,
+				            "visibility":"3",
+				            "actFullGiftAmount":null,
+				            "actBuyGiftNum":null,
+				            "beginTime":null,
+				            "endTime":null,
+				            "shopIndexModuleID":null,
+				            "onlineTime":null,
+				            "downlineTime":null,
+				            "freePostFlag":"2",
+				            "crmBigTypeId":null,
+				            "crmSmallTypeId":null,
+				            "costPrice":30,
+				            "costProportional":null,
+				            "costCheckFlag":"1",
+				            "precisehKey":null,
+				            "docBoost":null,
+				            "cmbeanFlag":null,
+				            "cmbeanPrice":null,
+				            "cmbeanSort":null,
+				            "tags":"清洁",
+				            "surplusTime":null,
+				            "productType":"2",
+				            "machineType":"1",
+				            "qualificationImg":"https://img-b.caimei365.com/group1/M00/03/20/Cmgy62BHDL2ADbuIAAlLT8OmIlA825.gif",
+				            "includedTax":"1",
+				            "taxPoint":10,
+				            "supplierTaxPoint":10,
+				            "invoiceType":"2",
+				            "recommendType":"0",
+				            "skuID":null,
+				            "priceType":null,
+				            "combinationID":null,
+				            "combinationSort":null,
+				            "productCategory":"1",
+				            "auditReason":null,
+				            "commodityType":"1",
+				            "retailPrice":35.75,
+				            "discountPrice":null,
+				            "tagsList":null,
+				            "imageList":null,
+				            "productDetail":null,
+				            "productCount":1,
+				            "ladderPriceList":null,
+				            "shop":null,
+				            "sellerCartId":3775,
+				            "productsChecked":false,
+				            "repurchasePriceState":false,
+				            "initProductNum":null,
+				            "totalPrice":null,
+				            "failureState":null,
+				            "smallTypeID":1037,
+				            "bigTypeID":1013,
+				            "typeName":null,
+				            "parametersList":null,
+				            "brandName":null,
+				            "bigTypeName":null,
+				            "smallTypeName":null,
+				            "tinyTypeName":null,
+				            "activityDiscount":null,
+				            "promotions":null,
+				            "giftType":null,
+				            "userIdentity":null,
+				            "isChecked":false,
+				            "detailTalkFlag":null,
+				            "shopName":null,
+				            "beautyActFlag":null
+				        }
+				    ],
+				    "businessScopeArray":null,
+				    "mobileCode":null,
+				    "shopBannerList":null,
+				    "productionLicence":null,
+				    "hygienicLicense":null,
+				    "taxLicense":null,
+				    "certificateHonor":null,
+				    "productCertification":null,
+				    "provincialAddress":null,
+				    "promotions":null,
+				    "reducedPrice":null,
+				    "normalNum":null
+				}
+            ]				
+const productList=[
+                        {
+                            "productID":6421,
+                            "brandID":25,
+                            "tinyTypeID":1120,
+                            "classifyId":null,
+                            "preferredFlag":null,
+                            "selfTypeID":null,
+                            "shopID":10134,
+                            "name":"【测试用】肌本演绎【O4元素破茧疗法】25800 特惠方案",
+                            "aliasName":"【测试用】肌本演绎【O4元素破茧疗法】25800 特惠方案",
+                            "searchKey":"##########",
+                            "productRemarks":null,
+                            "normalPrice":15.25,
+                            "price":15.25,
+                            "highestUserLevelPrice":null,
+                            "lowestUserLevelPrice":null,
+                            "lowestUserLevelID":null,
+                            "price0":null,
+                            "price0Grade":null,
+                            "price0Text":null,
+                            "price0TextFlag":null,
+                            "price1":15.25,
+                            "price1Grade":null,
+                            "price1Text":null,
+                            "price1TextFlag":"2",
+                            "price8":null,
+                            "price8Grade":null,
+                            "price8Text":null,
+                            "price8TextFlag":null,
+                            "ladderPriceFlag":"0",
+                            "price2":null,
+                            "price3":null,
+                            "price4":null,
+                            "price5":null,
+                            "price6":null,
+                            "price7":null,
+                            "fee":null,
+                            "stock":100,
+                            "hasSkuFlag":"1",
+                            "mainImage":"https://img-b.caimei365.com/group1/M00/03/20/Cmgy62BHJGCARS7iAAVlWLR-uKU385.jpg",
+                            "propertiesInfo":null,
+                            "addTime":"2021-03-09 15:32:19",
+                            "updateTime":"2021-03-09 15:32:19",
+                            "classifyAddTime":null,
+                            "sellNumber":0,
+                            "weekSellNumber":null,
+                            "beforeValidFlag":null,
+                            "validFlag":"2",
+                            "favoriteTimes":0,
+                            "commentScore":0,
+                            "commentTimes":0,
+                            "selfRecommendFlag":null,
+                            "sysRecommendFlag":null,
+                            "sortIndex":0,
+                            "featuredFlag":"0",
+                            "featuredSortIndex":null,
+                            "productCode":"sdfsSGZee3336421",
+                            "rate1":null,
+                            "rate2":null,
+                            "unit":"瓶",
+                            "synToERPFlag":null,
+                            "allAreaFlag":"1",
+                            "provinceIDs":"0",
+                            "serviceNumber":"1",
+                            "maxBuyNumber":null,
+                            "virtualFlag":null,
+                            "minBuyNumber":1,
+                            "packageCount":null,
+                            "byFlag":null,
+                            "normalProductFlag":1,
+                            "wholeSaleProductFlag":null,
+                            "promotionProductFlag":null,
+                            "groupBuyProductFlag":null,
+                            "step":1,
+                            "speCommisionFlag":null,
+                            "speCommision":null,
+                            "videourl":null,
+                            "props":null,
+                            "providers":null,
+                            "serviceCommissionRatio":null,
+                            "reCommissionRatio":null,
+                            "pushToERPName":null,
+                            "prodBeans":null,
+                            "useBeansFlag":null,
+                            "privateFlag":null,
+                            "invisibleServiceProviderIDs":null,
+                            "displayOnCRMFlag":null,
+                            "needServiceFlag":null,
+                            "actFlag":0,
+                            "actStatus":null,
+                            "actSort":null,
+                            "actPrice0":null,
+                            "actPrice1":null,
+                            "actPrice2":null,
+                            "actPrice3":null,
+                            "actPrice4":null,
+                            "actPrice5":null,
+                            "actPrice6":null,
+                            "actPrice7":null,
+                            "actType":null,
+                            "actCreateTime":null,
+                            "actFullReduceAmount":null,
+                            "actReduceAmount":null,
+                            "visibility":"3",
+                            "actFullGiftAmount":null,
+                            "actBuyGiftNum":null,
+                            "beginTime":null,
+                            "endTime":null,
+                            "shopIndexModuleID":null,
+                            "onlineTime":null,
+                            "downlineTime":null,
+                            "freePostFlag":"2",
+                            "crmBigTypeId":null,
+                            "crmSmallTypeId":null,
+                            "costPrice":10,
+                            "costProportional":null,
+                            "costCheckFlag":"1",
+                            "precisehKey":null,
+                            "docBoost":null,
+                            "cmbeanFlag":null,
+                            "cmbeanPrice":null,
+                            "cmbeanSort":null,
+                            "tags":"注射",
+                            "surplusTime":null,
+                            "productType":"1",
+                            "machineType":"",
+                            "qualificationImg":"",
+                            "includedTax":"0",
+                            "taxPoint":10,
+                            "supplierTaxPoint":10,
+                            "invoiceType":"3",
+                            "recommendType":"0",
+                            "skuID":null,
+                            "priceType":null,
+                            "combinationID":null,
+                            "combinationSort":null,
+                            "productCategory":"1",
+                            "auditReason":null,
+                            "commodityType":"1",
+                            "retailPrice":15.25,
+                            "discountPrice":null,
+                            "tagsList":null,
+                            "imageList":null,
+                            "productDetail":null,
+                            "productCount":1,
+                            "ladderPriceList":null,
+                            "shop":null,
+                            "sellerCartId":3771,
+                            "productsChecked":false,
+                            "repurchasePriceState":false,
+                            "initProductNum":null,
+                            "totalPrice":null,
+                            "failureState":null,
+                            "smallTypeID":1037,
+                            "bigTypeID":1013,
+                            "typeName":null,
+                            "parametersList":null,
+                            "brandName":null,
+                            "bigTypeName":null,
+                            "smallTypeName":null,
+                            "tinyTypeName":null,
+                            "activityDiscount":null,
+                            "promotions":null,
+                            "giftType":null,
+                            "userIdentity":null,
+                            "isChecked":false,
+                            "detailTalkFlag":null,
+                            "shopName":null,
+                            "beautyActFlag":null
+                        },
+						{
+						    "productID":6421,
+						    "brandID":25,
+						    "tinyTypeID":1120,
+						    "classifyId":null,
+						    "preferredFlag":null,
+						    "selfTypeID":null,
+						    "shopID":10134,
+						    "name":"【测试用】肌本演绎【O4元素破茧疗法】25800 特惠方案",
+						    "aliasName":"【测试用】肌本演绎【O4元素破茧疗法】25800 特惠方案",
+						    "searchKey":"##########",
+						    "productRemarks":null,
+						    "normalPrice":15.25,
+						    "price":15.25,
+						    "highestUserLevelPrice":null,
+						    "lowestUserLevelPrice":null,
+						    "lowestUserLevelID":null,
+						    "price0":null,
+						    "price0Grade":null,
+						    "price0Text":null,
+						    "price0TextFlag":null,
+						    "price1":15.25,
+						    "price1Grade":null,
+						    "price1Text":null,
+						    "price1TextFlag":"2",
+						    "price8":null,
+						    "price8Grade":null,
+						    "price8Text":null,
+						    "price8TextFlag":null,
+						    "ladderPriceFlag":"0",
+						    "price2":null,
+						    "price3":null,
+						    "price4":null,
+						    "price5":null,
+						    "price6":null,
+						    "price7":null,
+						    "fee":null,
+						    "stock":100,
+						    "hasSkuFlag":"1",
+						    "mainImage":"https://img-b.caimei365.com/group1/M00/03/20/Cmgy62BHJGCARS7iAAVlWLR-uKU385.jpg",
+						    "propertiesInfo":null,
+						    "addTime":"2021-03-09 15:32:19",
+						    "updateTime":"2021-03-09 15:32:19",
+						    "classifyAddTime":null,
+						    "sellNumber":0,
+						    "weekSellNumber":null,
+						    "beforeValidFlag":null,
+						    "validFlag":"2",
+						    "favoriteTimes":0,
+						    "commentScore":0,
+						    "commentTimes":0,
+						    "selfRecommendFlag":null,
+						    "sysRecommendFlag":null,
+						    "sortIndex":0,
+						    "featuredFlag":"0",
+						    "featuredSortIndex":null,
+						    "productCode":"sdfsSGZee3336421",
+						    "rate1":null,
+						    "rate2":null,
+						    "unit":"瓶",
+						    "synToERPFlag":null,
+						    "allAreaFlag":"1",
+						    "provinceIDs":"0",
+						    "serviceNumber":"1",
+						    "maxBuyNumber":null,
+						    "virtualFlag":null,
+						    "minBuyNumber":1,
+						    "packageCount":null,
+						    "byFlag":null,
+						    "normalProductFlag":1,
+						    "wholeSaleProductFlag":null,
+						    "promotionProductFlag":null,
+						    "groupBuyProductFlag":null,
+						    "step":1,
+						    "speCommisionFlag":null,
+						    "speCommision":null,
+						    "videourl":null,
+						    "props":null,
+						    "providers":null,
+						    "serviceCommissionRatio":null,
+						    "reCommissionRatio":null,
+						    "pushToERPName":null,
+						    "prodBeans":null,
+						    "useBeansFlag":null,
+						    "privateFlag":null,
+						    "invisibleServiceProviderIDs":null,
+						    "displayOnCRMFlag":null,
+						    "needServiceFlag":null,
+						    "actFlag":0,
+						    "actStatus":null,
+						    "actSort":null,
+						    "actPrice0":null,
+						    "actPrice1":null,
+						    "actPrice2":null,
+						    "actPrice3":null,
+						    "actPrice4":null,
+						    "actPrice5":null,
+						    "actPrice6":null,
+						    "actPrice7":null,
+						    "actType":null,
+						    "actCreateTime":null,
+						    "actFullReduceAmount":null,
+						    "actReduceAmount":null,
+						    "visibility":"3",
+						    "actFullGiftAmount":null,
+						    "actBuyGiftNum":null,
+						    "beginTime":null,
+						    "endTime":null,
+						    "shopIndexModuleID":null,
+						    "onlineTime":null,
+						    "downlineTime":null,
+						    "freePostFlag":"2",
+						    "crmBigTypeId":null,
+						    "crmSmallTypeId":null,
+						    "costPrice":10,
+						    "costProportional":null,
+						    "costCheckFlag":"1",
+						    "precisehKey":null,
+						    "docBoost":null,
+						    "cmbeanFlag":null,
+						    "cmbeanPrice":null,
+						    "cmbeanSort":null,
+						    "tags":"注射",
+						    "surplusTime":null,
+						    "productType":"1",
+						    "machineType":"",
+						    "qualificationImg":"",
+						    "includedTax":"0",
+						    "taxPoint":10,
+						    "supplierTaxPoint":10,
+						    "invoiceType":"3",
+						    "recommendType":"0",
+						    "skuID":null,
+						    "priceType":null,
+						    "combinationID":null,
+						    "combinationSort":null,
+						    "productCategory":"1",
+						    "auditReason":null,
+						    "commodityType":"1",
+						    "retailPrice":15.25,
+						    "discountPrice":null,
+						    "tagsList":null,
+						    "imageList":null,
+						    "productDetail":null,
+						    "productCount":1,
+						    "ladderPriceList":null,
+						    "shop":null,
+						    "sellerCartId":3771,
+						    "productsChecked":false,
+						    "repurchasePriceState":false,
+						    "initProductNum":null,
+						    "totalPrice":null,
+						    "failureState":null,
+						    "smallTypeID":1037,
+						    "bigTypeID":1013,
+						    "typeName":null,
+						    "parametersList":null,
+						    "brandName":null,
+						    "bigTypeName":null,
+						    "smallTypeName":null,
+						    "tinyTypeName":null,
+						    "activityDiscount":null,
+						    "promotions":null,
+						    "giftType":null,
+						    "userIdentity":null,
+						    "isChecked":false,
+						    "detailTalkFlag":null,
+						    "shopName":null,
+						    "beautyActFlag":null
+						},
+						{
+						    "productID":6421,
+						    "brandID":25,
+						    "tinyTypeID":1120,
+						    "classifyId":null,
+						    "preferredFlag":null,
+						    "selfTypeID":null,
+						    "shopID":10134,
+						    "name":"【测试用】肌本演绎【O4元素破茧疗法】25800 特惠方案",
+						    "aliasName":"【测试用】肌本演绎【O4元素破茧疗法】25800 特惠方案",
+						    "searchKey":"##########",
+						    "productRemarks":null,
+						    "normalPrice":15.25,
+						    "price":15.25,
+						    "highestUserLevelPrice":null,
+						    "lowestUserLevelPrice":null,
+						    "lowestUserLevelID":null,
+						    "price0":null,
+						    "price0Grade":null,
+						    "price0Text":null,
+						    "price0TextFlag":null,
+						    "price1":15.25,
+						    "price1Grade":null,
+						    "price1Text":null,
+						    "price1TextFlag":"2",
+						    "price8":null,
+						    "price8Grade":null,
+						    "price8Text":null,
+						    "price8TextFlag":null,
+						    "ladderPriceFlag":"0",
+						    "price2":null,
+						    "price3":null,
+						    "price4":null,
+						    "price5":null,
+						    "price6":null,
+						    "price7":null,
+						    "fee":null,
+						    "stock":100,
+						    "hasSkuFlag":"1",
+						    "mainImage":"https://img-b.caimei365.com/group1/M00/03/20/Cmgy62BHJGCARS7iAAVlWLR-uKU385.jpg",
+						    "propertiesInfo":null,
+						    "addTime":"2021-03-09 15:32:19",
+						    "updateTime":"2021-03-09 15:32:19",
+						    "classifyAddTime":null,
+						    "sellNumber":0,
+						    "weekSellNumber":null,
+						    "beforeValidFlag":null,
+						    "validFlag":"2",
+						    "favoriteTimes":0,
+						    "commentScore":0,
+						    "commentTimes":0,
+						    "selfRecommendFlag":null,
+						    "sysRecommendFlag":null,
+						    "sortIndex":0,
+						    "featuredFlag":"0",
+						    "featuredSortIndex":null,
+						    "productCode":"sdfsSGZee3336421",
+						    "rate1":null,
+						    "rate2":null,
+						    "unit":"瓶",
+						    "synToERPFlag":null,
+						    "allAreaFlag":"1",
+						    "provinceIDs":"0",
+						    "serviceNumber":"1",
+						    "maxBuyNumber":null,
+						    "virtualFlag":null,
+						    "minBuyNumber":1,
+						    "packageCount":null,
+						    "byFlag":null,
+						    "normalProductFlag":1,
+						    "wholeSaleProductFlag":null,
+						    "promotionProductFlag":null,
+						    "groupBuyProductFlag":null,
+						    "step":1,
+						    "speCommisionFlag":null,
+						    "speCommision":null,
+						    "videourl":null,
+						    "props":null,
+						    "providers":null,
+						    "serviceCommissionRatio":null,
+						    "reCommissionRatio":null,
+						    "pushToERPName":null,
+						    "prodBeans":null,
+						    "useBeansFlag":null,
+						    "privateFlag":null,
+						    "invisibleServiceProviderIDs":null,
+						    "displayOnCRMFlag":null,
+						    "needServiceFlag":null,
+						    "actFlag":0,
+						    "actStatus":null,
+						    "actSort":null,
+						    "actPrice0":null,
+						    "actPrice1":null,
+						    "actPrice2":null,
+						    "actPrice3":null,
+						    "actPrice4":null,
+						    "actPrice5":null,
+						    "actPrice6":null,
+						    "actPrice7":null,
+						    "actType":null,
+						    "actCreateTime":null,
+						    "actFullReduceAmount":null,
+						    "actReduceAmount":null,
+						    "visibility":"3",
+						    "actFullGiftAmount":null,
+						    "actBuyGiftNum":null,
+						    "beginTime":null,
+						    "endTime":null,
+						    "shopIndexModuleID":null,
+						    "onlineTime":null,
+						    "downlineTime":null,
+						    "freePostFlag":"2",
+						    "crmBigTypeId":null,
+						    "crmSmallTypeId":null,
+						    "costPrice":10,
+						    "costProportional":null,
+						    "costCheckFlag":"1",
+						    "precisehKey":null,
+						    "docBoost":null,
+						    "cmbeanFlag":null,
+						    "cmbeanPrice":null,
+						    "cmbeanSort":null,
+						    "tags":"注射",
+						    "surplusTime":null,
+						    "productType":"1",
+						    "machineType":"",
+						    "qualificationImg":"",
+						    "includedTax":"0",
+						    "taxPoint":10,
+						    "supplierTaxPoint":10,
+						    "invoiceType":"3",
+						    "recommendType":"0",
+						    "skuID":null,
+						    "priceType":null,
+						    "combinationID":null,
+						    "combinationSort":null,
+						    "productCategory":"1",
+						    "auditReason":null,
+						    "commodityType":"1",
+						    "retailPrice":15.25,
+						    "discountPrice":null,
+						    "tagsList":null,
+						    "imageList":null,
+						    "productDetail":null,
+						    "productCount":1,
+						    "ladderPriceList":null,
+						    "shop":null,
+						    "sellerCartId":3771,
+						    "productsChecked":false,
+						    "repurchasePriceState":false,
+						    "initProductNum":null,
+						    "totalPrice":null,
+						    "failureState":null,
+						    "smallTypeID":1037,
+						    "bigTypeID":1013,
+						    "typeName":null,
+						    "parametersList":null,
+						    "brandName":null,
+						    "bigTypeName":null,
+						    "smallTypeName":null,
+						    "tinyTypeName":null,
+						    "activityDiscount":null,
+						    "promotions":null,
+						    "giftType":null,
+						    "userIdentity":null,
+						    "isChecked":false,
+						    "detailTalkFlag":null,
+						    "shopName":null,
+						    "beautyActFlag":null
+						},
+                        {
+                            "productID":6420,
+                            "brandID":25,
+                            "tinyTypeID":null,
+                            "classifyId":null,
+                            "preferredFlag":null,
+                            "selfTypeID":null,
+                            "shopID":10134,
+                            "name":"【测试用】润百颜注射修饰透明质酸钠凝胶1ml",
+                            "aliasName":"【测试用】润百颜注射修饰透明质酸钠凝胶1ml",
+                            "searchKey":"##########",
+                            "productRemarks":null,
+                            "normalPrice":25.75,
+                            "price":25.75,
+                            "highestUserLevelPrice":null,
+                            "lowestUserLevelPrice":null,
+                            "lowestUserLevelID":null,
+                            "price0":null,
+                            "price0Grade":null,
+                            "price0Text":null,
+                            "price0TextFlag":null,
+                            "price1":25.75,
+                            "price1Grade":null,
+                            "price1Text":null,
+                            "price1TextFlag":"2",
+                            "price8":null,
+                            "price8Grade":null,
+                            "price8Text":null,
+                            "price8TextFlag":null,
+                            "ladderPriceFlag":"0",
+                            "price2":null,
+                            "price3":null,
+                            "price4":null,
+                            "price5":null,
+                            "price6":null,
+                            "price7":null,
+                            "fee":null,
+                            "stock":100,
+                            "hasSkuFlag":"1",
+                            "mainImage":"https://img-b.caimei365.com/group1/M00/03/20/Cmgy62BHIIWATL05AAGHUpelz2U374.jpg",
+                            "propertiesInfo":null,
+                            "addTime":"2021-03-09 15:15:45",
+                            "updateTime":"2021-03-09 15:15:45",
+                            "classifyAddTime":null,
+                            "sellNumber":0,
+                            "weekSellNumber":null,
+                            "beforeValidFlag":null,
+                            "validFlag":"2",
+                            "favoriteTimes":0,
+                            "commentScore":0,
+                            "commentTimes":0,
+                            "selfRecommendFlag":null,
+                            "sysRecommendFlag":null,
+                            "sortIndex":0,
+                            "featuredFlag":"0",
+                            "featuredSortIndex":null,
+                            "productCode":"kscz6420",
+                            "rate1":null,
+                            "rate2":null,
+                            "unit":"盒",
+                            "synToERPFlag":null,
+                            "allAreaFlag":"1",
+                            "provinceIDs":"0",
+                            "serviceNumber":"1",
+                            "maxBuyNumber":null,
+                            "virtualFlag":null,
+                            "minBuyNumber":1,
+                            "packageCount":null,
+                            "byFlag":null,
+                            "normalProductFlag":1,
+                            "wholeSaleProductFlag":null,
+                            "promotionProductFlag":null,
+                            "groupBuyProductFlag":null,
+                            "step":1,
+                            "speCommisionFlag":null,
+                            "speCommision":null,
+                            "videourl":null,
+                            "props":null,
+                            "providers":null,
+                            "serviceCommissionRatio":null,
+                            "reCommissionRatio":null,
+                            "pushToERPName":null,
+                            "prodBeans":null,
+                            "useBeansFlag":null,
+                            "privateFlag":null,
+                            "invisibleServiceProviderIDs":null,
+                            "displayOnCRMFlag":null,
+                            "needServiceFlag":null,
+                            "actFlag":0,
+                            "actStatus":null,
+                            "actSort":null,
+                            "actPrice0":null,
+                            "actPrice1":null,
+                            "actPrice2":null,
+                            "actPrice3":null,
+                            "actPrice4":null,
+                            "actPrice5":null,
+                            "actPrice6":null,
+                            "actPrice7":null,
+                            "actType":null,
+                            "actCreateTime":null,
+                            "actFullReduceAmount":null,
+                            "actReduceAmount":null,
+                            "visibility":"3",
+                            "actFullGiftAmount":null,
+                            "actBuyGiftNum":null,
+                            "beginTime":null,
+                            "endTime":null,
+                            "shopIndexModuleID":null,
+                            "onlineTime":null,
+                            "downlineTime":null,
+                            "freePostFlag":"2",
+                            "crmBigTypeId":null,
+                            "crmSmallTypeId":null,
+                            "costPrice":20,
+                            "costProportional":null,
+                            "costCheckFlag":"1",
+                            "precisehKey":null,
+                            "docBoost":null,
+                            "cmbeanFlag":null,
+                            "cmbeanPrice":null,
+                            "cmbeanSort":null,
+                            "tags":"注射",
+                            "surplusTime":null,
+                            "productType":"1",
+                            "machineType":"",
+                            "qualificationImg":"",
+                            "includedTax":"0",
+                            "taxPoint":10,
+                            "supplierTaxPoint":10,
+                            "invoiceType":"2",
+                            "recommendType":"0",
+                            "skuID":null,
+                            "priceType":null,
+                            "combinationID":null,
+                            "combinationSort":null,
+                            "productCategory":"1",
+                            "auditReason":null,
+                            "commodityType":"1",
+                            "retailPrice":28.325,
+                            "discountPrice":null,
+                            "tagsList":null,
+                            "imageList":null,
+                            "productDetail":null,
+                            "productCount":1,
+                            "ladderPriceList":null,
+                            "shop":null,
+                            "sellerCartId":3772,
+                            "productsChecked":false,
+                            "repurchasePriceState":false,
+                            "initProductNum":null,
+                            "totalPrice":null,
+                            "failureState":null,
+                            "smallTypeID":null,
+                            "bigTypeID":1014,
+                            "typeName":null,
+                            "parametersList":null,
+                            "brandName":null,
+                            "bigTypeName":null,
+                            "smallTypeName":null,
+                            "tinyTypeName":null,
+                            "activityDiscount":null,
+                            "promotions":null,
+                            "giftType":null,
+                            "userIdentity":null,
+                            "isChecked":false,
+                            "detailTalkFlag":null,
+                            "shopName":null,
+                            "beautyActFlag":null
+                        },
+                        {
+                            "productID":6419,
+                            "brandID":1,
+                            "tinyTypeID":null,
+                            "classifyId":null,
+                            "preferredFlag":null,
+                            "selfTypeID":null,
+                            "shopID":10134,
+                            "name":"【测试用】Dermaheal HSR 德玛莉肌活丝蕴凝颜精华液",
+                            "aliasName":"【测试用】Dermaheal HSR 德玛莉肌活丝蕴凝颜精华液",
+                            "searchKey":"##########",
+                            "productRemarks":null,
+                            "normalPrice":25.25,
+                            "price":25.25,
+                            "highestUserLevelPrice":null,
+                            "lowestUserLevelPrice":null,
+                            "lowestUserLevelID":null,
+                            "price0":null,
+                            "price0Grade":null,
+                            "price0Text":null,
+                            "price0TextFlag":null,
+                            "price1":25.25,
+                            "price1Grade":null,
+                            "price1Text":null,
+                            "price1TextFlag":"2",
+                            "price8":null,
+                            "price8Grade":null,
+                            "price8Text":null,
+                            "price8TextFlag":null,
+                            "ladderPriceFlag":"0",
+                            "price2":null,
+                            "price3":null,
+                            "price4":null,
+                            "price5":null,
+                            "price6":null,
+                            "price7":null,
+                            "fee":null,
+                            "stock":200,
+                            "hasSkuFlag":"1",
+                            "mainImage":"https://img-b.caimei365.com/group1/M00/03/20/Cmgy62BHH8aAFiGIAAGHr5DovGA124.jpg",
+                            "propertiesInfo":null,
+                            "addTime":"2021-03-09 15:12:28",
+                            "updateTime":"2021-03-09 15:12:28",
+                            "classifyAddTime":null,
+                            "sellNumber":0,
+                            "weekSellNumber":null,
+                            "beforeValidFlag":null,
+                            "validFlag":"2",
+                            "favoriteTimes":0,
+                            "commentScore":0,
+                            "commentTimes":0,
+                            "selfRecommendFlag":null,
+                            "sysRecommendFlag":null,
+                            "sortIndex":0,
+                            "featuredFlag":"0",
+                            "featuredSortIndex":null,
+                            "productCode":"FWLCP6419",
+                            "rate1":null,
+                            "rate2":null,
+                            "unit":"片",
+                            "synToERPFlag":null,
+                            "allAreaFlag":"1",
+                            "provinceIDs":"0",
+                            "serviceNumber":"1",
+                            "maxBuyNumber":null,
+                            "virtualFlag":null,
+                            "minBuyNumber":1,
+                            "packageCount":null,
+                            "byFlag":null,
+                            "normalProductFlag":1,
+                            "wholeSaleProductFlag":null,
+                            "promotionProductFlag":null,
+                            "groupBuyProductFlag":null,
+                            "step":1,
+                            "speCommisionFlag":null,
+                            "speCommision":null,
+                            "videourl":null,
+                            "props":null,
+                            "providers":null,
+                            "serviceCommissionRatio":null,
+                            "reCommissionRatio":null,
+                            "pushToERPName":null,
+                            "prodBeans":null,
+                            "useBeansFlag":null,
+                            "privateFlag":null,
+                            "invisibleServiceProviderIDs":null,
+                            "displayOnCRMFlag":null,
+                            "needServiceFlag":null,
+                            "actFlag":0,
+                            "actStatus":null,
+                            "actSort":null,
+                            "actPrice0":null,
+                            "actPrice1":null,
+                            "actPrice2":null,
+                            "actPrice3":null,
+                            "actPrice4":null,
+                            "actPrice5":null,
+                            "actPrice6":null,
+                            "actPrice7":null,
+                            "actType":null,
+                            "actCreateTime":null,
+                            "actFullReduceAmount":null,
+                            "actReduceAmount":null,
+                            "visibility":"3",
+                            "actFullGiftAmount":null,
+                            "actBuyGiftNum":null,
+                            "beginTime":null,
+                            "endTime":null,
+                            "shopIndexModuleID":null,
+                            "onlineTime":null,
+                            "downlineTime":null,
+                            "freePostFlag":"2",
+                            "crmBigTypeId":null,
+                            "crmSmallTypeId":null,
+                            "costPrice":20,
+                            "costProportional":null,
+                            "costCheckFlag":"1",
+                            "precisehKey":null,
+                            "docBoost":null,
+                            "cmbeanFlag":null,
+                            "cmbeanPrice":null,
+                            "cmbeanSort":null,
+                            "tags":"面膜",
+                            "surplusTime":null,
+                            "productType":"1",
+                            "machineType":"",
+                            "qualificationImg":"",
+                            "includedTax":"0",
+                            "taxPoint":13,
+                            "supplierTaxPoint":13,
+                            "invoiceType":"1",
+                            "recommendType":"0",
+                            "skuID":null,
+                            "priceType":null,
+                            "combinationID":null,
+                            "combinationSort":null,
+                            "productCategory":"1",
+                            "auditReason":null,
+                            "commodityType":"1",
+                            "retailPrice":28.5325,
+                            "discountPrice":null,
+                            "tagsList":null,
+                            "imageList":null,
+                            "productDetail":null,
+                            "productCount":1,
+                            "ladderPriceList":null,
+                            "shop":null,
+                            "sellerCartId":3773,
+                            "productsChecked":false,
+                            "repurchasePriceState":false,
+                            "initProductNum":null,
+                            "totalPrice":null,
+                            "failureState":null,
+                            "smallTypeID":null,
+                            "bigTypeID":1018,
+                            "typeName":null,
+                            "parametersList":null,
+                            "brandName":null,
+                            "bigTypeName":null,
+                            "smallTypeName":null,
+                            "tinyTypeName":null,
+                            "activityDiscount":null,
+                            "promotions":null,
+                            "giftType":null,
+                            "userIdentity":null,
+                            "isChecked":false,
+                            "detailTalkFlag":null,
+                            "shopName":null,
+                            "beautyActFlag":null
+                        }
+                    ]			
+const orderDataList = [
+            {
+                "orderID":15212,
+                "orderNo":"X161613565411068",
+                "organizeID":0,
+                "userID":11063,
+                "buyUserID":11062,
+                "shopOrderIDs":"19376",
+                "orderSubmitType":3,
+                "orderType":0,
+                "hasActProduct":"1",
+                "autoCloseTimeMills":0,
+                "status":"0",
+                "receiptStatus":"1",
+                "payStatus":"1",
+                "sendOutStatus":"1",
+                "refundType":"0",
+                "paySuccessCounter":0,
+                "payFlag":"0",
+                "onlinePayFlag":"0",
+                "productTotalFee":500,
+                "orderTotalFee":500,
+                "payTotalFee":500,
+                "payableAmount":500,
+                "balancePayFee":0,
+                "preferential":0,
+                "discountFee":0,
+                "promotionFullReduction":0,
+                "spID":1401,
+                "mainSpID":1304,
+                "note":null,
+                "clubID":5638,
+                "clubScanTime":null,
+                "payWay":null,
+                "orderSource":"6",
+                "closeTime":null,
+                "confirmTime":null,
+                "payTime":null,
+                "orderTime":"2021-03-19 14:34:14",
+                "productCount":1,
+                "presentCount":0,
+                "promotionalGiftsCount":0,
+                "cooFreeFlag":"0",
+                "cooFreeRate":0,
+                "cooFreeAmount":0,
+                "invoiceFlag":"0",
+                "confirmFlag":"0",
+                "clauseID":1,
+                "clauseContent":null,
+                "clauseName":"无条款",
+                "updateDate":"2021-03-19 14:34:14",
+                "freePostFlag":"-1",
+                "freight":0,
+                "delFlag":"0",
+                "freePostageTicketID":null,
+                "splitFlag":"1",
+                "closeReason":null,
+                "postageOrderFlag":"0",
+                "thirdPartyOrderNo":null,
+                "secondHandOrderFlag":"0",
+                "affirmPaymentFlag":"0",
+                "rebateFlag":"0",
+                "zeroCostFlag":0,
+                "orderState":null,
+                "orderMark":null,
+                "receiptAmount":0,
+                "pendingPayments":500,
+                "returnedPurchaseFee":null,
+                "shopOrderList":[
+                    {
+                        "shopOrderID":19376,
+                        "shopOrderNo":"X16161356541106801",
+                        "orderNo":"X161613565411068",
+                        "orderID":15212,
+                        "organizeID":null,
+                        "userID":11063,
+                        "shopID":1186,
+                        "orderPromotionsId":null,
+                        "orderType":0,
+                        "orderSubmitType":3,
+                        "presentNum":0,
+                        "itemCount":1,
+                        "outStoreNum":0,
+                        "outStoreTimes":0,
+                        "townID":null,
+                        "note":"",
+                        "fee":-1,
+                        "accountAmount":0,
+                        "productAmount":8500,
+                        "totalAmount":500,
+                        "needPayAmount":500,
+                        "discountAmount":null,
+                        "discountFee":0,
+                        "preferential":0,
+                        "promotionFullReduction":0,
+                        "payFlag":"0",
+                        "orderTime":"2021-03-19 14:34:14",
+                        "payTime":null,
+                        "finishTime":null,
+                        "autoOverTimeMills":null,
+                        "status":1,
+                        "payStatus":"1",
+                        "sendOutStatus":"1",
+                        "refundStatus":0,
+                        "returnGoodsStatus":null,
+                        "receiveGoodsTime":null,
+                        "autoReceiveTimeMills":null,
+                        "totalAddedValueTax":null,
+                        "canRefundAmount":500,
+                        "refundAmount":null,
+                        "clubID":5638,
+                        "spID":1401,
+                        "mainSpID":1304,
+                        "orderBeanAmount":0,
+                        "useBeanAmount":0,
+                        "useBeanFlag":0,
+                        "canRefundFlag":1,
+                        "useBalanceFlag":0,
+                        "canRefundBeans":null,
+                        "freePostageFee":null,
+                        "freePostageTicketID":null,
+                        "brokerage":1090,
+                        "delFlag":"0",
+                        "refundsAmount":0,
+                        "orderStatusFlag":"1",
+                        "buyStatus":"1",
+                        "deliveryTimeMills":null,
+                        "orderDeliveryID":null,
+                        "splitFlag":"0",
+                        "receiptedFlag":null,
+                        "receiptedType":null,
+                        "paying":"0",
+                        "shopProductAmount":7410,
+                        "shopPostFee":0,
+                        "shopTaxFee":0,
+                        "shouldPayShopAmount":7410,
+                        "payedShopAmount":0,
+                        "shopOtherFee":0,
+                        "refunding":null,
+                        "costType":null,
+                        "proportional":null,
+                        "modifyShouldPayNote":null,
+                        "modifyShouldPayUserID":null,
+                        "modifyShouldPayDate":null,
+                        "zeroCostFlag":0,
+                        "shopName":"北京嘉盛壹美科技有限公司",
+                        "shopLogo":"https://www-b.caimei365.com/img/default/suppliver.jpg",
+                        "logisticsRecordList":null,
+                        "orderProductList":[
+                            {
+                                "orderProductID":29361,
+                                "orderNo":"X161613565411068",
+                                "orderID":15212,
+                                "shopOrderID":19376,
+                                "shopOrderNo":"X16161356541106801",
+                                "shopID":1186,
+                                "productID":3957,
+                                "organizeProductID":null,
+                                "organizeID":null,
+                                "num":1,
+                                "presentNum":0,
+                                "outStoreType":null,
+                                "skuID":null,
+                                "props":null,
+                                "propName":null,
+                                "productNo":null,
+                                "price":8500,
+                                "normalPrice":10000,
+                                "costPrice":7410,
+                                "price0":8500,
+                                "price1":8500,
+                                "totalAmount":8500,
+                                "totalFee":500,
+                                "shouldPayFee":500,
+                                "discount":100,
+                                "discountPrice":8500,
+                                "includedTax":"2",
+                                "invoiceType":"3",
+                                "taxRate":0,
+                                "supplierTaxRate":0,
+                                "addedValueTax":0,
+                                "totalAddedValueTax":0,
+                                "shouldPayTotalTax":0,
+                                "singleShouldPayTotalTax":0,
+                                "shopProductAmount":7410,
+                                "shopFee":7410,
+                                "otherFee":0,
+                                "cmFee":1090,
+                                "singleShopFee":7410,
+                                "singleOtherFee":0,
+                                "singleCmFee":1090,
+                                "status":null,
+                                "commentFlag":"0",
+                                "totalBeans":0,
+                                "useBalanceAmount":0,
+                                "useBeanAmount":null,
+                                "notOutStore":1,
+                                "cmbeanPrice":null,
+                                "isActProduct":"1",
+                                "isGiftProduct":"0",
+                                "productActInfo":null,
+                                "buyAgainFlag":"0",
+                                "confirmProductFlag":"0",
+                                "payStatus":"0",
+                                "shopName":"北京嘉盛壹美科技有限公司",
+                                "name":"A-ONE TAB with wifi检测仪 面部检测仪",
+                                "productUnit":"台",
+                                "productImage":"https://img.caimei365.com/group1/M00/00/8A/Cmis2FpfAGOAaCQfAACFGx9pRi496.JPEG",
+                                "actType":null,
+                                "actPreferential":0,
+                                "productType":"0",
+                                "orderPromotionsId":397,
+                                "preferential":0,
+                                "discountFee":0,
+                                "cancelNum":null,
+                                "ladderPriceFlag":0,
+                                "shipmentsNum":null,
+                                "returnedNum":null,
+                                "actualCancelNum":null,
+                                "aliasName":null,
+                                "productCategory":"1",
+                                "secondHandType":null,
+                                "productPromotion":{
+                                    "id":397,
+                                    "name":"优惠价",
+                                    "description":null,
+                                    "type":1,
+                                    "mode":1,
+                                    "touchPrice":500,
+                                    "reducedPrice":null,
+                                    "beginTime":null,
+                                    "endTime":null,
+                                    "status":1,
+                                    "supplierId":null,
+                                    "productId":null,
+                                    "orderId":15212,
+                                    "productList":null,
+                                    "giftList":null,
+                                    "products":null
+                                },
+                                "includedTaxFlag":null
+                            }
+                        ],
+                        "userInfo":null,
+                        "name":null,
+                        "receiptStatus":null,
+                        "shopPromotion":null,
+                        "shouHuoRen":null
+                    }
+                ],
+                "clubName":"正经一点机构",
+                "invoiceStatus":false,
+                "payButton":true,
+                "expensesOfTaxation":null
+            },
+            {
+                "orderID":15211,
+                "orderNo":"X161613560870120",
+                "organizeID":0,
+                "userID":11063,
+                "buyUserID":11062,
+                "shopOrderIDs":"19375",
+                "orderSubmitType":3,
+                "orderType":0,
+                "hasActProduct":"1",
+                "autoCloseTimeMills":0,
+                "status":"0",
+                "receiptStatus":"1",
+                "payStatus":"1",
+                "sendOutStatus":"1",
+                "refundType":"0",
+                "paySuccessCounter":0,
+                "payFlag":"0",
+                "onlinePayFlag":"0",
+                "productTotalFee":275008.8,
+                "orderTotalFee":275008.8,
+                "payTotalFee":275008.8,
+                "payableAmount":275008.8,
+                "balancePayFee":0,
+                "preferential":0,
+                "discountFee":0,
+                "promotionFullReduction":0,
+                "spID":1401,
+                "mainSpID":1304,
+                "note":null,
+                "clubID":5638,
+                "clubScanTime":null,
+                "payWay":null,
+                "orderSource":"6",
+                "closeTime":null,
+                "confirmTime":null,
+                "payTime":null,
+                "orderTime":"2021-03-19 14:33:28",
+                "productCount":1,
+                "presentCount":0,
+                "promotionalGiftsCount":0,
+                "cooFreeFlag":"0",
+                "cooFreeRate":0,
+                "cooFreeAmount":0,
+                "invoiceFlag":"0",
+                "confirmFlag":"0",
+                "clauseID":1,
+                "clauseContent":null,
+                "clauseName":"无条款",
+                "updateDate":"2021-03-19 14:33:28",
+                "freePostFlag":"-1",
+                "freight":0,
+                "delFlag":"0",
+                "freePostageTicketID":null,
+                "splitFlag":"1",
+                "closeReason":null,
+                "postageOrderFlag":"0",
+                "thirdPartyOrderNo":null,
+                "secondHandOrderFlag":"0",
+                "affirmPaymentFlag":"0",
+                "rebateFlag":"0",
+                "zeroCostFlag":0,
+                "orderState":null,
+                "orderMark":null,
+                "receiptAmount":0,
+                "pendingPayments":275008.8,
+                "returnedPurchaseFee":null,
+                "shopOrderList":[
+                    {
+                        "shopOrderID":19375,
+                        "shopOrderNo":"X16161356087012001",
+                        "orderNo":"X161613560870120",
+                        "orderID":15211,
+                        "organizeID":null,
+                        "userID":11063,
+                        "shopID":1001,
+                        "orderPromotionsId":null,
+                        "orderType":0,
+                        "orderSubmitType":3,
+                        "presentNum":0,
+                        "itemCount":1,
+                        "outStoreNum":0,
+                        "outStoreTimes":0,
+                        "townID":null,
+                        "note":"",
+                        "fee":-1,
+                        "accountAmount":0,
+                        "productAmount":250008,
+                        "totalAmount":275008.8,
+                        "needPayAmount":275008.8,
+                        "discountAmount":null,
+                        "discountFee":0,
+                        "preferential":0,
+                        "promotionFullReduction":0,
+                        "payFlag":"0",
+                        "orderTime":"2021-03-19 14:33:28",
+                        "payTime":null,
+                        "finishTime":null,
+                        "autoOverTimeMills":null,
+                        "status":1,
+                        "payStatus":"1",
+                        "sendOutStatus":"1",
+                        "refundStatus":0,
+                        "returnGoodsStatus":null,
+                        "receiveGoodsTime":null,
+                        "autoReceiveTimeMills":null,
+                        "totalAddedValueTax":null,
+                        "canRefundAmount":275009,
+                        "refundAmount":null,
+                        "clubID":5638,
+                        "spID":1401,
+                        "mainSpID":1304,
+                        "orderBeanAmount":0,
+                        "useBeanAmount":0,
+                        "useBeanFlag":0,
+                        "canRefundFlag":1,
+                        "useBalanceFlag":0,
+                        "canRefundBeans":null,
+                        "freePostageFee":null,
+                        "freePostageTicketID":null,
+                        "brokerage":274782.8,
+                        "delFlag":"0",
+                        "refundsAmount":0,
+                        "orderStatusFlag":"1",
+                        "buyStatus":"1",
+                        "deliveryTimeMills":null,
+                        "orderDeliveryID":null,
+                        "splitFlag":"0",
+                        "receiptedFlag":null,
+                        "receiptedType":null,
+                        "paying":"0",
+                        "shopProductAmount":200,
+                        "shopPostFee":0,
+                        "shopTaxFee":26,
+                        "shouldPayShopAmount":226,
+                        "payedShopAmount":0,
+                        "shopOtherFee":0,
+                        "refunding":null,
+                        "costType":null,
+                        "proportional":null,
+                        "modifyShouldPayNote":null,
+                        "modifyShouldPayUserID":null,
+                        "modifyShouldPayDate":null,
+                        "zeroCostFlag":0,
+                        "shopName":"香港丽润国际",
+                        "shopLogo":"https://www-b.caimei365.com/uploadFile/shopLogo/ZXV6IIFSP520140415035836.jpg",
+                        "logisticsRecordList":null,
+                        "orderProductList":[
+                            {
+                                "orderProductID":29360,
+                                "orderNo":"X161613560870120",
+                                "orderID":15211,
+                                "shopOrderID":19375,
+                                "shopOrderNo":"X16161356087012001",
+                                "shopID":1001,
+                                "productID":1010,
+                                "organizeProductID":null,
+                                "organizeID":null,
+                                "num":1,
+                                "presentNum":0,
+                                "outStoreType":null,
+                                "skuID":null,
+                                "props":null,
+                                "propName":null,
+                                "productNo":null,
+                                "price":275008.8,
+                                "normalPrice":660,
+                                "costPrice":200,
+                                "price0":250008,
+                                "price1":250008,
+                                "totalAmount":250008,
+                                "totalFee":275008.8,
+                                "shouldPayFee":275008.8,
+                                "discount":100,
+                                "discountPrice":300009.6,
+                                "includedTax":"0",
+                                "invoiceType":"1",
+                                "taxRate":10,
+                                "supplierTaxRate":13,
+                                "addedValueTax":25000.8,
+                                "totalAddedValueTax":25000.8,
+                                "shouldPayTotalTax":26,
+                                "singleShouldPayTotalTax":26,
+                                "shopProductAmount":200,
+                                "shopFee":226,
+                                "otherFee":0,
+                                "cmFee":274782.8,
+                                "singleShopFee":226,
+                                "singleOtherFee":0,
+                                "singleCmFee":274782.8,
+                                "status":null,
+                                "commentFlag":"0",
+                                "totalBeans":0,
+                                "useBalanceAmount":0,
+                                "useBeanAmount":null,
+                                "notOutStore":1,
+                                "cmbeanPrice":null,
+                                "isActProduct":"1",
+                                "isGiftProduct":"0",
+                                "productActInfo":null,
+                                "buyAgainFlag":"0",
+                                "confirmProductFlag":"0",
+                                "payStatus":"0",
+                                "shopName":"香港丽润国际",
+                                "name":"大幅度第三方团雪山之恋丝绒洁面乳团雪山之恋丝绒洁面乳团雪山之恋丝绒洁面乳团雪山之恋丝绒洁面乳",
+                                "productUnit":"100ml/瓶",
+                                "productImage":"https://img-b.caimei365.com/group1/M00/03/09/Cmgy61-Gr6qAG5rbAADFf8tivls567.jpg",
+                                "actType":null,
+                                "actPreferential":0,
+                                "productType":"0",
+                                "orderPromotionsId":null,
+                                "preferential":0,
+                                "discountFee":0,
+                                "cancelNum":null,
+                                "ladderPriceFlag":0,
+                                "shipmentsNum":null,
+                                "returnedNum":null,
+                                "actualCancelNum":null,
+                                "aliasName":null,
+                                "productCategory":"1",
+                                "secondHandType":null,
+                                "productPromotion":null,
+                                "includedTaxFlag":null
+                            }
+                        ],
+                        "userInfo":null,
+                        "name":null,
+                        "receiptStatus":null,
+                        "shopPromotion":null,
+                        "shouHuoRen":null
+                    }
+                ],
+                "clubName":"正经一点机构",
+                "invoiceStatus":false,
+                "payButton":false,
+                "expensesOfTaxation":null
+            },
+            {
+                "orderID":15210,
+                "orderNo":"X161613547788441",
+                "organizeID":0,
+                "userID":11063,
+                "buyUserID":11062,
+                "shopOrderIDs":"19374",
+                "orderSubmitType":3,
+                "orderType":0,
+                "hasActProduct":"1",
+                "autoCloseTimeMills":0,
+                "status":"0",
+                "receiptStatus":"1",
+                "payStatus":"1",
+                "sendOutStatus":"1",
+                "refundType":"0",
+                "paySuccessCounter":0,
+                "payFlag":"0",
+                "onlinePayFlag":"0",
+                "productTotalFee":275008.8,
+                "orderTotalFee":275008.8,
+                "payTotalFee":275008.8,
+                "payableAmount":275008.8,
+                "balancePayFee":0,
+                "preferential":0,
+                "discountFee":0,
+                "promotionFullReduction":0,
+                "spID":1401,
+                "mainSpID":1304,
+                "note":null,
+                "clubID":5638,
+                "clubScanTime":null,
+                "payWay":null,
+                "orderSource":"6",
+                "closeTime":null,
+                "confirmTime":null,
+                "payTime":null,
+                "orderTime":"2021-03-19 14:31:17",
+                "productCount":1,
+                "presentCount":0,
+                "promotionalGiftsCount":0,
+                "cooFreeFlag":"0",
+                "cooFreeRate":0,
+                "cooFreeAmount":0,
+                "invoiceFlag":"0",
+                "confirmFlag":"0",
+                "clauseID":1,
+                "clauseContent":null,
+                "clauseName":"无条款",
+                "updateDate":"2021-03-19 14:31:17",
+                "freePostFlag":"-1",
+                "freight":0,
+                "delFlag":"0",
+                "freePostageTicketID":null,
+                "splitFlag":"1",
+                "closeReason":null,
+                "postageOrderFlag":"0",
+                "thirdPartyOrderNo":null,
+                "secondHandOrderFlag":"0",
+                "affirmPaymentFlag":"0",
+                "rebateFlag":"0",
+                "zeroCostFlag":0,
+                "orderState":null,
+                "orderMark":null,
+                "receiptAmount":0,
+                "pendingPayments":275008.8,
+                "returnedPurchaseFee":null,
+                "shopOrderList":[
+                    {
+                        "shopOrderID":19374,
+                        "shopOrderNo":"X16161354778844101",
+                        "orderNo":"X161613547788441",
+                        "orderID":15210,
+                        "organizeID":null,
+                        "userID":11063,
+                        "shopID":1001,
+                        "orderPromotionsId":null,
+                        "orderType":0,
+                        "orderSubmitType":3,
+                        "presentNum":0,
+                        "itemCount":1,
+                        "outStoreNum":0,
+                        "outStoreTimes":0,
+                        "townID":null,
+                        "note":"",
+                        "fee":-1,
+                        "accountAmount":0,
+                        "productAmount":250008,
+                        "totalAmount":275008.8,
+                        "needPayAmount":275008.8,
+                        "discountAmount":null,
+                        "discountFee":0,
+                        "preferential":0,
+                        "promotionFullReduction":0,
+                        "payFlag":"0",
+                        "orderTime":"2021-03-19 14:31:17",
+                        "payTime":null,
+                        "finishTime":null,
+                        "autoOverTimeMills":null,
+                        "status":1,
+                        "payStatus":"1",
+                        "sendOutStatus":"1",
+                        "refundStatus":0,
+                        "returnGoodsStatus":null,
+                        "receiveGoodsTime":null,
+                        "autoReceiveTimeMills":null,
+                        "totalAddedValueTax":null,
+                        "canRefundAmount":275009,
+                        "refundAmount":null,
+                        "clubID":5638,
+                        "spID":1401,
+                        "mainSpID":1304,
+                        "orderBeanAmount":0,
+                        "useBeanAmount":0,
+                        "useBeanFlag":0,
+                        "canRefundFlag":1,
+                        "useBalanceFlag":0,
+                        "canRefundBeans":null,
+                        "freePostageFee":null,
+                        "freePostageTicketID":null,
+                        "brokerage":274782.8,
+                        "delFlag":"0",
+                        "refundsAmount":0,
+                        "orderStatusFlag":"1",
+                        "buyStatus":"1",
+                        "deliveryTimeMills":null,
+                        "orderDeliveryID":null,
+                        "splitFlag":"0",
+                        "receiptedFlag":null,
+                        "receiptedType":null,
+                        "paying":"0",
+                        "shopProductAmount":200,
+                        "shopPostFee":0,
+                        "shopTaxFee":26,
+                        "shouldPayShopAmount":226,
+                        "payedShopAmount":0,
+                        "shopOtherFee":0,
+                        "refunding":null,
+                        "costType":null,
+                        "proportional":null,
+                        "modifyShouldPayNote":null,
+                        "modifyShouldPayUserID":null,
+                        "modifyShouldPayDate":null,
+                        "zeroCostFlag":0,
+                        "shopName":"香港丽润国际",
+                        "shopLogo":"https://www-b.caimei365.com/uploadFile/shopLogo/ZXV6IIFSP520140415035836.jpg",
+                        "logisticsRecordList":null,
+                        "orderProductList":[
+                            {
+                                "orderProductID":29359,
+                                "orderNo":"X161613547788441",
+                                "orderID":15210,
+                                "shopOrderID":19374,
+                                "shopOrderNo":"X16161354778844101",
+                                "shopID":1001,
+                                "productID":1010,
+                                "organizeProductID":null,
+                                "organizeID":null,
+                                "num":1,
+                                "presentNum":0,
+                                "outStoreType":null,
+                                "skuID":null,
+                                "props":null,
+                                "propName":null,
+                                "productNo":null,
+                                "price":275008.8,
+                                "normalPrice":660,
+                                "costPrice":200,
+                                "price0":250008,
+                                "price1":250008,
+                                "totalAmount":250008,
+                                "totalFee":275008.8,
+                                "shouldPayFee":275008.8,
+                                "discount":100,
+                                "discountPrice":300009.6,
+                                "includedTax":"0",
+                                "invoiceType":"1",
+                                "taxRate":10,
+                                "supplierTaxRate":13,
+                                "addedValueTax":25000.8,
+                                "totalAddedValueTax":25000.8,
+                                "shouldPayTotalTax":26,
+                                "singleShouldPayTotalTax":26,
+                                "shopProductAmount":200,
+                                "shopFee":226,
+                                "otherFee":0,
+                                "cmFee":274782.8,
+                                "singleShopFee":226,
+                                "singleOtherFee":0,
+                                "singleCmFee":274782.8,
+                                "status":null,
+                                "commentFlag":"0",
+                                "totalBeans":0,
+                                "useBalanceAmount":0,
+                                "useBeanAmount":null,
+                                "notOutStore":1,
+                                "cmbeanPrice":null,
+                                "isActProduct":"1",
+                                "isGiftProduct":"0",
+                                "productActInfo":null,
+                                "buyAgainFlag":"0",
+                                "confirmProductFlag":"0",
+                                "payStatus":"0",
+                                "shopName":"香港丽润国际",
+                                "name":"大幅度第三方团雪山之恋丝绒洁面乳团雪山之恋丝绒洁面乳团雪山之恋丝绒洁面乳团雪山之恋丝绒洁面乳",
+                                "productUnit":"100ml/瓶",
+                                "productImage":"https://img-b.caimei365.com/group1/M00/03/09/Cmgy61-Gr6qAG5rbAADFf8tivls567.jpg",
+                                "actType":null,
+                                "actPreferential":0,
+                                "productType":"0",
+                                "orderPromotionsId":null,
+                                "preferential":0,
+                                "discountFee":0,
+                                "cancelNum":null,
+                                "ladderPriceFlag":0,
+                                "shipmentsNum":null,
+                                "returnedNum":null,
+                                "actualCancelNum":null,
+                                "aliasName":null,
+                                "productCategory":"1",
+                                "secondHandType":null,
+                                "productPromotion":null,
+                                "includedTaxFlag":null
+                            }
+                        ],
+                        "userInfo":null,
+                        "name":null,
+                        "receiptStatus":null,
+                        "shopPromotion":null,
+                        "shouHuoRen":null
+                    }
+                ],
+                "clubName":"正经一点机构",
+                "invoiceStatus":false,
+                "payButton":false,
+                "expensesOfTaxation":null
+            },
+            {
+                "orderID":15209,
+                "orderNo":"X161613544703234",
+                "organizeID":0,
+                "userID":11063,
+                "buyUserID":11062,
+                "shopOrderIDs":"19373",
+                "orderSubmitType":3,
+                "orderType":0,
+                "hasActProduct":"0",
+                "autoCloseTimeMills":0,
+                "status":"0",
+                "receiptStatus":"1",
+                "payStatus":"1",
+                "sendOutStatus":"1",
+                "refundType":"0",
+                "paySuccessCounter":0,
+                "payFlag":"0",
+                "onlinePayFlag":"0",
+                "productTotalFee":1800,
+                "orderTotalFee":1800,
+                "payTotalFee":1800,
+                "payableAmount":1800,
+                "balancePayFee":0,
+                "preferential":0,
+                "discountFee":0,
+                "promotionFullReduction":0,
+                "spID":1401,
+                "mainSpID":1304,
+                "note":null,
+                "clubID":5638,
+                "clubScanTime":null,
+                "payWay":null,
+                "orderSource":"6",
+                "closeTime":null,
+                "confirmTime":null,
+                "payTime":null,
+                "orderTime":"2021-03-19 14:30:47",
+                "productCount":3,
+                "presentCount":0,
+                "promotionalGiftsCount":0,
+                "cooFreeFlag":"0",
+                "cooFreeRate":0,
+                "cooFreeAmount":0,
+                "invoiceFlag":"0",
+                "confirmFlag":"0",
+                "clauseID":1,
+                "clauseContent":null,
+                "clauseName":"无条款",
+                "updateDate":"2021-03-19 14:30:47",
+                "freePostFlag":"-1",
+                "freight":0,
+                "delFlag":"0",
+                "freePostageTicketID":null,
+                "splitFlag":"1",
+                "closeReason":null,
+                "postageOrderFlag":"0",
+                "thirdPartyOrderNo":null,
+                "secondHandOrderFlag":"0",
+                "affirmPaymentFlag":"0",
+                "rebateFlag":"0",
+                "zeroCostFlag":0,
+                "orderState":null,
+                "orderMark":null,
+                "receiptAmount":0,
+                "pendingPayments":1800,
+                "returnedPurchaseFee":null,
+                "shopOrderList":[
+                    {
+                        "shopOrderID":19373,
+                        "shopOrderNo":"X16161354470323401",
+                        "orderNo":"X161613544703234",
+                        "orderID":15209,
+                        "organizeID":null,
+                        "userID":11063,
+                        "shopID":10109,
+                        "orderPromotionsId":null,
+                        "orderType":0,
+                        "orderSubmitType":3,
+                        "presentNum":0,
+                        "itemCount":3,
+                        "outStoreNum":0,
+                        "outStoreTimes":0,
+                        "townID":null,
+                        "note":"",
+                        "fee":-1,
+                        "accountAmount":0,
+                        "productAmount":1800,
+                        "totalAmount":1800,
+                        "needPayAmount":1800,
+                        "discountAmount":null,
+                        "discountFee":0,
+                        "preferential":0,
+                        "promotionFullReduction":0,
+                        "payFlag":"0",
+                        "orderTime":"2021-03-19 14:30:47",
+                        "payTime":null,
+                        "finishTime":null,
+                        "autoOverTimeMills":null,
+                        "status":1,
+                        "payStatus":"1",
+                        "sendOutStatus":"1",
+                        "refundStatus":0,
+                        "returnGoodsStatus":null,
+                        "receiveGoodsTime":null,
+                        "autoReceiveTimeMills":null,
+                        "totalAddedValueTax":null,
+                        "canRefundAmount":1800,
+                        "refundAmount":null,
+                        "clubID":5638,
+                        "spID":1401,
+                        "mainSpID":1304,
+                        "orderBeanAmount":0,
+                        "useBeanAmount":0,
+                        "useBeanFlag":0,
+                        "canRefundFlag":1,
+                        "useBalanceFlag":0,
+                        "canRefundBeans":null,
+                        "freePostageFee":null,
+                        "freePostageTicketID":null,
+                        "brokerage":900,
+                        "delFlag":"0",
+                        "refundsAmount":0,
+                        "orderStatusFlag":"1",
+                        "buyStatus":"1",
+                        "deliveryTimeMills":null,
+                        "orderDeliveryID":null,
+                        "splitFlag":"1",
+                        "receiptedFlag":null,
+                        "receiptedType":null,
+                        "paying":"0",
+                        "shopProductAmount":900,
+                        "shopPostFee":0,
+                        "shopTaxFee":0,
+                        "shouldPayShopAmount":900,
+                        "payedShopAmount":0,
+                        "shopOtherFee":0,
+                        "refunding":null,
+                        "costType":null,
+                        "proportional":null,
+                        "modifyShouldPayNote":null,
+                        "modifyShouldPayUserID":null,
+                        "modifyShouldPayDate":null,
+                        "zeroCostFlag":0,
+                        "shopName":"演员测试供应商AAA",
+                        "shopLogo":"https://img-b.caimei365.com/group1/M00/02/EA/Cmgy618FyDCAcnqjAABqocyxYRw91.JPEG",
+                        "logisticsRecordList":null,
+                        "orderProductList":[
+                            {
+                                "orderProductID":29358,
+                                "orderNo":"X161613544703234",
+                                "orderID":15209,
+                                "shopOrderID":19373,
+                                "shopOrderNo":"X16161354470323401",
+                                "shopID":10109,
+                                "productID":4357,
+                                "organizeProductID":null,
+                                "organizeID":null,
+                                "num":3,
+                                "presentNum":0,
+                                "outStoreType":null,
+                                "skuID":null,
+                                "props":null,
+                                "propName":null,
+                                "productNo":null,
+                                "price":600,
+                                "normalPrice":500,
+                                "costPrice":300,
+                                "price0":600,
+                                "price1":600,
+                                "totalAmount":1800,
+                                "totalFee":1800,
+                                "shouldPayFee":1800,
+                                "discount":100,
+                                "discountPrice":600,
+                                "includedTax":"2",
+                                "invoiceType":"3",
+                                "taxRate":0,
+                                "supplierTaxRate":0,
+                                "addedValueTax":0,
+                                "totalAddedValueTax":0,
+                                "shouldPayTotalTax":0,
+                                "singleShouldPayTotalTax":0,
+                                "shopProductAmount":900,
+                                "shopFee":900,
+                                "otherFee":0,
+                                "cmFee":900,
+                                "singleShopFee":300,
+                                "singleOtherFee":0,
+                                "singleCmFee":300,
+                                "status":null,
+                                "commentFlag":"0",
+                                "totalBeans":0,
+                                "useBalanceAmount":0,
+                                "useBeanAmount":null,
+                                "notOutStore":3,
+                                "cmbeanPrice":null,
+                                "isActProduct":"2",
+                                "isGiftProduct":"0",
+                                "productActInfo":null,
+                                "buyAgainFlag":"0",
+                                "confirmProductFlag":"0",
+                                "payStatus":"0",
+                                "shopName":"演员测试供应商AAA",
+                                "name":"演员测试供应商商品显示名AAA",
+                                "productUnit":"包",
+                                "productImage":"https://img-b.caimei365.com/group1/M00/02/E0/Cmgy618EE1OAN0e7AAIcZ5Hb98Q16.jfif",
+                                "actType":null,
+                                "actPreferential":0,
+                                "productType":"0",
+                                "orderPromotionsId":null,
+                                "preferential":0,
+                                "discountFee":0,
+                                "cancelNum":null,
+                                "ladderPriceFlag":1,
+                                "shipmentsNum":null,
+                                "returnedNum":null,
+                                "actualCancelNum":null,
+                                "aliasName":null,
+                                "productCategory":"1",
+                                "secondHandType":null,
+                                "productPromotion":null,
+                                "includedTaxFlag":null
+                            }
+                        ],
+                        "userInfo":null,
+                        "name":null,
+                        "receiptStatus":null,
+                        "shopPromotion":null,
+                        "shouHuoRen":null
+                    }
+                ],
+                "clubName":"正经一点机构",
+                "invoiceStatus":false,
+                "payButton":false,
+                "expensesOfTaxation":null
+            },
+            {
+                "orderID":15208,
+                "orderNo":"X161613541392914",
+                "organizeID":0,
+                "userID":11063,
+                "buyUserID":11062,
+                "shopOrderIDs":"19372",
+                "orderSubmitType":3,
+                "orderType":0,
+                "hasActProduct":"1",
+                "autoCloseTimeMills":0,
+                "status":"0",
+                "receiptStatus":"1",
+                "payStatus":"1",
+                "sendOutStatus":"1",
+                "refundType":"0",
+                "paySuccessCounter":0,
+                "payFlag":"0",
+                "onlinePayFlag":"0",
+                "productTotalFee":116.86,
+                "orderTotalFee":116.86,
+                "payTotalFee":116.86,
+                "payableAmount":116.86,
+                "balancePayFee":0,
+                "preferential":0,
+                "discountFee":0,
+                "promotionFullReduction":0,
+                "spID":1401,
+                "mainSpID":1304,
+                "note":null,
+                "clubID":5638,
+                "clubScanTime":null,
+                "payWay":null,
+                "orderSource":"6",
+                "closeTime":null,
+                "confirmTime":null,
+                "payTime":null,
+                "orderTime":"2021-03-19 14:30:13",
+                "productCount":7,
+                "presentCount":0,
+                "promotionalGiftsCount":0,
+                "cooFreeFlag":"0",
+                "cooFreeRate":0,
+                "cooFreeAmount":0,
+                "invoiceFlag":"0",
+                "confirmFlag":"0",
+                "clauseID":1,
+                "clauseContent":null,
+                "clauseName":"无条款",
+                "updateDate":"2021-03-19 14:30:13",
+                "freePostFlag":"-1",
+                "freight":0,
+                "delFlag":"0",
+                "freePostageTicketID":null,
+                "splitFlag":"1",
+                "closeReason":null,
+                "postageOrderFlag":"0",
+                "thirdPartyOrderNo":null,
+                "secondHandOrderFlag":"0",
+                "affirmPaymentFlag":"0",
+                "rebateFlag":"0",
+                "zeroCostFlag":0,
+                "orderState":null,
+                "orderMark":null,
+                "receiptAmount":0,
+                "pendingPayments":116.86,
+                "returnedPurchaseFee":null,
+                "shopOrderList":[
+                    {
+                        "shopOrderID":19372,
+                        "shopOrderNo":"X16161354139291401",
+                        "orderNo":"X161613541392914",
+                        "orderID":15208,
+                        "organizeID":null,
+                        "userID":11063,
+                        "shopID":10134,
+                        "orderPromotionsId":null,
+                        "orderType":0,
+                        "orderSubmitType":3,
+                        "presentNum":0,
+                        "itemCount":7,
+                        "outStoreNum":0,
+                        "outStoreTimes":0,
+                        "townID":null,
+                        "note":"",
+                        "fee":-1,
+                        "accountAmount":0,
+                        "productAmount":127.25,
+                        "totalAmount":116.86,
+                        "needPayAmount":116.86,
+                        "discountAmount":null,
+                        "discountFee":0,
+                        "preferential":0,
+                        "promotionFullReduction":0,
+                        "payFlag":"0",
+                        "orderTime":"2021-03-19 14:30:13",
+                        "payTime":null,
+                        "finishTime":null,
+                        "autoOverTimeMills":null,
+                        "status":1,
+                        "payStatus":"1",
+                        "sendOutStatus":"1",
+                        "refundStatus":0,
+                        "returnGoodsStatus":null,
+                        "receiveGoodsTime":null,
+                        "autoReceiveTimeMills":null,
+                        "totalAddedValueTax":null,
+                        "canRefundAmount":116.857,
+                        "refundAmount":null,
+                        "clubID":5638,
+                        "spID":1401,
+                        "mainSpID":1304,
+                        "orderBeanAmount":0,
+                        "useBeanAmount":0,
+                        "useBeanFlag":0,
+                        "canRefundFlag":1,
+                        "useBalanceFlag":0,
+                        "canRefundBeans":null,
+                        "freePostageFee":null,
+                        "freePostageTicketID":null,
+                        "brokerage":38.51,
+                        "delFlag":"0",
+                        "refundsAmount":0,
+                        "orderStatusFlag":"1",
+                        "buyStatus":"1",
+                        "deliveryTimeMills":null,
+                        "orderDeliveryID":null,
+                        "splitFlag":"1",
+                        "receiptedFlag":null,
+                        "receiptedType":null,
+                        "paying":"0",
+                        "shopProductAmount":90,
+                        "shopPostFee":0,
+                        "shopTaxFee":4.6,
+                        "shouldPayShopAmount":94.6,
+                        "payedShopAmount":0,
+                        "shopOtherFee":0,
+                        "refunding":null,
+                        "costType":null,
+                        "proportional":null,
+                        "modifyShouldPayNote":null,
+                        "modifyShouldPayUserID":null,
+                        "modifyShouldPayDate":null,
+                        "zeroCostFlag":0,
+                        "shopName":"深圳市美轮美奂服务有限公司",
+                        "shopLogo":"https://www-b.caimei365.com/img/default/suppliver.jpg",
+                        "logisticsRecordList":null,
+                        "orderProductList":[
+                            {
+                                "orderProductID":29355,
+                                "orderNo":"X161613541392914",
+                                "orderID":15208,
+                                "shopOrderID":19372,
+                                "shopOrderNo":"X16161354139291401",
+                                "shopID":10134,
+                                "productID":6420,
+                                "organizeProductID":null,
+                                "organizeID":null,
+                                "num":1,
+                                "presentNum":0,
+                                "outStoreType":null,
+                                "skuID":null,
+                                "props":null,
+                                "propName":null,
+                                "productNo":null,
+                                "price":28.325,
+                                "normalPrice":25.75,
+                                "costPrice":20,
+                                "price0":25.75,
+                                "price1":25.75,
+                                "totalAmount":25.75,
+                                "totalFee":28.33,
+                                "shouldPayFee":28.33,
+                                "discount":100,
+                                "discountPrice":30.905,
+                                "includedTax":"0",
+                                "invoiceType":"2",
+                                "taxRate":10,
+                                "supplierTaxRate":10,
+                                "addedValueTax":2.58,
+                                "totalAddedValueTax":2.58,
+                                "shouldPayTotalTax":2,
+                                "singleShouldPayTotalTax":2,
+                                "shopProductAmount":20,
+                                "shopFee":22,
+                                "otherFee":0,
+                                "cmFee":6.33,
+                                "singleShopFee":22,
+                                "singleOtherFee":0,
+                                "singleCmFee":6.33,
+                                "status":null,
+                                "commentFlag":"0",
+                                "totalBeans":0,
+                                "useBalanceAmount":0,
+                                "useBeanAmount":null,
+                                "notOutStore":1,
+                                "cmbeanPrice":null,
+                                "isActProduct":"0",
+                                "isGiftProduct":"0",
+                                "productActInfo":null,
+                                "buyAgainFlag":"0",
+                                "confirmProductFlag":"0",
+                                "payStatus":"0",
+                                "shopName":"深圳市美轮美奂服务有限公司",
+                                "name":"【测试用】润百颜注射修饰透明质酸钠凝胶1ml",
+                                "productUnit":"盒",
+                                "productImage":"https://img-b.caimei365.com/group1/M00/03/20/Cmgy62BHIIWATL05AAGHUpelz2U374.jpg",
+                                "actType":null,
+                                "actPreferential":0,
+                                "productType":"0",
+                                "orderPromotionsId":null,
+                                "preferential":0,
+                                "discountFee":0,
+                                "cancelNum":null,
+                                "ladderPriceFlag":0,
+                                "shipmentsNum":null,
+                                "returnedNum":null,
+                                "actualCancelNum":null,
+                                "aliasName":null,
+                                "productCategory":"1",
+                                "secondHandType":null,
+                                "productPromotion":null,
+                                "includedTaxFlag":null
+                            },
+                            {
+                                "orderProductID":29356,
+                                "orderNo":"X161613541392914",
+                                "orderID":15208,
+                                "shopOrderID":19372,
+                                "shopOrderNo":"X16161354139291401",
+                                "shopID":10134,
+                                "productID":6419,
+                                "organizeProductID":null,
+                                "organizeID":null,
+                                "num":1,
+                                "presentNum":0,
+                                "outStoreType":null,
+                                "skuID":null,
+                                "props":null,
+                                "propName":null,
+                                "productNo":null,
+                                "price":28.5325,
+                                "normalPrice":25.25,
+                                "costPrice":20,
+                                "price0":25.25,
+                                "price1":25.25,
+                                "totalAmount":25.25,
+                                "totalFee":28.53,
+                                "shouldPayFee":28.53,
+                                "discount":100,
+                                "discountPrice":31.8125,
+                                "includedTax":"0",
+                                "invoiceType":"1",
+                                "taxRate":13,
+                                "supplierTaxRate":13,
+                                "addedValueTax":3.28,
+                                "totalAddedValueTax":3.28,
+                                "shouldPayTotalTax":2.6,
+                                "singleShouldPayTotalTax":2.6,
+                                "shopProductAmount":20,
+                                "shopFee":22.6,
+                                "otherFee":0,
+                                "cmFee":5.93,
+                                "singleShopFee":22.6,
+                                "singleOtherFee":0,
+                                "singleCmFee":5.93,
+                                "status":null,
+                                "commentFlag":"0",
+                                "totalBeans":0,
+                                "useBalanceAmount":0,
+                                "useBeanAmount":null,
+                                "notOutStore":1,
+                                "cmbeanPrice":null,
+                                "isActProduct":"0",
+                                "isGiftProduct":"0",
+                                "productActInfo":null,
+                                "buyAgainFlag":"0",
+                                "confirmProductFlag":"0",
+                                "payStatus":"0",
+                                "shopName":"深圳市美轮美奂服务有限公司",
+                                "name":"【测试用】Dermaheal HSR 德玛莉肌活丝蕴凝颜精华液",
+                                "productUnit":"片",
+                                "productImage":"https://img-b.caimei365.com/group1/M00/03/20/Cmgy62BHH8aAFiGIAAGHr5DovGA124.jpg",
+                                "actType":null,
+                                "actPreferential":0,
+                                "productType":"0",
+                                "orderPromotionsId":null,
+                                "preferential":0,
+                                "discountFee":0,
+                                "cancelNum":null,
+                                "ladderPriceFlag":0,
+                                "shipmentsNum":null,
+                                "returnedNum":null,
+                                "actualCancelNum":null,
+                                "aliasName":null,
+                                "productCategory":"1",
+                                "secondHandType":null,
+                                "productPromotion":null,
+                                "includedTaxFlag":null
+                            },
+                            {
+                                "orderProductID":29357,
+                                "orderNo":"X161613541392914",
+                                "orderID":15208,
+                                "shopOrderID":19372,
+                                "shopOrderNo":"X16161354139291401",
+                                "shopID":10134,
+                                "productID":6421,
+                                "organizeProductID":null,
+                                "organizeID":null,
+                                "num":5,
+                                "presentNum":0,
+                                "outStoreType":null,
+                                "skuID":null,
+                                "props":null,
+                                "propName":null,
+                                "productNo":null,
+                                "price":15.25,
+                                "normalPrice":15.25,
+                                "costPrice":10,
+                                "price0":15.25,
+                                "price1":15.25,
+                                "totalAmount":76.25,
+                                "totalFee":60,
+                                "shouldPayFee":60,
+                                "discount":100,
+                                "discountPrice":15.25,
+                                "includedTax":"0",
+                                "invoiceType":"3",
+                                "taxRate":0,
+                                "supplierTaxRate":0,
+                                "addedValueTax":0,
+                                "totalAddedValueTax":0,
+                                "shouldPayTotalTax":0,
+                                "singleShouldPayTotalTax":0,
+                                "shopProductAmount":50,
+                                "shopFee":50,
+                                "otherFee":0,
+                                "cmFee":26.25,
+                                "singleShopFee":10,
+                                "singleOtherFee":0,
+                                "singleCmFee":5.25,
+                                "status":null,
+                                "commentFlag":"0",
+                                "totalBeans":0,
+                                "useBalanceAmount":0,
+                                "useBeanAmount":null,
+                                "notOutStore":5,
+                                "cmbeanPrice":null,
+                                "isActProduct":"1",
+                                "isGiftProduct":"0",
+                                "productActInfo":null,
+                                "buyAgainFlag":"0",
+                                "confirmProductFlag":"0",
+                                "payStatus":"0",
+                                "shopName":"深圳市美轮美奂服务有限公司",
+                                "name":"【测试用】肌本演绎【O4元素破茧疗法】25800 特惠方案",
+                                "productUnit":"瓶",
+                                "productImage":"https://img-b.caimei365.com/group1/M00/03/20/Cmgy62BHJGCARS7iAAVlWLR-uKU385.jpg",
+                                "actType":null,
+                                "actPreferential":0,
+                                "productType":"0",
+                                "orderPromotionsId":396,
+                                "preferential":0,
+                                "discountFee":0,
+                                "cancelNum":null,
+                                "ladderPriceFlag":0,
+                                "shipmentsNum":null,
+                                "returnedNum":null,
+                                "actualCancelNum":null,
+                                "aliasName":null,
+                                "productCategory":"1",
+                                "secondHandType":null,
+                                "productPromotion":{
+                                    "id":396,
+                                    "name":"优惠价",
+                                    "description":null,
+                                    "type":1,
+                                    "mode":1,
+                                    "touchPrice":12,
+                                    "reducedPrice":null,
+                                    "beginTime":null,
+                                    "endTime":null,
+                                    "status":1,
+                                    "supplierId":null,
+                                    "productId":null,
+                                    "orderId":15208,
+                                    "productList":null,
+                                    "giftList":null,
+                                    "products":null
+                                },
+                                "includedTaxFlag":null
+                            }
+                        ],
+                        "userInfo":null,
+                        "name":null,
+                        "receiptStatus":null,
+                        "shopPromotion":null,
+                        "shouHuoRen":null
+                    }
+                ],
+                "clubName":"正经一点机构",
+                "invoiceStatus":false,
+                "payButton":false,
+                "expensesOfTaxation":null
+            },
+            {
+                "orderID":15207,
+                "orderNo":"P161612466484974",
+                "organizeID":0,
+                "userID":11063,
+                "buyUserID":null,
+                "shopOrderIDs":"19371",
+                "orderSubmitType":4,
+                "orderType":0,
+                "hasActProduct":null,
+                "autoCloseTimeMills":0,
+                "status":"0",
+                "receiptStatus":"1",
+                "payStatus":"1",
+                "sendOutStatus":"1",
+                "refundType":"0",
+                "paySuccessCounter":0,
+                "payFlag":"0",
+                "onlinePayFlag":"0",
+                "productTotalFee":3000,
+                "orderTotalFee":3390,
+                "payTotalFee":3390,
+                "payableAmount":3390,
+                "balancePayFee":0,
+                "preferential":0,
+                "discountFee":0,
+                "promotionFullReduction":0,
+                "spID":1401,
+                "mainSpID":null,
+                "note":"",
+                "clubID":5638,
+                "clubScanTime":null,
+                "payWay":null,
+                "orderSource":"4",
+                "closeTime":null,
+                "confirmTime":null,
+                "payTime":null,
+                "orderTime":"2021-03-19 11:30:48",
+                "productCount":10,
+                "presentCount":0,
+                "promotionalGiftsCount":0,
+                "cooFreeFlag":null,
+                "cooFreeRate":null,
+                "cooFreeAmount":null,
+                "invoiceFlag":null,
+                "confirmFlag":"0",
+                "clauseID":1,
+                "clauseContent":"",
+                "clauseName":"无条款",
+                "updateDate":null,
+                "freePostFlag":"0",
+                "freight":0,
+                "delFlag":"0",
+                "freePostageTicketID":null,
+                "splitFlag":"1",
+                "closeReason":null,
+                "postageOrderFlag":"0",
+                "thirdPartyOrderNo":null,
+                "secondHandOrderFlag":"0",
+                "affirmPaymentFlag":"0",
+                "rebateFlag":"0",
+                "zeroCostFlag":0,
+                "orderState":null,
+                "orderMark":null,
+                "receiptAmount":0,
+                "pendingPayments":3390,
+                "returnedPurchaseFee":null,
+                "shopOrderList":[
+                    {
+                        "shopOrderID":19371,
+                        "shopOrderNo":"P16161246648497401",
+                        "orderNo":"P161612466484974",
+                        "orderID":15207,
+                        "organizeID":null,
+                        "userID":11063,
+                        "shopID":1001,
+                        "orderPromotionsId":null,
+                        "orderType":0,
+                        "orderSubmitType":4,
+                        "presentNum":0,
+                        "itemCount":10,
+                        "outStoreNum":0,
+                        "outStoreTimes":0,
+                        "townID":null,
+                        "note":null,
+                        "fee":null,
+                        "accountAmount":0,
+                        "productAmount":3000,
+                        "totalAmount":3390,
+                        "needPayAmount":3390,
+                        "discountAmount":0,
+                        "discountFee":0,
+                        "preferential":0,
+                        "promotionFullReduction":0,
+                        "payFlag":"0",
+                        "orderTime":"2021-03-19 11:30:48",
+                        "payTime":null,
+                        "finishTime":null,
+                        "autoOverTimeMills":0,
+                        "status":null,
+                        "payStatus":"1",
+                        "sendOutStatus":"1",
+                        "refundStatus":null,
+                        "returnGoodsStatus":null,
+                        "receiveGoodsTime":null,
+                        "autoReceiveTimeMills":0,
+                        "totalAddedValueTax":390,
+                        "canRefundAmount":0,
+                        "refundAmount":0,
+                        "clubID":5638,
+                        "spID":null,
+                        "mainSpID":null,
+                        "orderBeanAmount":null,
+                        "useBeanAmount":null,
+                        "useBeanFlag":null,
+                        "canRefundFlag":null,
+                        "useBalanceFlag":null,
+                        "canRefundBeans":null,
+                        "freePostageFee":null,
+                        "freePostageTicketID":null,
+                        "brokerage":-836.3,
+                        "delFlag":"0",
+                        "refundsAmount":null,
+                        "orderStatusFlag":null,
+                        "buyStatus":null,
+                        "deliveryTimeMills":null,
+                        "orderDeliveryID":null,
+                        "splitFlag":"1",
+                        "receiptedFlag":null,
+                        "receiptedType":null,
+                        "paying":"0",
+                        "shopProductAmount":3051,
+                        "shopPostFee":0,
+                        "shopTaxFee":396.63,
+                        "shouldPayShopAmount":3447.63,
+                        "payedShopAmount":0,
+                        "shopOtherFee":0,
+                        "refunding":null,
+                        "costType":null,
+                        "proportional":null,
+                        "modifyShouldPayNote":null,
+                        "modifyShouldPayUserID":null,
+                        "modifyShouldPayDate":null,
+                        "zeroCostFlag":0,
+                        "shopName":"香港丽润国际",
+                        "shopLogo":"https://www-b.caimei365.com/uploadFile/shopLogo/ZXV6IIFSP520140415035836.jpg",
+                        "logisticsRecordList":null,
+                        "orderProductList":[
+                            {
+                                "orderProductID":29354,
+                                "orderNo":"P161612466484974",
+                                "orderID":15207,
+                                "shopOrderID":19371,
+                                "shopOrderNo":"P16161246648497401",
+                                "shopID":1001,
+                                "productID":1011,
+                                "organizeProductID":null,
+                                "organizeID":null,
+                                "num":10,
+                                "presentNum":0,
+                                "outStoreType":null,
+                                "skuID":null,
+                                "props":null,
+                                "propName":null,
+                                "productNo":"Q1MMB1011",
+                                "price":339,
+                                "normalPrice":446.18,
+                                "costPrice":305.1,
+                                "price0":300,
+                                "price1":null,
+                                "totalAmount":3000,
+                                "totalFee":3390,
+                                "shouldPayFee":3390,
+                                "discount":100,
+                                "discountPrice":378,
+                                "includedTax":"0",
+                                "invoiceType":"2",
+                                "taxRate":13,
+                                "supplierTaxRate":13,
+                                "addedValueTax":39,
+                                "totalAddedValueTax":390,
+                                "shouldPayTotalTax":396.63,
+                                "singleShouldPayTotalTax":39.66,
+                                "shopProductAmount":3051,
+                                "shopFee":3836.3,
+                                "otherFee":0,
+                                "cmFee":-836.3,
+                                "singleShopFee":383.63,
+                                "singleOtherFee":0,
+                                "singleCmFee":-83.63,
+                                "status":"0",
+                                "commentFlag":"0",
+                                "totalBeans":null,
+                                "useBalanceAmount":0,
+                                "useBeanAmount":null,
+                                "notOutStore":10,
+                                "cmbeanPrice":null,
+                                "isActProduct":"0",
+                                "isGiftProduct":"0",
+                                "productActInfo":null,
+                                "buyAgainFlag":"1",
+                                "confirmProductFlag":"0",
+                                "payStatus":"0",
+                                "shopName":"香港丽润国际",
+                                "name":"阶雪山之恋保湿滋润面霜",
+                                "productUnit":"50ml",
+                                "productImage":"https://img-b.caimei365.com/group1/M00/03/09/Cmgy61-Gqq6AcI4pAACGvvokTl0257.jpg",
+                                "actType":null,
+                                "actPreferential":0,
+                                "productType":"0",
+                                "orderPromotionsId":null,
+                                "preferential":0,
+                                "discountFee":0,
+                                "cancelNum":null,
+                                "ladderPriceFlag":1,
+                                "shipmentsNum":null,
+                                "returnedNum":null,
+                                "actualCancelNum":null,
+                                "aliasName":null,
+                                "productCategory":"1",
+                                "secondHandType":null,
+                                "productPromotion":null,
+                                "includedTaxFlag":null
+                            }
+                        ],
+                        "userInfo":null,
+                        "name":null,
+                        "receiptStatus":null,
+                        "shopPromotion":null,
+                        "shouHuoRen":null
+                    }
+                ],
+                "clubName":"正经一点机构",
+                "invoiceStatus":false,
+                "payButton":true,
+                "expensesOfTaxation":null
+            },
+            {
+                "orderID":15189,
+                "orderNo":"X161605858703888",
+                "organizeID":0,
+                "userID":11063,
+                "buyUserID":11062,
+                "shopOrderIDs":"19353",
+                "orderSubmitType":3,
+                "orderType":0,
+                "hasActProduct":"0",
+                "autoCloseTimeMills":0,
+                "status":"0",
+                "receiptStatus":"1",
+                "payStatus":"1",
+                "sendOutStatus":"1",
+                "refundType":"0",
+                "paySuccessCounter":0,
+                "payFlag":"0",
+                "onlinePayFlag":"0",
+                "productTotalFee":49.78,
+                "orderTotalFee":49.78,
+                "payTotalFee":49.78,
+                "payableAmount":49.78,
+                "balancePayFee":0,
+                "preferential":0,
+                "discountFee":0,
+                "promotionFullReduction":0,
+                "spID":1401,
+                "mainSpID":1304,
+                "note":null,
+                "clubID":5638,
+                "clubScanTime":null,
+                "payWay":null,
+                "orderSource":"6",
+                "closeTime":null,
+                "confirmTime":null,
+                "payTime":null,
+                "orderTime":"2021-03-18 17:09:47",
+                "productCount":1,
+                "presentCount":0,
+                "promotionalGiftsCount":0,
+                "cooFreeFlag":"0",
+                "cooFreeRate":0,
+                "cooFreeAmount":0,
+                "invoiceFlag":"0",
+                "confirmFlag":"0",
+                "clauseID":1,
+                "clauseContent":null,
+                "clauseName":"无条款",
+                "updateDate":"2021-03-18 17:09:47",
+                "freePostFlag":"-1",
+                "freight":0,
+                "delFlag":"0",
+                "freePostageTicketID":null,
+                "splitFlag":"1",
+                "closeReason":null,
+                "postageOrderFlag":"0",
+                "thirdPartyOrderNo":null,
+                "secondHandOrderFlag":"0",
+                "affirmPaymentFlag":"0",
+                "rebateFlag":"0",
+                "zeroCostFlag":0,
+                "orderState":null,
+                "orderMark":null,
+                "receiptAmount":0,
+                "pendingPayments":49.78,
+                "returnedPurchaseFee":null,
+                "shopOrderList":[
+                    {
+                        "shopOrderID":19353,
+                        "shopOrderNo":"X16160585870388801",
+                        "orderNo":"X161605858703888",
+                        "orderID":15189,
+                        "organizeID":null,
+                        "userID":11063,
+                        "shopID":10133,
+                        "orderPromotionsId":null,
+                        "orderType":0,
+                        "orderSubmitType":3,
+                        "presentNum":0,
+                        "itemCount":1,
+                        "outStoreNum":0,
+                        "outStoreTimes":0,
+                        "townID":null,
+                        "note":"",
+                        "fee":-1,
+                        "accountAmount":0,
+                        "productAmount":45.25,
+                        "totalAmount":49.78,
+                        "needPayAmount":49.78,
+                        "discountAmount":null,
+                        "discountFee":0,
+                        "preferential":0,
+                        "promotionFullReduction":0,
+                        "payFlag":"0",
+                        "orderTime":"2021-03-18 17:09:47",
+                        "payTime":null,
+                        "finishTime":null,
+                        "autoOverTimeMills":null,
+                        "status":1,
+                        "payStatus":"1",
+                        "sendOutStatus":"1",
+                        "refundStatus":0,
+                        "returnGoodsStatus":null,
+                        "receiveGoodsTime":null,
+                        "autoReceiveTimeMills":null,
+                        "totalAddedValueTax":null,
+                        "canRefundAmount":49.775,
+                        "refundAmount":null,
+                        "clubID":5638,
+                        "spID":1401,
+                        "mainSpID":1304,
+                        "orderBeanAmount":0,
+                        "useBeanAmount":0,
+                        "useBeanFlag":0,
+                        "canRefundFlag":1,
+                        "useBalanceFlag":0,
+                        "canRefundBeans":null,
+                        "freePostageFee":null,
+                        "freePostageTicketID":null,
+                        "brokerage":5.78,
+                        "delFlag":"0",
+                        "refundsAmount":0,
+                        "orderStatusFlag":"1",
+                        "buyStatus":"1",
+                        "deliveryTimeMills":null,
+                        "orderDeliveryID":null,
+                        "splitFlag":"0",
+                        "receiptedFlag":null,
+                        "receiptedType":null,
+                        "paying":"0",
+                        "shopProductAmount":40,
+                        "shopPostFee":0,
+                        "shopTaxFee":4,
+                        "shouldPayShopAmount":44,
+                        "payedShopAmount":0,
+                        "shopOtherFee":0,
+                        "refunding":null,
+                        "costType":null,
+                        "proportional":null,
+                        "modifyShouldPayNote":null,
+                        "modifyShouldPayUserID":null,
+                        "modifyShouldPayDate":null,
+                        "zeroCostFlag":0,
+                        "shopName":"深圳市采美奥泰贸易有限公司",
+                        "shopLogo":"https://www-b.caimei365.com/uploadFile/shopLogo//userfiles/1/images/photo/2021/01/Cmis21__5o-ADIQEAAD1N_9T1C4174.jpg",
+                        "logisticsRecordList":null,
+                        "orderProductList":[
+                            {
+                                "orderProductID":29336,
+                                "orderNo":"X161605858703888",
+                                "orderID":15189,
+                                "shopOrderID":19353,
+                                "shopOrderNo":"X16160585870388801",
+                                "shopID":10133,
+                                "productID":6418,
+                                "organizeProductID":null,
+                                "organizeID":null,
+                                "num":1,
+                                "presentNum":0,
+                                "outStoreType":null,
+                                "skuID":null,
+                                "props":null,
+                                "propName":null,
+                                "productNo":null,
+                                "price":49.775,
+                                "normalPrice":45.25,
+                                "costPrice":40,
+                                "price0":45.25,
+                                "price1":45.25,
+                                "totalAmount":45.25,
+                                "totalFee":49.78,
+                                "shouldPayFee":49.78,
+                                "discount":100,
+                                "discountPrice":54.305,
+                                "includedTax":"0",
+                                "invoiceType":"2",
+                                "taxRate":10,
+                                "supplierTaxRate":10,
+                                "addedValueTax":4.53,
+                                "totalAddedValueTax":4.53,
+                                "shouldPayTotalTax":4,
+                                "singleShouldPayTotalTax":4,
+                                "shopProductAmount":40,
+                                "shopFee":44,
+                                "otherFee":0,
+                                "cmFee":5.78,
+                                "singleShopFee":44,
+                                "singleOtherFee":0,
+                                "singleCmFee":5.78,
+                                "status":null,
+                                "commentFlag":"0",
+                                "totalBeans":0,
+                                "useBalanceAmount":0,
+                                "useBeanAmount":null,
+                                "notOutStore":1,
+                                "cmbeanPrice":null,
+                                "isActProduct":"0",
+                                "isGiftProduct":"0",
+                                "productActInfo":null,
+                                "buyAgainFlag":"0",
+                                "confirmProductFlag":"0",
+                                "payStatus":"0",
+                                "shopName":"深圳市采美奥泰贸易有限公司",
+                                "name":"【测试用】EndyMed-3Deep-医学美容多功能相控射频",
+                                "productUnit":"台",
+                                "productImage":"https://img-b.caimei365.com/group1/M00/03/20/Cmgy62BHEMOAFVmsAAGOILQcRyE020.jpg",
+                                "actType":null,
+                                "actPreferential":0,
+                                "productType":"0",
+                                "orderPromotionsId":null,
+                                "preferential":0,
+                                "discountFee":0,
+                                "cancelNum":null,
+                                "ladderPriceFlag":0,
+                                "shipmentsNum":null,
+                                "returnedNum":null,
+                                "actualCancelNum":null,
+                                "aliasName":null,
+                                "productCategory":"1",
+                                "secondHandType":null,
+                                "productPromotion":null,
+                                "includedTaxFlag":null
+                            }
+                        ],
+                        "userInfo":null,
+                        "name":null,
+                        "receiptStatus":null,
+                        "shopPromotion":null,
+                        "shouHuoRen":null
+                    }
+                ],
+                "clubName":"正经一点机构",
+                "invoiceStatus":false,
+                "payButton":true,
+                "expensesOfTaxation":null
+            },
+            {
+                "orderID":15170,
+                "orderNo":"X161595081871691",
+                "organizeID":0,
+                "userID":11063,
+                "buyUserID":11062,
+                "shopOrderIDs":"19325",
+                "orderSubmitType":3,
+                "orderType":0,
+                "hasActProduct":"0",
+                "autoCloseTimeMills":0,
+                "status":"0",
+                "receiptStatus":"1",
+                "payStatus":"1",
+                "sendOutStatus":"1",
+                "refundType":"0",
+                "paySuccessCounter":0,
+                "payFlag":"0",
+                "onlinePayFlag":"0",
+                "productTotalFee":61,
+                "orderTotalFee":61,
+                "payTotalFee":61,
+                "payableAmount":61,
+                "balancePayFee":0,
+                "preferential":0,
+                "discountFee":0,
+                "promotionFullReduction":0,
+                "spID":1401,
+                "mainSpID":1304,
+                "note":null,
+                "clubID":5638,
+                "clubScanTime":null,
+                "payWay":null,
+                "orderSource":"6",
+                "closeTime":null,
+                "confirmTime":null,
+                "payTime":null,
+                "orderTime":"2021-03-17 11:13:38",
+                "productCount":4,
+                "presentCount":0,
+                "promotionalGiftsCount":0,
+                "cooFreeFlag":"0",
+                "cooFreeRate":0,
+                "cooFreeAmount":0,
+                "invoiceFlag":"2",
+                "confirmFlag":"0",
+                "clauseID":1,
+                "clauseContent":null,
+                "clauseName":"无条款",
+                "updateDate":"2021-03-17 11:13:38",
+                "freePostFlag":"0",
+                "freight":0,
+                "delFlag":"0",
+                "freePostageTicketID":null,
+                "splitFlag":"1",
+                "closeReason":null,
+                "postageOrderFlag":"0",
+                "thirdPartyOrderNo":null,
+                "secondHandOrderFlag":"0",
+                "affirmPaymentFlag":"0",
+                "rebateFlag":"0",
+                "zeroCostFlag":0,
+                "orderState":null,
+                "orderMark":null,
+                "receiptAmount":0,
+                "pendingPayments":61,
+                "returnedPurchaseFee":null,
+                "shopOrderList":[
+                    {
+                        "shopOrderID":19325,
+                        "shopOrderNo":"X16159508187169101",
+                        "orderNo":"X161595081871691",
+                        "orderID":15170,
+                        "organizeID":0,
+                        "userID":11063,
+                        "shopID":10134,
+                        "orderPromotionsId":null,
+                        "orderType":0,
+                        "orderSubmitType":3,
+                        "presentNum":0,
+                        "itemCount":4,
+                        "outStoreNum":0,
+                        "outStoreTimes":0,
+                        "townID":null,
+                        "note":"",
+                        "fee":0,
+                        "accountAmount":0,
+                        "productAmount":61,
+                        "totalAmount":61,
+                        "needPayAmount":61,
+                        "discountAmount":null,
+                        "discountFee":0,
+                        "preferential":0,
+                        "promotionFullReduction":0,
+                        "payFlag":"0",
+                        "orderTime":"2021-03-17 11:13:38",
+                        "payTime":null,
+                        "finishTime":null,
+                        "autoOverTimeMills":null,
+                        "status":1,
+                        "payStatus":"1",
+                        "sendOutStatus":"1",
+                        "refundStatus":0,
+                        "returnGoodsStatus":null,
+                        "receiveGoodsTime":null,
+                        "autoReceiveTimeMills":null,
+                        "totalAddedValueTax":null,
+                        "canRefundAmount":61,
+                        "refundAmount":null,
+                        "clubID":5638,
+                        "spID":1401,
+                        "mainSpID":1304,
+                        "orderBeanAmount":0,
+                        "useBeanAmount":0,
+                        "useBeanFlag":0,
+                        "canRefundFlag":1,
+                        "useBalanceFlag":0,
+                        "canRefundBeans":null,
+                        "freePostageFee":null,
+                        "freePostageTicketID":null,
+                        "brokerage":21,
+                        "delFlag":"0",
+                        "refundsAmount":0,
+                        "orderStatusFlag":"1",
+                        "buyStatus":"1",
+                        "deliveryTimeMills":null,
+                        "orderDeliveryID":null,
+                        "splitFlag":"1",
+                        "receiptedFlag":null,
+                        "receiptedType":null,
+                        "paying":"0",
+                        "shopProductAmount":40,
+                        "shopPostFee":0,
+                        "shopTaxFee":0,
+                        "shouldPayShopAmount":40,
+                        "payedShopAmount":0,
+                        "shopOtherFee":0,
+                        "refunding":null,
+                        "costType":null,
+                        "proportional":null,
+                        "modifyShouldPayNote":null,
+                        "modifyShouldPayUserID":null,
+                        "modifyShouldPayDate":null,
+                        "zeroCostFlag":0,
+                        "shopName":"深圳市美轮美奂服务有限公司",
+                        "shopLogo":"https://www-b.caimei365.com/img/default/suppliver.jpg",
+                        "logisticsRecordList":null,
+                        "orderProductList":[
+                            {
+                                "orderProductID":29294,
+                                "orderNo":"X161595081871691",
+                                "orderID":15170,
+                                "shopOrderID":19325,
+                                "shopOrderNo":"X16159508187169101",
+                                "shopID":10134,
+                                "productID":6421,
+                                "organizeProductID":null,
+                                "organizeID":0,
+                                "num":4,
+                                "presentNum":0,
+                                "outStoreType":null,
+                                "skuID":null,
+                                "props":null,
+                                "propName":null,
+                                "productNo":null,
+                                "price":15.25,
+                                "normalPrice":15.25,
+                                "costPrice":10,
+                                "price0":15.25,
+                                "price1":15.25,
+                                "totalAmount":61,
+                                "totalFee":61,
+                                "shouldPayFee":61,
+                                "discount":100,
+                                "discountPrice":15.25,
+                                "includedTax":"0",
+                                "invoiceType":"3",
+                                "taxRate":0,
+                                "supplierTaxRate":0,
+                                "addedValueTax":0,
+                                "totalAddedValueTax":0,
+                                "shouldPayTotalTax":0,
+                                "singleShouldPayTotalTax":0,
+                                "shopProductAmount":40,
+                                "shopFee":40,
+                                "otherFee":0,
+                                "cmFee":21,
+                                "singleShopFee":10,
+                                "singleOtherFee":0,
+                                "singleCmFee":5.25,
+                                "status":null,
+                                "commentFlag":"0",
+                                "totalBeans":0,
+                                "useBalanceAmount":0,
+                                "useBeanAmount":null,
+                                "notOutStore":4,
+                                "cmbeanPrice":null,
+                                "isActProduct":"0",
+                                "isGiftProduct":"0",
+                                "productActInfo":null,
+                                "buyAgainFlag":"0",
+                                "confirmProductFlag":"0",
+                                "payStatus":"0",
+                                "shopName":"深圳市美轮美奂服务有限公司",
+                                "name":"【测试用】肌本演绎【O4元素破茧疗法】25800 特惠方案",
+                                "productUnit":"瓶",
+                                "productImage":"https://img-b.caimei365.com/group1/M00/03/20/Cmgy62BHJGCARS7iAAVlWLR-uKU385.jpg",
+                                "actType":null,
+                                "actPreferential":0,
+                                "productType":"0",
+                                "orderPromotionsId":null,
+                                "preferential":0,
+                                "discountFee":0,
+                                "cancelNum":null,
+                                "ladderPriceFlag":0,
+                                "shipmentsNum":null,
+                                "returnedNum":null,
+                                "actualCancelNum":null,
+                                "aliasName":null,
+                                "productCategory":"1",
+                                "secondHandType":null,
+                                "productPromotion":null,
+                                "includedTaxFlag":null
+                            }
+                        ],
+                        "userInfo":null,
+                        "name":null,
+                        "receiptStatus":null,
+                        "shopPromotion":null,
+                        "shouHuoRen":null
+                    }
+                ],
+                "clubName":"正经一点机构",
+                "invoiceStatus":false,
+                "payButton":false,
+                "expensesOfTaxation":null
+            }
+        ]
+module.exports = {
+	addressList,
+	cartList,
+	productList,
+	orderDataList
+}

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 7 - 0
components/clipboard/clipboard.min.js


+ 55 - 0
components/clipboard/clipboard.thorui.js

@@ -0,0 +1,55 @@
+/**
+ * 复制文本 兼容H5
+ * 来自 ThorUI  www.thorui.cn | 文档地址: www.donarui.com
+ * @author echo.
+ * @version 1.0.0
+ **/
+// #ifdef H5
+import ClipboardJS from "@/components/clipboard/clipboard.min.js"
+// #endif
+const thorui = {
+	getClipboardData: function(data, callback) {
+		// #ifdef APP-PLUS || MP
+		uni.setClipboardData({
+			data: data,
+			success(res) {
+				uni.getClipboardData({
+					success(res) {
+						("function" == typeof callback) && callback(true)
+					},
+					fail(res) {
+						("function" == typeof callback) && callback(false)
+					}
+				})
+			},
+			fail(res) {
+				("function" == typeof callback) && callback(false)
+			}
+		})
+		// #endif
+
+		// #ifdef H5
+		let event = window.event || {}
+		let clipboard = new ClipboardJS("", {
+			text: () => data
+		})
+		clipboard.on('success', (e) => {
+			("function" == typeof callback) && callback(true)
+			clipboard.off('success')
+			clipboard.off('error')
+			clipboard.destroy()
+		});
+		clipboard.on('error', (e) => {
+			("function" == typeof callback) && callback(false)
+			clipboard.off('success')
+			clipboard.off('error')
+			clipboard.destroy()
+		});
+		clipboard.onClick(event)
+		// #endif
+	}
+};
+
+module.exports = {
+	getClipboardData: thorui.getClipboardData
+};

+ 267 - 0
components/clipboard/formValidation.js

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

+ 25 - 0
components/clipboard/utils.js

@@ -0,0 +1,25 @@
+const utils = {
+  getComponent: function(selector) {
+    const pages = getCurrentPages();
+    const current = pages[pages.length - 1];
+    //const component = current.selectAllComponents(selector);
+    const component = current.selectComponent(selector);
+    if (!component) {
+      return null;
+    }
+    return component;
+  },
+  toast: function(options) {
+    const {
+      //selector = '.tui-tips-ctx'
+      selector = '#tui-tips-ctx'
+    } = options;
+    const component = utils.getComponent(selector);
+    if (component) {
+      component.showTips(options);
+    }
+  }
+};
+module.exports = {
+  toast: utils.toast
+};

+ 107 - 0
components/cm-custom/au-custom.vue

@@ -0,0 +1,107 @@
+<template name="headerNavbar">
+	<!-- 自定义导航栏 -->
+	<view class='navbar-wrap' :style="{height:CustomBar+'px',paddingTop:StatusBar+'px'}"> 
+	  	<view class="navbar-text" 
+			  :style="{color:navbarData.textColor ? navbarData.textColor:'',lineHeight:(CustomBar - StatusBar)+'px;',fontSize:fontSizeSetting+'px;',paddingLeft:navbarData.textLeft ? '' : (capsule.height+10)+'px'}" :class="platformClass">
+	    	  {{navbarData.title ? navbarData.title : " "}}
+	  	</view>
+	  	<view class="navbar-icon" v-if="navbarData.showCapsule == 1 ? true : false" 
+			  :style="{color:navbarData.textColor ? navbarData.textColor:'',top:capsule.top +'px;',left:((screenWidth-capsule.right)+5)+'px;',height:capsule.height+'px;',lineHeight:capsule.height+'px;'}">
+			  <text v-if="navbarData.haveBack" @tap="BackPage" class="iconfont icon-fanhui"></text>
+	  	</view>
+	</view>
+</template>
+
+<script>
+	var self;
+	export default{
+		name:'headerNavbar',
+		props:{
+		    navbarData: { // 由父页面传递的数据
+				type: Object
+		    }
+		},
+		data() {
+			return{
+				CustomBar:this.CustomBar,// 顶部导航栏高度
+				StatusBar: this.StatusBar,
+				fontSizeSetting:this.fontSizeSetting,
+				screenWidth:this.screenWidth,
+				capsule:this.capsule,
+				platformClass:this.platformClass,
+			}
+		},
+		created() {
+			if (getCurrentPages().length === 1) { // 当只有一个页面时
+			      this.navbarData.haveBack = false;
+			} else {
+			      this.navbarData.haveBack = true;
+			}
+		},
+		onLoad(){
+			
+		},
+		methods:{
+			BackPage: function () {
+				this.$emit('navigateBack')
+		    },
+			_goSearchPath:function () {
+				this.$emit('goSearchPath')
+			},
+			_goHome:function(){
+				uni.switchTab({
+		        	url: '/pages/tabBar/home/index'
+		      	})
+			}
+		},
+		onShow(){
+	
+		}
+	}
+</script>
+
+<style lang="scss">
+	.navbar-wrap {
+		 position: fixed;
+		 width: 100%;
+		 top: 0;
+		 z-index: 100000;
+		 box-sizing: border-box;
+	}
+	.navbar-text {
+		 font-size: 30rpx;
+		 color: #000000;
+		 font-weight: 500;
+	}
+	.navbar-text.center{
+		text-align: center;
+	}
+	.navbar-text.left{
+		text-align: left;
+		padding-left: 45px;
+	}
+	.navbar-icon {
+		 position: fixed;
+		 display: flex;
+		 box-sizing: border-box;
+	}
+	.navbar-icon .iconfont {
+		 display: inline-block;
+		 overflow: hidden;
+		 font-size: 44rpx;
+		 padding-right:40rpx;
+		 margin-top: 1px;
+	}
+	.navbar-icon .icon-sousuo {
+		color: #000000;
+	}
+	.navbar-icon view {
+		 height: 18px;
+		 border-left: 0.5px solid rgba(0,0,0, 0.3);
+		 margin-top: 6px;
+	}
+	.navbar-loading {
+		 background: #fff;
+		 text-align: center;
+	}
+</style>

+ 122 - 0
components/cm-custom/cm-custom.vue

@@ -0,0 +1,122 @@
+<template name="headerNavbar">
+	<!-- 自定义导航栏 -->
+	<view class='navbar-wrap' :style="{height:CustomBar+'px',paddingTop:StatusBar+'px',background:navbarData.bgColor ? navbarData.bgColor : ''}"> 
+	  	<view class="navbar-text" 
+			  :style="{color:navbarData.textColor ? navbarData.textColor:'',lineHeight:(CustomBar - StatusBar)+'px;',fontSize:fontSizeSetting+'px;',paddingLeft:navbarData.textLeft ? '' : 12+'px'}" :class="platformClass">
+	    	  {{navbarData.title ? navbarData.title : " "}}
+	  	</view>
+	  	<view class="navbar-icon" v-if="navbarData.showCapsule == 1 ? true : false" 
+			  :style="{top:capsule.top +'px;',left:((screenWidth-capsule.right)+5)+'px;',height:capsule.height+'px;',lineHeight:capsule.height+'px;'}">
+			  <text v-if="navbarData.haveBack" @tap="BackPage" class="iconfont icon-fanhui"></text>
+			  <text v-if="navbarData.haveHome" @tap="_goHome" class="iconfont icon-fanhuishouye"></text>
+	  	</view>
+		<view class="navbar-icon" v-if="navbarData.showSearch == 1 ? true : false"
+			  :style="{top:capsule.top+'px;',right:(capsule.width)+'px;',height:capsule.height+'px;',lineHeight:capsule.height+'px;'}">
+			  <text @click.stop="_goSearchPath" class="iconfont icon-sousuo"></text>
+	  	</view>
+	</view>
+</template>
+
+<script>
+	var self;
+	export default{
+		name:'headerNavbar',
+		props:{
+		    navbarData: { // 由父页面传递的数据
+				type: Object,
+				default: () =>({
+					showCapsule: 1, // 是否显示左上角图标  1表示显示  0表示不显示,
+					showSearch: 0,
+					title: '', // 导航栏 中间的标题
+					haveBack:false,
+					home:false,
+					textLeft:false,
+					bgColor:'',
+					textColor:'#000000'
+				})
+		    }
+		},
+		data() {
+			return{
+				CustomBar:this.CustomBar,// 顶部导航栏高度
+				StatusBar: this.StatusBar,
+				fontSizeSetting:this.fontSizeSetting,
+				screenWidth:this.screenWidth,
+				capsule:this.capsule,
+				platformClass:this.platformClass,
+			}
+		},
+		created() {
+			if (getCurrentPages().length === 1) { // 当只有一个页面时
+			      this.navbarData.haveBack = false;
+			} else {
+			      this.navbarData.haveBack = true;
+			}
+		},
+		onLoad(){
+			
+		},
+		methods:{
+			BackPage: function () {
+				this.$emit('navigateBack')
+		    },
+			_goSearchPath:function () {
+				this.$emit('goSearchPath')
+			},
+			_goHome:function(){
+				uni.switchTab({
+		        	url: '/pages/tabBar/home/index'
+		      	})
+			}
+		},
+		onShow(){
+	
+		}
+	}
+</script>
+
+<style lang="scss">
+	.navbar-wrap {
+		 position: fixed;
+		 width: 100%;
+		 top: 0;
+		 z-index: 100000;
+		 box-sizing: border-box;
+	}
+	.navbar-text {
+		 font-size: 30rpx;
+		 color: #000000;
+		 font-weight: 500;
+	}
+	.navbar-text.center{
+		text-align: center;
+	}
+	.navbar-text.left{
+		text-align: left;
+		padding-left: 45px;
+	}
+	.navbar-icon {
+		 position: fixed;
+		 display: flex;
+		 box-sizing: border-box;
+	}
+	.navbar-icon .iconfont {
+		 display: inline-block;
+		 overflow: hidden;
+		 font-size: 44rpx;
+		 padding-right:40rpx;
+		 margin-top: 1px;
+	}
+	.navbar-icon .icon-sousuo {
+		color: #000000;
+	}
+	.navbar-icon view {
+		 height: 18px;
+		 border-left: 0.5px solid rgba(0,0,0, 0.3);
+		 margin-top: 6px;
+	}
+	.navbar-loading {
+		 background: #fff;
+		 text-align: center;
+	}
+</style>

+ 148 - 0
components/cm-custom/cm-drag.vue

@@ -0,0 +1,148 @@
+<template>
+	<view>
+		<view
+			id="_drag_button"
+			class="cart-icon"
+			:style="'left: ' + left + 'px; top:' + top + 'px;'"
+			@touchstart="touchstart"
+			@touchmove.stop.prevent="touchmove"
+			@touchend="touchend"
+			@click.stop.prevent="click"
+			:class="{transition: isDock && !isMove }"
+		>
+			<text v-if="cartNum > 0" class="uni-badge uni-badge-error uni-small uni-badge--small icon-num">
+				{{cartNum >= 100 ? '99+' : cartNum}}
+			</text>
+			<image src='https://static.caimei365.com/app/wisa/img/icon/cart.png' mode="widthFix"></image>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'drag-button',
+		props: {
+			cartNum:{
+				type: Number,
+				default: 0
+			},
+			isDock:{
+				type: Boolean,
+				default: false
+			},
+			existTabBar:{
+				type: Boolean,
+				default: false
+			}
+		},
+		data() {
+			return {
+				top:300,
+				left:150,
+				width: 0,
+				height: 0,
+				offsetWidth: 0,
+				offsetHeight: 0,
+				windowWidth: 0,
+				windowHeight: 0,
+				isMove: true,
+				edge: 10,
+			}
+		},
+		mounted() {
+			const sys = uni.getSystemInfoSync();
+			this.windowWidth = sys.windowWidth;
+			this.windowHeight = sys.windowHeight;
+			// #ifdef APP-PLUS
+				this.existTabBar && (this.windowHeight -= 50);
+			// #endif
+			if (sys.windowTop) {
+				this.windowHeight += sys.windowTop;
+			}
+			// console.log(sys)
+			const query = uni.createSelectorQuery().in(this);
+			query.select('#_drag_button').boundingClientRect(data => {
+				this.width = data.width;
+				this.height = data.height;
+				this.offsetWidth = data.width / 2;
+				this.offsetHeight = data.height / 2;
+				this.left = this.windowWidth - this.width - this.edge-5;
+				this.top = this.windowHeight - this.height - this.edge-150;
+			}).exec();
+		},
+		methods: {
+			click() {
+				this.$emit('btnClick');
+			},
+			touchstart(e) {
+				this.$emit('btnTouchstart');
+			},
+			touchmove(e) {
+				// 单指触摸
+				if (e.touches.length !== 1) {
+					return false;
+				}
+				this.isMove = true;
+				this.left = e.touches[0].clientX - this.offsetWidth;
+				let clientY = e.touches[0].clientY - this.offsetHeight;
+				// #ifdef H5
+					clientY += this.height;
+				// #endif
+				let edgeBottom = this.windowHeight - this.height - this.edge;
+				// 上下触及边界
+				if (clientY < this.edge) {
+					this.top = this.edge;
+				} else if (clientY > edgeBottom) {
+					this.top = edgeBottom;
+				} else {
+					this.top = clientY
+				}
+			},
+			touchend(e) {
+				if (this.isDock) {
+					let edgeRigth = this.windowWidth - this.width - this.edge;
+					
+					if (this.left < this.windowWidth / 2 - this.offsetWidth) {
+						this.left = this.edge;
+					} else {
+						this.left = edgeRigth;
+					}
+					
+				}
+				
+				this.isMove = false;
+				this.$emit('btnTouchend');
+			},
+		}}
+</script>
+
+<style lang="scss">
+	.cart-icon {
+		width: 92rpx;
+		height: 92rpx;
+		border-radius: 50%;
+		background: rgba(182,118,47, 0.2);
+		position: fixed;
+		right: 24rpx;
+		bottom: 28%;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		cursor: pointer;
+		z-index: 20;
+		image {
+			width: 58rpx;
+			height: 58rpx;
+		}
+		text {
+			font-size: 28rpx;
+			position: absolute;
+			top: -10rpx;
+			right: 0;
+		}
+		&.transition {
+			transition: left .3s ease,top .3s ease;
+		}
+	}
+	
+</style>

+ 114 - 0
components/cm-custom/cu-custom.vue

@@ -0,0 +1,114 @@
+<template name="headerNavbar">
+	<!-- 自定义导航栏 -->
+	<view class='navbar-wrap' :style="{height:CustomBar+'px',paddingTop:StatusBar+'px',background:navbarData.bgColor ? navbarData.bgColor : '#FFFFFF'}"> 
+	  	<view class="navbar-text" 
+			  :style="{color:navbarData.textColor ? navbarData.textColor:'',lineHeight:(CustomBar - StatusBar)+'px;',fontSize:fontSizeSetting+'px;',paddingLeft:navbarData.textLeft ? '' : (capsule.height+10)+'px'}" :class="platformClass">
+	    	  {{navbarData.title ? navbarData.title : " "}}
+	  	</view>
+	  	<view class="navbar-icon" v-if="navbarData.showCapsule == 1 ? true : false" 
+			  :style="{top:capsule.top +'px;',left:((screenWidth-capsule.right)+5)+'px;',height:capsule.height+'px;',lineHeight:capsule.height+'px;'}">
+			  <text v-if="navbarData.haveBack" @tap="BackPage" class="iconfont icon-daohangfanhui"></text>
+			  <text v-if="navbarData.haveHome" @tap="_goHome" class="iconfont icon-fanhuishouye"></text>
+	  	</view>
+		<view class="navbar-icon" v-if="navbarData.showSearch == 1 ? true : false"
+			  :style="{top:capsule.top+'px;',right:(capsule.width)+'px;',height:capsule.height+'px;',lineHeight:capsule.height+'px;'}">
+			  <text @click.stop="_goSearchPath" class="iconfont icon-sousuo"></text>
+	  	</view>
+	</view>
+</template>
+
+<script>
+	var self;
+	export default{
+		name:'headerNavbar',
+		props:{
+		    navbarData: { // 由父页面传递的数据
+				type: Object
+		    }
+		},
+		data() {
+			return{
+				CustomBar:this.CustomBar,// 顶部导航栏高度
+				StatusBar: this.StatusBar,
+				fontSizeSetting:this.fontSizeSetting,
+				screenWidth:this.screenWidth,
+				capsule:this.capsule,
+				platformClass:this.platformClass,
+			}
+		},
+		created() {
+			if (getCurrentPages().length === 1) { // 当只有一个页面时
+			      this.navbarData.haveBack = false;
+			} else {
+			      this.navbarData.haveBack = true;
+			}
+		},
+		onLoad(){
+			
+		},
+		methods:{
+			BackPage: function () {
+				this.$emit('navigateBack')
+		    },
+			_goSearchPath:function () {
+				this.$emit('goSearchPath')
+			},
+			_goHome:function(){
+				uni.switchTab({
+		        	url: '/pages/tabBar/home/index'
+		      	})
+			}
+		},
+		onShow(){
+	
+		}
+	}
+</script>
+
+<style lang="scss">
+	.navbar-wrap {
+		 position: fixed;
+		 width: 100%;
+		 top: 0;
+		 z-index: 100000;
+		 box-sizing: border-box;
+		 background: #FFFFFF;
+		 border-bottom: 1px solid #F7F7F7;
+	}
+	.navbar-text {
+		 font-size: 30rpx;
+		 color: #000000;
+		 font-weight: 500;
+	}
+	.navbar-text.center{
+		text-align: center;
+	}
+	.navbar-text.left{
+		text-align: left;
+		padding-left: 45px;
+	}
+	.navbar-icon {
+		 position: fixed;
+		 display: flex;
+		 box-sizing: border-box;
+	}
+	.navbar-icon .iconfont {
+		 display: inline-block;
+		 overflow: hidden;
+		 font-size: 44rpx;
+		 padding-right:40rpx;
+		 margin-top: 1px;
+	}
+	.navbar-icon .icon-sousuo {
+		color: #000000;
+	}
+	.navbar-icon view {
+		 height: 18px;
+		 border-left: 0.5px solid rgba(0,0,0, 0.3);
+		 margin-top: 6px;
+	}
+	.navbar-loading {
+		 background: #fff;
+		 text-align: center;
+	}
+</style>

+ 159 - 0
components/cm-custom/custom-d.vue

@@ -0,0 +1,159 @@
+<template name="headerNavbar">
+	<!-- 发货记录自定义导航栏 -->
+	<view class='navbar-wrap' :style="{height:navbarHeight+'px',paddingTop:statusBarHeight+'px'}"> 
+	  	<view class="navbar-text" :style="{lineHeight:(navbarHeight - statusBarHeight)+'px;',fontSize:fontSizeSetting+'px;'}">
+	    	{{navbarData.title ? navbarData.title : " "}}
+	  	</view>
+	  	<view class="navbar-icon" :style="{width:headerBtnPosi.width+'px',lineHeight:(navbarBtn.height)+'px',top:navbarBtn.top + statusBarHeight+'px',left:navbarBtn.right+'px',height:(navbarBtn.height)+'px'}">
+			  <text @click="_goBack" class="iconfont icon-shangyibu" :style="{width:headerBtnPosi.width/2+'px',height:navbarBtn.height+'px'}"></text>
+	      	  <text class="iconfont icon-vertical_line" :style="{borderColor:navbarData.borderColor ? navbarData.borderColor : 'rgba(0,0,0,0.4)'}"></text>
+			  <text @click="_goDetails" class="iconfont icon-fanhuishouye" :style="{width:headerBtnPosi.width/2+'px',height:navbarBtn.height+'px'}"></text>
+	  	</view>
+	</view>
+</template>
+
+<script>
+	var self;
+	export default{
+		name:'headerNavbar',
+		props:{
+		    navbarData: { // 由父页面传递的数据
+				type: Object
+		    },
+			systeminfo:{
+				type:Object
+			},
+			headerBtnPosi:{
+				type:Object
+			},
+			page:{
+				type:Number
+			}
+		},
+		data() {
+			return{
+				haveBack: true, // 是否有返回按钮,true 有 false 没有 若从分享页进入则为 false
+			    statusBarHeight: 0, // 状态栏高度
+			    navbarHeight: 0, // 顶部导航栏高度
+			    navbarBtn: { // 胶囊位置信息
+			      height: 0,
+			      width: 0,
+			      top: 0,
+			      bottom: 0,
+			      right: 0
+				},
+				platform:'',
+				fontSizeSetting:0,
+				screenWidth:0
+			}
+		},
+		created() {
+			this.fontSizeSetting = this.systeminfo.fontSizeSetting
+			let statusBarHeight = this.systeminfo.statusBarHeight // 状态栏高度
+			let headerPosi = this.headerBtnPosi // 胶囊位置信息
+		    /**
+		     * wx.getMenuButtonBoundingClientRect() 坐标信息以屏幕左上角为原点
+		     * 菜单按键宽度: 87
+		     * 菜单按键高度: 32
+		     * 菜单按键左边界坐标: 278
+		     * 菜单按键上边界坐标: 26
+		     * 菜单按键右边界坐标: 365
+		     * 菜单按键下边界坐标: 58
+		     */
+			let btnPosi = { // 胶囊实际位置,坐标信息不是左上角原点
+			      height: headerPosi.height,
+			      width: headerPosi.width,
+			      // 胶囊top - 状态栏高度
+			      top: headerPosi.top - statusBarHeight,
+			      // 胶囊bottom - 胶囊height - 状态栏height (现胶囊bottom 为距离导航栏底部的长度)
+			      bottom: headerPosi.bottom - headerPosi.height - statusBarHeight,
+			      // 屏幕宽度 - 胶囊right
+			      right: this.systeminfo.screenWidth - headerPosi.right
+			}
+			let haveBack;
+			if (getCurrentPages().length === 1) { // 当只有一个页面时
+			     haveBack = false;
+			} else {
+			     haveBack = true;
+			}
+		    this.haveBack=haveBack, // 获取是否是通过分享进入的小程序
+		    this.statusBarHeight=statusBarHeight,
+		    this.navbarHeight= headerPosi.bottom + btnPosi.bottom, // 原胶囊bottom + 现胶囊bottom
+		    this.navbarBtn=btnPosi
+		},
+		onLoad(){
+			
+		},
+		methods:{
+			_goBack: function () {
+		      	uni.navigateBack({
+		        	delta: this.page
+		      	});
+		    },
+		    _goDetails: function () {
+		      this.$emit('pageDetails')
+		    }
+		},
+		onShow(){
+	
+		}
+	}
+</script>
+
+<style lang="scss">
+	.navbar-wrap {
+		 position: fixed;
+		 width: 100%;
+		 top: 0;
+		 z-index: 9999;
+		 box-sizing: border-box;
+		 background: #FFFFFF;
+		 border-bottom: 1px solid #F8F8F8;
+	}
+	.navbar-text {
+		 text-align: center;
+		 color: #000000;
+		 font-weight: 500;
+	}
+	.navbar-icon {
+		 position: fixed;
+		 display: flex;
+		 border-radius: 64rpx;
+		 border: 0.5px solid rgba(0,0,0, 0.2);
+		 box-sizing: border-box;
+	}
+	.navbar-icon .iconfont {
+		 text-align: center;
+		 display: inline-block;
+		 overflow: hidden;
+		 margin-bottom: 1px;
+	}
+	.navbar-icon .icon-vertical_line {
+		color: #999999;
+	}
+	.navbar-loading {
+		 background: #fff;
+		 text-align: center;
+	}
+</style>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 229 - 0
components/cm-custom/custom-p.vue

@@ -0,0 +1,229 @@
+<template name="headerNavbar">
+	<!-- 自定义导航栏 -->
+	<view class='navbar-wrap' :class="[headerColor? 'bg-color' : 'no-color']" :style="{height:navbarHeight+'px',paddingTop:statusBarHeight+'px'}"> 
+	  	<view class="navbar-icon" v-if="navbarData.showCapsule ? navbarData.showCapsule : true" 
+			  :style="{top:navbarBtn.top + statusBarHeight+'px;',lineHeight:navbarBtn.height+'px;',left:navbarBtn.right+'px;',width:navbarBtn.height+'px;',height:navbarBtn.height+'px;'}">
+			  <text v-if='haveBack' @click="_goBack" class="iconfont icon-daohangfanhui"></text>
+			  <text v-else  @click="_goHome" class="iconfont icon-fanhuishouye"></text>
+	  	</view>
+		<view class="navbar-text" :style="{top:navbarBtn.top + statusBarHeight+'px;',height:navbarBtn.height+'px;',fontSize:fontSizeSetting+'px;'}">
+	    	<view class="gosearch-btn" :style="{paddingLeft:navbarBtn.height+'px;',right:(navbarBtn.width+20)+'px;',borderRadius:(navbarBtn.height/2)+'px;',width:(375-navbarBtn.width*2)+'px;',lineHeight:navbarBtn.height+'px;'}">
+				<text class="iconfont icon-sousuo" :style="{width:navbarBtn.height+'px;',height:navbarBtn.height+'px;',lineHeight:navbarBtn.height+'px;'}"></text>
+				<view class="input" @click="this.$api.navigateTo(clickPath)">搜索商品/供应商/项目仪器</view>
+			</view>
+	  	</view>
+	</view>
+</template>
+
+<script>
+	var self;
+	export default{
+		name:'headerNavbar',
+		props:{
+		    navbarData: { // 由父页面传递的数据
+				type: Object
+		    },
+			systeminfo:{
+				type:Object
+			},
+			headerBtnPosi:{
+				type:Object
+			},
+			page:{
+				type:Number
+			},
+			headerColor:{
+				type:Boolean
+			},
+			headerTitle:{
+				type:String
+			},
+			type:{
+				type:String
+			},
+		},
+		data() {
+			return{
+				headerType:'',
+				clickPath:'/search/pages/search/search', 
+				haveBack: true, // 是否有返回按钮,true 有 false 没有 若从分享页进入则为 false
+			    statusBarHeight: 0, // 状态栏高度
+			    navbarHeight: 0, // 顶部导航栏高度,
+			    navbarBtn: { // 胶囊位置信息
+			      height: 0,
+			      width: 0,
+			      top: 0,
+			      bottom: 0,
+			      right: 0
+				},
+				platform:'',
+				fontSizeSetting:0
+			}
+		},
+		created() {
+			this.headerType = this.type
+			this.fontSizeSetting = this.systeminfo.fontSizeSetting
+			let statusBarHeight = this.systeminfo.statusBarHeight // 状态栏高度
+			let headerPosi = this.headerBtnPosi // 胶囊位置信息
+		    /**
+		     * wx.getMenuButtonBoundingClientRect() 坐标信息以屏幕左上角为原点
+		     * 菜单按键宽度: 87
+		     * 菜单按键高度: 32
+		     * 菜单按键左边界坐标: 278
+		     * 菜单按键上边界坐标: 26
+		     * 菜单按键右边界坐标: 365
+		     * 菜单按键下边界坐标: 58
+		     */
+			let btnPosi = { // 胶囊实际位置,坐标信息不是左上角原点
+			      height: headerPosi.height,
+			      width: headerPosi.width,
+			      // 胶囊top - 状态栏高度
+			      top: headerPosi.top - statusBarHeight,
+			      // 胶囊bottom - 胶囊height - 状态栏height (现胶囊bottom 为距离导航栏底部的长度)
+			      bottom: headerPosi.bottom - headerPosi.height - statusBarHeight,
+			      // 屏幕宽度 - 胶囊right
+			      right: this.systeminfo.screenWidth - headerPosi.right
+			}
+			console.log(btnPosi)
+			let haveBack;
+			if (getCurrentPages().length === 1) { // 当只有一个页面时
+			     haveBack = false;
+			} else {
+			     haveBack = true;
+			}
+		    this.haveBack=haveBack, // 获取是否是通过分享进入的小程序
+		    this.statusBarHeight=statusBarHeight,
+		    this.navbarHeight= headerPosi.bottom + btnPosi.bottom, // 原胶囊bottom + 现胶囊bottom
+			this.$parent.navbarHeight = this.navbarHeight
+			this.$parent.statusBarHeight = this.statusBarHeight
+			// console.log(this.navbarHeight);
+		    this.navbarBtn=btnPosi
+		},
+		onLoad(){
+			
+		},
+		methods:{
+			_goBack: function () {
+		      	uni.navigateBack({
+		        	delta: this.page
+		      	});
+		    },
+		    _goHome: function () {
+		      	uni.switchTab({
+		        	url: '/pages/tabBar/home/index'
+		      	})
+		    }
+		},
+		onShow(){
+	
+		}
+	}
+</script>
+
+<style lang="scss">
+	.navbar-wrap {
+		 position: fixed;
+		 width: 100%;
+		 top: 0;
+		 z-index: 100000;
+		 box-sizing: border-box;
+		 &.bg-color{
+			animation: showColor 0.3s ease-in-out both;
+		 }
+		 &.no-color{
+		    animation: hideColor 0.3s ease-in-out both;
+		 }
+	}
+	.navbar-text {
+		 width: 100%;
+		 color: #000000;
+		 font-weight: 500;
+		 position: fixed;
+	}
+	.gosearch-btn{
+		height: 100%;
+		background: rgba(255, 255, 255, 0.6);
+		font-size: 28rpx;
+		color: #999999;
+		position: relative;
+		box-sizing: border-box;
+		position:absolute ;
+		top: 0;
+		border: 0.5px solid rgba(0, 0, 0, 0.1);
+		.icon-sousuo{
+			height: 100%;
+			text-align: center;
+			display: block;
+			position: absolute;
+			left: 0;
+			top: 0;
+			font-size: 34rpx;
+			color: #999999;
+			z-index: 10;
+		}
+		.input{
+			height: 100%;
+			float: left;
+			font-size: $font-size-24;
+			text-align: left;
+		}
+	}
+	.navbar-icon {
+		 position: fixed;
+		 display: flex;
+		 border-radius: 50%;
+		 text-align: center;
+		 background: rgba(255,255,255,0.6);
+		 border: 0.5px solid rgba(0,0,0, 0.1);
+		 box-sizing: border-box;
+		 z-index: 9999;
+	}
+	.navbar-icon .iconfont {
+		 height: 100%;
+		 width: 100%;
+		 font-size: 38rpx;
+		 font-weight: bold;
+		 display: inline-block;
+		 overflow: hidden;
+	}
+	.navbar-icon view {
+		 height: 18px;
+		 border-left: 0.5px solid rgba(0,0,0, 0.3);
+		 margin-top: 6px;
+	}
+	.navbar-loading {
+		 background: #fff;
+		 text-align: center;
+	}
+	@keyframes showColor {
+		0% {background: rgba(255,255,255,0);}
+		50% {background: rgba(255,255,255,0.5);}
+		100% {background: rgba(255,255,255,1);}
+	}
+	@keyframes hideColor {
+		0% {background: rgba(255,255,255,1);}
+		50% {background: rgba(255,255,255,0.5);}
+		100% {background: rgba(255,255,255,0);}
+	}
+</style>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 160 - 0
components/cm-custom/index-custom.vue

@@ -0,0 +1,160 @@
+<template name="headerNavbar">
+	<!-- 自定义导航栏 -->
+	<view class='navbar-wrap' :style="{height:(CustomBar+55)+'px',paddingTop:StatusBar+'px'}"> 
+	  	<view class="navbar-text" 
+			  :style="{color:navbarData.textColor ? navbarData.textColor:'',lineHeight:(CustomBar - StatusBar)+'px;',fontSize:fontSizeSetting+'px;',paddingLeft:navbarData.textLeft ? '' : 12+'px'}" :class="platformClass">
+	    	  {{navbarData.title ? navbarData.title : " "}}
+	  	</view>
+		<view class="search-input">
+			<view class="gosearch-btn" @click="this.$api.navigateTo(clickPath)">
+				<view class="search-icon">
+					<text class="iconfont icon-iconfonticonfontsousuo1"></text>
+				</view>
+				<view class="search-text">{{hotSearchText}}</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	var self;
+	import btSearch from '@/components/uni-search/bt-search.vue'
+	export default{
+		name:'headerNavbar',
+		components:{
+			btSearch,
+		},
+		props:{
+		    navbarData: { // 由父页面传递的数据
+				type: Object
+		    }
+		},
+		data() {
+			return{
+				clickPath:'/search/pages/search/search',
+				hotSearchText:'搜索商品/项目仪器',
+				CustomBar:this.CustomBar,// 顶部导航栏高度
+				StatusBar: this.StatusBar,
+				fontSizeSetting:this.fontSizeSetting,
+				screenWidth:this.screenWidth,
+				capsule:this.capsule,
+				platformClass:this.platformClass,
+			}
+		},
+		created() {
+			if (getCurrentPages().length === 1) { // 当只有一个页面时
+			      this.navbarData.haveBack = false;
+			} else {
+			      this.navbarData.haveBack = true;
+			}
+		},
+		onLoad(){
+			
+		},
+		methods:{
+			BackPage: function () {
+				this.$emit('navigateBack')
+		    },
+			_goSearchPath:function () {
+				this.$emit('goSearchPath')
+			},
+			_goHome:function(){
+				uni.switchTab({
+		        	url: '/pages/tabBar/home/index'
+		      	})
+			}
+		},
+		onShow(){
+	
+		}
+	}
+</script>
+
+<style lang="scss">
+	.navbar-wrap {
+		 position: fixed;
+		 width: 100%;
+		 top: 0;
+		 z-index: 100000;
+		 box-sizing: border-box;
+		 background: url(https://img.caimei365.com/group1/M00/03/B0/Cmis217Z9LCAF_anAADHlsIu3aE475.png);
+		 background-size: cover;
+		 border-bottom:none;
+	}
+	.navbar-text {
+		 font-size: 30rpx;
+		 color: #000000;
+		 font-weight: 500;
+	}
+	.navbar-text.center{
+		text-align: center;
+	}
+	.navbar-text.left{
+		text-align: left;
+		padding-left: 45px;
+	}
+	.navbar-icon {
+		 position: fixed;
+		 display: flex;
+		 box-sizing: border-box;
+	}
+	.navbar-icon .iconfont {
+		 display: inline-block;
+		 overflow: hidden;
+		 font-size: 44rpx;
+		 padding-right:40rpx;
+		 margin-top: 1px;
+	}
+	.navbar-icon .icon-iconfonticonfontsousuo1 {
+		color: #000000;
+	}
+	.navbar-icon view {
+		 height: 18px;
+		 border-left: 0.5px solid rgba(0,0,0, 0.3);
+		 margin-top: 6px;
+	}
+	.navbar-loading {
+		 background: #fff;
+		 text-align: center;
+	}
+	.search-input{
+		width: 100%;
+		height: 110rpx;
+		padding: 20rpx 24rpx;
+		box-sizing: border-box;
+		.gosearch-btn{
+			width: 100%;
+			height: 100%;
+			border-radius: 40rpx;
+			background: #F0F0F0;
+			margin: 0 auto;
+			font-size: 28rpx;
+			line-height: 70rpx;
+			color: #8A8A8A;
+			background: #FFFFFF;
+			position: relative;
+			box-sizing: border-box;
+			padding-left: 80rpx;
+			.search-icon{
+				width: 80rpx;
+				height: 70rpx;
+				position:absolute ;
+				left: 0;
+				top: 2rpx;
+				text-align: center;
+				line-height: 70rpx;
+				.icon-iconfonticonfontsousuo1{
+					margin:0 6rpx;
+					font-size: $font-size-34;
+					color: #8A8A8A;
+					z-index: 10;
+				}
+			}
+			.search-text{
+				font-size: $font-size-24;
+				line-height: 70rpx;
+				color: #8A8A8A;
+			}
+		}
+	}
+</style>

+ 182 - 0
components/cm-custom/ws-custom.vue

@@ -0,0 +1,182 @@
+<template name="headerNavbar">
+	<!-- 自定义导航栏 -->
+	<view class='navbar-wrap' :style="{height:navbarHeight+'px',paddingTop:statusBarHeight+'px'}"> 
+	  	<view class="navbar-text" :style="{lineHeight:(navbarHeight - statusBarHeight)+'px;',fontSize:fontSizeSetting+'px;'}">
+	    	{{navbarData.title ? navbarData.title : " "}}
+	  	</view>
+	  	<view class="navbar-icon" v-if="navbarData.showCapsule ? navbarData.showCapsule : true" 
+			  :style="{width:headerBtnPosi.width+'px;',lineHeight:(navbarBtn.height)+'px',top:navbarBtn.top + statusBarHeight+'px;',left:navbarBtn.right+'px;',height:(navbarBtn.height)+'px;'}">
+			  <text v-if='navbarData.haveBack' @click="_goBack" class="iconfont icon-daohangfanhui" :style="{width:headerBtnPosi.width/2+'px',height:navbarBtn.height+'px'}"></text>
+	      	  <text v-if='navbarData.haveBack' class="iconfont icon-vertical_line" :style="{borderColor:navbarData.borderColor ? navbarData.borderColor : 'rgba(0,0,0,0.4)'}"></text>
+			  <text @click="_goHome" class="iconfont icon-fanhuishouye" :style="{width:headerBtnPosi.width/2+'px',height:navbarBtn.height+'px'}"></text>
+	  	</view>
+	</view>
+</template>
+
+<script>
+	var self;
+	export default{
+		name:'headerNavbar',
+		props:{
+		    navbarData: { // 由父页面传递的数据
+				type: Object
+		    },
+			systeminfo:{
+				type:Object
+			},
+			headerBtnPosi:{
+				type:Object
+			},
+			isBackType:{
+				type:Boolean,
+				default:false
+			},
+			page:{
+				type:Number,
+				default:1
+			},
+			path:{
+				type:String
+			}
+		},
+		data() {
+			return{
+				// haveBack: true, // 是否有返回按钮,true 有 false 没有 若从分享页进入则为 false
+			    statusBarHeight: 0, // 状态栏高度
+			    navbarHeight: 0, // 顶部导航栏高度
+			    navbarBtn: { // 胶囊位置信息
+			      height: 0,
+			      width: 0,
+			      top: 0,
+			      bottom: 0,
+			      right: 0
+				},
+				platform:'',
+				fontSizeSetting:0,
+				screenWidth:0
+			}
+		},
+		created() {
+			this.fontSizeSetting = this.systeminfo.fontSizeSetting
+			let statusBarHeight = this.systeminfo.statusBarHeight // 状态栏高度
+			let headerPosi = this.headerBtnPosi // 胶囊位置信息
+		    /**
+		     * wx.getMenuButtonBoundingClientRect() 坐标信息以屏幕左上角为原点
+		     * 菜单按键宽度: 87
+		     * 菜单按键高度: 32
+		     * 菜单按键左边界坐标: 278
+		     * 菜单按键上边界坐标: 26
+		     * 菜单按键右边界坐标: 365
+		     * 菜单按键下边界坐标: 58
+		     */
+			let btnPosi = { // 胶囊实际位置,坐标信息不是左上角原点
+			      height: headerPosi.height,
+			      width: headerPosi.width,
+			      // 胶囊top - 状态栏高度
+			      top: headerPosi.top - statusBarHeight,
+			      // 胶囊bottom - 胶囊height - 状态栏height (现胶囊bottom 为距离导航栏底部的长度)
+			      bottom: headerPosi.bottom - headerPosi.height - statusBarHeight,
+			      // 屏幕宽度 - 胶囊right
+			      right: this.systeminfo.screenWidth - headerPosi.right
+			}
+			let haveBack;
+			if (getCurrentPages().length === 1) { // 当只有一个页面时
+			     haveBack = false;
+			} else {
+			     haveBack = true;
+			}
+		    this.isBackType=haveBack, // 获取是否是通过分享进入的小程序
+		    this.statusBarHeight=statusBarHeight,
+		    this.navbarHeight= headerPosi.bottom + btnPosi.bottom, // 原胶囊bottom + 现胶囊bottom
+		    this.navbarBtn=btnPosi
+		},
+		onLoad(){
+			
+		},
+		methods:{
+			_goBack: function () {
+				let self = this;
+				console.log(this.isBackType)
+				if(this.isBackType){
+					uni.navigateBack({
+			        	delta: this.page
+			      	});
+					
+				}else{
+					uni.redirectTo({
+			        	url: self.path
+			      	})
+				}
+		      	
+		    },
+		    _goHome: function () {
+		      	uni.reLaunch({
+		        	url: '/pages/index/index'
+		      	})
+		    }
+		},
+		onShow(){
+	
+		}
+	}
+</script>
+
+<style lang="scss">
+	.navbar-wrap {
+		 position: fixed;
+		 width: 100%;
+		 top: 0;
+		 z-index: 9999;
+		 box-sizing: border-box;
+		 background: #FFFFFF;
+	}
+	.navbar-text {
+		 text-align: center;
+		 color: #000000;
+		 font-weight: 500;
+	}
+	.navbar-icon {
+		 position: fixed;
+		 display: flex;
+		 border-radius: 64rpx;
+		 border: 0.5px solid rgba(0,0,0, 0.2);
+		 box-sizing: border-box;
+	}
+	.navbar-icon .iconfont {
+		 text-align: center;
+		 display: inline-block;
+		 overflow: hidden;
+		 margin-bottom: 1px;
+		&.icon-fanhuishouye {
+			font-size: 38rpx;
+		}
+	}
+	.navbar-icon .icon-vertical_line {
+		color: #999999;
+	}
+	.navbar-loading {
+		 background: #fff;
+		 text-align: center;
+	}
+</style>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 202 - 0
components/cm-module/creatOrder/address.vue

@@ -0,0 +1,202 @@
+<template name="address">
+	<view class="address-template">
+		 <!-- 地址 -->
+		 <navigator :url="addressSrc" class="address-section">
+			<view class="address-empty" v-if="isEmpty">
+			 	<text>添加收货地址</text><text class="iconfont icon-tianjiadizhi"></text>
+			</view>
+		 	<view class="address-content" v-else>
+		 		<view class="address-cen">
+		 			<view class="top">
+		 				<view class="name">{{addressData.shouHuoRen ? addressData.shouHuoRen : ''}}</view>
+		 				<view class="mobile">{{addressData.mobile ? addressData.mobile : ''}}</view>
+		 			</view>
+		 			<view class="address">
+						<view class="address-icon">
+							<text class="iconfont icon-shouhuodizhi"></text>
+						</view>
+						<view class="address-text">
+							收货地址:
+							{{addressData.provinceName ? addressData.provinceName : ''}}
+							{{addressData.cityName ? addressData.cityName : ''}}
+							{{addressData.townName ? addressData.townName : ''}}
+							{{addressData.address ? addressData.address : ''}}
+						</view>
+					</view>
+					<view class="nexpage"><text class="iconfont icon-genghuan"></text></view>
+		 		</view>
+		 	</view>
+		 </navigator>
+		 <image  src="../../../static/ws/address_cat.png" mode=""></image>
+	</view>
+</template>
+
+<script>
+	export default{
+		name:"address",
+		props:{
+			addressData:{
+				type:Object
+			}
+		},
+		data() {
+			return{
+				isEmpty:false,
+				addressSrc:'',
+			}
+		},
+		created(){
+			this.initData(this.addressData)
+		},
+		computed: {
+
+		},
+		watch:{
+			addressData:{
+				handler:function(val){
+					this.initData(val)
+				}
+			}
+		},
+		methods:{
+			initData(res) {
+				if(Object.keys(res).length == 0){
+					this.isEmpty = true
+					this.addressSrc = '/pages/user/address/addressManage'
+				}else{
+					this.isEmpty = false
+					this.$parent.isFreight = false
+					this.addressSrc = '/pages/user/address/address?type=select'
+				}
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.address-template{
+		width: 100%;
+		height: auto;
+		background: #FFFFFF;
+		border-top: 1px solid #F8F8F8;
+		image{
+			float: left;
+			width: 100%;
+			height: 6rpx;
+		}
+	}
+	.address-section {
+		width: 100%;
+		height: auto;
+		float: left;
+		position: relative;
+		
+		.address-empty{
+			width: 100%;
+			height: 84rpx;
+			line-height: 84rpx;
+			color: $color-system;
+			text-align: center;
+			font-size: $font-size-26;
+			font-weight: bold;
+			background: #fff;
+			float: left;
+			.icon-tianjiadizhi{
+				font-size: 30rpx;
+				margin: 0 8rpx;
+			}
+		}
+		.address-content {
+			display: flex;
+			align-items: center;
+			padding:20rpx 24rpx;
+			background: #fff;
+		}
+		
+		.icon-shouhuodizhi {
+			flex-shrink: 0;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			width: 40rpx;
+			color: $color-system;
+			font-size: 40rpx;
+			margin-right: 10rpx;
+		}	
+		.address-cen {
+			width: 100%;
+			height: auto;
+			position: relative;
+			.top{
+				padding-left: 50rpx;
+				height: 42rpx;
+				line-height: 42rpx;
+				text-align: left;
+				font-size: $font-size-30;
+				color: $text-color;
+				padding-bottom: 8rpx;
+				display: flex;
+				float: left;
+				.name{
+					font-weight: bold;
+					margin-right: 48rpx;
+				}
+				.mobile{
+					margin-right: 40rpx;
+					font-weight: bold;
+				}
+			}
+			.address {
+				width: 100%;
+				height: auto;
+				float: left;
+				.address-icon{
+					width: 40rpx;
+					height: auto;
+					float: left;
+					line-height: 40rpx;
+				}
+				.address-text{
+					width: 610rpx;
+					padding-left: 10rpx;
+					float: left;
+					line-height: 40rpx;
+					font-size: $font-size-28;
+					color: $text-color;
+					text-align: left;
+					-o-text-overflow: ellipsis;
+					text-overflow: ellipsis;
+					display: -webkit-box;
+					word-break: break-all;
+					-webkit-box-orient: vertical;
+					-webkit-line-clamp: 2;
+					overflow: hidden;
+				}
+			}
+			.nexpage{
+				text-align: right;
+				font-size: $font-size-30;
+				color: #666666;
+				position: absolute;
+				right: 0;
+				top: 45rpx;
+				.icon-genghuan{
+					font-size: $font-size-30;
+				}
+			}
+		}
+		.icon-chakangengduo {
+			font-size: 32rpx;
+			color: $text-color;
+			margin-right: 30rpx;
+		}
+		.a-bg {
+			position: absolute;
+			left: 0;
+			bottom: 0;
+			display: block;
+			width: 100%;
+			height: 5rpx;
+		}
+	}
+</style>

+ 201 - 0
components/cm-module/creatOrder/choiceAddress.vue

@@ -0,0 +1,201 @@
+<template name="address">
+	<view class="address-template">
+		 <!-- 地址 -->
+		 <navigator :url="addressSrc" class="address-section">
+			<view class="address-empty" v-if="isEmpty">
+			 	<text>添加收货地址</text><text class="iconfont icon-tianjiadizhi"></text>
+			</view>
+		 	<view class="address-content" v-else>
+		 		<view class="address-cen">
+		 			<view class="top">
+		 				<view class="name">{{addressData.shouHuoRen !== undefined ? addressData.shouHuoRen : ''}}</view>
+		 				<view class="mobile">{{addressData.mobile !== undefined ? addressData.mobile : ''}}</view>
+		 			</view>
+		 			<view class="address">
+						<view class="address-icon">
+							<text class="iconfont icon-shouhuodizhi"></text>
+						</view>
+						<view class="address-text">
+							{{addressData.province !== undefined ? addressData.province : ''}}
+							{{addressData.city !== undefined ? addressData.city : ''}}
+							{{addressData.town !== undefined ? addressData.town : ''}}
+							{{addressData.address !== undefined ? addressData.address : ''}}
+						</view>
+					</view>
+					<view class="nexpage"><text class="iconfont icon-genghuan"></text></view>
+		 		</view>
+		 	</view>
+		 </navigator>
+		 <image  src="../../../static/ws/address_cat.png" mode=""></image>
+	</view>
+</template>
+
+<script>
+	export default{
+		name:"address",
+		props:{
+			addressData:{
+				type:Object
+			}
+		},
+		data() {
+			return{
+				isEmpty:false,
+				addressSrc:'',
+			}
+		},
+		created(){
+			this.initData(this.addressData)
+		},
+		computed: {
+
+		},
+		watch:{
+			addressData:{
+				handler:function(val){
+					this.initData(val)
+				}
+			}
+		},
+		methods:{
+			initData(res) {
+				if(Object.keys(res).length == 0){
+					this.isEmpty = true
+					this.addressSrc = '/pages/user/address/addressManage'
+				}else{
+					this.isEmpty = false
+					this.$parent.isFreight = false
+					this.addressSrc = '/pages/user/address/address?type=select'
+				}
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.address-template{
+		width: 100%;
+		height: auto;
+		background: #FFFFFF;
+		border-top: 1px solid #F8F8F8;
+		image{
+			float: left;
+			width: 100%;
+			height: 16rpx;
+		}
+	}
+	.address-section {
+		width: 100%;
+		height: auto;
+		float: left;
+		position: relative;
+		
+		.address-empty{
+			width: 100%;
+			height: 100rpx;
+			line-height: 100rpx;
+			color: $color-system;
+			text-align: center;
+			font-size: $font-size-26;
+			font-weight: bold;
+			background: #fff;
+			float: left;
+			.icon-tianjiadizhi{
+				font-size: 30rpx;
+				margin: 0 8rpx;
+			}
+		}
+		.address-content {
+			display: flex;
+			align-items: center;
+			padding:20rpx 24rpx;
+			background: #fff;
+		}
+		
+		.icon-shouhuodizhi {
+			flex-shrink: 0;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			width: 40rpx;
+			color: $color-system;
+			font-size: 40rpx;
+			margin-right: 10rpx;
+		}	
+		.address-cen {
+			width: 100%;
+			height: auto;
+			position: relative;
+			.top{
+				padding-left: 50rpx;
+				height: 42rpx;
+				line-height: 42rpx;
+				text-align: left;
+				font-size: $font-size-30;
+				color: $text-color;
+				padding-bottom: 8rpx;
+				display: flex;
+				float: left;
+				.name{
+					font-weight: bold;
+					margin-right: 48rpx;
+				}
+				.mobile{
+					margin-right: 40rpx;
+					font-weight: bold;
+				}
+			}
+			.address {
+				width: 100%;
+				height: auto;
+				float: left;
+				.address-icon{
+					width: 40rpx;
+					height: auto;
+					float: left;
+					line-height: 40rpx;
+				}
+				.address-text{
+					width: 610rpx;
+					padding-left: 10rpx;
+					float: left;
+					line-height: 40rpx;
+					font-size: $font-size-28;
+					color: $text-color;
+					text-align: left;
+					-o-text-overflow: ellipsis;
+					text-overflow: ellipsis;
+					display: -webkit-box;
+					word-break: break-all;
+					-webkit-box-orient: vertical;
+					-webkit-line-clamp: 2;
+					overflow: hidden;
+				}
+			}
+			.nexpage{
+				text-align: right;
+				font-size: $font-size-30;
+				color: $color-system;
+				position: absolute;
+				right: 0;
+				top: 45rpx;
+				.icon-genghuan{
+					font-size: $font-size-30;
+				}
+			}
+		}
+		.icon-chakangengduo {
+			font-size: 32rpx;
+			color: $text-color;
+			margin-right: 30rpx;
+		}
+		.a-bg {
+			position: absolute;
+			left: 0;
+			bottom: 0;
+			display: block;
+			width: 100%;
+			height: 5rpx;
+		}
+	}
+</style>

+ 171 - 0
components/cm-module/creatOrder/freight.vue

@@ -0,0 +1,171 @@
+<template name="freight">
+	<view class="freight-template" @click.stop="discard">
+		 <!-- 运费信息 -->
+		<view class="invoice-freight">
+			<view class="freight-left">运费<text class="tips" v-if="freightData.freePostFlag == 1">运费可选择到付哟~</text></view>
+			<view class="freight-right" >
+				<view class="freight-text">{{freightText}}</view>
+				<view class="select" v-if="freightData.freePostFlag == 1"  @click.stop="selectFreight">
+					<text class="select-text">{{orderPriceToFixed(freightMoney)}}</text>
+					<text class="iconfont icon-chakangengduo"></text>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		name:"freight",
+		props:{
+			freightData:{
+				type:Object
+			}
+		},
+		data() {
+			return{
+				infoData:'',
+				freightText:'',
+				freightMoney:'',
+				isShowOption:false,
+				optionList:['到付'],
+				freePostFlag:'',
+				
+			}
+		},
+		created(){
+			this.initData(this.freightData)
+		},
+		computed: {
+
+		},
+		methods:{
+			initData(res) {
+				this.infoData = res;
+				switch(res.freePostFlag){
+					case 0:
+						this.freightText = '包邮'
+						this.freightData.freight  = 0
+						break
+					case 1:
+						this.freightText = ''
+						this.freightMoney = res.freight
+						this.optionList.unshift(this.orderPriceToFixed(this.freightMoney))
+						break
+					case -1:
+						this.freightText = '到付'
+						this.freightData.freight  = 0
+						break
+				}
+			},
+			selectFreight (){
+				let self = this,value;
+				uni.showActionSheet({
+				    itemList: self.optionList,
+				    success: function (res) {
+						switch(res.tapIndex){
+							case 0:
+								self.freightMoney = self.infoData.freight
+								self.freePostFlag = 1
+								break
+							case 1:
+								self.freePostFlag = -1
+								self.freightMoney ='到付'
+								break
+						}
+						self.$emit('confirmFreight',self.freePostFlag);
+				    },
+				    fail: function (res) {
+				        console.log(res.errMsg);
+				    }
+				});
+			},
+			orderPriceToFixed (value){
+				let price ='';
+				if(value == '到付'){
+					price = value
+				}else{
+					price ='¥'+parseInt(value).toFixed(2)
+				}
+				return price
+			},
+			discard(){
+				this.isShowOption = false
+				this.selectClass = ''
+			},
+			showTip(){
+				this.$emit('showFreightAlert');
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	.freight-template{
+		width: 100%;
+		height: auto;
+		background: #FFFFFF;
+		float: left;
+		margin-top: 24rpx;
+		.invoice-freight{
+			width: 702rpx;
+			padding: 0 24rpx;
+			height: 86rpx;
+			line-height: 86rpx;
+			font-size: $font-size-28;
+			color: $text-color;
+			background: #FFFFFF;
+			float: left;
+			font-weight: bold;
+			.freight-left{
+				float: left;
+				.tips{
+					font-size: $font-size-24;
+					color: $color-system;
+					font-weight: normal;
+					margin-left: 20rpx;
+				}
+				.icon-yunfeishuoming{
+					height: 100%;
+					padding:15rpx;
+					color: $color-system;
+					font-weight: normal;
+				}
+			}
+			.freight-right{
+				float: right;
+				color: #2A81FF;
+				position: relative;
+				.freight-text{
+					float: left;
+				}
+				.select{
+					float: right;
+					height: 60rpx;
+					padding: 0 20rpx;
+					margin-top: 14rpx;
+					line-height: 60rpx;
+					color: #2A81FF;
+					font-weight: normal;
+					position: relative;
+					.select-text{
+						display: inline-block;
+						float: left;
+						margin-right: 30rpx;
+					}
+					.iconfont{
+						width: 60rpx;
+						height: 60rpx;
+						line-height: 60rpx;
+						text-align: right;
+						position: absolute;
+						right: 0;
+						top: 0;
+						font-size: $font-size-28;
+						color: #2A81FF;
+					}
+				}
+			}
+		}
+	}
+</style>

+ 348 - 0
components/cm-module/creatOrder/goodsList.vue

@@ -0,0 +1,348 @@
+<template name="goods">
+	<view class="goods-template">
+		 <!-- 商品列表 -->
+		<view class="goods-list">
+			<view v-for="(item, index) in goodsData" :key="index" class="goods-item">
+				<view class="shoptitle">
+					<view class="title-text">{{item.name}}</view> 
+				</view>
+				<view class="productlist" v-for="(pros,idx) in item.productList" :key="idx">
+					<view class="goods-pros-t">
+						<view class="pros-img">
+							<image :src="pros.mainImage" alt="" />
+							<text class="tips" v-if="pros.productType == 2">赠品</text>
+						</view>
+						<view class="pros-product">
+							<view class="producttitle">{{ pros.productName }}</view>
+							<view class="floor-item-act" v-if="pros.promotion!=null">
+								<view v-if="PromotionsFormat(pros.promotion)" class="floor-tags">
+									{{pros.promotion.name}}
+									<text v-if ="pros.promotion!=null">
+										:¥{{ pros.promotion == null ? '0.00' : pros.promotion.touchPrice | NumFormat}}
+									</text>
+								</view>
+								<view v-else-if="pros.promotion.type !=3" class="floor-tags">{{pros.promotion.name}}</view>	
+							</view>
+							<view class="productspec">规格:{{ pros.unit }}</view>
+							<view class="productprice">
+								<view class="price" :class="PromotionsFormat(pros.promotion) ? 'disabled' : ''">
+									<text>¥{{(PromotionsFormat(pros.promotion) ? pros.price : pros.retailPrice)  | NumFormat}}</text>
+								</view>
+								<view class="count"><text class="small">x</text>{{ pros.productCount }}</view>
+							</view>
+						</view>	
+					</view>
+				</view>	
+				<view class="goods-pros-m">
+					<view class="m-text">留言:</view>
+					<view class="m-input">
+						<input type="text" 
+						   v-model="remark[index]" 
+						   @change="changeHandle(index)"
+						   placeholder-class="placeholder"  
+						   maxlength="50" 
+						   placeholder="选填,最多不超过50个汉字"/>
+						</view>
+				</view>
+				<view class="goods-pros-b">
+					<view class="sum-none" v-if="(item.fullReduction)>0">
+						<text class="money-sign">¥</text>
+						<text class="money">{{ ( item.shopTotalPrice +item.fullReduction ) | NumFormat }}</text>
+						<text class="money-reduced">减<text>¥{{ item.fullReduction | NumFormat}}</text></text>
+					</view>
+					<view class="sum">合计:<text class="money">¥{{ item.shopTotalPrice | NumFormat }}</text></view>
+				</view>
+			</view>
+		</view>	
+	</view>
+</template>
+
+<script>
+	export default{
+		name:"goods",
+		props:{
+			goodsData:{
+				type:Array
+			}
+		},
+		data() {
+			return{
+				remark:[]
+			}
+		},
+		created(){
+			
+		},
+		filters:{
+			NumFormat(value) {//处理金额
+				return Number(value).toFixed(2);
+			},
+		},	
+		watch: {
+			goodsData: {
+				handler: function (el) {//监听对象的变换使用 function,箭头函数容易出现this指向不正确
+					this.goodsData = el
+				},
+				deep: true
+			}
+		},
+		computed: {
+
+		},
+		methods:{
+			PromotionsFormat(promo){//促销活动类型数据处理
+				if(promo!=null){
+					if(promo.type == 1 && promo.mode == 1){
+						return true
+					}else{
+						return false
+					}
+				}
+				return false
+			},
+			changeHandle (index) {//输入框的值被改变后
+				this.goodsData[index].note = this.remark[index]
+				this.$emit('handleGoodList',this.goodsData)
+			}
+		},
+	}
+</script>
+
+<style lang="scss">
+	.goods-template{
+		width: 100%;
+		height: auto;
+		background: #FFFFFF;
+		float: left;
+		margin-top: 24rpx;
+		.goods-list{
+			width: 100%;
+			height: auto;	
+			background:#F7F7F7;
+			.goods-item{
+				width: 702rpx;
+				padding: 0 24rpx;
+				background: #FFFFFF;
+				margin-bottom: 24rpx;
+				&:last-child{
+					margin-bottom: 0;
+				}
+			}
+			.shoptitle{
+				display: flex;
+				align-items: center;
+				height: 80rpx;
+				line-height: 80rpx;
+				.title-text{
+					width: 400rpx;
+					overflow: hidden;
+					text-overflow:ellipsis;
+					white-space: nowrap;
+					float: left;
+					font-size: $font-size-28;
+					color: $text-color;
+					text-align: left;
+					line-height: 56rpx;
+					font-weight: bold;
+				}
+			}
+			.productlist{
+				width: 100%;
+				height: auto;
+			}	
+			.goods-pros-t{
+				display: flex;
+				align-items: center;
+				width: 100%;
+				height: auto;
+				padding:12rpx 0;
+				.pros-img{
+					width: 210rpx;
+					height: 100%;
+					border-radius: 10rpx;
+					margin:0 26rpx 0 0;
+					position: relative;
+					.tips{
+						display: inline-block;
+						width: 80rpx;
+						height: 40rpx;
+						background-image: linear-gradient(214deg, #ff4500 0%, #ff5800 53%, #ff4367 100%);
+						line-height: 40rpx;
+						text-align: center;
+						font-size: $font-size-24;
+						color: #FFFFFF;
+						border-radius:10rpx 0 10rpx 0 ;
+						position: absolute;
+						top:0;
+						left: 0;
+					}
+					image{
+						width: 210rpx;
+						height: 210rpx;
+						border-radius: 10rpx;
+						border:1px solid #f3f3f3;
+					}
+				}
+			}
+			.pros-product{
+				width: 468rpx;
+				height: 100%;
+				line-height: 40rpx;
+				font-size: $font-size-26;	
+				position: relative;
+				.producttitle{
+					width: 100%;
+					display: inline-block;
+					height: auto;							
+					text-overflow:ellipsis;
+					display: -webkit-box;
+					word-break: break-all;
+					-webkit-box-orient: vertical;
+					-webkit-line-clamp: 2;
+					overflow: hidden;
+					margin-bottom: 8rpx;
+				}
+				.productspec{
+					width: 100%;
+					float: left;
+					height: 40rpx;
+					color: #999999;
+					line-height: 40rpx;
+					text-overflow:ellipsis;
+					display: -webkit-box;
+					word-break: break-all;
+					-webkit-box-orient: vertical;
+					-webkit-line-clamp: 2;
+					overflow: hidden;
+				}
+				.productprice{
+					width: 100%;
+					height: 54rpx;
+					line-height: 54rpx;
+					width: 100%;
+					float: left;
+					margin-top: 30rpx;
+					.price{
+						line-height: 54rpx;
+						font-size: $font-size-28;
+						width: 48%;
+						color: #FF2A2A;
+						float: left;
+						&.disabled{
+							color: #999999;
+							text-decoration: line-through;
+						}
+					}
+					.count{
+						height: 100%;
+						float: right;
+						position: relative;
+						.small{
+							color: #666666;
+						}
+					}
+				}
+				.floor-item-act{
+					width: 100%;
+					height: auto;
+					text-align: center;
+					box-sizing: border-box;
+					float: left;
+					padding:0 0 10rpx 0;
+					.floor-tags{
+						height: 28rpx;
+						border-radius: 6rpx;
+						background-color: #FFFFFF;
+						line-height: 28rpx;
+						color: #ff2a2a;
+						text-align: center;
+						display: inline-block;
+						padding:0 5rpx;
+						font-size: $font-size-20;
+						border: 1px solid #ff2a2a;
+						float: left;
+					}
+				}
+			}
+			.goods-pros-m{
+				height: 76rpx;
+				line-height: 76rpx;
+				font-size: $font-size-26;
+				color: $text-color;
+				margin-top: 12rpx;
+				.m-text{
+					width: 62rpx;
+					float: left;
+					padding-right: 20rpx;
+					font-weight:bold;
+				}
+				.m-input{
+					display: -webkit-box;
+					display: -webkit-flex;
+					display: flex;
+					-webkit-box-align: center;
+					-webkit-align-items: center;
+					align-items: center;
+					position: relative;
+					width: 576rpx;
+					height: 36rpx;
+					padding: 20rpx;
+					background: #F9F9F9;
+					border-radius: 10rpx;
+					input{
+						width: 100%;
+						height: 100%;
+						font-size: $font-size-26;
+						line-height: 36rpx;
+						color: #333333;
+						min-height: 36rpx;
+					}
+				}
+			}
+			.goods-pros-b{
+				width:100%;
+				height: auto;
+				padding: 10rpx 0;
+				.sum-none{
+					width: 100%;
+					height: 48rpx;
+					line-height: 48rpx;
+					color: $text-color;
+					float: left;
+					text-align: right;
+					.money{
+						font-size: $font-size-26;
+						color: #999999;
+						text-decoration: line-through;
+					}
+					.money-sign{
+						font-size: $font-size-26;
+						color: #999999;
+						text-decoration: line-through;
+					}
+					.money-reduced{
+						margin-left: 10rpx;
+						font-size: $font-size-26;
+						color: $color-system;
+						.iconfont{
+							font-size: $font-size-34;
+						}
+					}
+				}
+				.sum{
+					width: 100%;
+					height: 48rpx;
+					font-size: $font-size-28;
+					line-height: 48rpx;
+					color: $text-color;
+					display: flex;
+					justify-content: flex-end;
+					.money{
+						color: #FF2A2A;
+						font-size: $font-size-28;
+					}
+				}
+			}
+		}
+	}
+</style>

+ 511 - 0
components/cm-module/creatOrder/sellerFreight.vue

@@ -0,0 +1,511 @@
+<template name="freight">
+	<view class="freight-template">
+		 <!-- 运费信息 -->
+		<view class="invoice-freight" @tap.stop="hanldOperationConfim">
+			<view class="freight-left">运费</view>
+			<view class="freight-right">
+				<text class="text-l">{{freightText}}</text>
+				<!-- <text class="text" v-if="freightData.freePostFlag == 1">¥{{orderPriceToFixed(freightMoney)}}</text> -->
+				<!-- <text class="iconfont icon-chakangengduo"></text> -->
+			</view>
+		</view>
+		<!--底部选择模态层弹窗组件 -->
+		<view class="popup spec" :class="specClass"  @touchmove.stop.prevent="discard" @click="freightConfim">
+			<!-- 遮罩层 -->
+			<view class="mask"></view>
+			<view class="layer" @tap.stop="discard">
+				<view class="content">
+					<view class="freight-ltitle">选择运费</view>
+					<view class="freight-radio">
+						<radio-group class="row-group" @change="radioChange">
+							<label class="row-input" v-for="(item, index) in freightList" :key="item.value">
+								<radio class="row-radio" :value="item.value" :checked="index === current" color="#191919"/>
+								<view class="row-text">{{item.name}}</view>
+							</label>
+						</radio-group>
+					</view>
+					<view class="freight-group" v-if="freightData.freePostFlag == 1">
+						<view class="group-from">
+							<input class="form-input" type="text" v-model="hanldFreight" @input="setFreightMoney" placeholder="请填写运费" maxlength="20">
+						</view>
+					</view>	
+					<view class="freight-group" v-if="freightData.freePostFlag == 0">
+						<text class="text">{{freightText}}</text>
+					</view>
+					<view class="freight-group" v-if="freightData.freePostFlag == -1">
+						<text class="text">{{freightText}}</text>
+					</view>
+				</view>
+				<view class="btn">
+					<view class="button add" @click="freightConfim">完成</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		name:"freight",
+		props:{
+			freightDatas:{
+				type:Object
+			}
+		},
+		data() {
+			return{
+				freightText:'到付',
+				freightMoney:0,
+				specClass: '',//规格弹窗css类,控制开关动画
+				freightList:[
+					{value:1,name:'不包邮'},
+					{value:0,name:'包邮'},
+					{value:-1,name:'到付'},
+				],
+				current:0,
+				hanldFreight:0,
+				freightData:{
+					freePostFlag:1,
+					freight:0
+				}
+			}
+		},
+		created(){
+			this.infoData(this.freightDatas)
+		},
+		methods:{
+			infoData(data){//初始化运费
+				// console.log(data)
+				switch(data.freePostFlag){
+					case 1:
+						this.current = 0;
+						this.freightData.freePostFlag = data.freePostFlag;
+						if(data.freight == 0){
+							this.hanldFreight = ''
+						}else{
+							this.hanldFreight = data.freight
+						}
+						this.freightData.freight = data.freight;
+						this.freightMoney = this.hanldFreight;
+						this.freightText = ''
+						break;
+					case 0:
+						this.current = 1;
+						this.freightData.freePostFlag = data.freePostFlag;
+						this.freightText = '包邮'
+						break;
+					case -1:
+						this.current = 2;
+						this.freightData.freePostFlag = data.freePostFlag;
+						this.freightText = '到付'
+						break;
+				}
+			},
+			freightConfim(){//提交完成运费选择
+				switch(this.freightData.freePostFlag){
+					case 1:
+						this.choiceaFreightFirst(this.freightData.freePostFlag)
+						break;
+					case 0:
+						this.choiceaFreightFirst(this.freightData.freePostFlag)
+						break;
+					case -1:
+						this.choiceaFreightFirst(this.freightData.freePostFlag)
+						break;	
+				}		
+			},
+			choiceaFreightFirst(index){//校验运费形式及运费价
+				if(index == 1){
+					if(this.hanldFreight == 0 || this.hanldFreight== ''){
+						this.$util.msg('请填写运费',2000)
+						return
+					}
+					this.freightData.freight = this.hanldFreight
+					this.$emit('handleChoiceaFreight',this.freightData)
+				}else{
+					this.freightData.freight = 0
+					this.$emit('handleChoiceaFreight',this.freightData)
+				}
+				this.hideSpec()
+			},
+			showTip(){//显示运费弹窗
+				this.$emit('showFreightAlert');
+			},
+			hideSpec() {//关闭选择数量确认弹窗
+				this.specClass = 'hide';
+				setTimeout(() => {
+					this.specClass = 'none';
+				}, 200);
+			},
+			hanldOperationConfim(data){//显示选择数量确认弹窗
+				// this.specClass = 'show';
+				// this.freightMoney = this.hanldFreight
+			},
+			radioChange(e) {//运费选择切换
+				this.freightData.freePostFlag = parseInt(e.target.value);
+				switch(this.freightData.freePostFlag){
+					case 1:
+						this.freightText = '不包邮'
+						break;
+					case 0:
+						this.freightText = '包邮'
+						break;
+					case -1:
+						this.freightText = '到付'
+						break;	
+				}		
+				for (let i = 0; i < this.freightList.length; i++) {
+					if (this.freightList[i].value === this.freePostFlag) {
+						this.current = i;
+						break;
+					}
+				}
+			},
+			setFreightMoney(e){//处理邮费显示
+				if(e.detail.value == ''){
+					this.freightMoney=0
+					this.freightData.freight=0
+				}else{
+					this.freightData.freight = e.detail.value
+					this.freightMoney = this.orderPriceToFixed(e.detail.value)
+				}
+			},
+			orderPriceToFixed (num){
+				let price ='';
+				price = parseInt(num).toFixed(2);
+				return price
+			},
+			discard(){
+				//丢弃
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.freight-template{
+		width: 100%;
+		height: auto;
+		background: #FFFFFF;
+		float: left;
+		margin: 24rpx 0 34rpx 0;
+		.invoice-freight{
+			width: 702rpx;
+			padding: 0 24rpx;
+			height: 88rpx;
+			line-height: 88rpx;
+			font-size: $font-size-28;
+			color: $text-color;
+			background: #FFFFFF;
+			float: left;
+			font-weight: bold;
+			.freight-left{
+				float: left;
+				.icon-yunfeishuoming{
+					height: 100%;
+					padding:15rpx;
+					color: $color-system;
+					font-weight: normal;
+				}
+			}
+			.freight-right{
+				float: right;
+				color: #2A81FF;
+				.text-l{
+					margin-right: 20rpx;
+				}
+				.text{
+					line-height: 88rpx;
+					color: #ff0000;
+					margin:0 20rpx;
+					font-weight: normal;
+				}
+				.icon-chakangengduo{
+					line-height: 88rpx;
+					color: #999999;
+					font-weight: normal;
+				}
+			}
+		}
+	}
+	.freight-ltitle{
+		width: 100%;
+		line-height: 60rpx;
+		height: 60rpx;
+		font-size: $font-size-28;
+		color: #333333;
+	}
+	.freight-radio{
+		width: 100%;
+		height: 88rpx;
+		line-height: 88rpx;
+		display: flex;
+		border-bottom: 1px solid #EBEBEB;
+		.row-group{
+			flex:1;
+			display: flex;
+		}
+		.row-input{
+			flex: 1;
+			height: 88rpx;
+			line-height: 88rpx;
+		}
+		.row-radio{
+			float: left;
+			transform: scale(0.6);
+		}
+		.row-text{
+			font-size: $font-size-24;
+			color: $text-color;
+		}
+	}
+	.freight-group{
+		width: 100%;
+		height: 88rpx;
+		display: flex;
+		border-bottom: 1px solid #FFFFFF;
+		flex-direction: row;
+		.text{
+			display: block;
+			flex: 1;
+			line-height: 88rpx;
+			font-size: $font-size-24;
+			color: #999999;
+			text-align: left;
+			padding-left: 10rpx;
+		}
+		.group-from{
+			flex: 1;
+			height: 40rpx;
+			padding: 20rpx;
+			line-height: 40rpx;
+			align-items: flex-start;
+			font-size: $font-size-24;
+			color: $text-color;
+			background: #F7F7F7;
+			border-radius: 14rpx;
+			margin-bottom: 20rpx;
+			margin-top: 10rpx;
+			.form-input{
+				height: 40rpx;
+				line-height: 40rpx;
+				flex-grow: 1;
+			}
+		}
+	}	
+	/* 加入购物模态层*/
+	@keyframes showPopup {
+		0% {
+			opacity: 0;
+		}
+		100% {
+			opacity: 1;
+		}
+	}
+	@keyframes hidePopup {
+		0% {
+			opacity: 1;
+		}
+		100% {
+			opacity: 0;
+		}
+	}
+	@keyframes showLayer {
+		0% {
+			transform: translateY(0);
+		}
+		100% {
+			transform: translateY(-100%);
+		}
+	}
+	@keyframes hideLayer {
+		0% {
+			transform: translateY(-100%);
+		}
+		100% {
+			transform: translateY(0);
+		}
+	}
+	@keyframes showAmnation {
+		0% {
+			top: -12rpx;
+			opacity: 0;
+		}
+		50% {
+			top: -60rpx;
+			opacity: 1;
+		}
+		100% {
+			top: -100rpx;
+			opacity: 0;
+		}
+	}
+	@keyframes hideAmnation {
+		0% {
+			top: -100rpx;
+			opacity: 0;
+		}
+		100% {
+			top: -12rpx;
+			opacity: 0;
+		}
+	}
+	.popup {
+		position: fixed;
+		top: 0;
+		width: 100%;
+		height: 100%;
+		z-index: 999;
+		display: none;
+		.mask{
+			position: fixed;
+			top: 0;
+			width: 100%;
+			height: 100%;
+			z-index: 21;
+			background-color: rgba(0, 0, 0, 0.6);
+		}
+		.layer {
+			position: fixed;
+			z-index: 22;
+			bottom: -460rpx;
+			width: 702rpx;
+			padding: 24rpx 24rpx 36rpx 24rpx;
+			height: 400rpx;
+			border-radius: 20rpx 20rpx 0 0;
+			background-color: #fff;
+			display: flex;
+			flex-wrap: wrap;
+			align-content: space-between;
+			.content {
+				width: 100%;
+			}
+			.btn {
+				width: 100%;
+				height: 88rpx;
+				display: flex;
+				.button {
+					width: 702rpx;
+					height: 88rpx;
+					color: #fff;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					font-size: $font-size-28;
+					border-radius: 44rpx;
+					background: $btn-confirm;
+				}
+			}
+		}
+		
+		&.show {
+			display: block;
+			.mask{
+				animation: showPopup 0.2s linear both;
+			}
+			.layer {
+				animation: showLayer 0.2s linear both;
+			}
+		}
+		&.hide {
+			display: block;
+			.mask{
+				animation: hidePopup 0.2s linear both;
+			}
+			
+			.layer {
+				animation: hideLayer 0.2s linear both;
+			}
+		}
+		&.none {
+			display: none;
+		}
+		&.service {
+			.row {
+				margin: 30upx 0;
+				.title {
+					font-size: 30upx;
+					margin: 10upx 0;
+				}
+				.description {
+					font-size: 28upx;
+					color: #999;
+				}
+			}
+		}
+		.layer-smimg{
+			width: 114rpx;
+			height: 114rpx;
+			float: left;
+			border-radius: 10rpx;
+			margin-right: 24rpx;
+			image{
+				width: 114rpx;
+				height: 114rpx;	
+				border-radius: 10rpx;
+			}
+		}
+		.layer-nunbox{
+			justify-content: space-between;
+			align-items: center;
+			width: 536rpx;
+			height: 88rpx;
+			padding: 13rpx 0 0 0;
+			float: left;
+			.layer-nunbox-t{
+				width: 100%;
+				height:44rpx;
+				position:relative;
+				display: flex;
+				.layer-nunbox-text{
+					line-height: 44rpx;
+					font-size: $font-size-28;
+				}
+				.number-box{
+					display: flex;
+					justify-content: center;
+					align-items: center;
+					.iconfont{
+						font-size: $font-size-32;
+						padding:0 18rpx;
+						font-size: $text-color;
+					}
+					.btn-input{
+						width: 62rpx;
+						height: 48rpx;
+						line-height: 48rpx;
+						background: #F8F8F8;
+						border-radius: 4rpx;
+						text-align: center;
+						font-size: $font-size-28;
+					}
+				}
+				.product-step{
+					position: absolute;
+					left: 45rpx;
+					bottom: 0;
+					height: 44rpx;
+					background: #FFFFFF;
+				}
+			}
+			.layer-nunbox-b{
+				width: 100%;
+				height:44rpx;
+				margin-top: 13rpx;
+			}
+			.text{
+				line-height: 44rpx;
+				font-size: $font-size-28;
+				.p{
+					color: #FF2A2A;
+				}
+				.p:first-child{
+					margin-left: 30rpx;
+				}
+				.p.sm{
+					font-size: $font-size-24;
+				}
+			}
+		}
+	}	
+</style>

+ 696 - 0
components/cm-module/creatOrder/sellerInvoice.vue

@@ -0,0 +1,696 @@
+<template name="invoice">
+	<view class="invoice-template">
+		 <!-- 发票信息 -->
+		<view class="invoice-title" @tap.stop="hanldOperationConfim">
+			<text class="text">发票信息</text>
+			<view class="invoice-right">
+				<text class="text-l">{{invoiceText}}</text>
+				<text class="iconfont icon-chakangengduo"></text>
+			</view>
+		</view>
+		<!-- <view class="invoice-text">
+			<text>{{invoiceText}}</text>
+		</view> -->
+		<!--底部选择模态层弹窗组件 -->
+		<view class="popup spec" :class="specClass"  @touchmove.stop.prevent="discard" @tap="choiceaInvoiceConfim">
+			<!-- 遮罩层 -->
+			<view class="mask"></view>
+			<view class="layer" @tap.stop="discard">
+				<view class="content clearfix">
+					<view class="invoice-ltitle">发票类型</view>
+					<view class="invoice-radio">
+						<radio-group class="row-group" @change="radioChange">
+							<label class="row-input" v-for="(item, index) in invoiceTypeList" :key="item.value">
+								<radio class="row-radio" :value="item.value" :checked="index === current" color="#191919"/>
+								<view class="row-text">{{item.name}}</view>
+							</label>
+						</radio-group>
+					</view>
+					<view class="invoice-main from" v-if="invoiceType == '2'">
+						<view class="invoice-from">
+							<view class="label">单位名称:</view>
+							<input class="form-input" type="text" v-model="invoiceData.invoiceTitle" placeholder="请填写单位信息(必填)" placeholder-class="placeholder" maxlength="20">
+						</view>
+						<view class="invoice-from">
+							<view class="label">纳税人识别号:</view>
+							<input class="form-input" type="text" v-model="invoiceData.corporationTaxNum" placeholder="请填写纳税人识别号(必填)" placeholder-class="placeholder" maxlength="20">
+						</view>
+						<view class="invoice-from">
+							<view class="label">注册地址:</view>
+							<input class="form-input" type="text" v-model="invoiceData.registeredAddress" placeholder="请填写单位注册地址(必填)" placeholder-class="placeholder" maxlength="100">
+						</view>
+						<view class="invoice-from">
+							<view class="label">注册电话:</view>
+							<input class="form-input" type="text" v-model="invoiceData.registeredPhone" placeholder="请填写注册电话(必填)" placeholder-class="placeholder" maxlength="15">
+						</view>
+						<view class="invoice-from">
+							<view class="label">开户银行:</view>
+							<input class="form-input" type="text" v-model="invoiceData.openBank"   placeholder="请填写开户银行(必填)" placeholder-class="placeholder" maxlength="10">
+						</view>
+						<view class="invoice-from">
+							<view class="label">银行账号:</view>
+							<input class="form-input" 
+								   type="text" 
+								   v-model="invoiceData.bankAccountNo" 
+								   placeholder="请填写银行账号(必填)" 
+								   maxlength="19"
+								   placeholder-class="placeholder">
+						</view>
+					</view>
+					<view class="invoice-main" v-if="invoiceType == '3'">
+						<view class="invoice-ltitle">发票内容</view>
+						<view class="invoice-group tit">
+							<checkbox-group class="row-group" @change="checkboxChange">
+								<view class="text">商品明细</view>
+								<checkbox class="row-radio" value="明细"  :checked="inventoryChecked" color="#E15616"></checkbox>
+							</checkbox-group>
+						</view>
+						<view class="invoice-ltitle">发票抬头</view>
+						<view class="invoice-group tit">
+							<radio-group class="row-group radio" @change="radioChangeTitle">
+								<label class="row-input" v-for="(item, index) in invoiceTitleList" :key="item.value">
+									<radio class="row-radio" :value="item.value" :checked="index === titleCurrent" color="#E15616"/>
+									<view class="row-text">{{item.name}}</view>
+								</label>
+							</radio-group>
+						</view>
+						<view class="invoice-group from">
+							<view class="group-from" v-if="peopleInvoiceData.invoiceTitleType == '0'">
+								<input class="form-input" type="text" v-model="peopleInvoiceData.invoiceTitle"   placeholder="请填写个人抬头" placeholder-class="placeholder" maxlength="20">
+							</view>
+							<view class="group-from" v-if="peopleInvoiceData.invoiceTitleType == '1'">
+								<input class="form-input" type="text" v-model="peopleInvoiceData.invoiceTitle"   placeholder="请填写公司抬头" placeholder-class="placeholder" maxlength="20">
+							</view>
+							<view class="group-from" v-if="peopleInvoiceData.invoiceTitleType == '1'">
+								<input class="form-input" type="text" v-model="peopleInvoiceData.corporationTaxNum"   placeholder="请填写纳税人识别号" placeholder-class="placeholder" maxlength="20">
+							</view>
+						</view>
+					</view>
+					<view class="invoice-main" v-if="invoiceType == '1'">
+						<view class="invoice-none">不开具发票信息</view>
+					</view>
+				</view>
+				<view class="btn">
+					<view class="button add" @click="choiceaInvoiceConfim">完成</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		name:"invoice",
+		data() {
+			return{
+				invoiceText:'不要发票',
+				specClass: '',//规格弹窗css类,控制开关动画
+				invoiceType:'1',//发票类型
+				current:0,
+				titleCurrent:0,
+				inventoryChecked:false,
+				invoiceTypeList:[
+					{value:'1',name:'不要发票'},
+					{value:'2',name:'增值税发票'},
+				],
+				invoiceTitleList:[
+					{value:'0',name:'个人'},
+					{value:'1',name:'公司'},
+				],
+				peopleInvoiceData:{
+					invoiceTitle:'',
+					invoiceContent:'',
+					corporationTaxNum:'',
+					invoiceTitleType:'0'//发票抬头类型 1企业 0个人
+				},
+				invoiceData:{
+					invoiceTitle:'',	 //单位名称
+					corporationTaxNum:'',//纳税人识别号
+					registeredAddress: '',//单位地址
+					registeredPhone:'',	 //注册电话
+					openBank:'',		//开户银行
+					bankAccountNo: ''  ,//银行账号
+				},
+			}
+		},
+		created(){
+			// this.initData(this.invoiceDatas)
+		},
+		computed: {
+
+		},
+		methods:{
+			getUseFindInvoice(){//获取发票信息
+				this.$api.getComStorage('clubInfo').then((resolve) =>{
+					this.OrderService.GetFindInvoice({userId:resolve.userId}).then(response =>{
+						if(response.data == null){
+							this.invoiceData = Object.assign(this.invoiceData,'',{type:0})
+						}else{
+							this.invoiceData = response.data
+						} 
+					})
+				})
+			},
+			updateInvoiceFn(){//保存发票信息
+				this.$api.getComStorage('clubInfo').then((resolve) =>{
+					let params =Object.assign(this.invoiceData,'',{userId:resolve.userId})
+					this.OrderService.UpdateInvoice(params).then(response =>{})
+				})
+			},
+			choiceaInvoiceConfim(){
+				switch(this.invoiceType){
+					case '1':
+						this.choiceaInvoiceThree()
+						this.invoiceText = '不要发票'
+						break;
+					// case '2':
+					// 	this.choiceaInvoiceTwo()
+					// 	this.invoiceText = this.peopleInvoiceData.invoiceTitle
+					// 	break;
+					case '2':
+						this.choiceaInvoiceFirst()
+						this.invoiceText = this.invoiceData.invoiceTitle
+						break;
+						default:
+						this.choiceaInvoiceThree()
+						this.invoiceText = '不要发票'
+				}
+			},
+			choiceaInvoiceFirst(){//增值税发票
+				if(this.invoiceData.invoiceTitle == ""){
+					this.$util.msg('请输入单位名称',2000)
+					return
+				}
+				if(this.invoiceData.corporationTaxNum == ""){
+					this.$util.msg('请输入纳税人识别号',2000)
+					return
+				}
+				if(this.invoiceData.registeredAddress == ""){
+					this.$util.msg('请输入单位地址',2000)
+					return
+				}
+				if(this.invoiceData.registeredPhone == ""){
+					this.$util.msg('请输入注册电话',2000)
+					return
+				}
+				if(this.invoiceData.openBank == ""){
+					this.$util.msg('请输入开户银行',2000)
+					return
+				}
+				if(this.invoiceData.bankAccountNo == ""){
+					this.$util.msg('请输入银行账号',2000)
+					return
+				}
+				this.updateInvoiceFn()
+				this.$emit('handleChoiceaInvoice',Object.assign(this.invoiceData,'',{type:2}))
+				this.hideSpec()
+			},
+			choiceaInvoiceTwo(){//普通发票			
+				switch(this.peopleInvoiceData.invoiceTitleType){
+					case '0':
+						if(this.peopleInvoiceData.invoiceContent == ''){
+							this.$util.msg('请选择商品明细',2000)
+							return
+						}
+						if(this.peopleInvoiceData.invoiceTitle == ""){
+							this.$util.msg('请输入个人抬头',2000)
+							return
+						}
+						break;
+					case '1':
+						if(this.peopleInvoiceData.invoiceContent == ''){
+							this.$util.msg('请选择商品明细',2000)
+							return
+						}
+						if(this.peopleInvoiceData.invoiceTitle == ""){
+							this.$util.msg('请输入公司抬头',2000)
+							return
+						}
+						if(this.peopleInvoiceData.corporationTaxNum == ""){
+							this.$util.msg('请输入纳税人识别号',2000)
+							return
+						}
+						break;
+				}
+				this.$emit('handleChoiceaInvoice',Object.assign(this.peopleInvoiceData,'',{type:1}))
+				this.hideSpec()
+			},
+			choiceaInvoiceThree(){//不要发票
+				this.invoiceData = {}
+				this.$emit('handleChoiceaInvoice',Object.assign(this.invoiceData,'',{type:0}))
+				this.hideSpec()
+			},
+			hideSpec() {//关闭弹窗
+				this.specClass = 'hide';
+				setTimeout(() => {
+					this.specClass = 'none';
+				}, 200);
+			},
+			hanldOperationConfim(){//显示发票弹窗
+				this.specClass = 'show';
+			},
+			radioChange(e) {
+				this.invoiceType = e.target.value;
+				for (let i = 0; i < this.invoiceTypeList.length; i++) {
+					if (this.invoiceTypeList[i].value === this.invoiceType) {
+						this.current = i;
+						break;
+					}
+				}
+				switch(this.invoiceType){
+					case '2':
+						this.getUseFindInvoice()
+						break;
+				}		
+			},
+			radioChangeTitle(e) {
+				this.peopleInvoiceData.invoiceTitleType = e.target.value;
+				for (let i = 0; i < this.invoiceTitleList.length; i++) {
+					if (this.invoiceTitleList[i].value === this.peopleInvoiceData.invoiceTitleType) {
+						this.titleCurrent = i;
+						break;
+					}
+				}
+				switch(this.peopleInvoiceData.invoiceTitleType){
+					case '1':
+						this.inventoryChecked = false
+						this.peopleInvoiceData.invoiceTitle = ""
+						this.peopleInvoiceData.invoiceContent = ""
+						break;
+				}		
+			},
+			checkboxChange(e){
+				this.inventoryChecked = !this.inventoryChecked
+				this.peopleInvoiceData.invoiceContent = e.detail.value[0]
+			},
+			inputBankNum(val) {
+				if (/\S{5}/.test(val)) {
+					this.invoiceData.bankAccountNo = val.replace(/\s/g, '').replace(/(.{4})/g, "$1 ");
+				}
+			},
+			discard(){
+				//丢弃
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.invoice-template{
+		width: 100%;
+		height: auto;
+		background: #FFFFFF;
+		float: left;
+		margin-top: 24rpx;
+		.invoice-title{
+			width: 702rpx;
+			padding: 0 24rpx;
+			height: 88rpx;
+			line-height: 88rpx;
+			position: relative;
+			font-size: $font-size-28;
+			font-weight: bold;
+			border-bottom: 1px solid #EBEBEB;
+			.text{
+				font-size: $font-size-28;
+				color: $text-color;
+				font-weight: bold;
+			}
+			.invoice-right{
+				float: right;
+				color: #2A81FF;
+				.text-l{
+					margin-right: 40rpx;
+				}
+				.iconfont{
+					width: 50rpx;
+					height: 88rpx;
+					line-height: 88rpx;
+					color: #999999;
+					display: block;
+					position: absolute;
+					right: 0;
+					top: 0;
+				}
+			}
+		}
+		.invoice-text{
+			width: 702rpx;
+			padding: 0 24rpx;
+			font-size: $font-size-24;
+			color: #666666;
+			line-height: 60rpx;
+		}
+		.invoice-ltitle{
+			width: 100%;
+			line-height: 60rpx;
+			height: 60rpx;
+			font-size: $font-size-28;
+			color: #333333;
+		}
+		.invoice-radio{
+			width: 100%;
+			height: 88rpx;
+			line-height: 88rpx;
+			display: flex;
+			border-bottom: 1px solid #EBEBEB;
+			.row-group{
+				flex:1;
+				display: flex;
+			}
+			.row-input{
+				flex: 1;
+				height: 88rpx;
+				line-height: 88rpx;
+			}
+			.row-radio{
+				float: left;
+				transform: scale(0.6);
+			}
+			.row-text{
+				font-size: $font-size-24;
+				color: $text-color;
+			}
+		}
+		.invoice-main{
+			width: 100%;
+			height: auto;
+			margin-top: 30rpx;
+			&.from{
+				padding-bottom: 40rpx;
+			}
+			.invoice-none{
+				line-height: 60rpx;
+				height: 60rpx;
+				font-size: $font-size-24;
+				color: #666666;
+				text-align: center;
+			}
+			.invoice-from{
+				width: 662rpx;
+				height: 40rpx;
+				padding: 20rpx;
+				line-height: 40rpx;
+				align-items: flex-start;
+				font-size: $font-size-28;
+				color: $text-color;
+				// background: #F7F7F7;
+				// border-radius: 14rpx;
+				margin-bottom: 20rpx;
+				border-bottom: 2rpx solid #e1e1e1;
+				.label{
+					height: 40rpx;
+					line-height: 40rpx;
+					float: left;
+				}
+				.form-input{
+					height: 40rpx;
+					line-height: 40rpx;
+					flex-grow: 1;
+					padding-left: 20rpx;
+				}
+			}
+			.invoice-group{
+				width: 100%;
+				height: 88rpx;
+				display: flex;
+				border-bottom: 1px solid #EBEBEB;
+				&.tit{
+					margin-bottom: 30rpx;
+				}
+				&.from{
+					margin-bottom: 30rpx;
+					border-bottom: 1px solid #FFFFFF;
+					flex-direction: row;
+					display: block;
+					.group-from{
+						flex: 1;
+						height: 40rpx;
+						padding: 20rpx;
+						line-height: 40rpx;
+						align-items: flex-start;
+						font-size: $font-size-24;
+						color: $text-color;
+						background: #F7F7F7;
+						border-radius: 14rpx;
+						margin-bottom: 20rpx;
+						.form-input{
+							height: 40rpx;
+							line-height: 40rpx;
+							flex-grow: 1;
+						}
+					}
+				}
+				.row-group{
+					line-height: 88rpx;
+					flex: 1;
+					.text{
+						font-size: $font-size-24;
+						color: $text-color;
+						line-height: 88rpx;
+						float: left;
+					}
+					.row-radio{
+						float: right;
+						transform: scale(0.8);
+						border-radius: 50%;
+					}
+					&.radio{
+						display: flex;
+						.row-input{
+							flex: 1;
+							height: 88rpx;
+							line-height: 88rpx;
+						}
+						.row-radio{
+							float: left;
+							transform: scale(0.6);
+						}
+						.row-text{
+							font-size: $font-size-24;
+							color: $text-color;
+						}
+					}
+				}
+			}
+		}
+	}
+	/* 加入购物模态层*/
+	@keyframes showPopup {
+		0% {
+			opacity: 0;
+		}
+		100% {
+			opacity: 1;
+		}
+	}
+	@keyframes hidePopup {
+		0% {
+			opacity: 1;
+		}
+		100% {
+			opacity: 0;
+		}
+	}
+	@keyframes showLayer {
+		0% {
+			transform: translateY(0);
+		}
+		100% {
+			transform: translateY(-100%);
+		}
+	}
+	@keyframes hideLayer {
+		0% {
+			transform: translateY(-100%);
+		}
+		100% {
+			transform: translateY(0);
+		}
+	}
+	@keyframes showAmnation {
+		0% {
+			top: -12rpx;
+			opacity: 0;
+		}
+		50% {
+			top: -60rpx;
+			opacity: 1;
+		}
+		100% {
+			top: -100rpx;
+			opacity: 0;
+		}
+	}
+	@keyframes hideAmnation {
+		0% {
+			top: -100rpx;
+			opacity: 0;
+		}
+		100% {
+			top: -12rpx;
+			opacity: 0;
+		}
+	}
+	.popup {
+		position: fixed;
+		top: 0;
+		width: 100%;
+		height: 100%;
+		z-index: 999;
+		display: none;
+		.mask{
+			position: fixed;
+			top: 0;
+			width: 100%;
+			height: 100%;
+			z-index: 21;
+			background-color: rgba(0, 0, 0, 0.6);
+		}
+		.layer {
+			position: absolute;
+			z-index: 22;
+			bottom: -1010rpx;
+			width: 702rpx;
+			padding: 24rpx 24rpx 65rpx 24rpx;
+			height: 920rpx;
+			border-radius: 20rpx 20rpx 0 0;
+			background-color: #fff;
+			display: flex;
+			flex-wrap: wrap;
+			align-content: space-between;
+			.content {
+				width: 100%;
+			}
+			.btn {
+				width: 100%;
+				height: 88rpx;
+				display: flex;
+				.button {
+					width: 702rpx;
+					height: 88rpx;
+					color: #fff;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					font-size: $font-size-28;
+					border-radius: 44rpx;
+					background: $btn-confirm;
+				}
+			}
+		}
+		
+		&.show {
+			display: block;
+			.mask{
+				animation: showPopup 0.2s linear both;
+			}
+			.layer {
+				animation: showLayer 0.2s linear both;
+			}
+		}
+		&.hide {
+			display: block;
+			.mask{
+				animation: hidePopup 0.2s linear both;
+			}
+			
+			.layer {
+				animation: hideLayer 0.2s linear both;
+			}
+		}
+		&.none {
+			display: none;
+		}
+		&.service {
+			.row {
+				margin: 30upx 0;
+				.title {
+					font-size: 30upx;
+					margin: 10upx 0;
+				}
+				.description {
+					font-size: 28upx;
+					color: #999;
+				}
+			}
+		}
+		.layer-smimg{
+			width: 114rpx;
+			height: 114rpx;
+			float: left;
+			border-radius: 10rpx;
+			margin-right: 24rpx;
+			image{
+				width: 114rpx;
+				height: 114rpx;	
+				border-radius: 10rpx;
+			}
+		}
+		.layer-nunbox{
+			justify-content: space-between;
+			align-items: center;
+			width: 536rpx;
+			height: 88rpx;
+			padding: 13rpx 0 0 0;
+			float: left;
+			.layer-nunbox-t{
+				width: 100%;
+				height:44rpx;
+				position:relative;
+				display: flex;
+				.layer-nunbox-text{
+					line-height: 44rpx;
+					font-size: $font-size-28;
+				}
+				.number-box{
+					display: flex;
+					justify-content: center;
+					align-items: center;
+					.iconfont{
+						font-size: $font-size-32;
+						padding:0 18rpx;
+						font-size: $text-color;
+					}
+					.btn-input{
+						width: 62rpx;
+						height: 48rpx;
+						line-height: 48rpx;
+						background: #F8F8F8;
+						border-radius: 4rpx;
+						text-align: center;
+						font-size: $font-size-28;
+					}
+				}
+				.product-step{
+					position: absolute;
+					left: 45rpx;
+					bottom: 0;
+					height: 44rpx;
+					background: #FFFFFF;
+				}
+			}
+			.layer-nunbox-b{
+				width: 100%;
+				height:44rpx;
+				margin-top: 13rpx;
+			}
+			.text{
+				line-height: 44rpx;
+				font-size: $font-size-28;
+				.p{
+					color: #FF2A2A;
+				}
+				.p:first-child{
+					margin-left: 30rpx;
+				}
+				.p.sm{
+					font-size: $font-size-24;
+				}
+			}
+		}
+	}	
+	.placeholder{
+		color: #b2b2b2;
+	}
+</style>

+ 440 - 0
components/cm-module/creatOrder/sellerRegulations.vue

@@ -0,0 +1,440 @@
+<template name="regulations">
+	<view class="regulations-template">
+		<view class="regulations-title" @tap.stop="hanldOperationConfim">
+			<text class="text">售后条款</text>
+			<view class="freight-right">
+				<text class="text-l">{{regulaText}}</text>
+				<text class="iconfont icon-chakangengduo"></text>
+			</view>
+		</view>
+		<!--底部选择模态层弹窗组件 -->
+		<view class="popup spec" :class="specClass"  @touchmove.stop.prevent="discard" >
+			<!-- 遮罩层 -->
+			<view class="mask"></view>
+			<view class="layer">
+				<view class="content">
+					<view class="freight-ltitle">售后条款</view>
+					<text class="iconfont icon-iconfontguanbi" @click="freightConfim"></text>
+					<view class="freight-radio">
+						<radio-group class="row-group" @change="radioChange">
+							<label class="row-input" v-for="(item, index) in regulaDatas" :key="index">
+								<view class="row-text" @click.stop="gotoConten(item)">{{item.name.length>10?item.name.substring(0,10)+'...':item.name}}</view>
+								<radio class="row-radio" :value="item.id" color="#E15616"/>
+							</label>
+						</radio-group>
+					</view>
+				</view>
+				<view class="btn">
+					<view class="button add" @click="freightConfim">确定</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+	export default{
+		name:'regulations',
+		props:{
+			regulaDatas:{
+				type:Array
+			}
+		},
+		data(){
+			return{
+				regulaText:'无条款',
+				freightMoney:0,
+				specClass: '',//规格弹窗css类,控制开关动画
+				clauseId:0
+			}
+		},
+		created() {
+		},
+		methods:{
+			gotoConten(item){
+				if(item.name!='无条款'){
+					this.$api.navigateTo(`/pages/user/service/sellconten?clauseId=${item.id}`)
+				}
+			},
+			radioChange(e){
+				this.clauseId = e.target.value;
+				this.regulaDatas.forEach((item,index)=>{
+					if(item.id==this.clauseId){
+						if(item.name.length>10){
+							this.regulaText = item.name.substr(0,10)+'...'
+						}else{
+							this.regulaText = item.name;
+						}
+					}
+				})
+			},
+			freightConfim(){//提交完成选择
+			this.$emit('handleData',this.clauseId)
+			this.hideSpec()
+			},
+			hideSpec() {//关闭弹窗
+				this.specClass = 'hide';
+				setTimeout(() => {
+					this.specClass = 'none';
+				}, 200);
+			},
+			hanldOperationConfim(data){//显示弹窗
+				this.specClass = 'show';
+				this.freightMoney = this.hanldFreight
+			},
+			showTip(){//显示弹窗
+				this.$emit('@showregulaAlert');
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	.regulations-template{
+		width: 100%;
+		height: auto;
+		background: #FFFFFF;
+		float: left;
+		margin-top: 24rpx;
+		.regulations-title{
+			width: 702rpx;
+			padding: 0 24rpx;
+			height: 88rpx;
+			line-height: 88rpx;
+			font-size: $font-size-28;
+			color: $text-color;
+			background: #FFFFFF;
+			float: left;
+			font-weight: bold;
+			border-bottom: 1rpx solid #EBEBEB;
+			.freight-left{
+				float: left;
+				.icon-yunfeishuoming{
+					height: 100%;
+					padding:15rpx;
+					color: $color-system;
+					font-weight: normal;
+				}
+			}
+			.Tk{
+				float: right;
+				margin-right: 38rpx;
+				font-size: $font-size-28;
+				color: #666666;
+			}
+			.freight-right{
+				float: right;
+				color: #2A81FF;
+				.text-l{
+					margin-right: 20rpx;
+				}
+				.text{
+					line-height: 88rpx;
+					color: #ff0000;
+					margin:0 20rpx;
+					font-weight: normal;
+				}
+				.icon-chakangengduo{
+					line-height: 88rpx;
+					color: #999999;
+					font-weight: normal;
+				}
+			}
+		}
+	}
+	.freight-ltitle{
+		width: 100%;
+		line-height: 60rpx;
+		height: 60rpx;
+		font-size: $font-size-34;
+		color: #333333;
+		text-align:center;
+	}
+	.icon-iconfontguanbi{
+		position: absolute;
+		top: 0;
+		right: 0;
+		font-size: 34rpx;
+		color: #b2b2b2
+	}
+	.freight-radio{
+		height: 66rpx;
+		line-height: 66rpx;
+		padding: 0 20rpx;
+		.row-group{
+			width: 100%;
+			max-height: 460rpx;
+			overflow: auto;
+
+		}
+		.row-input{
+			height: 66rpx;
+			line-height: 66rpx;
+			width: 100%;
+			display: block;
+			// .row-text:nth-child(1){
+			// 	color: #666666;
+			// 	pointer-events: none;
+			// }
+		}
+		.row-radio{
+			float: right;
+			transform: scale(0.9);
+			color: #b2b2b2;
+		}
+		.row-text{
+			font-size: $font-size-28;
+			color: #1890f9;
+			float: left;
+		}
+	}
+	.freight-group{
+		width: 100%;
+		height: 88rpx;
+		display: flex;
+		border-bottom: 1px solid #FFFFFF;
+		flex-direction: row;
+		.text{
+			display: block;
+			flex: 1;
+			line-height: 88rpx;
+			font-size: $font-size-24;
+			color: #999999;
+			text-align: left;
+			padding-left: 10rpx;
+		}
+		.group-from{
+			flex: 1;
+			height: 40rpx;
+			padding: 20rpx;
+			line-height: 40rpx;
+			align-items: flex-start;
+			font-size: $font-size-24;
+			color: $text-color;
+			background: #F7F7F7;
+			border-radius: 14rpx;
+			margin-bottom: 20rpx;
+			margin-top: 10rpx;
+			.form-input{
+				height: 40rpx;
+				line-height: 40rpx;
+				flex-grow: 1;
+			}
+		}
+	}	
+	/* 加入购物模态层*/
+	@keyframes showPopup {
+		0% {
+			opacity: 0;
+		}
+		100% {
+			opacity: 1;
+		}
+	}
+	@keyframes hidePopup {
+		0% {
+			opacity: 1;
+		}
+		100% {
+			opacity: 0;
+		}
+	}
+	@keyframes showLayer {
+		0% {
+			transform: translateY(0);
+		}
+		100% {
+			transform: translateY(-100%);
+		}
+	}
+	@keyframes hideLayer {
+		0% {
+			transform: translateY(-100%);
+		}
+		100% {
+			transform: translateY(0);
+		}
+	}
+	@keyframes showAmnation {
+		0% {
+			top: -12rpx;
+			opacity: 0;
+		}
+		50% {
+			top: -60rpx;
+			opacity: 1;
+		}
+		100% {
+			top: -100rpx;
+			opacity: 0;
+		}
+	}
+	@keyframes hideAmnation {
+		0% {
+			top: -100rpx;
+			opacity: 0;
+		}
+		100% {
+			top: -12rpx;
+			opacity: 0;
+		}
+	}
+	.popup {
+		position: fixed;
+		top: 0;
+		width: 100%;
+		height: 100%;
+		z-index: 999;
+		display: none;
+		.mask{
+			position: fixed;
+			top: 0;
+			width: 100%;
+			height: 100%;
+			z-index: 21;
+			background-color: rgba(0, 0, 0, 0.6);
+		}
+		.layer {
+			position: fixed;
+			z-index: 22;
+			bottom: -710rpx;
+			width: 702rpx;
+			padding: 24rpx 24rpx 36rpx 24rpx;
+			height: 670rpx;
+			border-radius: 20rpx 20rpx 0 0;
+			background-color: #fff;
+			display: flex;
+			flex-wrap: wrap;
+			align-content: space-between;
+			.content {
+				width: 100%;
+				position: relative;
+			}
+			.btn {
+				width: 100%;
+				height: 88rpx;
+				display: flex;
+				.button {
+					width: 702rpx;
+					height: 88rpx;
+					color: #fff;
+					display: flex;
+					align-items: center;
+					justify-content: center;
+					font-size: $font-size-28;
+					border-radius: 44rpx;
+					background: $btn-confirm;
+				}
+			}
+		}
+		
+		&.show {
+			display: block;
+			.mask{
+				animation: showPopup 0.2s linear both;
+			}
+			.layer {
+				animation: showLayer 0.2s linear both;
+			}
+		}
+		&.hide {
+			display: block;
+			.mask{
+				animation: hidePopup 0.2s linear both;
+			}
+			
+			.layer {
+				animation: hideLayer 0.2s linear both;
+			}
+		}
+		&.none {
+			display: none;
+		}
+		&.service {
+			.row {
+				margin: 30upx 0;
+				.title {
+					font-size: 30upx;
+					margin: 10upx 0;
+				}
+				.description {
+					font-size: 28upx;
+					color: #999;
+				}
+			}
+		}
+		.layer-smimg{
+			width: 114rpx;
+			height: 114rpx;
+			float: left;
+			border-radius: 10rpx;
+			margin-right: 24rpx;
+			image{
+				width: 114rpx;
+				height: 114rpx;	
+				border-radius: 10rpx;
+			}
+		}
+		.layer-nunbox{
+			justify-content: space-between;
+			align-items: center;
+			width: 536rpx;
+			height: 88rpx;
+			padding: 13rpx 0 0 0;
+			float: left;
+			.layer-nunbox-t{
+				width: 100%;
+				height:44rpx;
+				position:relative;
+				display: flex;
+				.layer-nunbox-text{
+					line-height: 44rpx;
+					font-size: $font-size-28;
+				}
+				.number-box{
+					display: flex;
+					justify-content: center;
+					align-items: center;
+					.iconfont{
+						font-size: $font-size-32;
+						padding:0 18rpx;
+						font-size: $text-color;
+					}
+					.btn-input{
+						width: 62rpx;
+						height: 48rpx;
+						line-height: 48rpx;
+						background: #F8F8F8;
+						border-radius: 4rpx;
+						text-align: center;
+						font-size: $font-size-28;
+					}
+				}
+				.product-step{
+					position: absolute;
+					left: 45rpx;
+					bottom: 0;
+					height: 44rpx;
+					background: #FFFFFF;
+				}
+			}
+			.layer-nunbox-b{
+				width: 100%;
+				height:44rpx;
+				margin-top: 13rpx;
+			}
+			.text{
+				line-height: 44rpx;
+				font-size: $font-size-28;
+				.p{
+					color: #FF2A2A;
+				}
+				.p:first-child{
+					margin-left: 30rpx;
+				}
+				.p.sm{
+					font-size: $font-size-24;
+				}
+			}
+		}
+	}	
+</style>

+ 209 - 0
components/cm-module/headerNavbar/header-back.vue

@@ -0,0 +1,209 @@
+<template name="headerNavbar">
+	<!-- 自定义导航栏 -->
+	<view class='navbar-wrap' :style="{height:navbarHeight+'px',paddingTop:statusBarHeight+'px'}"> 
+	  	<view class="navbar-text" :style="{lineHeight:(navbarHeight - statusBarHeight)+'px;',fontSize:fontSizeSetting+'px;'}" :class="platformClass">
+	    	{{navbarData.title ? navbarData.title : " "}}
+	  	</view>
+	  	<view class="navbar-icon" v-if="navbarData.showCapsule == 1 ? true : false" 
+			  :style="{top:navbarBtn.top + statusBarHeight+'px;',left:(navbarBtn.right)+'px;',height:navbarBtn.height+'px;',lineHeight:navbarBtn.height+'px;'}">
+			  <text v-if='haveBack' @click="_goBack" class="iconfont icon-daohangfanhui"></text>
+	  	</view>
+		<view class="navbar-icon" v-if="navbarData.showSearch == 1 ? true : false"
+			  :style="{top:navbarBtn.top + statusBarHeight+'px;',right:(navbarBtn.width)+'px;',height:navbarBtn.height+'px;',lineHeight:navbarBtn.height+'px;'}">
+			  <text @click.stop="_goSearchPath" class="iconfont icon-sousuo"></text>
+	  	</view>
+	</view>
+</template>
+
+<script>
+	var self;
+	export default{
+		name:'headerNavbar',
+		props:{ 
+		    navbarData: { // 由父页面传递的数据
+				type: Object
+		    },
+			systeminfo:{
+				type:Object
+			},
+			headerBtnPosi:{
+				type:Object
+			},
+			isShare:{
+				type:Boolean
+			},
+			isDelete:{
+				type:Boolean
+			},
+			isConfim:{
+				type:Boolean
+			},
+			isUsertype:{
+				type:Number
+			}
+		},
+		data() {
+			return{
+				haveBack: true,     // 是否有返回按钮,true 有 false 没有 若从分享页进入则为 false
+			    statusBarHeight: 0, // 状态栏高度
+			    navbarHeight: 0,    // 顶部导航栏高度
+			    navbarBtn: {        // 胶囊位置信息
+			      height: 0,
+			      width: 0,
+			      top: 0,
+			      bottom: 0,
+			      right: 0
+				},
+				platformClass:'',
+				fontSizeSetting:0,
+				
+			}
+		},
+		created() {
+			let statusBarHeight = this.systeminfo.statusBarHeight // 状态栏高度
+			let headerPosi = this.headerBtnPosi // 胶囊位置信息
+			this.fontSizeSetting = this.systeminfo.fontSizeSetting
+			if(this.systeminfo.platform == 'android'){
+				this.platformClass = 'left'
+			}else{
+				this.platformClass = 'center'
+			}
+		    /**
+		     * wx.getMenuButtonBoundingClientRect() 坐标信息以屏幕左上角为原点
+		     * 菜单按键宽度: 87
+		     * 菜单按键高度: 32
+		     * 菜单按键左边界坐标: 278
+		     * 菜单按键上边界坐标: 26
+		     * 菜单按键右边界坐标: 365
+		     * 菜单按键下边界坐标: 58
+		     */
+			let btnPosi = { // 胶囊实际位置,坐标信息不是左上角原点
+			      height: headerPosi.height,
+			      width: headerPosi.width,
+			      // 胶囊top - 状态栏高度
+			      top: headerPosi.top - statusBarHeight,
+			      // 胶囊bottom - 胶囊height - 状态栏height (现胶囊bottom 为距离导航栏底部的长度)
+			      bottom: headerPosi.bottom - headerPosi.height - statusBarHeight,
+			      // 屏幕宽度 - 胶囊right
+			      right: this.systeminfo.screenWidth - headerPosi.right
+			}
+			let haveBack;
+			if (getCurrentPages().length === 1) { // 当只有一个页面时
+			     haveBack = false;
+			} else {
+			     haveBack = true;
+			}
+		    this.haveBack=haveBack, // 获取是否是通过分享进入的小程序
+		    this.statusBarHeight=statusBarHeight,
+		    this.navbarHeight= headerPosi.bottom + btnPosi.bottom, // 原胶囊bottom + 现胶囊bottom
+		    this.navbarBtn=btnPosi
+		},
+		onLoad(){
+			
+		},
+		methods:{
+			_goBack: function () {
+				if(this.isShare){
+					this._goHome()
+				}else if(this.isDelete){
+					this._goUser()
+				}else if(this.isConfim){
+					this._goOrderList()
+				}else{
+					uni.navigateBack({
+			        	delta: 1
+			      	});
+				}
+		    },
+		    _goHome: function () {
+		      	uni.navigateTo({
+		        	url: '/pages/index/index'
+		      	})
+		    },
+		    _goUser: function () {
+		      	uni.navigateTo({
+		        	url: '/pages/index/index'
+		      	})
+		    }, 
+			_goOrderList: function () {
+		      	uni.navigateTo({
+		        	url: '/pages/user/order/order-list?state=0'
+		      	})
+		    },
+			_goSearchPath:function () {
+				this.$emit('goSearchPath')
+			}
+		},
+		onShow(){
+	
+		}
+	}
+</script>
+
+<style lang="scss">
+	.navbar-wrap {
+		 position: fixed;
+		 width: 100%;
+		 top: 0;
+		 z-index: 100000;
+		 box-sizing: border-box;
+		 background: #FFFFFF;
+	}
+	.navbar-text {
+		 font-size: 30rpx;
+		 color: #000000;
+		 font-weight: 500;
+	}
+	.navbar-text.center{
+		text-align: center;
+	}
+	.navbar-text.left{
+		text-align: left;
+		padding-left: 38px;
+	}
+	.navbar-icon {
+		 position: fixed;
+		 display: flex;
+		 box-sizing: border-box;
+	}
+	.navbar-icon .iconfont {
+		 display: inline-block;
+		 overflow: hidden;
+		 font-size: 42rpx;
+		 padding-right:40rpx;
+		 margin-top: 1px;
+	}
+	.navbar-icon .icon-sousuo {
+		color: #000000;
+	}
+	.navbar-icon view {
+		 height: 18px;
+		 border-left: 0.5px solid rgba(0,0,0, 0.3);
+		 margin-top: 6px;
+	}
+	.navbar-loading {
+		 background: #fff;
+		 text-align: center;
+	}
+</style>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 237 - 0
components/cm-module/headerNavbar/header-poduct.vue

@@ -0,0 +1,237 @@
+<template name="headerNavbar">
+	<!-- 自定义导航栏 -->
+	<view class='navbar-wrap' :class="[headerColor? 'bg-color' : 'bg-color']" :style="{height:navbarHeight+'px',paddingTop:CustomBar/2+'px'}"> 
+	  	<view class="navbar-icon" v-if="navbarData.showCapsule ? navbarData.showCapsule : true" 
+			  :style="{top:navbarBtn.top + statusBarHeight+'px;',lineHeight:navbarBtn.height+'px;',left:12+'px;',width:navbarBtn.height+'px;',height:navbarBtn.height+'px;'}">
+			  <text v-if='haveBack' @click="_goBack" class="iconfont icon-daohangfanhui"></text>
+			  <text v-else  @click="_goHome" class="iconfont icon-fanhuishouye"></text>
+	  	</view>
+		<view class="navbar-text" :style="{top:navbarBtn.top + statusBarHeight+'px;',height:navbarBtn.height+'px;',fontSize:fontSizeSetting+'px;'}">
+			<image class="logo" :style="{width:navbarBtn.height+'px;',height:navbarBtn.height+'px;'}" src="https://static.caimei365.com/app/img/icon/logo-top@2x.png" mode=""></image>
+		</view>
+ 		<!--<view class="navbar-text" :style="{top:navbarBtn.top + statusBarHeight+'px;',height:navbarBtn.height+'px;',fontSize:fontSizeSetting+'px;'}">
+	    	<view class="gosearch-btn" :style="{paddingLeft:navbarBtn.height+'px;',right:(navbarBtn.width+30)+'px;',borderRadius:(navbarBtn.height/2)+'px;',width:(375-navbarBtn.width*2)+'px;',lineHeight:navbarBtn.height+'px;'}">
+				<text class="iconfont icon-sousuo" :style="{width:navbarBtn.height+'px;',height:navbarBtn.height+'px;',lineHeight:navbarBtn.height+'px;'}"></text>
+				<view class="input" @click="this.$api.navigateTo(clickPath)">搜索商品/供应商/项目仪器</view>
+			</view>
+	  	</view> -->
+	</view>
+</template>
+
+<script>
+	var self;
+	export default{
+		name:'headerNavbar',
+		props:{
+		    navbarData: { // 由父页面传递的数据
+				type: Object
+		    },
+			systeminfo:{
+				type:Object
+			},
+			headerBtnPosi:{
+				type:Object
+			},
+			page:{
+				type:Number
+			},
+			headerColor:{
+				type:Boolean
+			},
+			headerTitle:{
+				type:String
+			},
+			type:{
+				type:String
+			},
+		},
+		data() {
+			return{
+				headerType:'',
+				CustomBar:this.CustomBar,// 顶部导航栏高度
+				clickPath:'/search/pages/search/search',
+				haveBack: true, // 是否有返回按钮,true 有 false 没有 若从分享页进入则为 false
+			    statusBarHeight: 0, // 状态栏高度
+			    navbarHeight: 0, // 顶部导航栏高度,
+			    navbarBtn: { // 胶囊位置信息
+			      height: 0,
+			      width: 0,
+			      top: 0,
+			      bottom: 0,
+			      right: 0
+				},
+				platform:'',
+				fontSizeSetting:0
+			}
+		},
+		created() {
+			this.headerType = this.type
+			this.fontSizeSetting = this.systeminfo.fontSizeSetting
+			let statusBarHeight = this.systeminfo.statusBarHeight // 状态栏高度
+			let headerPosi = this.headerBtnPosi // 胶囊位置信息
+		    /**
+		     * wx.getMenuButtonBoundingClientRect() 坐标信息以屏幕左上角为原点
+		     * 菜单按键宽度: 87
+		     * 菜单按键高度: 32
+		     * 菜单按键左边界坐标: 278
+		     * 菜单按键上边界坐标: 26
+		     * 菜单按键右边界坐标: 365
+		     * 菜单按键下边界坐标: 58
+		     */
+			let btnPosi = { // 胶囊实际位置,坐标信息不是左上角原点
+			      height: headerPosi.height,
+			      width: headerPosi.width,
+			      // 胶囊top - 状态栏高度
+			      top: headerPosi.top - statusBarHeight,
+			      // 胶囊bottom - 胶囊height - 状态栏height (现胶囊bottom 为距离导航栏底部的长度)
+			      bottom: headerPosi.bottom - headerPosi.height - statusBarHeight,
+			      // 屏幕宽度 - 胶囊right
+			      right: this.systeminfo.screenWidth - headerPosi.right
+			}
+			console.log(btnPosi)
+			let haveBack;
+			if (getCurrentPages().length === 1) { // 当只有一个页面时
+			     haveBack = false;
+			} else {
+			     haveBack = true;
+			}
+		    this.haveBack=haveBack, // 获取是否是通过分享进入的小程序
+		    this.statusBarHeight=statusBarHeight,
+		    this.navbarHeight= headerPosi.bottom + btnPosi.bottom, // 原胶囊bottom + 现胶囊bottom
+			this.$parent.navbarHeight = this.navbarHeight
+			this.$parent.statusBarHeight = this.statusBarHeight
+			// console.log(this.navbarHeight);
+		    this.navbarBtn=btnPosi
+		},
+		onLoad(){
+			
+		},
+		methods:{
+			_goBack: function () {
+		      	uni.navigateBack({
+		        	delta: this.page
+		      	});
+		    },
+		    _goHome: function () {
+		      	uni.switchTab({
+		        	url: '/pages/tabBar/home/index'
+		      	})
+		    }
+		},
+		onShow(){
+	
+		}
+	}
+</script>
+
+<style lang="scss">
+	.navbar-wrap {
+		 position: fixed;
+		 width: 100%;
+		 top: 0;
+		 z-index: 100000;
+		 box-sizing: border-box;
+		 &.bg-color{
+			animation: showColor 0.3s ease-in-out both;
+		 }
+		 &.no-color{
+		    animation: hideColor 0.3s ease-in-out both;
+		 }
+	}
+	.navbar-text {
+		 width: 100%;
+		 color: #000000;
+		 font-weight: 500;
+		 position: fixed;
+		 .logo{
+			 margin: 0 auto;
+			 display: block;
+		 }
+	}
+	.gosearch-btn{
+		height: 100%;
+		background: rgba(255, 255, 255, 0.6);
+		font-size: 28rpx;
+		color: #999999;
+		position: relative;
+		box-sizing: border-box;
+		position:absolute ;
+		top: 0;
+		border: 0.5px solid rgba(0, 0, 0, 0.1);
+		.icon-sousuo{
+			height: 100%;
+			text-align: center;
+			display: block;
+			position: absolute;
+			left: 0;
+			top: 0;
+			font-size: 34rpx;
+			color: #999999;
+			z-index: 10;
+		}
+		.input{
+			height: 100%;
+			float: left;
+			font-size: $font-size-24;
+			text-align: left;
+		}
+	}
+	.navbar-icon {
+		 position: fixed;
+		 display: flex;
+		 border-radius: 50%;
+		 text-align: center;
+		 background: rgba(255,255,255,0.6);
+		 border: 0.5px solid rgba(0,0,0, 0.1);
+		 box-sizing: border-box;
+		 z-index: 9999;
+	}
+	.navbar-icon .iconfont {
+		 height: 100%;
+		 width: 100%;
+		 font-size: 38rpx;
+		 font-weight: bold;
+		 display: inline-block;
+		 overflow: hidden;
+	}
+	.navbar-icon view {
+		 height: 18px;
+		 border-left: 0.5px solid rgba(0,0,0, 0.3);
+		 margin-top: 6px;
+	}
+	.navbar-loading {
+		 background: #fff;
+		 text-align: center;
+	}
+	@keyframes showColor {
+		0% {background: rgba(255,255,255,0);}
+		50% {background: rgba(255,255,255,0.5);}
+		100% {background: rgba(255,255,255,1);}
+	}
+	@keyframes hideColor {
+		0% {background: rgba(255,255,255,1);}
+		50% {background: rgba(255,255,255,0.5);}
+		100% {background: rgba(255,255,255,0);}
+	}
+</style>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 162 - 0
components/cm-module/headerNavbar/headerNavbar.vue

@@ -0,0 +1,162 @@
+<template name="headerNavbar">
+	<!-- 自定义导航栏 -->
+	<view class='navbar-wrap' :style="{height:navbarHeight+'px',paddingTop:statusBarHeight+'px'}"> 
+	  	<view class="navbar-text" :style="{lineHeight:(navbarHeight - statusBarHeight)+'px;',fontSize:fontSizeSetting+'px;'}">
+	    	{{navbarData.title ? navbarData.title : " "}}
+	  	</view>
+	  	<view class="navbar-icon" v-if="navbarData.showCapsule ? navbarData.showCapsule : true" 
+			  :style="{width:headerBtnPosi.width+'px;',lineHeight:(navbarBtn.height)+'px',top:navbarBtn.top + statusBarHeight+'px;',left:navbarBtn.right+'px;',height:(navbarBtn.height)+'px;'}">
+			  <text v-if='haveBack' @click="_goBack" class="iconfont icon-shangyibu" :style="{width:headerBtnPosi.width/2+'px',height:navbarBtn.height+'px'}"></text>
+	      	  <text  v-if='haveBack' class="iconfont icon-vertical_line" :style="{borderColor:navbarData.borderColor ? navbarData.borderColor : 'rgba(0,0,0,0.4)'}"></text>
+			  <text @click="_goHome" class="iconfont icon-fanhuishouye" :style="{width:headerBtnPosi.width/2+'px',height:navbarBtn.height+'px'}"></text>
+	  	</view>
+	</view>
+</template>
+
+<script>
+	var self;
+	export default{
+		name:'headerNavbar',
+		props:{
+		    navbarData: { // 由父页面传递的数据
+				type: Object
+		    },
+			systeminfo:{
+				type:Object
+			},
+			headerBtnPosi:{
+				type:Object
+			},
+			page:{
+				type:Number
+			}
+		},
+		data() {
+			return{
+				haveBack: true, // 是否有返回按钮,true 有 false 没有 若从分享页进入则为 false
+			    statusBarHeight: 0, // 状态栏高度
+			    navbarHeight: 0, // 顶部导航栏高度
+			    navbarBtn: { // 胶囊位置信息
+			      height: 0,
+			      width: 0,
+			      top: 0,
+			      bottom: 0,
+			      right: 0
+				},
+				platform:'',
+				fontSizeSetting:0,
+				screenWidth:0
+			}
+		},
+		created() {
+			this.fontSizeSetting = this.systeminfo.fontSizeSetting
+			let statusBarHeight = this.systeminfo.statusBarHeight // 状态栏高度
+			let headerPosi = this.headerBtnPosi // 胶囊位置信息
+		    /**
+		     * wx.getMenuButtonBoundingClientRect() 坐标信息以屏幕左上角为原点
+		     * 菜单按键宽度: 87
+		     * 菜单按键高度: 32
+		     * 菜单按键左边界坐标: 278
+		     * 菜单按键上边界坐标: 26
+		     * 菜单按键右边界坐标: 365
+		     * 菜单按键下边界坐标: 58
+		     */
+			let btnPosi = { // 胶囊实际位置,坐标信息不是左上角原点
+			      height: headerPosi.height,
+			      width: headerPosi.width,
+			      // 胶囊top - 状态栏高度
+			      top: headerPosi.top - statusBarHeight,
+			      // 胶囊bottom - 胶囊height - 状态栏height (现胶囊bottom 为距离导航栏底部的长度)
+			      bottom: headerPosi.bottom - headerPosi.height - statusBarHeight,
+			      // 屏幕宽度 - 胶囊right
+			      right: this.systeminfo.screenWidth - headerPosi.right
+			}
+			let haveBack;
+			if (getCurrentPages().length === 1) { // 当只有一个页面时
+			     haveBack = false;
+			} else {
+			     haveBack = true;
+			}
+		    this.haveBack=haveBack, // 获取是否是通过分享进入的小程序
+		    this.statusBarHeight=statusBarHeight,
+		    this.navbarHeight= headerPosi.bottom + btnPosi.bottom, // 原胶囊bottom + 现胶囊bottom
+		    this.navbarBtn=btnPosi
+		},
+		onLoad(){
+			
+		},
+		methods:{
+			_goBack: function () {
+		      	uni.navigateBack({
+		        	delta: this.page
+		      	});
+		    },
+		    _goHome: function () {
+		      	uni.switchTab({
+		        	url: '/pages/tabBar/home/index'
+		      	})
+		    }
+		},
+		onShow(){
+	
+		}
+	}
+</script>
+
+<style lang="scss">
+	.navbar-wrap {
+		 position: fixed;
+		 width: 100%;
+		 top: 0;
+		 z-index: 9999;
+		 box-sizing: border-box;
+		 background: #FFFFFF;
+		 border-bottom: 1px solid #F8F8F8;
+	}
+	.navbar-text {
+		 text-align: center;
+		 color: #000000;
+		 font-weight: 500;
+	}
+	.navbar-icon {
+		 position: fixed;
+		 display: flex;
+		 border-radius: 64rpx;
+		 border: 0.5px solid rgba(0,0,0, 0.2);
+		 box-sizing: border-box;
+	}
+	.navbar-icon .iconfont {
+		 text-align: center;
+		 display: inline-block;
+		 overflow: hidden;
+		 margin-bottom: 1px;
+	}
+	.navbar-icon .icon-vertical_line {
+		color: #999999;
+	}
+	.navbar-loading {
+		 background: #fff;
+		 text-align: center;
+	}
+</style>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 157 - 0
components/cm-module/homeIndex/banner.vue

@@ -0,0 +1,157 @@
+<template>
+	<view>
+		<view class="swiper-banner-box" >
+			<swiper class="tui-banner-swiper tui-banner tui-skeleton-fillet" :autoplay="true" :interval="5000" :duration="500"  @change="swiperChange" :circular="true">
+				<swiper-item v-for="(item,index) in list" :key="index" @click.stop="NavToDetailPage(item)">
+					<image :src="item.image" class="tui-slide-image" mode="scaleToFill"/>
+				</swiper-item>
+			</swiper>
+			<view class="swiper__dots-box" v-if="list.length > 1">
+				<view v-for="(item,idx) in list" 
+					  :key="idx" 
+					  :class="[idx===current?'swiper__dots-long':'none']" 
+					  :data-index="current" class="swiper__dots-item">
+				</view>	  
+			</view>
+		</view>
+		<view class="swiper-banner-msg">
+			<view class="content">
+				<view class="item le">
+					<text class="iconfont icon-zhengpin"><text class="sm">正品保证</text></text>
+				</view>
+				<view class="item ce">
+					<text class="iconfont icon-jigou"><text class="sm">5000+机构</text></text>
+				</view>
+				<view class="item ri">
+					<text class="iconfont icon-gongyingshang"><text class="sm">100+供应商</text></text>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		name:"address",
+		props:{
+			list:{
+				type:Array
+			}
+		},
+		data() {
+			return{
+				current:0
+			}
+		},
+		created(){
+			
+		},
+		computed: {
+	
+		},
+		methods:{
+			swiperChange(e) {//轮播图切换
+				const index = e.detail.current;
+				this.current = index;
+			},
+			NavToDetailPage(floor) {//跳转
+				this.$api.FlooryNavigateTo(floor)
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.swiper-banner-box{
+		width: 100%;
+		height: 360rpx;
+		padding-top:100rpx;
+		background:#FFFFFF url(https://img.caimei365.com/group1/M00/03/B0/Cmis217Z9LCALu9wAAAv45Bdpsk814.png)no-repeat;
+		position: relative;
+		background-size: cover;
+	}	
+	.tui-banner-swiper {
+		width: 700rpx;
+		margin: 0 auto;
+		height: 340rpx;
+		border-radius: 24rpx;
+		overflow: hidden;
+		transform: translateY(0);
+		box-shadow:0px 3px 6px rgba(225,86,22,0.08);
+		margin-top: 16rpx;
+		.banner-item{
+			border-radius: 24rpx;
+		}
+		.tui-slide-image {
+			width: 100%;
+			height: 340rpx;
+			display: block;
+		}
+	}
+	.swiper__dots-box{
+		position: absolute;
+		bottom: 30rpx;
+		left: 0;
+		right: 0;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex: 1;
+		flex-direction: row;
+		justify-content: center;
+		align-items: center;
+		.swiper__dots-item{
+			width: 8rpx;
+			height: 8rpx;
+			border-radius: 100%;
+			margin-left: 6px;
+			background-color:rgba(255,255,255,.7);
+		}
+		.swiper__dots-long{
+			width: 35rpx;
+			height: 8rpx;
+			border-radius: 4rpx;
+			background-color: #ffff;
+			transition: all 0.4s;
+		}
+	}
+	.swiper-banner-msg{
+		width: 100%;
+		height: 54rpx;
+		box-sizing: border-box;
+		padding: 0 24rpx;
+		margin-top: 20rpx;
+		.content{
+			width: 100%;
+			height: 54rpx;
+			box-sizing: border-box;
+			padding: 0 34rpx;
+			background-color: #fff0e9;
+			border-radius: 16rpx;
+			.item{
+				width: 33.33%;
+				height: 54rpx;
+				line-height: 54rpx;
+				font-size: $font-size-24;
+				color: $color-system;
+				float: left;
+				&.le{
+					text-align: left;
+				}
+				&.ce{
+					text-align: center;
+				}
+				&.ri{
+					text-align: right;
+				}
+				.iconfont{
+					color: $color-system;
+					font-size: $font-size-32;
+					.sm{
+						font-size: $font-size-26;
+					}
+				}
+			}
+		}
+	}
+</style>

+ 160 - 0
components/cm-module/homeIndex/customer.vue

@@ -0,0 +1,160 @@
+<template name="headerNavbar">
+	<!-- 自定义导航栏 -->
+	<view class='navbar-wrap' :style="{height:(CustomBar+55)+'px',paddingTop:StatusBar+'px'}"> 
+	  	<view class="navbar-text" 
+			  :style="{color:navbarData.textColor ? navbarData.textColor:'',lineHeight:(CustomBar - StatusBar)+'px;',fontSize:fontSizeSetting+'px;',paddingLeft:navbarData.textLeft ? '' : 12+'px'}" :class="platformClass">
+	    	  {{navbarData.title ? navbarData.title : " "}}
+	  	</view>
+		<view class="search-input">
+			<view class="gosearch-btn" @click="this.$api.navigateTo(clickPath)">
+				<view class="search-icon">
+					<text class="iconfont icon-iconfonticonfontsousuo1"></text>
+				</view>
+				<view class="search-text">{{hotSearchText}}</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	var self;
+	import btSearch from '@/components/uni-search/bt-search.vue'
+	export default{
+		name:'headerNavbar',
+		components:{
+			btSearch,
+		},
+		props:{
+		    navbarData: { // 由父页面传递的数据
+				type: Object
+		    }
+		},
+		data() {
+			return{
+				clickPath:'/search/pages/search/search',
+				hotSearchText:'搜索商品/项目仪器',
+				CustomBar:this.CustomBar,// 顶部导航栏高度
+				StatusBar: this.StatusBar,
+				fontSizeSetting:this.fontSizeSetting,
+				screenWidth:this.screenWidth,
+				capsule:this.capsule,
+				platformClass:this.platformClass,
+			}
+		},
+		created() {
+			if (getCurrentPages().length === 1) { // 当只有一个页面时
+			      this.navbarData.haveBack = false;
+			} else {
+			      this.navbarData.haveBack = true;
+			}
+		},
+		onLoad(){
+			
+		},
+		methods:{
+			BackPage: function () {
+				this.$emit('navigateBack')
+		    },
+			_goSearchPath:function () {
+				this.$emit('goSearchPath')
+			},
+			_goHome:function(){
+				uni.switchTab({
+		        	url: '/pages/tabBar/home/index'
+		      	})
+			}
+		},
+		onShow(){
+	
+		}
+	}
+</script>
+
+<style lang="scss">
+	.navbar-wrap {
+		 position: fixed;
+		 width: 100%;
+		 top: 0;
+		 z-index: 100000;
+		 box-sizing: border-box;
+		 background: url(https://img.caimei365.com/group1/M00/03/B0/Cmis217Z9LCAF_anAADHlsIu3aE475.png);
+		 background-size: cover;
+		 border-bottom:none;
+	}
+	.navbar-text {
+		 font-size: 30rpx;
+		 color: #000000;
+		 font-weight: 500;
+	}
+	.navbar-text.center{
+		text-align: center;
+	}
+	.navbar-text.left{
+		text-align: left;
+		padding-left: 45px;
+	}
+	.navbar-icon {
+		 position: fixed;
+		 display: flex;
+		 box-sizing: border-box;
+	}
+	.navbar-icon .iconfont {
+		 display: inline-block;
+		 overflow: hidden;
+		 font-size: 44rpx;
+		 padding-right:40rpx;
+		 margin-top: 1px;
+	}
+	.navbar-icon .icon-iconfonticonfontsousuo1 {
+		color: #000000;
+	}
+	.navbar-icon view {
+		 height: 18px;
+		 border-left: 0.5px solid rgba(0,0,0, 0.3);
+		 margin-top: 6px;
+	}
+	.navbar-loading {
+		 background: #fff;
+		 text-align: center;
+	}
+	.search-input{
+		width: 100%;
+		height: 110rpx;
+		padding: 20rpx 24rpx;
+		box-sizing: border-box;
+		.gosearch-btn{
+			width: 100%;
+			height: 100%;
+			border-radius: 40rpx;
+			background: #F0F0F0;
+			margin: 0 auto;
+			font-size: 28rpx;
+			line-height: 70rpx;
+			color: #8A8A8A;
+			background: #FFFFFF;
+			position: relative;
+			box-sizing: border-box;
+			padding-left: 80rpx;
+			.search-icon{
+				width: 80rpx;
+				height: 70rpx;
+				position:absolute ;
+				left: 0;
+				top: 2rpx;
+				text-align: center;
+				line-height: 70rpx;
+				.icon-iconfonticonfontsousuo1{
+					margin:0 6rpx;
+					font-size: $font-size-34;
+					color: #8A8A8A;
+					z-index: 10;
+				}
+			}
+			.search-text{
+				font-size: $font-size-24;
+				line-height: 70rpx;
+				color: #8A8A8A;
+			}
+		}
+	}
+</style>

+ 0 - 0
components/cm-module/homeIndex/pageFloor.vue


+ 427 - 0
components/cm-module/listTemplate/classifyProductList.vue

@@ -0,0 +1,427 @@
+<!-- 金刚区商品模块 -->
+<template>
+	<view class="container commodity-list-wrapper" :style="{'overflow':(showSkeleton? 'hidden' : 'auto'),'height': (showSkeleton? windowHeight + 'px' : 'auto')}">
+		<list-skeleton v-if="showSkeleton" :listType='0'></list-skeleton>
+		<scroll-view :style="{'height':scrollHeight+'px'}" @scrolltolower="toLower" scroll-y v-if="listData.length > 0">
+			<view v-for="(item,index) in listData" :key="index" :id="item.id" class="all-type-list-content commodity-list" @click.stop="navToDetailPage(item.productID)">
+				<image mode='widthFix' :src="item.mainImage"  class="list-img" alt="list-img"></image>
+				<view class="list-details-info">
+					<text class="list-details-title">{{item.name}}</text>
+					<text class="list-details-specs">规格:{{item.unit}}</text>
+					<view class="list-details-specs" v-if="item.productCode!=''&&item.productCode!=null">商品编码:{{item.productCode}}</view>
+					<view class="list-details-price">
+						<template v-if="userIdentity == 3">
+							<view class="floor-item-act" v-if="item.actStatus==1">
+								<view class="floor-tags" v-if="PromotionsFormat(item.promotions)">
+									{{item.promotions.name}}<text v-if="item.price1TextFlag != '1' && item.supplierId === shopId">:¥{{ item.price | NumFormat }}</text>
+								</view>
+								<view class="floor-tags" v-else>{{item.promotions.name}}</view>	
+							</view>
+							<view class="floor-item-act" v-if="item.actStatus ==0  &&  item.ladderPriceFlag==1">
+								<view class="floor-tags">阶梯价格</view>	
+							</view>
+						</template>
+						<template v-else>
+							<view class="floor-item-act" v-if="item.actStatus==1">
+								<view class="floor-tags" v-if="PromotionsFormat(item.promotions)">
+									{{item.promotions.name}}<text v-if="hasLogin && item.price1TextFlag != '1'">:¥{{ item.price | NumFormat }}</text>
+								</view>
+								<view class="floor-tags" v-else>{{item.promotions.name}}</view>	
+							</view>
+							<view class="floor-item-act" v-if="item.actStatus ==0  &&  item.ladderPriceFlag==1">
+								<view class="floor-tags">阶梯价格</view>	
+							</view>
+						</template>
+						<view v-if="hasLogin" class="list-price">
+							<view v-if="userIdentity == 1">
+								<text class="price-larger" :class="PromotionsFormat(item.promotions) ? 'none' : ''">
+								  ¥{{ (PromotionsFormat(item.promotions) ? item.price1 : item.retailPrice) | NumFormat }}
+								</text>
+							</view>	
+							<view v-if="userIdentity == 4">
+								<view class="price-larger" v-if="item.price1TextFlag == '1'">
+									<text class="txt">¥未公开价格</text>
+								</view>
+								<view v-else>
+									<view class="price-larger" v-if="item.price1TextFlag == '2'">
+										<text class="txt">¥价格仅会员可见</text>
+									</view>
+									<template v-else>
+										<text class="price-larger" :class="PromotionsFormat(item.promotions) ? 'none' : ''">
+										  ¥{{ (PromotionsFormat(item.promotions) ? item.price1 : item.retailPrice) | NumFormat }}
+										</text>
+									</template>
+								</view>
+							</view>
+							<view v-if="userIdentity == 2">
+								<view class="price-larger" v-if="item.price1TextFlag == '1'">
+									<text class="txt">¥未公开价格</text>
+								</view>
+								<template v-else>
+									<text class="price-larger" :class="PromotionsFormat(item.promotions) ? 'none' : ''">
+									  ¥{{ (PromotionsFormat(item.promotions) ? item.price1 : item.retailPrice) | NumFormat }}
+									</text>
+								</template>
+							</view>
+						</view>	
+						<view  v-else class="list-login-now">
+							<text class="p-no">¥</text>
+							<uni-stars :stars="parseInt(item.price1Grade)" :font-size='36' :width-info="180"></uni-stars>
+						</view>
+					</view>
+				</view>
+			</view>
+			<view v-if="showLoading && listData.length > 4">
+				<view class="loading-wrapper loading-wrapper-now" v-if="loadingNow">{{loadingText}}<text v-if="loadingText === '已至底部'">‧ ‧ ‧</text></view>
+				<view class="loading-wrapper loading-wrapper-btm" v-else>———<text class="btm-text">已至底部</text>———</view>
+			</view>
+		</scroll-view>
+		<view class="empty-container" v-if="showEmpty">
+			<image class="empty-container-image" src="https://img.caimei365.com/group1/M00/03/71/Cmis2F3wna6AY2ZjAABpmnBICH4247.png"></image>
+			<text class="error-text">{{emptyText}}</text>
+		</view>
+		<!-- 透明模态层 -->
+		<modal-layer v-if='isModallayer'></modal-layer>
+	</view>
+</template>
+
+<script>
+	import listSkeleton from '@/components/cm-module/listTemplate/listSkeleton'
+	import modalLayer from "@/components/modal-layer"
+	import uniStars from '@/components/uni-stars/uni-stars.vue'
+	import { mapState,mapMutations } from 'vuex';
+	export default{
+		name:'CommodityList',
+		components:{
+			listSkeleton,
+			modalLayer,
+			uniStars
+		},
+		props: {
+			emptyText: {
+				type: String
+			},
+			serverUrl: {
+				type: String
+			},
+			classifyID: {
+				type:Number
+			}
+		},
+		data(){
+			return{
+				clubStatus:'',
+				isModallayer:false,
+				windowHeight: '',
+				showSkeleton: true,
+				showEmpty: false,
+				userID: 0,
+				userIdentity:'',
+				scrollHeight: '',
+				listData: [],
+				showLoading: false,
+				loadingNow: true,
+				loadingText: '上拉加载更多',
+				pageSize: 20,
+				pageNum: 1,
+				totalPage: 1,
+				hasNextPage:false,
+				pullFlag: true,
+				cartNum: 0,
+			}
+		},
+		created() {		
+			// console.log(this.typeId)
+			this.setScrollHeight();		
+			this.$api.getComStorage('userInfo').then((resolve) =>{
+				this.clubStatus = resolve.clubStatus
+				this.userID = resolve.userID ? resolve.userID :0;
+				this.userIdentity = resolve.userIdentity
+				this.getListFromServer();
+			}).catch(error =>{
+				this.getListFromServer();
+			})
+		},
+		filters: {
+			NumFormat:function(text) {//处理金额
+				return Number(text).toFixed(2);
+			},
+		},		
+		computed: {
+			...mapState(['hasLogin','userInfo'])
+		},
+		methods:{
+			toLower() {
+				if(this.hasNextPage && this.pullFlag) {
+					this.getListFromServer(true);
+				}
+			},
+			setScrollHeight() {
+				const {windowHeight, pixelRatio} = wx.getSystemInfoSync();
+				this.windowHeight = windowHeight - 1;
+				this.scrollHeight = windowHeight - 1;
+			},
+			getListFromServer(loadMore) {
+				this.getQueryGoodslist(loadMore)
+			},
+			getQueryGoodslist(loadMore){
+				this.showLoading = true;
+				this.loadingNow = true;
+				this.loadingText = '加载中';
+				if(loadMore) { this.pageNum += 1; }
+				let params ={
+						classifyId:this.classifyID,
+						userId:this.userID,
+						pageNum:this.pageNum,
+						pageSize:this.pageSize,
+					}
+				this.CommonService.GetHomeClassify(params).then(response =>{	
+					const resList = response.data.results;
+					if(resList && resList.length > 0){
+						this.showEmpty = false
+						this.hasNextPage = response.data.hasNextPage;
+						if(loadMore) {
+							this.listData = [...this.listData,...resList];
+							this.getProductPrice()
+							this.showSkeleton = false
+						} else {
+							this.listData = [...resList];
+							this.getProductPrice()
+							this.showSkeleton = false
+						}
+						// 防上拉暴滑
+						this.pullFlag = false;
+						setTimeout(()=>{ this.pullFlag = true; },500)
+						// 底部提示文案
+						if(this.hasNextPage) {
+							this.loadingText = '上拉加载更多';
+						} else {
+							this.showLoading = true;
+							this.loadingNow = false;
+							this.loadingText = '已至底部';
+						}
+					} else {
+						if(!loadMore) { this.showEmpty = true; }
+					}
+					
+				}).catch(error =>{
+					this.$util.msg(error.msg,2000);
+				})
+			},
+			getProductPrice(){//获取价格
+				let productIdArr = [];
+				this.listData.map(item=>{// 0公开价格 1不公开价格 2仅对会员机构公开
+					productIdArr.push(item.productID)
+				})
+				this.productIds = productIdArr.join(",");
+				this.ProductService.querySearchProductPrice({userId: this.userID,productIds:this.productIds}).then(response =>{
+					if (response.data) {
+						this.listData = this.ReturnNewProducts(this.listData,response.data);
+					}
+					this.priceLoading = false;
+				}).catch(error =>{
+					this.$util.msg(error.msg,2000)
+				})
+			},
+			ReturnNewProducts(Array,list){//处理对应商品ID的商品价格
+				let NewArray = []
+				Array.map(item=>{
+					for (let i = 0; i < list.length; i++) {
+						if( item.productID == list[i].productId ){
+							NewArray.push(Object.assign(item,list[i])) 
+						}
+					}
+				});
+				return NewArray
+			},
+			navToDetailPage(id) {
+				this.isModallayer = true;
+				this.$api.navigateTo(`/pages/goods/product?id=${id}`);
+				this.isModallayer = false;
+			},
+			PromotionsFormat(promo){//促销活动类型数据处理
+				if(promo!=null){
+					if(promo.type == 1 && promo.mode == 1){
+						return true
+					}else{
+						return false
+					}
+				}
+				return false
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.commodity-list-wrapper {
+		scroll-view {
+			height: 100%;
+			border-top: 2rpx solid rgba(0,0,0,0.07);
+		}
+		.empty-container-image {
+			margin-top: -300rpx;
+		}
+		.toIndexPage {
+			bottom: 390rpx;
+		}
+		.show-more-btn {
+			width: 276rpx;
+			height: 52rpx;
+			line-height: 52rpx;
+			border: 2rpx solid #D8D8D8;
+			background: #F7F7F7;
+			font-size: 26rpx;
+			margin: 26rpx 0;
+			position: absolute;
+			left: 50%;
+			margin-left: -138rpx;
+		}
+	}
+	.all-type-list-content {
+		height: 216rpx;
+		padding: 24rpx;
+		background: #fff;
+		margin-bottom: 2rpx;
+		display: flex;
+		flex-direction: row;
+		box-sizing: content-box;
+		.list-img {
+			width: 210rpx;
+			height: 218rpx !important;
+			margin-right: 26rpx;
+			border-radius: 10rpx;
+			border: 2rpx solid #f3f3f3;
+		}
+	}
+	.list-details-info {
+		width: 466rpx;
+		display: flex;
+		flex-direction: column;
+		font-size: 26rpx;
+		position: relative;
+		.list-details-title {
+			line-height: 38rpx;
+			text-overflow: ellipsis;
+			overflow: hidden;
+			display: -webkit-box;
+			-webkit-line-clamp: 2;
+			line-clamp: 2;
+			-webkit-box-orient: vertical;
+		}
+		.list-details-specs {
+			margin-top: 8rpx;
+			color: #666666;
+		}
+		.list-details-miniQuantity {
+			margin-top: 7rpx;
+		}
+	}
+	.list-details-price {
+		width: 100%;
+		height: 54rpx;
+		line-height: 54rpx;
+		position: absolute;
+		bottom: -10rpx;
+		right: 0;
+		.floor-item-act{
+			height: 54rpx;
+			text-align: center;
+			box-sizing: border-box;
+			float: right;
+			.floor-tags{			
+				height: 28rpx;
+				border-radius: 6rpx;
+				background-color: #FFFFFF;
+				line-height: 28rpx;
+				color: $color-system;
+				text-align: center;
+				display: inline-block;
+				padding:0 5rpx;
+				font-size: $font-size-20;
+				margin-left: 15rpx;
+				border: 1px solid #E15616;
+			}
+		}
+		.price-icon {
+			width: 22rpx;
+			height: 28rpx;
+			vertical-align: middle;
+			margin-right: 10rpx;
+		}
+		.price-icon + text {
+			font-size: 25rpx;
+			vertical-align: middle;
+		}
+		.list-login-now {
+			color: #F8C499;
+			float: left;
+			line-height: 54rpx;
+			.p-no{
+				float: left;
+				font-size: $font-size-24;
+				color: $text-color;
+			}
+		}
+		.login-now {
+			padding: 10rpx 10rpx 10rpx 0;
+		}
+		.list-price {
+			color: #FF2A2A;
+			height: 44rpx;
+			float: left;
+			.price-larger {
+				width: 100%;
+				height: 44rpx;
+				font-size: 32rpx;
+				&.none{
+					text-decoration: line-through;
+					color: #999999;
+				}
+				&.small{
+					font-size: $font-size-24;
+				}
+				.txt{
+					font-size: $font-size-24;
+					display: inline-block;
+					line-height: 44rpx;
+					text-align: left;
+					float: left;
+				}
+			}
+		}
+		.add-cart-btn {
+			width: 156rpx;
+			height: 64rpx;
+			line-height: 64rpx;
+			border-radius: 32rpx;
+			color: #fff;
+			font-size: 26rpx;
+			margin-right: 0;
+			background:linear-gradient(45deg,rgba(255,41,41,1) 0%,rgba(255,109,27,1) 100%);
+		}
+	}
+	.cart-icon {
+		width: 92rpx;
+		height: 92rpx;
+		border-radius: 50%;
+		background: rgba(255, 147, 0, 0.5);
+		position: fixed;
+		right: 24rpx;
+		bottom: 30%;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		cursor: pointer;
+		image {
+			width: 58rpx;
+			height: 58rpx;
+		}
+		text {
+			font-size: 28rpx;
+			position: absolute;
+			top: -10rpx;
+			right: 0;
+		}
+	}
+</style>

+ 953 - 0
components/cm-module/listTemplate/immediatelyList.vue

@@ -0,0 +1,953 @@
+<template>
+	<view
+		class="container commodity-list-wrapper"
+		:style="{ overflow: showSkeleton ? 'hidden' : 'auto', height: showSkeleton ? windowHeight + 'px' : 'auto' }"
+	>
+		<view class="good-search clearfix" v-if="searchStatus">
+			<view class="search-from name">
+				<text class="iconfont icon-sousuo"></text>
+				<input
+					class="input"
+					type="text"
+					:focus="isFocus"
+					confirm-type="search"
+					v-model="searchInputVal"
+					placeholder="请输入商品关键词"
+					@input="onShowClose"
+					@confirm="searchOpertor(tabIndex)"
+					maxlength="20"
+				/>
+				<!-- <text class="iconfont icon-shanchu1" v-if="isShowClose" @click="delInputText(tabIndex)"></text> -->
+			</view>
+		</view>
+		<!-- 骨架 -->
+		<list-skeleton v-if="showSkeleton"></list-skeleton>
+		<!-- 商品为空时 -->
+		<view class="empty-container" v-if="isShowEmpty">
+			<image
+				class="empty-container-image"
+				src="https://img.caimei365.com/group1/M00/03/71/Cmis2F3wna6AY2ZjAABpmnBICH4247.png"
+			></image>
+			<text class="error-text">{{ isShowEmptyText }}</text>
+		</view>
+		<!-- 单一商品 -->
+		<view class="product-container" v-else>
+			<scroll-view
+				:style="{ height: scrollHeight + 'px' }"
+				@scrolltolower="scrolltolower(tabIndex)"
+				scroll-y
+				v-if="listData.length > 0"
+			>
+				<view
+					v-for="(item, index) in 10"
+					:key="index"
+					:id="item.id"
+					class="all-type-list-content commodity-list"
+					@click.stop="navToDetailPage(item.p_id)"
+				>
+					<image
+						mode="widthFix"
+						src="https://img.caimei365.com/group1/M00/03/71/Cmis2F3wna6AY2ZjAABpmnBICH4247.png"
+						class="list-img"
+						alt="list-img"
+					></image>
+					<view class="list-details-info">
+						<!-- 商品名称 -->
+						<text class="list-details-title">韩国恩盛进口氢洁气小气泡清韩国恩盛进口氢洁气小气泡清</text>
+						<!-- 商品标签 -->
+						<view class="list-details-tags">
+							<tui-tag type="danger" class="tag" padding="6rpx" size="20rpx" plain>商品标签</tui-tag>
+						</view>
+						<text class="list-details-specs">规格:30g×5片/盒</text>
+						
+						<!-- 商品价格 -->
+						<view class="goods-price">
+							<view class="price"> ¥23333.00 </view> <view class="shop-btn" @click.stop="showAddCartModal"> 购买 </view>
+						</view>
+					</view>
+				</view>
+				<view v-if="showLoading && listData.length > 4 && !showRegularBtn">
+					<view class="loading-wrapper loading-wrapper-now" v-if="loadingNow"
+						>{{ loadingText }}<text v-if="loadingText === '已至底部'">‧ ‧ ‧</text></view
+					>
+					<view class="loading-wrapper loading-wrapper-btm" v-else>———<text class="btm-text">已至底部</text>———</view>
+				</view>
+			</scroll-view>
+			<!-- 组合商品 -->
+		</view>
+		<!-- 可拖动悬浮按钮 -->
+		<cm-drag
+			:cartNum="cartQuantity"
+			:isDock="true"
+			:existTabBar="true"
+			@btnClick="btnClick"
+			@btnTouchstart="btnTouchstart"
+			@btnTouchend="btnTouchend"
+		>
+		</cm-drag>
+		<!-- 透明模态层 -->
+		<modal-layer v-if="false"></modal-layer>
+	</view>
+</template>
+
+<script>
+import listSkeleton from '@/components/cm-module/listTemplate/listSkeleton'
+import modalLayer from '@/components/modal-layer'
+import uniStars from '@/components/uni-stars/uni-stars.vue'
+import cmDrag from '@/components/cm-custom/cm-drag.vue'
+import tuiTag from '@/components/thorui/tui-tag/tui-tag'
+import { mapState, mapMutations } from 'vuex'
+export default {
+	name: 'productList',
+	components: {
+		listSkeleton,
+		modalLayer,
+		uniStars,
+		cmDrag,
+		tuiTag
+	},
+	props: {
+		searchStatus: {
+			type: Boolean,
+			default: false
+		}
+	},
+	data() {
+		return {
+			isShowClose: false,
+			searchInputVal: '',
+			isModallayer: false,
+			windowHeight: '',
+			showSkeleton: false,
+			priceLoading: true,
+			isShowEmpty: false,
+			isShowEmptyText: '搜索相关商品',
+			clubUserId: '',
+			identity: '',
+			isFocus: false,
+			scrollHeight: '',
+			listData: [],
+			combinationProduct: [],
+			zuheProductList: [], //组合商品列表
+			showLoading: false,
+			loadingNow: true,
+			loadingText: '上拉加载更多',
+			pageSize: 20,
+			zuhepageSize: 5,
+			pageNum: 1,
+			totalPage: 1,
+			hasNextPage: false,
+			pullFlag: true,
+			fromRegularPurchasePage: false,
+			cartQuantity: 0,
+			showRegularBtn: false,
+			isPrecedence: false,
+			ladderPriceList: [], //是否 阶梯,
+			tabIndex: 0,
+			goodsList: [],
+			tabBars: [{ name: '单一', id: 'danyi' }, { name: '组合', id: 'zuhe' }],
+			isShow: false,
+		}
+	},
+	created() {
+		this.setScrollHeight()
+		this.$api
+			.getComStorage('userInfo')
+			.then(resolve => {
+				if (resolve.userIdentity == 1) {
+					this.identity = 1
+				}
+			})
+			.catch(error => {
+				console.log(error)
+			})
+		this.$api.getComStorage('orderUserInfo').then(resolve => {
+			this.clubUserId = resolve.userID
+		})
+		this.getProductAgainInfo()
+		this.isFocus = true
+	},
+	filters: {
+		NumFormat: function(text) {
+			//处理金额
+			return Number(text).toFixed(2)
+		}
+	},
+	computed: {
+		...mapState(['hasLogin', 'userInfo'])
+	},
+	methods: {
+		closeDrawer(){
+			this.visible = false
+		},
+		// 数量选择框
+		showAddCartModal() {
+			this.visible = true
+		},
+		scrolltolower(tabIndex) {
+			if (tabIndex == 0) {
+				if (this.totalPage > this.listData.length && this.pullFlag) {
+					this.getProductAgainInfo(true)
+				}
+			} else if (tabIndex == 1) {
+				if (this.hasNextPage && this.pullFlag) {
+					this.getcombinationProduct(true)
+				}
+			}
+		},
+		setScrollHeight() {
+			const { windowHeight, pixelRatio } = wx.getSystemInfoSync()
+			this.windowHeight = windowHeight - 1
+			this.scrollHeight = windowHeight - 66
+		},
+		getProductAgainInfo(loadMore) {
+			this.showLoading = true
+			this.priceLoading = true
+			this.loadingNow = true
+			this.loadingText = '加载中'
+			this.isShowEmpty = false
+			if (loadMore) {
+				this.pageNum += 1
+			}
+			let params = {
+				identity: this.identity,
+				keyword: this.searchInputVal,
+				pageNum: this.pageNum,
+				pageSize: this.pageSize,
+				sortField: '',
+				sortType: ''
+			}
+			this.ProductService.GetProductSearchList(params)
+				.then(response => {
+					this.isShowWrapper = true
+					const resData = JSON.parse(response.data)
+					const resList = resData.items
+					if (resList && resList.length > 0) {
+						this.totalPage = resData.total
+						this.showEmpty = false
+						if (loadMore) {
+							this.listData = [...this.listData, ...resList]
+							this.getProductPrice()
+						} else {
+							this.listData = [...resList]
+							this.getProductPrice()
+							this.showSkeleton = false
+						}
+						// 防上拉暴滑
+						this.pullFlag = false
+						setTimeout(() => {
+							this.pullFlag = true
+						}, 500)
+						// 底部提示文案
+						if (this.totalPage > this.listData.length) {
+							this.loadingText = '上拉加载更多'
+						} else {
+							this.showLoading = true
+							this.loadingNow = false
+						}
+					} else {
+						if (!loadMore) {
+							this.isShowEmpty = true
+							this.isShowEmptyText = '暂无相关商品'
+						}
+					}
+				})
+				.catch(error => {
+					this.$util.msg(error.msg, 2000)
+				})
+		},
+		getProductPrice() {
+			//获取商品或者活动价格
+			let productIdArr = []
+			let productIds = ''
+			this.listData.map(item => {
+				// 0公开价格 1不公开价格 2仅对会员机构公开
+				productIdArr.push(item.p_id)
+			})
+			productIds = productIdArr.join(',')
+			this.ProductService.querySearchProductPrice({ userId: this.clubUserId, productIds: productIds })
+				.then(response => {
+					this.listData = this.ReturnNewProducts(this.listData, response.data)
+					this.priceLoading = false
+				})
+				.catch(error => {
+					this.$util.msg(error.msg, 2000)
+				})
+		},
+		ReturnNewProducts(Array, list) {
+			//合并字段
+			let NewArray = []
+			Array.map(item => {
+				for (let i = 0; i < list.length; i++) {
+					if (item.p_id == list[i].productId) {
+						NewArray.push(Object.assign(item, list[i]))
+					}
+				}
+			})
+			return NewArray
+		},
+		searchOpertor(tabIndex) {
+			//搜索商品
+			if (tabIndex == 0) {
+				if (this.searchInputVal == '') {
+					this.$util.msg('请输入商品关键词', 2000)
+				} else {
+					this.pageNum = 1
+					this.showSkeleton = true
+					this.getProductAgainInfo()
+					this.isFocus = false
+				}
+			} else {
+				this.pageNum = 1
+				this.showSkeleton = true
+				this.getcombinationProduct()
+				this.isFocus = false
+			}
+		},
+		getcombinationProduct(loadMore) {
+			//组合搜索商品
+			this.showLoading = true
+			this.loadingNow = true
+			this.loadingText = '加载中'
+			this.isShowEmpty = false
+			if (loadMore) {
+				this.pageNum += 1
+			}
+			let params = {
+				clubUserId: this.clubUserId,
+				pageNum: this.pageNum,
+				pageSize: this.zuhepageSize,
+				searchWord: this.searchInputVal
+			}
+			this.SellerService.GetCombinationProduct(params)
+				.then(response => {
+					this.isShowWrapper = true
+					const responseData = response.data
+					if (responseData.results && responseData.results.length > 0) {
+						this.hasNextPage = responseData.hasNextPage
+						this.isShowEmpty = false
+						if (loadMore) {
+							this.combinationProduct = [...this.combinationProduct, ...responseData.results]
+						} else {
+							this.combinationProduct = [...responseData.results]
+
+							this.showSkeleton = false
+						}
+						// 防上拉暴滑
+						this.pullFlag = false
+						setTimeout(() => {
+							this.pullFlag = true
+						}, 500)
+						// 底部提示文案
+						if (this.hasNextPage) {
+							this.loadingText = '上拉加载更多'
+						} else {
+							this.showLoading = true
+							this.loadingNow = false
+						}
+					} else {
+						this.isShowEmpty = true
+						this.isShowEmptyText = '暂无相关商品'
+					}
+				})
+				.catch(error => {
+					this.$util.msg(error.msg, 2000)
+				})
+		},
+		changeCountAdd(item, pros) {
+			//商品数量加加
+			if (pros.initProductNum == 0) {
+				pros.initProductNum = pros.minBuyNumber
+				this.processActivityPrice(pros)
+			} else if (pros.initProductNum >= pros.minBuyNumber) {
+				pros.initProductNum++
+				this.processActivityPrice(pros)
+			}
+			this.totalPeice(item)
+			this.totalCount(item)
+			this.totalKind(item)
+		},
+		changeCountSub(item, pros) {
+			//商品数量减减
+			if (pros.initProductNum == 0) {
+				this.$util.msg(`采购数量不能小于0`, 2000)
+				return
+			} else if (pros.initProductNum == pros.minBuyNumber) {
+				pros.initProductNum = 0
+				this.processActivityPrice(pros)
+			} else {
+				pros.initProductNum--
+				this.processActivityPrice(pros)
+			}
+			this.totalPeice(item)
+			this.totalCount(item)
+			this.totalKind(item)
+		},
+		changeNnmber(e, item, pros) {
+			//输入商品数量更新
+			let _value = e.detail.value
+			if (!this.$api.isNumber(_value)) {
+				pros.initProductNum = pros.minBuyNumber
+			} else if (_value < pros.minBuyNumber) {
+				this.$util.msg(`该商品最小起订量为${pros.minBuyNumber}`, 2000)
+				pros.initProductNum = pros.minBuyNumber
+			} else {
+				pros.initProductNum = parseInt(e.detail.value)
+				this.processActivityPrice(pros)
+			}
+			this.totalPeice(item)
+			this.totalCount(item)
+			this.totalKind(item)
+		},
+		totalPeice(item) {
+			//计算总价格,每次调用此方法,将初始值为0,遍历价格并累加
+			let prosPrice = 0
+			let productsList = []
+			productsList = item.combinationProductList
+			productsList.forEach(pros => {
+				prosPrice += pros.retailPrice * pros.initProductNum
+				item.productTotalAmount = prosPrice
+			})
+			// console.log(prosPrice)
+		},
+		totalCount(item) {
+			//计算总数量
+			let prosAllCount = 0
+			let productsList = []
+			productsList = item.combinationProductList
+			productsList.forEach(pros => {
+				prosAllCount += parseInt(pros.initProductNum)
+				item.productTotalNum = prosAllCount
+			})
+			// console.log(prosAllCount)
+		},
+		totalKind(item) {
+			//计算商品种类
+			let productsList = []
+			let checkList = []
+			productsList = item.combinationProductList
+			productsList.forEach(pros => {
+				if (pros.initProductNum > 0) {
+					checkList.push(pros)
+					item.productKind = checkList.length
+				} else {
+					item.productKind = checkList.length
+				}
+			})
+		},
+		processActivityPrice(pros) {
+			//单独处理活动价格和阶梯价格
+			let ladderPriceList = pros.ladderPriceList
+			if (pros.ladderPriceFlag == '0' || pros.actStatus == 1) {
+				pros.totalPrice = pros.initProductNum * pros.retailPrice
+			} else {
+				ladderPriceList.forEach((item, index) => {
+					if (pros.initProductNum >= item.buyNum) {
+						pros.retailPrice = item.buyPrice
+						pros.totalPrice = pros.initProductNum * item.buyPrice
+					}
+				})
+			}
+		},
+		operationHanld(prop) {
+			this.$emit('operationConfim', prop)
+		},
+		alertjieti(pros) {
+			this.$emit('alertjietiConfim', pros)
+		},
+		changeTab(index) {
+			this.tabIndex = index
+			if (index == 0) {
+				this.pageNum = 1
+				this.getProductAgainInfo()
+			} else {
+				this.getcombinationProduct()
+			}
+			// this.$emit('changetab',index);
+		},
+		navToDetailPage(id) {
+			this.isModallayer = true
+			this.$api.navigateTo(`/pages/goods/product?id=${id}`)
+			this.isModallayer = false
+		},
+		repurchModel() {
+			this.$util.modal('', '此商品的价格有变化,原来的购买价已不适用', '知道了', '', false, () => {})
+		},
+		onShowClose() {
+			//输入框失去焦点时触发
+			if (this.searchInputVal != '') {
+				this.isShowClose = true
+			} else {
+				this.isShowClose = false
+			}
+		},
+		delInputText(tabIndex) {
+			//清除输入框内容
+			if (tabIndex == 0) {
+				this.searchInputVal = ''
+				this.listData = []
+				this.isFocus = true
+				this.isShowClose = false
+				this.loadingNow = false
+				this.isShowEmpty = true
+				this.isShowEmptyText = '暂无相关商品'
+			} else {
+				this.searchInputVal = ''
+				this.isShowClose = false
+				this.isFocus = true
+				this.getcombinationProduct()
+			}
+		},
+		isInterceptHtmlFn(text) {
+			let name = this.$reg.interceptHtmlFn(text)
+			return name
+		},
+		PromotionsFormat(promo) {
+			//促销活动类型数据处理
+			if (promo != null) {
+				if (promo.type == 1 && promo.mode == 1) {
+					return true
+				} else {
+					return false
+				}
+			}
+			return false
+		},
+		btnClick() {
+			this.$emit('goCartPage')
+		},
+		btnTouchstart() {
+			// console.log('btnTouchstart');
+		},
+		btnTouchend() {
+			// console.log('btnTouchend');
+		}
+	}
+}
+</script>
+
+<style lang="scss">
+.all-zuhe-list {
+	background: #ffffff;
+}
+
+.foot_conten {
+	width: 655rpx;
+	background: #fff;
+	font-size: 28rpx;
+	height: 80rpx;
+	// line-height: 80rpx;
+	display: inherit;
+	padding: 10px;
+	overflow: hidden;
+	margin: 20rpx auto;
+}
+.zuhe_foot-box {
+	float: left;
+	overflow: hidden;
+	white-space: nowrap;
+	// text-overflow: ellipsis;
+	width: 490rpx;
+}
+.zuhe_foot-box text {
+	margin-right: 36rpx;
+}
+.foot_text {
+	color: #ff2a2a;
+}
+.foot_conten .buycart {
+	width: 162rpx;
+	height: 64rpx;
+	background: #efaf00 !important;
+	color: #fff;
+	font-size: 26rpx;
+	border-radius: 36rpx;
+	text-align: center;
+	line-height: 64rpx;
+	float: right;
+}
+.price-none {
+	font-size: 24rpx;
+	color: #666666;
+}
+.zuhe_title {
+	background: #ffffff;
+	height: 76rpx;
+	font-size: 28rpx;
+	color: #1675e1;
+	border-bottom: 4rpx solid #1675e1;
+	line-height: 76rpx;
+	padding-left: 30rpx;
+	&.active {
+		color: #e15616;
+		border-bottom: 4rpx solid #e15616;
+	}
+}
+.tabstyle {
+	width: 128rpx;
+	height: 76rpx;
+	font-size: 26rpx;
+	display: inline-block;
+	border-radius: 10rpx;
+	text-align: center;
+	line-height: 76rpx;
+	border: 2rpx solid #eeeeee;
+	position: relative;
+	margin-right: 12rpx;
+	&.addstyle {
+		background: $btn-confirm;
+		color: #ffffff;
+		&::before {
+			content: '';
+			width: 0;
+			height: 0;
+			border-top: 20rpx solid transparent;
+			border-right: 20rpx solid #ffffff;
+			border-left: 20rpx solid transparent;
+			border-bottom: 20rpx solid #ffffff;
+			position: absolute;
+			right: 0;
+			bottom: 0;
+		}
+	}
+	.icon-gou {
+		width: 36rpx;
+		height: 36rpx;
+		line-height: 36rpx;
+		text-align: center;
+		color: #e15616;
+		position: absolute;
+		bottom: -5rpx;
+		right: -5rpx;
+		font-weight: bold;
+		font-size: $font-size-28;
+	}
+}
+.commodity-list-wrapper {
+	.product-container {
+		padding-top: 130rpx;
+	}
+	scroll-view {
+		height: 100%;
+	}
+	.show-more-btn {
+		width: 276rpx;
+		height: 52rpx;
+		line-height: 52rpx;
+		border: 2rpx solid #d8d8d8;
+		background: #f7f7f7;
+		font-size: 26rpx;
+		margin: 26rpx 0;
+		position: absolute;
+		left: 50%;
+		margin-left: -138rpx;
+	}
+}
+.good-search {
+	position: fixed;
+	top: 0;
+	z-index: 999;
+	background-color: #fff;
+	width: 702rpx;
+	height: 66rpx;
+	padding: 32rpx 24rpx;
+	.search-from {
+		display: flex;
+		align-items: center;
+		box-sizing: border-box;
+		padding-left: 30rpx;
+		width: 702rpx;
+		height: 66rpx;
+		background-color: #f7f7f7;
+		border-radius: 33rpx;
+		line-height: 64rpx;
+		.icon-sousuo {
+			width: 64rpx;
+			height: 64rpx;
+			text-align: center;
+			font-size: $font-size-32;
+		}
+		.input {
+			font-size: $font-size-26;
+		}
+	}
+}
+.all-type-list-content {
+	// height: 240rpx;
+	padding: 24rpx;
+	background: #fff;
+	margin-bottom: 2rpx;
+	display: flex;
+	flex-direction: row;
+	box-sizing: content-box;
+	.list-img {
+		width: 312rpx;
+		height: 207rpx !important;
+		margin-right: 26rpx;
+		border-radius: 10rpx;
+		border: 2rpx solid #f3f3f3;
+	}
+}
+.zuhe-list-content {
+	width: 655rpx;
+	// height: 214rpx;
+	background: #fff;
+	border: 2rpx solid #def4ff;
+	display: flex;
+	flex-direction: row;
+	box-sizing: content-box;
+	margin-top: 10rpx;
+	border-radius: 14rpx;
+	margin: 10rpx auto;
+	padding: 20rpx;
+	&.stylecontent {
+		border: 2rpx solid #fff0de;
+	}
+}
+
+.list-details-info {
+	width: 100%;
+	flex-direction: column;
+	font-size: 26rpx;
+	position: relative;
+	.list-details-title {
+		line-height: 38rpx;
+		text-overflow: ellipsis;
+		overflow: hidden;
+		display: -webkit-box;
+		-webkit-line-clamp: 2;
+		line-clamp: 2;
+		-webkit-box-orient: vertical;
+	}
+	.list-details-tags {
+		display: flex;
+		justify-content: flex-start;
+		margin: 10rpx 0;
+		height: 34rpx;
+	}
+	.goods-price {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		.price {
+			font-size: 26rpx;
+			font-weight: bold;
+			color: $uni-text-color-price;
+		}
+		.shop-btn {
+			width: 160rpx;
+			height: 56rpx;
+			border: 1px solid #333333;
+			border-radius: 28rpx;
+			text-align: center;
+			line-height: 56rpx;
+			box-sizing: border-box;
+		}
+	}
+	.list-details-specs {
+		width: 100%;
+		display: inline-block;
+		margin: 5rpx 0;
+		color: #999;
+		font-size: 20rpx;
+		line-height: 28rpx;
+	}
+	.list-details-miniQuantity {
+		width: 100%;
+		display: inline-block;
+		margin-top: 7rpx;
+	}
+}
+.list-details-price {
+	width: 100%;
+	.floor-item-act {
+		height: 54rpx;
+		text-align: center;
+		box-sizing: border-box;
+		float: left;
+		.floor-tags {
+			height: 28rpx;
+			border-radius: 6rpx;
+			background-color: #ffffff;
+			line-height: 28rpx;
+			color: $color-system;
+			text-align: center;
+			display: inline-block;
+			padding:0 5rpx;
+			font-size: $font-size-20;
+			margin-left: 15rpx;
+			border: 1px solid #e15616;
+		}
+	}
+	.price-icon {
+		width: 22rpx;
+		height: 28rpx;
+		vertical-align: middle;
+		margin-right: 10rpx;
+	}
+	.price-icon + text {
+		font-size: 25rpx;
+		vertical-align: middle;
+	}
+	.list-login-now {
+		width: 375rpx;
+		color: #f8c499;
+		.p-no {
+			float: left;
+			font-size: $font-size-24;
+			color: $color-system;
+			margin-right: 10rpx;
+		}
+	}
+	.login-now {
+		padding: 10rpx 10rpx 10rpx 0;
+	}
+	.list-none {
+		margin-top: 15rpx;
+		.price-small {
+			font-size: $font-size-24;
+			line-height: 40rpx;
+			color: #ff2a2a;
+		}
+	}
+	.list-price-loding {
+		font-size: $font-size-24;
+		line-height: 54rpx;
+		color: #ff2a2a;
+	}
+	.list-shop {
+		float: left;
+		overflow: hidden;
+		&.com {
+			width: 100%;
+		}
+		.list-price {
+			color: #ff2a2a;
+			float: left;
+			line-height: 54rpx;
+			align-items: center;
+			justify-content: center;
+			.price-larger {
+				font-size: $font-size-26;
+				display: inline-block;
+				&.none {
+					text-decoration: line-through;
+					color: #999999;
+				}
+			}
+			.list-price-all {
+				width: 100%;
+				float: left;
+			}
+			.zuhe_price-larger {
+				width: 100%;
+				float: left;
+				height: 54rpx;
+				color: #666666;
+				.price-larger {
+					float: left;
+					margin-right: 20rpx;
+				}
+			}
+			.price-two {
+				color: #666666;
+				float: left;
+			}
+			.zuhe_list_zj {
+				color: #ff2a2a;
+			}
+			.price-view {
+				display: inline-block;
+				width: 40rpx;
+				border-radius: 10rpx;
+				font-size: $font-size-22;
+				text-align: center;
+				color: #ffffff;
+				height: 36rpx;
+				line-height: 36rpx;
+				margin-right: 8rpx;
+				&.ladder {
+					background: linear-gradient(135deg, rgba(255, 0, 0, 1) 0%, rgba(242, 143, 49, 1) 100%);
+				}
+				&.activity {
+					background: linear-gradient(135deg, rgba(128, 0, 255, 1) 0%, rgba(242, 49, 153, 1) 100%);
+				}
+			}
+		}
+		.zuhe_list_price .price-view {
+			margin-left: 20rpx;
+			float: left;
+			margin-top: 5rpx;
+		}
+		.zuhe_list_price {
+			width: 100%;
+			overflow: hidden;
+			margin-top: 10rpx;
+		}
+		.count {
+			float: right;
+			border: 1px solid #eeeeee;
+			border-radius: 10rpx;
+			.number-box {
+				display: flex;
+				justify-content: center;
+				align-items: center;
+				.iconfont {
+					font-size: $font-size-24;
+					padding: 0 16rpx;
+					color: $text-color;
+					text-align: center;
+					line-height: 48rpx;
+					font-weight: bold;
+				}
+				.btn-input {
+					width: 100rpx;
+					height: 48rpx;
+					line-height: 48rpx;
+					background: #f8f8f8;
+					border-radius: 4rpx;
+					text-align: center;
+					font-size: $font-size-24;
+					border-right: 1px solid #eeeeee;
+					border-left: 1px solid #eeeeee;
+				}
+			}
+		}
+		.list-price-none {
+			width: 100%;
+			.price-none {
+				text-decoration: line-through;
+				color: #999999;
+				display: inline-block;
+			}
+			.icon-wenhao {
+				font-size: $font-size-32;
+				color: #0091ff;
+				margin-left: 6rpx;
+			}
+		}
+	}
+	.add-cart-btn {
+		flex: 4;
+		width: 140rpx;
+		height: 54rpx;
+		line-height: 54rpx;
+		border-radius: 27rpx;
+		color: #fff;
+		font-size: 24rpx;
+		margin-right: 0;
+		background: #ffffff;
+		border: 1px solid #c9c9c9;
+		color: $text-color;
+	}
+	.zuhe_btn {
+		float: right;
+	}
+}
+.zuhe_list_price {
+	display: block !important;
+}
+.zuhe_list_text {
+	margin-top: 0;
+}
+</style>

+ 51 - 0
components/cm-module/listTemplate/listSkeleton.vue

@@ -0,0 +1,51 @@
+<template>
+	<view class="skeleton-template">
+		 <image :src="setSrc" mode="widthFix"></image>
+	</view>
+</template>
+
+<script>
+	var self;
+	export default{
+		data() {
+			return{
+				skeletonList: {
+					empty: 'https://img.caimei365.com/group1/M00/03/71/Cmis2F3wna6AaQCxAAB0ju39mYk608.png',				
+				},
+				skeletonMemList: {
+					empty: 'https://img.caimei365.com/group1/M00/03/72/Cmis2F3xt_CALrJcAAEE4AHIZ1g310.png',				
+				},
+			}
+		},
+		props:{
+			listType:String,
+			src: {
+				type: String,
+				default: 'empty'
+			}
+		},
+		created(){
+			
+		},
+		computed: {
+			setSrc() {
+				let url;
+				if(this.listType== 0){					
+					url = this.skeletonList[this.src]
+				}else{
+					url = this.skeletonMemList[this.src]
+				}
+				return url;
+			},
+		},
+	}
+</script>
+
+<style lang="scss">
+	.skeleton-template {
+		image {
+			width: 100%;
+			height: 100%;
+		}
+	}
+</style>

+ 477 - 0
components/cm-module/listTemplate/productList.vue

@@ -0,0 +1,477 @@
+<template>
+	<view
+		class="container commodity-list-wrapper"
+		:style="{
+			overflow: showSkeleton ? 'hidden' : 'auto',
+			height: showSkeleton ? windowHeight + 'px' : 'auto'
+		}"
+	>
+		<list-skeleton v-if="showSkeleton" :listType="0"></list-skeleton>
+		<!-- 搜索框 -->
+		<fuzzy-search
+			placeholder="搜索商品名称"
+			:fixed="true"
+			@search="searchValHandle"
+			@input="searchValChange"
+			@clear="searchValClear"
+			@blur="searchValBlur"
+		></fuzzy-search>
+		<!-- 内容区域 -->
+		<scroll-view
+			class="product-container"
+			@scrolltolower="scrolltolower"
+			scroll-y
+			v-if="!isShowEmpty && productList.length > 0"
+		>
+			<view
+				v-for="(item, index) in productList"
+				:key="index"
+				:id="item.id"
+				class="all-type-list-content commodity-list goods-item"
+				@click.stop="navToDetailPage(item.productId)"
+			>
+				<image
+					mode="widthFix"
+					:src="item.mainImage"
+					class="list-img"
+					alt="list-img"
+					lazy-load
+				></image>
+				<view class="list-details-info">
+					<!-- 商品名称 -->
+					<text class="list-details-title">{{ item.productName }}</text>
+					
+					<!-- <text class="list-details-specs">商品编码:{{ item.productCode != null ? item.productCode : '' }}</text> -->
+					<!-- 价格 -->
+					<view class="price-box">
+						<view class="list-details-price prom">
+							<view class="floor-item-act" v-if="item.actStatus == 1">
+								<view class="floor-tags" v-if="PromotionsFormat(item.promotion)">
+									{{ item.promotion.name}}
+									<text>:¥{{ item.retailPrice | NumFormat }}</text>
+								</view>
+								<view class="floor-tags" v-else>{{ item.promotion.name }}</view>
+							</view>
+							<view class="floor-item-act" v-if="item.actStatus == 0 && item.ladderPriceFlag == 1">
+								<view class="floor-tags">阶梯价格</view>
+							</view>
+						</view>
+						<text class="list-details-miniQuantity">起订量:{{ item.minBuyNumber }}</text>
+						<text class="list-details-specs">规格:{{ item.unit != null ? item.unit : '' }}</text>
+						<view class="list-details-price">
+							<view class="list-shop">
+								<view class="list-price-none" v-if="item.repurchasePriceState">
+									<text class="price-none">¥{{ item.discountPrice }}</text>
+									<text class="iconfont icon-wenhao" @click.stop="repurchModel"></text>
+								</view>
+								<view class="list-price" v-else>
+									<text class="price-larger" :class="PromotionsFormat(item.promotion) ? 'none' : ''">
+										¥{{(PromotionsFormat(item.promotion) ? item.price : item.retailPrice) | NumFormat }}
+									</text>
+								</view>
+							</view>
+							<button class="add-cart-btn" @click.stop="operationHanld(item)">
+								购买
+							</button>
+						</view>
+					</view>
+				</view>
+			</view>
+			<!--加载loadding-->
+			<tui-loadmore :visible="loadingNow" :index="3" text="加载中..."></tui-loadmore>
+			<tui-nomore :visible="!loadingNow" :text="hasNextPage?'上拉加载更多':'没有更多了'"></tui-nomore>
+			<!--加载loadding END-->
+		</scroll-view>
+		<!-- 商品列表为空时 -->
+		<view class="empty-container" v-else>
+			<image
+				class="empty-container-image"
+				src="https://static.caimei365.com/app/wisa/img/icon/icon-product-empty.png"
+				mode="widthFix"
+			></image>
+			<text class="error-text">商品列表空空如也~</text>
+		</view>
+		<!-- 可拖动悬浮按钮 -->
+		<cm-drag
+			:cartNum="cartQuantity"
+			:isDock="true"
+			:existTabBar="true"
+			@btnClick="btnClick"
+			@btnTouchstart="btnTouchstart"
+			@btnTouchend="btnTouchend"
+		>
+		</cm-drag>
+		<!-- 透明模态层 -->
+		<modal-layer v-if="isModallayer"></modal-layer>
+	</view>
+</template>
+
+<script>
+import listSkeleton from '@/components/cm-module/listTemplate/listSkeleton'
+import modalLayer from '@/components/modal-layer'
+import uniStars from '@/components/uni-stars/uni-stars.vue'
+import cmDrag from '@/components/cm-custom/cm-drag.vue'
+import fuzzySearch from '@/components/cm-module/search/fuzzySearch.vue'
+import { mapState, mapMutations } from 'vuex'
+export default {
+	name: 'productList',
+	components: {
+		listSkeleton,
+		modalLayer,
+		uniStars,
+		cmDrag,
+		fuzzySearch
+	},
+	props: {
+		emptyText: {
+			type: String
+		}
+	},
+	data() {
+		return {
+			isModallayer: false,
+			windowHeight: '',
+			// 是否显示骨架
+			showSkeleton: false,
+			isShowEmpty: false,
+			scrollHeight: '',
+			productList: [],
+			loadingNow: false,
+			pageSize: 10,
+			pageNum: 1,
+			hasNextPage: false,
+			pullFlag: true,
+			cartQuantity: 0,
+			showRegularBtn: true,
+			isPrecedence: false,
+			searchVal: '', //搜索框
+			organizeId: '',
+			userId: ''
+		}
+	},
+	computed: {
+		...mapState(['hasLogin', 'userInfo', 'identity'])
+	},
+	async created() {
+		// 获取采购员组织id
+		const userInfo = uni.getStorageSync('userInfo')
+		this.organizeId = userInfo.organizeId
+		// 获取商品列表
+		this.productList = await this.getGoodsList()		
+	},
+	filters: {
+		//处理金额
+		NumFormat: function(text) {
+			return Number(text).toFixed(2)
+		}
+	},
+	methods: {		
+		// 上拉加载更多
+		async scrolltolower() {
+			if (!this.hasNextPage) {
+				// 没有更多了
+				this.loadingNow = false
+				return
+			}
+			if (this.pullFlag) {
+				this.loadingNow = true
+				// 页码加1
+				this.pageNum += 1
+				const addGoods = await this.getGoodsList()
+				this.productList = [...this.productList, ...addGoods]
+				this.pullFlag = false
+				setTimeout(() => {
+					this.pullFlag = true
+				}, 1500)
+			}
+		},
+		// 获取商品列表
+		async getGoodsList() {
+			// 参数
+			const params = {
+				organizeId: this.organizeId,
+				pageNum: this.pageNum,
+				pageSize: this.pageSize,
+				productName: this.searchVal
+			}
+			// 获取商品数据
+			const { code, data: result } = await this.SellerService.GoodList(params).catch(
+				error => {
+					console.log(error)
+				}
+			)
+			// 如果获取失败 返回上一页
+			if (code !== 0) {
+				uni.navigateBack({
+					delta: 1
+				})
+				return
+			}
+			// 是否还有下一页
+			this.hasNextPage = result.hasNextPage
+			this.loadingNow = false
+			// 返回列表
+			return result.list
+		},
+		// 关键字搜索
+		async searchKeyWords() {
+			this.pageNum = 1
+			this.productList = await this.getGoodsList()
+		},
+		searchValChange(val) {
+			this.searchVal = val
+		},
+		searchValBlur() {
+			this.searchKeyWords()
+		},
+		async searchValClear() {
+			this.searchVal = ''
+			this.searchKeyWords()
+		},
+		// 搜索按钮点击事件
+		async searchValHandle(val) {
+			// 如果输入框内容为空
+			if (val.trim().length <= 0) {
+				this.searchVal = ''
+				return
+			}
+			this.searchKeyWords()
+		},
+		operationHanld(prop) {
+			this.$emit('operationConfim', prop)
+		},
+		// 跳转详情
+		navToDetailPage(id) {
+			this.isModallayer = true
+			this.$api.navigateTo(`/pages/goods/product?id=${id}`)
+			this.isModallayer = false
+		},
+		repurchModel() {
+			this.$util.modal(
+				'',
+				'此商品的价格有变化,原来的购买价已不适用',
+				'知道了',
+				'',
+				false,
+				() => {}
+			)
+		},
+		PromotionsFormat(promo) {
+			//促销活动类型数据处理
+			if (promo != null) {
+				if (promo.type == 1 && promo.mode == 1) {
+					return true
+				} else {
+					return false
+				}
+			}
+			return false
+		},
+		btnClick() {
+			this.$api.navigateTo('/pages/user/cart/cart')
+		},
+		btnTouchstart() {
+			// console.log('btnTouchstart');
+		},
+		btnTouchend() {
+			// console.log('btnTouchend');
+		}
+	}
+}
+</script>
+
+<style lang="scss">
+.commodity-list-wrapper {
+	.empty-container-image {
+		width: 200rpx;
+		height: 200rpx;
+		margin-top: -300rpx;
+	}
+	.toIndexPage {
+		bottom: 390rpx;
+	}
+	.show-more-btn {
+		width: 276rpx;
+		height: 52rpx;
+		line-height: 52rpx;
+		border: 2rpx solid #d8d8d8;
+		background: #f7f7f7;
+		font-size: 26rpx;
+		margin: 26rpx 0;
+		position: absolute;
+		left: 50%;
+		margin-left: -138rpx;
+	}
+}
+.all-type-list-content {
+	height: auto;
+	padding: 24rpx;
+	background: #fff;
+	margin-bottom: 2rpx;
+	display: flex;
+	flex-direction: row;
+	box-sizing: content-box;
+	.list-img {
+		width: 240rpx;
+		height: 240rpx !important;
+		margin-right: 26rpx;
+		border-radius: 10rpx;
+		border: 2rpx solid #f3f3f3;
+	}
+}
+.list-details-info {
+	width: 442rpx;
+	flex-direction: column;
+	font-size: 26rpx;
+	position: relative;
+	.list-details-title {
+		line-height: 38rpx;
+		text-overflow: ellipsis;
+		overflow: hidden;
+		display: -webkit-box;
+		-webkit-line-clamp: 2;
+		line-clamp: 2;
+		-webkit-box-orient: vertical;
+	}
+	.list-details-specs {
+		width: 100%;
+		font-size: 20rpx;
+		display: inline-block;
+		color: #999999;
+	}
+	.list-details-miniQuantity {
+		width: 100%;
+		display: inline-block;
+		font-size: 20rpx;
+		color: #999999;
+	}
+}
+.price-box{
+		width: 100%;
+		position: absolute;
+		bottom: 0;
+	}
+.list-details-price {
+	width: 100%;
+	// line-height: 54rpx;
+	// margin-top: 10rpx;
+	// height: 54rpx;
+	float: left;
+	.floor-item-act{
+		width: 100%;
+		// height: 56rpx;
+		text-align: center;
+		box-sizing: border-box;
+		float: left;
+		.floor-tags{
+			height: 28rpx;
+			border-radius: 6rpx;
+			background-color: #FFFFFF;
+			line-height: 28rpx;
+			color: #ff2a2a;
+			text-align: center;
+			display: inline-block;
+			padding:0 5rpx;
+			font-size: $font-size-20;
+			border: 1px solid #ff2a2a;
+			float: left;
+		}
+	}
+	.price-icon {
+		width: 22rpx;
+		height: 28rpx;
+		vertical-align: middle;
+		margin-right: 10rpx;
+	}
+	.price-icon + text {
+		font-size: 25rpx;
+		vertical-align: middle;
+	}
+	.list-login-now {
+		width: 375rpx;
+		color: #f8c499;
+		position: absolute;
+		bottom: 0;
+		.p-no {
+			float: left;
+			font-size: $font-size-24;
+			color: $color-system;
+			margin-right: 10rpx;
+		}
+	}
+	.login-now {
+		padding: 10rpx 10rpx 10rpx 0;
+	}
+	.list-none {
+		margin-top: 30rpx;
+		.price-small {
+			font-size: $font-size-24;
+			line-height: 40rpx;
+			color: #ff2a2a;
+		}
+	}
+	.list-shop {
+		height: auto;
+		float: left;
+		.list-price {
+			width: 100%;
+			color: #ff2a2a;
+			float: left;
+			line-height: 54rpx;
+			align-items: center;
+			justify-content: center;
+			.price-larger {
+				font-size: $font-size-30;
+				display: inline-block;
+				font-weight: bold;
+				&.none {
+					text-decoration: line-through;
+					color: #999999;
+				}
+			}
+		}
+		.list-price-none {
+			width: 100%;
+			.price-none {
+				text-decoration: line-through;
+				color: #999999;
+				display: inline-block;
+			}
+			.icon-wenhao {
+				font-size: $font-size-32;
+				color: #0091ff;
+				margin-left: 6rpx;
+			}
+		}
+	}
+	.add-cart-btn {
+		float: right;
+		width: 140rpx;
+		height: 54rpx;
+		line-height: 54rpx;
+		border-radius: 27rpx;
+		color: #fff;
+		font-size: 24rpx;
+		margin-right: 0;
+		background: #ffffff;
+		border: 1px solid #c9c9c9;
+		color: $text-color;
+	}
+}
+.list-details-tags {
+	display: flex;
+	justify-content: flex-start;
+	margin: 14rpx 0;
+	height: 34rpx;
+	.tag {
+		margin-right: 5rpx;
+	}
+}
+.product-container {
+	width: 100%;
+	height: 100vh;
+	overflow: hidden;
+	padding-top: 100rpx;
+	box-sizing: border-box;
+}
+</style>

+ 39 - 0
components/cm-module/listTemplate/richTextTemplate.vue

@@ -0,0 +1,39 @@
+<template>
+	<view class="content">
+		<parser :html="html" :img-mode="widthFix"></parser>
+	</view>
+</template>
+
+<script>
+	import parser from "@/components/jyf-Parser/index"
+	var self;
+	export default{
+		components: {
+		   parser,
+		   // uPars
+		},
+		data() {
+			return{
+				serverUrl: '',
+				type: '',
+				html:''
+			}
+		},
+		created(){
+			self = this;		
+		},
+		methods:{
+
+		}
+	}
+</script>
+
+<style lang="scss">
+	page{
+		background: $sub-bg-color;
+		border-top: 1px solid #EBEBEB;
+	}
+	.content {
+		padding: 40rpx 24rpx;
+	}
+</style>

+ 235 - 0
components/cm-module/orderDetails/activipopu.vue

@@ -0,0 +1,235 @@
+<template name="cm-price">
+	<!--促销活动弹窗提示-->
+	<tui-bottom-popup :radius="true" :show="popupShow" @close="hidePopup()">
+		<view class="tui-popup-box clearfix">
+			<view class="tui-scrollview-box">
+				<view class="box-text">
+					<text>促销时间:</text>
+					<text class="txt" v-if="Promotion.status == 1">不限时</text>
+					<text class="txt" v-else>{{ Promotion.beginTime }} ~ {{ Promotion.endTime }}</text>
+				</view>
+				<view class="box-title" v-show="Promotion.mode ==2">
+					<text>此商品参与{{Promotion.name}},满</text>
+					<text class="txt">¥{{Promotion == null ? '0.00' : Promotion.touchPrice | NumFormat}}</text>减
+					<text class="txt">¥{{Promotion == null ? '0.00' : Promotion.reducedPrice | NumFormat}}</text>
+				</view>
+				<view class="box-title" v-show="Promotion.mode==3">
+					<text>此商品参与{{Promotion.name}},满</text>
+					<text class="txt">¥{{Promotion.touchPrice}}</text>赠送商品(赠品见订单详情)
+				</view>
+			</view>
+			<view class="tui-right-flex tui-popup-btn" :style="{ paddingBottom :isIphoneX ? '68rpx' : '0rpx' }">
+				<view class="tui-flex-1">
+					<view class="tui-button" @click="hidePopup()">了解</view>
+				</view>
+			</view>
+		</view>	
+	</tui-bottom-popup>
+</template>
+
+<script>
+	import { mapState,mapMutations } from 'vuex'
+	export default{
+		name:'cm-price',
+		props:{
+			Promotion:{
+				type:Object,
+			},
+			popupShow:{
+				type:Boolean,
+				default:false
+			}
+		},
+		data() {
+			return{
+				isIphoneX:this.$store.state.isIphoneX,
+			}
+		},
+		filters: {
+			NumFormat:function(text) {//处理金额
+				return Number(text).toFixed(2);
+			},
+		},
+		created() {
+			
+		},
+		computed: {
+			...mapState(['hasLogin','isWxAuthorize'])
+		},
+		methods:{
+			hidePopup(){
+				this.$parent.popupShow = false
+			},
+			goGoodActiveFn(id){
+				this.$parent.popupShow = false
+				this.$api.navigateTo('/pages/goods/goods-active?id='+id)
+			}
+		},
+		
+	}
+</script>
+
+<style lang="scss">	
+	.tui-flex-1 {
+		flex: 1;
+	}
+	.tui-popup-box {
+		position: relative;
+		box-sizing: border-box;
+		min-height: 220rpx;
+		padding:24rpx 24rpx 0 24rpx;
+	}
+	.tui-scrollview-box{
+		width: 100%;
+		height: auto;
+		float: left;
+		box-sizing: border-box;
+		.ladder-main{
+			width: 100%;
+			height: 320rpx;
+			border: 1px solid rgba(225,86,22,0.3);
+			border-radius: 10rpx;
+			.ladder-item{
+				width: 100%;
+				height: 80rpx;
+				float: left;
+				border-bottom: 1px solid rgba(225,86,22,0.3);
+				&:nth-child(1){
+					.ladder-item-td{
+						color: #333333;
+					}
+				}
+				&:last-child{
+					border-bottom: none;
+				}
+				.ladder-item-td{
+					width:50%;
+					text-align: center;
+					line-height: 80rpx;
+					font-size: $font-size-24;
+					color: $color-system;
+					box-sizing: border-box;
+					float: left;
+					&:nth-child(1){
+						border-right: 1px solid rgba(225,86,22,0.3);
+					}
+				}
+			}
+		}
+		.box-title{
+			font-size: $font-size-26;
+			color: $text-color;
+			text-align: left;
+			line-height: 56rpx;
+			.txt{
+				color: $color-system;
+				margin: 0 8rpx;
+			}
+		}
+		.box-text{
+			font-size: $font-size-26;
+			color: $text-color;
+			text-align: left;
+			line-height: 56rpx;
+			.txt{
+				color: $color-system;
+			}
+		}
+		.box-product{
+			width: 100%;
+			height: auto;
+			margin-top: 20rpx;
+			.title{
+				font-size: $font-size-24;
+				color: $text-color;
+				text-align: left;
+				line-height: 54rpx;
+			}
+			.box-product-main{
+				width: 100%;
+				height: 136rpx;
+				.image{
+					width: 134rpx;
+					height: 134rpx;
+					border: 1px solid #EBEBEB;
+					float: left;
+					image{
+						width: 100%;
+						height: 100%;
+						display: block;
+					}
+				}
+				.info{
+					width: 540rpx;
+					height: 134rpx;
+					float: left;
+					margin-left: 16rpx;
+					position: relative;
+					.name{
+						width: 100%;
+						float: left;
+						line-height: 40rpx;
+						font-size: $font-size-28;
+						color: $text-color;
+						-o-text-overflow: ellipsis;
+						text-overflow: ellipsis;
+						display: -webkit-box;
+						word-break: break-all;
+						-webkit-box-orient: vertical;
+						-webkit-line-clamp: 2;
+						overflow: hidden;
+					}
+					.num{
+						width: 100%;
+						height: 44rpx;
+						font-size: $font-size-24;
+						color: $text-color;
+						text-align: left;
+						line-height: 44rpx;
+						position: absolute;
+						bottom: 0;
+						left: 0;
+					}
+				}
+			}
+		}
+	}
+	
+	.tui-popup-btn {
+		width: 100%;
+		height: auto;
+		float: left;
+		margin-top: 24rpx;
+		.tui-button{
+			width: 100%;
+			height: 88rpx;
+			background: $btn-confirm;
+			line-height: 88rpx;
+			text-align: center;
+			color: #FFFFFF;
+			font-size: $font-size-28;
+			border-radius: 14rpx;
+		}
+	}
+</style>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 470 - 0
components/cm-module/orderDetails/goodsList.vue

@@ -0,0 +1,470 @@
+<template name="goods">
+	<view class="goods-template">
+		 <!-- 商品列表 -->
+		<view class="goods-list">
+			<view v-for="(item, index) in shopOrderData" :key="index" class="goods-item clearfix">
+				<view class="shoptitle">
+					<view v-if="item.shopPromotion" class="floor-item-act">
+						<view class="floor-tags" @click.stop="clickPopupShow(item.shopPromotion)">{{item.shopPromotion.name}}</view>	
+					</view>
+					<view class="title-text" v-else>{{item.shopName}}</view> 
+				</view>
+				<view class="productlist" v-for="(pros,idx) in item.orderProductList" :key="idx">
+					<view class="goods-pros-t " @click="details(pros)">
+						<view class="pros-left">
+							<view class="pros-img">
+								<image :src="pros.productImage" alt="" />
+								<text class="tips" v-if="pros.productType ==2 || pros.productType ==1">赠品</text>
+							</view>
+						</view>
+						<view class="pros-product">
+							<view class="producttitle">{{pros.name}}</view>
+							<view class="productspec product-view" v-if="pros.productCategory != 2">规格:{{pros.productUnit ? pros.productUnit : ''}}</view>
+							<view class="product-view">
+								<view class="view-num red" v-if="pros.productType ==2 || pros.productType ==1">
+									<text>¥0.00</text>
+								</view>
+								<view class="view-num red" v-else :class="PromotionsFormat(pros.productPromotion) ? 'disabled' : ''">¥{{pros.price | NumFormat}}</view>
+							</view>
+							<view class="floor-item-act" v-if="pros.productPromotion!=null" >
+								<view v-if="PromotionsFormat(pros.productPromotion)" class="floor-tags" @click.stop="clickPopupShow(pros.productPromotion)">
+									{{pros.productPromotion.name}}
+									<text v-if ="pros.productPromotion!=null && pros.productPromotion.type !=3">
+										:¥{{ pros.productPromotion == null ? '0.00' : pros.productPromotion.touchPrice | NumFormat}}
+									</text>
+								</view>
+								<view v-else-if="pros.productPromotion.type !=3" class="floor-tags" @click.stop="clickPopupShow(pros.productPromotion)">{{pros.productPromotion.name}}</view>	
+							</view>
+							<view class="product-view">
+								<view class="view-num right">x {{pros.num}}</view>
+							</view>
+						</view>	
+					</view>
+					<view class=" product-info">
+						<view class="product-view" v-if="pros.returnedNum>0 || pros.actualCancelNum>0">
+							<view class="view-num">已退货/已取消</view>
+							<view class="view-right">{{pros.returnedNum}}/{{pros.actualCancelNum}}</view>
+						</view>
+						<view class="product-view">
+							<view class="view-num">折扣</view>
+							<view class="view-right">{{pros.discount == null ? '0' : pros.discount}}%</view>
+						</view>
+						<view class="product-view">
+							<view class="view-num">税率</view>
+							<view class="view-right">{{pros.taxRate}}%</view>
+						</view>
+						<view class="product-view">
+							<view class="view-num">折后单价</view>
+							<view class="view-right">
+								<text v-if="PromotionsFormat(pros.productPromotion)" 
+									  :class="PromotionsFormat(pros.productPromotion) ? 'disabled' : ''">
+									  ¥{{pros.discountPrice | NumFormat}}
+								</text>
+								<text>
+									¥{{(PromotionsFormat(pros.productPromotion) ? pros.productPromotion.touchPrice : pros.discountPrice)  | NumFormat}}
+								</text>
+							</view>
+						</view>
+						<view class="product-view allPrice">
+							<view class="view-num">合计</view>
+							<view class="view-right">¥{{pros.totalFee | NumFormat}}</view>
+						</view>
+					</view>
+				</view>	
+				<view class="goods-pros-m" v-if="item.note">
+					<view class="m-text">留言:</view>
+					<view class="m-input">
+						<view class="text">{{item.note ? item.note : ''}}</view>
+					</view>	
+				</view>
+				<view class="goods-pros-b">
+					<view class="count">共{{item.itemCount}}件商品</view>
+					<view class="sum">
+						<view class="sum-none" v-if="item.promotionFullReduction>0">
+							<text class="money-sign">¥</text>
+							<text class="money">{{ (item.totalAmount+item.promotionFullReduction) | NumFormat }}</text>
+							<text class="money-reduced">减<text>¥{{ (item.promotionFullReduction) | NumFormat}}</text></text>
+						</view>
+						<view class="sum-money" :class="item.promotionFullReduction == 0 ? 'none' : ''">
+							商品总额:<text class="money">¥{{item.totalAmount | NumFormat}}</text>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>	
+	</view>
+</template>
+
+<script>
+	export default{
+		name:"goods",
+		props:{
+			shopOrderData:{
+				type:Array
+			},
+			information:{
+				type:Object
+			}
+		},
+		data() {
+			return{
+				initData:[],
+			}
+		},
+		created(){
+			this.initData = this.shopOrderData
+		},
+		filters:{
+			NumFormat(value) {//处理金额
+				return Number(value).toFixed(2);
+			},
+			formatIncludedTax(value) {
+				if (value === '1') {
+				  return '不含税 ';
+				} else if (value === '2') {
+				  return '含税';
+				} else {
+				  return '';
+				}
+			},
+		},	
+		computed: {
+		
+		},
+		methods:{
+			goShophome(id){
+				this.$api.navigateTo(`/supplier/pages/user/my-shop?shopId=${id}`)
+			},
+			details(pros){
+				if(pros.validFlag == 9){
+					return
+				}else{
+					console.log(pros)
+					this.$api.navigateTo(`/pages/goods/product?id=${pros.organizeProductId}`)
+				}
+			},	
+			clickPopupShow(pros){
+				console.log(pros)
+				this.$emit('popupClick',pros)
+			},
+			PromotionsFormat(promo){//促销活动类型数据处理
+				if(promo!=null){
+					if(promo.type == 1 && promo.mode == 1){
+						return true
+					}else{
+						return false
+					}
+				}
+				return false
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	.goods-template{
+		width: 100%;
+		height: auto;
+		background: #FFFFFF;
+		float: left;
+		margin-top: 24rpx;
+		.goods-list{
+			width: 100%;
+			height: auto;
+			background: #F7F7F7;
+			.goods-item{
+				width: 702rpx;
+				padding:24rpx;
+				height: auto;
+				background: #FFFFFF;
+				margin-bottom: 24rpx;
+				&:last-child{
+					margin-bottom: 0;
+				}
+			}
+			.shoptitle{
+				width: 100%;
+				float: left;
+				height: 56rpx;
+				line-height: 56rpx;
+				margin-bottom: 12rpx;
+				.title-text{
+					width: 400rpx;
+					overflow: hidden;
+					text-overflow:ellipsis;
+					white-space: nowrap;
+					float: left;
+					font-size: $font-size-28;
+					color: $text-color;
+					text-align: left;
+					line-height: 56rpx;
+					font-weight: bold;
+					.iconfont{
+						color: #999999;
+						font-size: 28rpx;
+						margin-left: 10rpx;
+					}
+					.paymenttext{
+						color: #f9a94b;
+						font-size: $font-size-22;
+						margin-left: 20rpx;
+					}
+				}
+				
+			}
+			.productlist{
+				width: 100%;
+				height: auto;
+				border-bottom: 2rpx solid #e1e1e1;
+				padding: 10rpx;
+				box-sizing: border-box;
+			}	
+			.goods-pros-t{
+				display: flex;
+				width: 100%;
+				height: auto;
+				margin: 20rpx 0;
+				.pros-left{
+					width: 210rpx;
+					height: 100%;
+					margin:0 26rpx 0 0;
+				}
+				.pros-img{
+					width: 210rpx;
+					height: 210rpx;
+					border-radius: 10rpx;
+					border:1px solid #f3f3f3;
+					position: relative;
+					.tips{
+						display: inline-block;
+						width: 80rpx;
+						height: 40rpx;
+						background-image: linear-gradient(214deg, #ff4500 0%, #ff5800 53%, #ff4367 100%);
+						line-height: 40rpx;
+						text-align: center;
+						font-size: $font-size-24;
+						color: #FFFFFF;
+						border-radius:10rpx 0 10rpx 0 ;
+						position: absolute;
+						top:0;
+						left: 0;
+					}
+					image{
+						width: 210rpx;
+						height: 210rpx;
+						border-radius: 10rpx;
+					}
+				}
+			}
+			.product-info{
+				padding: 10rpx 0;
+				.product-view{
+					font-size:$font-size-24;
+					color: #999999;
+					overflow: hidden;
+					height: 44rpx;
+					line-height: 44rpx;
+					.view-num{
+						float: left;
+					}
+					.view-right{
+						color: #666666;
+						float: right;
+						.disabled{
+							color: #999999;
+							text-decoration: line-through;
+							margin-right: 10rpx;
+						}
+					}
+				}
+				
+			}
+			.pros-product{
+				width: 468rpx;
+				height: 100%;
+				line-height: 36rpx;
+				font-size: $font-size-26;	
+				position: relative;
+				.product-view{
+					&.allPrice{
+						width: 100%;
+					}
+					.view-num{
+						flex: 1;
+						text-align: left;
+						font-size: $font-size-26;
+						color: #999999;
+						line-height: 44rpx;
+						float: left;
+						&.right{
+							float: right;
+						}
+						&.red{
+							color: #FF2000;
+							font-weight: bold;
+							&.disabled{
+								color: #999999;
+								text-decoration: line-through;
+							}
+						}
+					}
+				}
+				.producttitle{
+					width: 100%;
+					display: inline-block;
+					height: auto;							
+					text-overflow:ellipsis;
+					display: -webkit-box;
+					word-break: break-all;
+					-webkit-box-orient: vertical;
+					-webkit-line-clamp: 2;
+					overflow: hidden;
+					margin-bottom: 8rpx;
+				}
+				.productspec{
+					height: 44rpx;
+					color: #999999;
+					line-height: 44rpx;
+				}
+				.productprice{
+					height: 48rpx;
+					position: absolute;
+					width: 100%;
+					bottom: 0;
+					.price{
+						line-height: 48rpx;
+						font-size: $font-size-28;
+						width: 48%;
+						color: #FF2A2A;
+						float: left;
+					}
+					.count{
+						height: 100%;
+						float: right;
+						position: relative;
+						.small{
+							color: #666666;
+						}
+					}
+				}
+				.floor-item-act{
+					width: 100%;
+					height: 56rpx;
+					text-align: center;
+					box-sizing: border-box;
+					float: left;
+					padding:0 0 10rpx 0;
+					.floor-tags{
+						height: 28rpx;
+						border-radius: 6rpx;
+						background-color: #FFFFFF;
+						line-height: 28rpx;
+						color: #ff2a2a;
+						text-align: center;
+						display: inline-block;
+						padding:0 5rpx;
+						font-size: $font-size-20;
+						border: 1px solid #ff2a2a;
+						float: left;
+					}
+				}
+			}
+			.goods-pros-m{
+				width: 100%;
+				height: auto;
+				line-height: 76rpx;
+				font-size: $font-size-26;
+				color: $text-color;
+				float: left;
+				.m-text{
+					width: 62rpx;
+					float: left;
+					padding-right: 20rpx;
+					font-weight:bold;
+				}
+				.m-input{
+					display: -webkit-box;
+					display: -webkit-flex;
+					display: flex;
+					-webkit-box-align: center;
+					-webkit-align-items: center;
+					align-items: center;
+					position: relative;
+					width: 620rpx;
+					height: auto;
+					padding: 20rpx 0 10rpx 0;
+					background: #FFFFFF;
+					.text{
+						width: 100%;
+						height: 100%;
+						font-size: $font-size-26;
+						line-height: 36rpx;
+						color: #333333;
+					}
+				}
+			}
+			.goods-pros-b{
+				width:100%;
+				height: 80rpx;
+				margin-top: 12rpx;
+				float: left;
+				.count{
+					float: left;
+					font-size: $font-size-26;
+					line-height: 80rpx;
+					color: $text-color;
+					display: flex;
+					justify-content: flex-end;
+					font-weight: bold;
+				}
+				.sum{
+					width: 520rpx;
+					float: right;
+					.sum-none{
+						width: 100%;
+						height: 40rpx;
+						line-height: 40rpx;
+						color: $text-color;
+						float: left;
+						text-align: right;
+						.money{
+							font-size: $font-size-26;
+							color: #999999;
+							text-decoration: line-through;
+						}
+						.money-sign{
+							font-size: $font-size-26;
+							color: #999999;
+							text-decoration: line-through;
+						}
+						.money-reduced{
+							margin-left: 10rpx;
+							font-size: $font-size-26;
+							color: $color-system;
+							.iconfont{
+								font-size: $font-size-34;
+							}
+						}
+					}
+					.sum-money{
+						width: 100%;
+						height: 40rpx;
+						font-size: $font-size-28;
+						line-height: 40rpx;
+						color: $text-color;
+						display: flex;
+						justify-content: flex-end;
+						&.none{
+							height: 80rpx;
+							line-height: 80rpx;
+						}
+						.money{
+							color: #FF2A2A;
+							font-size: $font-size-28;
+						}
+					}		
+				}
+			}
+		}
+	}
+</style>

+ 181 - 0
components/cm-module/orderDetails/logisticsRecord.vue

@@ -0,0 +1,181 @@
+<template name="logistics">
+	<view class="logistics-template">
+		<!-- 物流信息 -->
+		<view class="logistics-content" v-if="logisticsData.length > 0" v-for="(item,index) in logisticsData" :key="index">
+			<view class="logistics-top">
+				<text class="name">物流信息</text>
+			</view>
+			<view class="logistics-warp">
+				<view  class="logistics-warp__wrapper">
+					<view class="logistics-main">
+					 	<view class="logistics-main-top">
+					 		<view class="main-top" @click="showlogistics(index)">
+								{{item.expressname}}:{{item.expressNumber}}
+								<text class="clipboard" @click="clipboard(item.expressNumber)">复制</text>
+								<text class="arrow-showMore iconfont icon-web_xiangxiazhankai" :style="{'transform':item.isOpen?'rotate(180deg)':'rotate(0)'}"></text>
+							</view>
+					 		<view class="main-bot">
+								发货时间:{{item.expressNewtime}}
+							</view>
+					 	</view>
+						<view v-if="item.expressRecord.length > 0" v-for="(infoItem,infoIndex) in item.expressRecord" :key="infoIndex" :class="{'logistics-warp--hide':!item.isOpen}" class="logistics-main-bot logistics-animation" :style="{'transform':item.isOpen?'translateY(0)':'translateY(-50%)','-webkit-transform':item.isOpen?'translateY(0)':'translateY(-50%)'}" >
+							{{infoItem.time}}  {{infoItem.desc}}
+						</view>
+						<view v-if="item.expressRecord" :class="{'logistics-warp--hide':!item.isOpen}" class="logistics-main-bot logistics-animation" :style="{'transform':item.isOpen?'translateY(0)':'translateY(-50%)','-webkit-transform':item.isOpen?'translateY(0)':'translateY(-50%)'}">
+							暂无物流信息
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		<view class="logistics-content" v-else>
+			暂无物流信息
+		 </view>
+	</view>
+</template>
+
+<script>
+	const thorui = require("@/components/clipboard/clipboard.thorui.js")
+	export default{
+		name:"logistics",
+		data() {
+			return{
+				title:'发票信息',
+				logisticsData:''
+			}
+		},
+		created(){
+			
+		},
+		computed: {
+
+		},
+		methods:{
+			initData(res) {
+				this.logisticsData = res;
+			},
+			showlogistics(index){
+				let isOpen = this.logisticsData[index]['isOpen'];
+				this.logisticsData[index]['isOpen'] = !isOpen;
+			},
+			clipboard(data) {
+				thorui.getClipboardData(data, (res) => {
+					if (res) {
+						this.$util.msg("复制成功",2000,true,'success');
+					} else {
+						this.$util.msg("复制失败",2000,true,'none');
+					}
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.logistics-template{
+		width: 100%;
+		height: 100%;
+		background: #FFFFFF;
+		float: left;
+		.logistics-content{
+			width: 702rpx;
+			padding: 20rpx 24rpx;
+			height: auto;
+			.arrow-showMore {
+				position: absolute;
+				right: 24rpx;
+				z-index: 99;
+			}
+			.logistics-top{
+				width: 100%;
+				height: 40rpx;
+				line-height: 40rpx;
+				font-size: $font-size-28;
+				color: $text-color;
+				text-align: left;
+				padding-bottom: 24rpx;
+				border-bottom: 1px solid #F8F8F8;
+				.name{
+					float: left;
+					font-weight: bold;
+				}
+				.icon-web_xiangxiazhankai{
+					transform: rotate(0deg);
+					transform-origin: center center;
+					float: right;
+					font-size: $font-size-32;
+					color: #000000;
+					/* transition: transform 0.3s ease;*/
+					transition-property: transform;
+					transition-duration: 0.3s;
+					transition-timing-function: ease;
+				}
+				.icon-web_xiangxiazhankai-active{
+					transform: rotate(180deg);
+				}
+			}
+			.logistics-warp{
+				width: 100%;
+				overflow: hidden;
+				.table{
+					height: 76rpx;
+					line-height: 76rpx;
+					font-size: $font-size-26;
+					color: $text-color;
+					text-align: left;
+				}
+			}	
+			.logistics-main-top{
+				width: 100%;
+				height: auto;
+				float: left;
+				padding-top: 24rpx;
+				margin-bottom: 14rpx;
+				.main-top,.main-bot{
+					font-size: $font-size-28;
+					color: $text-color;
+					line-height: 40rpx;
+					margin: 4rpx 0;
+				}
+			}
+			.logistics-main-bot{
+				width: 100%;
+				height: auto;
+				font-size: $font-size-24;
+				color: $text-color;
+				line-height: 56rpx;
+				text-align: justify;
+			}
+			.logistics-animation {
+				/* transition: transform 0.3s ease;*/
+				transition-property: transform;
+				transition-duration: 0.3s;
+				transition-timing-function: ease;
+			}
+			.logistics-warp__wrapper{
+				/* #ifndef APP-NVUE */
+				display: flex;
+				/* #endif */
+				flex-direction: column;
+			}
+			.logistics-warp--hide {
+				// padding: 0 0;
+				// height: 0px;
+				// line-height: 0px;
+				display: none;
+			}	
+			.clipboard{
+				width: 84rpx;
+				height: 36rpx;
+				background: linear-gradient(34deg,rgba(255,41,41,1) 0%,rgba(255,109,27,1) 100%);
+				text-align: center;
+				font-size: $font-size-24;
+				color: #FFFFFF;
+				border-radius: 6rpx;
+				line-height: 36rpx;
+				display: inline-block;
+				margin-left: 42rpx;
+			}
+		}
+	}
+</style>

+ 167 - 0
components/cm-module/orderDetails/orderAddress.vue

@@ -0,0 +1,167 @@
+<template name="address">
+	<view class="address-template">
+		 <!-- 地址信息 -->
+		 <view class="address-section">
+		 	<view class="address-content">
+				<view class="address-cen">
+					<view class="top">
+						<view class="name">{{addressData.shouHuoRen !== undefined ? addressData.shouHuoRen : ''}}</view>
+						<view class="mobile">{{addressData.mobile !== undefined ? addressData.mobile : ''}}</view>
+					</view>
+					<view class="address">
+						<view class="address-icon">
+							<text class="iconfont icon-shouhuodizhi"></text>
+						</view>
+						<view class="address-text">
+							{{addressData.province !== undefined ? addressData.province : ''}}
+							{{addressData.city !== undefined ? addressData.city : ''}}
+							{{addressData.town !== undefined ? addressData.town : ''}}
+							{{addressData.address !== undefined ? addressData.address : ''}}
+						</view>
+					</view>
+				</view>
+		 	</view>
+		 </view>
+		 <image  src="../../../static/ws/address_cat.png" mode=""></image>
+	</view>
+</template>
+
+<script>
+	export default{
+		name:"address",
+		props:{
+			addressData:{
+				type:Object
+			}
+		},
+		data() {
+			return{
+				initData:''
+			}
+		},
+		created(){
+			this.initData = this.addressData;
+		},
+		computed: {
+
+		},
+		methods:{
+			
+		}
+	}
+</script>
+
+<style lang="scss">
+	.address-template{
+		width: 100%;
+		height: auto;
+		background: #FFFFFF;
+		// border-top: 1px solid #F8F8F8;
+		image{
+			float: left;
+			width: 100%;
+			height: 6rpx;
+		}
+	}
+	.address-section {
+		width: 100%;
+		height: auto;
+		float: left;
+		position: relative;
+		
+		.address-empty{
+			width: 100%;
+			height: 84rpx;
+			line-height: 84rpx;
+			color: $color-system;
+			text-align: center;
+			font-size: $font-size-26;
+			font-weight: bold;
+			background: #fff;
+			float: left;
+			.icon-tianjiadizhi{
+				font-size: 30rpx;
+				margin: 0 8rpx;
+			}
+		}
+		.address-content {
+			display: flex;
+			align-items: center;
+			padding:20rpx 24rpx;
+			background: #fff;
+		}
+		
+		.icon-shouhuodizhi {
+			flex-shrink: 0;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			width: 40rpx;
+			color: $color-system;
+			font-size: 40rpx;
+			margin-right: 10rpx;
+		}	
+		.address-cen {
+			width: 100%;
+			height: auto;
+			position: relative;
+			.top{
+				padding-left: 50rpx;
+				height: 42rpx;
+				line-height: 42rpx;
+				text-align: left;
+				font-size: $font-size-30;
+				color: $text-color;
+				padding-bottom: 8rpx;
+				display: flex;
+				float: left;
+				.name{
+					margin-right: 48rpx;
+				}
+				.mobile{
+					margin-right: 40rpx;
+				}
+			}
+			.address {
+				width: 100%;
+				height: auto;
+				float: left;
+				.address-icon{
+					width: 40rpx;
+					height: auto;
+					float: left;
+					line-height: 40rpx;
+				}
+				.address-text{
+					width: 650rpx;
+					padding-left: 10rpx;
+					float: left;
+					line-height: 40rpx;
+					font-size: $font-size-28;
+					color: #666666;
+					text-align: left;
+					-o-text-overflow: ellipsis;
+					text-overflow: ellipsis;
+					display: -webkit-box;
+					word-break: break-all;
+					-webkit-box-orient: vertical;
+					-webkit-line-clamp: 2;
+					overflow: hidden;
+				}
+			}
+		}
+		.icon-chakangengduo {
+			font-size: 32rpx;
+			color: $text-color;
+			margin-right: 30rpx;
+		}
+		.a-bg {
+			position: absolute;
+			left: 0;
+			bottom: 0;
+			display: block;
+			width: 100%;
+			height: 5rpx;
+		}
+	}
+</style>

+ 225 - 0
components/cm-module/orderDetails/orderButton.vue

@@ -0,0 +1,225 @@
+<template name="button">
+	<view class="button-template" :style="{paddingBottom :isIphoneX ? '68rpx' : '0rpx'}">
+		<!-- 底部按钮 -->
+		<view class="button-content">
+			<view class="btn btn-pay" v-if="btnState.isPay" @click.stop="btnConfirm('pay',order)">付款</view>
+			<view class="btn btn-share" @click.stop="onShareCode">
+				<view class="tips" v-if="shareCode">分享码:{{shareCode}}</view>
+				分享订单
+			</view>
+			<view class="btn btn-cancel" v-if="btnState.isCancel" @click.stop="btnConfirm('cancel',order)">取消订单</view>
+			<view class="btn btn-delete" v-if="btnState.isDelete" @click.stop="btnConfirm('delete',order)">删除订单</view>
+			<view class="btn btn-query" v-if="btnState.isQuery && order.secondHandOrderFlag!=1" @click.stop="btnConfirm('query',order)">查看物流</view>
+			<view class="btn " v-if="btnState.isConfirm" @click.stop="btnConfirm('confirm',order)">确认收货</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		name:"button",
+		props:{
+			status:{
+				type:Number
+			},
+			order: {
+				type:Object
+			},
+			shareCode:{
+				type:String
+			},
+		},
+		watch:{
+			status:{
+				handler:function(val){
+					this.initData(val)
+				},
+				deep:true//对象内部的属性监听,也叫深度监听
+			}
+		},
+		data() {
+			return{
+				btnState:this.initStatus(),
+				isIphoneX:this.$store.state.isIphoneX,
+				mapStateArr:[
+					{label:'isQuery',val:[4,5,12,13,33,22,23,32,77],status: true},
+					{label:'isDelete',val:[6],status: true},
+					{label:'isCancel',val:[0,111],status: true},
+					{label:'isConfirm',val:[33],status: true},
+					{label:'isPay',val:[11,12,13,21,22,23,111],status: true},
+				]
+			}
+		},
+		created(){
+			this.initData(this.status)
+		},
+		computed: {
+
+		},
+		methods:{
+			initData(resVal) {
+				/**
+				 * @分享按钮统一显示
+				 * @按钮根据状态显示
+				 * @(4、5、7、12、22、23、32)显示[查看物流]按钮,其他隐藏
+				 * @(6)显示[删除订单],其他隐藏
+				 * @(0、111)显示[取消订单],其他隐藏
+				 * @(21,31)只显示分享
+				 * @(13,33)显示[确认收货]和[查看物流]
+				 */
+				this.btnState = this.initStatus()
+				this.mapStateArr.forEach(el => {
+					el.val.forEach(value => {
+						if(resVal === value){
+							this.btnState[el.label] = el.status
+						}
+					})
+				})
+			},
+			initStatus(){
+				let btnState= {
+						isQuery: false,
+						isDelete: false,
+						isCancel: false,
+						isConfirm: false,
+					}
+				return 	btnState
+			},
+			getShareCode(code){
+				this.shareCode = code
+			},
+			onShareCode(){
+				this.$parent.isShareModal = true
+				this.$emit('shareConfirm')
+			},
+			btnConfirm(type,order){
+				let data = {
+						type:type,
+						orderId:order.orderId,
+						order:order
+					}
+				this.$emit('buttonConfirm',data)
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.button-template{
+		width: 100%;
+		height: auto;
+		position: fixed;
+		bottom: 0;
+		left: 0;
+		background: #FFFFFF;
+		.button-content{
+			padding:0 24rpx;
+			height: auto;
+			float: right;
+			position: relative;
+			.share-code{
+				width: 200rpx;
+				height:  64rpx;
+				line-height: 64rpx;
+				color: #2A45FF;
+				text-align: left;
+				position: absolute;
+				font-size: $font-size-28;
+				font-weight: bold;
+				left: 24rpx;
+				top: 24rpx;
+			}
+			.btn{
+				width: 160rpx;
+				height:  64rpx;
+				margin:22rpx 22rpx 22rpx 0;
+				line-height: 64rpx;
+				font-size:$font-size-26;
+				color: #333333;
+				text-align: center;
+				float: right;
+				border: 2rpx solid #333333;
+				border-radius: 34rpx;
+				&.btn-payment{
+					line-height: 38rpx;
+					font-size: 24rpx;
+					background: #f9a94b;
+					color: #fff;
+					border: 2rpx solid #f9a94b;
+					text{
+						display: block;
+						line-height: 15rpx;
+					}
+				}
+				&.btn-share{
+					position: relative;
+				}
+			}
+			.btn-color{
+				background: $btn-confirm;
+				margin: 22rpx 0 22rpx 22rpx;
+				.tips{
+					width: 160rpx;
+					height: 34rpx;
+					padding: 10rpx 10rpx;
+					background:linear-gradient(45deg,rgba(0,0,0,1) 0%,rgba(87,87,87,1) 100%);
+					box-shadow:0px 2px 4px 0px rgba(0,0,0,0.2);
+					border-radius: 8rpx;
+					position: absolute;
+					color: #FFFFFF;
+					line-height: 34rpx;
+					font-size: $font-size-24;
+					text-align: left;
+					right: 24rpx;
+					top: -45rpx;
+					&:before{
+						content: "";
+						width: 25rpx;
+						height: 25rpx;
+						background:linear-gradient(45deg,rgba(0,0,0,1) 0%,rgba(87,87,87,1) 100%);
+						position: absolute;
+						bottom: -8rpx;
+						right: 30rpx;
+						z-index: -1;
+						transform:rotate(45deg);
+					}
+				}
+			}
+			.btn-confirm{
+				background:#ff7a51;
+				border-color:#ff7a51;
+				color: #FFFFFF;
+			}
+			.btn-pay{
+				margin-right: 0;
+			}
+			.btn-share{
+				.tips{
+					width: 160rpx;
+					height: 34rpx;
+					padding: 10rpx 10rpx;
+					background:#E15616;
+					border-radius: 8rpx;
+					position: absolute;
+					color: #FFFFFF;
+					line-height: 34rpx;
+					font-size: $font-size-24;
+					text-align: left;
+					right: 0;
+					top: -65rpx;
+					&:before{
+						content: "";
+						width: 25rpx;
+						height: 25rpx;
+						background:#E15616;
+						position: absolute;
+						bottom: -8rpx;
+						left: 30rpx;
+						z-index: -1;
+						transform:rotate(45deg);
+					}
+				}
+			}
+		}
+	}
+</style>

+ 260 - 0
components/cm-module/orderDetails/orderInformation.vue

@@ -0,0 +1,260 @@
+<template name="information">
+	<view class="information-template">
+		 <!-- 订单信息 -->
+		 <view class="information-content">
+			<view class="information-view title">
+				<view class="view-num">
+					<view class="bage-text">
+						订单编号:<label class="label">{{orderData.orderNo =='undefined' ? '' : orderData.orderNo}}</label>
+						<text class="clipboard" @click="clipboard(orderData.orderNo)">复制</text>
+					</view>
+				</view>
+			</view>
+			<view class="information-view title">
+				<view class="view-num time">下单时间:<label class="label">{{ orderData.orderTime =='undefined' ? '' : orderData.orderTime }}</label></view>
+			</view>
+			<view class="information-view">
+				<view class="view-num bold">
+					订单标识:<label class="label">{{ orderData.orderMark =='undefined' ? '' : orderData.orderMark }}</label>
+				</view>
+			</view>
+			<view class="information-view bame">
+				<view class="view-num">订单总额:<label class="label">¥{{ orderData.payTotalFee =='undefined' ? '' : orderData.payTotalFee | NumFormat }}</label></view>
+			</view>
+			<template v-if="openShowflag">
+				<view class="information-view">
+					<view class="view-num">待付金额:<text class="red">¥{{ orderData.pendingPayments =='undefined' ? '0.00' : orderData.pendingPayments | NumFormat }}</text></view>
+					<view class="view-man"></view>
+				</view>
+				<view class="information-view bame">
+					<view class="view-man">应付总额:<label class="red">¥{{ orderData.payableAmount =='undefined' ? '0.00' : orderData.payableAmount | NumFormat }}</label></view>
+				</view>
+				<view class="information-view">
+					<view class="view-num">余额抵扣:<label class="label">¥{{ orderData.balancePayFee =='undefined' ? '' : orderData.balancePayFee | NumFormat}}</label></view>
+				</view>
+				<view class="information-view bame">
+					<view class="view-num" v-if="orderData.freePostFlag == '0'">运费:<label class="label">包邮</label></view>
+					<view class="view-num" v-if="orderData.freePostFlag == '-1'">运费:<label class="label">到付</label></view>
+					<view class="view-num" v-if="orderData.freePostFlag == '1'">运费:<label class="label">¥{{ orderData.freight | NumFormat}}</label></view>
+				</view>
+				<view class="information-view" v-show="orderData.promotionFullReduction>0">
+					<view class="view-man" >促销满减:<label class="label">¥{{ orderData.promotionFullReduction | NumFormat}}</label></view>
+				</view>
+				<view class="information-view bame">
+					<view class="view-man">赠品总数:<label class="label">{{ orderData.presentCount + orderData.promotionalGiftsCount}}</label></view>
+				</view>
+				<view class="information-view">
+					<view class="view-num">经理折扣:<label class="label">¥{{ orderData.discountFee =='undefined' ? '' : orderData.discountFee | NumFormat}}</label></view>
+				</view>
+				<view class="information-view bame">
+					<view class="view-num">已支付:<label class="red">¥{{ orderData.receiptAmount == null ? '0.00' : orderData.receiptAmount | NumFormat }}</label></view>
+					<view class="view-man"></text></view>
+				</view>
+			</template>
+		 </view>
+		 <view class="openinfo" v-if="infoflag">
+		 	<view class="btnInfo" @click="openShow">查看更多<label class="iconfont icon-xiangxiajiantou"></label></view>
+		 </view>
+	</view>
+</template>
+
+<script>
+	const thorui = require("@/components/clipboard/clipboard.thorui.js")
+	export default{
+		name:"information",
+		props:{
+			information:{
+				type:Object
+			}
+		},
+		data() {
+			return{
+				orderData:'',
+				freePostFlag:'',
+				openShowflag:false,
+				infoflag:true
+			}
+		},
+		created(){
+			this.initData(this.information)
+		},
+		filters:{
+			NumFormat(value) {//处理金额
+				return Number(value).toFixed(2);
+			},
+			TextFormat(status) {//处理金额
+				let HtmlText,
+					typeTextObject={
+						0:'待确认',
+						4:'交易完成',
+						5:'订单完成',
+						6:'已关闭',
+						7:'交易全退',
+						77:'交易全退',
+						11:'待付款待发货',
+						12:'待付款部分发货',
+						13:'待付款已发货',
+						21:'部分付款待发货',
+						22:'部分付款部分发货',
+						23:'部分付款已发货',
+						31:'已付款待发货',
+						32:'已付款部分发货',
+						33:'已付款已发货',
+						111:'待付款待发货',
+					};
+				
+				Object.keys(typeTextObject).forEach(key => {
+					if(key == status){
+						HtmlText = typeTextObject[key]
+					}
+				})
+				return HtmlText
+			},
+		},	
+		computed: {
+
+		},
+		watch:{
+			information:{
+				handler:function(val){
+					this.initData(val)
+				},
+				deep:true//对象内部的属性监听,也叫深度监听
+			}
+		},
+		methods:{
+			openShow(){
+				this.openShowflag = true;
+				this.infoflag = false;
+			},
+			initData(res) {
+				this.orderData = res;
+			},
+			clipboard(data) {
+				thorui.getClipboardData(data, (res) => {
+					if (res) {
+						this.$util.msg("复制成功",2000,true,'success');
+					} else {
+						this.$util.msg("复制失败",2000,true,'none');
+					}
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.information-template{
+		width: 100%;
+		height: auto;
+		background: #FFFFFF;
+		float: left;
+		margin-top: 24rpx;
+		.information-content{
+			width: 702rpx;
+			padding: 15rpx  24rpx 20rpx 24rpx;
+			.information-view{
+				height: 50rpx;
+				line-height: 50rpx;
+				font-size: $font-size-24;
+				margin: 4rpx 0;
+				// display: flex;
+				width: 58%;
+				display: inline-block;
+				
+				&.same{
+					width: 100%;
+					text-align: right;
+				}
+				&.bame{
+					width: 42%;
+					text-align: right;
+				}
+				&.title{
+					width: 100%;
+				}
+				view{
+					// flex: 1;
+					color: $text-color;
+					color: #999999;
+					.label{
+						color: #666666;
+					}
+				}
+				.view-num.title{
+					height: 68rpx;
+					line-height: 68rpx;
+					position: relative;
+					.bage-icon{
+						width: 50rpx;
+						height: 50rpx;
+						display: block;
+						position: absolute;
+						right: 0;
+						top: 9rpx;
+					}
+					.bage-text{
+						display: inline-block;
+						font-size: $font-size-28;
+						line-height: 68rpx;
+						text-align: left;
+						color: $color-system;
+						// margin-left: 10rpx;
+					}
+				}
+				.view-num.ord{
+					color: $color-system;
+					text-align: left;
+					flex:3;
+					font-weight: bold;
+				}
+				.view-num.time{
+					color: #999999;
+					flex: 6;
+				}
+				// .bold{
+				// 	font-weight: bold;
+				// }
+				.red{
+					color: #FF2A2A;
+				}
+				.view-type{
+					float: right;
+					text-align: right;
+					color: #FF2A2A;
+					flex:4;
+				}
+				.clipboard{
+					width: 64rpx;
+					height: 32rpx;
+					background: linear-gradient(270deg, #c4761f 0%, #fccd90 100%);
+					text-align: center;
+					font-size: $font-size-22;
+					color: #FFFFFF;
+					border-radius: 16rpx;
+					line-height: 32rpx;
+					display: inline-block;
+					margin-left: 15rpx;
+				}
+			}
+		}
+	}
+	.openinfo{
+		.btnInfo{
+			width: 140rpx;
+			height: 40rpx;
+			border: 2rpx solid #e1e1e1;
+			border-radius: 6rpx;
+			padding: 5rpx;
+			text-align: center;
+			color: #b2b2b2;
+			margin: 20rpx auto;
+			font-size:  $font-size-24;
+			.iconfont{
+				position: relative;
+				top: 5rpx;
+				right: -3rpx;
+			}
+		}
+	}
+</style>

+ 203 - 0
components/cm-module/orderDetails/orderListButton.vue

@@ -0,0 +1,203 @@
+<template name="button">
+	<view class="button-template">
+		<!-- 底部按钮 -->
+		<view class="button-content">
+			<view class="btn btn-pay" v-if="btnState.isPay" @click.stop="btnConfirm('pay',order)">付款</view>
+			<view class="btn btn-share"  @click.stop="onShareCode(order.orderId)">分享订单</view>
+			<view class="btn btn-cancel" v-if="btnState.isCancel" @click.stop="btnConfirm('cancel',order)">取消订单</view>
+			<view class="btn btn-delete" v-if="btnState.isDelete" @click.stop="btnConfirm('delete',order)">删除订单</view>
+			<view class="btn btn-query" v-if="btnState.isQuery && order.secondHandOrderFlag!=1" @click.stop="btnConfirm('query',order)">查看物流</view>
+			<view class="btn " v-if="btnState.isConfirm" @click.stop="btnConfirm('confirm',order)">确认收货</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		name:"button",
+		props:{
+			status: {
+				type:Number
+			},
+			order: {
+				type:Object
+			},
+		},
+		data() {
+			return{
+				isShare:true,
+				shareCode:'',
+				btnState:this.initStatus(),
+				mapStateArr:[
+					{label:'isQuery',val:[4,5,12,13,33,22,23,32,77],status: true},
+					{label:'isDelete',val:[6],status: true},
+					{label:'isCancel',val:[0,111],status: true},
+					{label:'isConfirm',val:[33],status: true},
+					{label:'isPay',val:[11,12,13,21,22,23,111],status: true},
+				]
+			}
+		},
+		created(){
+			this.initData(this.status)
+		},
+		computed: {
+
+		},
+		watch:{
+			status:{
+				handler:function(val){
+					this.initData(val)
+				},
+				deep:true//对象内部的属性监听,也叫深度监听
+			}
+		},
+		methods:{
+			initData(resVal) {
+				/**
+				 * @分享按钮统一显示
+				 * @按钮根据状态显示
+				 * @(4、5、7、12、22、23、32)显示[查看物流]按钮,其他隐藏
+				 * @(6)显示[删除订单],其他隐藏
+				 * @(0、111)显示[取消订单],其他隐藏
+				 * @(21,31)只显示分享
+				 * @(13,33)显示[确认收货]和[查看物流]
+				 */
+				this.btnState = this.initStatus()
+				this.mapStateArr.forEach(el => {
+					el.val.forEach(value => {
+						if(resVal === value){
+							this.btnState[el.label] = el.status
+						}
+					})
+				})
+			},
+			initStatus(){
+				let btnState= {
+						isQuery: false,
+						isDelete: false,
+						isCancel: false,
+						isConfirm: false,
+						isShare: true,
+					}
+				return 	btnState
+			},
+			getShareCode(code){
+				this.shareCode = code
+			},
+			onShareCode(orderId){
+				this.$parent.isShareModal = true
+				this.$parent.btnoRderID = orderId
+				this.$emit('shareConfirm')
+			},
+			btnConfirm(type,order){
+				let data = {
+						type:type,
+						orderId:order.orderId,
+						order:order
+					}
+				this.$emit('buttonConfirm',data)
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.button-template{
+		width: 100%;
+		height: auto;
+		float: left;
+		background: #FFFFFF;
+		.button-content{
+			height: auto;
+			float: right;
+			position: relative;
+			.share-code{
+				width: 200rpx;
+				height:  64rpx;
+				line-height: 64rpx;
+				color: #2A45FF;
+				text-align: left;
+				position: absolute;
+				font-size: $font-size-28;
+				font-weight: bold;
+				left: 24rpx;
+				top: 24rpx;
+			}
+			.btn{
+				width: 160rpx;
+				height:  64rpx;
+				margin: 22rpx 0 20rpx 20rpx;
+				line-height: 64rpx;
+				font-size:$font-size-26;
+				color: #333333;
+				text-align: center;
+				float: right;
+				border-radius: 34rpx;
+				border: 2rpx solid #333333;
+				&.btn-payment{
+					line-height: 38rpx;
+					font-size: 24rpx;
+					background: #f9a94b;
+					color: #fff;
+					border: 2rpx solid #f9a94b;
+					text{
+						display: block;
+						line-height: 15rpx;
+					}
+				}
+			}
+			.btn-color{
+				background: $btn-confirm;
+				// margin: 22rpx 0 22rpx 22rpx;
+			}
+			.btn-cancel{
+				// background:#FFFFFF;
+				// color: #999999;
+				// float: left;
+				// margin: 22rpx 0;
+				text-align: center;
+			}
+			// .btn-delete{
+			// 	background:linear-gradient(315deg,rgba(255,163,3,1) 0%,rgba(255,53,1,1) 100%);
+			// }
+			// .btn-query{
+			// 	background:linear-gradient(135deg,rgba(255,212,129,1) 0%,rgba(198,129,0,1) 100%);
+			// }
+			.btn-confirm{
+				background:#ff7a51;
+				border-color:#ff7a51;
+				color: #FFFFFF;
+			}
+			.btn-share{
+				// background:linear-gradient(315deg,rgba(0,212,150,1) 0%,rgba(126,243,174,1) 100%);
+				position: relative;
+				.tips{
+					width: 160rpx;
+					height: 34rpx;
+					padding: 10rpx 10rpx;
+					background:linear-gradient(45deg,rgba(0,0,0,1) 0%,rgba(87,87,87,1) 100%);
+					box-shadow:0px 2px 4px 0px rgba(0,0,0,0.2);
+					border-radius: 8rpx;
+					position: absolute;
+					color: #FFFFFF;
+					line-height: 34rpx;
+					font-size: $font-size-24;
+					text-align: left;
+					right: 0;
+					top: -65rpx;
+					&:before{
+						content: "";
+						width: 25rpx;
+						height: 25rpx;
+						background:linear-gradient(45deg,rgba(0,0,0,1) 0%,rgba(87,87,87,1) 100%);
+						position: absolute;
+						bottom: -8rpx;
+						right: 30rpx;
+						z-index: -1;
+						transform:rotate(45deg);
+					}
+				}
+			}
+		}
+	}
+</style>

+ 149 - 0
components/cm-module/orderDetails/paymentRecord.vue

@@ -0,0 +1,149 @@
+<template name="record">
+	<view class="record-template">
+		<!-- 支付记录 -->
+		<view class="record-content">
+			<view class="record-title">
+				<view class="record-title-l">支付记录</view>
+				<view class="record-title-r" v-if="!isEmpty">
+					已支付:<text class="red">¥{{ receiptAmount != null ? receiptAmount.toFixed(2): '0.00'}}</text>
+				</view>
+			</view>
+			<view class="record-empty" v-if="isEmpty">
+			 	<text>暂无支付记录</text>
+			</view>
+			<view class="record-list" v-else>
+				<view class="record-item" v-for="(item,index) in discernReceiptList" :key="index">
+					<view class="item-time mm">¥{{item.associateAmount.toFixed(2)}}</view>
+					<view class="item-time pp">{{payTypeText(item.payType)}}</view>
+					<view class="item-time tt">{{item.receiptDate}}</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		name:"record",
+		props:{
+			discernReceiptList:{
+				type:Array
+			},
+			receiptAmount:{
+				type:Number
+			}
+		},
+		data() {
+			return{
+				isEmpty:false,
+				paymentData:'',
+				typeText:'',
+				isOpen:false,
+			}
+		},
+		created(){
+			this.initData(this.discernReceiptList)
+		},
+		computed: {
+
+		},
+		methods:{
+			initData(res) {
+				if(res!=''){
+					this.isEmpty = false
+					this.paymentData = res;
+				}else{
+					this.isEmpty = true
+				}
+			},
+			payTypeText (state){//处理支付记录文字
+				let stateText = '',
+					stateTextObject={
+						12:'企业网银',
+						13:'微信支付',
+						14:'支付宝',
+						15:'微信支付',
+						16:'余额抵扣',
+					}
+				Object.keys(stateTextObject).forEach(key => {
+					if(key == state){
+						stateText = stateTextObject[key]
+					}
+				})
+				return stateText;
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	.record-template{
+		width: 100%;
+		height: auto;
+		background: #FFFFFF;
+		float: left;
+		margin-top: 24rpx;
+		.record-content{
+			width: 702rpx;
+			padding: 20rpx 24rpx;
+			height: auto;
+			.record-title{
+				width: 100%;
+				font-size: $font-size-28;
+				color: $text-color;
+				text-align: left;
+				line-height: 40rpx;
+				margin-bottom: 12rpx;
+				float: left;
+				.record-title-l{
+					font-weight: bold;
+					float: left;
+				}
+				.record-title-r{
+					float: right;
+					.red{
+						color: #FF2A2A;
+						font-weight: bold;
+					}
+				}
+			}
+			.record-empty{
+				font-size: $font-size-28;
+				color: $text-color;
+				text-align: left;
+				line-height: 40rpx;
+			}
+			.record-list{
+				width: 100%;
+				height: auto;
+				float: left;
+				margin-top: 12rpx;
+				.record-item{
+					height: 40rpx;
+					width: 100%;
+					padding: 12rpx 0;
+					font-size: $font-size-28;
+					line-height: 40rpx;
+					float: left;
+					display: flex;
+					justify-content: center;
+					flex-direction: row;
+					.item-time{
+						&.mm{
+							flex: 3;
+							color: $text-color;
+						}
+						&.pp{
+							flex: 3;
+							color: $text-color;
+						}
+						&.tt{
+							flex: 4;
+							color: #999999;
+						}
+					}
+				}
+			}
+		}
+	}
+</style>

+ 120 - 0
components/cm-module/orderDetails/refundRecord.vue

@@ -0,0 +1,120 @@
+<template name="refund">
+	<view class="record-template" v-if="isEmpty">
+		<!-- 支付记录 -->
+		<view class="record-content">
+			<view class="record-title">
+				<view class="record-title-l">退款记录</view>
+				<view class="record-title-r">
+					已退款:<text class="red">¥{{ returnedPurchaseFee != null ? returnedPurchaseFee.toFixed(2) : '0.00'}}</text>
+				</view>
+			</view>
+			<view class="record-list">
+				<view class="record-item" v-for="(item,index) in returnedPurchaseList" :key="index">
+					<view class="item-nums">{{item.returnedWay =='4' ? '无支付无退款' : '¥'+item.refundFee.toFixed(2)}}</view>
+					<view class="item-time">{{item.confirmReturnTime}}</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		name:"refund",
+		props:{
+			returnedPurchaseList:{
+				type:Array
+			},
+			returnedPurchaseFee:{
+				type:Number
+			}
+		},
+		data() {
+			return{
+				isEmpty:false,
+				isOpen:false,
+			}
+		},
+		created(){
+			this.initData(this.returnedPurchaseList)
+		},
+		computed: {
+		
+		},
+		methods:{
+			initData(res) {
+				if(res!=''){
+					this.isEmpty = true
+				}else{
+					this.isEmpty = false
+					this.refundData = res;
+				}
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	.record-template{
+		width: 100%;
+		height: auto;
+		background: #FFFFFF;
+		float: left;
+		margin-top: 24rpx;
+		padding-bottom: 40rpx;
+		.record-content{
+			width: 702rpx;
+			padding: 20rpx 24rpx;
+			height: auto;
+			.record-title{
+				width: 100%;
+				font-size: $font-size-28;
+				color: $text-color;
+				text-align: left;
+				line-height: 40rpx;
+				margin-bottom: 12rpx;
+				float: left;
+				.record-title-l{
+					font-weight: bold;
+					float: left;
+				}
+				.record-title-r{
+					float: right;
+					.red{
+						color: #FF2A2A;
+						font-weight: bold;
+					}
+				}
+			}
+			.record-empty{
+				font-size: $font-size-28;
+				color: $text-color;
+				text-align: left;
+				line-height: 40rpx;
+			}
+			.record-list{
+				width: 100%;
+				height: auto;
+				float: left;
+				margin-top: 12rpx;
+				.record-item{
+					height: 40rpx;
+					width: 100%;
+					padding: 12rpx 0;
+					font-size: $font-size-28;
+					line-height: 40rpx;
+					float: left;
+					.item-time{
+						float: right;
+						color: #999999;
+					}
+					.item-nums{
+						font-weight: bold;
+						float: left;
+						color: $text-color;
+					}
+				}
+			}
+		}
+	}
+</style>

+ 125 - 0
components/cm-module/orderDetails/transfeRecord.vue

@@ -0,0 +1,125 @@
+<template name="transfe">
+	<view class="transfe-template">
+		 <!-- 转账信息 -->
+		 <view class="transfe-content" >
+			<view class="transfe-top" @click="showTransfe">
+				<text class="name">转账信息</text>
+				<text class="iconfont icon-web_xiangxiazhankai" :class="{'icon-web_xiangxiazhankai-active':isOpen}"></text>
+			</view>
+			<view :class="{'transfe-warp--hide':!isOpen}" class="transfe-warp">
+				<view  class="transfe-warp__wrapper transfe-animation" 
+					   :style="{'transform':isOpen?'translateY(0)':'translateY(-50%)','-webkit-transform':isOpen?'translateY(0)':'translateY(-50%)'}">
+					<view class="table">
+						<text>开户行:</text>
+						<text>{{transfeData.bankBranch}}</text>
+					</view>
+					<view class="table">
+						<text>银行账号:</text>
+						<text>{{this.$reg.bankRegex(transfeData.bankNumber)}}</text>
+					</view>
+					<view class="table">
+						<text>户名:</text>
+						<text>{{transfeData.accountName}}</text>
+					</view>
+				</view>
+			</view>
+		 </view>
+	</view>
+</template>
+
+<script>
+	export default{
+		name:"transfe",
+		data() {
+			return{
+				isOpen:false,
+				transfeData:{
+					bankBranch:'中信银行(深圳泰然支行)',
+					bankNumber:'6217 6803 0362 0897',
+					accountName:'周仁声'
+				},
+			}
+		},
+		created(){
+			
+		},
+		computed: {
+
+		},
+		methods:{
+			showTransfe(){
+				this.isOpen = !this.isOpen
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.transfe-template{
+		width: 100%;
+		height: auto;
+		background: #FFFFFF;
+		float: left;
+		margin-top: 24rpx;
+		.transfe-content{
+			width: 702rpx;
+			padding: 20rpx 24rpx;
+			height: auto;
+			.transfe-top{
+				width: 100%;
+				height: 40rpx;
+				line-height: 40rpx;
+				font-size: $font-size-28;
+				color: $text-color;
+				text-align: left;
+				.name{
+					float: left;
+					font-weight: bold;
+				}
+				.icon-web_xiangxiazhankai{
+					transform: rotate(0deg);
+					transform-origin: center center;
+					float: right;
+					font-size: $font-size-32;
+					color: #000000;
+					/* transition: transform 0.3s ease;*/
+					transition-property: transform;
+					transition-duration: 0.3s;
+					transition-timing-function: ease;
+				}
+				.icon-web_xiangxiazhankai-active{
+					transform: rotate(180deg);
+				}
+			}
+			.transfe-warp{
+				width: 100%;
+				padding: 24rpx 0 0 0;
+				overflow: hidden;
+				.table{
+					height: 76rpx;
+					line-height: 76rpx;
+					font-size: $font-size-26;
+					color: $text-color;
+					text-align: left;
+				}
+			}	
+			.transfe-animation {
+				/* transition: transform 0.3s ease;*/
+				transition-property: transform;
+				transition-duration: 0.3s;
+				transition-timing-function: ease;
+			}
+			.transfe-warp__wrapper{
+				/* #ifndef APP-NVUE */
+				display: flex;
+				/* #endif */
+				flex-direction: column;
+			}
+			.transfe-warp--hide {
+				padding: 0 0;
+				height: 0px;
+				line-height: 0px;
+			}		
+		}
+	}
+</style>

+ 263 - 0
components/cm-module/productDetails/cm-activipopu.vue

@@ -0,0 +1,263 @@
+<template name="cm-price">
+	<!--促销活动弹窗提示-->
+	<tui-bottom-popup :radius="true" :show="popupShow" @close="hidePopup()">
+		<view class="tui-popup-box clearfix">
+			<template v-if="product.actStatus == null  &&  product.ladderPriceFlag == 1">
+				<view class="tui-scrollview-box">
+					<view class="ladder-main clearfix">
+						<view class="ladder-item">
+							<view class="ladder-item-td">起订量</view>
+							<view class="ladder-item-td">价格</view>
+						</view>
+						<view class="ladder-item" v-for="(ladd, index) in product.ladderPriceList" :key="index">
+							<view class="ladder-item-td">{{ ladd.buyNum }}</view>
+							<view class="ladder-item-td">{{ ladd.buyPrice | NumFormat }}</view>
+						</view>
+					</view>
+				</view>	
+			</template>	
+			<template v-else>
+				<view class="tui-scrollview-box">
+					<view class="box-text">
+						<text>促销时间:</text>
+						<text class="txt" v-if="product.promotion.status == 1">不限时</text>
+						<text class="txt" v-else>{{ product.promotion.beginTime }} ~ {{ product.promotion.endTime }}</text>
+					</view>
+					<view class="box-title" v-show="product.promotion.mode ==2">
+						<text>购买{{product.promotion.name}}商品,满</text>
+						<text class="txt">¥{{product.promotion == null ? '0.00' : product.promotion.touchPrice | NumFormat}}</text>减
+						<text class="txt">¥{{product.promotion == null ? '0.00' : product.promotion.reducedPrice | NumFormat}}</text>
+					</view>
+					<view class="box-title" v-show="product.promotion.mode==3">
+						<text>购买{{product.promotion.name}}商品,满</text>
+						<text class="txt">¥{{product.promotion.touchPrice}}</text>赠送商品
+					</view>
+					<view class="box-product" v-show="product.promotion.mode==3">
+						<view class="box-product-main"  v-for="(item, index) in product.promotion.productGifts" :key="index">
+							<view class="image"><image :src="item.mainImage" mode="widthFix"></image></view>
+							<view class="info">
+								<view class="name">{{ item.productName }}</view>
+								<view class="num">X{{ item.productCount }}</view>
+							</view>
+						</view>
+					</view>
+				</view>
+			</template>
+			<view class="tui-right-flex tui-popup-btn" :style="{ paddingBottom :isIphoneX ? '68rpx' : '0rpx' }">
+				<view class="tui-flex-1">
+					<view class="tui-button" v-if="product.promotion.type == 2" @click="goGoodActiveFn(product.promotion.id)">更多凑单商品</view>
+					<view class="tui-button" v-else @click="hidePopup()">了解</view>
+				</view>
+			</view>
+		</view>	
+	</tui-bottom-popup>
+</template>
+
+<script>
+	import { mapState,mapMutations } from 'vuex'
+	export default{
+		name:'cm-price',
+		props:{
+			product:{
+				type:Object,
+			},
+			popupShow:{
+				type:Boolean,
+				default:false
+			}
+		},
+		data() {
+			return{
+				isIphoneX:this.$store.state.isIphoneX,
+			}
+		},
+		filters: {
+			NumFormat:function(text) {//处理金额
+				return Number(text).toFixed(2);
+			},
+		},
+		created() {
+			console.log(this.product)
+		},
+		computed: {
+			...mapState(['hasLogin','isWxAuthorize'])
+		},
+		methods:{
+			hidePopup(){
+				this.$parent.popupShow = false
+			},
+			goGoodActiveFn(id){
+				this.$parent.popupShow = false
+				this.$api.navigateTo('/pages/goods/goods-active?id='+id)
+			}
+		},
+		
+	}
+</script>
+
+<style lang="scss">	
+	.tui-flex-1 {
+		flex: 1;
+	}
+	.tui-popup-box {
+		position: relative;
+		box-sizing: border-box;
+		min-height: 220rpx;
+		padding:24rpx 24rpx 0 24rpx;
+	}
+	.tui-scrollview-box{
+		width: 100%;
+		height: auto;
+		float: left;
+		box-sizing: border-box;
+		.ladder-main{
+			width: 100%;
+			min-height: 240rpx;
+			border: 1px solid rgba(225,86,22,0.3);
+			border-radius: 10rpx;
+			.ladder-item{
+				width: 100%;
+				height: 80rpx;
+				float: left;
+				border-bottom: 1px solid rgba(225,86,22,0.3);
+				&:nth-child(1){
+					.ladder-item-td{
+						color: #333333;
+					}
+				}
+				&:last-child{
+					border-bottom: none;
+				}
+				.ladder-item-td{
+					width:50%;
+					text-align: center;
+					line-height: 80rpx;
+					font-size: $font-size-24;
+					color: $color-system;
+					box-sizing: border-box;
+					float: left;
+					&:nth-child(1){
+						border-right: 1px solid rgba(225,86,22,0.3);
+					}
+				}
+			}
+		}
+		.box-title{
+			font-size: $font-size-26;
+			color: $text-color;
+			text-align: left;
+			line-height: 56rpx;
+			.txt{
+				color: $color-system;
+				margin: 0 8rpx;
+			}
+		}
+		.box-text{
+			font-size: $font-size-26;
+			color: $text-color;
+			text-align: left;
+			line-height: 56rpx;
+			.txt{
+				color: #ff2a2a;
+			}
+		}
+		.box-product{
+			width: 100%;
+			height: auto;
+			margin-top: 20rpx;
+			.title{
+				font-size: $font-size-24;
+				color: $text-color;
+				text-align: left;
+				line-height: 54rpx;
+			}
+			.box-product-main{
+				width: 100%;
+				height: 136rpx;
+				float: left;
+				margin: 10rpx 0;
+				.image{
+					width: 134rpx;
+					height: 134rpx;
+					border: 1px solid #EBEBEB;
+					float: left;
+					image{
+						width: 100%;
+						height: 100%;
+						display: block;
+					}
+				}
+				.info{
+					width: 540rpx;
+					height: 134rpx;
+					float: left;
+					margin-left: 16rpx;
+					position: relative;
+					.name{
+						width: 100%;
+						float: left;
+						line-height: 40rpx;
+						font-size: $font-size-28;
+						color: $text-color;
+						-o-text-overflow: ellipsis;
+						text-overflow: ellipsis;
+						display: -webkit-box;
+						word-break: break-all;
+						-webkit-box-orient: vertical;
+						-webkit-line-clamp: 2;
+						overflow: hidden;
+					}
+					.num{
+						width: 100%;
+						height: 44rpx;
+						font-size: $font-size-24;
+						color: $text-color;
+						text-align: left;
+						line-height: 44rpx;
+						position: absolute;
+						bottom: 0;
+						left: 0;
+					}
+				}
+			}
+		}
+	}
+	
+	.tui-popup-btn {
+		width: 100%;
+		height: auto;
+		float: left;
+		margin-top: 24rpx;
+		.tui-button{
+			width: 100%;
+			height: 88rpx;
+			background: $btn-confirm;
+			line-height: 88rpx;
+			text-align: center;
+			color: #FFFFFF;
+			font-size: $font-size-28;
+			border-radius: 44rpx;
+		}
+	}
+</style>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 79 - 0
components/cm-module/productDetails/cm-attributes.vue

@@ -0,0 +1,79 @@
+<template name="cm-attributes">
+	<!-- 商品详情价格判断 -->
+	<view class="cm-attributes">
+		<view class="wrap-label"  v-if="goodsData.isNoneDisabled">
+			<view class="isLower">此商品已{{goodsData.disabledText}},请浏览以下推荐商品~</view>
+		</view>
+		<view class="wrap-info">
+			<view class="info-viewT" :class="goodsData.isNoneDisabled ? 'none' : ''">
+				<view class="info-viewL tui-skeleton-fillet">起订量:<text>{{product.minBuyNumber}}</text></view>
+				<view class="info-viewR tui-skeleton-fillet">品牌:<text>{{product.brandName == null? '其他' : product.brandName}}</text></view>
+			</view>
+			<view class="info-viewT" :class="goodsData.isNoneDisabled ? 'none' : ''">
+				<view class="info-viewL tui-skeleton-fillet">包装规格:<text>{{product.unit}}</text></view>
+				<view class="info-viewR tui-skeleton-fillet">商品编码:<text>{{product.productCode}}</text></view>		
+			</view>
+			<view class="info-viewT" :class="goodsData.isNoneDisabled ? 'none' : ''" v-if="product.productCode!=''&&product.productCode!=null">
+				<view class="info-viewL tui-skeleton-fillet">库存:<text>{{product.stock}}</text></view>
+				<view class="info-viewR tui-skeleton-fillet"></view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		name:'cm-attributes',
+		props:{
+			product:{
+				type:Object,
+				default: {}
+			},
+			goodsData:{
+				type:Object,
+				default: {}
+			},
+		},
+		data() {
+			return{
+				
+			}
+		},
+		created() {
+			
+		},
+		methods:{
+		},
+		
+	}
+</script>
+
+<style lang="scss">	
+	.bmCode{
+	float: left;
+	width: 702rpx;
+	padding: 20rpx 24rpx 0 24rpx;
+	border-bottom: 1px solid #F8F8F8	
+	}
+</style>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 133 - 0
components/cm-module/productDetails/cm-parameter.vue

@@ -0,0 +1,133 @@
+<template name="cm-parameter">
+	<!-- 相关参数 -->
+	<tui-bottom-popup :radius="true" :show="popupShow" @close="hidePopup()">
+		<view class="tui-popup-box clearfix">
+			<view class="title">商品参数</view>
+			<view class="content">
+				<view class="content-tr">
+					<view class="content-td">品牌</view>
+					<view class="content-th">恩盛</view>
+				</view>
+				<view class="content-tr">
+					<view class="content-td">起订量</view>
+					<view class="content-th">1</view>
+				</view>
+				<view class="content-tr">
+					<view class="content-td">库存</view> 
+					<view class="content-th">9999</view>
+				</view>
+				<view class="content-tr">
+					<view class="content-td">包装规格</view>
+					<view class="content-th">台</view>
+				</view>
+				<view class="content-tr" v-for="(item, index) in product.parametersList" :key="index">
+					<view class="content-td">{{item.paramsName}}</view>
+					<view class="content-th">{{item.paramsContent}}</view>
+				</view>
+			</view>
+			<view class="tui-right-flex tui-popup-btn" :style="{ paddingBottom :isIphoneX ? '68rpx' : '0rpx' }">
+				<view class="tui-flex-1">
+					<view class="tui-button" @click="hidePopup()">收起</view>
+				</view>
+			</view>
+		</view>	
+	</tui-bottom-popup>		
+</template>
+
+<script>
+	export default{
+		name:'cm-parameter',
+		props:{
+			product:{
+				type:Object,
+			},
+			popupShow:{
+				type:Boolean,
+				default:false
+			}
+		},
+		data() {
+			return{
+				data:[]
+			}
+		},
+		created() {
+			
+		},
+		methods:{
+			hidePopup(){
+				this.$parent.popupShow = false
+			},
+		},
+		
+	}
+</script>
+
+<style lang="scss">
+	.cm-parameter{
+		width: 702rpx;
+		height: auto;
+		background: #FFF;
+		margin: 0 auto;
+		padding: 24rpx 0;
+		.cm-parameter-main{
+			display: flex;
+			flex: 1;
+			flex-direction: column;
+			background-color: #FFFFFF;
+			border: 1px solid #EFEFEF;
+			border-radius: 4rpx;
+			.item-tabody{
+				width: 100%;
+				height: auto;
+				border-bottom: 1px solid #EFEFEF;
+				font-size: $font-size-24;
+				display: flex;
+				flex-wrap: wrap;
+				.item-td{
+					width: 238rpx;
+					float: left;
+					border-right: 1px solid #EFEFEF;
+					color: #999999;
+					padding:20rpx;
+					display: flex;
+					flex: 3;
+					flex-direction: column;
+				}
+				.item-tr{
+					width: 462rpx;
+					float: left;
+					color: $text-color;
+					padding:20rpx;
+					display: flex;
+					flex: 7;
+					flex-direction: column;
+				}
+				&:last-child{
+					border-bottom: none;
+				}
+			}
+		}
+	}
+</style>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 358 - 0
components/cm-module/productDetails/cm-price.vue

@@ -0,0 +1,358 @@
+<template name="cm-price">
+	<!-- 商品详情价格判断 -->
+	<view class="wrap-main">
+		<!-- 协销  -->
+		<view class="wrap-main-item">
+			<view
+				class="p-price tui-skeleton-fillet"
+				:class="promotionFormat(product.promotion) ? 'none' : ''"
+			>
+				<text class="txt sm">¥</text>
+				<text class="txt big">{{
+					(promotionFormat(product.promotion) ? product.price : product.retailPrice)
+						| NumFormat
+				}}</text>
+			</view>
+			<view v-if="product.actStatus == 1" class="floor-item-act">
+				<view
+					v-if="product.promotion.type == 1 && product.promotion.mode == 1"
+					class="floor-tags"
+					@click.stop="clickPopupShow(1)"
+				>
+					{{ product.promotion.name
+					}}<text v-if="hasLogin"
+						>:¥{{
+							product.promotion == null
+								? '0.00'
+								: product.promotion.touchPrice | NumFormat
+						}}</text
+					>
+				</view>
+				<view v-else class="floor-tags" @click.stop="clickPopupShow()">{{
+					product.promotion.name
+				}}</view>
+			</view>
+			<view
+				v-if="product.actStatus == 0 && product.ladderPriceFlag == 1"
+				class="floor-item-act"
+			>
+				<view class="floor-tags" @click.stop="clickPopupShow()">阶梯价格</view>
+			</view>
+		</view>
+
+		<!--促销活动弹窗提示-->
+		<tui-bottom-popup :radius="true" :show="popupShow" @close="hidePopup()">
+			<view class="tui-popup-box clearfix">
+				<template v-if="product.actStatus == 0 && product.ladderPriceFlag == 1">
+					<view class="tui-scrollview-box">
+						<view class="ladder-main clearfix">
+							<view class="ladder-item">
+								<view class="ladder-item-td">起订量</view>
+								<view class="ladder-item-td">价格</view>
+							</view>
+							<view
+								class="ladder-item"
+								v-for="(ladd, index) in product.ladderPriceList"
+								:key="index"
+							>
+								<view class="ladder-item-td">{{ ladd.buyNumRangeShow }}</view>
+								<view class="ladder-item-td">{{ ladd.buyPrice | NumFormat }}</view>
+							</view>
+						</view>
+					</view>
+				</template>
+				<template v-else>
+					<view class="tui-scrollview-box">
+						<view class="box-text">
+							<text>促销时间:</text>
+							<text class="txt" v-if="product.promotion.status == 1">不限时</text>
+							<text class="txt" v-else
+								>{{ product.promotion.beginTime }}~{{ product.promotion.endTime }}</text
+							>
+						</view>
+						<view class="box-title" v-show="product.promotion.mode == 2">
+							<text>购买{{ product.promotion.name }}商品,满</text>
+							<text class="txt"
+								>¥{{
+									product.promotion == null
+										? '0.00'
+										: product.promotion.touchPrice | NumFormat
+								}}</text
+							>减
+							<text class="txt"
+								>¥{{
+									product.promotion == null
+										? '0.00'
+										: product.promotion.reducedPrice | NumFormat
+								}}</text
+							>
+						</view>
+						<view class="box-title" v-show="product.promotion.mode == 3">
+							<text>购买{{ product.promotion.name }}商品,满</text>
+							<text class="txt"
+								>¥{{
+									product.promotion == null
+										? '0.00'
+										: product.promotion.touchPrice | NumFormat
+								}}</text
+							>赠送商品
+						</view>
+						<view class="box-product" v-show="product.promotion.mode == 3">
+							<view
+								class="box-product-main"
+								v-for="(item, index) in product.promotion.productGifts"
+								:key="index"
+							>
+								<view class="image"
+									><image :src="item.mainImage" mode="widthFix"></image
+								></view>
+								<view class="info">
+									<view class="name">{{ item.productName }}</view>
+									<view class="num">X{{ item.productCount }}</view>
+								</view>
+							</view>
+						</view>
+					</view>
+				</template>
+				<view
+					class="tui-right-flex tui-popup-btn"
+					:style="{ paddingBottom: isIphoneX ? '68rpx' : '0rpx' }"
+				>
+					<view class="tui-flex-1">
+						<view
+							class="tui-button"
+							v-if="product.promotion.type == 2"
+							@click="goGoodActiveFn(product.promotion.id)"
+							>更多凑单商品</view
+						>
+						<view class="tui-button" v-else @click="hidePopup()">了解</view>
+					</view>
+				</view>
+			</view>
+		</tui-bottom-popup>
+		<!-- </template> -->
+	</view>
+</template>
+
+<script>
+import { mapState, mapMutations } from 'vuex'
+import uniGrader from '@/components/uni-grade/uni-grade.vue'
+export default {
+	name: 'cm-price',
+	components: {
+		uniGrader
+	},
+	props: {
+		product: {
+			type: Object
+		},
+		userIdentity: {
+			type: Number,
+			default: 2
+		},
+		shopID: {
+			type: Number,
+			default: 2
+		},
+		ladderPriceList: {
+			type: Array
+		},
+		promotion: {
+			type: Object
+		}
+	},
+	data() {
+		return {
+			popupShow: false,
+			promotionType: 0,
+			isIphoneX: this.$store.state.isIphoneX
+		}
+	},
+	filters: {
+		NumFormat: function(text) {
+			//处理金额
+			return Number(text).toFixed(2)
+		}
+	},
+	created() {},
+	computed: {
+		...mapState(['hasLogin', 'isWxAuthorize'])
+	},
+	methods: {
+		clickPopupShow(type) {
+			this.popupShow = true
+			this.promotionType = type
+		},
+		hidePopup() {
+			this.popupShow = false
+		},
+		promotionFormat(promo) {
+			//促销活动类型数据处理
+			if (promo != null) {
+				if (promo.type == 1 && promo.mode == 1) {
+					return true
+				} else {
+					return false
+				}
+			}
+			return false
+		},
+		goUpgradeApply() {
+			this.$api.navigateTo('/pages/login/apply')
+		},
+		loginClick() {
+			this.$api.navigateTo('/pages/login/login')
+		},
+		goGoodActiveFn(id) {
+			this.$parent.popupShow = false
+			this.$api.navigateTo('/pages/goods/goods-active?id=' + id)
+		}
+	}
+}
+</script>
+
+<style lang="scss">
+.tui-flex-1 {
+	flex: 1;
+}
+.tui-popup-box {
+	position: relative;
+	box-sizing: border-box;
+	min-height: 220rpx;
+	padding: 24rpx 24rpx 0 24rpx;
+}
+.tui-scrollview-box {
+	width: 100%;
+	height: auto;
+	float: left;
+	box-sizing: border-box;
+	.ladder-main {
+		width: 100%;
+		min-height: 240rpx;
+		border: 1px solid rgba(225, 86, 22, 0.3);
+		border-radius: 10rpx;
+		.ladder-item {
+			width: 100%;
+			height: 80rpx;
+			float: left;
+			border-bottom: 1px solid rgba(225, 86, 22, 0.3);
+			&:nth-child(1) {
+				.ladder-item-td {
+					color: #333333;
+				}
+			}
+			&:last-child {
+				border-bottom: none;
+			}
+			.ladder-item-td {
+				width: 50%;
+				text-align: center;
+				line-height: 80rpx;
+				font-size: $font-size-24;
+				color: $color-system;
+				box-sizing: border-box;
+				float: left;
+				&:nth-child(1) {
+					border-right: 1px solid rgba(225, 86, 22, 0.3);
+				}
+			}
+		}
+	}
+	.box-title {
+		font-size: $font-size-26;
+		color: $text-color;
+		text-align: left;
+		line-height: 56rpx;
+		.txt {
+			color: $color-system;
+			margin: 0 8rpx;
+		}
+	}
+	.box-text{
+		font-size: $font-size-26;
+		color: $text-color;
+		text-align: left;
+		line-height: 56rpx;
+		.txt{
+			color: #ff2a2a;
+		}
+	}
+	.box-product {
+		width: 100%;
+		height: auto;
+		margin-top: 20rpx;
+		.title {
+			font-size: $font-size-24;
+			color: $text-color;
+			text-align: left;
+			line-height: 54rpx;
+		}
+		.box-product-main {
+			width: 100%;
+			height: 136rpx;
+			float: left;
+			margin: 10rpx 0;
+			.image {
+				width: 134rpx;
+				height: 134rpx;
+				border: 1px solid #ebebeb;
+				float: left;
+				image {
+					width: 100%;
+					height: 100%;
+					display: block;
+				}
+			}
+			.info {
+				width: 540rpx;
+				height: 134rpx;
+				float: left;
+				margin-left: 16rpx;
+				position: relative;
+				.name {
+					width: 100%;
+					float: left;
+					line-height: 40rpx;
+					font-size: $font-size-28;
+					color: $text-color;
+					-o-text-overflow: ellipsis;
+					text-overflow: ellipsis;
+					display: -webkit-box;
+					word-break: break-all;
+					-webkit-box-orient: vertical;
+					-webkit-line-clamp: 2;
+					overflow: hidden;
+				}
+				.num {
+					width: 100%;
+					height: 44rpx;
+					font-size: $font-size-24;
+					color: $text-color;
+					text-align: left;
+					line-height: 44rpx;
+					position: absolute;
+					bottom: 0;
+					left: 0;
+				}
+			}
+		}
+	}
+}
+
+.tui-popup-btn {
+	width: 100%;
+	height: auto;
+	float: left;
+	margin-top: 24rpx;
+	.tui-button {
+		width: 100%;
+		height: 88rpx;
+		background: $btn-confirm;
+		line-height: 88rpx;
+		text-align: center;
+		color: #ffffff;
+		font-size: $font-size-28;
+		border-radius: 44rpx;
+	}
+}
+</style>

+ 84 - 0
components/cm-module/productDetails/cm-service.vue

@@ -0,0 +1,84 @@
+<template name="cm-service">
+	<!-- 服务项目 -->
+	<view class="cm-service">
+		<view class="cm-service-text" v-show="product.orderInfo">
+			<view class="cm-service-title">订购方案</view>
+			<view class="cm-service-p" v-html="product.orderInfo"></view>
+		</view>
+		<view class="cm-service-text" v-show="product.serviceInfo">
+			<view class="cm-service-title">服务详情</view>
+			<view class="cm-service-p" v-html="product.serviceInfo"></view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		name:'cm-service',
+		props:{
+			product:{
+				type:Object,
+			}
+		},
+		data() {
+			return{
+				
+			}
+		},
+		created() {
+			
+		},
+		methods:{
+		},
+		
+	}
+</script>
+
+<style lang="scss">	
+	.cm-service{
+		width: 702rpx;
+		height: auto;
+		background: #FFF;
+		margin: 0 auto;
+		padding: 24rpx 0;
+		.cm-service-text{
+			width: 100%;
+			height: auto;
+			margin-bottom: 24rpx;
+			.cm-service-title{
+				font-size: $font-size-28;
+				color: #333;
+				text-align: left;
+				line-height: 44rpx;
+				margin-bottom: 8rpx;
+			}
+			.cm-service-p{
+				font-size: $font-size-28;
+				color: #999;
+				text-align: justify;
+				line-height: 44rpx;
+			}
+		}
+	}
+</style>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 233 - 0
components/cm-module/productDetails/evaluate.vue

@@ -0,0 +1,233 @@
+<template name="evaluate">
+	<!-- 供应商信息 -->
+	<view class="evaluate clearfix">
+		<view class="evaluate-header">评价({{evaluateList.length}})</view>
+		<view class="evaluate-empty" v-if="isEmpty">该商品暂无评价</view>
+		<view class="evaluate-list" v-else>
+			<scroll-view scroll-y :style="{'height':scrollHeight+'px'}" @scrolltolower="scrolltolower">
+				<view class="row-list" v-for="(item, index) in evaluateList" :key="index">
+					<view class="list-title">
+						<view class="name">{{item.name}}</view>
+						<view class="stars">
+							<uni-stars :stars="item.score2" :icon-class='iconClass' :icon-color='iconColor' :font-size='36' :width-info="178"></uni-stars>
+						</view>
+					</view>
+					<view class="list-content">
+						{{item.commentContent}}
+					</view>
+					<view class="list-time">
+						<text>{{item.postTime }}</text>
+					</view>
+				</view>
+				<!--加载loadding-->
+				<tui-loadmore :visible="loadding" :index="3" type="black"></tui-loadmore>
+				<tui-nomore :visible="!pullUpOn" bgcolor="#FFFFFF" :text='nomoreText'></tui-nomore>
+				<!--加载loadding-->
+			</scroll-view>	
+		</view>
+	</view>
+</template>
+
+<script>
+	import authorize from '@/common/config/authorize.js'
+	import tuiLoadmore from "@/components/tui-components/loadmore/loadmore"
+	import tuiNomore from "@/components/tui-components/nomore/nomore"
+	import uniStars from '@/components/uni-stars/uni-stars.vue'
+	
+	export default{
+		name:'evaluate',
+		props:{
+			queryProductid: {
+				// Unistars类型
+				type: Number,
+				default: 0
+			}
+		},
+		components:{
+			tuiLoadmore,
+			tuiNomore,
+			uniStars
+		},
+		data() {
+			return{
+				evaluateList:[],
+				iconClass:'icon-aixin',
+				iconColor:'#FF7800',
+				isEmpty:false,
+				pageNum:1,
+				pageSize:10,
+				hasNextPage:false,
+				loadding: false,
+				pullUpOn: true,
+				nomoreText: '上拉显示更多',
+				productID:'',
+				scrollHeight: '',
+			}
+		},
+		created() {
+			this.productID = this.queryProductid
+			this.infoEvaluate()
+			this.setScrollHeight();		
+		},
+		methods:{
+			infoEvaluate(){
+				this.ProductService.GetProductEvaluate({productID:this.productID,pageNum:this.pageNum,pageSize:this.pageSize}).then(response =>{
+					let responseData = response.data
+					if(responseData.results&&responseData.results.length > 0){
+						this.isEmpty = false
+						this.hasNextPage = responseData.hasNextPage
+						this.evaluateList =responseData.results
+						this.pullFlag = false;
+						setTimeout(()=>{this.pullFlag = true;},500)
+						if(this.hasNextPage){
+							this.pullUpOn = false
+							this.nomoreText = '上拉显示更多'
+						}else{
+							this.pullUpOn = true
+							this.loadding = false
+							this.nomoreText = '已至底部'
+						}
+					}else{
+						this.isEmpty = true
+					}
+				}).catch(error =>{
+					this.$util.msg(error.msg,2000)
+				})
+			},
+			getOnReachBottomData(){
+				this.pageNum+=1
+				let params = {productID:this.productID,pageNum:this.pageNum,pageSize:this.pageSize}
+				this.ProductService.GetProductEvaluate(params).then(response =>{
+					let responseData = response.data
+					if(responseData.results&&responseData.results.length > 0){
+						this.hasNextPage = responseData.hasNextPage
+						this.evaluateList = this.evaluateList.concat(responseData.results) 
+						this.pullFlag = false;// 防上拉暴滑
+						setTimeout(()=>{this.pullFlag = true;},500)
+						if(this.hasNextPage){
+							this.pullUpOn = false
+							this.nomoreText = '上拉显示更多'
+						}else{
+							this.pullUpOn = false
+							this.loadding = false
+							this.nomoreText = '已至底部'
+						}
+					}
+				}).catch(error =>{
+					this.$util.msg(error.msg,2000)
+				})
+			},
+			scrolltolower() {
+				if(this.hasNextPage){
+					this.loadding = true
+					this.pullUpOn = true
+					this.getOnReachBottomData(this.currentTab);
+				}	
+			},
+			setScrollHeight() {
+				const {windowHeight, pixelRatio} = wx.getSystemInfoSync();
+				this.windowHeight = windowHeight - 1;
+				this.scrollHeight = windowHeight - 1;
+			}
+		},
+		
+	}
+</script>
+
+<style lang="scss">	
+.evaluate{
+	background: #FFFFFF;
+	width: 100%;
+	.scoll-y {
+		height: 100%;
+	}
+	.evaluate-empty{
+		width: 702rpx;
+		height: 100rpx;
+		line-height: 100rpx;
+		padding: 0 24rpx;
+		font-size: $font-size-28;
+		color: #999999;
+		text-align: center;
+	}
+	.evaluate-header{
+		width: 702rpx;
+		height: 88rpx;
+		line-height: 88rpx;
+		padding: 0 24rpx;
+		font-size: $font-size-32;
+		color: $text-color;
+		border-bottom: 1px solid #F2F2F2;
+		text-align: left;
+	}
+	.evaluate-list{
+		width: 702rpx;
+		height: auto;
+		padding: 24rpx;
+		.row-list{
+			width: 100%;
+			height: auto;
+			float: left;
+			padding: 15rpx 0;
+			border-bottom: 1px solid #F2F2F2;
+			&:last-child{
+				margin-bottom: 30rpx;
+			}
+			.list-title{
+				height: 40rpx;
+				line-height: 40rpx;
+				font-size: $font-size-28;
+				color: $text-color;
+				padding: 20rpx 0;
+				.name{
+					float: left;
+					margin-right: 30rpx;
+				}
+				.stars{
+					width: 178rpx;
+					float: right;
+				}
+			}
+			.list-content{
+				width: 100%;
+				min-height: 80rpx;
+				height: auto;
+				font-size: $font-size-24;
+				line-height: 30rpx;
+				text-align: justify;
+				padding: 10rpx 0;
+				color: #999999;
+			}
+			.list-time{
+				width: 100%;
+				height: 40rpx;
+				font-size: $font-size-24;
+				line-height: 40rpx;
+				text-align: right;
+				color: #999999;
+			}
+		}
+	}
+}
+</style>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 175 - 0
components/cm-module/productDetails/instrument-recommend.vue

@@ -0,0 +1,175 @@
+<template name="recommend">
+	<!-- 项目仪器推荐 -->
+	<view class="recommend clearfix">
+		<view class="recommend-list" v-if="list.length>0">
+			<view class="row-list" v-for="(pros, idx) in list" :key="idx" @click.stop="NavToDetailPage(pros)">
+				<view class="list-image"><image :src="pros.image" mode=""></image></view>
+				<view class="list-name">{{pros.title}}</view>
+			</view>
+		</view>
+		<view class="recommend-empty" v-else>暂无相关推荐商品</view>
+	</view>
+</template>
+
+<script>
+	import authorize from '@/common/config/authorize.js'
+	import tuiLoadmore from "@/components/tui-components/loadmore/loadmore"
+	import tuiNomore from "@/components/tui-components/nomore/nomore"
+	
+	export default{
+		name:'recommend',
+		props:{
+			list: {
+				// Unistars类型
+				type: Array
+			}
+		},
+		components:{
+			tuiLoadmore,
+			tuiNomore,
+		},
+		data() {
+			return{
+				
+			}
+		},
+		created() {
+			
+		},
+		methods:{
+			NavToDetailPage(value) {//跳转
+				/**
+				 * 页面跳转类型
+				 * 1、二级页面,2、搜索项目仪器,3、直播页面,4、自由页面,5、商品详情,6、仪器项目详情,7、供应商主页
+				 * 8、专题活动页,9、二手市场介绍,10、二手商品列表,11、二手商品发布,12、商品搜索,13、信息详情
+				 * 14、品牌招商介绍页,15、维修保养介绍页,16、首页,17、注册页,18、信息中心,19、供应商列表
+				 **/
+				 if(value.linkType){
+					 const typeMap = {
+					 	1:`/pages/goods/goods-instrument?linkId=${value.linkParam.id}&title=${value.title}`,
+						2:`/pages/goods/instrument-details?id=${value.linkParam.id}`,
+					 	5:`/pages/goods/product?id=${value.linkParam.id}`,
+					 	7:`/supplier/pages/user/my-shop?shopId=${value.linkParam.id}`,
+					 	8:`/h5/pages/activity/activity-list`,
+					 	9:`/second/pages/form/introduce`,
+					 	10:`/second/pages/product/product-list`,
+					 	11:`/second/pages/form/form`,
+					 	12:`/search/pages/search/search?keyWord=${value.title}`,
+					 	13:`/h5/pages/article/path?link=${value.link}`,
+					 	14:`/h5/pages/article/path?link=${value.link}`,
+					 	15:`/h5/pages/article/path?link=${value.link}`,
+					 	17:`/pages/login/register-select`,
+					 	18:`/h5/pages/article/path?link=${value.link}`,
+					 	19:`/search/pages/search/search-supplier?keyWord=${value.title}`
+					 }
+					 const url = typeMap[value.linkType];
+					 this.$api.navigateTo(url)
+				 }
+			}
+		}
+	}
+</script>
+
+<style lang="scss">	
+.recommend{
+	background: #F7F7F7;
+	width: 100%;
+	.recommend-empty{
+		width: 702rpx;
+		height: 100rpx;
+		line-height: 100rpx;
+		padding: 0 24rpx;
+		font-size: $font-size-28;
+		color: #999999;
+		text-align: center;
+	}
+	.recommend-list{
+		width: 100%;
+		height: auto;
+		position: relative;
+		box-sizing: border-box;
+		padding: 0rpx 24rpx;
+		.row-list{
+			width: 340rpx;
+			height: auto;
+			float: left;
+			margin-right: 20rpx;
+			margin-bottom: 20rpx;
+			border-radius: 20rpx;
+			background: #FFFFFF;
+			&:nth-child(2n){
+				margin-right: 0;
+			}
+			.list-image{
+				width: 100%;
+				height: 340rpx;
+				border-radius: 20rpx 20rpx 0 0;
+				image{
+					width: 100%;
+					height: 340rpx;
+					border-radius: 20rpx 20rpx 0 0;
+				}
+			}	
+			.list-name{
+				font-size: $font-size-28;
+				color: $text-color;
+				line-height:88rpx;
+				padding: 0 10rpx;
+				overflow: hidden;
+				white-space: nowrap;
+				text-overflow: ellipsis;
+			}
+		}
+	}
+	.swiper__recommenddots-box{
+		position: absolute;
+		bottom: -20rpx;
+		left: 0;
+		right: 0;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex: 1;
+		flex-direction: row;
+		justify-content: center;
+		align-items: center;
+		height: 60rpx;
+		background: #FFFFFF;
+		.swiper__dots-item{
+			width: 8rpx;
+			height: 8rpx;
+			border-radius: 100%;
+			margin-left: 6px;
+			background-color:rgba(0,0,0,.3);
+		}
+		.swiper__dots-long{
+			width: 32rpx;
+			height: 8rpx;
+			border-radius: 4rpx;
+			background-color: #000;
+			transition: all 0.4s;
+		}
+	}
+}
+</style>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 179 - 0
components/cm-module/productDetails/recommend.vue

@@ -0,0 +1,179 @@
+<template name="recommend">
+	<!-- 供应商信息 -->
+	<view class="recommend clearfix">
+		<view class="recommend-empty" v-if="isEmpty">暂无相关推荐商品</view>
+		<view class="recommend-list" v-else>
+			<view class="row-list" v-for="(pros, idx) in recommendList" :key="idx" @click.stop="navToDetailPage(pros.id)">
+				<view class="list-image"><image :src="pros.image" mode=""></image></view>
+				<view class="list-name">{{pros.name}}</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import { mapState,mapMutations} from 'vuex';
+	import authorize from '@/common/config/authorize.js'
+	import tuiLoadmore from "@/components/tui-components/loadmore/loadmore"
+	import tuiNomore from "@/components/tui-components/nomore/nomore"
+	
+	export default{
+		name:'recommend',
+		props:{
+			queryProductid: {
+				type: Number,
+				default: 0
+			},
+			queryType:{
+				type: String,
+				default: '0'
+			}
+		},
+		components:{
+			tuiLoadmore,
+			tuiNomore,
+		},
+		data() {
+			return{
+				current:0,
+				recommendList:[],
+				isEmpty:false,
+				pageSize:4,
+				productID:'',
+			}
+		},
+		created() {
+			this.productID = this.queryProductid
+			this.infoRecommend(this.queryProductid,this.queryType)
+		},
+		computed: {
+			...mapState(['identity'])
+		},
+		methods:{
+			infoRecommend(id,type){
+				this.ProductService.queryProductDetilsRelevant({ productId:id,recommendType:type ? type : 0,identity:this.identity }).then(response =>{
+					if( response.data && response.data.length > 0){
+						this.isEmpty = false
+						this.recommendList = response.data
+					}else{
+						this.isEmpty = true
+					}
+				}).catch(error =>{
+					this.$util.msg(error.msg,2000)
+				})
+			},
+			//轮播图切换修改背景色
+			swiperChange(e) {
+				const index = e.detail.current;
+				this.current = index;
+			},
+			navToDetailPage(id) {//跳转商品详情页
+				this.$api.navigateTo(`/pages/goods/product?id=${id}`)
+			}
+		}
+	}
+</script>
+
+<style lang="scss">	
+.recommend{
+	background: #F7F7F7;
+	width: 100%;
+	.recommend-empty{
+		width: 702rpx;
+		height: 100rpx;
+		line-height: 100rpx;
+		padding: 0 24rpx;
+		font-size: $font-size-28;
+		color: #999999;
+		text-align: center;
+	}
+	.recommend-list{
+		width: 100%;
+		height: auto;
+		position: relative;
+		box-sizing: border-box;
+		padding: 0rpx 24rpx;
+		.row-list{
+			width: 340rpx;
+			height: auto;
+			float: left;
+			margin-right: 20rpx;
+			margin-bottom: 20rpx;
+			border-radius: 20rpx;
+			background: #FFFFFF;
+			&:nth-child(2n){
+				margin-right: 0;
+			}
+			.list-image{
+				width: 100%;
+				height: 340rpx;
+				border-radius: 20rpx 20rpx 0 0;
+				image{
+					width: 100%;
+					height: 340rpx;
+					border-radius: 20rpx 20rpx 0 0;
+				}
+			}	
+			.list-name{
+				font-size: $font-size-28;
+				color: $text-color;
+				line-height:88rpx;
+				padding: 0 10rpx;
+				overflow: hidden;
+				white-space: nowrap;
+				text-overflow: ellipsis;
+			}
+		}
+	}
+	.swiper__recommenddots-box{
+		position: absolute;
+		bottom: -20rpx;
+		left: 0;
+		right: 0;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex: 1;
+		flex-direction: row;
+		justify-content: center;
+		align-items: center;
+		height: 60rpx;
+		background: #FFFFFF;
+		.swiper__dots-item{
+			width: 8rpx;
+			height: 8rpx;
+			border-radius: 100%;
+			margin-left: 6px;
+			background-color:rgba(0,0,0,.3);
+		}
+		.swiper__dots-long{
+			width: 32rpx;
+			height: 8rpx;
+			border-radius: 4rpx;
+			background-color: #000;
+			transition: all 0.4s;
+		}
+	}
+}
+</style>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 125 - 0
components/cm-module/scrollTop/scrollTop.vue

@@ -0,0 +1,125 @@
+<template name="scrollTop">
+	<!-- 商品详情价格判断 -->
+	<view>
+		<view class="scrollTop" :style="{bottom:bottom+'rpx'}">
+			<view class="icon msg" v-if="!hideContact">
+				<!-- #ifdef MP-WEIXIN -->
+				<button class="contact-btn" open-type="contact" @bindcontact="handleContact">
+					<text class="iconfont icon-zaixiankefu"></text>
+				</button>	
+				<!-- #endif -->
+			</view>
+			<view class="icon top" @click="onPageScrollTop" :class="isScrollTop ? 'show' : 'none'">
+				<text class="iconfont icon-zhiding"></text>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		name:'scrollTop',
+		props:{
+			bottom:{
+				type:Number,
+				default:100
+			},
+			isScrollTop:{
+				type:Boolean,
+				default:false
+			},
+			hideContact:{
+				type:Boolean,
+				default:false
+			}
+		},
+		data() {
+			return{
+				isPhone:false,
+				telPhone:'0755-22907771',
+				mobilePhone:'15338851365'
+			}
+		},
+		created() {
+			
+		},
+		methods:{
+			onPageScrollTop(){
+				uni.pageScrollTo({
+				    scrollTop: 0,
+				    duration: 600
+				});
+			},
+			handleContact(e){
+				console.log(e.detail.path)
+				console.log(e.detail.query)
+			},
+		},		
+	}
+</script>
+
+<style lang="scss">	
+	.scrollTop{
+		width: 80rpx;
+		height: 200rpx;
+		position: fixed;
+		right: 20rpx;
+		z-index: 999;
+		.icon{
+			width: 80rpx;
+			height: 80rpx;
+			border-radius: 50%;
+			float: left;
+			margin: 10rpx 0;
+			line-height: 80rpx;
+			text-align: center;
+			.contact-btn{
+				width: 80rpx;
+				height: 80rpx;
+				background-color: rgba(0,0,0,0);
+				line-height: 80rpx;
+				.iconfont{
+					font-size: $font-size-44;
+					color: #FFFFFF;
+				}
+			}
+			&.msg{
+				background-image: linear-gradient(0deg, #f28e31 0%, #e15616 100%);
+			}
+			&.top{
+				background-color: rgba(0,0,0,0.4);
+				&.show{
+					opacity: 1;
+				}
+				&.none{
+					opacity: 0;
+				}
+			}
+			.iconfont{
+				font-size: $font-size-26;
+				color: #FFFFFF;
+			}
+		}
+	}
+</style>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 152 - 0
components/cm-module/search/fuzzySearch.vue

@@ -0,0 +1,152 @@
+<template>
+	<view>
+		<view class="search" :style="{ position: fixed ? 'fixed' : 'relative' }">
+			<view class="search-box">
+				<text class="iconfont icon-sousuo"></text>
+				<input
+					type="text"
+					:placeholder="placeholder"
+					v-model="text"
+					@input="onInputHandle"
+					@focus="inputFoucsHandle"
+					@blur="inputBlurHandle"
+				/>
+				<view v-show="showClosable" class="iconfont icon-guanbi" @click="clearInput"></view>
+			</view>
+			<view class="search-btn" @click="searchHandle"> 搜索 </view>
+		</view>
+		<view class="mask" v-show="showMask"></view>
+	</view>
+</template>
+
+<script>
+export default {
+	props: {
+		placeholder: {
+			type: String,
+			default: '请输入搜索内容'
+		},
+		fixed: {
+			type: Boolean,
+			default: false
+		}
+	},
+	data() {
+		return {
+			showMask: false,
+			text:''
+		}
+	},
+	computed:{
+		showClosable(){
+			return this.text.trim().length>0
+		}
+	},
+	methods: {
+		chickHandle(e) {
+			this.$emit('fuzzyClick', e)
+		},
+		// 文本框获取焦点
+		inputFoucsHandle() {
+			this.showMask = true
+		},
+		// 文本框失去焦点
+		inputBlurHandle() {
+			this.showMask = false
+			this.$emit('blur')
+		},
+		// 文本框输入事件
+		onInputHandle() {
+			this.$emit('input', this.text)
+		},
+		// 搜索按钮点击事件
+		searchHandle(){
+			this.$emit('search',this.text)
+		},
+		clearInput(){
+			this.text = ''
+			this.$emit('clear')
+		}
+	}
+}
+</script>
+
+<style lang="scss">
+// 自定义动画
+@keyframes fadeIn {
+	from {
+		opacity: 0;
+	}
+	to {
+		opacity: 1;
+	}
+}
+.mask {
+	width: 100vh;
+	height: 100vh;
+	position: fixed;
+	background-color: rgba(0, 0, 0, 0.4);
+	top: 0;
+	left: 0;
+	z-index: 666;
+	animation: fadeIn ease-in 0.2s;
+}
+.search {
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+	position: relative;
+	top: 0;
+	padding: 20rpx 24rpx;
+	width: 100%;
+	box-sizing: border-box;
+	background-color: #fff;
+	z-index: 999;
+	.search-btn{
+		width: 80rpx;
+		font-size: 28rpx;
+		margin-left: 10rpx;
+		text-align: right;
+	}
+	.search-box {
+		display: flex;
+		flex: 1;
+		justify-content: flex-start;
+		align-items: center;
+		height: 60rpx;
+		padding-left: 10rpx;
+		background-color: #f1f1f1;
+		box-sizing: border-box;
+		border-radius: 30rpx;
+		position: relative;
+		z-index: 999;
+		.iconfont {
+			width: 60rpx;
+			height: 60rpx;
+			margin-right: 8rpx;
+			text-align: center;
+			line-height: 60rpx;
+		}
+		.iconfont-guanbi{
+			position: absolute;
+			top: 0;
+			right: 0;
+			color: #eee;
+		}
+		input {
+			width: 480rpx;
+			font-size: 26rpx;
+		}
+	}
+	.fuzzy {
+		padding: 10rpx 0;
+		padding-left: 76rpx;
+		animation: fadeIn ease-in 0.2s;
+		.fuzzy-item {
+			font-size: 26rpx;
+			color: #444;
+			line-height: 60rpx;
+		}
+	}
+}
+</style>

+ 80 - 0
components/empty.vue

@@ -0,0 +1,80 @@
+<template>
+	<view class="empty-content">
+		<image class="empty-content-image" :src="setSrc" mode="aspectFit"></image>
+		<text class="error-text">{{EmptyText}}</text>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			src: {
+				type: String,
+				default: 'empty'
+			},
+			typeIndex:{
+				type:String,
+				default: 'empty'
+			},
+			navbarHeight:{
+				type:Number
+			}
+		},
+
+		data() {
+			return {
+				typeSrcall: {
+					empty: 'https://static.caimei365.com/app/wisa/img/icon/icon-order-empty.png',				
+				},
+				typeSrc: {
+					empty: 'https://static.caimei365.com/app/wisa/img/icon/icon-order-empty.png',				
+				},
+				EmptyText:'',
+			}
+		},
+		created(){
+			if(this.typeIndex==0){
+				this.EmptyText = '您还没有任何的订单哟~'
+			}else{
+				this.EmptyText = '您还没有相关的订单哟~'
+			}
+		},
+		computed: {
+			setSrc() {
+				let url;
+				if(this.typeIndex==0){					
+					url = this.typeSrcall[this.src]
+				}else{
+					url = this.typeSrc[this.src]
+				}
+				return url;
+			},
+		},
+	}
+</script>
+
+<style lang="scss">
+	.empty-content {
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		flex-direction: column;
+		position: fixed;
+		top: 0;
+		left: 0;
+		bottom: 0;
+		right: 0;
+		margin: auto;
+		background: $bg-color;
+		z-index: 999;
+		&-image {
+			width: 200rpx;
+			height: 200rpx;
+		}
+		.error-text{
+			font-size: $font-size-28;
+			color: $text-color;
+			line-height: 88rpx;
+		}
+	}
+</style>

+ 158 - 0
components/jyf-Parser/CssHandler.js

@@ -0,0 +1,158 @@
+//CssHandler.js
+// #ifdef MP-WEIXIN
+const CanIUse = require('./api.js').versionHigherThan('2.7.1');
+// #endif
+function CssHandler(style, tagStyle) {
+	this._style = new CssTokenizer(style, tagStyle).parse();
+}
+CssHandler.prototype.match = function(name, attrs) {
+	let matched = this._style[name] ? (this._style[name] + ';') : '';
+	if (attrs.id)
+		matched += (this._style['#' + attrs.id] ? (this._style['#' + attrs.id] + ';') : '');
+	if (attrs.class)
+		for (var Class of attrs.class.split(' '))
+			matched += (this._style['.' + Class] ? (this._style['.' + Class] + ';') : '');
+	return matched;
+}
+
+function CssTokenizer(style = '', tagStyle = {}) {
+	this.res = this.initClass(tagStyle);
+	this._state = "SPACE";
+	this._buffer = style;
+	this._sectionStart = 0;
+	this._index = 0;
+	this._name = '';
+	this._content = '';
+	this._list = [];
+	this._comma = false;
+}
+CssTokenizer.prototype.initClass = function(tagStyle) {
+	let initStyle = JSON.parse(JSON.stringify(tagStyle));
+	initStyle.a = "display:inline;color:#366092;word-break:break-all;" + (initStyle.a || "");
+	initStyle.address = "font-style:italic;" + (initStyle.address || "");
+	initStyle.blockquote = initStyle.blockquote ||
+		'background-color:#f6f6f6;border-left:3px solid #dbdbdb;color:#6c6c6c;padding:5px 0 5px 10px;';
+	initStyle.center = 'text-align:center;' + (initStyle.center || "");
+	initStyle.cite = "font-style:italic;" + (initStyle.cite || "");
+	initStyle.code = initStyle.code ||
+		'padding:0 1px 0 1px;margin-left:2px;margin-right:2px;background-color:#f8f8f8;border:1px solid #cccccc;border-radius:3px;';
+	initStyle.dd = "margin-left:40px;" + (initStyle.dd || "");
+	initStyle.img = "max-width:100%;" + (initStyle.img || "");
+	initStyle.mark = "display:inline;background-color:yellow;" + (initStyle.mark || "");
+	initStyle.pre = "overflow:scroll;" + (initStyle.pre || 'background-color:#f6f8fa;padding:5px;border-radius:5px;');
+	initStyle.s = "display:inline;text-decoration:line-through;" + (initStyle.s || "");
+	initStyle.u = "display:inline;text-decoration:underline;" + (initStyle.u || "");
+	// #ifdef MP-WEIXIN
+	//低版本兼容
+	if (!CanIUse) {
+		// #endif
+		initStyle.big = "display:inline;font-size:1.2em;" + (initStyle.big || "");
+		initStyle.small = "display:inline;font-size:0.8em;" + (initStyle.small || "");
+		initStyle.pre = "font-family:monospace;white-space:pre;" + initStyle.pre;
+		// #ifdef MP-WEIXIN
+	}
+	// #endif
+	return initStyle;
+}
+CssTokenizer.prototype.SPACE = function(c) {
+	if (/[a-zA-Z.#]/.test(c)) {
+		this._sectionStart = this._index;
+		this._state = "InName";
+	} else if (c == '@') this._state = "Ignore1";
+	else if (c == '/') this._state = "BeforeComment";
+};
+CssTokenizer.prototype.BeforeComment = function(c) {
+	if (c == '*') this._state = "InComment";
+	else {
+		this._index--;
+		this._state = "SPACE";
+	}
+};
+CssTokenizer.prototype.InComment = function(c) {
+	if (c == '*') this._state = "AfterComment";
+};
+CssTokenizer.prototype.AfterComment = function(c) {
+	if (c == '/') this._state = "SPACE";
+	else {
+		this._index--;
+		this._state = "InComment"
+	}
+};
+CssTokenizer.prototype.InName = function(c) {
+	if (c == '{') {
+		this._list.push(this._buffer.substring(this._sectionStart, this._index))
+		this._sectionStart = this._index + 1;
+		this._state = "InContent";
+	} else if (c == ',') {
+		this._list.push(this._buffer.substring(this._sectionStart, this._index));
+		this._sectionStart = this._index + 1;
+		this._comma = true;
+	} else if ((c == '.' || c == '#') && !this._comma) {
+		this._buffer = this._buffer.splice(this._index, 1, ' ');
+	} else if (/\s/.test(c)) {
+		this._name = this._buffer.substring(this._sectionStart, this._index);
+		this._state = "NameSpace";
+	} else if (/[>:\[]/.test(c)) {
+		if (this._list.length) this._state = "IgnoreName";
+		else this._state = "Ignore1";
+	} else this._comma = false;
+};
+CssTokenizer.prototype.NameSpace = function(c) {
+	if (c == '{') {
+		this._list.push(this._name);
+		this._sectionStart = this._index + 1;
+		this._state = "InContent";
+	} else if (c == ',') {
+		this._comma = true;
+		this._list.push(this._name);
+		this._sectionStart = this._index + 1;
+		this._state = "InName"
+	} else if (/\S/.test(c)) {
+		if (this._comma) {
+			this._sectionStart = this._index;
+			this._index--;
+			this._state = "InName";
+		} else if (this._list.length) this._state = "IgnoreName";
+		else this._state = "Ignore1"
+	}
+};
+CssTokenizer.prototype.InContent = function(c) {
+	if (c == '}') {
+		this._content = this._buffer.substring(this._sectionStart, this._index);
+		for (let item of this._list)
+			this.res[item] = (this.res[item] || '') + ";" + this._content;
+		this._list = [];
+		this._comma = false;
+		this._state = "SPACE";
+	}
+};
+CssTokenizer.prototype.IgnoreName = function(c) {
+	if (c == ',') {
+		this._sectionStart = this._index + 1;
+		this._state = "InName";
+	} else if (c == '{') {
+		this._sectionStart = this._index + 1;
+		this._state = "InContent";
+	}
+}
+CssTokenizer.prototype.Ignore1 = function(c) {
+	if (c == ';') {
+		this._state = "SPACE";
+		this._sectionStart = this._index + 1;
+	} else if (c == '{') this._state = "Ignore2";
+};
+CssTokenizer.prototype.Ignore2 = function(c) {
+	if (c == '}') {
+		this._state = "SPACE";
+		this._sectionStart = this._index + 1;
+	} else if (c == '{') this._state = "Ignore3";
+};
+CssTokenizer.prototype.Ignore3 = function(c) {
+	if (c == '}') this._state = "Ignore2";
+};
+CssTokenizer.prototype.parse = function() {
+	for (; this._index < this._buffer.length; this._index++)
+		this[this._state](this._buffer[this._index]);
+	return this.res;
+};
+module.exports = CssHandler;

+ 411 - 0
components/jyf-Parser/DomHandler.js

@@ -0,0 +1,411 @@
+//DomHandler.js
+var emoji; // 使用emoji补丁包时将此句改为 const emoji = require('./emoji.js');
+const CssHandler = require('./CssHandler.js');
+// #ifdef MP-WEIXIN
+const CanIUse = require('./api.js').versionHigherThan('2.7.1');
+// #endif
+const trustTag = {
+	a: 0,
+	abbr: 1,
+	ad: 0,
+	audio: 0,
+	b: 1,
+	blockquote: 1,
+	br: 0,
+	code: 1,
+	col: 0,
+	colgroup: 0,
+	dd: 1,
+	del: 1,
+	dl: 1,
+	dt: 1,
+	div: 1,
+	em: 1,
+	fieldset: 0,
+	font: 1,
+	h1: 0,
+	h2: 0,
+	h3: 0,
+	h4: 0,
+	h5: 0,
+	h6: 0,
+	hr: 0,
+	i: 1,
+	img: 1,
+	ins: 1,
+	label: 1,
+	legend: 0,
+	li: 0,
+	ol: 0,
+	p: 1,
+	q: 1,
+	source: 0,
+	span: 1,
+	strong: 1,
+	sub: 0,
+	sup: 0,
+	table: 0,
+	tbody: 0,
+	td: 0,
+	tfoot: 0,
+	th: 0,
+	thead: 0,
+	tr: 0,
+	u: 1,
+	ul: 0,
+	video: 1
+};
+const blockTag = {
+	address: true,
+	article: true,
+	aside: true,
+	body: true,
+	center: true,
+	cite: true,
+	footer: true,
+	header: true,
+	html: true,
+	nav: true,
+	pre: true,
+	section: true
+};
+const ignoreTag = {
+	area: true,
+	base: true,
+	basefont: true,
+	canvas: true,
+	circle: true,
+	command: true,
+	ellipse: true,
+	embed: true,
+	frame: true,
+	head: true,
+	iframe: true,
+	input: true,
+	isindex: true,
+	keygen: true,
+	line: true,
+	link: true,
+	map: true,
+	meta: true,
+	param: true,
+	path: true,
+	polygon: true,
+	polyline: true,
+	rect: true,
+	script: true,
+	stop: true,
+	textarea: true,
+	title: true,
+	track: true,
+	use: true,
+	wbr: true
+};
+// #ifdef MP-WEIXIN
+if (CanIUse) {
+	trustTag.bdi = 0;
+	trustTag.bdo = 0;
+	trustTag.caption = 0;
+	trustTag.rt = 0;
+	trustTag.ruby = 0;
+	ignoreTag.rp = true;
+	trustTag.big = 1;
+	trustTag.small = 1;
+	trustTag.pre = 0;
+	delete blockTag.pre;
+} else blockTag.caption = true;
+// #endif
+
+function randomId() {
+	var res = "";
+	for (var i = 0; i < 5; i++) {
+		let rand = parseInt(Math.random() * 52);
+		if (rand < 26)
+			res = res + String.fromCharCode(65 + rand);
+		else
+			res = res + String.fromCharCode(71 + rand);
+	}
+	return res;
+}
+
+function DomHandler(style, options) {
+	this.imgList = [];
+	this.imgIndex = 0;
+	this.nodes = [];
+	this.title = "";
+	this._CssHandler = new CssHandler(style, options.tagStyle);
+	this._tagStack = [];
+	this._videoNum = 0;
+	// #ifdef MP-BAIDU || MP-TOUTIAO || H5
+	this._imgMode = options.imgMode;
+	// #endif
+	this._whiteSpace = false;
+	this._domain = options.domain;
+	this._protocol = /:\/\//.test(options.domain) ? options.domain.split(/:\/\//)[0] : "http";
+	this._useAnchor = options.useAnchor;
+}
+DomHandler.prototype._addDomElement = function(element) {
+	if (element.name == 'pre' || (element.attrs && /white-space\s*:\s*pre/.test(element.attrs.style))) {
+		this._whiteSpace = true;
+		element.pre = true;
+	}
+	let parent = this._tagStack[this._tagStack.length - 1];
+	let siblings = parent ? parent.children : this.nodes;
+	siblings.push(element);
+};
+DomHandler.prototype._bubbling = function() {
+	for (let i = this._tagStack.length - 1; i >= 0; i--) {
+		if (trustTag[this._tagStack[i].name])
+			this._tagStack[i].continue = true;
+		else
+			return this._tagStack[i].name;
+	}
+}
+DomHandler.prototype.onopentag = function(name, attrs) {
+	let element = {
+		children: []
+	};
+	let matched = this._CssHandler.match(name, attrs, element);
+	//处理属性
+	switch (name) {
+		case 'div':
+		case 'p':
+			if (attrs.align) {
+				attrs.style += (';text-align:' + attrs.align);
+				delete attrs.align;
+			}
+			break;
+		case 'img':
+			if (attrs.width) {
+				attrs.style = 'width:' + attrs.width + (/[0-9]/.test(attrs.width[attrs.width.length - 1]) ? 'px' : '') + ';' +
+					attrs.style;
+				delete attrs.width;
+			}
+			if (attrs['data-src']) {
+				attrs.src = attrs.src || attrs['data-src'];
+				delete attrs['data-src'];
+			}
+			// #ifdef MP-BAIDU || MP-TOUTIAO || H5
+			if (this._imgMode == "widthFix") attrs.style += ";height:auto !important;";
+			// #endif
+			if (!attrs.hasOwnProperty('ignore') && attrs.src) {
+				if (this._bubbling() == 'a') {
+					attrs.ignore = "true"; // 图片在链接中不可预览
+					break;
+				}
+				var url = attrs.src;
+				// #ifdef MP-WEIXIN || MP-QQ || MP-BAIDU || MP-TOUTIAO
+				// 去重,至多重试10次
+				for (let i = 0; this.imgList.indexOf(url) != -1 && i < 10; i++) {
+					// 网络链接
+					if (/^http/.test(url)) {
+						url = url.replace(/^(https*):\/\/([\S]+?)\//, function() {
+							var domain = "";
+							for (var c of arguments[2]) {
+								if (/[a-zA-Z]/.test(c))
+									domain += (Math.random() >= 0.5 ? c.toUpperCase() : c);
+								else domain += c;
+							}
+							return (arguments[1] + '://' + domain + '/');
+						})
+					}
+					// base64
+					else if (/base64/.test(url)) {
+						url = url.replace(/^data:(image\/\S+);base64,/, function() {
+							var head = "";
+							for (var c of arguments[1]) {
+								if (/[a-zA-Z]/.test(c))
+									head += (Math.random() >= 0.5 ? c.toUpperCase() : c);
+								else head += c;
+							}
+							return ('data:' + head + ';base64,');
+						})
+					} else break;
+				}
+				// #endif
+				element.current = this.imgList.length;
+				this.imgList.push(url);
+			} else
+				attrs.ignore = "true";
+			if (this._domain && attrs.src[0] == '/') {
+				if (attrs.src[1] == '/') attrs.src = this._protocol + ":" + attrs.src;
+				else attrs.src = this._domain + attrs.src;
+			}
+			break;
+		case 'font':
+			name = 'span';
+			if (attrs.color) {
+				attrs.style += (';color:' + attrs.color);
+				delete attrs.color;
+			}
+			if (attrs.face) {
+				attrs.style += (";font-family:" + attrs.face);
+				delete attrs.face;
+			}
+			if (attrs.size) {
+				var size = parseInt(attrs.size);
+				if (size < 1) size = 1;
+				else if (size > 7) size = 7;
+				let map = [10, 13, 16, 18, 24, 32, 48];
+				attrs.style += (";font-size:" + map[size - 1] + "px");
+				delete attrs.size;
+			}
+			break;
+		case 'a':
+		case 'ad':
+			this._bubbling();
+			break;
+		case 'video':
+		case 'audio':
+			attrs.loop = attrs.hasOwnProperty('loop');
+			attrs.controls = attrs.hasOwnProperty('controls');
+			attrs.autoplay = attrs.hasOwnProperty('autoplay');
+			if (name == 'video') {
+				attrs.muted = attrs.hasOwnProperty('muted');
+				if (attrs.width) {
+					attrs.style = 'width:' + parseFloat(attrs.width) + 'px;' + attrs.style;
+					delete attrs.width;
+				}
+				if (attrs.height) {
+					attrs.style = 'height:' + parseFloat(attrs.height) + 'px;' + attrs.style;
+					delete attrs.height;
+				}
+			}
+			attrs.id = randomId() + (name == 'video' ? ++this._videoNum : '');
+			attrs.source = [];
+			if (attrs.src) attrs.source.push(attrs.src);
+			if (!attrs.controls && !attrs.autoplay)
+				console.warn('存在没有controls属性的' + name + '标签,可能导致无法播放', attrs);
+			this._bubbling();
+			break;
+		case 'source':
+			let parent = this._tagStack[this._tagStack.length - 1];
+			if (parent && (parent.name == 'video' || parent.name == 'audio')) {
+				parent.attrs.source.push(attrs.src);
+				if (!parent.attrs.src) parent.attrs.src = attrs.src;
+			}
+			this._tagStack.push(element);
+			return;
+	}
+	if(this._useAnchor && attrs.id) this._bubbling();
+	attrs.style = matched + attrs.style;
+	if (blockTag[name]) name = 'div';
+	else if (!trustTag.hasOwnProperty(name)) name = 'span';
+	element.name = name;
+	element.attrs = attrs;
+	this._addDomElement(element);
+	this._tagStack.push(element);
+};
+DomHandler.prototype.ontext = function(data) {
+	if (!this._whiteSpace) {
+		if (!/\S/.test(data))
+			return;
+		data = data.replace(/\s+/g, " ");
+	}
+	// #ifndef MP-WEIXIN || MP-QQ || APP-PLUS || H5
+	let entities = {
+		lt: "<",
+		gt: ">",
+		nbsp: "\u00A0",
+		ensp: "\u2002",
+		emsp: "\u2003",
+		amp: "&",
+		apos: "'",
+		quot: '"',
+		ndash: "–",
+		mdash: "—",
+		middot: "·",
+		lsquo: "‘",
+		rsquo: "’",
+		ldquo: "“",
+		rdquo: "”",
+		bull: "•",
+		hellip: "…",
+		permil: "‰",
+		copy: "©",
+		reg: "®",
+		trade: "™",
+		times: "×",
+		divide: "÷",
+		cent: "¢",
+		pound: "£",
+		yen: "¥",
+		euro: "€",
+		sect: "§"
+	};
+	data = data.replace(/&(\S{1,8}?);/g, function() {
+		if (entities[arguments[1]]) return entities[arguments[1]];
+		return "";
+	});
+	// #endif
+	let element = {
+		type: 'text'
+	};
+	// #ifdef MP-WEIXIN || MP-QQ || H5 || APP-PLUS
+	data = data.replace(/&nbsp;/g, '&#xA0;'); // 解决连续&nbsp;失效问题
+	if (/&#*((?!sp|lt|gt).){2,8};/.test(data)) element.decode = true;
+	// #endif
+	if (emoji) data = emoji.parseEmoji(data);
+	element.text = data;
+	this._addDomElement(element);
+};
+DomHandler.prototype.onclosetag = function(name) {
+	let element = this._tagStack.pop();
+	let parent = this._tagStack.length ? this._tagStack[this._tagStack.length - 1].children : this.nodes;
+	if (ignoreTag[name]) {
+		if (name == 'title') {
+			try {
+				this.title = element.children[0].text;
+			} catch (e) {}
+		}
+		parent.pop();
+	}
+	// 设置表格的边框
+	if (name == 'table') {
+		if (element.attrs.border)
+			element.attrs.style += (";border:" + element.attrs.border + "px solid gray;");
+		if (element.attrs.hasOwnProperty("cellspacing"))
+			element.attrs.style += (";border-spacing:" + element.attrs.cellspacing + "px");
+
+		function setBorder(node) {
+			if (node.type == 'text') return;
+			if (node.name == 'th' || node.name == 'td') {
+				if (element.attrs.border)
+					node.attrs.style += ";border:" + element.attrs.border + "px solid gray;";
+				if (element.attrs.hasOwnProperty("cellpadding"))
+					node.attrs.style += ";padding:" + element.attrs.cellpadding + "px";
+			}
+			for (var child of node.children)
+				setBorder(child);
+		}
+		if (element.attrs.border || element.attrs.hasOwnProperty("cellpadding")) {
+			for (var child of element.children)
+				setBorder(child);
+		}
+	}
+	// 合并一些不必要的层,减小节点深度
+	if (element.children.length == 1 && element.name == 'div') {
+		let child = element.children[0];
+		if (child.name == 'div' && !(/padding/.test(element.attrs.style)) && !(/margin/.test(element.attrs.style) &&
+				/margin/.test(child.attrs.style)) && !(/display/.test(element.attrs.style)) && !(/display/.test(child.attrs.style)) &&
+			!(element.attrs.id && child.attrs.id) && !(element.attrs.class && child.attrs.class)) {
+			if (/padding/.test(child.attrs.style))
+				child.attrs.style = ";box-sizing:border-box;" + child.attrs.style;
+			child.attrs.style = element.attrs.style + ";" + child.attrs.style;
+			child.attrs.id = (child.attrs.id || "") + (element.attrs.id || "");
+			child.attrs.class = (child.attrs.class || "") + (element.attrs.class || "");
+			parent[parent.indexOf(element)] = child;
+		}
+	}
+	if (element.pre) {
+		this._whiteSpace = false;
+		for (var ele of this._tagStack)
+			if (ele.pre)
+				this._whiteSpace = true;
+		delete element.pre;
+	}
+	// 多层样式处理 
+	if (this._CssHandler.pop)
+		this._CssHandler.pop(element);
+};
+module.exports = DomHandler;

+ 240 - 0
components/jyf-Parser/Parser.js

@@ -0,0 +1,240 @@
+//Parser.js
+const Tokenizer = require("./Tokenizer.js");
+const DomHandler = require("./DomHandler.js");
+const trustAttrs = {
+	align: true,
+	alt: true,
+	// #ifdef MP-BAIDU
+	appid: true,
+	apid: true,
+	// #endif
+	author: true,
+	autoplay: true,
+	border: true,
+	cellpadding: true,
+	cellspacing: true,
+	class: true,
+	color: true,
+	colspan: true,
+	controls: true,
+	"data-src": true,
+	dir: true,
+	face: true,
+	height: true,
+	href: true,
+	id: true,
+	ignore: true,
+	loop: true,
+	muted: true,
+	name: true,
+	poster: true,
+	rowspan: true,
+	size: true,
+	span: true,
+	src: true,
+	start: true,
+	style: true,
+	type: true,
+	// #ifdef MP-WEIXIN || MP-QQ
+	"unit-id": true,
+	// #endif
+	width: true,
+};
+// #ifdef MP-BAIDU || MP-TOUTIAO || H5
+const textTag = {
+  abbr: true,
+  b: true,
+  big: true,
+  code: true,
+  del: true,
+  em: true,
+  font: true,
+  i: true,
+  ins: true,
+  label: true,
+  mark: true,
+  q: true,
+  s: true,
+  small: true,
+  span: true,
+  strong: true,
+  sub: true,
+  sup: true,
+  u: true
+}
+const _traverse = function(nodes) {
+	for (var element of nodes) {
+		if (element.type == "text")
+			continue;
+		if (!element.continue) {
+			// #ifdef H5
+			if(textTag[element.name]){
+				element.continue = true;
+				_traverse(element.children);
+				continue;
+			}
+			// #endif
+			var res = "";
+			var style = element.attrs.style;
+			var reg = /float\s*:\s*[^;]*/i;
+			if (reg.test(style)) res += reg.exec(style)[0];
+			reg = /margin[^;]*/gi;
+			var margin = reg.exec(style);
+			while (margin) {
+				res += (';' + margin[0]);
+				margin = reg.exec(style);
+			}
+			reg = /display\s*:\s*([^;]*)/i;
+			if (reg.test(style) && reg.exec(style)[1] != "flex") res += (';' + reg.exec(style)[0]);
+			// #ifdef MP-BAIDU || MP-TOUTIAO
+			else if(textTag[element.name]) res+=";display:inline";
+			// #endif
+			else res += (";display:" + (element.name == 'img' ? 'inline-block' : 'block'));
+			reg = /flex\s*:[^;]*/i;
+			if (reg.test(style)) res += (';' + reg.exec(style)[0]);
+			reg = /[^;\s]*width[^;]*/ig;
+			var width = reg.exec(style);
+			while (width) {
+				res += (';' + width[0]);
+				width = reg.exec(style);
+			}
+			element.attrs.containStyle = res;
+			if (/[^-]width[^pev;]+/.test(";" + style))
+				element.attrs.style += ";width:100%";
+			let addMargin = "";
+			if (/margin\s*:/.test(style)) addMargin = ';margin:0';
+			else if (/margin-top/.test(style)) addMargin = ';margin-top:0';
+			else if (/margin-bottom/.test(style)) addMargin = ';margin-bottom:0';
+			element.attrs.style = element.attrs.style.replace(/margin[^;]*/gi, "");
+			element.attrs.style += addMargin;
+		} else _traverse(element.children);
+	}
+};
+// #endif
+const voidTag = {
+	area: true,
+	base: true,
+	basefont: true,
+	br: true,
+	col: true,
+	circle: true,
+	command: true,
+	ellipse: true,
+	embed: true,
+	frame: true,
+	hr: true,
+	img: true,
+	input: true,
+	isindex: true,
+	keygen: true,
+	line: true,
+	link: true,
+	meta: true,
+	param: true,
+	path: true,
+	polygon: true,
+	polyline: true,
+	rect: true,
+	source: true,
+	stop: true,
+	track: true,
+	use: true,
+	wbr: true
+};
+
+function Parser(cbs, callback) {
+	this._cbs = cbs;
+	this._callback = callback;
+	this._tagname = "";
+	this._attribname = "";
+	this._attribvalue = "";
+	this._attribs = null;
+	this._stack = [];
+	this._tokenizer = new Tokenizer(this);
+}
+Parser.prototype.ontext = function(data) {
+	this._cbs.ontext(data);
+};
+Parser.prototype.onopentagname = function(name) {
+	name = name.toLowerCase();
+	this._tagname = name;
+	this._attribs = {
+		style: ''
+	};
+	if (!voidTag[name]) this._stack.push(name);
+};
+Parser.prototype.onopentagend = function() {
+	if (this._attribs) {
+		this._cbs.onopentag(this._tagname, this._attribs);
+		this._attribs = null;
+	}
+	if (voidTag[this._tagname]) this._cbs.onclosetag(this._tagname);
+	this._tagname = "";
+};
+Parser.prototype.onclosetag = function(name) {
+	name = name.toLowerCase();
+	if (this._stack.length && !voidTag[name]) {
+		var pos = this._stack.lastIndexOf(name);
+		if (pos !== -1) {
+			pos = this._stack.length - pos;
+			while (pos--) this._cbs.onclosetag(this._stack.pop());
+		} else if (name === "p") {
+			this.onopentagname(name);
+			this._closeCurrentTag();
+		}
+	} else if (name === "br" || name === "hr" || name === "p") {
+		this.onopentagname(name);
+		this._closeCurrentTag();
+	}
+};
+Parser.prototype._closeCurrentTag = function() {
+	let name = this._tagname;
+	this.onopentagend();
+	if (this._stack[this._stack.length - 1] === name) {
+		this._cbs.onclosetag(name);
+		this._stack.pop();
+	}
+};
+Parser.prototype.onattribend = function() {
+	this._attribvalue = this._attribvalue.replace(/&quot;/g, '"');
+	if (this._attribs && trustAttrs[this._attribname]) {
+		this._attribs[this._attribname] = this._attribvalue;
+	}
+	this._attribname = "";
+	this._attribvalue = "";
+};
+Parser.prototype.onend = function() {
+	for (
+		var i = this._stack.length; i > 0; this._cbs.onclosetag(this._stack[--i])
+	);
+	this._callback({
+		'nodes': this._cbs.nodes,
+		'title': this._cbs.title,
+		'imgList': this._cbs.imgList
+	});
+};
+Parser.prototype.write = function(chunk) {
+	this._tokenizer.parse(chunk);
+};
+
+function html2nodes(data, options) {
+	return new Promise(function(resolve, reject) {
+		try {
+			let style = '';
+			data = data.replace(/<style.*?>([\s\S]*?)<\/style>/gi, function() {
+				style += arguments[1];
+				return '';
+			});
+			let handler = new DomHandler(style, options);
+			new Parser(handler, (res) => {
+				// #ifdef MP-BAIDU || MP-TOUTIAO || H5
+				_traverse(res.nodes);
+				// #endif
+				return resolve(res);
+			}).write(data);
+		} catch (err) {
+			return reject(err);
+		}
+	})
+}
+module.exports = html2nodes;

+ 218 - 0
components/jyf-Parser/Tokenizer.js

@@ -0,0 +1,218 @@
+//Tokenizer.js
+function Tokenizer(cbs) {
+	this._state = "TEXT";
+	this._buffer = "";
+	this._sectionStart = 0;
+	this._index = 0;
+	this._cbs = cbs;
+}
+Tokenizer.prototype.TEXT = function(c) {
+	var index = this._buffer.indexOf("<", this._index);
+	if (index != -1) {
+		this._index = index;
+		this._cbs.ontext(this._getSection());
+		this._state = "BeforeTag";
+		this._sectionStart = this._index;
+	} else this._index = this._buffer.length;
+};
+Tokenizer.prototype.BeforeTag = function(c) {
+	switch (c) {
+		case "/":
+			this._state = "BeforeCloseTag";
+			break;
+		case "!":
+			this._state = "BeforeDeclaration";
+			break;
+		case "?":
+			let index = this._buffer.indexOf(">", this._index);
+			if (index != -1) {
+				this._index = index;
+				this._sectionStart = this._index + 1;
+			} else this._sectionStart = this._index = this._buffer.length;
+			this._state = "TEXT";
+			break;
+		case ">":
+			this._state = "TEXT";
+			break;
+		case "<":
+			this._cbs.ontext(this._getSection());
+			this._sectionStart = this._index;
+			break;
+		default:
+			if (/\s/.test(c)) this._state = "TEXT";
+			else {
+				this._state = "InTag";
+				this._sectionStart = this._index;
+			}
+	}
+};
+Tokenizer.prototype.InTag = function(c) {
+	if (c === "/" || c === ">" || /\s/.test(c)) {
+		this._cbs.onopentagname(this._getSection());
+		this._state = "BeforeAttrsName";
+		this._index--;
+	}
+};
+Tokenizer.prototype.BeforeAttrsName = function(c) {
+	if (c === ">") {
+		this._cbs.onopentagend();
+		this._state = "TEXT";
+		this._sectionStart = this._index + 1;
+	} else if (c === "/") {
+		this._state = "InSelfCloseTag";
+	} else if (!(/\s/.test(c))) {
+		this._state = "InAttrsName";
+		this._sectionStart = this._index;
+	}
+};
+Tokenizer.prototype.InAttrsName = function(c) {
+	if (c === "=" || c === "/" || c === ">" || /\s/.test(c)) {
+		this._cbs._attribname = this._getSection().toLowerCase();
+		this._sectionStart = -1;
+		this._state = "AfterAttrsName";
+		this._index--;
+	}
+};
+Tokenizer.prototype.AfterAttrsName = function(c) {
+	if (c === "=") {
+		this._state = "BeforeAttrsValue";
+	} else if (c === "/" || c === ">") {
+		this._cbs.onattribend();
+		this._state = "BeforeAttrsName";
+		this._index--;
+	} else if (!(/\s/.test(c))) {
+		this._cbs.onattribend();
+		this._state = "InAttrsName";
+		this._sectionStart = this._index;
+	}
+};
+Tokenizer.prototype.BeforeAttrsValue = function(c) {
+	if (c === '"') {
+		this._state = "InAttrsValueDQ";
+		this._sectionStart = this._index + 1;
+	} else if (c === "'") {
+		this._state = "InAttrsValueSQ";
+		this._sectionStart = this._index + 1;
+	} else if (!(/\s/.test(c))) {
+		this._state = "InAttrsValueNQ";
+		this._sectionStart = this._index;
+		this._index--;
+	}
+};
+Tokenizer.prototype.InAttrsValueDQ = function(c) {
+	if (c === '"') {
+		this._cbs._attribvalue += this._getSection();
+		this._cbs.onattribend();
+		this._state = "BeforeAttrsName";
+	}
+};
+Tokenizer.prototype.InAttrsValueSQ = function(c) {
+	if (c === "'") {
+		this._cbs._attribvalue += this._getSection();
+		this._cbs.onattribend();
+		this._state = "BeforeAttrsName";
+	}
+};
+Tokenizer.prototype.InAttrsValueNQ = function(c) {
+	if (/\s/.test(c) || c === ">") {
+		this._cbs._attribvalue += this._getSection();
+		this._cbs.onattribend();
+		this._state = "BeforeAttrsName";
+		this._index--;
+	}
+};
+Tokenizer.prototype.BeforeCloseTag = function(c) {
+	if (/\s/.test(c));
+	else if (c === ">") {
+		this._state = "TEXT";
+	} else {
+		this._state = "InCloseTag";
+		this._sectionStart = this._index;
+	}
+};
+Tokenizer.prototype.InCloseTag = function(c) {
+	if (c === ">" || /\s/.test(c)) {
+		this._cbs.onclosetag(this._getSection());
+		this._state = "AfterCloseTag";
+		this._index--;
+	}
+};
+Tokenizer.prototype.InSelfCloseTag = function(c) {
+	if (c === ">") {
+		this._cbs.onopentagend();
+		this._state = "TEXT";
+		this._sectionStart = this._index + 1;
+	} else if (!(/\s/.test(c))) {
+		this._state = "BeforeAttrsName";
+		this._index--;
+	}
+};
+Tokenizer.prototype.AfterCloseTag = function(c) {
+	if (c === ">") {
+		this._state = "TEXT";
+		this._sectionStart = this._index + 1;
+	}
+};
+Tokenizer.prototype.BeforeDeclaration = function(c) {
+	if (c == '-') this._state = "InComment";
+	else if (c == '[') this._state = "BeforeCDATA1";
+	else this._state = "InDeclaration";
+};
+Tokenizer.prototype.InDeclaration = function(c) {
+	var index = this._buffer.indexOf(">", this._index);
+	if (index != -1) {
+		this._index = index;
+		this._sectionStart = index + 1;
+	} else this._sectionStart = this._index = this._buffer.length;
+	this._state = "TEXT";
+};
+Tokenizer.prototype.InComment = function(c) {
+	let key = (c == '-' ? '-->' : '>');
+	let index = this._buffer.indexOf(key, this._index);
+	if (index != -1) {
+		this._index = index + key.length - 1;
+		this._sectionStart = this._index + 1;
+	} else this._sectionStart = this._index = this._buffer.length;
+	this._state = "TEXT";
+};
+Tokenizer.prototype.BeforeCDATA1 = function(c) {
+	if (c == 'C') this._state = "BeforeCDATA2";
+	else this._state = "InDeclaration";
+};
+Tokenizer.prototype.BeforeCDATA2 = function(c) {
+	if (c == 'D') this._state = "BeforeCDATA3";
+	else this._state = "InDeclaration";
+};
+Tokenizer.prototype.BeforeCDATA3 = function(c) {
+	if (c == 'A') this._state = "BeforeCDATA4";
+	else this._state = "InDeclaration";
+};
+Tokenizer.prototype.BeforeCDATA4 = function(c) {
+	if (c == 'T') this._state = "BeforeCDATA5";
+	else this._state = "InDeclaration";
+};
+Tokenizer.prototype.BeforeCDATA5 = function(c) {
+	if (c == 'A') this._state = "InCDATA";
+	else this._state = "InDeclaration";
+};
+Tokenizer.prototype.InCDATA = function(c) {
+	let key = (c == '[' ? ']]>' : '>');
+	let index = this._buffer.indexOf(key, this._index);
+	if (index != -1) {
+		this._index = index + key.length - 1;
+		this._sectionStart = this._index + 1;
+	} else this._sectionStart = this._index = this._buffer.length;
+	this._state = "TEXT";
+};
+Tokenizer.prototype.parse = function(chunk) {
+	this._buffer += chunk;
+	for (; this._index < this._buffer.length; this._index++)
+		this[this._state](this._buffer[this._index]);
+	if (this._state === "TEXT" && this._sectionStart !== this._index)
+		this._cbs.ontext(this._buffer.substr(this._sectionStart));
+	this._cbs.onend();
+};
+Tokenizer.prototype._getSection = function() {
+	return this._buffer.substring(this._sectionStart, this._index);
+};
+module.exports = Tokenizer;

+ 41 - 0
components/jyf-Parser/api.js

@@ -0,0 +1,41 @@
+String.prototype.splice = function(start = 0, deleteCount = 0, addStr = '') {
+	if (start < 0) start = this.length + start;
+	if (deleteCount < 0) deleteCount = 0;
+	return this.substring(0, start) + addStr + this.substring(start + deleteCount);
+}
+// #ifndef MP-ALIPAY || H5 || APP-PLUS 
+const SDKVersion = uni.getSystemInfoSync().SDKVersion;
+// #endif
+module.exports = {
+	// #ifndef MP-ALIPAY || H5 || APP-PLUS 
+	versionHigherThan(version = '') {
+		var v1 = SDKVersion.split('.');
+		var v2 = version.split('.');
+		const len = Math.max(v1.length, v2.length);
+		while (v1.length < len) {
+			v1.push('0');
+		}
+		while (v2.length < len) {
+			v2.push('0');
+		}
+		for (let i = 0; i < len; i++) {
+			const num1 = parseInt(v1[i]);
+			const num2 = parseInt(v2[i]);
+			if (num1 > num2) {
+				return true;
+			} else if (num1 < num2) {
+				return false;
+			}
+		}
+		return true;
+	},
+	// #endif
+	html2nodes(html, tagStyle) {
+		const Parser = require('./Parser.js');
+		return Parser(html, tagStyle);
+	},
+	css2object(style, tagStyle) {
+		const CssHandler = require('./CssHandler.js');
+		return new CssHandler(style, tagStyle)._style;
+	}
+}

+ 70 - 0
components/jyf-Parser/handler.sjs

@@ -0,0 +1,70 @@
+var textTag = {
+	abbr: true,
+	b: true,
+	big: true,
+	code: true,
+	del: true,
+	em: true,
+	font: true,
+	i: true,
+	ins: true,
+	label: true,
+	mark: true,
+	q: true,
+	s: true,
+	small: true,
+	span: true,
+	strong: true,
+	u: true
+}
+export default {
+	getStyle: function(style, display) {
+		var res = "";
+		var reg = getRegExp("float\s*:\s*[^;]*", "i");
+		if (reg.test(style)) res += reg.exec(style)[0];
+		reg = getRegExp("margin[^;]*", "gi");
+		var margin = reg.exec(style);
+		while (margin) {
+			res += (';' + margin[0]);
+			margin = reg.exec(style);
+		}
+		reg = getRegExp("display\s*:\s*([^;]*)", "i");
+		if (reg.test(style) && reg.exec(style)[1] != "flex") res += (';' + reg.exec(style)[0]);
+		else res += (';display:' + display);
+		reg = getRegExp("flex\s*:[^;]*", "i");
+		if (reg.test(style)) res += (';' + reg.exec(style)[0]);
+		reg = getRegExp("[^;\s]*width[^;]*", "ig");
+		var width = reg.exec(style);
+		while (width) {
+			res += (';' + width[0]);
+			width = reg.exec(style);
+		}
+		return res;
+	},
+	setImgStyle: function(item, imgMode) {
+		if (imgMode == "widthFix")
+			item.attrs.style += ";height:auto !important";
+		if (getRegExp("[^-]width[^pev;]+").test(";" + item.attrs.style))
+			item.attrs.style += ";width:100%";
+		item.attrs.style = item.attrs.style.replace(getRegExp('margin[^;]*', "gi"), "");
+		return [item];
+	},
+	setStyle: function(item) {
+		if (getRegExp("[^-]width[^pev;]+").test(";" + item.attrs.style))
+			item.attrs.style += ";width:100%";
+		if (getRegExp('margin').test(item.attrs.style)) {
+			item.attrs.style = item.attrs.style.replace(getRegExp('margin[^;]*', "gi"), "");
+			item.attrs.style += ';margin:0'
+		}
+		return [item];
+	},
+	isContinue: function(item) {
+		if (textTag[item.name])
+			return false;
+		if (!item["continue"])
+			return true;
+		else if (item.name == 'a')
+			return true;
+		return false;
+	}
+}

+ 72 - 0
components/jyf-Parser/handler.wxs

@@ -0,0 +1,72 @@
+// Parser/trees/cssHandler.wxs
+var textTag = {
+	abbr: true,
+	b: true,
+	big: true,
+	code: true,
+	del: true,
+	em: true,
+	font: true,
+	i: true,
+	ins: true,
+	label: true,
+	mark: true,
+	q: true,
+	s: true,
+	small: true,
+	span: true,
+	strong: true,
+	u: true
+}
+module.exports = {
+	getStyle: function(style, display) {
+		var res = "";
+		var reg = getRegExp("float\s*:\s*[^;]*", "i");
+		if (reg.test(style)) res += reg.exec(style)[0];
+		reg = getRegExp("margin[^;]*", "gi");
+		var margin = reg.exec(style);
+		while (margin) {
+			res += (';' + margin[0]);
+			margin = reg.exec(style);
+		}
+		reg = getRegExp("display\s*:\s*([^;]*)", "i");
+		if (reg.test(style) && reg.exec(style)[1] != "flex") res += (';' + reg.exec(style)[0]);
+		else res += (';display:' + display);
+		reg = getRegExp("flex\s*:[^;]*", "i");
+		if (reg.test(style)) res += (';' + reg.exec(style)[0]);
+		reg = getRegExp("[^;\s]*width[^;]*", "ig");
+		var width = reg.exec(style);
+		while (width) {
+			res += (';' + width[0]);
+			width = reg.exec(style);
+		}
+		return res;
+	},
+	setImgStyle: function(item, imgMode, imgLoad) {
+		if (imgMode == "widthFix")
+			item.attrs.style += ";height:auto !important";
+		if (getRegExp("[^-]width[^pev;]+").test(";" + item.attrs.style))
+			item.attrs.style += ";width:100%";
+		item.attrs.style = item.attrs.style.replace(getRegExp('margin[^;]*', "gi"), "");
+		if (!imgLoad) {
+			delete item.attrs.src;
+			item.attrs.style += ";width:5px !important;height:5px !important"
+		}
+		return [item];
+	},
+	setStyle: function(item) {
+		if (getRegExp("[^-]width[^pev;]+").test(";" + item.attrs.style))
+			item.attrs.style += ";width:100%";
+		item.attrs.style = item.attrs.style.replace(getRegExp('margin[^;]*', "gi"), "");
+		return [item];
+	},
+	isContinue: function(item) {
+		if (textTag[item.name])
+			return false;
+		if (!item["continue"])
+			return true;
+		else if (item.name == 'a')
+			return true;
+		return false;
+	}
+}

+ 405 - 0
components/jyf-Parser/index.vue

@@ -0,0 +1,405 @@
+<template>
+	<view>
+		<!--#ifdef H5-->
+		<slot v-if="!html"></slot>
+		<iframe id="contain" :style="'width:100%;'+(selectable?'user-select:text;-webkit-user-select:text':'')+(showWithAnimation?('opacity:0;'+showAnimation):'')"
+		 frameborder="0"></iframe>
+		<!--#endif-->
+		<!--#ifndef H5-->
+		<slot v-if="!(html.nodes||((html&&(html[0].name||html[0].type))?1:nodes.length))"></slot>
+		<!--#endif-->
+		<!--#ifdef MP-ALIPAY || H5-->
+		<view class="contain" :style="(showWithAnimation?'opacity:0;':'')+(selectable?'user-select:text;-webkit-user-select:text':'')"
+		 :animation="showAnimation">
+			<trees :nodes="html.nodes||((html&&(html[0].name||html[0].type))?html:nodes)" :imgMode="imgMode" />
+		</view>
+		<!--#endif-->
+		<!--#ifndef MP-ALIPAY || H5-->
+		<trees class="contain" :style="'display:block'+(showWithAnimation?'opacity:0;':'')+(selectable?'user-select:text;-webkit-user-select:text':'')"
+		 :animation="showAnimation" :nodes="html.nodes||((html[0].name||html[0].type)?html:nodes)" :imgMode="imgMode"
+		 :lazyLoad="lazyLoad" :loadVideo="loadVideo" />
+		<!--#endif-->
+	</view>
+</template>
+
+<script>
+	import trees from "./trees"
+	const html2nodes = require("./Parser.js");
+	// #ifdef MP-WEIXIN || MP-QQ
+	const CanIUseObserver = require("./api.js").versionHigherThan('1.9.3');
+	// #endif
+	// #ifdef APP-PLUS
+	const CanIUseObserver = true;
+	// #endif
+	var Document; // 使用document补丁包时将此句改为 const Document = require('./document.js');
+	export default {
+		name: 'parser',
+		data() {
+			return {
+				nodes: [],
+				showAnimation: {},
+				// #ifdef APP-PLUS
+				loadVideo: false,
+				// #endif
+			}
+		},
+		components: {
+			trees
+		},
+		props: {
+			'html': {
+				type: null,
+				default: ''
+			},
+			'autocopy': {
+				type: Boolean,
+				default: true
+			},
+			// #ifndef MP-ALIPAY
+			'autopause': {
+				type: Boolean,
+				default: true
+			},
+			// #endif
+			'autopreview': {
+				type: Boolean,
+				default: true
+			},
+			'autosetTitle': {
+				type: Boolean,
+				default: true
+			},
+			'domain': {
+				type: String,
+				default: ''
+			},
+			'imgMode': {
+				type: String,
+				default: 'default'
+			},
+			// #ifdef MP-WEIXIN || MP-QQ || APP-PLUS
+			'lazyLoad': {
+				type: Boolean,
+				default: false
+			},
+			// #endif
+			'selectable': {
+				type: Boolean,
+				default: false
+			},
+			'tagStyle': {
+				type: Object,
+				default: () => {
+					return {};
+				}
+			},
+			'showWithAnimation': {
+				type: Boolean,
+				default: false
+			},
+			'animationDuration': {
+				type: Number,
+				default: 400
+			},
+			'useAnchor': {
+				type: Boolean,
+				default: false
+			}
+		},
+		mounted() {
+			this.execHtml(this.html);
+			// #ifndef MP-ALIPAY || H5
+			this.videoContext = [];
+			// #endif
+			// #ifdef MP-BAIDU || MP-ALIPAY
+			this.anchors = [];
+			// #endif
+		},
+		methods: {
+			execHtml(html) {
+				// #ifdef H5
+				var iframe = document.getElementById("contain");
+				// 支持 iframe.srcdoc
+				if (typeof(iframe.srcdoc) == "string") {
+					var script =
+						'<script>"use strict";function calcPageHeight(t){var e=Math.max(t.body.clientHeight,t.documentElement.clientHeight),n=Math.max(t.body.scrollHeight,t.documentElement.scrollHeight);return Math.max(e,n)}document.addEventListener("DOMContentLoaded",function(){for(var t=document.getElementsByTagName("img"),e=[],n=0;n<t.length;n++){var r=t[n];r.style+=";max-width:100%",e.push(r.src),r.index=n,"A"!=r.parentElement.nodeName&&(r.onclick=function(){parent.document.previewEvent(this,e)}),r.onerror=function(){parent.document.errorEvent(this,"img")};var o=document.getElementsByTagName("a"),a=!0,i=!1,c=void 0;try{for(var u,l=o[Symbol.iterator]();!(a=(u=l.next()).done);a=!0){u.value.onclick=function(t){if("#"==this.getAttribute("href")[0]){var e=document.getElementById(this.getAttribute("href").substring(1));return parent.document.tapEvent(this,e?e.offsetTop:-1)}return parent.document.tapEvent(this)}}}catch(t){i=!0,c=t}finally{try{!a&&l.return&&l.return()}finally{if(i)throw c}}var d=document.getElementsByTagName("video"),m=!0,h=!1,s=void 0;try{for(var v,y=d[Symbol.iterator]();!(m=(v=y.next()).done);m=!0){var f=v.value;f.style+=";max-width:100%",f.onerror=function(){parent.document.errorEvent(this,"video")},f.onplay=function(){parent.document.playEvent(this)}}}catch(t){h=!0,s=t}finally{try{!m&&y.return&&y.return()}finally{if(h)throw s}}parent.document.setVideoContext(d);var g=document.getElementsByTagName("audios"),p=!0,E=!1,x=void 0;try{for(var b,w=g[Symbol.iterator]();!(p=(b=w.next()).done);p=!0){b.value.onerror=function(t){parent.document.errorEvent(this,"audio")}}}catch(t){E=!0,x=t}finally{try{!p&&w.return&&w.return()}finally{if(E)throw x}}}},!1),window.onload=function(){var t=calcPageHeight(document);parent.document.getElementById("contain").style.height=t+"px",parent.document.setTitle(document.title)};<\/script>';
+					if (!html) return;
+					if (typeof html != 'string') {
+						if (typeof html == 'object') {
+							var str = "";
+							for (var node of (html.nodes || html))
+								str += this.Dom2Str(node);
+							html = str;
+						} else {
+							this.$emit('error', {
+								source: "parse",
+								errMsg: "传入的html格式不正确!"
+							});
+							return;
+						}
+					}
+					// 处理 rpx
+					if (/[0-9.]*?rpx/.test(html)) {
+						var rpx = uni.getSystemInfoSync().screenWidth / 750;
+						html = html.replace(/([0-9.]*?)rpx/g, function() {
+							return parseFloat(arguments[1]) * rpx + "px";
+						})
+					}
+					document.previewEvent = (img, imgList) => {
+						if (!img.hasAttribute('ignore')) {
+							var preview = true;
+							img.ignore = () => preview = false;
+							this.$emit('imgtap', img);
+							if (preview && this.autopreview) {
+								uni.previewImage({
+									current: img.index,
+									urls: imgList
+								});
+							}
+						}
+					}
+					document.tapEvent = (link, offsetTop) => {
+						var jump = true;
+						this.$emit('linkpress', {
+							href: link.getAttribute("href"),
+							ignore: () => jump = false
+						});
+						if (jump && link.getAttribute("href")) {
+							if (link.getAttribute("href")[0] == '#') {
+								if (this.useAnchor)
+									window.scrollTo(0, iframe.offsetTop + offsetTop);
+							} else if (/^http/.test(link.getAttribute("href"))) {
+								if (this.autocopy)
+									window.location.href = link.href;
+							} else {
+								uni.navigateTo({
+									url: link.getAttribute("href")
+								})
+							}
+						}
+						return false;
+					}
+					document.setTitle = (title) => {
+						if (title && this.autosetTitle) {
+							uni.setNavigationBarTitle({
+								title: title
+							})
+						}
+						if (html)
+							uni.createSelectorQuery().in(this).select("#contain").boundingClientRect(res => {
+								this.$emit('ready', res);
+							}).exec()
+					}
+					document.errorEvent = (target, source) => {
+						this.$emit('error', {
+							source,
+							target
+						});
+					}
+					document.setVideoContext = (videos) => {
+						this.videoContext = videos;
+					}
+					document.playEvent = (v) => {
+						if (this.autopause) {
+							for (var video of this.videoContext) {
+								if (video != v)
+									video.pause();
+							}
+						}
+					}
+					iframe.srcdoc = script + html;
+					this.showAnimation =
+						"opacity: 1; transition: opacity 400ms ease 0ms, -webkit-transform 400ms ease 0ms, transform 400ms ease 0ms; transform-origin: 50% 50% 0px;";
+					return;
+				}
+				// #endif
+				let showAnimation = {};
+				if (this.showWithAnimation) {
+					showAnimation = uni.createAnimation({
+						duration: this.animationDuration,
+						timingFunction: "ease"
+					}).opacity(1).step().export();
+				}
+				if (!html) {
+					this.nodes = [];
+				} else if (typeof html == 'string') {
+					html2nodes(html, this).then(res => {
+						// #ifdef APP-PLUS
+						this.loadVideo = false;
+						// #endif
+						this.nodes = res.nodes;
+						this.showAnimation = showAnimation;
+						this.imgList = res.imgList;
+						if (Document) this.document = new Document("nodes", res.nodes, this);
+						if (res.title && this.autosetTitle) {
+							uni.setNavigationBarTitle({
+								title: res.title
+							})
+						}
+						this.$emit('parser', res);
+						this.ready();
+					}).catch(err => {
+						this.$emit('error', {
+							source: "parse",
+							errMsg: err
+						});
+					})
+				} else if (html.constructor == Array) {
+					this.showAnimation = showAnimation;
+					this.imgList = [];
+					// #ifdef APP-PLUS
+					this.loadVideo = false;
+					// #endif
+					if (Document) this.document = new Document("html", html, this);
+					this.ready();
+				} else if (typeof html == 'object') {
+					if (!html.nodes || html.nodes.constructor != Array) {
+						if ((html.name && html.children && html.attrs) || (html.type == "text"))
+							return;
+						this.$emit('error', {
+							source: "parse",
+							errMsg: "传入的nodes数组格式不正确!应该传入的类型是array,实际传入的类型是:" + typeof html.nodes
+						});
+						return;
+					}
+					this.showAnimation = showAnimation;
+					this.imgList = html.imgList || [];
+					// #ifdef APP-PLUS
+					this.loadVideo = false;
+					// #endif
+					if (Document) this.document = new Document("html.nodes", html.nodes, this);
+					if (html.title && this.autosetTitle)
+						uni.setNavigationBarTitle({
+							title: html.title
+						})
+					this.ready();
+				} else {
+					this.$emit('error', {
+						source: "parse",
+						errMsg: "错误的html类型:" + typeof html
+					});
+				}
+			},
+			// #ifdef H5
+			Dom2Str(node) {
+				if (node.type == "text")
+					return node.text;
+				var elem = '<' + node.name;
+				for (var attr in node.attrs)
+					elem += (' ' + atts + '="' + node.attrs[attr] + '"');
+				elem += ">";
+				for (var child of node.children)
+					elem += Dom2Str(child);
+				elem += ("</" + node.name + ">");
+				return elem;
+			},
+			// #endif
+			// #ifndef H5
+			getContext(components) {
+				for (let component of components) {
+					let observered = false;
+					if (!component.nodes)
+						return this.getContext(component.$children);
+					for (let item of component.nodes) {
+						// #ifndef MP-ALIPAY
+						if (item.name == 'img' && !observered) {
+							observered = true;
+							if (component.lazyLoad && CanIUseObserver) {
+								component._observer = uni.createIntersectionObserver(component);
+								component._observer.relativeToViewport({
+									top: 1000,
+									bottom: 1000
+								}).observe('.img', res => {
+									component.imgLoad = true;
+									component._observer.disconnect();
+									component._observer = null;
+								})
+							} else
+								component.imgLoad = true;
+						} else if (item.name == 'video') {
+							this.videoContext.push({
+								id: item.attrs.id,
+								context: uni.createVideoContext(item.attrs.id, component)
+							});
+						}
+						// #endif
+						// #ifdef MP-BAIDU || MP-ALIPAY
+						if (item.attrs && item.attrs.id) {
+							this.anchors.push({
+								id: item.attrs.id,
+								node: component
+							})
+						}
+						// #endif
+					}
+					this.getContext(component.$children);
+				}
+			},
+			// #endif
+			ready() {
+				this.$nextTick(() => {
+					this.navigateTo = (obj) => {
+						obj.success = obj.success || function() {};
+						obj.fail = obj.fail || function() {};
+						var Scroll = (selector,component) => {
+							const query = uni.createSelectorQuery().in(component?component:this);
+							query.select(selector).boundingClientRect();
+							query.selectViewport().scrollOffset();
+							query.exec(res => {
+								if (!res || !res[0])
+									return obj.fail({
+										errMsg: "Label Not Found"
+									});
+								uni.pageScrollTo({
+									scrollTop: res[1].scrollTop + res[0].top,
+									success: obj.success,
+									fail: obj.fail
+								})
+							})
+						}
+						if (!obj.id) Scroll(".contain");
+						else {
+							// #ifndef MP-BAIDU || MP-ALIPAY
+							Scroll('.contain >>> #' + obj.id);
+							// #endif
+							// #ifdef MP-BAIDU || MP-ALIPAY
+							for (var anchor of this.anchors) {
+								if (anchor.id == obj.id) {
+									Scroll("#" + obj.id, anchor.node);
+								}
+							}
+							// #endif
+						}
+					}
+					uni.createSelectorQuery().in(this).select(".contain").boundingClientRect(res => {
+						this.$emit("ready", res);
+					}).exec()
+					// #ifndef H5
+					this.getContext(this.$children);
+					// #endif
+					// #ifdef APP-PLUS
+					setTimeout(() => {
+						this.loadVideo = true;
+					}, 2000);
+					// #endif
+				})
+			}
+		},
+		watch: {
+			html(html) {
+				this.execHtml(html);
+			}
+		}
+	}
+</script>
+
+<style>
+	/* #ifndef MP-BAIDU */
+	:host {
+		display: block;
+		overflow: scroll;
+		-webkit-overflow-scrolling: touch;
+	}
+
+	/* #endif */
+</style>

+ 363 - 0
components/jyf-Parser/trees.vue

@@ -0,0 +1,363 @@
+<template>
+	<view style="display: inherit;white-space: inherit;">
+		<block v-for='(item, index) in nodes' v-bind:key='index'>
+			<!--#ifdef MP-WEIXIN || MP-QQ || APP-PLUS || MP-ALIPAY-->
+			<block v-if="handler.isContinue(item)">
+				<!--#endif-->
+				<!--#ifdef MP-BAIDU || MP-TOUTIAO || H5-->
+				<block v-if="!item.continue">
+					<!--#endif-->
+					<!--图片-->
+					<!--#ifdef MP-WEIXIN || MP-QQ || APP-PLUS-->
+					<rich-text v-if="item.name=='img'" :id="item.attrs.id||''" class="img" :style="'text-indent:0;'+handler.getStyle(item.attrs.style,'inline-block')"
+					 :nodes='handler.setImgStyle(item,imgMode,imgLoad)' :data-ignore='item.attrs.ignore' :data-src='item.attrs.src'
+					 :data-current='item.current' @tap='previewEvent' />
+					<!--#endif-->
+					<!--#ifdef MP-ALIPAY-->
+					<rich-text v-if="item.name=='img'" :id="item.attrs.id||''" :style="'text-indent:0;'+handler.getStyle(item.attrs.style,'inline-block')"
+					 :nodes='handler.setImgStyle(item,imgMode)' :data-ignore='item.attrs.ignore' :data-src='item.attrs.src'
+					 :data-current='item.current' @tap='previewEvent' />
+					<!--#endif-->
+					<!--#ifdef MP-BAIDU || MP-TOUTIAO || H5-->
+					<rich-text v-if="item.name=='img'" :id="item.attrs.id||''" :style="'text-indent:0;'+item.attrs.containStyle" :nodes='[item]' :data-ignore='item.attrs.ignore'
+					 :data-src='item.attrs.src' :data-current='item.current' @tap='previewEvent' />
+					<!--#endif-->
+					<!--文本-->
+					<!--#ifdef MP-WEIXIN || MP-QQ || H5 || APP-PLUS-->
+					<block v-else-if="item.type=='text'">
+						<text v-if="!item.decode" decode>{{item.text}}</text>
+						<rich-text v-else style="display:inline-block" :nodes="[item]"></rich-text>
+					</block>
+					<!--#endif-->
+					<!--#ifdef MP-ALIPAY-->
+					<text v-else-if="item.type=='text'" decode>{{item.text}}</text>
+					<!--#endif-->
+					<text v-else-if="item.name=='br'">\n</text>
+					<!--视频-->
+					<block v-else-if="item.name=='video'">
+						<!--#ifdef APP-PLUS-->
+						<view v-if="(!loadVideo||item.attrs.id[item.attrs.id.length-1]>'3')&&(!controls[item.attrs.id]||!controls[item.attrs.id].play)"
+						 :class="'pvideo '+(item.attrs.class||'')" :style="item.attrs.style" :data-id="item.attrs.id" @tap="_loadVideo">
+							<view class="video-triangle"></view>
+						</view>
+						<!--#endif-->
+						<!--#ifndef APP-PLUS-->
+						<view v-if="item.attrs.id[item.attrs.id.length-1]>'3'&&(!controls[item.attrs.id]||!controls[item.attrs.id].play)"
+						 :class="'pvideo '+(item.attrs.class||'')" :style="item.attrs.style" :data-id="item.attrs.id" @tap="_loadVideo">
+							<view class="video-triangle"></view>
+						</view>
+						<!--#endif-->
+						<video v-else :src='controls[item.attrs.id]?item.attrs.source[controls[item.attrs.id].index]:item.attrs.src' :id="item.attrs.id||''"
+						 :loop='item.attrs.loop' :controls='item.attrs.controls' :autoplay="item.attrs.autoplay||(controls[item.attrs.id]&&controls[item.attrs.id].play)"
+						 :unit-id="item.attrs['unit-id']" :class="'v '+(item.attrs.class||'')" :muted="item.attrs.muted" :style="item.attrs.style"
+						 :data-id="item.attrs.id" :data-source="item.attrs.source" @play='playEvent' @error="videoError" />
+					</block>
+					<!--音频-->
+					<audio v-else-if="item.name=='audio'" :src='controls[item.attrs.id]?item.attrs.source[controls[item.attrs.id].index]:item.attrs.src'
+					 :id="item.attrs.id||''" :loop='item.attrs.loop' :controls='item.attrs.controls' :poster='item.attrs.poster' :name='item.attrs.name'
+					 :author='item.attrs.author' :class="item.attrs.class||''" :style="item.attrs.style" :data-id="item.attrs.id"
+					 :data-source="item.attrs.source" @error="audioError" />
+					<!--链接-->
+					<view v-else-if="item.name=='a'" :class="'a '+(item.attrs.class||'')" :style="item.attrs.style" :data-href='item.attrs.href'
+					 hover-class="navigator-hover" :hover-start-time="25" :hover-stay-time="300" @tap="tapEvent">
+						<!--#ifdef H5-->
+						<trees :nodes="item.children" :imgMode="imgMode" />
+						<!--#endif-->
+						<!--#ifndef H5-->
+						<trees :nodes="item.children" :imgMode="imgMode" :lazyLoad="lazyLoad" :loadVideo="loadVideo" />
+						<!--#endif-->
+					</view>
+					<!--广告-->
+					<!--#ifdef MP-WEIXIN || MP-QQ-->
+					<ad v-else-if="item.name=='ad'" :unit-id="item.attrs['unit-id']" :class="item.attrs.class||''" :style="item.attrs.style"
+					 @error="adError"></ad>
+					<!--#endif-->
+					<!--#ifdef MP-BAIDU-->
+					<ad v-else-if="item.name=='ad'" :appid="item.attrs.appid" :apid="item.attrs.apid" :type="item.attrs.type" :class="item.attrs.class||''"
+					 :style="item.attrs.style" @error="adError"></ad>
+					<!--#endif-->
+					<!--富文本-->
+					<!--#ifdef MP-WEIXIN || MP-QQ || MP-ALIPAY || APP-PLUS-->
+					<rich-text v-else :id="item.attrs.id||''" :class="item.name" :style="''+handler.getStyle(item.attrs.style,'block')" :nodes="handler.setStyle(item)" />
+					<!--#endif-->
+					<!--#ifdef MP-BAIDU || MP-TOUTIAO || H5-->
+					<rich-text v-else :id="item.attrs.id||''" :class="item.name" :style="item.attrs?item.attrs.containStyle:''" :nodes="[item]" />
+					<!--#endif-->
+				</block>
+				<!--#ifdef MP-ALIPAY || H5-->
+				<view v-else :id="item.attrs.id||''" :class="item.name+' '+(item.attrs.class||'')" :style="item.attrs.style">
+					<trees :nodes="item.children" :imgMode="imgMode" />
+				</view>
+				<!--#endif-->
+				<!--#ifndef MP-ALIPAY || H5-->
+				<trees v-else :id="item.attrs.id||''" :class="item.name+' '+(item.attrs.class||'')" :style="item.attrs.style" :nodes="item.children"
+				 :imgMode="imgMode" :lazyLoad="lazyLoad" :loadVideo="loadVideo" />
+				<!--#endif-->
+			</block>
+	</view>
+</template>
+<script module="handler" lang="wxs" src="./handler.wxs"></script>
+<script module="handler" lang="sjs" src="./handler.sjs"></script>
+<script>
+	import trees from "./trees"
+	export default {
+		components: {
+			trees
+		},
+		name: 'trees',
+		data() {
+			return {
+				controls: {},
+				// #ifdef MP-WEIXIN || MP-QQ || APP-PLUS
+				imgLoad: false
+				// #endif
+			}
+		},
+		props: {
+			nodes: {
+				type: Array,
+				default: []
+			},
+			// #ifdef MP-WEIXIN || MP-QQ || APP-PLUS
+			lazyLoad: {
+				type: Boolean,
+				default: false
+			},
+			// #endif
+			// #ifdef APP-PLUS
+			loadVideo: {
+				type: Boolean,
+				default: false
+			},
+			// #endif
+			imgMode: {
+				type: String,
+				default: "default"
+			}
+		},
+		mounted() {
+			// 获取顶层组件
+			this._top = this.$parent;
+			while (this._top.$options.name != 'parser') {
+				if (this._top._top) {
+					this._top = this._top._top;
+					break;
+				}
+				this._top = this._top.$parent;
+			}
+		},
+		// #ifdef MP-WEIXIN || MP-QQ || APP-PLUS
+		beforeDestroy() {
+			if (this._observer)
+				this._observer.disconnect();
+		},
+		// #endif
+		methods: {
+			// #ifndef MP-ALIPAY
+			playEvent(e) {
+				if (this._top.videoContext.length > 1 && this._top.autopause) {
+					for (let video of this._top.videoContext) {
+						if (video.id == e.currentTarget.dataset.id) continue;
+						video.context.pause();
+					}
+				}
+			},
+			// #endif
+			previewEvent(e) {
+				if (!e.currentTarget.dataset.ignore) {
+					var preview = true;
+					this._top.$emit('imgtap', {
+						id: e.target.id,
+						src: e.currentTarget.dataset.src,
+						ignore: () => preview = false
+					});
+					if (preview && this._top.autopreview) {
+						uni.previewImage({
+							current: parseInt(e.currentTarget.dataset.current),
+							urls: this._top.imgList.length ? this._top.imgList : [e.currentTarget.dataset.src]
+						});
+					}
+				}
+			},
+			tapEvent(e) {
+				var jump = true;
+				this._top.$emit('linkpress', {
+					href: e.currentTarget.dataset.href,
+					ignore: () => jump = false
+				});
+				if (jump && e.currentTarget.dataset.href) {
+					if (e.currentTarget.dataset.href[0]) {
+						if (this._top.useAnchor)
+							this._top.navigateTo({
+								id: e.currentTarget.dataset.href.substring(1)
+							})
+					} else if (/^http/.test(e.currentTarget.dataset.href)) {
+						if (this._top.autocopy) {
+							// #ifndef H5
+							uni.setClipboardData({
+								data: e.currentTarget.dataset.href,
+								success() {
+									uni.showToast({
+										title: '链接已复制'
+									});
+								}
+							});
+							// #endif
+							// #ifdef H5
+							window.location.href = e.currentTarget.dataset.href;
+							// #endif
+						}
+					} else
+						uni.navigateTo({
+							url: e.currentTarget.dataset.href
+						})
+				}
+			},
+			triggerError(source, target, errMsg, errCode) {
+				this._top.$emit('error', {
+					source,
+					target,
+					errMsg,
+					errCode
+				});
+			},
+			loadSource(currentTarget) {
+				if (!this.controls[currentTarget.id] && currentTarget.source.length > 1) {
+					this.$set(this.controls, currentTarget.id, {
+						play: false,
+						index: 1
+					})
+				} else if (this.controls[currentTarget.id] && currentTarget.source.length > this.controls[
+						currentTarget.id].index + 1) {
+					this.$set(this.controls[currentTarget.id], "index", this.controls[currentTarget.id].index + 1);
+				}
+			},
+			adError(e) {
+				this.triggerError("ad", e.currentTarget, "", e.detail.errorCode);
+			},
+			videoError(e) {
+				this.loadSource(e.currentTarget.dataset);
+				this.triggerError("video", e.currentTarget, e.detail.errMsg);
+			},
+			audioError(e) {
+				this.loadSource(e.currentTarget.dataset);
+				this.triggerError("audio", e.currentTarget, e.detail.errMsg);
+			},
+			_loadVideo(e) {
+				this.$set(this.controls, e.currentTarget.dataset.id, {
+					play: true,
+					index: 0
+				})
+			}
+		}
+	}
+</script>
+
+<style>
+	/* 可以在这里引入自定义的外部样式 */
+
+	/* 链接受到点击的hover-class,可自定义修改 */
+	.navigator-hover {
+		opacity: 0.7;
+		text-decoration: underline;
+	}
+
+	/* 以下内容不建议修改 */
+	:host {
+		display: inherit;
+		float: inherit;
+	}
+
+	.a {
+		display: inline;
+		color: #366092;
+	}
+
+	/* #ifdef MP-WEIXIN || MP-QQ || MP-ALIPAY */
+	.sub,
+	.sup,
+	.bdo,
+	.bdi,
+	.ruby,
+	.rt {
+		display: inline-block !important;
+	}
+
+	/* #endif */
+
+	.div,
+	.blockquote,
+	.p {
+		display: block;
+	}
+
+	.b,
+	.strong {
+		display: inline;
+		font-weight: bold;
+	}
+
+	.em,
+	.i {
+		display: inline;
+		font-style: italic;
+	}
+
+	.del {
+		display: inline;
+		text-decoration: line-through;
+	}
+
+	.ins {
+		display: inline;
+		text-decoration: underline;
+	}
+
+	.code {
+		display: inline;
+		font-family: monospace;
+	}
+
+	.big {
+		font-size: 1.2em;
+		display: inline;
+	}
+
+	.small {
+		font-size: 0.8em;
+		display: inline;
+	}
+
+	.q,
+	.span,
+	.label,
+	.abbr {
+		display: inline;
+	}
+
+	.q::before {
+		content: '"';
+	}
+
+	.q::after {
+		content: '"';
+	}
+
+	.pvideo {
+		background-color: black;
+		width: 300px;
+		height: 225px;
+		display: inline-block;
+		position: relative;
+	}
+
+	.video-triangle {
+		border-width: 15px 0 15px 30px;
+		border-style: solid;
+		border-color: transparent transparent transparent white;
+		position: absolute;
+		left: 50%;
+		top: 50%;
+		margin: -15px 0 0 -15px;
+	}
+</style>

+ 262 - 0
components/keyboard/keyboard.vue

@@ -0,0 +1,262 @@
+<template>		
+	<view class='keyboard' @click.stop='_handleKeyPress'>
+	    <view class='key-row'>
+	        <view class='key-cell cell_b' data-num='7'>7</view>
+	        <view class='key-cell cell_b' data-num='8'>8</view>
+	        <view class='key-cell cell_b' data-num='9'>9</view>
+			<view class='key-cell cell_b ac' data-num='-1'></view>
+	    </view>
+	    <view class='key-row'>
+	        <view class='key-cell cell_b' data-num='4'>4</view>
+	        <view class='key-cell cell_b' data-num='5'>5</view>
+	        <view class='key-cell cell_b' data-num='6'>6</view>
+	        <view class='key-cell cell_b' data-num='-1'></view>
+	    </view>
+	    <view class='key-row'>
+	        <view class='key-cell cell_b' data-num='1'>1</view>
+	        <view class='key-cell cell_b' data-num='2'>2</view>
+	        <view class='key-cell cell_b' data-num='3'>3</view>
+	        <view class='key-cell cell_b' data-num='-1'></view>
+	    </view>
+		<view class="key-zero-and-point">
+		<view class="a cell_b zero"  data-num='0'>0</view>
+		<view class="a cell_b point"  data-num='.'>.</view>
+		 </view>
+		 
+		<view  @touchstart="touchstart" @touchend="touchend" data-num='D' class="key-confirm2">
+			<text data-num='D'>删除</text>
+		</view>
+		
+	    <view class='key-confirm' :style="{'background':btnColor}" data-num='S'>
+			<view data-num='S' class="">
+				<view data-num='S' class="title">{{title}}</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		name:"keyBoard",
+		props:{
+			title:{
+				default:'完成',
+				type:String
+			},
+			btnColor:{
+				default:'green',
+			}
+		},
+		data(){
+			return {
+				money:'',
+				Cdel:'',
+				Time:''
+			}
+		},
+		watch:{
+			money(val){
+				this.$emit('update:money',val);			
+			}
+		},
+		methods : {
+			touchstart(){
+				 this.Time=setInterval(()=>{
+					if(this.money==''){
+						clearInterval();
+					}
+					this.money = this.money.substring(0,this.money.length - 1);
+				},200)
+			},
+			touchend(){
+				clearInterval(this.Time);
+			},
+			//处理按键
+			_handleKeyPress(e) {
+				let num = e.target.dataset.num;
+				//不同按键处理逻辑
+				// -1 代表无效按键,直接返回
+				if (num == -1) return false;
+				switch (String(num)) {
+					//小数点
+					case '.':
+						this._handleDecimalPoint();
+						break;
+					//删除键
+					case 'D':
+						this.$parent.payAmount = ''
+						this._handleDeleteKey();
+						break;
+					//清空键
+					case 'C':
+						this._handleClearKey();
+						break;
+					//确认键
+					case 'S':
+						this._handleConfirmKey();
+						break;
+					default:
+						this._handleNumberKey(num);
+						break;
+				}
+			},
+			//处理小数点函数
+			_handleDecimalPoint() {
+				//如果包含小数点,直接返回
+				if (this.money.indexOf('.') > -1) return false;
+				//如果小数点是第一位,补0
+				if (!this.money.length)
+					this.money = '0.';
+				//如果不是,添加一个小数点
+				else
+					this.money = this.money + '.';
+			},
+			//处理删除键
+			_handleDeleteKey() {
+				let S = this.money;
+				//如果没有输入,直接返回
+				if (!S.length) return false;
+				//否则删除最后一个
+				this.money = S.substring(0, S.length - 1);
+			},
+			
+			//处理清空键
+			_handleClearKey() {
+			
+				this.money = '';
+			},
+			
+			//处理数字
+			_handleNumberKey(num) {
+				if(this.money.length==10){
+					return
+				}
+				let S = this.money;
+				//如果有小数点且小数点位数不小于2
+				if ( S.indexOf('.') > -1 && S.substring(S.indexOf('.') + 1).length < 2)
+					this.money = S + num;
+				//没有小数点
+				if (!(S.indexOf('.') > -1)) {
+					//如果第一位是0,只能输入小数点
+					if (num == 0 && S.length == 0)
+						this.money = '0.';
+					else {
+						if (S.length && Number(S.charAt(0)) === 0) return;
+						this.money = S + num;
+					}
+				}
+			},
+			
+			//提交
+			_handleConfirmKey() {	
+				let S = this.money;
+				//未输入
+				if (!S.length||S==0){
+					S = this.$parent.payAmount
+					//  uni.showToast({
+					// 	title: '请输入支付金额',
+					// 	icon:'none',
+					// 	duration: 1000
+					//  });
+					// return false;
+				}else{
+					//将 8. 这种转换成 8.00
+					if (S.indexOf('.') > -1 && S.indexOf('.') == (S.length - 1))
+						S = Number(S.substring(0, S.length - 1)).toFixed(2);
+					//保留两位
+					S = Number(S).toFixed(2);
+				}
+				this.$emit('confirmEvent',S);    //提交参数
+			}
+		}
+	}
+</script>
+
+<style lang="less" scoped>
+	.cell_b{
+		border-right: 1px solid #d5d5d6;
+		border-bottom: 1px solid #d5d5d6;
+	}
+    .key-container {
+        width: 100%;
+        display: flex; 
+        flex-direction: column;
+    }
+    .keyboard {
+		flex: 1;
+        position: fixed;
+        bottom: 0;
+        left: 0;
+        height: 600rpx;
+        width: 100%;
+		background: #FFFFFF;
+		border-top: 1px solid #d5d5d6;
+    }
+    .keyboard .key-row {
+        display: flex;
+        display: -webkit-flex;
+        position: relative;
+        height: 150rpx;
+        line-height: 150rpx;
+    }
+ 
+    .keyboard .key-cell {
+        flex: 1;
+        -webkit-box-flex: 1;
+		font-size: 60upx;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		&.ac{
+			border-bottom:none;
+		}
+    }
+  
+    .keyboard .key-confirm {
+        position: absolute;
+        text-align: center;
+        height: 300rpx;
+        width: 25%;
+        line-height: 300rpx;
+		color: #FFFFFF;
+        z-index: 5;
+        right: 0;
+        bottom: 0;
+		display:flex;
+		justify-content: center;
+		align-items: center;
+    }
+	
+	.keyboard .key-confirm2 {
+	    position: absolute;
+	    height: 300rpx;
+	    width: 25%;
+	    line-height: 300rpx;
+	    z-index: 9999;
+	    right: 0;
+		top: 0;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		background: #EBEBEB;
+	}
+	.key-zero-and-point{
+		 display: flex;height: 150rpx;justify-content: center;align-items: center;width:75%;font-size: 60upx;
+		 .zero{
+			  display: flex;justify-content: center;align-items: center;width: 67.66%;font-size: 60upx;text-align: center;height: 100%;
+		 }
+		 .point{
+			  display: flex;justify-content: center;align-items: center;width: 33.33%;font-size: 60upx;text-align: center;height: 100%;
+		 }
+	}
+	.key-cell:active{
+		color: white;  
+		background: black;  //黑色
+		opacity: 0.1;    //这里重要,就是通过这个透明度来设置
+	}
+	.a:active,.key-confirm2:active{
+		color: white;
+		background: black;  //黑色
+		opacity: 0.1;    //这里重要,就是通过这个透明度来设置
+	}
+</style>

+ 33 - 0
components/modal-layer.vue

@@ -0,0 +1,33 @@
+<template name="modal">
+	<view class="modal">
+		<view class="modal-content"></view>
+	</view>
+</template>
+<script>
+	export default {
+		name:'modal',
+		data() {
+			return {
+
+			}
+		},
+		created() {
+
+		},
+		computed: {
+
+		},
+	}
+</script>
+
+<style lang="scss">
+	.modal-content {
+		width: 100%;
+		height: 100%;
+		position: fixed;
+		left: 0;
+		top: 0;
+		background:rgba(255,255,255,0);
+		z-index: 7777;
+	}
+</style>

+ 242 - 0
components/mpvue-citypicker/mpvueCityPicker.vue

@@ -0,0 +1,242 @@
+<template>
+	<div class="mpvue-picker">
+		<div :class="{'pickerMask':showPicker}" @click="maskClick" catchtouchmove="true"></div>
+		<div class="mpvue-picker-content " :class="{'mpvue-picker-view-show':showPicker}">
+			<div class="mpvue-picker__hd" catchtouchmove="true">
+				<div class="mpvue-picker__action" @click="pickerCancel">取消</div>
+				<div class="mpvue-picker__action" :style="{color:themeColor}" @click="pickerConfirm">确定</div>
+			</div>
+			<picker-view indicator-style="height: 40px;" class="mpvue-picker-view" :value="pickerValue" @change="pickerChange">
+				<block>
+					<picker-view-column>
+						<div class="picker-item" v-for="(item,index) in provinceDataList" :key="index">{{item.name}}</div>
+					</picker-view-column>
+					<picker-view-column>
+						<div class="picker-item" v-for="(item,index) in cityDataList" :key="index">{{item.name}}</div>
+					</picker-view-column>
+					<picker-view-column>
+						<div class="picker-item" v-for="(item,index) in areaDataList" :key="index">{{item.name}}</div>
+					</picker-view-column>
+				</block>
+			</picker-view>
+		</div>
+	</div>
+</template>
+
+<script>	
+	import { provinceData,cityData,areaData } from '@/common/config/addressdata.js';
+	export default {
+		data() {
+			return {
+				pickerValue: [0, 0, 0],
+				provinceDataList: provinceData,
+				cityDataList: cityData[1],
+				areaDataList: areaData&&areaData[0]&&areaData[0][0],
+				/* 是否显示控件 */
+				showPicker: false,
+			};
+		},
+		created() {
+			// console.log('provinceData',provinceData)
+			// console.log('cityData',cityData)
+			// console.log('areaData',areaData)
+			// this.init()
+		},
+		props: {
+			/* 默认值 */
+			pickerValueDefault: {
+				type: Array,
+				default () {
+					return [1, 1, 2]
+				}
+			},
+			/* 主题色 */
+			themeColor: String
+		},
+		watch: {
+			pickerValueDefault() {
+				// this.init();
+			}
+		},
+		methods: {
+			init() {
+				this.handPickValueDefault(); // 对 pickerValueDefault 做兼容处理
+				const pickerValueDefault = this.pickerValueDefault
+				this.cityDataList = cityData[pickerValueDefault[0]];
+				this.areaDataList = areaData[pickerValueDefault[0]][pickerValueDefault[1]];
+				this.pickerValue = pickerValueDefault;
+			},
+			show() {
+				setTimeout(() => {
+					this.showPicker = true;
+				}, 0);
+			},
+			showAddrDetails() {
+				this.$parent.isShowInput = false;
+			},
+			maskClick() {
+				this.showAddrDetails();
+				this.pickerCancel();
+			},
+			pickerCancel() {
+				this.showAddrDetails();
+				this.showPicker = false;
+				// this._$emit('onCancel');
+			},
+			pickerConfirm(e) {
+				this.showAddrDetails();
+				this.showPicker = false;
+				this._$emit('onConfirm');
+			},
+			showPickerView() {
+				this.showPicker = true;
+			},
+			handPickValueDefault() {
+				const pickerValueDefault = this.pickerValueDefault
+				let provinceIndex = pickerValueDefault[0]
+				let cityIndex = pickerValueDefault[1]
+				const areaIndex = pickerValueDefault[2]
+				if (
+					provinceIndex !== 0 ||
+					cityIndex !== 0 ||
+					areaIndex !== 0
+				) {
+					if (provinceIndex > provinceData.length - 1) {
+						this.pickerValueDefault[0] = provinceIndex = provinceData.length - 1;
+					}
+					// if (cityIndex > cityData[provinceIndex].length - 1) {
+					// 	this.pickerValueDefault[1] = cityIndex = cityData[provinceIndex].length - 1;
+					// }
+					// if (areaIndex > areaData[provinceIndex][cityIndex].length - 1) {
+					// 	this.pickerValueDefault[2] = areaData[provinceIndex][cityIndex].length - 1;
+					// }
+				}
+			},
+			pickerChange(e) {
+				let changePickerValue = e.mp.detail.value;
+				if (this.pickerValue[0] !== changePickerValue[0]) {
+					// 第一级发生滚动
+					this.cityDataList = cityData[changePickerValue[0]];
+					this.areaDataList = areaData[changePickerValue[0]][0];
+					changePickerValue[1] = 0;
+					changePickerValue[2] = 0;
+				} else if (this.pickerValue[1] !== changePickerValue[1]) {
+					// 第二级滚动
+					this.areaDataList =
+						areaData[changePickerValue[0]][changePickerValue[1]];
+					changePickerValue[2] = 0;
+				}
+				this.pickerValue = changePickerValue;
+				this._$emit('onChange');
+			},
+			_$emit(emitName) {
+				let pickObj = {
+					name: this._getLabel(),
+					value: this.pickerValue,
+					townCode: this._getTownCode(),
+					cityCode: this._getCityCode(),
+					provinceCode: this._getProvinceCode()
+				};
+				this.$emit(emitName, pickObj);
+			},
+			_getLabel() {
+				let pcikerLabel =
+					this.provinceDataList[this.pickerValue[0]].name +
+					'-' +
+					this.cityDataList[this.pickerValue[1]].name +
+					'-' +
+					this.areaDataList[this.pickerValue[2]].name;
+				return pcikerLabel;
+			},
+			_getTownCode() {
+				return this.areaDataList[this.pickerValue[2]].townId;
+			},
+			_getCityCode() {
+				return this.cityDataList[this.pickerValue[1]].cityId;
+			},
+			_getProvinceCode() {
+				return this.provinceDataList[this.pickerValue[0]].provinceId;
+			}
+		}
+	};
+</script>
+
+<style>
+	.pickerMask {
+		position: fixed;
+		z-index: 2888;
+		top: 0;
+		right: 0;
+		left: 0;
+		bottom: 0;
+		background: rgba(0, 0, 0, 0.6);
+	}
+
+	.mpvue-picker-content {
+		position: fixed;
+		bottom: 0;
+		left: 0;
+		width: 100%;
+		transition: all 0.3s ease;
+		transform: translateY(100%);
+		z-index: 3000;
+	}
+
+	.mpvue-picker-view-show {
+		transform: translateY(0);
+	}
+
+	.mpvue-picker__hd {
+		display: flex;
+		padding: 9px 15px;
+		background-color: #fff;
+		position: relative;
+		text-align: center;
+		font-size: 17px;
+	}
+
+	.mpvue-picker__hd:after {
+		content: ' ';
+		position: absolute;
+		left: 0;
+		bottom: 0;
+		right: 0;
+		height: 1px;
+		border-bottom: 1px solid #e5e5e5;
+		color: #e5e5e5;
+		transform-origin: 0 100%;
+		transform: scaleY(0.5);
+	}
+
+	.mpvue-picker__action {
+		display: block;
+		flex: 1;
+		color: #1aad19;
+	}
+
+	.mpvue-picker__action:first-child {
+		text-align: left;
+		color: #888;
+	}
+
+	.mpvue-picker__action:last-child {
+		text-align: right;
+	}
+
+	.picker-item {
+		text-align: center;
+		line-height: 40px;
+		text-overflow: ellipsis;
+		white-space: nowrap;
+		font-size: 16px;
+	}
+
+	.mpvue-picker-view {
+		position: relative;
+		bottom: 0;
+		left: 0;
+		width: 100%;
+		height: 238px;
+		background-color: rgba(255, 255, 255, 1);
+	}
+</style>

+ 202 - 0
components/share.vue

@@ -0,0 +1,202 @@
+<template>
+	<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
+			}]"
+		>
+			<scroll-view class="view-content" scroll-y>
+				<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>
+				</view>
+			</scroll-view>
+			<view class="bottom 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: {},
+			};
+		},
+		props:{
+			contentHeight:{
+				type: Number,
+				default: 0
+			},
+			//是否是tabbar页面
+			hasTabbar:{
+				type: Boolean,
+				default: false
+			},
+			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)
+				}
+			},
+			//防止冒泡和滚动穿透
+			stopPrevent(){},
+			//分享操作
+			shareToFriend(type){
+				this.$api.msg(`分享给${type}`);
+				this.toggleMask();
+			},
+		}
+	}
+</script>
+
+<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: .3s;
+		.bottom{
+			position:absolute;
+			left: 0;
+			bottom: 0;
+			display:flex;
+			justify-content: center;
+			align-items: center;
+			width: 100%;
+			height: 90upx;
+			background: #fff;
+			z-index: 9;
+			font-size: $font-base + 2upx;
+			color: $font-color-dark;
+		}
+	}
+	
+	.mask-content{
+		width: 100%;
+		height: 580upx;
+		transition: .3s;
+		background: #fff;
+		&.has-bottom{
+			padding-bottom: 90upx;
+		}
+		.view-content{
+			height: 100%;
+		}
+	}
+	.share-header{
+		height: 110upx;
+		font-size: $font-base+2upx;
+		color: font-color-dark;
+		display:flex;
+		align-items:center;
+		justify-content: center;
+		padding-top: 10upx;
+		&:before, &:after{
+			content: '';
+			width: 240upx;
+			heighg: 0;
+			border-top: 1px solid $border-color-base;
+			transform: scaleY(.5);
+			margin-right: 30upx;
+		}
+		 &:after{
+			 margin-left: 30upx;
+			 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: 180upx;
+		image{
+			width: 80upx;
+			height: 80upx;
+			margin-bottom: 16upx;
+		}
+		text{
+			font-size: $font-base;
+			color: $font-color-base;
+		}
+	}
+</style>

+ 185 - 0
components/thorui/tui-actionsheet/tui-actionsheet.vue

@@ -0,0 +1,185 @@
+<template>
+	<view @touchmove.stop.prevent>
+		<view class="tui-actionsheet" :class="{'tui-actionsheet-show':show,'tui-actionsheet-radius':radius}">
+			<view class="tui-actionsheet-tips" :style="{fontSize:size+'rpx',color:color}" v-if="tips">
+				{{tips}}
+			</view>
+			<view :class="[isCancel?'tui-operate-box':'']">
+				<block v-for="(item,index) in itemList" :key="index">
+					<view class="tui-actionsheet-btn tui-actionsheet-divider" :class="{'tui-btn-last':!isCancel && index==itemList.length-1}"
+					 hover-class="tui-actionsheet-hover" :hover-stay-time="150" :data-index="index" :style="{color:item.color || '#2B2B2B'}"
+					 @tap="handleClickItem">{{item.text}}</view>
+				</block>
+			</view>
+			<view class="tui-actionsheet-btn tui-actionsheet-cancel" hover-class="tui-actionsheet-hover" :hover-stay-time="150"
+			 v-if="isCancel" @tap="handleClickCancel">取消</view>
+		</view>
+		<view class="tui-actionsheet-mask" :class="{'tui-mask-show':show}" @tap="handleClickMask"></view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "tuiActionsheet",
+		props: {
+			//点击遮罩 是否可关闭
+			maskClosable: {
+				type: Boolean,
+				default: true
+			},
+			//显示操作菜单
+			show: {
+				type: Boolean,
+				default: false
+			},
+			//菜单按钮数组,自定义文本颜色,红色参考色:#e53a37
+			itemList: {
+				type: Array,
+				default: function() {
+					return [{
+						text: "确定",
+						color: "#2B2B2B"
+					}]
+				}
+			},
+			//提示文字
+			tips: {
+				type: String,
+				default: ""
+			},
+			//提示文字颜色
+			color: {
+				type: String,
+				default: "#808080"
+			},
+			//提示文字大小 rpx
+			size: {
+				type: Number,
+				default: 26
+			},
+			//是否需要圆角
+			radius: {
+				type: Boolean,
+				default: true
+			},
+			//是否需要取消按钮
+			isCancel: {
+				type: Boolean,
+				default: true
+			}
+		},
+		methods: {
+			handleClickMask() {
+				if (!this.maskClosable) return;
+				this.handleClickCancel();
+			},
+			handleClickItem(e) {
+				if (!this.show) return;
+				const dataset = e.currentTarget.dataset;
+				this.$emit('click', {
+					index: Number(dataset.index)
+				});
+			},
+			handleClickCancel() {
+				this.$emit('cancel');
+			}
+		}
+	}
+</script>
+
+<style scoped>
+	.tui-actionsheet {
+		width: 100%;
+		position: fixed;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		z-index: 9999;
+		visibility: hidden;
+		transform: translate3d(0, 100%, 0);
+		transform-origin: center;
+		transition: all 0.25s ease-in-out;
+		background-color: #F7F7F7;
+		min-height: 100rpx;
+	}
+
+	.tui-actionsheet-radius {
+		border-top-left-radius: 20rpx;
+		border-top-right-radius: 20rpx;
+		overflow: hidden;
+	}
+
+	.tui-actionsheet-show {
+		transform: translate3d(0, 0, 0);
+		visibility: visible;
+	}
+
+	.tui-actionsheet-tips {
+		width: 100%;
+		padding: 40rpx 60rpx;
+		box-sizing: border-box;
+		text-align: center;
+		background-color: #fff;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+	}
+
+	.tui-operate-box {
+		padding-bottom: 12rpx;
+	}
+
+	.tui-actionsheet-btn {
+		width: 100%;
+		height: 100rpx;
+		background-color: #fff;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		text-align: center;
+		font-size: 34rpx;
+		position: relative;
+	}
+
+	.tui-btn-last {
+		padding-bottom: env(safe-area-inset-bottom);
+	}
+
+	.tui-actionsheet-divider::before {
+		content: '';
+		width: 100%;
+		border-top: 1rpx solid #E7E7E7;
+		position: absolute;
+		top: 0;
+		left: 0;
+		-webkit-transform: scaleY(0.5);
+		transform: scaleY(0.5);
+	}
+
+	.tui-actionsheet-cancel {
+		color: #1a1a1a;
+		padding-bottom: env(safe-area-inset-bottom);
+	}
+
+	.tui-actionsheet-hover {
+		background-color: #f7f7f9;
+	}
+
+	.tui-actionsheet-mask {
+		position: fixed;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		background-color: rgba(0, 0, 0, 0.6);
+		z-index: 9996;
+		transition: all 0.3s ease-in-out;
+		opacity: 0;
+		visibility: hidden;
+	}
+
+	.tui-mask-show {
+		opacity: 1;
+		visibility: visible;
+	}
+</style>

+ 134 - 0
components/thorui/tui-alert/tui-alert.vue

@@ -0,0 +1,134 @@
+<template>
+	<view>
+		<view class="tui-alert-class tui-alert-box" :class="[show?'tui-alert-show':'']">
+			<view class="tui-alert-content" :style="{fontSize:size+'rpx',color:color}">
+				<slot></slot>
+			</view>
+			<view class="tui-alert-btn" :style="{color:btnColor}" hover-class="tui-alert-btn-hover" :hover-stay-time="150"
+			 @tap.stop="handleClick">{{btnText}}</view>
+		</view>
+		<view class="tui-alert-mask" :class="[show?'tui-alert-mask-show':'']" @tap.stop="handleClickCancel"></view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name:"tuiAlert",
+		props: {
+			//控制显示
+			show: {
+				type: Boolean,
+				default: false
+			},
+			//提示信息字体大小
+			size: {
+				type: Number,
+				default: 30
+			},
+			//提示信息字体颜色
+			color: {
+				type: String,
+				default: "#333"
+			},
+			//按钮字体颜色
+			btnColor: {
+				type: String,
+				default: "#EB0909"
+			},
+			btnText:{
+				type: String,
+				default: "确定"
+			},
+			//点击遮罩 是否可关闭
+			maskClosable: {
+				type: Boolean,
+				default: false
+			}
+		},
+		methods: {
+			handleClick(e) {
+				if (!this.show) return;
+				this.$emit('click', {});
+			},
+			handleClickCancel() {
+				if (!this.maskClosable) return;
+				this.$emit('cancel');
+			}
+		}
+	}
+</script>
+
+<style scoped>
+	.tui-alert-box {
+		position: fixed;
+		width: 560rpx;
+		left: 50%;
+		top: 50%;
+		background-color: #fff;
+		transition: all 0.3s ease-in-out;
+		transform: translate(-50%, -50%) scale(0);
+		opacity: 0;
+		border-radius: 6rpx;
+		overflow: hidden;
+		z-index: 99998;
+	}
+
+	.tui-alert-show {
+		transform: translate(-50%, -50%) scale(1);
+		opacity: 1;
+	}
+
+	.tui-alert-mask {
+		position: fixed;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		background-color: rgba(0, 0, 0, 0.5);
+		z-index: 99996;
+		transition: all 0.3s ease-in-out;
+		opacity: 0;
+		visibility: hidden;
+	}
+
+	.tui-alert-mask-show {
+		visibility: visible;
+		opacity: 1;
+	}
+
+	.tui-alert-content {
+		text-align: center;
+		color: #333333;
+		padding: 98rpx 48rpx 92rpx 48rpx;
+		box-sizing: border-box;
+		word-break: break-all;
+	}
+
+	.tui-alert-btn {
+		width: 100%;
+		height: 90rpx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		background-color: #fff;
+		box-sizing: border-box;
+		position: relative;
+		font-size: 32rpx;
+		line-height: 32rpx;
+	}
+
+	.tui-alert-btn-hover {
+		background-color: #f7f7f7;
+	}
+
+	.tui-alert-btn::before {
+		width: 100%;
+		content: "";
+		position: absolute;
+		border-top: 1rpx solid #E0E0E0;
+		-webkit-transform: scaleY(0.5);
+		transform: scaleY(0.5);
+		left: 0;
+		top: 0;
+	}
+</style>

+ 155 - 0
components/thorui/tui-badge/tui-badge.vue

@@ -0,0 +1,155 @@
+<template>
+	<view :class="[dot ? 'tui-badge-dot' : 'tui-badge', 'tui-' + type, !dot ? 'tui-badge-scale' : '']" :style="{ top: top, right: right, position: absolute ? 'absolute' : 'static', transform: getStyle, margin: margin }"
+	 @tap="handleClick">
+		<slot></slot>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'tuiBadge',
+		props: {
+			//primary,warning,green,danger,white,black,gray,white_red
+			type: {
+				type: String,
+				default: 'primary'
+			},
+			//是否是圆点
+			dot: {
+				type: Boolean,
+				default: false
+			},
+			margin: {
+				type: String,
+				default: '0'
+			},
+			//是否绝对定位
+			absolute: {
+				type: Boolean,
+				default: false
+			},
+			top: {
+				type: String,
+				default: '-8rpx'
+			},
+			right: {
+				type: String,
+				default: '0'
+			},
+			//缩放比例
+			scaleRatio: {
+				type: Number,
+				default: 1
+			},
+			//水平方向移动距离
+			translateX: {
+				type: String,
+				default: '0'
+			}
+		},
+		computed: {
+			getStyle() {
+				return `scale(${this.scaleRatio}) translateX(${this.translateX})`;
+			}
+		},
+		methods: {
+			handleClick() {
+				this.$emit('click', {});
+			}
+		}
+	};
+</script>
+
+<style scoped>
+	/* color start*/
+
+	.tui-primary {
+		background-color: #5677fc;
+		color: #fff;
+	}
+
+	.tui-danger {
+		background-color: #ed3f14;
+		color: #fff;
+	}
+
+	.tui-red {
+		background-color: #F74D54;
+		color: #fff;
+	}
+
+	.tui-warning {
+		background-color: #ff7900;
+		color: #fff;
+	}
+
+	.tui-green {
+		background-color: #19be6b;
+		color: #fff;
+	}
+
+	.tui-white {
+		background-color: #fff;
+		color: #333;
+	}
+
+	.tui-white_red {
+		background-color: #fff;
+		color: #F74D54;
+	}
+
+	.tui-white_primary {
+		background-color: #fff;
+		color: #5677fc;
+	}
+
+	.tui-white_green {
+		background-color: #fff;
+		color: #19be6b;
+	}
+
+	.tui-white_warning {
+		background-color: #fff;
+		color: #ff7900;
+	}
+
+	.tui-black {
+		background-color: #000;
+		color: #fff;
+	}
+
+	.tui-gray {
+		background-color: #ededed;
+		color: #999;
+	}
+
+	/* color end*/
+
+	/* badge start*/
+
+	.tui-badge-dot {
+		height: 8px;
+		width: 8px;
+		border-radius: 50%;
+	}
+
+	.tui-badge {
+		font-size: 24rpx;
+		line-height: 24rpx;
+		height: 36rpx;
+		min-width: 36rpx;
+		padding: 0 10rpx;
+		box-sizing: border-box;
+		border-radius: 100rpx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		z-index: 10;
+	}
+
+	.tui-badge-scale {
+		transform-origin: center center;
+	}
+
+	/* badge end*/
+</style>

+ 387 - 0
components/thorui/tui-bottom-navigation/tui-bottom-navigation.vue

@@ -0,0 +1,387 @@
+<template>
+	<view @touchmove.stop.prevent="stop">
+		<view class="tui-bottom-navigation" :class="{ 'tui-navigation-fixed': isFixed, 'tui-remove-splitLine': unlined }">
+			<view
+				class="tui-navigation-item"
+				:class="{ 'tui-item-after_height': splitLineScale, 'tui-last-item': index == itemList.length - 1 }"
+				:style="{ backgroundColor: isDarkMode ? '#202020' : backgroundColor }"
+				v-for="(item, index) in itemList"
+				:key="index"
+			>
+				<view class="tui-item-inner" @tap="menuClick(index, item.parameter, item.type)">
+					<image
+						:src="current | getIcon(index, item)"
+						class="tui-navigation-img"
+						v-if="item.iconPath || (current == index && item.selectedIconPath && item.type == 1)"
+					></image>
+					<text
+						class="tui-navigation-text"
+						:style="{
+							color: isDarkMode ? '#fff' : current == index && item.type == 1 ? selectedColor : item.color || color,
+							fontWeight: current == index && bold && item.type == 1 ? 'bold' : 'normal',
+							fontSize: fontSize
+						}"
+					>
+						{{ item.text }}
+					</text>
+				</view>
+				<view
+					class="tui-navigation-popup"
+					:class="{ 'tui-navigation-popup_show': showMenuIndex == index }"
+					:style="{ backgroundColor: isDarkMode ? '#4c4c4c' : subMenuBgColor, left: item.popupLeft || '50%' }"
+					v-if="item.itemList"
+				>
+					<view
+						class="tui-popup-cell"
+						:class="{ 'tui-first-cell': subIndex === 0, 'tui-last-cell': subIndex === item.itemList.length - 1 }"
+						:hover-class="subMenuHover ? (isDarkMode ? 'tui-item-dark_hover' : 'tui-item-hover') : ''"
+						:hover-stay-time="150"
+						v-for="(subItem, subIndex) in item.itemList || []"
+						:key="subIndex"
+						@tap="subMenuClick(index, item.type, subIndex, subItem.parameter)"
+					>
+						<text class="tui-ellipsis" :style="{ color: isDarkMode ? '#fff' : subMenuColor, fontSize: subMenufontSize, lineHeight: subMenufontSize }">
+							{{ subItem.text }}
+						</text>
+					</view>
+					<view class="tui-popup-triangle" :style="{ borderTopColor: isDarkMode ? '#4c4c4c' : subMenuBgColor }"></view>
+				</view>
+			</view>
+		</view>
+		<view class="tui-navigation-mask" :class="{ 'tui-navigation-mask_show': showMenuIndex != -1 }" @tap="handleClose"></view>
+	</view>
+</template>
+
+<script>
+export default {
+	name: 'tuiBottomNavigation',
+	props: {
+		//当前索引
+		current: {
+			type: Number,
+			default: 0
+		},
+		/**
+		 * {
+				text: 'ThorUI',
+				iconPath: '/static/images/common/icon_menu_gray.png',
+				selectedIconPath: '/static/images/common/icon_menu_gray.png',
+				color: '#666',
+				//1-选中切换,2-跳转、请求、其他操作,3-菜单
+				type: 3,
+				//自定义参数,类型自定义
+				parameter: null,
+				//子菜单left值,不传默认50%,当菜单贴近左右两边可用此参数调整
+				popupLeft: '',
+				itemList: [
+					{
+						//不建议超过6个字,请自行控制
+						text: '自定义参',
+						//自定义参数,类型自定义
+						parameter: null
+					},
+					{
+						text: '自定义参数',
+						//自定义参数,类型自定义
+						parameter: null
+					}
+				]
+			}
+		 * 
+		 * */
+		itemList: {
+			type: Array,
+			default: () => {
+				return [];
+			}
+		},
+		//颜色
+		color: {
+			type: String,
+			default: '#666'
+		},
+		//选中颜色
+		selectedColor: {
+			type: String,
+			default: '#5677fc'
+		},
+		fontSize: {
+			type: String,
+			default: '28rpx'
+		},
+		//选中后字体是否加粗
+		bold: {
+			type: Boolean,
+			default: true
+		},
+		//导航条背景颜色
+		backgroundColor: {
+			type: String,
+			default: '#F8F8F8'
+		},
+		//item分割线高度是否缩小
+		splitLineScale: {
+			type: Boolean,
+			default: true
+		},
+		//二级菜单字体颜色
+		subMenuColor: {
+			type: String,
+			default: '#333'
+		},
+		//二级菜单字体大小
+		subMenufontSize: {
+			type: String,
+			default: '28rpx'
+		},
+		//二级菜单背景色  深色:#4c4c4c
+		subMenuBgColor: {
+			type: String,
+			default: '#fff'
+		},
+		//二级菜单是否有点击效果
+		subMenuHover: {
+			type: Boolean,
+			default: true
+		},
+		//是否固定在底部
+		isFixed: {
+			type: Boolean,
+			default: true
+		},
+		//去除导航栏顶部的线条
+		unlined: {
+			type: Boolean,
+			default: false
+		},
+		//是否暗黑模式 (true:所有设置颜色失效)
+		isDarkMode: {
+			type: Boolean,
+			default: false
+		}
+	},
+	filters: {
+		getIcon: function(current, index, item) {
+			let url = item.iconPath;
+			if (item.type == 1) {
+				url = current == index ? item.selectedIconPath || item.iconPath : item.iconPath;
+			}
+			return url;
+		}
+	},
+	data() {
+		return {
+			showMenuIndex: -1 //显示的菜单index
+		};
+	},
+	methods: {
+		stop() {
+			return false;
+		},
+		handleClose() {
+			this.showMenuIndex = -1;
+		},
+		menuClick(index, parameter, type) {
+			//type:1-选中切换,2-跳转、请求、其他操作,3-菜单
+			if (type == 3) {
+				this.showMenuIndex = this.showMenuIndex == index ? -1 : index;
+			} else {
+				this.showMenuIndex = -1;
+				this.$emit('click', {
+					menu: 'main', //main,sub 主菜单,子菜单
+					type: type,
+					index: index,
+					parameter: parameter || ''
+				});
+			}
+		},
+		subMenuClick(index, type, subIndex, parameter) {
+			this.showMenuIndex = -1;
+			this.$emit('click', {
+				menu: 'sub', //main,sub 主菜单,子菜单
+				type: type,
+				index: index,
+				subIndex: subIndex,
+				parameter: parameter || ''
+			});
+		}
+	}
+};
+</script>
+
+<style scoped>
+.tui-bottom-navigation {
+	width: 100%;
+	height: 100rpx;
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	position: relative;
+	z-index: 999;
+}
+
+.tui-navigation-fixed {
+	position: fixed !important;
+	left: 0;
+	bottom: 0;
+	padding-bottom: env(safe-area-inset-bottom);
+}
+
+.tui-bottom-navigation::after {
+	content: '';
+	width: 100%;
+	border-top: 1rpx solid #bfbfbf;
+	position: absolute;
+	top: 0;
+	left: 0;
+	transform: scaleY(0.5) translateZ(0);
+	transform-origin: 0 0;
+	z-index: 1000;
+}
+.tui-remove-splitLine::before {
+	border-top: 0 !important;
+}
+
+.tui-navigation-item {
+	flex: 1;
+	height: 100rpx;
+	position: relative;
+	box-sizing: border-box;
+}
+
+.tui-item-inner {
+	width: 100%;
+	height: 100rpx;
+	display: flex;
+	text-align: center;
+	align-items: center;
+	justify-content: center;
+}
+
+.tui-navigation-item::after {
+	height: 100%;
+	content: '';
+	position: absolute;
+	border-right: 1rpx solid #bfbfbf;
+	transform: scaleX(0.5) translateZ(0);
+	right: 0;
+	top: 0;
+}
+
+.tui-item-after_height::after {
+	height: 40% !important;
+	top: 30% !important;
+}
+
+.tui-last-item::after {
+	border-right: 0 !important;
+}
+
+.tui-navigation-img {
+	width: 32rpx;
+	height: 32rpx;
+	margin-right: 8rpx;
+}
+
+.tui-navigation-popup {
+	max-width: 160%;
+	width: auto;
+	position: absolute;
+	border-radius: 8rpx;
+	visibility: hidden;
+	opacity: 0;
+	transform: translate3d(-50%, 0, 0);
+	transform-origin: center;
+	transition: all 0.12s ease-in-out;
+	bottom: 0;
+	z-index: -1;
+}
+
+.tui-navigation-popup_show {
+	transform: translate3d(-50%, -124rpx, 0);
+	visibility: visible;
+	opacity: 1;
+}
+
+.tui-popup-triangle {
+	position: absolute;
+	width: 0;
+	height: 0;
+	border-left: 9rpx solid transparent;
+	border-right: 9rpx solid transparent;
+	border-top: 18rpx solid;
+	left: 50%;
+	bottom: -18rpx;
+	-webkit-transform: translateX(-50%);
+	transform: translateX(-50%);
+	z-index: 997;
+}
+
+.tui-popup-cell {
+	width: 100%;
+	padding: 32rpx 20rpx;
+	box-sizing: border-box;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	flex: 1;
+	position: relative;
+}
+
+.tui-ellipsis {
+	white-space: nowrap;
+	overflow: hidden;
+	text-overflow: ellipsis;
+}
+
+.tui-popup-cell::after {
+	content: '';
+	position: absolute;
+	border-bottom: 1rpx solid #eaeef1;
+	-webkit-transform: scaleY(0.5);
+	transform: scaleY(0.5);
+	bottom: 0;
+	right: 24rpx;
+	left: 24rpx;
+}
+
+.tui-item-hover {
+	background-color: #f1f1f1;
+}
+
+.tui-item-dark_hover {
+	background-color: #555;
+}
+
+.tui-first-cell {
+	border-top-left-radius: 8rpx;
+	border-top-right-radius: 8rpx;
+}
+
+.tui-last-cell {
+	border-bottom-left-radius: 8rpx;
+	border-bottom-right-radius: 8rpx;
+}
+
+.tui-last-cell::after {
+	border-bottom: 0 !important;
+}
+
+.tui-navigation-mask {
+	position: fixed;
+	top: 0;
+	left: 0;
+	right: 0;
+	bottom: 0;
+	z-index: 995;
+	transition: all 0.3s ease-in-out;
+	opacity: 0;
+	visibility: hidden;
+	background-color: rgba(0, 0, 0, 0);
+}
+
+.tui-navigation-mask_show {
+	opacity: 1;
+	visibility: visible;
+}
+</style>

+ 96 - 0
components/thorui/tui-bottom-popup/tui-bottom-popup.vue

@@ -0,0 +1,96 @@
+<template>
+	<view @touchmove.stop.prevent>
+		<view class="tui-popup-class tui-bottom-popup" :class="{'tui-popup-show':show,'tui-popup-radius':radius}" :style="{backgroundColor:backgroundColor,height:height?height+'rpx':'auto'}">
+			<slot></slot>
+		</view>
+		<view class="tui-popup-mask" :class="[show?'tui-mask-show':'']" v-if="mask" @tap="handleClose"></view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "tuiBottomPopup",
+		props: {
+			//是否需要mask
+			mask: {
+				type: Boolean,
+				default: true
+			},
+			//控制显示
+			show: {
+				type: Boolean,
+				default: false
+			},
+			//背景颜色
+			backgroundColor: {
+				type: String,
+				default: "#fff"
+			},
+			//高度 rpx
+			height: {
+				type: Number,
+				default: 0
+			},
+			//设置圆角
+			radius:{
+				type:Boolean,
+				default:true
+			}
+		},
+		methods: {
+			handleClose() {
+				if (!this.show) {
+					return;
+				}
+				this.$emit('close', {});
+			}
+		}
+	}
+</script>
+
+<style scoped>
+	.tui-bottom-popup {
+		width: 100%;
+		position: fixed;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		z-index: 997;
+		/* visibility: hidden; */
+		opacity: 0;
+		transform: translate3d(0, 100%, 0);
+		transform-origin: center;
+		transition: all 0.3s ease-in-out;
+		min-height: 20rpx;
+	}
+	.tui-popup-radius {
+		border-top-left-radius: 24rpx;
+		border-top-right-radius: 24rpx;
+		padding-bottom: env(safe-area-inset-bottom);
+		overflow: hidden;
+	}
+
+	.tui-popup-show {
+		transform: translate3d(0, 0, 0);
+		opacity: 1;
+		/* visibility: visible; */
+	}
+
+	.tui-popup-mask {
+		position: fixed;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		background-color: rgba(0, 0, 0, 0.6);
+		z-index: 996;
+		transition: all 0.3s ease-in-out;
+		opacity: 0;
+		visibility: hidden;
+	}
+
+	.tui-mask-show {
+		opacity: 1;
+		visibility: visible;
+	}
+</style>

+ 203 - 0
components/thorui/tui-bubble-popup/tui-bubble-popup.vue

@@ -0,0 +1,203 @@
+<template>
+	<view :class="{ 'tui-flex-end': flexEnd }">
+		<view class="tui-popup-list" :class="{ 'tui-popup-show': show,'tui-z_index':show && position!='relative' }" :style="{ width: width, backgroundColor: backgroundColor, borderRadius: radius, color: color, position: position, left: left, right: right, bottom: bottom, top: top,transform:`translate(${translateX},${translateY})` }">
+			<view class="tui-triangle" :style="{
+					borderWidth: borderWidth,
+					borderColor: `transparent transparent ${backgroundColor} transparent`,
+					left: triangleLeft,
+					right: triangleRight,
+					top: triangleTop,
+					bottom: triangleBottom
+				}"
+			 v-if="direction == 'top'"></view>
+			<view class="tui-triangle" :style="{
+					borderWidth: borderWidth,
+					borderColor: `${backgroundColor}  transparent transparent transparent`,
+					left: triangleLeft,
+					right: triangleRight,
+					top: triangleTop,
+					bottom: triangleBottom
+				}"
+			 v-if="direction == 'bottom'"></view>
+			<view class="tui-triangle" :style="{
+					borderWidth: borderWidth,
+					borderColor: `transparent  ${backgroundColor} transparent transparent`,
+					left: triangleLeft,
+					right: triangleRight,
+					top: triangleTop,
+					bottom: triangleBottom
+				}"
+			 v-if="direction == 'left'"></view>
+			<view class="tui-triangle" :style="{
+					borderWidth: borderWidth,
+					borderColor: `transparent transparent  transparent ${backgroundColor}`,
+					left: triangleLeft,
+					right: triangleRight,
+					top: triangleTop,
+					bottom: triangleBottom
+				}"
+			 v-if="direction == 'right'"></view>
+			<slot />
+		</view>
+		<view @touchmove.stop.prevent="stop" class="tui-popup-mask" :class="{ 'tui-popup-show': show }" :style="{ backgroundColor: maskBgColor }"
+		 v-if="mask" @tap="handleClose"></view>
+	</view>
+</template>
+<script>
+	export default {
+		name: 'tuiBubblePopup',
+		props: {
+			//宽度
+			width: {
+				type: String,
+				default: '300rpx'
+			},
+			//popup圆角
+			radius: {
+				type: String,
+				default: '8rpx'
+			},
+			//popup 定位 left right top bottom值
+			left: {
+				type: String,
+				default: 'auto'
+			},
+			right: {
+				type: String,
+				default: 'auto'
+			},
+			top: {
+				type: String,
+				default: 'auto'
+			},
+			bottom: {
+				type: String,
+				default: 'auto'
+			},
+			translateX:{
+				type: String,
+				default: '0'
+			},
+			translateY:{
+				type: String,
+				default: '0'
+			},
+			//背景颜色
+			backgroundColor: {
+				type: String,
+				default: '#4c4c4c'
+			},
+			//字体颜色
+			color: {
+				type: String,
+				default: '#fff'
+			},
+			//三角border-width
+			borderWidth: {
+				type: String,
+				default: '12rpx'
+			},
+			//三角形方向 top left right bottom
+			direction: {
+				type: String,
+				default: 'top'
+			},
+			//定位 left right top bottom值
+			triangleLeft: {
+				type: String,
+				default: 'auto'
+			},
+			triangleRight: {
+				type: String,
+				default: 'auto'
+			},
+			triangleTop: {
+				type: String,
+				default: 'auto'
+			},
+			triangleBottom: {
+				type: String,
+				default: 'auto'
+			},
+			//定位 relative absolute  fixed
+			position: {
+				type: String,
+				default: 'fixed'
+			},
+			//flex-end
+			flexEnd: {
+				type: Boolean,
+				default: false
+			},
+			//是否需要mask
+			mask: {
+				type: Boolean,
+				default: true
+			},
+			maskBgColor: {
+				type: String,
+				default: 'rgba(0, 0, 0, 0.4)'
+			},
+			//控制显示
+			show: {
+				type: Boolean,
+				default: false
+			}
+		},
+		methods: {
+			handleClose() {
+				if (!this.show) {
+					return;
+				}
+				this.$emit('close', {});
+			},
+			stop() {
+				return false;
+			}
+		}
+	};
+</script>
+
+<style scoped>
+	.tui-popup-list {
+		z-index: 1;
+		transition: all 0.3s ease-in-out;
+		opacity: 0;
+		visibility: hidden;
+	}
+
+	.tui-flex-end {
+		width: 100%;
+		display: flex;
+		justify-content: flex-end;
+	}
+
+	.tui-triangle {
+		position: absolute;
+		width: 0;
+		height: 0;
+		border-style: solid;
+		z-index: 997;
+	}
+
+	.tui-popup-mask {
+		position: fixed;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		z-index: 995;
+		transition: all 0.3s ease-in-out;
+		opacity: 0;
+		visibility: hidden;
+	}
+
+	.tui-popup-show {
+		opacity: 1;
+		visibility: visible;
+	}
+
+	.tui-z_index {
+		z-index: 996;
+	}
+</style>

+ 401 - 0
components/thorui/tui-button/tui-button.vue

@@ -0,0 +1,401 @@
+<template>
+	<button class="tui-btn" :class="[
+			plain ? 'tui-' + type + '-outline' : 'tui-btn-' + (type || 'primary'),
+			getDisabledClass(disabled, type, plain),
+			getShapeClass(shape, plain),
+			getShadowClass(type, shadow, plain)
+		]"
+	 :hover-class="getHoverClass(disabled, type, plain)" :style="{ width: width, height: height, lineHeight: height, fontSize: size + 'rpx',margin:margin }"
+	 :loading="loading" :open-type="openType" @getuserinfo="bindgetuserinfo" :disabled="disabled" @tap="handleClick">
+		<slot></slot>
+	</button>
+</template>
+
+<script>
+	export default {
+		name: 'tuiButton',
+		props: {
+			//样式类型 primary, white, danger, warning, green,blue, gray,black
+			type: {
+				type: String,
+				default: 'primary'
+			},
+			//是否加阴影
+			shadow: {
+				type: Boolean,
+				default: false
+			},
+			// 宽度 rpx或 %
+			width: {
+				type: String,
+				default: '100%'
+			},
+			//高度 rpx
+			height: {
+				type: String,
+				default: '96rpx'
+			},
+			//字体大小 rpx
+			size: {
+				type: Number,
+				default: 32
+			},
+			margin: {
+				type: String,
+				default: "0"
+			},
+			//形状 circle(圆角), square(默认方形),rightAngle(平角)
+			shape: {
+				type: String,
+				default: 'square'
+			},
+			plain: {
+				type: Boolean,
+				default: false
+			},
+			disabled: {
+				type: Boolean,
+				default: false
+			},
+			//禁用后背景是否为灰色 (非空心button生效)
+			disabledGray: {
+				type: Boolean,
+				default: false
+			},
+			loading: {
+				type: Boolean,
+				default: false
+			},
+			openType: {
+				type: String,
+				default: ''
+			},
+			index: {
+				type: [Number, String],
+				default: 0
+			}
+		},
+		methods: {
+			handleClick() {
+				if (this.disabled) return false;
+				this.$emit('click', {
+					index: Number(this.index)
+				});
+			},
+			bindgetuserinfo({
+				detail = {}
+			} = {}) {
+				this.$emit('getuserinfo', detail);
+			},
+			getShadowClass: function(type, shadow, plain) {
+				let className = '';
+				if (shadow && type != 'white' && !plain) {
+					className = 'tui-shadow-' + type;
+				}
+				return className;
+			},
+			getDisabledClass: function(disabled, type, plain) {
+				let className = '';
+				if (disabled && type != 'white') {
+					let classVal = this.disabledGray ? 'tui-gray-disabled' : 'tui-dark-disabled';
+					className = plain ? 'tui-dark-disabled-outline' : classVal;
+				}
+				return className;
+			},
+			getShapeClass: function(shape, plain) {
+				let className = '';
+				if (shape == 'circle') {
+					className = plain ? 'tui-outline-fillet' : 'tui-fillet';
+				} else if (shape == 'rightAngle') {
+					className = plain ? 'tui-outline-rightAngle' : 'tui-rightAngle';
+				}
+				return className;
+			},
+			getHoverClass: function(disabled, type, plain) {
+				let className = '';
+				if (!disabled) {
+					className = plain ? 'tui-outline-hover' : 'tui-' + (type || 'primary') + '-hover';
+				}
+				return className;
+			}
+		}
+	};
+</script>
+
+<style scoped>
+	.tui-btn-primary {
+		background: #5677fc !important;
+		color: #fff;
+	}
+
+	.tui-shadow-primary {
+		box-shadow: 0 10rpx 14rpx 0 rgba(86, 119, 252, 0.2);
+	}
+
+	.tui-btn-danger {
+		background: #eb0909 !important;
+		color: #fff;
+	}
+
+	.tui-shadow-danger {
+		box-shadow: 0 10rpx 14rpx 0 rgba(235, 9, 9, 0.2);
+	}
+
+	.tui-btn-warning {
+		background: #fc872d !important;
+		color: #fff;
+	}
+
+	.tui-shadow-warning {
+		box-shadow: 0 10rpx 14rpx 0 rgba(252, 135, 45, 0.2);
+	}
+
+	.tui-btn-green {
+		background: #35b06a !important;
+		color: #fff;
+	}
+
+	.tui-shadow-green {
+		box-shadow: 0 10rpx 14rpx 0 rgba(53, 176, 106, 0.2);
+	}
+
+	.tui-btn-blue {
+		background: #007AFF !important;
+		color: #fff;
+	}
+
+	.tui-shadow-blue {
+		box-shadow: 0 10rpx 14rpx 0 rgba(0, 122, 255, 0.2);
+	}
+
+	.tui-btn-white {
+		background: #fff !important;
+		color: #333 !important;
+	}
+
+	.tui-btn-gray {
+		background: #bfbfbf !important;
+		color: #fff !important;
+	}
+
+	.tui-btn-black {
+		background: #333 !important;
+		color: #fff !important;
+	}
+
+	.tui-shadow-gray {
+		box-shadow: 0 10rpx 14rpx 0 rgba(191, 191, 191, 0.2);
+	}
+
+	.tui-hover-gray {
+		background: #f7f7f9 !important;
+	}
+
+	.tui-black-hover {
+		background: #555 !important;
+		color: #e5e5e5 !important;
+	}
+
+	/* button start*/
+
+	.tui-btn {
+		width: 100%;
+		position: relative;
+		border: 0 !important;
+		border-radius: 6rpx;
+		padding-left: 0;
+		padding-right: 0;
+		overflow: visible;
+	}
+
+	.tui-btn::after {
+		content: '';
+		position: absolute;
+		width: 200%;
+		height: 200%;
+		transform-origin: 0 0;
+		transform: scale(0.5, 0.5) translateZ(0);
+		box-sizing: border-box;
+		left: 0;
+		top: 0;
+		border-radius: 12rpx;
+		border: 0;
+	}
+
+	.tui-btn-white::after {
+		border: 1rpx solid #bfbfbf;
+	}
+
+	.tui-white-hover {
+		background: #e5e5e5 !important;
+		color: #2e2e2e !important;
+	}
+
+	.tui-dark-disabled {
+		opacity: 0.6 !important;
+		color: #fafbfc !important;
+	}
+
+	.tui-dark-disabled-outline {
+		opacity: 0.5 !important;
+	}
+
+	.tui-gray-disabled {
+		background: #f3f3f3 !important;
+		color: #919191 !important;
+		box-shadow: none;
+	}
+
+	.tui-outline-hover {
+		opacity: 0.5;
+	}
+
+	.tui-primary-hover {
+		background: #4a67d6 !important;
+		color: #e5e5e5 !important;
+	}
+
+	.tui-primary-outline::after {
+		border: 1rpx solid #5677fc !important;
+	}
+
+	.tui-primary-outline {
+		color: #5677fc !important;
+		background: transparent;
+	}
+
+	.tui-danger-hover {
+		background: #c80808 !important;
+		color: #e5e5e5 !important;
+	}
+
+	.tui-danger-outline {
+		color: #eb0909 !important;
+		background: transparent;
+	}
+
+	.tui-danger-outline::after {
+		border: 1rpx solid #eb0909 !important;
+	}
+
+	.tui-warning-hover {
+		background: #d67326 !important;
+		color: #e5e5e5 !important;
+	}
+
+	.tui-warning-outline {
+		color: #fc872d !important;
+		background: transparent;
+	}
+
+	.tui-warning-outline::after {
+		border: 1px solid #fc872d !important;
+	}
+
+	.tui-green-hover {
+		background: #2d965a !important;
+		color: #e5e5e5 !important;
+	}
+
+	.tui-green-outline {
+		color: #35b06a !important;
+		background: transparent;
+	}
+
+	.tui-green-outline::after {
+		border: 1rpx solid #35b06a !important;
+	}
+
+	.tui-blue-hover {
+		background: #0062CC !important;
+		color: #e5e5e5 !important;
+	}
+
+	.tui-blue-outline {
+		color: #007AFF !important;
+		background: transparent;
+	}
+
+	.tui-blue-outline::after {
+		border: 1rpx solid #007AFF !important;
+	}
+
+	/* #ifndef APP-NVUE */
+	.tui-btn-gradual {
+		background: linear-gradient(90deg, rgb(255, 89, 38), rgb(240, 14, 44)) !important;
+		color: #fff !important;
+	}
+
+	.tui-shadow-gradual {
+		box-shadow: 0 10rpx 14rpx 0 rgba(235, 9, 9, 0.15);
+	}
+
+	/* #endif */
+
+	.tui-gray-hover {
+		background: #a3a3a3 !important;
+		color: #898989;
+	}
+
+	/* #ifndef APP-NVUE */
+	.tui-gradual-hover {
+		background: linear-gradient(90deg, #d74620, #cd1225) !important;
+		color: #fff !important;
+	}
+
+	/* #endif */
+
+	.tui-gray-outline {
+		color: #999 !important;
+		background: transparent !important;
+	}
+
+	.tui-white-outline {
+		color: #fff !important;
+		background: transparent !important;
+	}
+
+	.tui-black-outline {
+		background: transparent !important;
+		color: #333 !important;
+	}
+
+	.tui-gray-outline::after {
+		border: 1rpx solid #ccc !important;
+	}
+
+	.tui-white-outline::after {
+		border: 1px solid #fff !important;
+	}
+
+	.tui-black-outline::after {
+		border: 1px solid #333 !important;
+	}
+
+	/*圆角 */
+
+	.tui-fillet {
+		border-radius: 50rpx;
+	}
+
+	.tui-btn-white.tui-fillet::after {
+		border-radius: 98rpx;
+	}
+
+	.tui-outline-fillet::after {
+		border-radius: 98rpx;
+	}
+
+	/*平角*/
+	.tui-rightAngle {
+		border-radius: 0;
+	}
+
+	.tui-btn-white.tui-rightAngle::after {
+		border-radius: 0;
+	}
+
+	.tui-outline-rightAngle::after {
+		border-radius: 0;
+	}
+</style>

+ 562 - 0
components/thorui/tui-calendar/tui-calendar.js

@@ -0,0 +1,562 @@
+/**
+ * @1900-2100区间内的公历、农历互转
+ * @公历转农历:solar2lunar(1987,11,01); 
+ * @农历转公历:lunar2solar(1987,09,10); 
+ */
+let calendar = {
+	/**
+	 * 农历1900-2100的润大小信息表
+	 * @Array Of Property
+	 * @return Hex
+	 */
+	lunarInfo: [0x04bd8, 0x04ae0, 0x0a570, 0x054d5, 0x0d260, 0x0d950, 0x16554, 0x056a0, 0x09ad0, 0x055d2, //1900-1909
+		0x04ae0, 0x0a5b6, 0x0a4d0, 0x0d250, 0x1d255, 0x0b540, 0x0d6a0, 0x0ada2, 0x095b0, 0x14977, //1910-1919
+		0x04970, 0x0a4b0, 0x0b4b5, 0x06a50, 0x06d40, 0x1ab54, 0x02b60, 0x09570, 0x052f2, 0x04970, //1920-1929
+		0x06566, 0x0d4a0, 0x0ea50, 0x06e95, 0x05ad0, 0x02b60, 0x186e3, 0x092e0, 0x1c8d7, 0x0c950, //1930-1939
+		0x0d4a0, 0x1d8a6, 0x0b550, 0x056a0, 0x1a5b4, 0x025d0, 0x092d0, 0x0d2b2, 0x0a950, 0x0b557, //1940-1949
+		0x06ca0, 0x0b550, 0x15355, 0x04da0, 0x0a5b0, 0x14573, 0x052b0, 0x0a9a8, 0x0e950, 0x06aa0, //1950-1959
+		0x0aea6, 0x0ab50, 0x04b60, 0x0aae4, 0x0a570, 0x05260, 0x0f263, 0x0d950, 0x05b57, 0x056a0, //1960-1969
+		0x096d0, 0x04dd5, 0x04ad0, 0x0a4d0, 0x0d4d4, 0x0d250, 0x0d558, 0x0b540, 0x0b6a0, 0x195a6, //1970-1979
+		0x095b0, 0x049b0, 0x0a974, 0x0a4b0, 0x0b27a, 0x06a50, 0x06d40, 0x0af46, 0x0ab60, 0x09570, //1980-1989
+		0x04af5, 0x04970, 0x064b0, 0x074a3, 0x0ea50, 0x06b58, 0x055c0, 0x0ab60, 0x096d5, 0x092e0, //1990-1999
+		0x0c960, 0x0d954, 0x0d4a0, 0x0da50, 0x07552, 0x056a0, 0x0abb7, 0x025d0, 0x092d0, 0x0cab5, //2000-2009
+		0x0a950, 0x0b4a0, 0x0baa4, 0x0ad50, 0x055d9, 0x04ba0, 0x0a5b0, 0x15176, 0x052b0, 0x0a930, //2010-2019
+		0x07954, 0x06aa0, 0x0ad50, 0x05b52, 0x04b60, 0x0a6e6, 0x0a4e0, 0x0d260, 0x0ea65, 0x0d530, //2020-2029
+		0x05aa0, 0x076a3, 0x096d0, 0x04afb, 0x04ad0, 0x0a4d0, 0x1d0b6, 0x0d250, 0x0d520, 0x0dd45, //2030-2039
+		0x0b5a0, 0x056d0, 0x055b2, 0x049b0, 0x0a577, 0x0a4b0, 0x0aa50, 0x1b255, 0x06d20, 0x0ada0, //2040-2049
+		0x14b63, 0x09370, 0x049f8, 0x04970, 0x064b0, 0x168a6, 0x0ea50, 0x06b20, 0x1a6c4, 0x0aae0, //2050-2059
+		0x0a2e0, 0x0d2e3, 0x0c960, 0x0d557, 0x0d4a0, 0x0da50, 0x05d55, 0x056a0, 0x0a6d0, 0x055d4, //2060-2069
+		0x052d0, 0x0a9b8, 0x0a950, 0x0b4a0, 0x0b6a6, 0x0ad50, 0x055a0, 0x0aba4, 0x0a5b0, 0x052b0, //2070-2079
+		0x0b273, 0x06930, 0x07337, 0x06aa0, 0x0ad50, 0x14b55, 0x04b60, 0x0a570, 0x054e4, 0x0d160, //2080-2089
+		0x0e968, 0x0d520, 0x0daa0, 0x16aa6, 0x056d0, 0x04ae0, 0x0a9d4, 0x0a2d0, 0x0d150, 0x0f252, //2090-2099
+		0x0d520
+	], //2100
+	/**
+	 * 公历每个月份的天数普通表
+	 * @Array Of Property
+	 * @return Number
+	 */
+	solarMonth: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
+	/**
+	 * 天干地支之天干速查表
+	 * @Array Of Property trans["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"]
+	 * @return Cn string
+	 */
+	Gan: ["\u7532", "\u4e59", "\u4e19", "\u4e01", "\u620a", "\u5df1", "\u5e9a", "\u8f9b", "\u58ec", "\u7678"],
+	/**
+	 * 天干地支之地支速查表
+	 * @Array Of Property
+	 * @trans["子","丑","寅","卯","辰","巳","午","未","申","酉","戌","亥"]
+	 * @return Cn string
+	 */
+	Zhi: ["\u5b50", "\u4e11", "\u5bc5", "\u536f", "\u8fb0", "\u5df3", "\u5348", "\u672a", "\u7533", "\u9149", "\u620c",
+		"\u4ea5"
+	],
+	/**
+	 * 天干地支之地支速查表<=>生肖
+	 * @Array Of Property
+	 * @trans["鼠","牛","虎","兔","龙","蛇","马","羊","猴","鸡","狗","猪"]
+	 * @return Cn string
+	 */
+	Animals: ["\u9f20", "\u725b", "\u864e", "\u5154", "\u9f99", "\u86c7", "\u9a6c", "\u7f8a", "\u7334", "\u9e21",
+		"\u72d7", "\u732a"
+	],
+	/**
+	 * 24节气速查表
+	 * @Array Of Property
+	 * @trans["小寒","大寒","立春","雨水","惊蛰","春分","清明","谷雨","立夏","小满","芒种","夏至","小暑","大暑","立秋","处暑","白露","秋分","寒露","霜降","立冬","小雪","大雪","冬至"]
+	 * @return Cn string
+	 */
+	solarTerm: ["\u5c0f\u5bd2", "\u5927\u5bd2", "\u7acb\u6625", "\u96e8\u6c34", "\u60ca\u86f0", "\u6625\u5206",
+		"\u6e05\u660e", "\u8c37\u96e8", "\u7acb\u590f", "\u5c0f\u6ee1", "\u8292\u79cd", "\u590f\u81f3", "\u5c0f\u6691",
+		"\u5927\u6691", "\u7acb\u79cb", "\u5904\u6691", "\u767d\u9732", "\u79cb\u5206", "\u5bd2\u9732", "\u971c\u964d",
+		"\u7acb\u51ac", "\u5c0f\u96ea", "\u5927\u96ea", "\u51ac\u81f3"
+	],
+	/**
+	 * 1900-2100各年的24节气日期速查表
+	 * @Array Of Property
+	 * @return 0x string For splice
+	 */
+	sTermInfo: ['9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f',
+		'97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
+		'97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f', 'b027097bd097c36b0b6fc9274c91aa',
+		'97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd0b06bdb0722c965ce1cfcc920f',
+		'b027097bd097c36b0b6fc9274c91aa', '9778397bd19801ec9210c965cc920e', '97b6b97bd19801ec95f8c965cc920f',
+		'97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2', '9778397bd197c36c9210c9274c91aa',
+		'97b6b97bd19801ec95f8c965cc920e', '97bd09801d98082c95f8e1cfcc920f', '97bd097bd097c36b0b6fc9210c8dc2',
+		'9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec95f8c965cc920e', '97bcf97c3598082c95f8e1cfcc920f',
+		'97bd097bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e',
+		'97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+		'97b6b97bd19801ec9210c965cc920e', '97bcf97c3598082c95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722',
+		'9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f',
+		'97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
+		'97bcf97c359801ec95f8c965cc920f', '97bd097bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+		'97b6b97bd19801ec9210c965cc920e', '97bcf97c359801ec95f8c965cc920f', '97bd097bd07f595b0b6fc920fb0722',
+		'9778397bd097c36b0b6fc9210c8dc2', '9778397bd19801ec9210c9274c920e', '97b6b97bd19801ec95f8c965cc920f',
+		'97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e',
+		'97b6b97bd19801ec95f8c965cc920f', '97bd07f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2',
+		'9778397bd097c36c9210c9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bd07f1487f595b0b0bc920fb0722',
+		'7f0e397bd097c36b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
+		'97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+		'97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722',
+		'9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e', '97bcf7f1487f531b0b0bb0b6fb0722',
+		'7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b97bd19801ec9210c965cc920e',
+		'97bcf7f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+		'97b6b97bd19801ec9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722',
+		'9778397bd097c36b0b6fc9210c91aa', '97b6b97bd197c36c9210c9274c920e', '97bcf7f0e47f531b0b0bb0b6fb0722',
+		'7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '9778397bd097c36c9210c9274c920e',
+		'97b6b7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c36b0b6fc9210c8dc2',
+		'9778397bd097c36b0b70c9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722',
+		'7f0e397bd097c35b0b6fc9210c8dc2', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721',
+		'7f0e27f1487f595b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+		'97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722',
+		'9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722',
+		'7f0e397bd097c35b0b6fc920fb0722', '9778397bd097c36b0b6fc9274c91aa', '97b6b7f0e47f531b0723b0b6fb0721',
+		'7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9274c91aa',
+		'97b6b7f0e47f531b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722',
+		'9778397bd097c36b0b6fc9210c91aa', '97b6b7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722',
+		'7f0e397bd07f595b0b0bc920fb0722', '9778397bd097c36b0b6fc9210c8dc2', '977837f0e37f149b0723b0787b0721',
+		'7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f5307f595b0b0bc920fb0722', '7f0e397bd097c35b0b6fc9210c8dc2',
+		'977837f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e37f1487f595b0b0bb0b6fb0722',
+		'7f0e397bd097c35b0b6fc9210c8dc2', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
+		'7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722', '977837f0e37f14998082b0787b06bd',
+		'7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd097c35b0b6fc920fb0722',
+		'977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722',
+		'7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
+		'7f0e27f1487f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14998082b0787b06bd',
+		'7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0b0bb0b6fb0722', '7f0e397bd07f595b0b0bc920fb0722',
+		'977837f0e37f14998082b0723b06bd', '7f07e7f0e37f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722',
+		'7f0e397bd07f595b0b0bc920fb0722', '977837f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b0721',
+		'7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f595b0b0bb0b6fb0722', '7f0e37f0e37f14898082b0723b02d5',
+		'7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e37f1487f531b0b0bb0b6fb0722',
+		'7f0e37f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
+		'7f0e37f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd',
+		'7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e37f14898082b072297c35',
+		'7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722',
+		'7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f149b0723b0787b0721',
+		'7f0e27f1487f531b0b0bb0b6fb0722', '7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14998082b0723b06bd',
+		'7f07e7f0e47f149b0723b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722', '7f0e37f0e366aa89801eb072297c35',
+		'7ec967f0e37f14998082b0723b06bd', '7f07e7f0e37f14998083b0787b0721', '7f0e27f0e47f531b0723b0b6fb0722',
+		'7f0e37f0e366aa89801eb072297c35', '7ec967f0e37f14898082b0723b02d5', '7f07e7f0e37f14998082b0787b0721',
+		'7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66aa89801e9808297c35', '665f67f0e37f14898082b0723b02d5',
+		'7ec967f0e37f14998082b0787b0721', '7f07e7f0e47f531b0723b0b6fb0722', '7f0e36665b66a449801e9808297c35',
+		'665f67f0e37f14898082b0723b02d5', '7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721',
+		'7f0e36665b66a449801e9808297c35', '665f67f0e37f14898082b072297c35', '7ec967f0e37f14998082b0787b06bd',
+		'7f07e7f0e47f531b0723b0b6fb0721', '7f0e26665b66a449801e9808297c35', '665f67f0e37f1489801eb072297c35',
+		'7ec967f0e37f14998082b0787b06bd', '7f07e7f0e47f531b0723b0b6fb0721', '7f0e27f1487f531b0b0bb0b6fb0722'
+	],
+	/**
+	 * 数字转中文速查表
+	 * @Array Of Property
+	 * @trans ['日','一','二','三','四','五','六','七','八','九','十']
+	 * @return Cn string
+	 */
+	nStr1: ["\u65e5", "\u4e00", "\u4e8c", "\u4e09", "\u56db", "\u4e94", "\u516d", "\u4e03", "\u516b", "\u4e5d", "\u5341"],
+	/**
+	 * 日期转农历称呼速查表
+	 * @Array Of Property
+	 * @trans ['初','十','廿','卅']
+	 * @return Cn string
+	 */
+	nStr2: ["\u521d", "\u5341", "\u5eff", "\u5345"],
+	/**
+	 * 月份转农历称呼速查表
+	 * @Array Of Property
+	 * @trans ['正','一','二','三','四','五','六','七','八','九','十','冬','腊']
+	 * @return Cn string
+	 */
+	nStr3: ["\u6b63", "\u4e8c", "\u4e09", "\u56db", "\u4e94", "\u516d", "\u4e03", "\u516b", "\u4e5d", "\u5341", "\u51ac",
+		"\u814a"
+	],
+	/**
+	 * 返回农历y年一整年的总天数
+	 * @param lunar Year
+	 * @return Number
+	 * @eg:let count = calendar.lYearDays(1987) ;//count=387
+	 */
+	lYearDays: function(y) {
+		let i, sum = 348;
+		for (i = 0x8000; i > 0x8; i >>= 1) {
+			sum += (calendar.lunarInfo[y - 1900] & i) ? 1 : 0;
+		}
+		return (sum + calendar.leapDays(y));
+	},
+	/**
+	 * 返回农历y年闰月是哪个月;若y年没有闰月 则返回0
+	 * @param lunar Year
+	 * @return Number (0-12)
+	 * @eg:let leapMonth = calendar.leapMonth(1987) ;//leapMonth=6
+	 */
+	leapMonth: function(y) { //闰字编码 \u95f0
+		return (calendar.lunarInfo[y - 1900] & 0xf);
+	},
+	/**
+	 * 返回农历y年闰月的天数 若该年没有闰月则返回0
+	 * @param lunar Year
+	 * @return Number (0、29、30)
+	 * @eg:let leapMonthDay = calendar.leapDays(1987) ;//leapMonthDay=29
+	 */
+	leapDays: function(y) {
+		if (calendar.leapMonth(y)) {
+			return ((calendar.lunarInfo[y - 1900] & 0x10000) ? 30 : 29);
+		}
+		return (0);
+	},
+	/**
+	 * 返回农历y年m月(非闰月)的总天数,计算m为闰月时的天数请使用leapDays方法
+	 * @param lunar Year
+	 * @return Number (-1、29、30)
+	 * @eg:let MonthDay = calendar.monthDays(1987,9) ;//MonthDay=29
+	 */
+	monthDays: function(y, m) {
+		if (m > 12 || m < 1) {
+			return -1
+		} //月份参数从1至12,参数错误返回-1
+		return ((calendar.lunarInfo[y - 1900] & (0x10000 >> m)) ? 30 : 29);
+	},
+	/**
+	 * 返回公历(!)y年m月的天数
+	 * @param solar Year
+	 * @return Number (-1、28、29、30、31)
+	 * @eg:let solarMonthDay = calendar.leapDays(1987) ;//solarMonthDay=30
+	 */
+	solarDays: function(y, m) {
+		if (m > 12 || m < 1) {
+			return -1
+		} //若参数错误 返回-1
+		let ms = m - 1;
+		if (ms == 1) { //2月份的闰平规律测算后确认返回28或29
+			return (((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0)) ? 29 : 28);
+		} else {
+			return (calendar.solarMonth[ms]);
+		}
+	},
+	/**
+	 * 农历年份转换为干支纪年
+	 * @param lYear 农历年的年份数
+	 * @return Cn string
+	 */
+	toGanZhiYear: function(lYear) {
+		let ganKey = (lYear - 3) % 10;
+		let zhiKey = (lYear - 3) % 12;
+		if (ganKey == 0) ganKey = 10; //如果余数为0则为最后一个天干
+		if (zhiKey == 0) zhiKey = 12; //如果余数为0则为最后一个地支
+		return calendar.Gan[ganKey - 1] + calendar.Zhi[zhiKey - 1];
+	},
+	/**
+	 * 公历月、日判断所属星座
+	 * @param cMonth [description]
+	 * @param cDay [description]
+	 * @return Cn string
+	 */
+	toAstro: function(cMonth, cDay) {
+		let s =
+			"\u9b54\u7faf\u6c34\u74f6\u53cc\u9c7c\u767d\u7f8a\u91d1\u725b\u53cc\u5b50\u5de8\u87f9\u72ee\u5b50\u5904\u5973\u5929\u79e4\u5929\u874e\u5c04\u624b\u9b54\u7faf";
+		let arr = [20, 19, 21, 21, 21, 22, 23, 23, 23, 23, 22, 22];
+		return s.substr(cMonth * 2 - (cDay < arr[cMonth - 1] ? 2 : 0), 2) + "\u5ea7"; //座
+	},
+	/**
+	 * 传入offset偏移量返回干支
+	 * @param offset 相对甲子的偏移量
+	 * @return Cn string
+	 */
+	toGanZhi: function(offset) {
+		return calendar.Gan[offset % 10] + calendar.Zhi[offset % 12];
+	},
+	/**
+	 * 传入公历(!)y年获得该年第n个节气的公历日期
+	 * @param y公历年(1900-2100);n二十四节气中的第几个节气(1~24);从n=1(小寒)算起
+	 * @return day Number
+	 * @eg:let _24 = calendar.getTerm(1987,3) ;//_24=4;意即1987年2月4日立春
+	 */
+	getTerm: function(y, n) {
+		if (y < 1900 || y > 2100) {
+			return -1;
+		}
+		if (n < 1 || n > 24) {
+			return -1;
+		}
+		let _table = calendar.sTermInfo[y - 1900];
+		let _info = [
+			parseInt('0x' + _table.substr(0, 5)).toString(),
+			parseInt('0x' + _table.substr(5, 5)).toString(),
+			parseInt('0x' + _table.substr(10, 5)).toString(),
+			parseInt('0x' + _table.substr(15, 5)).toString(),
+			parseInt('0x' + _table.substr(20, 5)).toString(),
+			parseInt('0x' + _table.substr(25, 5)).toString()
+		];
+		let _calday = [
+			_info[0].substr(0, 1),
+			_info[0].substr(1, 2),
+			_info[0].substr(3, 1),
+			_info[0].substr(4, 2),
+			_info[1].substr(0, 1),
+			_info[1].substr(1, 2),
+			_info[1].substr(3, 1),
+			_info[1].substr(4, 2),
+			_info[2].substr(0, 1),
+			_info[2].substr(1, 2),
+			_info[2].substr(3, 1),
+			_info[2].substr(4, 2),
+			_info[3].substr(0, 1),
+			_info[3].substr(1, 2),
+			_info[3].substr(3, 1),
+			_info[3].substr(4, 2),
+			_info[4].substr(0, 1),
+			_info[4].substr(1, 2),
+			_info[4].substr(3, 1),
+			_info[4].substr(4, 2),
+			_info[5].substr(0, 1),
+			_info[5].substr(1, 2),
+			_info[5].substr(3, 1),
+			_info[5].substr(4, 2),
+		];
+		return parseInt(_calday[n - 1]);
+	},
+	/**
+	 * 传入农历数字月份返回汉语通俗表示法
+	 * @param lunar month
+	 * @return Cn string
+	 * @eg:let cnMonth = calendar.toChinaMonth(12) ;//cnMonth='腊月'
+	 */
+	toChinaMonth: function(m) { // 月 => \u6708
+		if (m > 12 || m < 1) {
+			return -1
+		} //若参数错误 返回-1
+		let s = calendar.nStr3[m - 1];
+		s += "\u6708"; //加上月字
+		return s;
+	},
+	/**
+	 * 传入农历日期数字返回汉字表示法
+	 * @param lunar day
+	 * @return Cn string
+	 * @eg:let cnDay = calendar.toChinaDay(21) ;//cnMonth='廿一'
+	 */
+	toChinaDay: function(d) { //日 => \u65e5
+		let s;
+		switch (d) {
+			case 10:
+				s = '\u521d\u5341';
+				break;
+			case 20:
+				s = '\u4e8c\u5341';
+				break;
+				break;
+			case 30:
+				s = '\u4e09\u5341';
+				break;
+				break;
+			default:
+				s = calendar.nStr2[Math.floor(d / 10)];
+				s += calendar.nStr1[d % 10];
+		}
+		return (s);
+	},
+	/**
+	 * 年份转生肖[!仅能大致转换] => 精确划分生肖分界线是“立春”
+	 * @param y year
+	 * @return Cn string
+	 * @eg:let animal = calendar.getAnimal(1987) ;//animal='兔'
+	 */
+	getAnimal: function(y) {
+		return calendar.Animals[(y - 4) % 12]
+	},
+	/**
+	 * 传入阳历年月日获得详细的公历、农历object信息 <=>JSON
+	 * @param y solar year
+	 * @param m solar month
+	 * @param d solar day
+	 * @return JSON object
+	 * @eg:console.log(calendar.solar2lunar(1987,11,01));
+	 */
+	solar2lunar: function(y, m, d) { //参数区间1900.1.31~2100.12.31
+		if (y < 1900 || y > 2100) {
+			return -1;
+		} //年份限定、上限
+		if (y == 1900 && m == 1 && d < 31) {
+			return -1;
+		} //下限
+		let objDate;
+		if (!y) { //未传参 获得当天
+			 objDate = new Date();
+		} else {
+			 objDate = new Date(y, parseInt(m) - 1, d)
+		}
+		let i, leap = 0,
+			temp = 0;
+		//修正ymd参数
+		y = objDate.getFullYear();
+		m = objDate.getMonth() + 1;
+		d = objDate.getDate();
+		let offset = (Date.UTC(objDate.getFullYear(), objDate.getMonth(), objDate.getDate()) - Date.UTC(1900, 0, 31)) /
+			86400000;
+		for (i = 1900; i < 2101 && offset > 0; i++) {
+			temp = calendar.lYearDays(i);
+			offset -= temp;
+		}
+		if (offset < 0) {
+			offset += temp;
+			i--;
+		}
+		//是否今天
+		let isTodayObj = new Date(),
+			isToday = false;
+		if (isTodayObj.getFullYear() == y && isTodayObj.getMonth() + 1 == m && isTodayObj.getDate() == d) {
+			isToday = true;
+		}
+		//星期几
+		let nWeek = objDate.getDay(),
+			cWeek = calendar.nStr1[nWeek];
+		if (nWeek == 0) {
+			nWeek = 7;
+		} //数字表示周几顺应天朝周一开始的惯例
+		//农历年
+		let year = i;
+		leap = calendar.leapMonth(i); //闰哪个月
+		let isLeap = false;
+		//效验闰月
+		for (i = 1; i < 13 && offset > 0; i++) {
+			//闰月
+			if (leap > 0 && i == (leap + 1) && isLeap == false) {
+				--i;
+				isLeap = true;
+				temp = calendar.leapDays(year); //计算农历闰月天数
+			} else {
+				temp = calendar.monthDays(year, i); //计算农历普通月天数
+			}
+			//解除闰月
+			if (isLeap == true && i == (leap + 1)) {
+				isLeap = false;
+			}
+			offset -= temp;
+		}
+		if (offset == 0 && leap > 0 && i == leap + 1)
+			if (isLeap) {
+				isLeap = false;
+			} else {
+				isLeap = true;
+				--i;
+			}
+		if (offset < 0) {
+			offset += temp;
+			--i;
+		}
+		//农历月
+		let month = i;
+		//农历日
+		let day = offset + 1;
+		//天干地支处理
+		let sm = m - 1;
+		let gzY = calendar.toGanZhiYear(year);
+		//月柱 1900年1月小寒以前为 丙子月(60进制12)
+		let firstNode = calendar.getTerm(year, (m * 2 - 1)); //返回当月「节」为几日开始
+		let secondNode = calendar.getTerm(year, (m * 2)); //返回当月「节」为几日开始
+		//依据12节气修正干支月
+		let gzM = calendar.toGanZhi((y - 1900) * 12 + m + 11);
+		if (d >= firstNode) {
+			gzM = calendar.toGanZhi((y - 1900) * 12 + m + 12);
+		}
+		//传入的日期的节气与否
+		let isTerm = false;
+		let Term = null;
+		if (firstNode == d) {
+			isTerm = true;
+			Term = calendar.solarTerm[m * 2 - 2];
+		}
+		if (secondNode == d) {
+			isTerm = true;
+			Term = calendar.solarTerm[m * 2 - 1];
+		}
+		//日柱 当月一日与 1900/1/1 相差天数
+		let dayCyclical = Date.UTC(y, sm, 1, 0, 0, 0, 0) / 86400000 + 25567 + 10;
+		let gzD = calendar.toGanZhi(dayCyclical + d - 1);
+		//该日期所属的星座
+		let astro = calendar.toAstro(m, d);
+		return {
+			'lYear': year,
+			'lMonth': month,
+			'lDay': day,
+			'Animal': calendar.getAnimal(year),
+			'IMonthCn': (isLeap ? "\u95f0" : '') + calendar.toChinaMonth(month),
+			'IDayCn': calendar.toChinaDay(day),
+			'cYear': y,
+			'cMonth': m,
+			'cDay': d,
+			'gzYear': gzY,
+			'gzMonth': gzM,
+			'gzDay': gzD,
+			'isToday': isToday,
+			'isLeap': isLeap,
+			'nWeek': nWeek,
+			'ncWeek': "\u661f\u671f" + cWeek,
+			'isTerm': isTerm,
+			'Term': Term,
+			'astro': astro
+		};
+	},
+	/**
+	 * 传入农历年月日以及传入的月份是否闰月获得详细的公历、农历object信息 <=>JSON
+	 * @param y lunar year
+	 * @param m lunar month
+	 * @param d lunar day
+	 * @param isLeapMonth lunar month is leap or not.[如果是农历闰月第四个参数赋值true即可]
+	 * @return JSON object
+	 * @eg:console.log(calendar.lunar2solar(1987,9,10));
+	 */
+	lunar2solar: function(y, m, d, isLeapMonth) { //参数区间1900.1.31~2100.12.1
+		isLeapMonth = !!isLeapMonth;
+		let leapOffset = 0;
+		let leapMonth = calendar.leapMonth(y);
+		let leapDay = calendar.leapDays(y);
+		if (isLeapMonth && (leapMonth != m)) {
+			return -1;
+		} //传参要求计算该闰月公历 但该年得出的闰月与传参的月份并不同
+		if (y == 2100 && m == 12 && d > 1 || y == 1900 && m == 1 && d < 31) {
+			return -1;
+		} //超出了最大极限值
+		let day = calendar.monthDays(y, m);
+		let _day = day;
+		//bugFix 2016-9-25
+		//if month is leap, _day use leapDays method
+		if (isLeapMonth) {
+			_day = calendar.leapDays(y, m);
+		}
+		if (y < 1900 || y > 2100 || d > _day) {
+			return -1;
+		} //参数合法性效验
+		//计算农历的时间差
+		let offset = 0;
+		for (let i = 1900; i < y; i++) {
+			offset += calendar.lYearDays(i);
+		}
+		let leap = 0,
+			isAdd = false;
+		for (let i = 1; i < m; i++) {
+			leap = calendar.leapMonth(y);
+			if (!isAdd) { //处理闰月
+				if (leap <= i && leap > 0) {
+					offset += calendar.leapDays(y);
+					isAdd = true;
+				}
+			}
+			offset += calendar.monthDays(y, i);
+		}
+		//转换闰月农历 需补充该年闰月的前一个月的时差
+		if (isLeapMonth) {
+			offset += day;
+		}
+		//1900年农历正月一日的公历时间为1900年1月30日0时0分0秒(该时间也是本农历的最开始起始点)
+		let stmap = Date.UTC(1900, 1, 30, 0, 0, 0);
+		let calObj = new Date((offset + d - 31) * 86400000 + stmap);
+		let cY = calObj.getUTCFullYear();
+		let cM = calObj.getUTCMonth() + 1;
+		let cD = calObj.getUTCDate();
+		return calendar.solar2lunar(cY, cM, cD);
+	}
+};
+
+module.exports = {
+	solar2lunar: calendar.solar2lunar,
+	lunar2solar: calendar.lunar2solar
+};

+ 814 - 0
components/thorui/tui-calendar/tui-calendar.vue

@@ -0,0 +1,814 @@
+<template>
+	<view>
+		<view :class="{ 'tui-bottom-popup': isFixed, 'tui-popup-show': isShow && isFixed }">
+			<view class="tui-calendar-header" :class="{ 'tui-calendar-radius': radius }" @touchmove.stop.prevent="stop" v-if="isFixed">
+				<view>日期选择</view>
+				<view class="tui-iconfont tui-font-close" hover-class="tui-opacity" :hover-stay-time="150" @tap="hide"></view>
+			</view>
+
+			<view class="tui-date-box">
+				<view class="tui-iconfont tui-font-arrowleft" :style="{ color: yearArrowColor }" hover-class="tui-opacity"
+				 :hover-stay-time="150" v-if="arrowType == 1" @tap="changeYear(0)"></view>
+				<view class="tui-iconfont tui-font-arrowleft" :style="{ color: monthArrowColor }" hover-class="tui-opacity"
+				 :hover-stay-time="150" @tap="changeMonth(0)"></view>
+				<view class="tui-date_time">{{ showTitle }}</view>
+				<view class="tui-iconfont tui-font-arrowright" :style="{ color: monthArrowColor }" hover-class="tui-opacity"
+				 :hover-stay-time="150" @tap="changeMonth(1)"></view>
+				<view class="tui-iconfont tui-font-arrowright" :style="{ color: yearArrowColor }" hover-class="tui-opacity"
+				 :hover-stay-time="150" v-if="arrowType == 1" @tap="changeYear(1)"></view>
+			</view>
+			<view class="tui-date-header">
+				<view class="tui-date">日</view>
+				<view class="tui-date">一</view>
+				<view class="tui-date">二</view>
+				<view class="tui-date">三</view>
+				<view class="tui-date">四</view>
+				<view class="tui-date">五</view>
+				<view class="tui-date">六</view>
+			</view>
+			<view class="tui-date-content" :class="{ 'tui-flex-start': isFixed && fixedHeight }" :style="{ height: isFixed && fixedHeight ? dateHeight * 6 + 'px' : 'auto' }">
+				<block v-for="(item, index) in weekdayArr" :key="index">
+					<view class="tui-date"></view>
+				</block>
+				<view class="tui-date" :class="{
+						'tui-date-pd_0': isFixed && fixedHeight,
+						'tui-opacity': openDisAbled(year, month, index + 1),
+						'tui-start-date': (type == 2 && startDate == `${year}-${month}-${index + 1}`) || type == 1,
+						'tui-end-date': (type == 2 && endDate == `${year}-${month}-${index + 1}`) || type == 1
+					}"
+				 :style="{ backgroundColor: isFixed ? getColor(index, 1) : 'transparent', height: isFixed && fixedHeight ? dateHeight + 'px' : 'auto' }"
+				 v-for="(item, index) in daysArr" :key="index" @tap="dateClick(index)">
+					<view class="tui-date-text" :style="{ color: isFixed ? getColor(index, 2) : getStatusData(3, index), backgroundColor: getStatusData(2, index) }">
+						<view v-if="isFixed || !getStatusData(4, index)">{{ index + 1 }}</view>
+						<view v-if="!getStatusData(4, index)" class="tui-custom-desc" :class="{'tui-lunar-unshow':!lunar && isFixed}">{{ getDescText(index,startDate,endDate)}}</view>
+						<text class="tui-iconfont tui-font-check" v-if="getStatusData(4, index)"></text>
+					</view>
+					<view class="tui-date-desc" :style="{ color: activeColor }" v-if="!lunar && type == 2 && startDate == `${year}-${month}-${index + 1}` && startDate != endDate">
+						{{ startText }}
+					</view>
+					<view class="tui-date-desc" :style="{ color: activeColor }" v-if="!lunar && type == 2 && endDate == `${year}-${month}-${index + 1}`">{{ endText }}</view>
+				</view>
+				<view class="tui-bg-month">{{ month }}</view>
+			</view>
+
+			<view class="tui-calendar-op" v-if="isFixed" @touchmove.stop.prevent="stop">
+				<view class="tui-calendar-result">
+					<text>{{ type == 1 ? activeDate : startDate }}</text>
+					<text v-if="endDate">至{{ endDate }}</text>
+				</view>
+				<view class="tui-calendar-btn_box">
+					<tui-button :type="btnType" height="72rpx" shape="circle" :size="28" @click="btnFix(false)">确定</tui-button>
+				</view>
+			</view>
+		</view>
+
+		<view class="tui-popup-mask" :class="[isShow ? 'tui-mask-show' : '']" @touchmove.stop.prevent="stop" v-if="isFixed"
+		 @tap="hide"></view>
+	</view>
+</template>
+<script>
+	//easycom组件模式 无需手动引入
+	// import tuiButton from "../tui-button/tui-button"
+	const calendar = require("./tui-calendar.js")
+	export default {
+		name: 'tuiCalendar',
+		// components:{
+		// 	tuiButton
+		// },
+		props: {
+			//1-切换月份和年份 2-切换月份
+			arrowType: {
+				type: [Number, String],
+				default: 1
+			},
+			//1-单个日期选择 2-开始日期+结束日期选择
+			type: {
+				type: Number,
+				default: 1
+			},
+			//可切换最大年份
+			maxYear: {
+				type: Number,
+				default: 2030
+			},
+			//可切换最小年份
+			minYear: {
+				type: Number,
+				default: 1920
+			},
+			//最小可选日期(不在范围内日期禁用不可选)
+			minDate: {
+				type: String,
+				default: '1920-01-01'
+			},
+			/**
+			 * 最大可选日期
+			 * 默认最大值为今天,之后的日期不可选
+			 * 2030-12-31
+			 * */
+			maxDate: {
+				type: String,
+				default: ''
+			},
+			//显示圆角
+			radius: {
+				type: Boolean,
+				default: true
+			},
+			//状态 数据顺序与当月天数一致,index=>day
+			/**
+				 * [{
+					 * text:"", 描述:2字以内
+					 * value:"",状态值 
+					 * bgColor:"",背景色
+					 * color:""  文字颜色,
+					 * check:false //是否显示对勾
+					 * 
+				 }]
+				 * 
+				 * **/
+			status: {
+				type: Array,
+				default () {
+					return [];
+				}
+			},
+			//月份切换箭头颜色
+			monthArrowColor: {
+				type: String,
+				default: '#999'
+			},
+			//年份切换箭头颜色
+			yearArrowColor: {
+				type: String,
+				default: '#bcbcbc'
+			},
+			//默认日期字体颜色
+			color: {
+				type: String,
+				default: '#333'
+			},
+			//选中|起始结束日期背景色
+			activeBgColor: {
+				type: String,
+				default: '#5677fc'
+			},
+			//选中|起始结束日期字体颜色
+			activeColor: {
+				type: String,
+				default: '#fff'
+			},
+			//范围内日期背景色
+			rangeBgColor: {
+				type: String,
+				default: 'rgba(86,119,252,0.1)'
+			},
+			//范围内日期字体颜色
+			rangeColor: {
+				type: String,
+				default: '#5677fc'
+			},
+			//type=2时生效,起始日期自定义文案
+			startText: {
+				type: String,
+				default: '开始'
+			},
+			//type=2时生效,结束日期自定义文案
+			endText: {
+				type: String,
+				default: '结束'
+			},
+			//按钮样式类型
+			btnType: {
+				type: String,
+				default: 'primary'
+			},
+			//固定在底部
+			isFixed: {
+				type: Boolean,
+				default: false
+			},
+			//固定日历容器高度,isFixed=true时生效
+			fixedHeight: {
+				type: Boolean,
+				default: true
+			},
+			//当前选中日期带选中效果
+			isActiveCurrent: {
+				type: Boolean,
+				default: true
+			},
+			//切换年月是否触发事件 type=1时生效
+			isChange: {
+				type: Boolean,
+				default: false
+			},
+			//是否显示农历
+			lunar: {
+				type: Boolean,
+				default: false
+			}
+		},
+		data() {
+			return {
+				isShow: false,
+				weekday: 1, // 星期几,值为1-7
+				weekdayArr: [],
+				days: 0, //当前月有多少天
+				daysArr: [],
+				showTitle: '',
+				year: 2020,
+				month: 0,
+				day: 0,
+				startYear: 0,
+				startMonth: 0,
+				startDay: 0,
+				endYear: 0,
+				endMonth: 0,
+				endDay: 0,
+				today: '',
+				activeDate: '',
+				startDate: '',
+				endDate: '',
+				isStart: true,
+				min: null,
+				max: null,
+				dateHeight: 20
+			};
+		},
+		computed: {
+			dataChange() {
+				return `${this.type}-${this.minDate}-${this.maxDate}`;
+			}
+		},
+		watch: {
+			dataChange(val) {
+				this.init();
+			},
+			fixedHeight(val) {
+				if (val) {
+					this.initDateHeight()
+				}
+			}
+		},
+		created() {
+			this.init();
+		},
+		methods: {
+			getColor(index, type) {
+				let color = type == 1 ? '' : this.color;
+				let day = index + 1;
+				let date = `${this.year}-${this.month}-${day}`;
+				let timestamp = new Date(date.replace(/\-/g, '/')).getTime();
+				let start = this.startDate.replace(/\-/g, '/');
+				let end = this.endDate.replace(/\-/g, '/');
+				if ((this.isActiveCurrent && this.activeDate == date) || this.startDate == date || this.endDate == date) {
+					color = type == 1 ? this.activeBgColor : this.activeColor;
+				} else if (this.endDate && timestamp > new Date(start).getTime() && timestamp < new Date(end).getTime()) {
+					color = type == 1 ? this.rangeBgColor : this.rangeColor;
+				}
+				return color;
+			},
+			//获取状态数据
+			getStatusData(type, index) {
+				//1-描述text,2-bgColor背景色,3-color文字颜色 4-check 是否显示对勾
+				let val = ['', 'transparent', '#333', ''][type - 1];
+				if (!this.isFixed && this.status && this.status.length > 0) {
+					let item = this.status[index];
+					if (item) {
+						switch (type) {
+							case 1:
+								val = item.text;
+								break;
+							case 2:
+								val = item.bgColor;
+								break;
+							case 3:
+								val = item.color;
+								break;
+							case 4:
+								val = item.check;
+								break;
+							default:
+								break;
+						}
+					}
+				}
+				return val;
+			},
+			getDescText(index, startDate, endDate) {
+				let text = this.lunar ? this.getLunar(this.year, this.month, index + 1) : "";
+				if (this.isFixed && this.type == 2) {
+					//此判断不能与上面条件一起判断
+					if(this.lunar){
+						let date = `${this.year}-${this.month}-${index + 1}`;
+						if (startDate == date && startDate != endDate) {
+							text = this.startText
+						} else if (endDate == date) {
+							text = this.endText
+						}
+					}
+				} else {
+					let status = this.getStatusData(1, index);
+					if (status)
+						text = status;
+				}
+				return text;
+			},
+			getLunar(year, month, day) {
+				let obj = calendar.solar2lunar(year, month, day);
+				return obj.IDayCn
+			},
+			initDateHeight() {
+				if (this.fixedHeight && this.isFixed) {
+					this.dateHeight = uni.getSystemInfoSync().windowWidth / 7;
+				}
+			},
+			init() {
+				this.initDateHeight();
+				let now = new Date();
+				this.year = now.getFullYear();
+				this.month = now.getMonth() + 1;
+				this.day = now.getDate();
+				this.today = `${now.getFullYear()}-${now.getMonth() + 1}-${now.getDate()}`;
+				this.activeDate = this.today;
+				this.min = this.initDate(this.minDate);
+				this.max = this.initDate(this.maxDate || this.today);
+				this.startDate = '';
+				this.startYear = 0;
+				this.startMonth = 0;
+				this.startDay = 0;
+				this.endYear = 0;
+				this.endMonth = 0;
+				this.endDay = 0;
+				this.endDate = '';
+				this.isStart = true;
+				this.changeData();
+			},
+			//日期处理
+			initDate(date) {
+				let fdate = date.split('-');
+				return {
+					year: Number(fdate[0] || 1920),
+					month: Number(fdate[1] || 1),
+					day: Number(fdate[2] || 1)
+				};
+			},
+			openDisAbled: function(year, month, day) {
+				let bool = true;
+				let date = `${year}/${month}/${day}`;
+				// let today = this.today.replace(/\-/g, '/');
+				let min = `${this.min.year}/${this.min.month}/${this.min.day}`;
+				let max = `${this.max.year}/${this.max.month}/${this.max.day}`;
+				let timestamp = new Date(date).getTime();
+				if (timestamp >= new Date(min).getTime() && timestamp <= new Date(max).getTime()) {
+					bool = false;
+				}
+				return bool;
+			},
+			generateArray: function(start, end) {
+				return Array.from(new Array(end + 1).keys()).slice(start);
+			},
+			formatNum: function(num) {
+				return num < 10 ? '0' + num : num + '';
+			},
+			stop() {
+				return !this.isFixed;
+			},
+			//一个月有多少天
+			getMonthDay(year, month) {
+				let days = new Date(year, month, 0).getDate();
+				return days;
+			},
+			getWeekday(year, month) {
+				let date = new Date(`${year}/${month}/01 00:00:00`);
+				return date.getDay();
+			},
+			checkRange(year) {
+				let overstep = false;
+				if (year < this.minYear || year > this.maxYear) {
+					uni.showToast({
+						title: '日期超出范围啦~',
+						icon: 'none'
+					});
+					overstep = true;
+				}
+				return overstep;
+			},
+			changeMonth(isAdd) {
+				if (isAdd) {
+					let month = this.month + 1;
+					let year = month > 12 ? this.year + 1 : this.year;
+					if (!this.checkRange(year)) {
+						this.month = month > 12 ? 1 : month;
+						this.year = year;
+						this.changeData();
+					}
+				} else {
+					let month = this.month - 1;
+					let year = month < 1 ? this.year - 1 : this.year;
+					if (!this.checkRange(year)) {
+						this.month = month < 1 ? 12 : month;
+						this.year = year;
+						this.changeData();
+					}
+				}
+			},
+			changeYear(isAdd) {
+				let year = isAdd ? this.year + 1 : this.year - 1;
+				if (!this.checkRange(year)) {
+					this.year = year;
+					this.changeData();
+				}
+			},
+			changeData() {
+				this.days = this.getMonthDay(this.year, this.month);
+				this.daysArr = this.generateArray(1, this.days);
+				this.weekday = this.getWeekday(this.year, this.month);
+				this.weekdayArr = this.generateArray(1, this.weekday);
+				this.showTitle = `${this.year}年${this.month}月`;
+				if (this.isChange && this.type == 1) {
+					this.btnFix(true);
+				}
+			},
+			dateClick: function(day) {
+				day += 1;
+				if (!this.openDisAbled(this.year, this.month, day)) {
+					this.day = day;
+					let date = `${this.year}-${this.month}-${day}`;
+					if (this.type == 1) {
+						this.activeDate = date;
+					} else {
+						let compare = new Date(date.replace(/\-/g, '/')).getTime() < new Date(this.startDate.replace(/\-/g, '/')).getTime();
+						if (this.isStart || compare) {
+							this.startDate = date;
+							this.startYear = this.year;
+							this.startMonth = this.month;
+							this.startDay = this.day;
+							this.endYear = 0;
+							this.endMonth = 0;
+							this.endDay = 0;
+							this.endDate = '';
+							this.activeDate = '';
+							this.isStart = false;
+						} else {
+							this.endDate = date;
+							this.endYear = this.year;
+							this.endMonth = this.month;
+							this.endDay = this.day;
+							this.isStart = true;
+						}
+					}
+					if (!this.isFixed) {
+						this.btnFix();
+					}
+				}
+			},
+			show() {
+				this.isShow = true;
+			},
+			hide() {
+				this.isShow = false;
+			},
+			getWeekText(date) {
+				date = new Date(`${date.replace(/\-/g, '/')} 00:00:00`);
+				let week = date.getDay();
+				return '星期' + ['日', '一', '二', '三', '四', '五', '六'][week];
+			},
+			btnFix(show) {
+				if (!show) {
+					this.hide();
+				}
+				if (this.type == 1) {
+					let arr = this.activeDate.split('-');
+					let year = this.isChange ? this.year : Number(arr[0]);
+					let month = this.isChange ? this.month : Number(arr[1]);
+					let day = this.isChange ? this.day : Number(arr[2]);
+					//当前月有多少天
+					let days = this.getMonthDay(year, month);
+					let result = `${year}-${this.formatNum(month)}-${this.formatNum(day)}`;
+					let weekText = this.getWeekText(result);
+					let isToday = false;
+					if (`${year}-${month}-${day}` == this.today) {
+						//今天
+						isToday = true;
+					}
+					let lunar = calendar.solar2lunar(year, month, day)
+					this.$emit('change', {
+						year: year,
+						month: month,
+						day: day,
+						days: days,
+						result: result,
+						week: weekText,
+						isToday: isToday,
+						switch: show, //是否是切换年月操作
+						lunar: lunar
+					});
+				} else {
+					if (!this.startDate || !this.endDate) return;
+					let startMonth = this.formatNum(this.startMonth);
+					let startDay = this.formatNum(this.startDay);
+					let startDate = `${this.startYear}-${startMonth}-${startDay}`;
+					let startWeek = this.getWeekText(startDate);
+					let startLunar = calendar.solar2lunar(this.startYear, startMonth, startDay);
+
+					let endMonth = this.formatNum(this.endMonth);
+					let endDay = this.formatNum(this.endDay);
+					let endDate = `${this.endYear}-${endMonth}-${endDay}`;
+					let endWeek = this.getWeekText(endDate);
+					let endLunar = calendar.solar2lunar(this.endYear, endMonth, endDay);
+					this.$emit('change', {
+						startYear: this.startYear,
+						startMonth: this.startMonth,
+						startDay: this.startDay,
+						startDate: startDate,
+						startWeek: startWeek,
+						startLunar: startLunar,
+						endYear: this.endYear,
+						endMonth: this.endMonth,
+						endDay: this.endDay,
+						endDate: endDate,
+						endWeek: endWeek,
+						endLunar: endLunar
+					});
+				}
+			}
+		}
+	};
+</script>
+
+<style scoped>
+	@font-face {
+		font-family: 'tuiDateFont';
+		src: url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAVgAA0AAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAFRAAAABoAAAAci0/w50dERUYAAAUkAAAAHgAAAB4AKQANT1MvMgAAAaAAAABDAAAAVjxuSNNjbWFwAAAB+AAAAEoAAAFS5iPQt2dhc3AAAAUcAAAACAAAAAj//wADZ2x5ZgAAAlQAAAFHAAABvPf29TBoZWFkAAABMAAAADAAAAA2GMsN3WhoZWEAAAFgAAAAHQAAACQHjAOFaG10eAAAAeQAAAATAAAAFgzQAPJsb2NhAAACRAAAABAAAAAQAOoBSG1heHAAAAGAAAAAHgAAACABEwA3bmFtZQAAA5wAAAFJAAACiCnmEVVwb3N0AAAE6AAAADQAAABLUwjqHHjaY2BkYGAAYp5Gj5/x/DZfGbhZGEDg1tUn7+F00P/LzOuY9YFcDgYmkCgAa0gNlHjaY2BkYGBu+N/AEMPCAALM6xgYGVABCwBT4AMaAAAAeNpjYGRgYGBn0GZgYgABEMkFhAwM/8F8BgANaAFLAAB42mNgZGFgnMDAysDA1Ml0hoGBoR9CM75mMGLkAIoysDIzYAUBaa4pDA7PGJ49ZG7438AQw9zA0AAUZgTJAQDrcAy8AHjaY2GAABYIDgLCBQx1AAcEAc8AeNpjYGBgZoBgGQZGBhDwAfIYwXwWBgMgzQGETAwMzxifcTx7+P8/kMUAYUkxS/6VVIXqAgNGNgY4lxGoB6QPBTAyDHsAADDkDYkAAAAAAAAAAAAAADQAagC2AN542m2QsU7DMBCG/Tt1bNPUiUnkSgiVtqKpxJAgVLVbeAa6MaK+B4JXgJWBjY21UtW5gpkdMTFX7dzApaJLhXU6n8+n//ttxtn458N79XJWZ8eMxS00C4wy9A1EP8PQncAlIQzS4WgsVtPpSmwzV3OFRqLetH5TSQMK939X61ptPZ2p2EAttNMLBRMrtschQblDeS34aY50cIkCzg/B2Y5C+VpyQxhFkRgu515O8jvU5mmPM2O0wJ5Z27vhX+yMsV437WvCdTM+GI40MgwKfuGammC0uURqeqFMfe9cxaJclkt5GMaB1hIR1VobOgpEiKq+sLZcIrJWhO3/Jw7qWlYj1Jf21FaCtmd5bevrlk28O/7A4spXTl4KTh9MTlqQ8PESBRstReic+sRj0Dni9fIqmNS/pXNWCvWOeYBmx5S9Bsn9Ah+5WtAAeNp9kD1OAzEQhZ/zByQSQiCoXVEA2vyUKRMp9Ailo0g23pBo1155nUg5AS0VB6DlGByAGyDRcgpelkmTImvt6PObmeexAZzjGwr/3yXuhBWO8ShcwREy4Sr1F+Ea+V24jhY+hRvUf4SbuFUD4RYu1BsdVO2Eu5vSbcsKZxgIV3CKJ+Eq9ZVwjfwqXMcVPoQb1L+EmxjjV7iFa2WpDOFhMEFgnEFjig3jAjEcLJIyBtahOfRmEsxMTzd6ETubOBso71dilwMeaDnngCntPbdmvkon/mDLgdSYbh4FS7YpjS4idCgbXyyc1d2oc7D9nu22tNi/a4E1x+xRDWzU/D3bM9JIbAyvkJI18jK3pBJTj2hrrPG7ZynW814IiU68y/SIx5o0dTr3bmniwOLn8owcfbS5kj33qBw+Y1kIeb/dTsQgil2GP5PYcRkAAAB42mNgYoAALjDJyIAO2MGiTIxMjMyMLIys7GmJeRmlmWZQ2pQ5OSORLaU0Mz2/FACDfwlbAAAAAf//AAIAAQAAAAwAAAAWAAAAAgABAAMABgABAAQAAAACAAAAAHjaY2BgYGQAgqtL1DlA9K2rT97DaABNlwiuAAA=) format('woff');
+		font-weight: normal;
+		font-style: normal;
+	}
+
+	.tui-iconfont {
+		font-family: 'tuiDateFont' !important;
+		font-size: 36rpx;
+		font-style: normal;
+		-webkit-font-smoothing: antialiased;
+		-moz-osx-font-smoothing: grayscale;
+	}
+
+	.tui-font-close:before {
+		content: '\e608';
+	}
+
+	.tui-font-check:before {
+		content: '\e6e1';
+	}
+
+	.tui-font-arrowright:before {
+		content: '\e600';
+	}
+
+	.tui-font-arrowleft:before {
+		content: '\e601';
+	}
+
+	.tui-date-box {
+		width: 100%;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		padding: 20rpx 0 30rpx;
+		background-color: #fff;
+	}
+
+	.tui-calendar-radius {
+		border-top-left-radius: 20rpx;
+		border-top-right-radius: 20rpx;
+		overflow: hidden;
+	}
+
+	.tui-date_time {
+		padding: 0 16rpx;
+		color: #333;
+		font-size: 32rpx;
+		line-height: 32rpx;
+		font-weight: bold;
+	}
+
+	.tui-font-arrowleft {
+		margin-right: 32rpx;
+	}
+
+	.tui-font-arrowright {
+		margin-left: 32rpx;
+	}
+
+	.tui-date-header {
+		width: 100%;
+		display: flex;
+		align-items: center;
+		background-color: #fff;
+		font-size: 24rpx;
+		line-height: 24rpx;
+		color: #555;
+		box-shadow: 0 15rpx 20rpx -15rpx #efefef;
+		position: relative;
+		z-index: 2;
+	}
+
+	.tui-date-content {
+		width: 100%;
+		display: flex;
+		flex-wrap: wrap;
+		padding: 12rpx 0;
+		box-sizing: border-box;
+		background-color: #fff;
+		position: relative;
+	}
+
+	.tui-flex-start {
+		align-content: flex-start;
+	}
+
+	.tui-bg-month {
+		position: absolute;
+		font-size: 260rpx;
+		line-height: 260rpx;
+		left: 50%;
+		top: 50%;
+		transform: translate(-50%, -50%);
+		color: #f5f5f7;
+		z-index: 1;
+	}
+
+	.tui-date {
+		width: 14.2857%;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		padding: 12rpx 0;
+		overflow: hidden;
+		position: relative;
+		z-index: 2;
+	}
+
+	.tui-date-pd_0 {
+		padding: 0 !important;
+	}
+
+	.tui-start-date {
+		border-top-left-radius: 8rpx;
+		border-bottom-left-radius: 8rpx;
+	}
+
+	.tui-end-date {
+		border-top-right-radius: 8rpx;
+		border-bottom-right-radius: 8rpx;
+	}
+
+	.tui-date-text {
+		width: 80rpx;
+		height: 80rpx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		flex-direction: column;
+		font-size: 32rpx;
+		line-height: 32rpx;
+		position: relative;
+		border-radius: 50%;
+	}
+
+	.tui-btn-calendar {
+		padding: 16rpx;
+		box-sizing: border-box;
+		text-align: center;
+		text-decoration: none;
+	}
+
+	.tui-opacity {
+		opacity: 0.5;
+	}
+
+	.tui-bottom-popup {
+		width: 100%;
+		position: fixed;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		z-index: 9999;
+		visibility: hidden;
+		transform: translate3d(0, 100%, 0);
+		transform-origin: center;
+		transition: all 0.3s ease-in-out;
+		min-height: 20rpx;
+	}
+
+	.tui-popup-show {
+		transform: translate3d(0, 0, 0);
+		visibility: visible;
+	}
+
+	.tui-popup-mask {
+		position: fixed;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		background: rgba(0, 0, 0, 0.6);
+		z-index: 9996;
+		transition: all 0.3s ease-in-out;
+		opacity: 0;
+		visibility: hidden;
+	}
+
+	.tui-mask-show {
+		opacity: 1;
+		visibility: visible;
+	}
+
+	.tui-calendar-header {
+		width: 100%;
+		height: 80rpx;
+		padding: 0 40rpx;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		box-sizing: border-box;
+		font-size: 30rpx;
+		background-color: #fff;
+		color: #555;
+		position: relative;
+	}
+
+	.tui-font-close {
+		position: absolute;
+		right: 30rpx;
+		top: 50%;
+		transform: translateY(-50%);
+		color: #999;
+	}
+
+	.tui-btn-calendar {
+		padding: 16rpx;
+		box-sizing: border-box;
+		text-align: center;
+		text-decoration: none;
+	}
+
+	.tui-font-check {
+		color: #fff;
+		font-size: 54rpx;
+		line-height: 54rpx;
+	}
+
+	.tui-custom-desc {
+		width: 100%;
+		font-size: 24rpx;
+		line-height: 24rpx;
+		transform: scale(0.8);
+		transform-origin: center center;
+		text-align: center;
+	}
+
+	.tui-lunar-unshow {
+		position: absolute;
+		left: 0;
+		bottom: 8rpx;
+		z-index: 2;
+	}
+
+	.tui-date-desc {
+		width: 100%;
+		font-size: 24rpx;
+		line-height: 24rpx;
+		position: absolute;
+		left: 0;
+		transform: scale(0.8);
+		transform-origin: center center;
+		text-align: center;
+		bottom: 8rpx;
+		z-index: 2;
+	}
+
+	.tui-calendar-op {
+		width: 100%;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		flex-direction: column;
+		background-color: #fff;
+		padding: 0 42rpx 30rpx;
+		box-sizing: border-box;
+		font-size: 24rpx;
+		color: #666;
+	}
+
+	.tui-calendar-result {
+		height: 48rpx;
+		transform: scale(0.9);
+		transform-origin: center 100%;
+	}
+
+	.tui-calendar-btn_box {
+		width: 100%;
+	}
+</style>

+ 211 - 0
components/thorui/tui-card/tui-card.vue

@@ -0,0 +1,211 @@
+<template>
+	<view class="tui-card-class tui-card" :class="[full?'tui-card-full':'',border?'tui-card-border':'']" @tap="handleClick"
+	 @longtap="longTap">
+		<view class="tui-card-header" :class="{'tui-header-line':header.line}" :style="{background:header.bgcolor || '#fff'}">
+			<view class="tui-header-left">
+				<image :src="image.url" class="tui-header-thumb" :class="{'tui-thumb-circle':image.circle}" mode="widthFix" v-if="image.url"
+				 :style="{height:(image.height || 60)+'rpx',width:(image.width || 60)+'rpx'}"></image>
+				<text class="tui-header-title" :style="{fontSize:(title.size || 30)+'rpx',color:(title.color || '#7A7A7A')}" v-if="title.text">{{title.text}}</text>
+			</view>
+			<view class="tui-header-right" :style="{fontSize:(tag.size || 24)+'rpx',color:(tag.color || '#b2b2b2')}" v-if="tag.text">
+				{{tag.text}}
+			</view>
+		</view>
+		<view class="tui-card-body">
+			<slot name="body"></slot>
+		</view>
+		<view class="tui-card-footer">
+			<slot name="footer"></slot>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "tuiCard",
+		props: {
+			//是否铺满
+			full: {
+				type: Boolean,
+				default: false
+			},
+			image: {
+				type: Object,
+				default: function() {
+					return {
+						url: "", //图片地址
+						height: 60, //图片高度
+						width: 60, //图片宽度
+						circle: false
+					}
+				}
+			},
+			//标题
+			title: {
+				type: Object,
+				default: function() {
+					return {
+						text: "", //标题文字
+						size: 30, //字体大小
+						color: "#7A7A7A" //字体颜色
+					}
+				}
+			},
+			//标签,时间等
+			tag: {
+				type: Object,
+				default: function() {
+					return {
+						text: "", //标签文字
+						size: 24, //字体大小
+						color: "#b2b2b2" //字体颜色
+					}
+				}
+			},
+			header: {
+				type: Object,
+				default: function() {
+					return {
+						bgcolor: "#fff", //背景颜色
+						line: false //是否去掉底部线条
+					}
+				}
+			},
+			//是否设置外边框
+			border: {
+				type: Boolean,
+				default: false
+			},
+			index: {
+				type: Number,
+				default: 0
+			}
+		},
+		methods: {
+			handleClick() {
+				this.$emit('click', {
+					index: this.index
+				});
+			},
+			longTap() {
+				this.$emit('longclick', {
+					index: this.index
+				});
+			}
+		}
+	}
+</script>
+
+<style scoped>
+	.tui-card {
+		margin: 0 30rpx;
+		font-size: 28rpx;
+		background-color: #fff;
+		border-radius: 10rpx;
+		box-shadow: 0 0 10rpx #eee;
+		box-sizing: border-box;
+		overflow: hidden;
+	}
+
+	.tui-card-full {
+		margin: 0 !important;
+		border-radius: 0 !important;
+	}
+
+	.tui-card-full::after {
+		border-radius: 0 !important;
+	}
+
+	.tui-card-border {
+		position: relative;
+		box-shadow: none !important
+	}
+
+	.tui-card-border::after {
+		content: ' ';
+		position: absolute;
+		height: 200%;
+		width: 200%;
+		border: 1px solid #ddd;
+		transform-origin: 0 0;
+		-webkit-transform-origin: 0 0;
+		-webkit-transform: scale(0.5);
+		transform: scale(0.5);
+		left: 0;
+		top: 0;
+		border-radius: 20rpx;
+		box-sizing: border-box;
+		pointer-events: none;
+	}
+
+	.tui-card-header {
+		width: 100%;
+		padding: 20rpx;
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		position: relative;
+		box-sizing: border-box;
+		overflow: hidden;
+		border-top-left-radius: 10rpx;
+		border-top-right-radius: 10rpx;
+	}
+
+	.tui-card-header::after {
+		content: '';
+		position: absolute;
+		border-bottom: 1rpx solid #eaeef1;
+		-webkit-transform: scaleY(0.5);
+		transform: scaleY(0.5);
+		bottom: 0;
+		right: 0;
+		left: 0;
+		pointer-events: none;
+	}
+
+	.tui-header-line::after {
+		border-bottom: 0 !important;
+	}
+
+	.tui-header-thumb {
+		height: 60rpx;
+		width: 60rpx;
+		vertical-align: middle;
+		margin-right: 20rpx;
+		border-radius: 6rpx;
+	}
+
+	.tui-thumb-circle {
+		border-radius: 50% !important;
+	}
+
+	.tui-header-title {
+		display: inline-block;
+		font-size: 30rpx;
+		color: #7a7a7a;
+		vertical-align: middle;
+		max-width: 460rpx;
+		overflow: hidden;
+		white-space: nowrap;
+		text-overflow: ellipsis;
+	}
+
+	.tui-header-right {
+		font-size: 24rpx;
+		color: #b2b2b2;
+	}
+
+	.tui-card-body {
+		font-size: 32rpx;
+		color: #262b3a;
+		box-sizing: border-box;
+	}
+
+	.tui-card-footer {
+		font-size: 28rpx;
+		color: #596d96;
+		border-bottom-left-radius: 10rpx;
+		border-bottom-right-radius: 10rpx;
+		box-sizing: border-box;
+	}
+</style>

+ 166 - 0
components/thorui/tui-collapse/tui-collapse.vue

@@ -0,0 +1,166 @@
+<template>
+	<view class="tui-collapse" :style="{backgroundColor:bgColor}">
+		<view class="tui-collapse-head" :style="{backgroundColor:hdBgColor}" @tap.stop="handleClick">
+			<view class="tui-header" :class="{'tui-opacity':disabled}">
+				<slot name="title"></slot>
+				<view class="tui-collapse-icon tui-icon-arrow" :class="{'tui-icon-active':isOpen}" :style="{color:arrowColor}" v-if="arrow"></view>
+			</view>
+		</view>
+		<view class="tui-collapse-body_box" :style="{backgroundColor:bdBgColor,height:isOpen?height:'0rpx'}">
+			<view class="tui-collapse-body" :class="{'tui-collapse-transform':height=='auto','tui-collapse-body_show':isOpen && height=='auto'}">
+				<slot name="content"></slot>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "tuiCollapse",
+		props: {
+			//collapse背景颜色
+			bgColor: {
+				type: String,
+				default: 'transparent'
+			},
+			//collapse-head 背景颜色
+			hdBgColor: {
+				type: String,
+				default: '#fff'
+			},
+			//collapse-body 背景颜色
+			bdBgColor: {
+				type: String,
+				default: 'transparent'
+			},
+			//collapse-body实际高度 open时使用
+			height: {
+				type: String,
+				default: 'auto'
+			},
+			//索引
+			index: {
+				type: Number,
+				default: 0
+			},
+			//当前索引,index==current时展开
+			current: {
+				type: Number,
+				default: -1
+			},
+			// 是否禁用
+			disabled: {
+				type: [Boolean, String],
+				default: false
+			},
+			//是否带箭头
+			arrow: {
+				type: [Boolean, String],
+				default: true
+			},
+			//箭头颜色
+			arrowColor: {
+				type: String,
+				default: "#333"
+			}
+		},
+		watch: {
+			current() {
+				this.updateCurrentChange()
+			}
+		},
+		created() {
+			this.updateCurrentChange()
+		},
+		data() {
+			return {
+				isOpen: false
+			};
+		},
+		methods: {
+			updateCurrentChange() {
+				this.isOpen = this.index == this.current
+			},
+			handleClick() {
+				if (this.disabled) return;
+				this.$emit("click", {
+					index: Number(this.index)
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped>
+	@font-face {
+		font-family: 'tuiCollapse';
+		src: url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAQ4AA0AAAAABlgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAAEHAAAABoAAAAciRx3B0dERUYAAAP8AAAAHgAAAB4AKQAKT1MvMgAAAaAAAABCAAAAVjxuR/JjbWFwAAAB9AAAAD4AAAFCAA/pq2dhc3AAAAP0AAAACAAAAAj//wADZ2x5ZgAAAkAAAABEAAAARCs1U/toZWFkAAABMAAAADAAAAA2FpaT+mhoZWEAAAFgAAAAHQAAACQHngOFaG10eAAAAeQAAAAPAAAAEAwAAEBsb2NhAAACNAAAAAoAAAAKACIAAG1heHAAAAGAAAAAHwAAACABDwAdbmFtZQAAAoQAAAFJAAACiCnmEVVwb3N0AAAD0AAAACMAAAA1DunpUnjaY2BkYGAAYja/oO54fpuvDNwsDCBwc4/6fzjtwNDNfICpBMjlYGACiQIAGVAKZnjaY2BkYGBu+N/AEMPCAALMBxgYGVABCwBVNgMsAAAAeNpjYGRgYGBhEGQA0QwMTEDMBYQMDP/BfAYACnYBLQB42mNgZGFgnMDAysDA1Ml0hoGBoR9CM75mMGLkAIoysDIzYAUBaa4pDA7PGJ4xMDf8b2CIYW5gaAAKM4LkANq9C9sAAHjaY2GAABYIdgAAAMAATQB42mNgYGBmgGAZBkYGELAB8hjBfBYGBSDNAoRA/jOG//8hpBQzVCUDIxsDjMnAyAQkmBhQASPDsAcAMCAGoQAAAAAAAAAAAAAAIgAAAAEAQACLA8ACdAAQAAAlASYiBhQXARYyNwE2NCYiBwIA/oYNIBkMAZcNIA0BlwwZIA3uAXoMGSAN/mkMDAGXDSAZDAB42n2QPU4DMRCFn/MHJBJCIKhdUQDa/JQpEyn0CKWjSDbekGjXXnmdSDkBLRUHoOUYHIAbINFyCl6WSZMia+3o85uZ57EBnOMbCv/fJe6EFY7xKFzBETLhKvUX4Rr5XbiOFj6FG9R/hJu4VQPhFi7UGx1U7YS7m9JtywpnGAhXcIon4Sr1lXCN/CpcxxU+hBvUv4SbGONXuIVrZakM4WEwQWCcQWOKDeMCMRwskjIG1qE59GYSzExPN3oRO5s4GyjvV2KXAx5oOeeAKe09t2a+Sif+YMuB1JhuHgVLtimNLiJ0KBtfLJzV3ahzsP2e7ba02L9rgTXH7FENbNT8Pdsz0khsDK+QkjXyMrekElOPaGus8btnKdbzXgiJTrzL9IjHmjR1OvduaeLA4ufyjBx9tLmSPfeoHD5jWQh5v91OxCCKXYY/k9hxGQAAAHjaY2BigAAuMMnIgA5YwKJMjExciUVF+eW6KfnleQAZ0wQyAAAAAAH//wACAAEAAAAMAAAAFgAAAAIAAQADAAMAAQAEAAAAAgAAAAB42mNgYGBkAIKrS9Q5QPTNPer/YTQAQ+0HIAAA) format('woff');
+		font-weight: normal;
+		font-style: normal;
+	}
+
+	.tui-collapse-icon {
+		font-family: "tuiCollapse" !important;
+		font-style: normal;
+		-webkit-font-smoothing: antialiased;
+		-moz-osx-font-smoothing: grayscale;
+	}
+
+	.tui-icon-arrow:before {
+		content: "\e600";
+	}
+
+	.tui-icon-arrow {
+		font-size: 32rpx;
+		transform: rotate(0);
+		transform-origin: center center;
+		transition: all 0.3s;
+		position: absolute;
+		top: 50%;
+		margin-top: -8px;
+		right: 30rpx;
+	}
+
+	.tui-arrow-padding {
+		padding-right: 62rpx;
+		box-sizing: border-box;
+	}
+
+	.tui-icon-active {
+		transform: rotate(180deg);
+		transform-origin: center center;
+	}
+
+	.tui-header {
+		position: relative;
+		z-index: 2;
+	}
+   .tui-collapse-body_box{
+	   transition: all 0.25s;
+	   overflow: hidden;
+   }
+	.tui-collapse-body {
+		transition: all 0.25s;
+		overflow: hidden;
+		position: relative;
+		z-index: 1;
+	}
+
+	.tui-collapse-transform {
+		opacity: 0;
+		visibility: hidden;
+		-webkit-transform: translateY(-40%);
+		transform: translateY(-40%);
+	}
+
+	.tui-collapse-body_show {
+		opacity: 1;
+		visibility: visible;
+		-webkit-transform: translateY(0);
+		transform: translateY(0);
+	}
+
+	.tui-opacity {
+		opacity: 0.6;
+	}
+</style>

+ 257 - 0
components/thorui/tui-countdown/tui-countdown.vue

@@ -0,0 +1,257 @@
+<template>
+	<view class="tui-countdown-box">
+		<view class="tui-countdown-item" :style="{ background: backgroundColor, borderColor: borderColor, width: getWidth(d, width) + 'rpx', height: height + 'rpx' }" v-if="days">
+			<view class="tui-countdown-time" :class="[scale ? 'tui-countdown-scale' : '']" :style="{ fontSize: size + 'rpx', color: color, lineHeight: size + 'rpx' }">
+				{{ d }}
+			</view>
+		</view>
+		<view
+			class="tui-countdown-colon"
+			:class="{ 'tui-colon-pad': borderColor == 'transparent' }"
+			:style="{ lineHeight: colonSize + 'rpx', fontSize: colonSize + 'rpx', color: colonColor }"
+			v-if="days"
+		>
+			{{ isColon ? ':' : '天' }}
+		</view>
+		<view class="tui-countdown-item" :style="{ background: backgroundColor, borderColor: borderColor, width: getWidth(h, width) + 'rpx', height: height + 'rpx' }" v-if="hours">
+			<view class="tui-countdown-time" :class="[scale ? 'tui-countdown-scale' : '']" :style="{ fontSize: size + 'rpx', color: color, lineHeight: size + 'rpx' }">
+				{{ h }}
+			</view>
+		</view>
+		<view
+			class="tui-countdown-colon"
+			:class="{ 'tui-colon-pad': borderColor == 'transparent' }"
+			:style="{ lineHeight: colonSize + 'rpx', fontSize: colonSize + 'rpx', color: colonColor }"
+			v-if="hours"
+		>
+			{{ isColon ? ':' : '时' }}
+		</view>
+		<view
+			class="tui-countdown-item"
+			:style="{ background: backgroundColor, borderColor: borderColor, width: getWidth(i, width) + 'rpx', height: height + 'rpx' }"
+			v-if="minutes"
+		>
+			<view class="tui-countdown-time" :class="[scale ? 'tui-countdown-scale' : '']" :style="{ fontSize: size + 'rpx', color: color, lineHeight: size + 'rpx' }">
+				{{ i }}
+			</view>
+		</view>
+		<view
+			class="tui-countdown-colon"
+			:class="{ 'tui-colon-pad': borderColor == 'transparent' }"
+			:style="{ lineHeight: colonSize + 'rpx', fontSize: colonSize + 'rpx', color: colonColor }"
+			v-if="minutes"
+		>
+			{{ isColon ? ':' : '分' }}
+		</view>
+		<view
+			class="tui-countdown-item"
+			:style="{ background: backgroundColor, borderColor: borderColor, width: getWidth(s, width) + 'rpx', height: height + 'rpx' }"
+			v-if="seconds"
+		>
+			<view class="tui-countdown-time" :class="[scale ? 'tui-countdown-scale' : '']" :style="{ fontSize: size + 'rpx', color: color, lineHeight: size + 'rpx' }">
+				{{ s }}
+			</view>
+		</view>
+		<view
+			class="tui-countdown-colon"
+			:class="{ 'tui-colon-pad': borderColor == 'transparent' }"
+			:style="{ lineHeight: colonSize + 'rpx', fontSize: colonSize + 'rpx', color: colonColor }"
+			v-if="seconds && !isColon"
+		>
+			{{ unitEn ? 's' : '秒' }}
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	name: 'tuiCountdown',
+	props: {
+		//数字框宽度
+		width: {
+			type: Number,
+			default: 25
+		},
+		//数字框高度
+		height: {
+			type: Number,
+			default: 25
+		},
+		//数字框border颜色
+		borderColor: {
+			type: String,
+			default: '#333'
+		},
+		//数字框背景颜色
+		backgroundColor: {
+			type: String,
+			default: '#fff'
+		},
+		//数字框字体大小
+		size: {
+			type: Number,
+			default: 24
+		},
+		//数字框字体颜色
+		color: {
+			type: String,
+			default: '#333'
+		},
+		//是否缩放 0.9
+		scale: {
+			type: Boolean,
+			default: false
+		},
+		//冒号大小
+		colonSize: {
+			type: Number,
+			default: 28
+		},
+		//冒号颜色
+		colonColor: {
+			type: String,
+			default: '#333'
+		},
+		//剩余时间 (单位:秒)
+		time: {
+			type: Number,
+			default: 0
+		},
+		//是否包含天
+		days: {
+			type: Boolean,
+			default: false
+		},
+		//是否包含小时
+		hours: {
+			type: Boolean,
+			default: true
+		},
+		//是否包含分钟
+		minutes: {
+			type: Boolean,
+			default: true
+		},
+		//是否包含秒
+		seconds: {
+			type: Boolean,
+			default: true
+		},
+		//单位用英文缩写表示 仅seconds秒数有效
+		unitEn: {
+			type: Boolean,
+			default: false
+		},
+		//是否展示为冒号,false为文字
+		isColon: {
+			type: Boolean,
+			default: true
+		}
+	},
+	watch: {
+		time(val) {
+			clearInterval(this.countdown);
+			this.doLoop();
+		}
+	},
+	data() {
+		return {
+			countdown: null,
+			d: '0',
+			h: '00',
+			i: '00',
+			s: '00'
+		};
+	},
+	created() {
+		this.doLoop();
+	},
+	beforeDestroy() {
+		clearInterval(this.countdown);
+		this.countdown = null;
+	},
+	methods: {
+		getWidth: function(num, width) {
+			return num > 99 ? (width / 2) * num.toString().length : width;
+		},
+		endOfTime() {
+			clearInterval(this.countdown);
+			this.countdown = null;
+			this.$emit('end', {});
+		},
+		doLoop: function() {
+			let seconds = this.time || 0;
+			this.countDown(seconds);
+			this.countdown = setInterval(() => {
+				seconds--;
+				if (seconds < 0) {
+					this.endOfTime();
+					return;
+				}
+				this.countDown(seconds);
+			}, 1000);
+		},
+		countDown(seconds) {
+			let [day, hour, minute, second] = [0, 0, 0, 0];
+			if (seconds > 0) {
+				day = this.days ? Math.floor(seconds / (60 * 60 * 24)) : 0;
+				hour = this.hours ? Math.floor(seconds / (60 * 60)) - day * 24 : 0;
+				minute = this.minutes ? Math.floor(seconds / 60) - hour * 60 - day * 24 * 60 : 0;
+				second = Math.floor(seconds) - day * 24 * 60 * 60 - hour * 60 * 60 - minute * 60;
+			} else {
+				this.endOfTime();
+			}
+			hour = hour < 10 ? '0' + hour : hour;
+			minute = minute < 10 ? '0' + minute : minute;
+			second = second < 10 ? '0' + second : second;
+			this.d = day;
+			this.h = hour;
+			this.i = minute;
+			this.s = second;
+		}
+	}
+};
+</script>
+
+<style scoped>
+.tui-countdown-box {
+	display: flex;
+	align-items: center;
+}
+
+.tui-countdown-box {
+	display: flex;
+	align-items: center;
+}
+
+.tui-countdown-item {
+	border: 1rpx solid;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	padding: 2rpx;
+	border-radius: 6rpx;
+	white-space: nowrap;
+	transform: translateZ(0);
+}
+
+.tui-countdown-time {
+	margin: 0;
+	padding: 0;
+}
+
+.tui-countdown-colon {
+	display: flex;
+	justify-content: center;
+	padding: 0 5rpx;
+}
+
+.tui-colon-pad {
+	padding: 0 !important;
+}
+
+.tui-countdown-scale {
+	transform: scale(0.9);
+	transform-origin: center center;
+}
+</style>

+ 537 - 0
components/thorui/tui-datetime/tui-datetime.vue

@@ -0,0 +1,537 @@
+<template>
+	<view class="tui-datetime-picker">
+		<view class="tui-mask" :class="{ 'tui-mask-show': isShow }" @touchmove.stop.prevent="stop" catchtouchmove="stop" @tap="hide"></view>
+		<view class="tui-header" :class="{ 'tui-show': isShow }">
+			<view class="tui-picker-header" :class="{ 'tui-date-radius': radius }" @touchmove.stop.prevent="stop" catchtouchmove="stop">
+				<view class="tui-btn-picker" :style="{ color: cancelColor }" hover-class="tui-opacity" :hover-stay-time="150"
+				 @tap="hide">取消</view>
+				<view class="tui-btn-picker" :style="{ color: color }" hover-class="tui-opacity" :hover-stay-time="150" @tap="btnFix">确定</view>
+			</view>
+			<view class="tui-date-header" v-if="unitTop">
+				<view class="tui-date-unit" v-if="type < 4 || type == 7">年</view>
+				<view class="tui-date-unit" v-if="type < 4 || type == 7">月</view>
+				<view class="tui-date-unit" v-if="type == 1 || type == 2 || type == 7">日</view>
+				<view class="tui-date-unit" v-if="type == 1 || type == 4 || type == 5 || type == 7">时</view>
+				<view class="tui-date-unit" v-if="type == 1 || type > 3">分</view>
+				<view class="tui-date-unit" v-if="type > 4">秒</view>
+			</view>
+			<view class="tui-picker-body">
+				<picker-view :value="value" @change="change" class="tui-picker-view">
+					<picker-view-column v-if="!reset && (type < 4 || type == 7)">
+						<view class="tui-column-item" :class="{ 'tui-font-size_32': !unitTop && type == 7 }" v-for="(item, index) in years"
+						 :key="index">
+							{{ item }}
+							<text class="tui-unit-text" v-if="!unitTop">年</text>
+						</view>
+					</picker-view-column>
+					<picker-view-column v-if="!reset && (type < 4 || type == 7)">
+						<view class="tui-column-item" :class="{ 'tui-font-size_32': !unitTop && type == 7 }" v-for="(item, index) in months"
+						 :key="index">
+							{{ formatNum(item) }}
+							<text class="tui-unit-text" v-if="!unitTop">月</text>
+						</view>
+					</picker-view-column>
+					<picker-view-column v-if="!reset && (type == 1 || type == 2 || type == 7)">
+						<view class="tui-column-item" :class="{ 'tui-font-size_32': !unitTop && type == 7 }" v-for="(item, index) in days"
+						 :key="index">
+							{{ formatNum(item) }}
+							<text class="tui-unit-text" v-if="!unitTop">日</text>
+						</view>
+					</picker-view-column>
+					<picker-view-column v-if="!reset && (type == 1 || type == 4 || type == 5 || type == 7)">
+						<view class="tui-column-item" :class="{ 'tui-font-size_32': !unitTop && type == 7 }" v-for="(item, index) in hours"
+						 :key="index">
+							{{ formatNum(item) }}
+							<text class="tui-unit-text" v-if="!unitTop">时</text>
+						</view>
+					</picker-view-column>
+					<picker-view-column v-if="!reset && (type == 1 || type > 3)">
+						<view class="tui-column-item" :class="{ 'tui-font-size_32': !unitTop && type == 7 }" v-for="(item, index) in minutes"
+						 :key="index">
+							{{ formatNum(item) }}
+							<text class="tui-unit-text" v-if="!unitTop">分</text>
+						</view>
+					</picker-view-column>
+					<picker-view-column v-if="!reset && type > 4">
+						<view class="tui-column-item" :class="{ 'tui-font-size_32': !unitTop && type == 7 }" v-for="(item, index) in seconds"
+						 :key="index">
+							{{ formatNum(item) }}
+							<text class="tui-unit-text" v-if="!unitTop">秒</text>
+						</view>
+					</picker-view-column>
+				</picker-view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'tuiDatetime',
+		props: {
+			//1-日期+时间(年月日+时分) 2-日期(年月日) 3-日期(年月) 4-时间(时分) 5-时分秒 6-分秒 7-年月日 时分秒
+			type: {
+				type: Number,
+				default: 1
+			},
+			//年份区间
+			startYear: {
+				type: Number,
+				default: 1980
+			},
+			//年份区间
+			endYear: {
+				type: Number,
+				default: 2050
+			},
+			//"取消"字体颜色
+			cancelColor: {
+				type: String,
+				default: '#888'
+			},
+			//"确定"字体颜色
+			color: {
+				type: String,
+				default: '#5677fc'
+			},
+			//设置默认显示日期 2019-08-01 || 2019-08-01 17:01 || 2019/08/01
+			setDateTime: {
+				type: String,
+				default: ''
+			},
+			//单位置顶
+			unitTop: {
+				type: Boolean,
+				default: false
+			},
+			//圆角设置
+			radius: {
+				type: Boolean,
+				default: false
+			}
+		},
+		data() {
+			return {
+				isShow: false,
+				years: [],
+				months: [],
+				days: [],
+				hours: [],
+				minutes: [],
+				seconds: [],
+				year: 0,
+				month: 0,
+				day: 0,
+				hour: 0,
+				minute: 0,
+				second: 0,
+				startDate: '',
+				endDate: '',
+				value: [0, 0, 0, 0, 0, 0],
+				reset: false
+			};
+		},
+		mounted() {
+			this.initData();
+		},
+		computed: {
+			yearOrMonth() {
+				return `${this.year}-${this.month}`;
+			},
+			propsChange() {
+				return `${this.setDateTime}-${this.type}-${this.startYear}-${this.endYear}`;
+			}
+		},
+		watch: {
+			yearOrMonth() {
+				this.setDays();
+			},
+			propsChange() {
+				this.reset = true;
+				setTimeout(() => {
+					this.initData();
+				}, 10);
+			}
+		},
+		methods: {
+			stop() {},
+			formatNum: function(num) {
+				return num < 10 ? '0' + num : num + '';
+			},
+			generateArray: function(start, end) {
+				return Array.from(new Array(end + 1).keys()).slice(start);
+			},
+			getIndex: function(arr, val) {
+				let index = arr.indexOf(val);
+				return ~index ? index : 0;
+			},
+			//日期时间处理
+			initSelectValue() {
+				let fdate = this.setDateTime.replace(/\-/g, '/');
+				fdate = fdate && fdate.indexOf('/') == -1 ? `2020/01/01 ${fdate}` : fdate;
+				let time = null;
+				if (fdate) time = new Date(fdate);
+				else time = new Date();
+				this.year = time.getFullYear();
+				this.month = time.getMonth() + 1;
+				this.day = time.getDate();
+				this.hour = time.getHours();
+				this.minute = time.getMinutes();
+				this.second = time.getSeconds();
+			},
+			initData() {
+				this.initSelectValue();
+				this.reset = false;
+				switch (this.type) {
+					case 1:
+						this.value = [0, 0, 0, 0, 0];
+						this.setYears();
+						this.setMonths();
+						this.setDays();
+						this.setHours();
+						this.setMinutes();
+						break;
+					case 2:
+						this.value = [0, 0, 0];
+						this.setYears();
+						this.setMonths();
+						this.setDays();
+						break;
+					case 3:
+						this.value = [0, 0];
+						this.setYears();
+						this.setMonths();
+						break;
+					case 4:
+						this.value = [0, 0];
+						this.setHours();
+						this.setMinutes();
+						break;
+					case 5:
+						this.value = [0, 0, 0];
+						this.setHours();
+						this.setMinutes();
+						this.setSeconds();
+						break;
+					case 6:
+						this.value = [0, 0];
+						this.setMinutes();
+						this.setSeconds();
+						break;
+					case 7:
+						this.value = [0, 0, 0, 0, 0, 0];
+						this.setYears();
+						this.setMonths();
+						this.setDays();
+						this.setHours();
+						this.setMinutes();
+						this.setSeconds();
+						break;
+					default:
+						break;
+				}
+			},
+			setYears() {
+				this.years = this.generateArray(this.startYear, this.endYear);
+				setTimeout(() => {
+					this.$set(this.value, 0, this.getIndex(this.years, this.year));
+				}, 8);
+			},
+			setMonths() {
+				this.months = this.generateArray(1, 12);
+				setTimeout(() => {
+					this.$set(this.value, 1, this.getIndex(this.months, this.month));
+				}, 8);
+			},
+			setDays() {
+				if (this.type == 3 || this.type == 4) return;
+				let totalDays = new Date(this.year, this.month, 0).getDate();
+				this.days = this.generateArray(1, totalDays);
+				setTimeout(() => {
+					this.$set(this.value, 2, this.getIndex(this.days, this.day));
+				}, 8);
+			},
+			setHours() {
+				this.hours = this.generateArray(0, 23);
+				setTimeout(() => {
+					let index = this.type == 5 || this.type == 7 ? this.value.length - 3 : this.value.length - 2;
+					this.$set(this.value, index, this.getIndex(this.hours, this.hour));
+				}, 8);
+			},
+			setMinutes() {
+				this.minutes = this.generateArray(0, 59);
+				setTimeout(() => {
+					let index = this.type > 4 ? this.value.length - 2 : this.value.length - 1;
+					this.$set(this.value, index, this.getIndex(this.minutes, this.minute));
+				}, 8);
+			},
+			setSeconds() {
+				this.seconds = this.generateArray(0, 59);
+				setTimeout(() => {
+					this.$set(this.value, this.value.length - 1, this.getIndex(this.seconds, this.second));
+				}, 8);
+			},
+			show() {
+				setTimeout(() => {
+					this.isShow = true;
+				}, 50);
+			},
+			hide() {
+				this.isShow = false;
+			},
+			change(e) {
+				this.value = e.detail.value;
+				switch (this.type) {
+					case 1:
+						this.year = this.years[this.value[0]];
+						this.month = this.months[this.value[1]];
+						this.day = this.days[this.value[2]];
+						this.hour = this.hours[this.value[3]];
+						this.minute = this.minutes[this.value[4]];
+						break;
+					case 2:
+						this.year = this.years[this.value[0]];
+						this.month = this.months[this.value[1]];
+						this.day = this.days[this.value[2]];
+						break;
+					case 3:
+						this.year = this.years[this.value[0]];
+						this.month = this.months[this.value[1]];
+						break;
+					case 4:
+						this.hour = this.hours[this.value[0]];
+						this.minute = this.minutes[this.value[1]];
+						break;
+					case 5:
+						this.hour = this.hours[this.value[0]];
+						this.minute = this.minutes[this.value[1]];
+						this.second = this.seconds[this.value[2]];
+						break;
+					case 6:
+						this.minute = this.minutes[this.value[0]];
+						this.second = this.seconds[this.value[1]];
+						break;
+					case 7:
+						this.year = this.years[this.value[0]];
+						this.month = this.months[this.value[1]];
+						this.day = this.days[this.value[2]];
+						this.hour = this.hours[this.value[3]];
+						this.minute = this.minutes[this.value[4]];
+						this.second = this.seconds[this.value[5]];
+						break;
+					default:
+						break;
+				}
+			},
+			btnFix() {
+				setTimeout(() => {
+					let result = {};
+					let year = this.year;
+					let month = this.formatNum(this.month || 0);
+					let day = this.formatNum(this.day || 0);
+					let hour = this.formatNum(this.hour || 0);
+					let minute = this.formatNum(this.minute || 0);
+					let second = this.formatNum(this.second || 0);
+					switch (this.type) {
+						case 1:
+							result = {
+								year: year,
+								month: month,
+								day: day,
+								hour: hour,
+								minute: minute,
+								result: `${year}-${month}-${day} ${hour}:${minute}`
+							};
+							break;
+						case 2:
+							result = {
+								year: year,
+								month: month,
+								day: day,
+								result: `${year}-${month}-${day}`
+							};
+							break;
+						case 3:
+							result = {
+								year: year,
+								month: month,
+								result: `${year}-${month}`
+							};
+							break;
+						case 4:
+							result = {
+								hour: hour,
+								minute: minute,
+								result: `${hour}:${minute}`
+							};
+							break;
+						case 5:
+							result = {
+								hour: hour,
+								minute: minute,
+								second: second,
+								result: `${hour}:${minute}:${second}`
+							};
+							break;
+						case 6:
+							result = {
+								minute: minute,
+								second: second,
+								result: `${minute}:${second}`
+							};
+							break;
+						case 7:
+							result = {
+								year: year,
+								month: month,
+								day: day,
+								hour: hour,
+								minute: minute,
+								second: second,
+								result: `${year}-${month}-${day} ${hour}:${minute}:${second}`
+							};
+							break;
+						default:
+							break;
+					}
+					this.$emit('confirm', result);
+					this.hide();
+				}, 80);
+			}
+		}
+	};
+</script>
+
+<style scoped>
+	.tui-datetime-picker {
+		position: relative;
+		z-index: 999;
+	}
+
+	.tui-picker-view {
+		height: 100%;
+		box-sizing: border-box;
+	}
+
+	.tui-mask {
+		position: fixed;
+		z-index: 9998;
+		top: 0;
+		right: 0;
+		bottom: 0;
+		left: 0;
+		background-color: rgba(0, 0, 0, 0.6);
+		visibility: hidden;
+		opacity: 0;
+		transition: all 0.3s ease-in-out;
+	}
+
+	.tui-mask-show {
+		visibility: visible !important;
+		opacity: 1 !important;
+	}
+
+	.tui-header {
+		z-index: 9999;
+		position: fixed;
+		bottom: 0;
+		left: 0;
+		width: 100%;
+		transition: all 0.3s ease-in-out;
+		transform: translateY(100%);
+	}
+
+	.tui-date-header {
+		width: 100%;
+		height: 52rpx;
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		background-color: #fff;
+		font-size: 26rpx;
+		line-height: 26rpx;
+		color: #555;
+		/* #ifdef MP */
+		box-shadow: 0 15rpx 10rpx -15rpx #efefef;
+		/* #endif */
+		/* #ifndef MP */
+		box-shadow: 0 15rpx 10rpx -15rpx #888;
+		/* #endif */
+		position: relative;
+		z-index: 2;
+	}
+
+	.tui-date-unit {
+		flex: 1;
+		text-align: center;
+	}
+
+	.tui-show {
+		transform: translateY(0);
+	}
+
+	.tui-picker-header {
+		width: 100%;
+		height: 90rpx;
+		padding: 0 40rpx;
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		box-sizing: border-box;
+		font-size: 32rpx;
+		background-color: #fff;
+		position: relative;
+	}
+
+	.tui-date-radius {
+		border-top-left-radius: 20rpx;
+		border-top-right-radius: 20rpx;
+		overflow: hidden;
+	}
+
+	.tui-picker-header::after {
+		content: '';
+		position: absolute;
+		border-bottom: 1rpx solid #eaeef1;
+		-webkit-transform: scaleY(0.5);
+		transform: scaleY(0.5);
+		bottom: 0;
+		right: 0;
+		left: 0;
+	}
+
+	.tui-picker-body {
+		width: 100%;
+		height: 520rpx;
+		overflow: hidden;
+		background-color: #fff;
+	}
+
+	.tui-column-item {
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		font-size: 36rpx;
+		color: #333;
+	}
+
+	.tui-font-size_32 {
+		font-size: 32rpx !important;
+	}
+
+	.tui-unit-text {
+		font-size: 24rpx !important;
+		padding-left: 8rpx;
+	}
+
+	.tui-btn-picker {
+		padding: 16rpx;
+		box-sizing: border-box;
+		text-align: center;
+		text-decoration: none;
+	}
+
+	.tui-opacity {
+		opacity: 0.5;
+	}
+</style>

+ 103 - 0
components/thorui/tui-divider/tui-divider.vue

@@ -0,0 +1,103 @@
+<template>
+	<view class="tui-divider" :style="{ height: height + 'rpx' }">
+		<view class="tui-divider-line" :style="{ width: width, background: getBgColor(gradual, gradualColor, dividerColor) }"></view>
+		<view
+			class="tui-divider-text"
+			:style="{ color: color, fontSize: size + 'rpx', lineHeight: size + 'rpx', backgroundColor: backgroundColor, fontWeight: bold ? 'bold' : 'normal' }"
+		>
+			<slot></slot>
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	name: 'tuiDivider',
+	props: {
+		//divider占据高度
+		height: {
+			type: Number,
+			default: 100
+		},
+		//divider宽度,可填写具体长度,如400rpx
+		width: {
+			type: String,
+			default: '100%'
+		},
+		//divider颜色,如果为渐变线条,此属性失效
+		dividerColor: {
+			type: String,
+			default: '#e5e5e5'
+		},
+		//文字颜色
+		color: {
+			type: String,
+			default: '#999'
+		},
+		//文字大小 rpx
+		size: {
+			type: Number,
+			default: 24
+		},
+		bold: {
+			type: Boolean,
+			default: false
+		},
+		//背景颜色,和当前页面背景色保持一致
+		backgroundColor: {
+			type: String,
+			default: '#fafafa'
+		},
+		//是否为渐变线条,为true,divideColor失效
+		gradual: {
+			type: Boolean,
+			default: false
+		},
+		//渐变色值,to right ,提供两个色值即可,由浅至深
+		gradualColor: {
+			type: Array,
+			default: function() {
+				return ['#eee', '#ccc'];
+			}
+		}
+	},
+	methods: {
+		getBgColor: function(gradual, gradualColor, dividerColor) {
+			let bgColor = dividerColor;
+			if (gradual) {
+				bgColor = 'linear-gradient(to right,' + gradualColor[0] + ',' + gradualColor[1] + ',' + gradualColor[1] + ',' + gradualColor[0] + ')';
+			}
+			return bgColor;
+		}
+	}
+};
+</script>
+
+<style scoped>
+.tui-divider {
+	width: 100%;
+	position: relative;
+	text-align: center;
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	box-sizing: border-box;
+	overflow: hidden;
+}
+
+.tui-divider-line {
+	position: absolute;
+	height: 1rpx;
+	top: 50%;
+	left: 50%;
+	-webkit-transform: scaleY(0.5) translateX(-50%) translateZ(0);
+	transform: scaleY(0.5) translateX(-50%) translateZ(0);
+}
+
+.tui-divider-text {
+	position: relative;
+	text-align: center;
+	padding: 0 18rpx;
+	z-index: 1;
+}
+</style>

+ 98 - 0
components/thorui/tui-drawer/tui-drawer.vue

@@ -0,0 +1,98 @@
+<template>
+	<view  @touchmove.stop.prevent>
+		<view v-if="mask" class="tui-drawer-mask" :class="{'tui-drawer-mask_show':visible}" @tap="handleMaskClick"></view>
+		<view class="tui-drawer-container" :class="[mode=='left'?'tui-drawer-container_left':'tui-drawer-container_right',visible?'tui-drawer-container_show':'']">
+			<slot></slot>
+		</view>
+	</view>
+
+</template>
+
+<script>
+	/**
+	 * 超过一屏时插槽使用scroll-view
+	 **/
+	export default {
+		name:"tuiDrawer",
+		props: {
+			visible: {
+				type: Boolean,
+				default: false
+			},
+			mask: {
+				type: Boolean,
+				default: true
+			},
+			maskClosable: {
+				type: Boolean,
+				default: true
+			},
+			mode: {
+				type: String,
+				default: 'true' // left right
+			}
+		},
+		methods: {
+			handleMaskClick() {
+				if (!this.maskClosable) {
+					return;
+				}
+				this.$emit('close', {});
+			}
+		}
+	}
+</script>
+
+<style scoped>
+	.tui-drawer-mask {
+		opacity: 0;
+		visibility: hidden;
+		position: fixed;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		z-index: 8888;
+		background-color: rgba(0, 0, 0, 0.6);
+		transition: all 0.3s ease-in-out;
+	}
+	.tui-drawer-mask_show {
+		display: block;
+		visibility: visible;
+		opacity: 1;
+	}
+
+	.tui-drawer-container {
+		position: fixed;
+		left: 50%;
+		height: 100.2%;
+		top: 0;
+		transform: translate3d(-50%, -50%, 0);
+		transform-origin: center;
+		transition: all 0.3s ease-in-out;
+		z-index: 99999;
+		opacity: 0;
+		overflow-y: scroll;
+		background-color: #fff;
+		-webkit-overflow-scrolling: touch;
+		-ms-touch-action: pan-y cross-slide-y;
+		-ms-scroll-chaining: none;
+		-ms-scroll-limit: 0 50 0 50;
+	}
+	.tui-drawer-container_left {
+		left: 0;
+		top: 50%;
+		transform: translate3d(-100%, -50%, 0);
+	}
+
+	.tui-drawer-container_right {
+		right: 0;
+		top: 50%;
+		left: auto;
+		transform: translate3d(100%, -50%, 0);
+	}
+	.tui-drawer-container_show {
+		opacity: 1;
+		transform: translate3d(0, -50%, 0);
+	}
+</style>

+ 69 - 0
components/thorui/tui-dropdown-list/tui-dropdown-list.vue

@@ -0,0 +1,69 @@
+<template>
+	<view class="tui-selected-class tui-dropdown-list" :style="{ height: selectHeight ? selectHeight + 'rpx' : 'auto' }">
+		<slot name="selectionbox"></slot>
+		<view
+			class="tui-dropdown-view"
+			:class="[show ? 'tui-dropdownlist-show' : '']"
+			:style="{ backgroundColor: backgroundColor, height: show ? height + 'rpx' : 0, top: top + 'rpx' }"
+		>
+			<slot name="dropdownbox"></slot>
+		</view>
+	</view>
+</template>
+
+<script>
+export default {
+	name: 'tuiDropdownList',
+	props: {
+		//控制显示
+		show: {
+			type: Boolean,
+			default: false
+		},
+		//背景颜色
+		backgroundColor: {
+			type: String,
+			default: 'transparent'
+		},
+		//top  rpx
+		top: {
+			type: Number,
+			default: 0
+		},
+		//下拉框高度 rpx
+		height: {
+			type: Number,
+			default: 0
+		},
+		//选择框高度 单位rpx
+		selectHeight: {
+			type: Number,
+			default: 0
+		}
+	},
+	methods: {}
+};
+</script>
+
+<style scoped>
+.tui-dropdown-list {
+	position: relative;
+}
+
+.tui-dropdown-view {
+	width: 100%;
+	overflow: hidden;
+	position: absolute;
+	z-index: -99;
+	left: 0;
+	opacity: 0;
+	/* visibility: hidden; */
+	transition: all 0.2s ease-in-out;
+}
+
+.tui-dropdownlist-show {
+	opacity: 1;
+	z-index: 996;
+	/* visibility: visible; */
+}
+</style>

+ 137 - 0
components/thorui/tui-grid-item/tui-grid-item.vue

@@ -0,0 +1,137 @@
+<template>
+	<view class="tui-grid" :class="[bottom?'':'tui-grid-bottom','tui-grid-'+(cell<2?3:cell)]" :hover-class="hover?'tui-item-hover':''"
+	 :hover-stay-time="150" :style="{backgroundColor:backgroundColor}" @tap="handleClick">
+		<view class='tui-grid-bg'>
+			<slot></slot>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "tuiGridItem",
+		props: {
+			cell: {
+				type: [Number,String],
+				default: 3
+			},
+			backgroundColor: {
+				type: String,
+				default: "#fff"
+			},
+			//是否有点击效果
+			hover: {
+				type: Boolean,
+				default: true
+			},
+			//底部线条
+			bottom: {
+				type: Boolean,
+				default: true
+			},
+			index: {
+				type: Number,
+				default: 0
+			}
+		},
+		methods: {
+			handleClick() {
+				this.$emit('click', {
+					index: this.index
+				});
+			}
+		}
+	}
+</script>
+
+<style scoped>
+	.tui-grid {
+		position: relative;
+		padding: 40rpx 20rpx;
+		box-sizing: border-box;
+		background: #fff;
+		float: left;
+	}
+
+	.tui-grid-2 {
+		width: 50%;
+	}
+
+	.tui-grid-3 {
+		width: 33.333333333%;
+	}
+
+	.tui-grid-4 {
+		width: 25%;
+		padding: 30rpx 20rpx !important;
+	}
+
+	.tui-grid-5 {
+		width: 20%;
+		padding: 20rpx !important;
+	}
+
+	.tui-grid-2:nth-of-type(2n)::before {
+		width: 0;
+		border-right: 0;
+	}
+
+	.tui-grid-3:nth-of-type(3n)::before {
+		width: 0;
+		border-right: 0;
+	}
+
+	.tui-grid-4:nth-of-type(4n)::before {
+		width: 0;
+		border-right: 0;
+	}
+
+	.tui-grid-5:nth-of-type(5n)::before {
+		width: 0;
+		border-right: 0;
+	}
+
+	.tui-grid::before {
+		content: " ";
+		position: absolute;
+		right: 0;
+		top: 0;
+		width: 1px;
+		bottom: 0;
+		border-right: 1px solid #eaeef1;
+		-webkit-transform-origin: 100% 0;
+		transform-origin: 100% 0;
+		-webkit-transform: scaleX(0.5);
+		transform: scaleX(0.5);
+	}
+
+	.tui-grid::after {
+		content: " ";
+		position: absolute;
+		left: 0;
+		bottom: 0;
+		right: 0;
+		height: 1px;
+		border-bottom: 1px solid #eaeef1;
+		-webkit-transform-origin: 0 100%;
+		transform-origin: 0 100%;
+		-webkit-transform: scaleY(0.5);
+		transform: scaleY(0.5);
+	}
+
+	.tui-grid-bottom::after {
+		height: 0 !important;
+		border-bottom: 0 !important
+	}
+
+	.tui-grid-bg {
+		position: relative;
+		padding: 0;
+		width: 100%;
+		box-sizing: border-box;
+	}
+
+	.tui-item-hover {
+		background-color: #f7f7f9 !important;
+	}
+</style>

+ 44 - 0
components/thorui/tui-grid/tui-grid.vue

@@ -0,0 +1,44 @@
+<template>
+	<view class="tui-grids" :class="{'tui-border-top':unlined}">
+		<slot></slot>
+	</view>
+</template>
+
+<script>
+	export default {
+		name:"tuiGrid",
+		props: {
+			//是否去掉上线条
+			unlined: {
+				type: Boolean,
+				default: false
+			}
+		}
+	}
+</script>
+
+<style scoped>
+	.tui-grids {
+		width: 100%;
+		position: relative;
+		overflow: hidden;
+	}
+
+	.tui-grids::after {
+		content: " ";
+		position: absolute;
+		left: 0;
+		top: 0;
+		width: 100%;
+		height: 1px;
+		border-top: 1px solid #eaeef1;
+		-webkit-transform-origin: 0 0;
+		transform-origin: 0 0;
+		-webkit-transform: scaleY(0.5);
+		transform: scaleY(0.5);
+	}
+
+	.tui-border-top::after {
+		border-top: 0 !important;
+	}
+</style>

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 55 - 0
components/thorui/tui-icon/tui-icon.vue


+ 78 - 0
components/thorui/tui-loading/tui-loading.vue

@@ -0,0 +1,78 @@
+<template>
+	<view class="tui-loading-init">
+		<view class="tui-loading-center"></view>
+		<view class="tui-loadmore-tips">{{text}}</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "tuiLoading",
+		props: {
+			text: {
+				type: String,
+				default: "正在加载..."
+			}
+		}
+	}
+</script>
+
+<style scoped>
+	.tui-loading-init {
+		min-width: 200rpx;
+		min-height: 200rpx;
+		max-width: 500rpx;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		flex-direction: column;
+		position: fixed;
+		top: 50%;
+		left: 50%;
+		transform: translate(-50%, -50%);
+		z-index: 9999;
+		font-size: 26rpx;
+		color: #fff;
+		background-color: rgba(0, 0, 0, 0.7);
+		border-radius: 10rpx;
+	}
+
+	.tui-loading-center {
+		width: 50rpx;
+		height: 50rpx;
+		border: 3px solid #fff;
+		border-radius: 50%;
+		margin: 0 6px;
+		display: inline-block;
+		vertical-align: middle;
+		clip-path: polygon(0% 0%, 100% 0%, 100% 40%, 0% 40%);
+		animation: rotate 1s linear infinite;
+		margin-bottom: 36rpx;
+	}
+
+	.tui-loadmore-tips {
+		text-align: center;
+		padding: 0 20rpx;
+		box-sizing: border-box;
+	}
+
+	@-webkit-keyframes rotate {
+		from {
+			transform: rotatez(0deg);
+		}
+
+		to {
+			transform: rotatez(360deg);
+		}
+	}
+
+	@keyframes rotate {
+		from {
+			transform: rotatez(0deg);
+		}
+
+		to {
+			transform: rotatez(360deg);
+		}
+	}
+</style>

+ 166 - 0
components/thorui/tui-loadmore/tui-loadmore.vue

@@ -0,0 +1,166 @@
+<template>
+	<view class="tui-loadmore" v-if="visible">
+		<view :class="['tui-loading-'+index, (index==3 && type)?'tui-loading-'+type:'']"></view>
+		<view class="tui-loadmore-tips">{{text}}</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "tuiLoadmore",
+		props: {
+			//显示文本
+			text: {
+				type: String,
+				default: "正在加载..."
+			},
+			//是否可见
+			visible: {
+				type: Boolean,
+				default: false
+			},
+			//loading 样式 :1,2,3
+			index: {
+				type: Number,
+				default: 1
+			},
+			//颜色设置,只有index=3时生效:primary,red,orange,green
+			type: {
+				type: String,
+				default: ""
+			}
+		}
+	}
+</script>
+
+<style scoped>
+	.tui-loadmore {
+		width: 48%;
+		margin: 1.5em auto;
+		line-height: 1.5em;
+		font-size: 24rpx;
+		text-align: center;
+	}
+
+	.tui-loading-1 {
+		margin: 0 5px;
+		width: 20px;
+		height: 20px;
+		display: inline-block;
+		vertical-align: middle;
+		-webkit-animation: a 1s steps(12) infinite;
+		animation: a 1s steps(12) infinite;
+		background: transparent url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxMjAiIGhlaWdodD0iMTIwIiB2aWV3Qm94PSIwIDAgMTAwIDEwMCI+PHBhdGggZmlsbD0ibm9uZSIgZD0iTTAgMGgxMDB2MTAwSDB6Ii8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTlFOUU5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgLTMwKSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iIzk4OTY5NyIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgzMCAxMDUuOTggNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjOUI5OTlBIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDYwIDc1Ljk4IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0EzQTFBMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSg5MCA2NSA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNBQkE5QUEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoMTIwIDU4LjY2IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0IyQjJCMiIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgxNTAgNTQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjQkFCOEI5IiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKDE4MCA1MCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDMkMwQzEiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTE1MCA0NS45OCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNDQkNCQ0IiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTEyMCA0MS4zNCA2NSkiLz48cmVjdCB3aWR0aD0iNyIgaGVpZ2h0PSIyMCIgeD0iNDYuNSIgeT0iNDAiIGZpbGw9IiNEMkQyRDIiIHJ4PSI1IiByeT0iNSIgdHJhbnNmb3JtPSJyb3RhdGUoLTkwIDM1IDY1KSIvPjxyZWN0IHdpZHRoPSI3IiBoZWlnaHQ9IjIwIiB4PSI0Ni41IiB5PSI0MCIgZmlsbD0iI0RBREFEQSIgcng9IjUiIHJ5PSI1IiB0cmFuc2Zvcm09InJvdGF0ZSgtNjAgMjQuMDIgNjUpIi8+PHJlY3Qgd2lkdGg9IjciIGhlaWdodD0iMjAiIHg9IjQ2LjUiIHk9IjQwIiBmaWxsPSIjRTJFMkUyIiByeD0iNSIgcnk9IjUiIHRyYW5zZm9ybT0icm90YXRlKC0zMCAtNS45OCA2NSkiLz48L3N2Zz4=) no-repeat;
+		background-size: 100%;
+	}
+
+	@-webkit-keyframes a {
+		0% {
+			-webkit-transform: rotate(0deg);
+			transform: rotate(0deg);
+		}
+
+		to {
+			-webkit-transform: rotate(1turn);
+			transform: rotate(1turn);
+		}
+	}
+
+	@keyframes a {
+		0% {
+			-webkit-transform: rotate(0deg);
+			transform: rotate(0deg);
+		}
+
+		to {
+			-webkit-transform: rotate(1turn);
+			transform: rotate(1turn);
+		}
+	}
+
+	.tui-loadmore-tips {
+		display: inline-block;
+		vertical-align: middle;
+	}
+
+	.tui-loading-2 {
+		width: 28rpx;
+		height: 28rpx;
+		border: 1px solid #8f8d8e;
+		border-radius: 50%;
+		margin: 0 6px;
+		display: inline-block;
+		vertical-align: middle;
+		clip-path: polygon(0% 0%,100% 0%,100% 30%,0% 30%);
+		animation: rotate 1s linear infinite;
+	}
+
+	@-webkit-keyframes rotate {
+		from {
+			transform: rotatez(0deg);
+		}
+
+		to {
+			transform: rotatez(360deg);
+		}
+	}
+
+	@keyframes rotate {
+		from {
+			transform: rotatez(0deg);
+		}
+
+		to {
+			transform: rotatez(360deg);
+		}
+	}
+
+	.tui-loading-3 {
+		display: inline-block;
+		margin: 0 6px;
+		vertical-align: middle;
+		width: 28rpx;
+		height: 28rpx;
+		background: 0 0;
+		border-radius: 50%;
+		border: 2px solid;
+		border-color: #e5e5e5 #e5e5e5 #e5e5e5 #8f8d8e;
+		animation: tui-rotate 0.7s linear infinite;
+	}
+
+	.tui-loading-3.tui-loading-primary {
+		border-color: #e5e5e5 #e5e5e5 #e5e5e5 #5677fc;
+	}
+
+	.tui-loading-3.tui-loading-green {
+		border-color: #e5e5e5 #e5e5e5 #e5e5e5 #19be6b;
+	}
+
+	.tui-loading-3.tui-loading-orange {
+		border-color: #e5e5e5 #e5e5e5 #e5e5e5 #ff7900;
+	}
+
+	.tui-loading-3.tui-loading-red {
+		border-color: #ededed #ededed #ededed #ed3f14;
+	}
+
+	@-webkit-keyframes tui-rotate {
+		0% {
+			transform: rotate(0);
+		}
+
+		100% {
+			transform: rotate(360deg);
+		}
+	}
+
+	@keyframes tui-rotate {
+		0% {
+			transform: rotate(0);
+		}
+
+		100% {
+			transform: rotate(360deg);
+		}
+	}
+</style>

+ 374 - 0
components/thorui/tui-modal/tui-modal.vue

@@ -0,0 +1,374 @@
+<template>
+	<view @touchmove.stop.prevent>
+		<view class="tui-modal-box" :style="{width:width,padding:padding,borderRadius:radius}" :class="[(fadeIn || show)?'tui-modal-normal':'tui-modal-scale',show?'tui-modal-show':'']">
+			<view v-if="!custom">
+				<view class="tui-modal-title" v-if="title">{{title}}</view>
+				<view class="tui-modal-content" :class="[title?'':'tui-mtop']" :style="{color:color,fontSize:size+'rpx'}">{{content}}</view>
+				<view class="tui-modalBtn-box" :class="[button.length!=2?'tui-flex-column':'']">
+					<block v-for="(item,index) in button" :key="index">
+						<button class="tui-modal-btn" :class="['tui-'+(item.type || 'primary')+(item.plain?'-outline':''),button.length!=2?'tui-btn-width':'',button.length>2?'tui-mbtm':'',shape=='circle'?'tui-circle-btn':'']"
+						 :hover-class="'tui-'+(item.plain?'outline':(item.type || 'primary'))+'-hover'" :data-index="index" @tap="handleClick">{{item.text || "确定"}}</button>
+					</block>
+				</view>
+			</view>
+			<view v-else>
+				<slot></slot>
+			</view>
+		</view>
+		<view class="tui-modal-mask" :class="[show?'tui-mask-show':'']" @tap="handleClickCancel"></view>
+
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "tuiModal",
+		props: {
+			//是否显示
+			show: {
+				type: Boolean,
+				default: false
+			},
+			width: {
+				type: String,
+				default: "84%"
+			},
+			padding: {
+				type: String,
+				default: "40rpx 64rpx"
+			},
+			radius: {
+				type: String,
+				default: "24rpx"
+			},
+			//标题
+			title: {
+				type: String,
+				default: ""
+			},
+			//内容
+			content: {
+				type: String,
+				default: ""
+			},
+			//内容字体颜色
+			color: {
+				type: String,
+				default: "#999"
+			},
+			//内容字体大小 rpx
+			size: {
+				type: Number,
+				default: 28
+			},
+			//形状 circle, square
+			shape: {
+				type: String,
+				default: 'square'
+			},
+			button: {
+				type: Array,
+				default: function() {
+					return [{
+						text: "取消",
+						type: "danger",
+						plain: true //是否空心
+					}, {
+						text: "确定",
+						type: "danger",
+						plain: false
+					}]
+				}
+			},
+			//点击遮罩 是否可关闭
+			maskClosable: {
+				type: Boolean,
+				default: true
+			},
+			//淡入效果,自定义弹框插入input输入框时传true
+			fadeIn: {
+				type: Boolean,
+				default: false
+			},
+			//自定义弹窗内容
+			custom: {
+				type: Boolean,
+				default: false
+			}
+		},
+		data() {
+			return {
+
+			};
+		},
+		methods: {
+			handleClick(e) {
+				if (!this.show) return;
+				const dataset = e.currentTarget.dataset;
+				this.$emit('click', {
+					index: Number(dataset.index)
+				});
+			},
+			handleClickCancel() {
+				if (!this.maskClosable) return;
+				this.$emit('cancel');
+			}
+		}
+	}
+</script>
+
+<style scoped>
+	.tui-modal-box {
+		position: fixed;
+		left: 50%;
+		top: 50%;
+		margin: auto;
+		background-color: #fff;
+		z-index: 9999998;
+		transition: all 0.3s ease-in-out;
+		opacity: 0;
+		box-sizing: border-box;
+		visibility: hidden;
+	}
+
+	.tui-modal-scale {
+		transform: translate(-50%, -50%) scale(0);
+	}
+
+	.tui-modal-normal {
+		transform: translate(-50%, -50%) scale(1);
+	}
+
+	.tui-modal-show {
+		opacity: 1;
+		visibility: visible;
+	}
+
+	.tui-modal-mask {
+		position: fixed;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+		background-color: rgba(0, 0, 0, 0.6);
+		z-index: 9999996;
+		transition: all 0.3s ease-in-out;
+		opacity: 0;
+		visibility: hidden;
+	}
+
+	.tui-mask-show {
+		visibility: visible;
+		opacity: 1;
+	}
+
+	.tui-modal-title {
+		text-align: center;
+		font-size: 34rpx;
+		color: #333;
+		padding-top: 20rpx;
+		font-weight: bold;
+	}
+
+	.tui-modal-content {
+		text-align: center;
+		color: #999;
+		font-size: 28rpx;
+		padding-top: 20rpx;
+		padding-bottom: 60rpx;
+	}
+
+	.tui-mtop {
+		margin-top: 30rpx;
+	}
+
+	.tui-mbtm {
+		margin-bottom: 30rpx;
+	}
+
+	.tui-modalBtn-box {
+		width: 100%;
+		display: flex;
+		align-items: center;
+		justify-content: space-between
+	}
+
+	.tui-flex-column {
+		flex-direction: column;
+	}
+
+	.tui-modal-btn {
+		width: 46%;
+		height: 68rpx;
+		line-height: 68rpx;
+		position: relative;
+		border-radius: 10rpx;
+		font-size: 26rpx;
+		overflow: visible;
+		margin-left: 0;
+		margin-right: 0;
+	}
+
+	.tui-modal-btn::after {
+		content: " ";
+		position: absolute;
+		width: 200%;
+		height: 200%;
+		-webkit-transform-origin: 0 0;
+		transform-origin: 0 0;
+		-webkit-transform: scale(0.5, 0.5);
+		transform: scale(0.5, 0.5);
+		left: 0;
+		top: 0;
+		border-radius: 20rpx;
+	}
+
+	.tui-btn-width {
+		width: 80% !important;
+	}
+
+	.tui-primary {
+		background: #5677fc;
+		color: #fff;
+	}
+
+	.tui-primary-hover {
+		background: #4a67d6;
+		color: #e5e5e5;
+	}
+
+	.tui-primary-outline {
+		color: #5677fc;
+		background: transparent;
+	}
+
+	.tui-primary-outline::after {
+		border: 1px solid #5677fc;
+	}
+
+	.tui-danger {
+		background: #191919 !important;
+		color: #fff;
+	}
+
+	.tui-danger-hover {
+		background: #191919;
+		color: #e5e5e5;
+	}
+
+	.tui-danger-outline {
+		color: #191919;
+		background: transparent;
+	}
+
+	.tui-danger-outline::after {
+		border: 1px solid #191919;
+	}
+
+	.tui-red {
+		background: #e41f19;
+		color: #fff;
+	}
+
+	.tui-red-hover {
+		background: #c51a15;
+		color: #e5e5e5;
+	}
+
+	.tui-red-outline {
+		color: #e41f19;
+		background: transparent;
+	}
+
+	.tui-red-outline::after {
+		border: 1px solid #e41f19;
+	}
+
+	.tui-warning {
+		background: #ff7900;
+		color: #fff;
+	}
+
+	.tui-warning-hover {
+		background: #e56d00;
+		color: #e5e5e5;
+	}
+
+	.tui-warning-outline {
+		color: #ff7900;
+		background: transparent;
+	}
+
+	.tui-warning-outline::after {
+		border: 1px solid #ff7900;
+	}
+
+	.tui-green {
+		background: #19be6b;
+		color: #fff;
+	}
+
+	.tui-green-hover {
+		background: #16ab60;
+		color: #e5e5e5;
+	}
+
+	.tui-green-outline {
+		color: #19be6b;
+		background: transparent;
+	}
+
+	.tui-green-outline::after {
+		border: 1px solid #19be6b;
+	}
+
+	.tui-white {
+		background: #fff;
+		color: #333;
+	}
+
+	.tui-white-hover {
+		background: #f7f7f9;
+		color: #666;
+	}
+
+	.tui-white-outline {
+		color: #333;
+		background: transparent;
+	}
+
+	.tui-white-outline::after {
+		border: 1px solid #333;
+	}
+
+	.tui-gray {
+		background: #ededed;
+		color: #999;
+	}
+
+	.tui-gray-hover {
+		background: #d5d5d5;
+		color: #898989;
+	}
+
+	.tui-gray-outline {
+		color: #999;
+		background: transparent;
+	}
+
+	.tui-gray-outline::after {
+		border: 1px solid #999;
+	}
+
+	.tui-outline-hover {
+		opacity: 0.6;
+	}
+
+	.tui-circle-btn {
+		border-radius: 40rpx !important;
+	}
+
+	.tui-circle-btn::after {
+		border-radius: 80rpx !important;
+	}
+</style>

+ 174 - 0
components/thorui/tui-navigation-bar/tui-navigation-bar.vue

@@ -0,0 +1,174 @@
+<template>
+	<view
+		class="tui-navigation-bar"
+		:class="{ 'tui-bar-line': opcity > 0.85 && splitLine, 'tui-navbar-fixed': isFixed }"
+		:style="{ height: height + 'px', backgroundColor: `rgba(${backgroundColor},${opcity})` }"
+	>
+		<view class="tui-status-bar" :style="{ height: statusBarHeight + 'px' }" v-if="isImmersive"></view>
+		<view class="tui-navigation_bar-title" :style="{ opacity: opcity, color: color, paddingTop: top - statusBarHeight + 'px' }" v-if="title && !isCustom">{{ title }}</view>
+		<slot />
+	</view>
+</template>
+
+<script>
+export default {
+	name: 'tuiNavigationBar',
+	props: {
+		//NavigationBar标题
+		title: {
+			type: String,
+			default: ''
+		},
+		//NavigationBar标题颜色
+		color: {
+			type: String,
+			default: '#fff'
+		},
+		//NavigationBar背景颜色 rgb
+		backgroundColor: {
+			type: String,
+			default: '86,119,252'
+		},
+		//是否需要分割线
+		splitLine: {
+			type: Boolean,
+			default: false
+		},
+		//是否设置不透明度
+		isOpcity: {
+			type: Boolean,
+			default: true
+		},
+		//滚动条滚动距离
+		scrollTop: {
+			type: [Number, String],
+			default: 0
+		},
+		/*
+		 isOpcity 为true时生效
+		 opcity=scrollTop /windowWidth * scrollRatio
+		*/
+		scrollRatio: {
+			type: [Number, String],
+			default: 0.3
+		},
+		//是否自定义header内容
+		isCustom: {
+			type: Boolean,
+			default: false
+		},
+		//是否沉浸式
+		isImmersive: {
+			type: Boolean,
+			default: true
+		},
+		isFixed: {
+			type: Boolean,
+			default: true
+		}
+	},
+	watch: {
+		scrollTop(newValue, oldValue) {
+			if (this.isOpcity) {
+				this.opcityChange();
+			}
+		}
+	},
+	data() {
+		return {
+			width: 375, //header宽度
+			left: 375, //小程序端 左侧距胶囊按钮距离
+			height: 44, //header高度
+			top: 0,
+			scrollH: 1, //滚动总高度,计算opcity
+			opcity: 0, //0-1
+			statusBarHeight: 0 //状态栏高度
+		};
+	},
+	created() {
+		this.opcity = this.isOpcity ? this.opcity : 1;
+		let obj = {};
+		// #ifdef MP-WEIXIN
+		obj = wx.getMenuButtonBoundingClientRect();
+		// #endif
+		// #ifdef MP-BAIDU
+		obj = swan.getMenuButtonBoundingClientRect();
+		// #endif
+		// #ifdef MP-ALIPAY
+		my.hideAddToDesktopMenu();
+		// #endif
+
+		uni.getSystemInfo({
+			success: res => {
+				this.statusBarHeight = res.statusBarHeight;
+				this.width = res.windowWidth;
+				this.left = obj.left || res.windowWidth;
+				if (this.isImmersive) {
+					this.height = obj.top ? obj.top + obj.height + 8 : res.statusBarHeight + 44;
+				}
+				this.scrollH = res.windowWidth * this.scrollRatio;
+				this.top = obj.top ? obj.top + (obj.height - 32) / 2 : res.statusBarHeight + 6;
+				this.$emit('init', {
+					width: this.width,
+					height: this.height,
+					left: obj.left,
+					top: this.top,
+					statusBarHeight: this.statusBarHeight,
+					opcity: this.opcity
+				});
+			}
+		});
+	},
+	methods: {
+		opcityChange() {
+			let scroll = this.scrollTop <= 1 ? 0 : this.scrollTop;
+			let opcity = scroll / this.scrollH;
+			if ((this.opcity >= 1 && opcity >= 1) || (this.opcity == 0 && opcity == 0)) {
+				return;
+			}
+			this.opcity = opcity;
+			this.$emit('change', {
+				opcity: this.opcity
+			});
+		}
+	}
+};
+</script>
+
+<style scoped>
+.tui-navigation-bar {
+	width: 100%;
+}
+.tui-navbar-fixed {
+	position: fixed;
+	left: 0;
+	top: 0;
+	z-index: 9998;
+}
+.tui-status-bar {
+	width: 100%;
+}
+.tui-navigation_bar-title {
+	width: 100%;
+	font-size: 17px;
+	line-height: 17px;
+	/* #ifndef APP-PLUS */
+	font-weight: 500;
+	/* #endif */
+	height: 32px;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+}
+
+.tui-bar-line::after {
+	content: '';
+	position: absolute;
+	border-bottom: 1rpx solid #eaeef1;
+	-webkit-transform: scaleY(0.5);
+	transform: scaleY(0.5);
+	bottom: 0;
+	right: 0;
+	left: 0;
+}
+</style>

+ 103 - 0
components/thorui/tui-no-data/tui-no-data.vue

@@ -0,0 +1,103 @@
+<template>
+	<view class="tui-nodata-box" :class="[fixed?'tui-nodata-fixed':'']">
+		<image v-if="imgUrl" :src="imgUrl" class="tui-tips-icon" :style="{width:imgWidth+'rpx',height:imgHeight+'rpx'}"></image>
+		<view class="tui-tips-content">
+			<slot></slot>
+		</view>
+		<button class="tui-tips-btn" hover-class="tui-tips-btn-hover" :style="{width:btnWidth+'rpx'}" v-if="btnText"  @tap="handleClick">{{btnText}}</button>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "tuiNoData",
+		props: {
+			//是否垂直居中
+			fixed: {
+				type: Boolean,
+				default: true
+			},
+			//图片地址,没有则不显示
+			imgUrl: {
+				type: String,
+				default: ""
+			},
+			//图片宽度
+			imgWidth: {
+				type: Number,
+				default: 200
+			},
+			//图片高度
+			imgHeight:{
+				type: Number,
+				default: 200
+			},
+			//按钮宽度
+			btnWidth:{
+				type: Number,
+				default: 200
+			},
+			//按钮文字,没有则不显示
+			btnText:{
+				type:String,
+				default: ""
+			}
+		},
+		methods: {
+			handleClick(e) {
+				this.$emit('click', {});
+			}
+		}
+	}
+</script>
+
+<style scoped>
+	.tui-nodata-box {
+		display: flex;
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+	}
+
+	.tui-nodata-fixed {
+		width: 90%;
+		position: fixed;
+		left: 50%;
+		top: 50%;
+		-webkit-transform: translate(-50%, -50%);
+		transform: translate(-50%, -50%);
+	}
+
+	.tui-tips-icon {
+		display: block;
+		flex-shrink: 0;
+		width: 280rpx;
+		height: 280rpx;
+		margin-bottom: 40rpx;
+	}
+
+	.tui-tips-content {
+		text-align: center;
+		color: #666666;
+		font-size: 28rpx;
+		padding: 0 50rpx 24rpx 50rpx;
+		box-sizing: border-box;
+		word-break: break-all;
+		word-wrap: break-word;
+	}
+
+	.tui-tips-btn {
+		height: 60rpx;
+		line-height: 60rpx;
+		font-size: 28rpx;
+		background-color: #EB0909;
+		color: #fff;
+		border-radius: 6rpx;
+		margin: 0;
+	}
+
+	.tui-tips-btn-hover {
+		background-color: #c80808;
+		color: #e5e5e5;
+	}
+</style>

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است