瀏覽代碼

commit -first 维沙小程序

zhengjinyi 4 年之前
父節點
當前提交
d7179bcc78
共有 100 個文件被更改,包括 26666 次插入2 次删除
  1. 169 0
      App.vue
  2. 18 2
      README.md
  3. 307 0
      api/use.js
  4. 174 0
      api/utils.js
  5. 64 0
      common/config/addressdata.js
  6. 126 0
      common/config/authorize.js
  7. 395 0
      common/config/caimeiApi.js
  8. 183 0
      common/config/common.js
  9. 57 0
      common/config/wxLogin.js
  10. 365 0
      common/css/common.scss
  11. 3 0
      common/css/iconfont.scss
  12. 2 0
      common/css/style/icon.css
  13. 2480 0
      common/css/style/thorui.css
  14. 39 0
      common/json/data.json.js
  15. 7 0
      components/clipboard/clipboard.min.js
  16. 55 0
      components/clipboard/clipboard.thorui.js
  17. 267 0
      components/clipboard/formValidation.js
  18. 25 0
      components/clipboard/utils.js
  19. 107 0
      components/cm-custom/au-custom.vue
  20. 122 0
      components/cm-custom/cm-custom.vue
  21. 148 0
      components/cm-custom/cm-drag.vue
  22. 114 0
      components/cm-custom/cu-custom.vue
  23. 159 0
      components/cm-custom/custom-d.vue
  24. 221 0
      components/cm-custom/custom-floor.vue
  25. 229 0
      components/cm-custom/custom-p.vue
  26. 139 0
      components/cm-module/activity/activity_01.vue
  27. 298 0
      components/cm-module/cm-seller/category.vue
  28. 183 0
      components/cm-module/cm-seller/home.vue
  29. 546 0
      components/cm-module/cm-seller/user.vue
  30. 201 0
      components/cm-module/creatOrder/choiceAddress.vue
  31. 171 0
      components/cm-module/creatOrder/freight.vue
  32. 365 0
      components/cm-module/creatOrder/goodsList.vue
  33. 683 0
      components/cm-module/creatOrder/invoiceTent.vue
  34. 202 0
      components/cm-module/creatOrder/sellerAddress.vue
  35. 511 0
      components/cm-module/creatOrder/sellerFreight.vue
  36. 367 0
      components/cm-module/creatOrder/sellerGoodsList.vue
  37. 696 0
      components/cm-module/creatOrder/sellerInvoice.vue
  38. 440 0
      components/cm-module/creatOrder/sellerRegulations.vue
  39. 199 0
      components/cm-module/headerNavbar/header-back.vue
  40. 237 0
      components/cm-module/headerNavbar/header-poduct.vue
  41. 162 0
      components/cm-module/headerNavbar/headerNavbar.vue
  42. 230 0
      components/cm-module/home/cm-custom.vue
  43. 157 0
      components/cm-module/homeIndex/banner.vue
  44. 160 0
      components/cm-module/homeIndex/customer.vue
  45. 158 0
      components/cm-module/homeIndex/navbars.vue
  46. 140 0
      components/cm-module/homeIndex/pageFloor.vue
  47. 308 0
      components/cm-module/homeIndex/pageSpecial.vue
  48. 137 0
      components/cm-module/homeIndex/supplierList.vue
  49. 417 0
      components/cm-module/listTemplate/buyagainList.vue
  50. 427 0
      components/cm-module/listTemplate/classifyProductList.vue
  51. 449 0
      components/cm-module/listTemplate/commodityList.vue
  52. 968 0
      components/cm-module/listTemplate/immediatelyList.vue
  53. 51 0
      components/cm-module/listTemplate/listSkeleton.vue
  54. 398 0
      components/cm-module/listTemplate/productList.vue
  55. 39 0
      components/cm-module/listTemplate/richTextTemplate.vue
  56. 828 0
      components/cm-module/listTemplate/secondHand.vue
  57. 135 0
      components/cm-module/modelAlert/cancelAlert.vue
  58. 125 0
      components/cm-module/modelAlert/errorAlert.vue
  59. 140 0
      components/cm-module/modelAlert/freightAlert.vue
  60. 135 0
      components/cm-module/modelAlert/modelAlert.vue
  61. 148 0
      components/cm-module/modelAlert/order-alert.vue
  62. 150 0
      components/cm-module/modelAlert/sellerShareAlert.vue
  63. 150 0
      components/cm-module/modelAlert/shareAlert.vue
  64. 158 0
      components/cm-module/modelAlert/supplierRegisreAlert.vue
  65. 178 0
      components/cm-module/modelAlert/supplierShareAlert.vue
  66. 156 0
      components/cm-module/modelAlert/upgradeAlert.vue
  67. 235 0
      components/cm-module/orderDetails/activipopu.vue
  68. 471 0
      components/cm-module/orderDetails/goodsList.vue
  69. 197 0
      components/cm-module/orderDetails/invoiceTent.vue
  70. 181 0
      components/cm-module/orderDetails/logisticsRecord.vue
  71. 167 0
      components/cm-module/orderDetails/orderAddress.vue
  72. 232 0
      components/cm-module/orderDetails/orderButton.vue
  73. 280 0
      components/cm-module/orderDetails/orderInformation.vue
  74. 212 0
      components/cm-module/orderDetails/orderListButton.vue
  75. 149 0
      components/cm-module/orderDetails/paymentRecord.vue
  76. 120 0
      components/cm-module/orderDetails/refundRecord.vue
  77. 259 0
      components/cm-module/orderDetails/sellerDetaileButton.vue
  78. 195 0
      components/cm-module/orderDetails/sellerOrderButton.vue
  79. 195 0
      components/cm-module/orderDetails/supplierDetaileButton.vue
  80. 203 0
      components/cm-module/orderDetails/supplierListButton.vue
  81. 127 0
      components/cm-module/orderDetails/supplierRecorgButton.vue
  82. 125 0
      components/cm-module/orderDetails/transfeRecord.vue
  83. 347 0
      components/cm-module/pageFloorTemplate/templateA.vue
  84. 359 0
      components/cm-module/pageFloorTemplate/templateB.vue
  85. 392 0
      components/cm-module/pageFloorTemplate/templateC.vue
  86. 382 0
      components/cm-module/pageFloorTemplate/templateD.vue
  87. 360 0
      components/cm-module/pageFloorTemplate/templateE.vue
  88. 332 0
      components/cm-module/pageFloorTemplate/templateF.vue
  89. 347 0
      components/cm-module/pageTemplate/templateA.vue
  90. 359 0
      components/cm-module/pageTemplate/templateB.vue
  91. 392 0
      components/cm-module/pageTemplate/templateC.vue
  92. 382 0
      components/cm-module/pageTemplate/templateD.vue
  93. 360 0
      components/cm-module/pageTemplate/templateE.vue
  94. 378 0
      components/cm-module/pageTemplate/templateF.vue
  95. 333 0
      components/cm-module/pageTemplate/templateG.vue
  96. 395 0
      components/cm-module/pageTemplate/templateH.vue
  97. 147 0
      components/cm-module/pageTemplate/templateNav.vue
  98. 263 0
      components/cm-module/productDetails/cm-activipopu.vue
  99. 79 0
      components/cm-module/productDetails/cm-attributes.vue
  100. 133 0
      components/cm-module/productDetails/cm-parameter.vue

+ 169 - 0
App.vue

@@ -0,0 +1,169 @@
+<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;
+					console.log(e);
+					if (modelmes.search('iPhone 11') || modelmes.search('iPhone 11 Pro Max') ||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:{
+			refresh(){
+				let TIME = (20*60)*1000;
+				setInterval(()=>{
+					authorize.getSetting().then(res =>{// console.log('是否已授权',res);//0:为取消授权 1:为已授权 2:为未操作
+						if(res == 1){
+							wxLogin.wxLoginAuthorize()
+						}else{
+							console.log('授权失败============>:'+'用户取消授权或者未操作')
+						}
+					}).catch(error=>{
+						console.log('授权失败============>:'+'用户授权失败,提醒用户重新授权')
+					})
+				},TIME)
+			},
+			diffTime(t){
+				let date = Date.now();
+				return (date -t) < 2*60*1000 ? false : true
+			}
+		},
+		onShow: function() {
+			
+		},
+		onHide: function() {
+			console.log('App Hide')
+		},
+	}
+</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-weisha
+caimei-applets-caimei --采美商城小程序
+
+项目介绍
+	-维沙采购商城小程序是用Dcloud推出的uni-app开发的一款小程序
+软件架构
+	-HBuild-X  微信开发者工具
+前端框架API
+	-uni-app  Vue.js  微信Api
+目录结构
+			
+运行项目
+	-下载安装HBuild-X
+	-导入项目文件
+	-点击运行到小程序模拟器->微信开发者工具(自动会编译打包开大微信开发者工具运行)
+使用说明
+
+这是一个基于uni-app的项目,所以要用HBuild-X 来打开预览(支持小程序、安卓、苹果)
+
 
-维沙小程序项目

+ 307 - 0
api/use.js

@@ -0,0 +1,307 @@
+/**
+ *@des 用户模块接口
+ *@author zhengjinyi
+ *@date 2020/03/19 14:56:57
+ *@param registerByPass
+ */
+import request from '@/common/config/caimeiApi.js'
+import $reg from '@/common/config/common.js'
+/**
+ *机构普通注册
+ */
+export function organizationVerifyRegisterFirst(params) {
+	return new Promise(function(resolve,reject) {
+		if( params.userName == ''){
+			uni.showToast({title: '请输入联系人名称',duration: 2000,mask:true,icon:'none'})
+			return
+		}
+		if( params.bindMobile == ''){
+			uni.showToast({title: '请输入手机号',duration: 2000,mask:true,icon:'none'})
+			return
+		}
+		if(!$reg.isMobile(params.bindMobile)){
+			uni.showToast({title: '手机格式不正确',duration: 2000,mask:true,icon:'none'})
+			return
+		}
+		if( params.activationCode == ''){
+			uni.showToast({title: '请输入手机验证码',duration: 2000,mask:true,icon:'none'})
+			return
+		}
+		if(!$reg.isMobileCode(params.activationCode)){
+			uni.showToast({title: '验证码格式不正确',duration: 2000,mask:true,icon:'none'})
+			return
+		}
+		if( params.password == ''){
+			uni.showToast({title: '请输入密码',duration: 2000,mask:true,icon:'none'})
+			return
+		}
+		if(!$reg.checkPwd(params.password)){
+			uni.showToast({title: '密码必须为8-16位字母数字的组合',duration: 2000,mask:true,icon:'none'})
+			return
+		}
+		if( params.passWordConfirm == ''){
+			uni.showToast({title: '请再次确认密码',duration: 2000,mask:true,icon:'none'})
+			return
+		}
+		if( params.passWordConfirm !== params.password){
+			uni.showToast({title: '两次输入的密码不一致',duration: 2000,mask:true,icon:'none'})
+			return
+		}
+		if(params.isAgreed == 0){
+			uni.showToast({title: '请勾选同意协议',duration: 2000,mask:true,icon:'none'})
+			return
+		}
+		request.post('/club/common',params,true,res => {
+			if(res.code == 0){
+				resolve(res);
+			}else{
+				reject(res)
+			}
+		})
+	});
+}
+/**
+ *绑定邮箱
+ */
+export function bindingEmail(params) {
+	return new Promise(function(resolve,reject) {
+		if( params.email == ''){
+			uni.showToast({title: '请输入邮箱地址',duration: 2000,mask:true, icon:'none'})
+			return
+		}
+		if(!$reg.isEmail(params.email)){
+			uni.showToast({title: '请输入正确的邮箱地址',duration: 2000,mask:true,icon:'none'})
+			return
+		}
+		if( params.code == ''){
+			uni.showToast({title: '请输入邮箱验证码',duration: 2000,mask:true,icon:'none'})
+			return
+		}
+		if(!$reg.isEmailCode(params.code)){
+			uni.showToast({title: '验证码格式不正确',duration: 2000,mask:true,icon:'none'})
+			return
+		}
+		request.post('/user/binding',params,true, res => {
+			if(res.code == 0){
+				resolve(res);
+			}else{
+				reject(res)
+			}
+		})
+	})
+}
+/**
+ *绑定微信
+ */
+export function bindingWechat(params) {
+	return new Promise(function(resolve,reject) {
+		request.post('/club/bindingWx',params,true,res => {
+			if(res.code == 0){
+				resolve(res)
+			}else{
+				reject(res)
+			}
+		})
+	})
+}
+/**
+ *邀请码授权登录
+ */
+export function invitationCodeLogin(params) {
+	return new Promise(function(resolve,reject) {
+		request.post('/club/invitationCode',params,true, res => {
+			if(res.code == 0 || res.code == 4){
+				resolve(res)
+			}else{
+				reject(res)
+			}
+		})
+	})
+}
+/**
+ *获取个人中心信息
+ */
+export function personalInfo(params) {
+	return new Promise(function(resolve,reject) {
+		request.lodingGet('/personalCenter/myCentre',params, res => {
+			resolve(res)
+		})
+	})
+}
+/**
+ *取消提示
+ * userId
+ */
+export function cancelPrompt(params) {
+	return new Promise(function(resolve,reject) {
+		request.post('/personalCenter/cancelPrompt',params,false, res => {
+			if(res.code == 0){
+				resolve(res)
+			}else{
+				reject(res)
+			}
+		})
+	})
+}
+
+/**
+ *获取账户余额明细
+ */
+export function accountInfo(params) {
+	return new Promise(function(resolve,reject) {
+		request.lodingGet('/personalCenter/touchBalance',params, res => {
+			if(res.code == 0){
+				resolve(res)
+			}else{
+				reject(res)
+			}
+		})
+	})
+}
+
+/**
+ *用户状态初始化
+ */
+export function userInfoLogin(params) {
+	return new Promise(function(resolve,reject) {
+		request.post('/club/authorization',params,false, res => {
+			if(res.code == 0 || res.code == 4){
+				resolve(res)
+			}else if(res.code == -6){
+				reject(res)
+			}else{
+				reject(res)
+			}
+		})
+	})
+}
+/**
+ *手机修改密码
+ */
+export function mobilePassword(params) {
+	return new Promise(function(resolve,reject) {
+		if( params.mobileOrEmail == ''){
+			uni.showToast({title: '请输入手机号',duration: 2000,mask:true,icon:'none'})
+			return
+		}
+		if(!$reg.isMobile(params.mobileOrEmail)){
+			uni.showToast({title: '手机格式不正确',duration: 2000,mask:true,icon:'none'})
+			return
+		}
+		if( params.activateCode == ''){
+			uni.showToast({title: '请输入手机验证码',duration: 2000,mask:true,icon:'none'})
+			return
+		}
+		if(!$reg.isMobileCode(params.activateCode)){
+			uni.showToast({title: '验证码格式不正确',duration: 2000,mask:true,icon:'none'})
+			return
+		}
+		if( params.passWord == ''){
+			uni.showToast({title: '请输入密码',duration: 2000,mask:true,icon:'none'})
+			return
+		}
+		if(!$reg.checkPwd(params.passWord)){
+			uni.showToast({title: '密码必须为8-16位字母数字的组合',duration: 2000,mask:true,icon:'none'})
+			return
+		}
+		if( params.confirmPwd == ''){
+			uni.showToast({title: '请再次确认密码',duration: 2000,mask:true,icon:'none'})
+			return
+		}
+		if( params.confirmPwd !== params.passWord){
+			uni.showToast({title: '两次输入的密码不一致',duration: 2000,mask:true,icon:'none'})
+			return
+		}
+		request.post('/user/findCompanyPwd',params, true,res => {
+			if(res.code == 0){
+				resolve(res)
+			}else{
+				reject(res)
+			}
+		})
+	})
+}
+/**
+ *邮箱修改密码
+ */
+export function emailPassword(params) {
+	return new Promise(function(resolve,reject) {
+		if( params.mobileOrEmail == ''){
+			uni.showToast({title: '请输入邮箱',duration: 2000,mask:true,icon:'none'})
+			return
+		}
+		if(!$reg.isEmail(params.mobileOrEmail)){
+			uni.showToast({title: '请输入正确的邮箱地址',duration: 2000,mask:true,icon:'none'})
+			return
+		}
+		if( params.activateCode == ''){
+			uni.showToast({title: '请输入邮箱验证码',duration: 2000,mask:true,icon:'none'})
+			return
+		}
+		if(!$reg.isEmailCode(params.activateCode)){
+			uni.showToast({title: '验证码格式不正确',duration: 2000,mask:true,icon:'none'})
+			return
+		}
+		if( params.passWord == ''){
+			uni.showToast({title: '请输入密码',duration: 2000,mask:true,icon:'none'})
+			return
+		}
+		if(!$reg.checkPwd(params.passWord)){
+			uni.showToast({title: '密码必须为8-16位字母数字的组合',duration: 2000,mask:true,icon:'none'})
+			return
+		}
+		if( params.confirmPwd == ''){
+			uni.showToast({title: '请再次确认密码',duration: 2000,mask:true,icon:'none'})
+			return
+		}
+		if( params.confirmPwd !== params.passWord){
+			uni.showToast({title: '两次输入的密码不一致',duration: 2000,mask:true,icon:'none'})
+			return
+		}
+		request.post('/user/findCompanyPwd',params,true, res => {
+			if(res.code == 0){
+				resolve(res)
+			}else{
+				reject(res)
+			}
+		})
+	})
+}
+/**
+ *修改手机号
+ */
+export function changeMobile(params) {
+	return new Promise(function(resolve,reject) {
+		if( params.contractMobile == ''){
+			uni.showToast({title: '请输入新的手机号码',duration: 2000,mask:true,icon:'none'})
+			return
+		}
+		if(!$reg.isMobile(params.contractMobile)){
+			uni.showToast({title: '请输入正确的手机号码',duration: 2000,mask:true,icon:'none'})
+			return
+		}
+		if( params.mobileCode == ''){
+			uni.showToast({title: '请输入旧手机验证码',duration: 2000,mask:true,icon:'none'})
+			return
+		}
+		if(!$reg.isMobileCode(params.mobileCode)){
+			uni.showToast({title: '旧手机验证码格式不正确',duration: 2000,mask:true,icon:'none'})
+			return
+		}
+		if( params.newMobileCode == ''){
+			uni.showToast({title: '请输入新手机验证码',duration: 2000,mask:true,icon:'none'})
+			return
+		}
+		if(!$reg.isMobileCode(params.newMobileCode)){
+			uni.showToast({title: '新手机验证码格式不正确',duration: 2000,mask:true,icon:'none'})
+			return
+		}
+		request.post('/club/changeMobile',params,true, res => {
+			if(res.code == 0){
+				resolve(res)
+			}else{
+				reject(res)
+			}
+		})
+	})
+}

+ 174 - 0
api/utils.js

@@ -0,0 +1,174 @@
+/**
+ *@des 公共接口
+ *@author zhengjinyi
+ *@date 2020/03/19 14:56:57
+ *@param registerByPass
+ */
+import requestUrl from '@/services/ajax.env.js'
+import request from '@/common/config/caimeiApi.js'
+import $reg from '@/common/config/common.js'
+
+
+/**
+ *获取省市区列表
+ */
+export function queryAddressInformation() {
+	return new Promise(function(resolve,reject) {
+		request.get("/club/address",{}, res => {
+			if(res.code == 0){
+				resolve(res);
+			}else{
+				reject(res)
+			}
+		})
+	});
+}
+/**
+ * @新分类下的商品列表
+ * @param:tinyTypeID 三级分类ID
+ * @param:pageNum	页码
+ * @param:pageSize	每页显示条数
+ */
+export function searchQueryTinyType(url,params) {
+	return new Promise(function(resolve,reject) {
+		request.lodingGet(url,params, res => {
+			if(res.code == 0){
+				resolve(res);
+			}else{
+				reject(res)
+			}
+		})
+	});
+}
+/**
+ *获取协议
+ */
+export function queryProtocol() {
+	return new Promise(function(resolve,reject) {
+		request.get("/club/protocol",{}, res => {
+			if(res.code == 0){
+				resolve(res);
+			}else{
+				reject(res)
+			}
+		})
+	});
+}
+/**
+ *获取邮箱验证码
+ */
+export function getEmailCode(params) {
+	return new Promise(function(resolve,reject) {		
+		request.get("/user/mailbox",params, res => {
+			if(res.code == 0){
+				resolve(res);
+			}else{
+				reject(res)
+			}
+		})
+	});
+}
+/**
+ *注册专用获取验证码
+ */
+export function getRegisterMobileCode(params) {
+	return new Promise(function(resolve,reject) {
+		request.get("/club/captcha",params, res => {
+			if(res.code == 0){
+				resolve(res);
+			}else{
+				reject(res)
+			}
+		})
+	});
+}
+/**
+ *会所资料修改手机号
+ *旧手机号获取验证码
+ */
+export function getClubMobileCode(params) {
+	return new Promise(function(resolve,reject) {
+		request.get("/club/modifyPhoneNumber",params, res => {
+			if(res.code == 0){
+				resolve(res);
+			}else{
+				reject(res)
+			}
+		})
+	});
+}
+/**
+ *会所资料修改手机号
+ *新手机号获取验证码
+ */
+export function getClubNewMobileCode(params) {
+	return new Promise(function(resolve,reject) {
+		request.get("/club/modifyPhoneNumber",params, res => {
+			if(res.code == 0){
+				resolve(res);
+			}else{
+				reject(res)
+			}
+		})
+	});
+}
+/**
+ *小程序机构账号绑定微信,PC微信绑定机构账号
+ */
+export function getbindWechatCode(params) {
+	return new Promise(function(resolve,reject) {
+		request.get("/user/note",params, res => {
+			if(res.code == 0){
+				resolve(res);
+			}else{
+				reject(res)
+			}
+		})
+	});
+}
+/**
+ *通过邀请链接绑定运营人员获取手机短信
+ */
+export function getbindOperatorCode(params) {
+	return new Promise(function(resolve,reject) {
+		request.get("/seller/note",params, res => {
+			if(res.code == 0){
+				resolve(res);
+			}else{
+				reject(res)
+			}
+		})
+	});
+}
+/**
+ *上传图片
+ */
+export function uploadFileImage() {
+	return new Promise(function(resolve,reject) {
+		uni.chooseImage({
+			count: 1, //默认1
+			sizeType: ['original','compressed'], //可以指定是原图还是压缩图,默认二者都有
+			sourceType: ['album'], //从相册选择
+			success: (res) => {
+				const tempFilePaths = res.tempFilePaths;
+				const uploadTask = uni.uploadFile({
+					url : requestUrl+'/formData/MultiPictareaddData',
+					filePath: tempFilePaths[0],
+					name: 'file',
+					header: {
+					    "Content-Type": "multipart/form-data",
+					},
+					formData: {
+						'user': 'test'
+					},
+					success: function (res) {
+						resolve(res);
+					},
+					error : function(e){
+						reject(res)
+					}
+				})
+			}
+		});
+	});
+}

+ 64 - 0
common/config/addressdata.js

@@ -0,0 +1,64 @@
+/*
+ *请求获取省市区
+ *已提供给地区选择picker组件使用
+ */ 
+import { queryAddressInformation } from '@/api/utils.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);
+	})
+})
+//获取市后继续处理
+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
+}

+ 126 - 0
common/config/authorize.js

@@ -0,0 +1,126 @@
+//authorize.js
+import api from './caimeiApi.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
+			}
+		});
+	})
+}
+
+export default {getProvider,getSetting,checkSessionKey,getCode,login,getUserInfo}

+ 395 - 0
common/config/caimeiApi.js

@@ -0,0 +1,395 @@
+/**
+ * @Time 2019-12-12
+ * @Author Zhengjingyi
+ * @Action 全局公共方法
+ */
+import requestUrl from '@/services/ajax.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',
+				'X-Token': uni.getStorageSync('token') ? uni.getStorageSync('token') : 'token',
+				'cookie': uni.getStorageSync('sessionid')
+			},
+			method: 'POST',
+			success: (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 
+};

+ 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
+}

+ 57 - 0
common/config/wxLogin.js

@@ -0,0 +1,57 @@
+import store from '@/store/index.js'
+import authorize from '@/common/config/authorize.js'
+import { userInfoLogin } from "@/api/use.js"
+// 根据微信的code获取用户登录状态:1已登录过 -1未登录过
+const wxLoginAuthorize = function(){
+	authorize.getCode('weixin').then(wechatcode =>{
+		authorize.getUserInfo('weixin').then(wxResponse =>{
+			userInfoLogin({code:wechatcode,encryptedData:wxResponse.encryptedData,iv:wxResponse.iv}).then(response =>{
+				store.commit('updateStatus',response.data)
+				store.commit('login',response.data);
+				store.commit('wxLogin',wxResponse.userInfo);
+				uni.setStorageSync('token',response.data.token)
+				uni.removeStorageSync('sessionid')
+				uni.setStorageSync('sessionid','JSESSIONID='+response.data.sessionId)
+			}).catch(error =>{
+				uni.removeStorageSync('sessionid')
+				uni.setStorageSync('sessionid','JSESSIONID='+error.data)
+				store.commit('logout',error.data)
+				store.commit('updateStatus',error.data)
+				store.commit('wxLogin',wxResponse.userInfo);
+			})
+		})
+	})
+}
+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);
+					uni.setStorageSync('token',response.data.token)
+					uni.removeStorageSync('sessionid')
+					uni.setStorageSync('sessionid','JSESSIONID='+response.data.sessionId)
+					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 =>{
+					uni.removeStorageSync('sessionid')
+					uni.setStorageSync('sessionid','JSESSIONID='+error.data)
+					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: 300rpx;
+		height: 180rpx;
+		margin-bottom: 20rpx;
+	}
+	&-image {
+		width: 332rpx;
+		height: 260rpx;
+		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: #ed3f14 !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: #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;
+}
+
+/*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*/

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

@@ -0,0 +1,39 @@
+const beautyList =  [
+						{value:'1',name:'诊所'},
+						{value:'2',name:'门诊'},
+						{value:'3',name:'医院'},
+					]
+const mentuzCampNullList = [
+						{value:'1',name:'整形'},
+						{value:'2',name:'轻医美'},
+						{value:'3',name:'皮肤科'},
+					]
+const medicaCampNullList = [
+						{value:'1',name:'美容'},
+						{value:'2',name:'美体'},
+						{value:'3',name:'美发'},
+						{value:'4',name:'皮肤管理'},
+						{value:'5',name:'光电'},
+						{value:'6',name:'综合类'},
+						{value:'7',name:'中医养生'},
+						{value:'8',name:'spa'},
+					]
+
+const supplierList = [
+						{value:'1',name:'一类器械'},
+						{value:'2',name:'二类器械'},
+						{value:'3',name:'三类器械'},
+						{value:'4',name:'其他'},
+					]
+const supplierMedicaCampNullList = [
+						{value:'1',name:'产品'},
+						{value:'2',name:'仪器'},
+						{value:'3',name:'服务'},
+					]
+module.exports = {
+	beautyList,
+	mentuzCampNullList,
+	medicaCampNullList,
+	supplierList,
+	supplierMedicaCampNullList
+}

文件差異過大導致無法顯示
+ 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-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;
+	}
+</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-shouye"></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-iconfonticonfontsousuo1"></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-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;
+	}
+</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/img/icon/icon-cart-active@3x.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(255, 147, 0, 0.5);
+		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-fanhui"></text>
+			  <text v-if="navbarData.haveHome" @tap="_goHome" class="iconfont icon-shouye"></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-iconfonticonfontsousuo1"></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-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;
+	}
+</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-shouye" :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>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 221 - 0
components/cm-custom/custom-floor.vue

@@ -0,0 +1,221 @@
+<template name="headerNavbar">
+	<!-- 二级楼层导航栏 -->
+	<view class='navbar-wrap' :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-fanhui"></text>
+			  <text v-else  @click="_goHome" class="iconfont icon-shouye"></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,
+				default:1
+			},
+			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;
+		 background-color: #FFFFFF;
+		 box-sizing: border-box;
+	}
+	.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);
+		 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>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 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-fanhui"></text>
+			  <text v-else  @click="_goHome" class="iconfont icon-shouye"></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>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 139 - 0
components/cm-module/activity/activity_01.vue

@@ -0,0 +1,139 @@
+<template>
+	<view>
+		<view class="tui-alert-class tui-alert-box" :class="[show?'tui-alert-show':'tui-alert-hide']"  @touchmove.stop.prevent="discard">
+			<image src="http://static.caimei365.com/app/meibohui/meibo_coupon_01.png" mode="" @click.stop="handleClick"></image>
+			<text class="iconfont icon-2guanbi" @click.stop="handleClickCancel"></text>
+		</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) {
+				console.log(e);
+				if (!this.show) return;
+				this.$emit('click',false);
+			},
+			handleClickCancel() {
+				this.$emit('cancel',false);
+			},
+			discard(){
+				//丢弃
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.tui-alert-box {
+		width: 100%;
+		height: 100%;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		flex-direction: column;
+		position: fixed;
+		left: 0;
+		top: 100%;
+		opacity: 0;
+		background: rgba(0,0,0,.2);
+		z-index: 99999;
+		image{
+			width: 606rpx;
+			height: 510rpx;
+			margin-top: 130rpx;
+		}
+	}
+	.tui-alert-show {
+		top: 0;
+		opacity: 1;
+		// animation:rundtop 0.5s;
+	}
+	.tui-alert-hide{
+		top: 100%;
+		opacity: 0;
+		// animation:rundbottom 0.5s;
+	}
+	.icon-2guanbi{
+		display: block;
+		width: 100rpx;
+		height: 100rpx;
+		line-height: 100rpx;
+		text-align: center;
+		color: #FFFFFF;
+		position: absolute;
+		top: 30%;
+		left: 69%;
+		font-size: 52rpx;
+	}
+	.tui-alert-mask-show {
+		visibility: visible;
+		opacity: 1;
+	}
+	.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;
+	}
+	@keyframes rundtop{
+		0%{top: 100%;opacity: 0;}
+		100%{top:0;opacity: 1;}
+	}
+	@keyframes rundbottom{
+		0%{top: 0;opacity: 1;}
+		100%{top:100%;opacity: 0;}
+	}
+</style>

+ 298 - 0
components/cm-module/cm-seller/category.vue

@@ -0,0 +1,298 @@
+<template>
+	<view id="category" :style="{paddingTop:CustomBar+'px'}">
+		<!--顶部搜索导航栏-->
+		<view class="'search-input-fixed" :style="{top:CustomBar/2+'px'}">
+			<cat-search :systeminfo='systeminfo' :navbar-data='nvabarData' :headerBtnPosi ="headerBtnPosi" @click="hanldTabClick"></cat-search>
+		</view>
+		<tui-skeleton v-if="skeletonShow" backgroundColor="#fafafa" borderRadius="10rpx" :isLoading	="true" :loadingType="5"></tui-skeleton>
+		<view class="category-list" v-else>
+			<!-- 左侧分类导航 -->
+			<scroll-view class="left-aside" scroll-y="true" scroll-with-animation :scroll-top="verticalNavTop" :style="{top:(CustomBar+38)+'px',height:(windowHeight-CustomBar+38)+'px'}">
+				<view class="row" v-for="(m, index) in categoryList" :key="index" :class="[index==showCategoryIndex?'on':'']" @tap="showCategory($event,index)" :data-id="index">
+					<view class="text">{{m.name}}</view>
+					<view class="block"></view>
+				</view>
+			</scroll-view>
+			<!--右侧子导航-->
+			<scroll-view  scroll-y="true" class="right-aside" :style="{top:(CustomBar+38)+'px',height:(windowHeight-CustomBar+38)+'px'}">
+				<view class="category" v-for="(first,index) in categoryList" :key="index" v-show="index==showCategoryIndex" >
+					<template v-if="first.smalltypeList">
+						<view class="category-box AAA" v-for="(small,oIndex) in first.smalltypeList" :key="oIndex">
+							<view class="title">{{small.name}}</view>
+							<view class="list" v-if="small.tinytypeList.length > 0">
+								<view class="box" v-for="(pro,proIndex) in small.tinytypeList" :key="proIndex" @click.stop="navToListPage(pro,3)">
+									<image :src="pro.crmIcon ? pro.crmIcon : 'https://static.caimei365.com/app/img/icon/icon-noneproduct.jpg'"></image>
+									<view class="text">{{pro.name}}</view>
+								</view>
+							</view>
+							<view v-else class="no-data">
+								<view class="box" @click.stop="navToListPage(small,2)">
+									<image :src="small.crmIcon ? small.crmIcon : 'https://static.caimei365.com/app/img/icon/icon-noneproduct.jpg'"></image>
+									<view class="text">全部商品</view>
+								</view>
+							</view>
+						</view>
+					</template>
+					<template v-else>
+						<view class="category-box BBB">
+							<view class="title">{{first.name}}</view>
+							<view class="no-data">
+								<view class="box" @click.stop="navToListPage(first,1)">
+									<image :src="first.crmIcon ? first.crmIcon : 'https://static.caimei365.com/app/img/icon/icon-noneproduct.jpg'"></image>
+									<view class="text">全部商品</view>
+								</view>
+							</view>
+						</view>
+					</template>
+				</view>
+			</scroll-view>
+		</view>
+	</view>
+</template>
+<script>
+	import catSearch from '@/components/uni-search/cat-search.vue'
+	export default {
+		components: {
+			catSearch
+		},
+		data() {
+			return {
+				nvabarData: {							 //顶部自定义导航
+					showCapsule: 1, // 是否显示左上角图标   1表示显示    0表示不显示
+					title: ''		// 导航栏 中间的标题
+				},
+				CustomBar:this.CustomBar,// 顶部导航栏高度
+				headerBtnPosi:	this.setHeaderBtnPosi(), //获取设备顶部胶囊高度
+				systeminfo: this.setSysteminfo(),		 //获取设备信息
+				headerShow:true,
+				showCategoryIndex: 0,
+				categoryList: [],//分类列表
+				search: '',
+				cateTop: {},
+				verticalNavTop: 0,
+				categoryTabIndex:1,
+				windowHeight:0,
+				scrollHeight:0,
+				skeletonShow:true
+			}
+		},
+		created() {
+			this.initData();
+		},
+		methods: {
+			// 数据初始化
+			initData() {
+				this.GetProductCate(this.categoryTabIndex);
+				const {windowHeight, pixelRatio} = wx.getSystemInfoSync();
+				this.windowHeight = windowHeight - 1;
+				this.scrollHeight = windowHeight - 1;
+			},
+			hanldTabClick(data){
+				this.categoryList = []
+				this.GetProductCate(data);
+			},
+			// 获取商品分类列表
+			GetProductCate (index) {
+				this.CommonService.GetFirstClassly({typeSort:index,source :'crm'}).then(response =>{
+					this.categoryList = response.data
+					// 查询第一个拥有二级菜单的子菜单
+					for (let i = 0; i < this.categoryList.length; i++) {
+						if (this.categoryList[i].smalltypeList.length > 0) {
+							this.showCategoryIndex = i;
+							break;
+						}
+					}
+					this.skeletonShow = false
+				}).catch(error =>{
+					this.$util.msg(error.msg,2000)
+				})
+			},
+			showCategory(e,index){//分类切换显示
+				this.showCategoryIndex = index;
+				this.verticalNavTop = (e.currentTarget.dataset.id - 1) * 50
+			},
+			toSearch () {// 跳转至搜索详情页
+				uni.navigateTo({
+					url: `/search/pages/search/search?search=${JSON.stringify(this.search)}`
+				})
+			},
+			navToListPage(item,index){//分类导航跳转
+				switch(index){
+					case 1:
+						this.$api.navigateTo(`/pages/goods/goods-classify?classType=1&id=${item.bigTypeID}&title=${item.name}`)
+						break;
+					case 2:
+						this.$api.navigateTo(`/pages/goods/goods-classify?classType=2&id=${item.smallTypeID}&title=${item.name}`)
+						break;
+					case 3:
+						this.$api.navigateTo(`/pages/goods/goods-classify?classType=3&id=${item.tinyTypeID}&title=${item.name}`)
+						break;
+				}
+			},
+			setHeaderBtnPosi(){
+				// 获得胶囊按钮位置信息
+				let headerBtnPosi = uni.getMenuButtonBoundingClientRect();
+				return headerBtnPosi
+			},
+			setSysteminfo(){
+				let systeminfo;
+				uni.getSystemInfo({ // 获取设备信息
+					success: (res) => {
+						systeminfo = res
+					},
+				})
+				return systeminfo
+			},
+		}
+	}
+</script>
+<style lang="scss">
+	page {
+		background-color: #fff;
+	}
+	.search-input-fixed{
+		width: 100%;
+		height:auto;
+		position: fixed;
+		top: 0;
+		left: 0;
+		z-index: 1000;
+		background: #FFFFFF;
+		border-bottom: 1px solid #F7F7F7;
+	}		
+	.category-list{
+		width: 100%;
+		background-color: #fff;
+		display: flex;
+		.left-aside,.right-aside{
+			position: absolute;
+			top: 100rpx;
+			/*  #ifdef  APP-PLUS  */
+			top: calc(100rpx + var(--status-bar-height));
+			/*  #endif  */
+			bottom: 0rpx;
+		}
+		.left-aside{
+			width: 200rpx;
+			left: 0rpx;
+			background-color: #f2f2f2;
+			.row{
+				width: 100%;
+				height: 100rpx;
+				display: flex;
+				align-items: center;
+				position: relative;
+				.text{
+					width: 100%;
+					position: relative;
+					font-size: $font-size-28;
+					display: flex;
+					justify-content: center;
+					color: $text-color;
+					/* transition: transform 0.3s ease;*/
+					transition-property: transform;
+					transition-duration: 0.2s;
+					transition-timing-function: ease;
+				}
+				.block{
+					position: absolute;
+					width: 0rpx;
+					left: 0;
+					/* transition: transform 0.3s ease;*/
+					transition-property: transform;
+					transition-duration: 0.2s;
+					transition-timing-function: ease;
+				}
+				&.on{
+					height: 100rpx;
+					background-color: #fff;
+					.text{
+						font-size: $font-size-28;
+						color: $color-system;
+					}
+					.block{
+						width: 10rpx;
+						height: 60rpx;
+						top: 20rpx;
+						background-color: $color-system;
+						border-radius: 0 15rpx 15rpx 0;
+					}
+				}
+			}
+		}
+		.right-aside{
+			width: 550rpx;
+			left: 200rpx;
+			.category{
+				width: calc(100%);
+				padding: 0 15rpx 20rpx 0;
+				background: #F7F7F7;
+				.category-box{
+					background: #FFFFFF;
+					margin-bottom: 20rpx;
+					.title{
+						padding: 0 24rpx;
+						line-height: 80rpx;
+						height: 80rpx;
+						text-align: left;
+						color: $text-color;
+						font-size: $font-size-26;
+						border-bottom: 1px solid #F7F7F7;
+						font-weight: 600;
+					}
+					.list{
+						margin-top: 24rpx;
+						width: 100%;
+						display: flex;
+						flex-wrap: wrap;
+						.box{
+							width: calc(71.44vw / 3);
+							margin-bottom: 40rpx;
+							display: flex;
+							justify-content: center;
+							align-items: center;
+							flex-wrap: wrap;
+							image{
+								width: 140rpx;
+								height: 140rpx;
+							}
+							.text{
+								margin-top: 8rpx;
+								width: 100%;
+								display: flex;
+								justify-content: center;
+								font-size: $font-size-24;
+							}
+						}
+					}
+					.no-data {
+						text-align: center;
+						margin: 30rpx 0;
+						color: #666666;
+						font-size: 24rpx;
+						line-height: 80rpx;
+						.box{
+							width: calc(71.44vw / 3);
+							margin-bottom: 40rpx;
+							display: flex;
+							justify-content: center;
+							align-items: center;
+							flex-wrap: wrap;
+							image{
+								width: 140rpx;
+								height: 140rpx;
+							}
+							.text{
+								margin-top: 8rpx;
+								width: 100%;
+								display: flex;
+								justify-content: center;
+								font-size: $font-size-24;
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+</style>

+ 183 - 0
components/cm-module/cm-seller/home.vue

@@ -0,0 +1,183 @@
+<template>
+	<view class="container home clearfix" :style="{paddingTop:CustomBar+'px'}">
+		<customer ref="customer" :navbar-data='nvabarData'></customer>
+		<!-- 主页内容 -->
+		<tui-skeleton v-if="skeletonShow" backgroundColor="#fafafa" borderRadius="10rpx" :isLoading	="true" :loadingType="5"></tui-skeleton>
+		<view class="container-home tui-skeleton">
+			<!-- 轮播 -->
+			<banner :list="bannerImageList" v-if="isNavRequest"></banner>
+			<!-- 金刚区菜单 -->
+			<navbars :list="navBarsList" v-if="isNavRequest"></navbars>
+			<!-- 直播 -->
+			<page-special :templateData="templateData" v-if="isLiveRequest"></page-special>
+		</view>	
+		<!-- 楼层 -->
+		<view class="container-section tui-skeleton">
+			<page-floor :list="pageList" :userIdentity="userIdentity" :pageType='1' v-if="isRequest"></page-floor>
+			<supplier-list :supplierObj="supplierObj" v-if="isRequest"></supplier-list>
+		</view>
+		<!-- 活动弹窗 -->
+		<activityAlert :show="isActivity" @click="handleClick" @cancel="handleCancelClick"></activityAlert>
+		<!-- 侧边 -->
+		<scroll-top :isScrollTop="isScrollTop" :bottom="50"></scroll-top>
+	</view>
+</template>
+
+<script>
+	import tuiSkeleton from "@/components/tui-skeleton/tui-skeleton"
+	import authorize from '@/common/config/authorize.js'
+	import customer from '@/components/cm-module/homeIndex/customer.vue'
+	import banner from '@/components/cm-module/homeIndex/banner.vue'
+	import navbars from '@/components/cm-module/homeIndex/navbars.vue'
+	import pageFloor from '@/components/cm-module/homeIndex/pageFloor.vue'
+	import pageSpecial from '@/components/cm-module/homeIndex/pageSpecial.vue'
+	import supplierList from '@/components/cm-module/homeIndex/supplierList.vue'
+	import { userInfoLogin } from "@/api/use.js"
+	import { mapState,mapMutations} from 'vuex';
+	export default {
+		components:{
+			tuiSkeleton,
+			customer,
+			banner,
+			navbars,
+			pageFloor,
+			pageSpecial,
+			supplierList
+		},
+		data() {
+			return {
+				nvabarData: {//顶部自定义导航
+					showCapsule: 1, // 是否显示左上角图标  1表示显示  0表示不显示,
+					showSearch: 0,
+					title: '采美采购商城', // 导航栏 中间的标题
+					haveBack:false,
+					textLeft:this.$store.state.isIphone,
+					textColor:'#FFFFFF'
+				},
+				CustomBar:this.CustomBar,// 顶部导航栏高度
+				userID:0,
+				clubStatus:'',
+				current:0,
+				mode:'round',
+				modallayer:false,
+				isLogin:false,
+				skeletonShow: true,
+				userIdentity:'',
+				flootData:[],//楼层
+				bannerImageList:[],//轮播
+				navBarsList:[],//导航分类
+				templateData:{},
+				pageList:[],//楼层
+				supplierObj:{},//供应商列表
+				isScrollTop:false,
+				isRequest:false,
+				isNavRequest:false,
+				isLiveRequest:false,
+			}
+		},
+		created() {
+			this.$api.getStorage().then((resolve) =>{
+				this.userID = resolve.userID ? resolve.userID : 0
+				this.userIdentity = resolve.userIdentity
+				this.getHomeInformation()
+			})
+		},
+		filters: {
+			NumFormat:function(text) {//处理金额
+				return Number(text).toFixed(2);
+			},
+		},
+		computed: {
+			...mapState(['hasLogin','userInfo','isActivity'])
+		},
+		methods: {
+			...mapMutations(['login','logout']),
+			GetHomeInit(){//金刚区分类
+				this.CommonService.GetHomeInit({source:2}).then(response =>{
+					let data = response.data
+					this.navBarsList = data.topMenuList
+					this.isNavRequest = true
+				}).catch(error =>{
+					this.$util.msg(error.msg,2000)
+				})
+			},
+			GetHomeTopDataInfo(){//直播、活动、文章模块
+				this.CommonService.GetHomeTopDataInfo({source:2}).then(response =>{
+					this.templateData = response.data
+					this.isLiveRequest = true
+				}).catch(error =>{
+					this.$util.msg(error.msg,2000)
+				})
+			},
+			GetHomeFloorInfo(){//初始化首页楼层数据
+				this.CommonService.GetHomeDataInfo({userId:this.userID,soure:2}).then(response =>{
+					let data = response.data;
+					this.liveList = data.liveList;
+					this.pageList = data.homePageFloor;
+					this.supplierObj = data.supplierImage;
+					this.isRequest = true;
+				}).catch(error =>{
+					this.$util.msg(error.msg,2000)
+				})
+			},
+			getHomeInformation(){//初始化首页数据	
+				this.CommonService.GetHomeModulesDataInfo({ userId:this.userID }).then(res =>{
+					let data = res.data;
+					this.bannerImageList = data.bannerImageList
+					this.mallPageModules = data.mallPageModules
+					this.$store.commit('updateAllNum',data.shoppingCartCount)
+					this.skeletonShow = false;
+					this.GetHomeInit()
+					this.GetHomeTopDataInfo()
+					this.GetHomeFloorInfo()
+				}).catch(error =>{
+					this.$util.msg(error.msg,2000)
+				})
+			},
+			handleClick(data){
+				this.$api.navigateTo(`/h5/pages/activity/meobohui`)
+				this.$store.commit('setActivity',data)
+			},
+			handleCancelClick(data){
+				this.$store.commit('setActivity',data)
+			}
+		},
+		onPageScroll(e){//实时获取到滚动的值
+			if(e.scrollTop>50){
+				this.inputActive = 'fixed'
+			}else{
+				this.inputActive = 'float'
+			}	
+			if(e.scrollTop>400){
+				this.isScrollTop = true
+			}else{
+				this.isScrollTop = false
+			}	
+		},
+		onPullDownRefresh() {//下拉刷新
+			this.getHomeInformation()
+			uni.stopPullDownRefresh()
+		},
+		onShareAppMessage(res){//分享转发
+			if (res.from === 'button') {
+		      // 来自页面内转发按钮
+		    }
+			return {
+			  title: '生美医美正品采购服务平台',
+			  path: 'pages/tabBar/home/index',
+			  imageUrl:'https://static.caimei365.com/app/img/bg/min-banner.jpg'
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	page{
+		background-color: #FFFFFF;
+	}
+	.container-section{
+		width: 100%;
+		height: auto;
+		background-color: #F7F7F7;
+	}
+</style>

+ 546 - 0
components/cm-module/cm-seller/user.vue

@@ -0,0 +1,546 @@
+<template>
+	<view class="container user clearfix">
+		<cm-custom :navbar-data='nvabarData'></cm-custom>
+		<view class="user-section">
+			<view class="header" :style="{height:(CustomBar+90)-StatusBar+'px',paddingTop:CustomBar+'px',background:'url('+ bgImgUrl +')',backgroundSize:'cover'}">
+				<view class="header-main" v-if="hasLogin">
+					<view class="header-text">
+						<view class="user-item">
+							<text class="u-h1">{{name}}</text>
+						</view>
+						<view class="user-item">
+							<text class="u-tips">协销人员</text>
+						</view>
+					</view>
+					<view class="header-icon" @click="TestZHIboFn()"><image :src="headpic == null? 'https://static.caimei365.com/app/img/icon/icon-seller@3x.png' : headpic" mode=""></image></view>
+				</view>
+				<!-- 订单 -->
+				<view class="user-order">
+					<view class="tab-title" @click="navigator('/seller/pages/order/order-list?listType=0')">
+						<text class="cell-tit">我的订单</text>
+						<text class="cell-more">全部订单</text>
+						<text class="iconfont icon-xiayibu"></text>
+					</view>
+					<view class="order-section">
+						<view class="order-item" @click="navigator('/seller/pages/order/order-list?listType=1')" hover-class="common-hover"  :hover-stay-time="50">
+							<view class="order-icon">
+								<image src="https://static.caimei365.com/app/img/icon/order5@3x.png" mode=""></image>
+								<text 	v-if="beforeConfirmCount>0" 
+										class="uni-badge uni-badge-error uni-small uni-badge--small icon-num" 
+										:class="[beforeConfirmCount < 10 ? 'goleft':'']">
+										{{beforeConfirmCount >= 99? '99+' : beforeConfirmCount}}
+								</text>
+							</view>
+							<text class="order-t">待确认</text>
+						</view>
+						<view class="order-item" @click="navigator('/seller/pages/order/order-list?listType=2')"  hover-class="common-hover" :hover-stay-time="50">
+							<view class="order-icon">
+								<image src="https://static.caimei365.com/app/img/icon/order1@3x.png" mode=""></image>
+								<text  v-if="beforePayCount >0" 
+									   class="uni-badge uni-badge-error uni-small uni-badge--small icon-num " 
+									   :class="[beforePayCount < 10 ? 'goleft':'']">
+									   {{beforePayCount >= 99? '99+' : beforePayCount}}
+								</text>
+							</view>
+							<text class="order-t">待付款</text>
+						</view>
+						<view class="order-item" @click="navigator('/seller/pages/order/order-list?listType=3')" hover-class="common-hover"  :hover-stay-time="50">
+							<view class="order-icon">
+								<image src="https://static.caimei365.com/app/img/icon/static/temp/order2@3x.png" mode=""></image>
+								<text   v-if="beforeShipCount >0" 
+										class="uni-badge uni-badge-error uni-small uni-badge--small icon-num" 
+										:class="[beforeShipCount < 10 ? 'goleft':'']">
+										{{beforeShipCount >= 99? '99+' : beforeShipCount}}
+								</text>
+							</view>
+							<text class="order-t">待发货</text>
+						</view>
+						<view class="order-item" @click="navigator('/seller/pages/order/order-list?listType=4')" hover-class="common-hover"  :hover-stay-time="50">
+							<view class="order-icon">
+								<image src="https://static.caimei365.com/app/img/icon/static/temp/order3@3x.png" mode=""></image>
+								<text 	v-if="shippedCount>0" 
+										class="uni-badge uni-badge-error uni-small uni-badge--small icon-num" 
+										:class="[shippedCount < 10 ? 'goleft':'']">
+										{{shippedCount >= 99? '99+' : shippedCount}}
+								</text>
+							</view>
+							<text class="order-t">已发货</text>
+						</view>
+						<view class="order-item" @click="navigator('/seller/pages/order/order-list?listType=5')" hover-class="common-hover"  :hover-stay-time="50">
+							<view class="order-icon">
+								<image src="https://static.caimei365.com/app/img/icon/static/temp/order4@3x.png" mode=""></image>
+								<text 	v-if="refundsCount >0"
+										class="uni-badge uni-badge-error uni-small uni-badge--small icon-num" 
+										:class="[refundsCount < 10 ? 'goleft':'']">
+										{{refundsCount >= 99 ? '99+' : refundsCount}}
+								</text>
+							</view>
+							<text class="order-t">退货/款</text>
+						</view>
+					</view>
+				</view>
+			</view>
+			<!-- 底部跳转 -->
+			<view class="foot-list">
+				<view class="list-cell-item">
+					<view class="list-cell"  v-for="(item, index) in firstList" :key="index" @click="navigator(item.path)" hover-class="cell-hover" :hover-stay-time="50">
+						<text class="cell-icon"><text class="iconfont" :class="item.icon"></text></text>
+						<text class="cell-tit">{{item.name}}</text>
+						<text 	v-if="index == 0 && orderNum >0"
+								class="uni-badge uni-badge-error uni-small uni-badge--small icon-num">
+								{{orderNum == 99 ? '99+' : orderNum}}
+						</text>
+						<text class="cell-more iconfont icon-xiayibu"></text>
+					</view>
+				</view>
+			</view>
+		</view>	
+	</view>
+</template>
+<script>
+	import authorize from '@/common/config/authorize.js'
+	import uniBadge from '@/components/uni-badge/uni-badge.vue'
+	import { mapState,mapMutations } from 'vuex'
+	import { userInfoLogin } from "@/api/use.js"
+	
+	export default{
+		components: {
+			uniBadge,
+		},
+		data() {
+			return{	
+				nvabarData: {//顶部自定义导航
+					showCapsule: 1, // 是否显示左上角图标  1表示显示  0表示不显示,
+					showSearch: 0,
+					title: '账户中心', // 导航栏 中间的标题
+					haveBack:false,
+					textLeft:this.$store.state.isIphone,
+					textColor:'#FFFFFF',
+					bgColor:''
+				},
+				CustomBar:this.CustomBar,// 顶部导航栏高度
+				StatusBar: this.StatusBar,
+				bgImgUrl:'https://img.caimei365.com/group1/M00/03/B0/Cmis217Z_i6ASHobAAhl69yz3SM078.png',
+				name:'',
+				headpic:'',
+				userId:'',
+				skeletonShow:true,
+				orderNum:0,//机构自主下单订单数
+				beforeConfirmCount:0,//待确认角标
+				beforePayCount:0, 	//待付款角标
+				beforeShipCount:0, //待发货角标
+				shippedCount:0,   //已发货角标
+				refundsCount:'', //退货/款角标
+				institutionsCont:120,
+				firstList:[
+					{name:'机构列表',path:'/seller/pages/club/list',icon:'icon-jigouliebiao'},
+					{name:'帮机构下单',path:'/seller/pages/club/club-list',icon:'icon-bangjigouxiadan'},
+					{name:'拉机构上线',path:'/seller/pages/login/register',icon:'icon-lajigoushangxian'},
+					{name:'邀请运营人员',path:'/seller/pages/club/allClub-list',icon:'icon-yaoqingyunyingrenyuan'}
+				],
+			}
+		},
+		created() {
+			this.initData()
+		},
+		computed: {
+			...mapState(['hasLogin','userInfo'])
+		},
+		methods:{
+			...mapMutations(['login','logout']),
+			initData(){
+				authorize.getCode('weixin').then(wechatcode =>{// 根据微信的code获取用户登录状态:1已登录过 -1未登录过
+					authorize.getUserInfo('weixin').then(wxResponse =>{
+						userInfoLogin({code:wechatcode,encryptedData:wxResponse.encryptedData,iv:wxResponse.iv}).then(response =>{
+							this.$store.commit('updateStatus',response.data)
+							this.login(response.data);
+							uni.setStorageSync('token',response.data.token)
+							uni.removeStorageSync('sessionid')
+							uni.setStorageSync('sessionid','JSESSIONID='+response.data.sessionId)
+							this.getUserSellerHome()
+						}).catch(response =>{
+							this.logout()
+							uni.removeStorageSync('sessionid')
+							uni.setStorageSync('sessionid','JSESSIONID='+response.data)
+							this.$store.commit('updateStatus',response.data)
+							this.$api.navigateTo('/seller/pages/login/login')
+						})
+					})
+				})
+			},
+			getUserSellerHome(){
+				this.$api.getStorage().then((resolve) =>{
+					this.userId = resolve.userID
+					this.SellerService.GetSellerHome({userId:this.userId}).then(response =>{
+						let sellerData = response.data
+						this.name = sellerData.seller.linkMan1?sellerData.seller.linkMan1:'' 	//协销名称
+						this.headpic = sellerData.seller.logo //会所头像
+						this.beforeConfirmCount = this.showBadge(sellerData.beforeConfirmCount)//待付款
+						this.beforePayCount = this.showBadge(sellerData.beforePayCount)//待付款
+						this.beforeShipCount = this.showBadge(sellerData.beforeShipCount)//待发货		
+						this.shippedCount = this.showBadge(sellerData.shippedCount)//已发货	
+						this.refundsCount = this.showBadge(sellerData.refundsCount)//退货/款	
+						this.orderNum = this.showBadge(sellerData.orderNum)//机构自主下单订单数
+						this.skeletonShow = false;
+					}).catch(error =>{
+						this.$util.msg(error.msg,2000)
+					})
+				})	
+			},
+			TestZHIboFn(){//测试跳转直播小程序
+				uni.navigateToMiniProgram({
+					appId: 'wx92d650b253f8f2e3',
+					path: '/pages/index/index',
+					extraData: {
+						'data1': 'test'
+					},
+					envVersion: 'develop',
+					success(res) {
+						// 打开成功
+						console.log(res)
+					}
+				})
+			},
+			navigator(url){
+				this.$api.navigateTo(url)
+			},			
+			showBadge(n){
+				let num ='';
+				if(n>100){num = 99}else{num = n;}
+				return num;
+			},
+			onPullDownRefresh() {//下拉刷新
+				this.initData()
+				uni.stopPullDownRefresh()
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	@import "@/uni.scss";
+	page{
+		background-color: #F7F7F7;
+	}
+	.user{
+		width: 100%;
+		height: 100%;
+		position:relative;
+		background: rgba(247, 247, 247, 1);
+	}	
+	.header{
+		width: 100%;
+		position: relative;
+		background-size: cover;
+		border-radius: 0 0 100rpx 100rpx;
+	}	
+	.header-main{
+		width: 702rpx;
+		height: 130rpx;
+		padding: 12rpx 24rpx;
+		display: flex;
+		.header-text{
+			flex: 8;
+			display: flex;
+			flex-direction: column;
+			.user-item{
+				flex: 1;
+				height: 64rpx;
+				line-height: 64rpx;
+				.u-tips{
+					display: inline-block;
+					float: left;
+					width: 98rpx;
+					height: 30rpx;
+					border: 1px solid #FFFFFF;
+					background: linear-gradient(128deg,rgba(242,143,49,1) 0%,rgba(225,86,22,1) 100%);
+					border-radius: 16rpx;
+					line-height: 30rpx;
+					font-size: $font-size-20;
+					text-align: center;
+					color: #FFFFFF;
+					margin-left: 10rpx;
+				}
+				.u-viptips{
+					display: inline-block;
+					float: left;
+					width: 98rpx;
+					height: 30rpx;
+					border: 1px solid #FFE600;
+					background: linear-gradient(128deg,rgba(242,143,49,1) 0%,rgba(225,86,22,1) 100%);
+					border-radius: 16rpx;
+					line-height: 30rpx;
+					font-size: $font-size-20;
+					text-align: center;
+					color: #FFE600;
+					margin-left: 10rpx;
+					margin-top: 17rpx;
+				}
+				.u-h1{
+					float: left;
+					font-size: $font-size-36;
+					color: #FFFFFF;
+					text-align: left;
+					-o-text-overflow: ellipsis;
+					text-overflow: ellipsis;
+					display: -webkit-box;
+					word-break: break-all;
+					-webkit-box-orient: vertical;
+					-webkit-line-clamp: 1;
+					overflow: hidden;
+				}
+				.u-p{
+					font-size: $font-size-24;
+					line-height: 64rpx;
+					color: #FFFFFF;
+					text-align: left;
+				}
+			}
+		}
+		.header-icon{
+			flex: 2;
+			margin-right: 20rpx;
+			image{
+				float: right;
+				width: 128rpx;
+				height: 128rpx;
+				border-radius: 100%;
+				border: 2rpx solid #FFFFFF;
+			}
+		}
+	}
+	.header-main-none{
+		width: 702rpx;
+		height: 152rpx;
+		padding: 0 24rpx;
+		display: flex;
+		.header-text{
+			flex: 8;
+			display: flex;
+			flex-direction: column;
+			.user-item{
+				flex: 1;
+				height: 50rpx;
+				line-height: 50rpx;
+				.line{
+					margin: 0 10rpx;
+				}
+				.u-h1{
+					float: left;
+					font-size: $font-size-36;
+					color: #FFFFFF;
+					text-align: left;
+					-o-text-overflow: ellipsis;
+					text-overflow: ellipsis;
+					display: -webkit-box;
+					word-break: break-all;
+					-webkit-box-orient: vertical;
+					-webkit-line-clamp: 1;
+					overflow: hidden;
+				}
+				.u-p{
+					font-size: $font-size-24;
+					line-height: 50rpx;
+					color: #EFEFEF;
+					text-align: left;
+				}
+				.u-btn{
+					width: 160rpx;
+					height: 40rpx;
+					background: rgba(255,255,255,.5);
+					border-radius: 5rpx;
+					line-height: 40rpx;
+					text-align: center;
+					font-size: $font-size-24;
+					color: #FFFFFF;
+					display: block;
+					margin-top: 5rpx;
+					padding-left: 6rpx;
+					.icon-xiangyouhuabeifen{
+						font-size: $font-size-24;
+					}
+				}
+			}
+		}
+		.header-icon{
+			flex: 2;
+			display: flex;
+			margin-right: 20rpx;
+			align-items: center;
+			justify-content: center;
+			image{
+				float: right;
+				width: 128rpx;
+				height: 128rpx;
+				border-radius: 100%;
+				border: 2rpx solid #FFFFFF;
+			}
+		}
+	}
+	.user-order{
+		width: 654rpx;
+		height: auto;
+		padding: 0 24rpx;
+		background-color: $bg-color;
+		margin-bottom: 24rpx;
+		position: absolute;
+		bottom: -170rpx;
+		left: 24rpx;
+		border-radius: 20rpx;
+	}	
+	.tab-title{
+		font-size: $font-size-28;
+		line-height: 80rpx;
+		color: #333333;
+		text-align:left;
+		border-bottom: 1px solid #F8F8F8;
+		position: relative;
+		.cell-tit{
+			font-size: $font-size-28;
+			color: $text-color;
+		}
+		.cell-more{
+			float: right;
+			line-height: 80rpx;
+			font-size: $font-size-24;
+			color: #666666;
+			padding-right: 30rpx;
+		}
+		.iconfont{
+			width: 30rpx;
+			height: 80rpx;
+			line-height: 80rpx;
+			text-align: center;
+			position: absolute;
+			right: 0;
+			top: 0;
+			display: block;
+			font-size: $font-size-28;
+		}
+	}
+	.order-section{
+		display: flex;
+		justify-content: space-around;
+		align-items: center;
+		flex-wrap:wrap;
+		height: 99rpx;
+		padding: 24rpx 0;
+	}
+	.order-item{
+		flex:1;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		position: relative;
+		&:last-child{
+			margin-right: 0;
+		}
+		.order-icon{
+			width: 52rpx;
+			height: 52rpx;
+			position: relative;
+			image{
+				width: 52rpx;
+				height: 52rpx;
+			}
+			.icon-num{
+				position: absolute;
+				right:-24rpx;
+				top: -9rpx;
+			}
+			.icon-num.goleft{
+				right: -12rpx;
+			}
+		}
+		.order-t{
+			line-height: 50rpx;
+			font-size: $font-size-24;
+			color: $text-color;
+		}
+	}
+	.foot-list{
+		width: 702rpx;
+		padding: 0 24rpx;
+		padding-top: 168rpx;
+	}	
+	.list-cell-item{
+		width: 654rpx;
+		height: auto;
+		margin-bottom: 24rpx;
+		padding:0 24rpx;
+		background: $bg-color;
+		border-radius: 20rpx;
+	}
+	.list-cell{
+		display:flex;
+		width: 100%;
+		align-items:baseline;
+		line-height:100rpx;
+		position:relative;
+		background: $bg-color;
+		justify-content: center;
+		border-bottom: 1px solid #EBEBEB;
+		&:last-child{
+			border-bottom: none;
+		}
+		&.cell-hover{
+			background:#fafafa;
+		}
+		.cell-icon{
+			width: 60rpx;
+			height: 100rpx;
+			line-height: 100rpx;
+			text-align: center;
+			.iconfont{
+				font-size: $font-size-34;
+				color: #666666;
+			}
+		}
+		.cell-more{
+			align-self: baseline;
+			font-size:$font-size-28;
+			color:#666666;
+			.txt{
+				color: #FB4343;
+				padding-right: 10rpx;
+			}
+		}
+		.cell-tit{
+			flex: 1;
+			font-size: $font-size-28;
+			color: #666666;
+			margin-right:10rpx;
+		}
+		.cell-tip{
+			font-size: $font-size-28;
+			color: $text-color;
+		}
+	}	
+	.list-cell.last{
+		border-bottom: none;
+	}
+	.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;
+	}
+</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/temp/line@3x.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: 46rpx;
+			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-xiayibu {
+			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-xiayibu"></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>

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

@@ -0,0 +1,365 @@
+<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 v-if="item.promotions" class="floor-item-act">
+						<view class="floor-tags">{{item.promotions.name}}</view>	
+					</view>
+					<view class="title-text">{{item.name}}</view> 
+				</view>
+				<view class="productlist" v-for="(pros,idx) in item.cartList" :key="idx">
+					<view class="goods-pros-t">
+						<view class="pros-img">
+							<image :src="pros.image" alt="" />
+							<text class="tips" v-if="pros.productType ==2 || pros.productType ==1">赠品</text>
+						</view>
+						<view class="pros-product">
+							<view class="producttitle">{{pros.name}}</view>
+							<view class="productspec"  v-if="pros.productCategory!=2">规格:{{pros.unit}}</view>
+							<view class="productspec" v-if="pros.productCode!=''&&pros.productCode!=null">
+								<view >商品编码:{{pros.productCode}}</view>
+							</view>
+							<view class="productprice">
+								<view class="price"><text>¥{{pros.price | NumFormat}}</text></view>
+								<view class="count"><text class="small">x</text>{{pros.number}}</view>
+							</view>
+							<view class="floor-item-act" v-if="pros.promotions!=null">
+								<view v-if="PromotionsFormat(pros.promotions)" class="floor-tags">
+									{{pros.promotions.name}}
+									<text v-if ="pros.promotions!=null">
+										:¥{{ pros.promotions == null ? '0.00' : pros.promotions.touchPrice | NumFormat}}
+									</text>
+								</view>
+								<view v-else-if="pros.promotions.type !=3" class="floor-tags">{{pros.promotions.name}}</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.originalPrice - item.totalPrice)>0">
+						<text class="money-sign">¥</text>
+						<text class="money">{{ item.originalPrice | NumFormat }}</text>
+						<text class="money-reduced">减<text>¥{{ (item.originalPrice - item.totalPrice) | NumFormat}}</text></text>
+					</view>
+					<view class="sum">合计:<text class="money">¥{{ item.totalPrice | 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;
+				}
+				.floor-item-act{
+					height: 56rpx;
+					text-align: center;
+					box-sizing: border-box;
+					float: left;
+					padding: 12rpx 0;
+					margin-right: 12rpx;
+					.floor-tags{
+						height: 28rpx;
+						border-radius: 6rpx;
+						background-color: #FFFFFF;
+						line-height: 28rpx;
+						color: $color-system;
+						text-align: center;
+						display: inline-block;
+						padding:0 16rpx;
+						font-size: $font-size-20;
+						border: 1px solid #E15616;
+						float: left;
+					}
+				}
+			}
+			.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{
+					height: 40rpx;
+					line-height: 40rpx;
+					color: #999999;
+					text-overflow:ellipsis;
+					display: -webkit-box;
+					word-break: break-all;
+					-webkit-box-orient: vertical;
+					-webkit-line-clamp: 2;
+					overflow: hidden;
+				}
+				.productprice{
+					height: 54rpx;
+					width: 100%;
+					float: left;
+					.price{
+						line-height: 54rpx;
+						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: $color-system;
+						text-align: center;
+						display: inline-block;
+						padding:0 16rpx;
+						font-size: $font-size-20;
+						border: 1px solid #E15616;
+						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: 580rpx;
+					height: 36rpx;
+					padding: 20rpx;
+					background: #F7F7F7;
+					border-radius: 10rpx;
+					input{
+						width: 100%;
+						height: 100%;
+						background: #F7F7F7;
+						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>

+ 683 - 0
components/cm-module/creatOrder/invoiceTent.vue

@@ -0,0 +1,683 @@
+<template name="invoice">
+	<view class="invoice-template">
+		 <!-- 发票信息 -->
+		<view class="invoice-title" @tap.stop="hanldOperationConfim">
+			<text class="text">发票信息:</text>
+			<text class="iconfont icon-xiayibu"></text>
+		</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="#E15616"/>
+								<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="请填写单位信息(必填)" maxlength="20">
+						</view>
+						<view class="invoice-from">
+							<view class="label">纳税人识别号:</view>
+							<input class="form-input" type="text" v-model="invoiceData.corporationTaxNum" placeholder="请填写纳税人识别号(必填)" maxlength="20">
+						</view>
+						<view class="invoice-from">
+							<view class="label">注册地址:</view>
+							<input class="form-input" type="text" v-model="invoiceData.registeredAddress" placeholder="请填写单位注册地址(必填)" maxlength="100">
+						</view>
+						<view class="invoice-from">
+							<view class="label">注册电话:</view>
+							<input class="form-input" type="text" v-model="invoiceData.registeredPhone" placeholder="请填写注册电话(必填)" maxlength="15">
+						</view>
+						<view class="invoice-from">
+							<view class="label">开户银行:</view>
+							<input class="form-input" type="text" v-model="invoiceData.openBank"   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">
+						</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="请填写个人抬头" maxlength="20">
+							</view>
+							<view class="group-from" v-if="peopleInvoiceData.invoiceTitleType == '1'">
+								<input class="form-input" type="text" v-model="peopleInvoiceData.invoiceTitle"   placeholder="请填写公司抬头" maxlength="20">
+							</view>
+							<view class="group-from" v-if="peopleInvoiceData.invoiceTitleType == '1'">
+								<input class="form-input" type="text" v-model="peopleInvoiceData.corporationTaxNum"   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.getStorage().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.getStorage().then((resolve) => {
+					console.log(resolve.userID)
+					this.OrderService.UpdateInvoice(Object.assign({userId:resolve.userID},this.invoiceData)).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;
+					//取消普通发票.(可删除)	
+					// case '3':
+					// 	this.peopleInvoiceData.invoiceTitleType = "0"
+					// 	this.titleCurrent = 0
+					// 	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;
+			border-bottom: 1px solid #EBEBEB;
+			.text{
+				font-size: $font-size-28;
+				color: $text-color;
+			}
+			.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;
+				.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;
+				}
+			}
+		}
+	}	
+</style>

+ 202 - 0
components/cm-module/creatOrder/sellerAddress.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 !== 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/temp/line@3x.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 = '/seller/pages/address/addressManage'
+				}else{
+					this.isEmpty = false
+					this.$parent.isFreight = false
+					this.addressSrc = '/seller/pages/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: 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: 46rpx;
+			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-xiayibu {
+			font-size: 32rpx;
+			color: $text-color;
+			margin-right: 30rpx;
+		}
+		.a-bg {
+			position: absolute;
+			left: 0;
+			bottom: 0;
+			display: block;
+			width: 100%;
+			height: 5rpx;
+		}
+	}
+</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-xiayibu"></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="#E15616"/>
+								<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-top: 24rpx;
+		.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-xiayibu{
+					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>

+ 367 - 0
components/cm-module/creatOrder/sellerGoodsList.vue

@@ -0,0 +1,367 @@
+<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 v-if="item.promotions" class="floor-item-act">
+						<view class="floor-tags">{{item.promotions.name}}</view>	
+					</view>
+					<view class="title-text">{{item.name}}</view> 
+				</view>
+				<view class="productlist" v-for="(pros,idx) in item.productsList" :key="idx">
+					<view class="goods-pros-t">
+						<view class="pros-img">
+							<image :src="pros.mainImage" alt="" />
+							<text class="tips" v-if="pros.giftType == 2 || pros.giftType == 1">赠品</text>
+						</view>
+						<view class="pros-product">
+							<view class="producttitle">{{pros.name}}</view>
+							<view class="productspec"  v-if="pros.productCategory!=2">规格:{{pros.unit}}</view>
+							<view class="productspec" v-if="pros.productCode!=''&&pros.productCode!=null">
+								<view >商品编码:{{pros.productCode}}</view>
+							</view>
+							<view class="productprice">
+								<view class="price"><text>¥{{pros.retailPrice | NumFormat}}</text></view>
+								<view class="count"><text class="small">x</text>{{pros.productCount}}</view>
+							</view>
+							<view class="floor-item-act" v-if="pros.promotions!=null">
+								<view v-if="PromotionsFormat(pros.promotions)" class="floor-tags">
+									{{pros.promotions.name}}
+									<text v-if ="pros.promotions!=null">
+										:¥{{ pros.promotions == null ? '0.00' : pros.promotions.touchPrice | NumFormat}}
+									</text>
+								</view>
+								<view v-else-if="pros.promotions.type !=3" class="floor-tags">{{pros.promotions.name}}</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.reducedPrice>0">
+						<text class="money-sign">¥</text>
+						<text class="money">{{ item.totalPrice | NumFormat }}</text>
+						<text class="money-reduced">减<text>¥{{ item.reducedPrice | NumFormat}}</text></text>
+					</view>
+					<view class="sum">合计:<text class="money">¥{{ ( item.totalPrice -item.reducedPrice ) | 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;
+				}
+				.floor-item-act{
+					height: 56rpx;
+					text-align: center;
+					box-sizing: border-box;
+					float: left;
+					padding: 12rpx 0;
+					margin-right: 12rpx;
+					.floor-tags{
+						height: 28rpx;
+						border-radius: 6rpx;
+						background-color: #FFFFFF;
+						line-height: 28rpx;
+						color: $color-system;
+						text-align: center;
+						display: inline-block;
+						padding:0 16rpx;
+						font-size: $font-size-20;
+						border: 1px solid #E15616;
+						float: left;
+					}
+				}
+			}
+			.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{
+					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{
+					height: 54rpx;
+					line-height: 54rpx;
+					width: 100%;
+					float: left;
+					.price{
+						line-height: 54rpx;
+						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: $color-system;
+						text-align: center;
+						display: inline-block;
+						padding:0 16rpx;
+						font-size: $font-size-20;
+						border: 1px solid #E15616;
+						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: #fff;
+					border-radius: 10rpx;
+					border: 2rpx solid #b2b2b2;
+					input{
+						width: 100%;
+						height: 100%;
+						// background: #F7F7F7;
+						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>

+ 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-xiayibu"></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="#E15616"/>
+								<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('orderUserInfo').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('orderUserInfo').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-xiayibu"></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/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-xiayibu{
+					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>

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

@@ -0,0 +1,199 @@
+<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-fanhui"></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-iconfonticonfontsousuo1"></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
+			},
+			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{
+					uni.navigateBack({
+			        	delta: 1
+			      	});
+				}
+		    },
+		    _goHome: function () {
+		      	uni.switchTab({
+		        	url: '/pages/tabBar/home/index'
+		      	})
+		    },
+		    _goUser: function () {
+		      	uni.switchTab({
+		        	url: '/pages/tabBar/user/user'
+		      	})
+		    },
+			_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-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;
+	}
+</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-fanhui"></text>
+			  <text v-else  @click="_goHome" class="iconfont icon-shouye"></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-shouye" :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>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+ 230 - 0
components/cm-module/home/cm-custom.vue

@@ -0,0 +1,230 @@
+<template name="headerNavbar">
+	<!-- 自定义导航栏 -->
+	<view class='navbar-wrap' :style="{height:(CustomBar+55)+'px',paddingTop:StatusBar+'px'}" @touchmove.stop.prevent="discard" @tap="hideBubble"> 		
+	  	<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="search-tab">
+				<view class="search-tab-btn"  @click="topBubble">
+					<text>{{ tabValue }}</text>
+					<text class="iconfont icon-xiangxiajiantou"></text>
+				</view>
+				<tui-bubble-popup :show="show" :mask="true" position="absolute" direction="top" @close="topBubble" width="140rpx"
+				 left="10rpx" bottom="0rpx" translateY="100%" triangleRight="60rpx" triangleTop="-22rpx" :maskBgColor="maskBgColor">
+					<view class="tui-menu-item" @tap="selectTabs(1)">产品</view>
+					<view class="tui-menu-item" @tap="selectTabs(2)">供应商</view>
+					<view class="tui-menu-item" @tap="selectTabs(3)">项目仪器</view>
+				</tui-bubble-popup>
+			</view>
+			<view class="gosearch-btn" @click="this.$api.navigateTo(clickPath)">
+				<text class="iconfont icon-iconfonticonfontsousuo1"></text>
+				<input class="input" type="text" v-model="SearchText" value="" placeholder="你想要的这里都有"/>
+			</view>
+			<view class="search-service">
+				<!-- #ifdef MP-WEIXIN -->
+				<button class="contact-btn" open-type="contact" @bindcontact="handleContact">
+					<text class="iconfont icon-liuyan"></text>
+				</button>	
+				<!-- #endif -->
+			</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
+		    },
+			maskBgColor: {//遮罩背景色
+				type: String,
+				default: 'transparent'
+			},
+		},
+		data() {
+			return{
+				show:false,
+				clickPath:'/search/pages/search/search',
+				SearchText:'',
+				tabValue:'产品',
+				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:{
+			handleContact(e){
+				console.log(e.detail.path)
+				console.log(e.detail.query)
+			},
+			topBubble() {
+				this.show = !this.show;
+			},
+			selectTabs(index){
+				this.show = false
+				switch(index){
+					case 1:
+						this.tabValue='产品'
+						break;
+					case 2:
+						this.tabValue='供应商'
+						break;
+					case 3:
+						this.tabValue='项目仪器'
+						break;
+				}
+			},
+			hideBubble(){
+				this.shwo = false
+			},
+			discard(){
+				//丢弃
+			},
+		},
+		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 {
+		width: 100%;
+		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: 70rpx;
+		padding: 20rpx 0;
+		.search-tab{
+			width: 180rpx;
+			height: 70rpx;
+			line-height: 70rpx;
+			color: #FFFFFF;
+			font-size: $font-size-28;
+			text-align: center;
+			float: left;
+			position: relative;
+			.icon-xiangxiajiantou{
+				margin-left: 10rpx;
+			}
+		}
+		.gosearch-btn{
+			width: 470rpx;
+			height: 100%;
+			float: left;
+			border-radius: 40rpx;
+			background: #F0F0F0;
+			margin: 0 auto;
+			padding:0 20rpx;
+			font-size: 28rpx;
+			line-height: 70rpx;
+			padding-left: 70rpx;
+			color: #8A8A8A;
+			background: #FFFFFF;
+			position: relative;
+			box-sizing: border-box;
+			.icon-iconfonticonfontsousuo1{
+				width: 70rpx;
+				height: 70rpx;
+				line-height: 70rpx;
+				text-align: center;
+				display: block;
+				position: absolute;
+				left: 0;
+				top: 0;
+				font-size: 34rpx;
+				color: #8A8A8A;
+				z-index: 10;
+			}
+			.input{
+				width: 400rpx;
+				height: 100%;
+				float: left;
+			}
+		}
+		.search-service{
+			width: 100rpx;
+			height: 70rpx;
+			line-height: 70rpx;
+			float: right;
+			text-align: center;
+			color: #FFFFFF;
+			.contact-btn{
+				width: 100%;
+				height: 70rpx;
+				background-color: rgba(0,0,0,0);
+				line-height: 70rpx;
+				.icon-liuyan{
+					font-size: 64rpx;
+					color: #FFFFFF;
+				}
+			}
+		}
+	}
+</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>

+ 158 - 0
components/cm-module/homeIndex/navbars.vue

@@ -0,0 +1,158 @@
+<template name="navbars">
+	<view>
+		<view class="navbars-content clearfix">
+			<view class="nav-item" v-for="(item,index) in navList" :key="index" @click="NavToDetailPage(item,index)">
+				<view class="icon">
+					<image class="icon-image" :src="item.icon" mode="widthFix"></image>
+				</view>
+				<view class="name">{{ item.name }}</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		name:"navbars",
+		props:{
+			list:{
+				type:Array
+			}
+		},
+		data() {
+			return{
+				current:100,
+				navList:[]
+			}
+		},
+		created(){
+			this.initData(this.list)
+		},
+		computed: {
+	
+		},
+		methods:{
+			initData(list){
+				this.navList = list
+			},
+			NavToDetailPage(pros,index) {//跳转
+				/**
+				 * 页面跳转类型
+				 * 1、二级页面,2、搜索项目仪器,3、直播页面,4、自由页面,5、商品详情,6、仪器项目详情,7、供应商主页
+				 * 8、专题活动页,9、二手市场介绍,10、二手商品列表,11、二手商品发布,12、商品搜索,13、信息详情
+				 * 14、品牌招商介绍页,15、维修保养介绍页,16、首页,17、注册页,18、信息中心,19、供应商列表
+				 **/
+				if(pros.linkType){
+					 const typeMap = {
+						1:`/pages/goods/goods-instrument?linkId=${pros.linkParam.id}&title=${pros.name}`,
+						3:`/h5/pages/article/path-live`,
+						10:`/second/pages/product/product-list`,
+						14:`/h5/pages/other/brand`,
+						15:`/h5/pages/other/repair`,
+						18:`/h5/pages/article/path?link=${pros.link}`,
+						20:`/pages/goods/good-floor?linkId=${pros.linkParam.id}&title=${pros.name}`,
+						21:`/h5/pages/activity/meobohui`,
+					 }
+					const url = typeMap[pros.linkType];
+					this.$api.navigateTo(url)
+				}
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.navbars-content{
+		width: 100%;
+		height: auto;
+		box-sizing: border-box;
+		padding: 0 24rpx;
+		margin-top: 30rpx;
+		.nav-item{
+			width: 164rpx;
+			height: auto;
+			float: left;
+			margin-bottom: 30rpx;
+			margin-right: 15.3rpx;
+			&:nth-child(4){
+				margin-right: 0;
+			}
+			&:nth-child(8){
+				margin-right: 0;
+			}
+			.icon{
+				width: 110rpx;
+				height: 110rpx;
+				margin: 0 auto;
+				position: relative;
+				.icon-image{
+					width: 110rpx;
+					height: 110rpx;
+					display: block;
+				}
+				.icon-new{
+					width: 44rpx;
+					height: 22rpx;
+					display: block;
+					position: absolute;
+					right: 0;
+					top: 20rpx;
+				}
+			}
+			.name{
+				width: 100%;
+				height: 40rpx;
+				line-height: 40rpx;
+				text-align: center;
+				font-size: $font-size-26;
+				color: #666666;
+			}
+			.nav-cell-main{
+				width: 100%;
+				height: auto;
+				position: absolute;
+				right: 0;
+				.nav-cell{
+					width: 164rpx;
+					height: auto;
+					float: left;
+					margin-bottom: 30rpx;
+					margin-right: 15.3rpx;
+					&:nth-child(4){
+						margin-right: 0;
+					}
+					&:nth-child(8){
+						margin-right: 0;
+					}
+					.icon{
+						width: 130rpx;
+						height: 130rpx;
+						margin: 0 auto;
+						position: relative;
+						.icon-image{
+							width: 130rpx;
+							height: 130rpx;
+							display: block;
+						}
+						.icon-new{
+							width: 44rpx;
+							height: 22rpx;
+							display: block;
+							position: absolute;
+							right: 0;
+							top: 20rpx;
+						}
+					}
+					.name{
+						width: 100%;
+						height: 40rpx;
+						line-height: 40rpx;
+						text-align: center;
+						font-size: $font-size-28;
+						color: #666666;
+					}
+				}
+			}
+		}
+	}
+</style>

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

@@ -0,0 +1,140 @@
+<template>
+	<view>
+		<view class="page-content clearfix" v-for="(page,index) in pageFloorList" :key="index">
+			<view class="tui-group-name" v-if="page.floorContent">
+				<view class="tui-group-title">
+					<view class="tui-group-l">{{ page.title }}</view>
+					<view class="tui-group-r"  v-if="page.floorContent.templateType != '8'" @click="NavToDetailPage(page)">
+						<text>更多</text>
+						<text class="iconfont icon-xiayibu"></text>
+					</view>
+					
+				</view>
+				<view class="tui-sub__desc">{{ page.detail }}</view>
+			</view>
+			<template v-if="page.floorContent.templateType == '1'">
+				<templateA :pageData="page" :userIdentity="userIdentity"></templateA>
+			</template>	 
+			<template v-if="page.floorContent.templateType == '2'">
+				<templateB :pageData="page" :userIdentity="userIdentity"></templateB>
+			</template>	 
+			<template v-if="page.floorContent.templateType == '3'">
+				<templateC :pageData="page" :userIdentity="userIdentity"></templateC>
+			</template>	 
+			<template v-if="page.floorContent.templateType == '4'">
+				<templateD :pageData="page" :userIdentity="userIdentity"></templateD>
+			</template>	 
+			<template v-if="page.floorContent.templateType == '5'">
+				<templateE :pageData="page" :userIdentity="userIdentity"></templateE>
+			</template>	 
+			<template v-if="page.floorContent.templateType == '6'">
+				<templateF :pageData="page" :userIdentity="userIdentity"></templateF>
+			</template>	 
+			<template v-if="page.floorContent.templateType == '7'">
+				<templateG :pageData="page" :userIdentity="userIdentity"></templateG>
+			</template>	 
+			<template v-if="page.floorContent.templateType == '8'">
+				<templateH :pageData="page" :userIdentity="userIdentity"></templateH>
+			</template>	  
+		</view>
+	</view>
+</template>
+
+<script>
+	import templateA from '@/components/cm-module/pageTemplate/templateA.vue'
+	import templateB from '@/components/cm-module/pageTemplate/templateB.vue'
+	import templateC from '@/components/cm-module/pageTemplate/templateC.vue'
+	import templateD from '@/components/cm-module/pageTemplate/templateD.vue'
+	import templateE from '@/components/cm-module/pageTemplate/templateE.vue'
+	import templateF from '@/components/cm-module/pageTemplate/templateF.vue'
+	import templateG from '@/components/cm-module/pageTemplate/templateG.vue'
+	import templateH from '@/components/cm-module/pageTemplate/templateH.vue'
+	export default{
+		name:"pageFloor",
+		components:{
+			templateA,
+			templateB,
+			templateC,
+			templateD,
+			templateE,
+			templateF,
+			templateG,
+			templateH,
+		},
+		props:{
+			list:{
+				type:Array
+			},
+			pageType:{
+				type:Number
+			},
+			userIdentity:{
+				type:Number
+			}
+		},
+		data() {
+			return{
+				pageFloorList:[]
+			}
+		},
+		created(){
+			this.initData(this.list)
+		},
+		computed: {
+	
+		},
+		methods:{
+			initData(data){
+				this.pageFloorList = data
+			},
+			NavToDetailPage(page) {//跳转
+				this.$api.navigateTo(`/pages/goods/good-floorMore?pageType=${this.pageType}&floorId=${page.id}&title=${page.title}`)
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.page-content{
+		background-color: #F7F7F7;
+		width: 100%;
+		height: auto;
+		box-sizing: border-box;
+		padding: 0 24rpx;
+		float: left;
+	}
+	.tui-group-name {
+		width: 100%;
+		height: 92rpx;
+		padding: 20rpx 0;
+	}
+	.tui-group-title{
+		width: 100%;
+		float: left;
+		.tui-group-l{
+			float: left;
+			font-size: 34rpx;
+			font-weight: bold;
+			text-align: left;
+			line-height: 49rpx;
+			color: #333;
+		}
+		.tui-group-r{
+			float: right;
+			font-size: $font-size-26;
+			text-align: right;
+			line-height: 49rpx;
+			color: #999999;
+			.icon-xiayibu{
+				font-size: $font-size-30;
+				color: #999999;
+			}
+		}
+	}
+	.tui-sub__desc {
+		width: 100%;
+		float: left;
+		color: rgba(153,153,153,0.9);
+		font-size: $font-size-26;
+	}
+</style>

+ 308 - 0
components/cm-module/homeIndex/pageSpecial.vue

@@ -0,0 +1,308 @@
+<template name="pagesProduct">
+	<view>
+		<view class="container-pages clearfix">
+			<scroll-view scroll-x>
+				<view class="tui-goods__list">
+					<view class="tui-goods__item" v-if="tempData.liveList != ''">
+						<view class="tui-group-name" @click="LiveGoPath">
+							<view class="tui-group-title"><text>采美LIVE</text></view>
+							<view class="iconfont icon-xiayibu"></view>
+						</view>
+						<view class="tui-goods__main" :class="flIndex == 0 ? 'one' : ''" v-for="(live, flIndex) in tempData.liveList" :key="flIndex" @click="LiveGoPathPros(live)">
+							<view class="tui-goods__imgbox" v-if="flIndex === 0">
+								<image :src="live.homePageImage" mode="" class="tui-goods__img"></image>
+								<view class="tui-goods__name">{{ live.liveTitle }}</view>
+								<view class="tui-goods__statu">
+									<text class="iconfont icon-weikaishi" v-if="live.liveStatus == 1"></text>
+									<image :src="iconLive" mode="widthFix" class="icon-live" v-if="live.liveStatus == 2"></image>
+									<text class="iconfont icon-jieshu" v-if="live.liveStatus == 3"></text>
+									<text>{{ live.liveStatus | statusType }}</text>
+								</view>
+							</view>
+							<view class="tui-goods__text" v-if="flIndex > 0">{{ live.liveTitle }}</view>
+						</view>
+					</view>
+					<view class="tui-goods__item" v-if="tempData.cmImageList != ''">
+						<view class="tui-group-name" @click="NewActivityList">
+							<view class="tui-group-title"><text>最新活动</text></view>
+							<view class="iconfont icon-xiayibu"></view>
+						</view>
+						<view class="tui-goods__main" :class="flIndex == 0 ? 'one' : ''" v-for="(cmImage, flIndex) in tempData.cmImageList" :key="flIndex" @click="NewActivityListPath(cmImage)">
+							<view class="tui-goods__imgbox" v-if="flIndex === 0">
+								<image :src="cmImage.homePageImage" mode="" class="tui-goods__img"></image>
+								<view class="tui-goods__name">{{ cmImage.title }}</view>
+							</view>
+							<view class="tui-goods__text" v-if="flIndex > 0">{{ cmImage.title }}</view>
+						</view>
+					</view>
+					<view class="tui-goods__item" v-if="tempData.infoList != ''">
+						<view class="tui-group-name" @click="NavArticlePath('https://www.caimei365.com/info/center-3-1.html')">
+							<view class="tui-group-title"><text>热门文章</text></view>
+							<view class="iconfont icon-xiayibu"></view>
+						</view>
+						<view class="tui-goods__main" :class="flIndex == 0 ? 'one' : ''" v-for="(info, flIndex) in tempData.infoList" :key="flIndex" @click="NavArticlePath(info.link)">
+							<view class="tui-goods__imgbox" v-if="flIndex === 0">
+								<image :src="info.homePageImage" mode="" class="tui-goods__img"></image>
+								<view class="tui-goods__name">{{ info.title }}</view>
+							</view>
+							<view class="tui-goods__text" v-if="flIndex > 0">{{ info.title }}</view>
+						</view>
+					</view>
+				</view>
+			</scroll-view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import { mapState,mapMutations} from 'vuex';
+	export default{
+		name:"pagesProduct",
+		props:{
+			templateData:{
+				type:Object
+			}
+		},
+		data() {
+			return{
+				tempData:{},
+				iconLive:'https://static.caimei365.com/app/img/icon/icon-live.gif'
+			}
+		},
+		filters: {
+			statusType:function(value) {
+				switch (value) {
+					case 1:
+						return  '未开始';
+						break;
+					case 2:
+						return  '直播中';
+						break;
+					case 3:
+						return  '看回放';
+						break;
+				}
+			},
+			NumFormat:function(value) {//处理金额
+				return Number(value).toFixed(2);
+			},
+		},
+		created(){
+			this.initData(this.templateData)
+		},
+		methods:{
+			initData(data){
+				this.tempData = data
+			},
+			NavArticlePath(LINK){
+				 this.$api.navigateTo(`/h5/pages/article/path?link=${LINK}`)
+			},
+			NewActivityList(){
+				this.$api.navigateTo('/h5/pages/activity/activity-list')
+			},
+			NewActivityListPath(pros){
+				/**
+				 * 页面跳转类型
+				 * 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}&title=${pros.name}`,
+					 	2:`/pages/goods/instrument-details?id=${pros.linkParam.id}`,
+						4:`/h5/pages/activity/activity?title=${pros.title}&link=${pros.appletsLink}`,
+					 	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}`
+					}
+					const url = typeMap[pros.linkType];
+					uni.navigateTo({
+					  	url:url
+					})
+				}
+			},
+			LiveGoPath(){//查看直播
+				this.$api.navigateTo('/h5/pages/article/path-live')
+				
+				// uni.navigateToMiniProgram({
+				// 	appId: 'wx92d650b253f8f2e3',
+				// 	path: '/pages/index/index',
+				// 	extraData: {
+				// 		'data1': 'test'
+				// 	},
+				// 	envVersion: 'develop',
+				// 	success(res) {
+				// 		// 打开成功
+				// 		console.log(res)
+				// 	}
+				// })
+			},
+			LiveGoPathPros(live){
+				this.$api.navigateTo(`/h5/pages/article/page-image?title=${live.liveTitle}&image=${live.advertisingImage}`)
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.container-pages{
+		width: 100%;
+		height:508rpx;
+		padding: 24rpx;
+		float: left;
+		background-color: #F7F7F7;
+		margin-top: 16rpx;
+		box-sizing: border-box;
+		background-color: #F7F7F7;
+		overflow: hidden;
+		display: flex;
+		align-items: center;
+		.tui-goods__list {
+			display: flex;
+			align-items: center;
+		}
+		.tui-goods__item {
+			background-color: #fff;
+			width: 307rpx;
+			height: 460rpx;
+			border-radius: 16rpx;
+			box-sizing: border-box;
+			margin-right: 16rpx;
+			padding: 17rpx;
+		}
+		.tui-group-name{
+			width: 100%;
+			height: 36rpx;
+			float: left;
+			margin-bottom: 13rpx;
+			.tui-group-title{
+				font-size: 26rpx;
+				line-height: 36rpx;
+				float: left;
+				color: #333333;
+			}
+			.icon-xiayibu{
+				font-size: 26rpx;
+				line-height: 36rpx;
+				float: right;
+				color: #909090;
+			}
+		}
+		.tui-goods__main{
+			width: 100%;
+			height: auto;
+			float: left;
+			position: relative;
+			&.one{
+				margin-bottom: 14rpx;
+			}
+		}
+		.tui-goods__imgbox {
+			width: 273rpx;
+			height: 273rpx;
+			box-sizing: border-box;
+			border-radius: 8rpx;
+		}
+		.tui-goods__img {
+			max-width: 273rpx;
+			max-height: 273rpx;
+			border-radius: 8rpx;
+			display: block;
+		}
+		.tui-goods__name{
+			width: 100%;
+			height: 48rpx;
+			float: left;
+			line-height: 48rpx;
+			box-sizing: border-box;
+			padding-left: 12rpx;
+			font-size: $font-size-24;
+			color: #FFFFFF;
+			background-color: rgba(0,0,0,0.4);
+			position: absolute;
+			bottom: 0;
+			left: 0;
+			white-space: nowrap;
+			text-overflow: ellipsis;
+			overflow: hidden;
+			border-radius:0 0 8rpx 8rpx;
+		}
+		.tui-goods__statu{
+			padding-left: 45rpx;
+			padding-right: 10rpx;
+			height: 35rpx;
+			position: absolute;
+			top: 17rpx;
+			left: 17rpx;
+			background-color: rgba(0,0,0,0.4);
+			border-radius: 18rpx;
+			line-height: 35rpx;
+			color: #FFFFFF;
+			text-align: right;
+			font-size: $font-size-20;
+			.icon-live{
+				width: 17rpx;
+				height: 17rpx;
+				display: block;
+				margin: 0 auto;
+				position: absolute;
+				left: 15rpx;
+				top: 9rpx;
+			}
+			.iconfont{
+				width: 35rpx;
+				height: 35rpx;
+				line-height: 35rpx;
+				display: block;
+				position: absolute;
+				left: 10rpx;
+				font-size: $font-size-26;
+				&.icon-weikaishi{
+					color: #E56D00;
+					left:0;
+				}
+				&.icon-jieshu{
+					color: #FFFFFF;
+					left:0;
+					font-size: 22rpx;
+				}
+			}
+		}
+		.tui-goods__text{
+			width: 100%;
+			height: 44rpx;
+			float: left;
+			line-height: 44rpx;
+			box-sizing: border-box;
+			padding-left: 12rpx;
+			font-size: $font-size-24;
+			color: #666666;
+			white-space: nowrap;
+			text-overflow: ellipsis;
+			overflow: hidden;
+			position: relative;
+			&::before{
+				content: '';
+				width: 8rpx;
+				height: 8rpx;
+				border-radius: 50%;
+				background-color: #cccccc;
+				position: absolute;
+				left: 0;
+				top: 18rpx;
+			}
+		}
+	}	
+</style>

+ 137 - 0
components/cm-module/homeIndex/supplierList.vue

@@ -0,0 +1,137 @@
+<template>
+	<view class="supplier-content clearfix">
+		<view class="tui-group-name" >
+			<view class="tui-group-title">
+				<text> 优质供应商 </text>
+			</view>
+			<view class="tui-sub__desc">采美正品联盟 质量保证</view>
+		</view>
+		<view class="supplier-banner">
+			<image :src="banner" mode="" @click="BannerNavigateTo(supplierObj.linkType,supplierObj.linkParam.id,supplierObj.wwwLink,supplierObj.linkParam.keyword)"></image>
+		</view>
+		<view class="swiper-goods-box">
+			<view class="goods-box-item" v-for="(item,index) in supplierObj.qualitySupplierList" :key="index" @click="NavToDetailPage(item)">
+				<image :src="item.image" mode="" class="box-item-image"></image>
+				<view class="box-item-mask">{{ item.supplierName }}</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		name:"supplierList",
+		props:{
+			supplierObj:{
+				type:Object
+			}
+		},
+		data() {
+			return{
+				banner:'',
+				supplierList:[]
+			}
+		},
+		created(){
+			this.initData(this.supplierObj)
+		},
+		computed: {
+	
+		},
+		methods:{
+			initData(data){
+				this.banner = data.crmImage
+				this.supplierList = data.qualitySupplierList
+			},
+			BannerNavigateTo(linkType,linkId,linkHref,keyword) {//跳转
+				this.$api.BannerNavigateTo(linkType,linkId,linkHref,keyword)
+			},
+			NavToDetailPage(item) {//跳转
+				this.$api.navigateTo(`/supplier/pages/user/my-shop?shopId=${item.linkParam.id}`)
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.supplier-content{
+		background-color: #F7F7F7;
+		width: 100%;
+		height: auto;
+		box-sizing: border-box;
+		padding: 0 24rpx;
+	}
+	.tui-group-name {
+		width: 100%;
+		height: 92rpx;
+		padding: 20rpx 0;
+	}
+	.tui-group-title{
+		width: 100%;
+		float: left;
+		font-size: 34rpx;
+		font-weight: bold;
+		text-align: left;
+		line-height: 49rpx;
+		color: #333;
+	}
+	.tui-sub__desc {
+		width: 100%;
+		float: left;
+		color: rgba(153,153,153,0.9);
+		font-size: $font-size-26;
+	}
+	.supplier-banner{
+		width: 100%;
+		height: 240rpx;
+		float: left;
+		margin-top: 24rpx;
+		image{
+			width: 100%;
+			height: 240rpx;
+			display: block;
+		}
+	}
+	.swiper-goods-box{
+		width: 100%;
+		height: auto;
+		float: left;
+		margin-top: 24rpx;
+		.goods-box-item{
+			width: 160rpx;
+			height: 200rpx;
+			float: left;
+			margin-right: 20rpx;
+			margin-bottom: 20rpx;
+			background-color: #FFFFFF;
+			&:nth-child(4n){
+				margin-right: 0;
+			}
+			.box-item-image{
+				width: 160rpx;
+				height: 160rpx;
+				display: block;
+				float: left;
+			}
+			.box-item-mask{
+				width: 100%;
+				height: 40rpx;
+				line-height: 40rpx;
+				font-size: $font-size-20;
+				text-align: center;
+				color: #666666;
+				background-color: #f9f9f9;
+				float: left;
+				box-sizing: border-box;
+				padding:0 20rpx;
+				white-space: normal;
+				word-break: break-all;
+				overflow: hidden;
+				text-overflow: ellipsis;
+				display: -webkit-box;
+				-webkit-box-orient: vertical;
+				-webkit-line-clamp: 1;
+			}
+		}
+	}
+</style>

+ 417 - 0
components/cm-module/listTemplate/buyagainList.vue

@@ -0,0 +1,417 @@
+<template>
+	<view class="container commodity-list-wrapper" :style="{'overflow':(showSkeleton? 'hidden' : 'auto'),'height': (showSkeleton? windowHeight + 'px' : 'auto')}">
+		<list-skeleton v-if="showSkeleton"></list-skeleton>
+		<view class="product-container" v-if="!isShowEmpty" :style="{paddingTop:searchStatus?'112rpx':''}">
+			<scroll-view :style="{'height':scrollHeight+'px'}" @scrolltolower="scrolltolower" scroll-y v-if="productList.length > 0">
+				<view v-for="(item,index) in productList" :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 !=null ? item.unit : ''}}</text>
+						<text class="list-details-miniQuantity">起订量:{{item.ladderPriceFlag == '1' ? item.maxBuyNumber : item.minBuyNumber}}</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.promotions) ? 'none' : ''">
+										¥{{ (PromotionsFormat(item.promotions) ? item.price1 : item.retailPrice) | NumFormat }}
+									</text>
+								</view>
+							</view>
+							<button class="add-cart-btn" @click.stop="operationHanld(item)">数量</button>
+						</view>
+						<view class="list-details-price" v-if="item.actStatus==1">
+							<view class="floor-item-act">
+								<view class="floor-tags" v-if="PromotionsFormat(item.promotions)">
+									{{item.promotions.name}}<text>:¥{{ item.retailPrice | 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>
+						</view>	
+					</view>
+				</view>
+				<view v-if="showLoading && productList.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>
+		<view class="empty-container" v-else>
+			<image class="empty-container-image" src="https://img.caimei365.com/group1/M00/03/71/Cmis2F3wna6AWdWzAAGlgAP0das422.png" mode="aspectFit"></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 { mapState,mapMutations } from 'vuex';
+	export default{
+		name:'productList',
+		components:{
+			listSkeleton,
+			modalLayer,
+			uniStars,
+			cmDrag
+		},
+		data(){
+			return{
+				isShowClose:false,
+				searchInputVal:'',
+				isModallayer:false,
+				windowHeight: '',
+				showSkeleton: true,
+				isShowEmpty: false,
+				userID: '',
+				scrollHeight: '',
+				productList: [],
+				showLoading: false,
+				loadingNow: true,
+				loadingText: '上拉加载更多',
+				pageSize: 10,
+				pageNum: 1,
+				hasNextPage: false,
+				pullFlag: true,
+				fromRegularPurchasePage: false,
+				cartQuantity: 0,
+				showRegularBtn: false,
+				isPrecedence:false,
+				windowWidth:'',
+				windowHeight:'',
+			}
+		},
+		created() {
+			this.setScrollHeight();		
+			this.$parent.getClubProductNum()
+			this.$api.getComStorage('orderUserInfo').then((resolve) =>{
+				this.userID = resolve.userID
+				this.getProductAgainInfo()
+			})
+		},
+		filters: {
+			NumFormat:function(text) {//处理金额
+				return Number(text).toFixed(2);
+			},
+		},
+		computed: {
+			...mapState(['hasLogin','userInfo'])
+		},
+		methods:{
+			scrolltolower() {
+				if(this.hasNextPage && this.pullFlag) {
+					this.getProductAgainInfo(true);
+				}
+			},
+			setScrollHeight() {
+				const {windowHeight, pixelRatio} = wx.getSystemInfoSync();
+				this.windowHeight = windowHeight - 1;
+				this.scrollHeight = windowHeight - 1;
+			},
+			getProductAgainInfo(loadMore) {
+				this.showLoading = true;
+				this.loadingNow = true;
+				this.loadingText = '加载中';
+				this.isShowEmpty = false;				
+				if(loadMore) {this.pageNum += 1;}
+				let params = {userId:this.userID,pageNum:this.pageNum,pageSize:this.pageSize}
+				this.ProductService.GetRepeatBuyAgainProductList(params).then(response =>{
+					this.isShowWrapper = true
+					const responseData = response.data.pageDate;
+					if(responseData.results && responseData.results.length > 0){
+						this.hasNextPage = responseData.hasNextPage;
+						this.isShowEmpty = false;
+						if(loadMore) {
+							this.productList = [...this.productList,...responseData.results];
+						} else {
+							this.productList = [...responseData.results];
+							this.showSkeleton = false;
+						}
+						//价格显示处理
+						let isActFlg,newProductList=[];
+						this.productList.map((item, index)=> {
+							if(item.actStatus == 1){
+								isActFlg = true
+							}else if(item.actStatus == 1 && item.ladderPriceFlag == 1){
+								isActFlg = true
+							}else{
+								isActFlg = false
+							}
+							newProductList.push(Object.assign({},item,{isShowActFlg:isActFlg}))
+						})
+						this.productList = newProductList
+						// 防上拉暴滑
+						this.pullFlag = false;
+						setTimeout(()=>{
+							this.pullFlag = true;
+						},500)
+						// 底部提示文案
+						if(this.hasNextPage) {
+							this.loadingText = '上拉加载更多';
+						} else {
+							this.showLoading = true;
+							this.loadingNow = false;
+						}
+					} else {
+						if(!loadMore) {
+							this.isShowEmpty = true;
+						}
+					}
+				}).catch(error =>{
+					this.$util.msg(error.msg,2000);
+				})
+			},
+			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
+			},
+			onShowClose () {//输入框失去焦点时触发
+				if(this.searchInputVal != ''){
+					this.isShowClose = true
+				}else{					
+					this.isShowClose = false
+				}
+			},
+			delInputText(){//清除输入框内容
+				this.searchInputVal = ''
+				this.isShowClose = false
+			},
+			btnClick() {
+				this.$emit('goCartPage')
+			},
+			btnTouchstart() {
+				// console.log('btnTouchstart');
+			},
+			btnTouchend() {
+				// console.log('btnTouchend');
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.commodity-list-wrapper {
+		scroll-view {
+			height: 100%;
+		}
+		.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: 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%;
+			display: inline-block;
+			margin-top: 8rpx;
+			color: #999999;
+		}
+		.list-details-miniQuantity {
+			width: 100%;
+			display: inline-block;
+			margin-top: 7rpx;
+		}
+	}
+	.list-details-price {
+		width: 100%;
+		float: left;
+		line-height: 54rpx;
+		.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 16rpx;
+				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-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;
+					&.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;
+		}
+	}
+	.cart-icon {
+		width: 92rpx;
+		height: 92rpx;
+		border-radius: 50%;
+		background: rgba(255, 147, 0, 0.5);
+		position: fixed;
+		right: 24rpx;
+		bottom: 28%;
+		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>

+ 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 16rpx;
+				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>

+ 449 - 0
components/cm-module/listTemplate/commodityList.vue

@@ -0,0 +1,449 @@
+<!-- 分类商品模块 -->
+<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.p_id)">
+				<image mode='widthFix' :src="item.p_image"  class="list-img" alt="list-img"></image>
+				<view class="list-details-info">
+					<text class="list-details-title">{{item.p_name}}</text>
+					<text class="list-details-specs">规格:{{item.p_unit}}</text>
+					<view class="list-details-specs" v-if="item.p_code!=''&&item.p_code!=null">商品编码:{{item.p_code}}</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.p_price_flag != '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.p_price_flag != '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">
+							<template v-if="userIdentity == 1">
+								<text v-if="priceLoading" class="price-larger small">正在获取价格...</text>
+								<template v-else>
+									<text class="price-larger" :class="PromotionsFormat(item.promotions) ? 'none' : ''">
+										¥{{ (PromotionsFormat(item.promotions) ? item.originalPrice : item.price) | NumFormat}}
+									</text>
+								</template>
+							</template>	
+							<template v-if="userIdentity == 4">
+								<view class="price-larger" v-if="item.p_price_flag == '1'">
+									<text class="txt">¥未公开价格</text>
+								</view>
+								<view class="price-larger" v-if="item.p_price_flag == '2'">
+									<text class="txt">¥价格仅会员可见</text>
+								</view>
+								<text v-else-if="priceLoading" class="price-larger small">正在获取价格...</text>
+								<template v-else>
+									<text class="price-larger" :class="PromotionsFormat(item.promotions) ? 'none' : ''">
+										¥{{ (PromotionsFormat(item.promotions) ? item.originalPrice : item.price) | NumFormat}}
+									</text>
+								</template>
+							</template>
+							<template v-if="userIdentity == 3">
+								<template v-if="item.supplierId === shopId">
+									<view class="price-larger" v-if="item.p_price_flag == '1'">
+										<text class="txt">¥未公开价格</text>
+									</view>
+									<text v-else-if="priceLoading" class="price-larger small">正在获取价格...</text>
+									<text v-else class="price-larger" :class="PromotionsFormat(item.promotions) ? 'none' : ''">
+										¥{{ (PromotionsFormat(item.promotions) ? item.originalPrice : item.price) | NumFormat}}
+									</text>
+								</template>
+								<template v-else>
+									<view  class="list-login-now">
+										<text class="p-no">¥</text>
+										<uni-grader :grade="Number(item.p_price_grade)"></uni-grader>
+									</view>
+								</template>
+							</template>
+							<template v-if="userIdentity == 2">
+								<view class="price-larger" v-if="item.p_price_flag == '1'">
+									<text class="txt">¥未公开价格</text>
+								</view>
+								<text v-else-if="priceLoading" class="price-larger small">正在获取价格...</text>
+								<template v-else>
+									<text class="price-larger" :class="PromotionsFormat(item.promotions) ? 'none' : ''">
+										¥{{ (PromotionsFormat(item.promotions) ? item.originalPrice : item.price) | NumFormat}}
+									</text>
+								</template>
+							</template>
+						</view>	
+						<view  v-else class="list-login-now">
+							<text class="p-no">¥</text>
+							<uni-grader :grade="Number(item.p_price_grade)"></uni-grader>
+						</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 uniGrader from '@/components/uni-grade/uni-grade.vue'
+	import { searchQueryTinyType} from "@/api/utils.js"
+	import { mapState,mapMutations } from 'vuex';
+	export default{
+		name:'CommodityList',
+		components:{
+			listSkeleton,
+			modalLayer,
+			uniGrader
+		},
+		props: {
+			emptyText: {
+				type: String
+			},
+			serverUrl: {
+				type: String
+			},
+			typeId: {
+				type:Number
+			}
+		},
+		data(){
+			return{
+				clubStatus:'',
+				isModallayer:false,
+				windowHeight: '',
+				showSkeleton: true,
+				showEmpty: false,
+				userID:0,
+				shopId:0,
+				userIdentity:'',
+				priceLoading:true,
+				scrollHeight: '',
+				listData: [],
+				showLoading: false,
+				loadingNow: true,
+				loadingText: '上拉加载更多',
+				pageSize: 20,
+				pageNum: 1,
+				totalPage: 1,
+				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.shopId = resolve.shopID ? resolve.shopID : 0;
+				this.userIdentity = resolve.userIdentity
+				this.getListFromServer();
+			}).catch(error =>{
+				this.getListFromServer();
+			})
+		},
+		filters: {
+			NumFormat:function(text) {//处理金额
+				return Number(text).toFixed(2);
+			},
+		},
+		computed: {
+			...mapState(['hasLogin','userInfo','identity'])
+		},
+		methods:{
+			toLower() {
+				if(this.totalPage>this.listData.length && 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 ={
+						id:this.typeId,
+						identity:this.identity,
+						pageNum:this.pageNum,
+						pageSize:this.pageSize,
+						sortField:'',
+						sortType:''
+				}
+				searchQueryTinyType(this.serverUrl,params).then(response=>{
+					const resData = JSON.parse(response.data);
+					const resList = resData.items;
+					if(resList && resList.length > 0){
+						this.showEmpty = false
+						this.totalPage = resData.total;
+						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.totalPage>this.listData.length) {
+							this.loadingText = '上拉加载更多';
+						} else {
+							this.showLoading = true;
+							this.loadingNow = false;
+						}
+					} 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.p_id)
+				})
+				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.p_id == 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: 36rpx;
+			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;
+		.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 16rpx;
+				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>

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

@@ -0,0 +1,968 @@
+<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="nav-tab-bar u-f-ajc">
+				<block v-for="(tab,index) in tabBars" :key='tab.id' :class="{ current: tabIndex === index }">
+					<view class="tabstyle u-f-ajc" :class="{'addstyle':tabIndex==index}" @tap="changeTab(index)">
+						{{tab.name}}<i v-if='(tabIndex==index)' class='nav-tab-line iconfont icon-gou'></i>
+					</view>
+				</block>
+			</view>
+			<view class="search-from name">
+				<text class="iconfont icon-iconfonticonfontsousuo1"></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 >
+			<view :class="tabIndex" v-if="tabIndex === 0"  :style="{paddingTop:searchStatus?'128rpx':''}">
+				<scroll-view :style="{'height':scrollHeight+'px'}" @scrolltolower="scrolltolower(tabIndex)" 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.p_id)"  >
+					    <image mode='widthFix' :src="item.p_image"  class="list-img" alt="list-img"></image>
+						<view class="list-details-info">
+							<text class="list-details-title">{{isInterceptHtmlFn(item.p_name)}}</text>
+							<text class="list-details-specs">规格:{{item.p_unit?item.p_unit:''}}</text>
+							<text class="list-details-miniQuantity list-details-specs">起订量:{{item.minBuyNumber}}</text>
+							<view class="list-details-specs" v-if="item.p_code!=''&&item.p_code!=null">
+								<view>商品编码:{{item.p_code}}</view>
+							</view>
+							<view class="list-details-price">
+								<template v-if="priceLoading">
+									<view class="list-price-loding">正在获取价格...</view>
+								</template>
+								<template v-else>
+									<view class="list-shop">
+										<view class="list-price">
+											<text class="price-larger" :class="PromotionsFormat(item.promotions) ? 'none' : ''">
+												¥{{ (PromotionsFormat(item.promotions) ? item.originalPrice : item.price) | NumFormat }}
+											</text>
+										</view>
+									</view>
+									<button class="add-cart-btn" @click.stop="operationHanld(item)">数量</button>
+								</template>
+							</view>
+							<view class="list-details-price">
+								<view class="floor-item-act" v-if="item.actStatus==1">
+									<view class="floor-tags" v-if="PromotionsFormat(item.promotions)">
+										{{item.promotions.name}}<text>:¥{{ 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>
+							</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>
+			<!-- 组合商品 -->
+			<view :class="tabIndex"  v-if="tabIndex === 1">
+				<scroll-view :style="{'height':scrollHeight+'px',paddingTop:searchStatus?'112rpx':''}" @scrolltolower="scrolltolower(tabIndex)" scroll-y>
+					<view class="all-zuhe-list" v-for="(item,index) in combinationProduct" :key="index" :id="item.id">
+						<view class="zuhe_title" :class="index%2==0 ? 'active' : ''">{{item.name}}</view>
+						<view v-for="(pros,proIndex) in item.combinationProductList" :class="index%2==0 ? 'stylecontent' : ''" :key="proIndex" :id="pros.productID" class="zuhe-list-content commodity-list" >
+							<view class="list-details-info" >
+								<text class="list-details-title zuhe_list_text">商品编码:{{pros.productCode}}</text>
+								<text class="list-details-specs zuhe_list_text" @click.stop="navToDetailPage(pros.productID)">{{pros.name}}</text>
+								<view class="list-details-price zuhe_list_price">
+									<view class="list-shop com">
+										<view class="list-price zuhe_list_price" >
+											<view class="zuhe_price-larger zuhe_list_text" >
+												<view class="list-price-none" v-if="pros.repurchasePriceState">
+													<text class="price-none">价格:¥{{pros.discountPrice}}</text>
+													<text class="iconfont icon-wenhao" @click.stop="repurchModel"></text>
+												</view>
+												<view class="price-larger">价格:¥{{ pros.retailPrice | NumFormat }}</view>
+											</view>
+											<view class="zuhe_price-larger zuhe_list_text" >
+												<view class="floor-item-act" v-if="pros.actStatus==1">
+													<view class="floor-tags" v-if="PromotionsFormat(pros.promotions)">
+														{{pros.promotions.name}}<text>:¥{{ pros.price | NumFormat }}</text>
+													</view>
+													<view class="floor-tags" v-else>{{pros.promotions.name}}</view>	
+												</view>
+												<view class="floor-item-act" v-if="pros.actStatus ==0  &&  pros.ladderPriceFlag==1">
+													<view class="floor-tags">阶梯价格</view>	
+												</view>
+												<view class="count">
+													<view class="number-box">
+														<view  class="iconfont icon-jianhao"  @click.stop="changeCountSub(item,pros)"></view>
+														<input class="btn-input" type="number" maxlength='6' v-model="pros.initProductNum" @blur="changeNnmber($event,item,pros)">
+														<view  class="iconfont icon-jiahao"   @click.stop="changeCountAdd(item,pros)"></view>
+													</view>
+												</view>	
+											</view>
+											<view class="list-price-all" :style="{'overflow':'hidden'}">
+												<view class="price-two zuhe_list_text" >总价:<text class="zuhe_list_zj">¥ {{ pros.totalPrice | NumFormat }}</text></view>
+											</view>
+										</view>
+									</view>
+								</view>
+							</view>
+						</view>
+						<view class="foot_conten" >
+							<view class="zuhe_foot-box">
+								<view class="">
+									<text>种类:{{item.productKind}}</text>
+									<text >总数:{{item.productTotalNum}}</text>
+								</view>
+								<text>总额:<text class="foot_text">{{ item.productTotalAmount | NumFormat }}</text></text>
+							</view>
+							<button type="default" class="buycart" @click.stop="operationHanld(item)">加入购物车</button>
+						</view>
+					</view>
+					<view v-if="showLoading && combinationProduct.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>
+		</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 { mapState,mapMutations } from 'vuex';
+	export default{
+		name:'productList',
+		components:{
+			listSkeleton,
+			modalLayer,
+			uniStars,
+			cmDrag
+		},
+		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:{
+			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 - 1;
+			},
+			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 {
+		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{
+		height: 80rpx;
+		width: 100%;
+		padding: 24rpx;
+		background: #FFFFFF;
+		display: flex;
+		align-items: center;
+		margin-bottom: 20rpx;
+		position: fixed;
+		top: 0;
+		left: 0;
+		z-index: 19;
+		.search-from{
+			width: 420rpx;
+			height: 80rpx;
+			background: #F7F7F7;
+			border-radius: 40rpx;
+			float: left;
+			position: relative;
+			.input{
+				width: 340rpx;
+				height: 80rpx;
+				float: left;
+				line-height: 80rpx;
+				color: $text-color;
+				font-size: $font-size-24;
+			}
+			.icon-iconfonticonfontsousuo1{
+				width: 64rpx;
+				height: 80rpx;
+				line-height: 80rpx;
+				text-align: center;
+				display: block;
+				font-size: $font-size-38;
+				float: left;
+				color: #999999;
+			}
+			.icon-shanchu1{
+				font-size: $font-size-32;
+				color: #999999;
+				position: absolute;
+				width: 120rpx;
+				height: 80rpx;
+				line-height: 80rpx;
+				top: 0;
+				right: 0;
+				text-align: center;
+				z-index: 10;
+			}
+		}
+		.search-btn{
+			// width: 120rpx;
+			line-height: 64rpx;
+			text-align: center;
+			font-size: $font-size-28;
+			color: $color-system;
+			float: left;
+			background: #FFFFFF;
+			margin-left: 10rpx;
+		}
+	}
+	.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-specs {
+			width: 100%;
+			display: inline-block;
+			margin: 5rpx 0;
+			color: #666666;
+		}
+		.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 16rpx;
+				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>

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

@@ -0,0 +1,398 @@
+<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>
+		<view class="product-container" v-if="!isShowEmpty">
+			<scroll-view :style="{'height':scrollHeight+'px'}" @scrolltolower="scrolltolower" scroll-y v-if="productList.length > 0">
+				<view v-for="(item,index) in productList" :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 !=null ? item.unit : ''}}</text>
+						<text class="list-details-miniQuantity">起订量:{{ item.ladderPriceFlag == '1' ? item.maxBuyNumber : item.minBuyNumber}}</text>
+						<view class="list-details-price" v-if="item.price1TextFlag == 1">
+							<view class="list-none"><view class="price-small">未公开价格</view></view>
+						</view>
+						<view class="list-details-price" v-else>
+							<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.promotions) ? 'none' : ''">
+										¥{{ (PromotionsFormat(item.promotions) ? item.price1 : item.retailPrice) | NumFormat }}
+									</text>
+								</view>
+							</view>
+							<button class="add-cart-btn" @click.stop="operationHanld(item)">数量</button>
+						</view>
+						<view class="list-details-price" v-if="item.actStatus==1">
+							<view class="floor-item-act">
+								<view class="floor-tags" v-if="PromotionsFormat(item.promotions)">
+									{{item.promotions.name}}<text v-if="item.price1TextFlag != 1">:¥{{ item.retailPrice | 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>
+						</view>	
+					</view>
+				</view>
+				<button class="show-more-btn" v-if="showRegularBtn" @click="getListFromServer(true)">查看更多</button>
+				<view v-if="showLoading && productList.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>
+		<view class="empty-container" v-else>
+			<image class="empty-container-image" src="https://img.caimei365.com/group1/M00/03/71/Cmis2F3wna6AWdWzAAGlgAP0das422.png" mode="aspectFit"></image>
+			<text class="error-text">您还没有购买过任何商品哟~</text>
+			<button class="submit-btn toIndexPage" @click="toIndexPage">去逛逛</button>
+		</view>
+		<!-- 可拖动悬浮按钮 -->
+		<cm-drag v-if="!isShowEmpty"
+				 :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 { mapState,mapMutations } from 'vuex';
+	export default{
+		name:'productList',
+		components:{
+			listSkeleton,
+			modalLayer,
+			uniStars,
+			cmDrag
+		},
+		props: {
+			emptyText: {
+				type: String
+			},
+		},
+		data(){
+			return{
+				isModallayer:false,
+				windowHeight: '',
+				showSkeleton: true,
+				isShowEmpty: false,
+				userID: '',
+				scrollHeight: '',
+				productList: [],
+				showLoading: false,
+				loadingNow: true,
+				loadingText: '上拉加载更多',
+				pageSize: 10,
+				pageNum: 1,
+				hasNextPage: false,
+				pullFlag: true,
+				fromRegularPurchasePage: false,
+				cartQuantity: 0,
+				showRegularBtn: false,
+				isPrecedence:false
+			}
+		},
+		created() {
+			this.setScrollHeight();		
+			this.$api.getStorage().then((resolve) =>{
+				this.userID = resolve.userID
+				this.getProductAgainInfo()
+			})
+		},
+		filters: {
+			NumFormat:function(text) {//处理金额
+				return Number(text).toFixed(2);
+			},
+		},
+		computed: {
+			...mapState(['hasLogin','userInfo','identity'])
+		},
+		methods:{
+			scrolltolower() {
+				if(this.hasNextPage && this.pullFlag) {
+					this.getProductAgainInfo(true);
+				}
+			},
+			setScrollHeight() {
+				const {windowHeight, pixelRatio} = wx.getSystemInfoSync();
+				this.windowHeight = windowHeight - 1;
+				this.scrollHeight = windowHeight - 1;
+			},
+			getProductAgainInfo(loadMore) {
+				this.showLoading = true;
+				this.loadingNow = true;
+				this.loadingText = '加载中';
+				this.isShowEmpty = false;				
+				if(loadMore) {this.pageNum += 1;}
+				let params = {userId:this.userID,identity:this.identity,pageNum:this.pageNum,pageSize:this.pageSize}
+				this.ProductService.GetRepeatBuyAgainProductList(params).then(response =>{
+					this.isShowWrapper = true
+					this.cartQuantity = response.data.cartQuantity
+					const responseData = response.data.pageDate;
+					if(responseData.results && responseData.results.length > 0){
+						this.hasNextPage = responseData.hasNextPage;
+						this.isShowEmpty = false;
+						if(loadMore) {
+							this.productList = [...this.productList,...responseData.results];
+						} else {
+							this.productList = [...responseData.results];
+							this.showSkeleton = false;
+						}
+						//价格显示处理
+						let isActFlg,newProductList=[];
+						this.productList.map((item, index)=> {
+							if(item.actStatus == 1){
+								isActFlg = true
+							}else if(item.actStatus == 1 && item.ladderPriceFlag == '1'){
+								isActFlg = true
+							}else{
+								isActFlg = false
+							}
+							newProductList.push(Object.assign({},item,{isShowActFlg:isActFlg}))
+						})
+						this.productList = newProductList
+						// 防上拉暴滑
+						this.pullFlag = false;
+						setTimeout(()=>{
+							this.pullFlag = true;
+						},500)
+						// 底部提示文案
+						if(this.hasNextPage) {
+							this.loadingText = '上拉加载更多';
+						} else {
+							this.showLoading = true;
+							this.loadingNow = false;
+						}
+					} else {
+						if(!loadMore) {
+							this.isShowEmpty = true;
+						}
+					}
+				}).catch(response =>{
+					this.$util.msg(response.msg,2000);
+				})
+			},
+			operationHanld(prop){
+				this.$emit('operationConfim',prop)
+			},
+			navToDetailPage(id) {
+				this.isModallayer = true;
+				this.$api.navigateTo(`/pages/goods/product?id=${id}`);
+				this.isModallayer = false;
+			},
+			toIndexPage() {
+				uni.switchTab({
+					url: '/pages/tabBar/home/index' 
+				})
+			},
+			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/goods/cart')
+			},
+			btnTouchstart() {
+				// console.log('btnTouchstart');
+			},
+			btnTouchend() {
+				// console.log('btnTouchend');
+			}
+		}
+	}
+</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: 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%;
+			display: inline-block;
+			margin-top: 8rpx;
+			color: #999999;
+		}
+		.list-details-miniQuantity {
+			width: 100%;
+			display: inline-block;
+			margin-top: 7rpx;
+		}
+	}
+	.list-details-price {
+		width: 100%;
+		line-height: 54rpx;
+		float: left;
+		.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 16rpx;
+				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;
+			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;
+					&.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;
+		}
+	}
+</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>

+ 828 - 0
components/cm-module/listTemplate/secondHand.vue

@@ -0,0 +1,828 @@
+<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="good-search-top">
+				<view class="search-from name">
+					<text class="iconfont icon-iconfonticonfontsousuo1"></text>
+						<input class="input"  
+							   type="text" 
+							   :focus="isFocus"
+							   confirm-type="search" 
+							   v-model="searchKeyword" 
+							   placeholder="请输入商品关键词" 
+							   @input="onShowClose" 
+							   @confirm="searchOpertor"
+							   maxlength="20"/>
+					<text class="iconfont icon-shanchu1" v-if="isShowClose" @click="delInputText"></text>
+				</view>
+				<view class="search-btn">
+					<button class="search-btn" type="default" @click.stop="searchOpertor">搜索</button>
+				</view>
+			</view>
+			<view class="good-search-tabs">
+				<view class="good-search-tabs-t">
+					<view class="tabs-item" 
+						  :class="{ active: tabIndex === 1 }" 
+						  @click="changeTabsFirst(1)">{{tabIndexSelectText}}
+						  <text class="iconfont icon-xiangxia1" :class="isTabIndexSelect ? 'reto': '' "></text>
+					</view>
+					<view class="tabs-item" :class="{ active: tabIndex === 2 }" @click="changeTabs(2)">临期产品</view>
+					<view class="tabs-item" :class="{ active: tabIndex === 3 }" @click="changeTabs(3)">其他</view>
+				</view>
+				<view class="tabs-item-first clearfix" v-if="isTabIndexSelect">
+					<view class="tabs-item" 
+						  v-for="(item,index) in screenTabs" 
+						  :key="index" 
+						  :class="{ active: screenTab === index }" 
+						  @click="changeScreenTabs(item,index)"
+					>
+						  {{item}}
+						  <text class="iconfont icon-gou" v-if="screenTab === index"></text>
+					</view>
+				</view>	
+			</view>
+		</view>
+		<!-- 顶部tab遮罩层 -->
+		<view class="popup-tabs" v-if="isTabIndexSelect" @touchmove.stop.prevent="discard" @tap="hideTabIndexSelect">
+			<view class="mask"></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 >
+			<view :class="tabIndex"  :style="{paddingTop:searchStatus?'160rpx':''}">
+				<scroll-view :style="{'height':scrollHeight+'px'}" @scrolltolower="scrolltolower" scroll-y v-if="listData.length > 0">
+					<view v-for="(item,index) in listData" :key="index" :id="item.id" :productid="item.productID" 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">
+							<view class="list-details-title"> 
+								<view class="tabs" v-if="item.newAdded == 1">
+									<image mode='widthFix' src="../../../static/temp/icon-new@2x.png"  class="list-tags"></image>
+								</view>
+								<view class="name" :style="{paddingLeft:item.newAdded == 1 ? '38rpx' :'0rpx'}">{{isInterceptHtmlFn(item.name)}}</text></view>
+							</view>	
+							<view class="list-details-price">
+								<view class="list-shop">
+									<view class="list-price">
+										<text class="price-larger">¥{{toFixedFn(item.price1)}}</text>
+									</view>
+								</view>
+								<button class="add-cart-btn" @click.stop="operationHanld(item)">数量</button>
+							</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>
+		</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 { mapState,mapMutations } from 'vuex';
+	export default{
+		name:'productList',
+		components:{
+			listSkeleton,
+			modalLayer,
+			uniStars,
+			cmDrag
+		},
+		props: {
+			searchStatus:{
+				type:Boolean,
+				default:false
+			}
+		},
+		data(){
+			return{
+				isShowClose:false,
+				isModallayer:false,
+				windowHeight: '',
+				showSkeleton: false,
+				isShowEmpty: false,
+				isShowEmptyText: '搜索相关商品',
+				clubUserId: '',
+				searchKeyword:'',//搜索关键字
+				secondHandType:1,//二手商品分类
+				instrumentType:'',//二手仪器分类
+				isFocus:false,
+				scrollHeight: '',
+				listData: [],
+				showLoading: false,
+				loadingNow: true,
+				loadingText: '上拉加载更多',
+				pageSize: 10,
+				pageNum: 1,
+				totalPage:1,
+				hasNextPage: false,
+				pullFlag: true,
+				cartQuantity: 0,
+				showRegularBtn: false,
+				isPrecedence:false,
+				ladderPriceList:[],//是否 阶梯,
+				goodsList:[],
+				isShow: false,
+				screenTabs:['二手仪器','轻光电','重光电','耗材配件'],
+				tabIndex:1,
+				screenTab:0,
+				isTabIndexSelect:false,
+				tabIndexSelectText:'二手仪器'
+			}
+		},
+		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
+		},
+		computed: {
+			...mapState(['hasLogin','userInfo'])
+		},
+		methods:{
+			scrolltolower() {
+				if(this.hasNextPage && this.pullFlag) {
+					this.getProductAgainInfo(true);
+				}
+			},
+			setScrollHeight() {
+				const {windowHeight, pixelRatio} = wx.getSystemInfoSync();
+				this.windowHeight = windowHeight - 1;
+				this.scrollHeight = windowHeight - 1;
+			},
+			getProductAgainInfo(loadMore) {//搜索商品
+				this.showLoading = true;
+				this.loadingNow = true;
+				this.loadingText = '加载中';
+				this.isShowEmpty = false;				
+				if(loadMore) {this.pageNum += 1;}
+				let params = {
+						secondHandType:this.secondHandType,
+						instrumentType:this.instrumentType,
+						searchKeyword:this.searchKeyword,
+						pageNum:this.pageNum,
+						pageSize:this.pageSize
+				}
+				this.SellerService.GetOrderSecondHandProductList(params).then(response =>{
+					this.isShowWrapper = true
+					const resData = response.data
+					const results = resData.results
+					if(results && results.length > 0){
+						this.hasNextPage = resData.hasNextPage;
+						this.showEmpty = false;
+						if(loadMore) {
+							this.listData = [...this.listData,...results];
+						} else {
+							this.listData = [...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 {
+						if(!loadMore) {
+							this.isShowEmpty = true;
+							this.isShowEmptyText ='暂无相关商品'
+						}
+					}
+				}).catch(error =>{
+					this.$util.msg(error.msg,2000);
+				})
+			},
+			searchOpertor(){//搜索商品
+				if(this.searchKeyword == ''){
+					// this.$util.msg('请输入商品关键词',2000)
+					this.secondHandType = 1
+					this.instrumentType=''
+					this.getProductAgainInfo();
+				}else{
+					this.pageNum = 1
+					this.showSkeleton = true;
+					this.getProductAgainInfo();
+					this.isFocus = false
+				}
+			},
+			operationHanld(prop){
+				this.$emit('operationConfim',prop);
+			},
+			navToDetailPage(id) {
+				this.isModallayer = true;
+				this.$api.navigateTo(`/second/pages/product/product-details?id=${id}`);
+				this.isModallayer = false;
+			},
+			onShowClose () {//输入框失去焦点时触发
+				if(this.searchKeyword != ''){
+					this.isShowClose = true
+				}else{					
+					this.isShowClose = false
+				}
+			},
+			delInputText(){//清除输入框内容
+				this.searchKeyword = '';
+				this.listData =[];
+				this.isFocus = true
+				this.isShowClose = false;
+				this.loadingNow = false;
+				this.isShowEmpty = true;
+				this.isShowEmptyText ='暂无相关商品'
+				this.secondHandType = 1;
+				this.instrumentType='';
+				this.getProductAgainInfo();
+			},
+			isInterceptHtmlFn(text){
+				let name = this.$reg.interceptHtmlFn(text)
+				return name
+			},
+			changeTabs(index){
+				this.tabIndex = index
+				this.secondHandType = index
+				this.isTabIndexSelect = false
+				if(this.tabIndex == 2 || this.tabIndex ==3){
+					this.instrumentType = ''
+					this.getProductAgainInfo()
+				}
+			},
+			changeTabsFirst(index){
+				this.tabIndex = index
+				this.secondHandType = index
+				this.isTabIndexSelect = !this.isTabIndexSelect
+			},
+			changeScreenTabs(item,index){
+				this.screenTab = index
+				this.isTabIndexSelect = false
+				this.tabIndexSelectText = item
+				this.instrumentType = index
+				if(index==0){
+					this.instrumentType=''
+				}
+				this.getProductAgainInfo();
+			},
+			toFixedFn(text){//处理小数点后两位数
+				return Number(text).toFixed(2);
+			},
+			hideTabIndexSelect(){
+				this.isTabIndexSelect = false
+			},
+			discard(){
+				//丢弃
+			},
+			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: 28rpx;
+		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 {
+		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{
+		height: auto;
+		width: 702rpx;
+		padding: 10rpx 24rpx;
+		background: #FFFFFF;
+		display: flex;
+		align-items: center;
+		margin-bottom: 20rpx;
+		position: fixed;
+		flex-direction: column;
+		top: 0;
+		left: 0;
+		z-index: 999;
+		.good-search-top{
+			width: 702rpx;
+			height: 70rpx;
+			flex: 1;
+			.search-from{
+				width: 582rpx;
+				height: 70rpx;
+				background: #F7F7F7;
+				border-radius: 40rpx;
+				float: left;
+				position: relative;
+				.input{
+					width: 340rpx;
+					height: 70rpx;
+					float: left;
+					line-height: 70rpx;
+					color: $text-color;
+					font-size: $font-size-24;
+				}
+				.icon-iconfonticonfontsousuo1{
+					width: 64rpx;
+					height: 70rpx;
+					line-height: 70rpx;
+					text-align: center;
+					display: block;
+					font-size: $font-size-38;
+					float: left;
+					color: #999999;
+				}
+				.icon-shanchu1{
+					font-size: $font-size-32;
+					color: #999999;
+					position: absolute;
+					width: 120rpx;
+					height: 70rpx;
+					line-height: 70rpx;
+					top: 0;
+					right: 0;
+					text-align: center;
+					z-index: 10;
+				}
+			}
+			.search-btn{
+				// width: 120rpx;
+				line-height: 70rpx;
+				text-align: center;
+				font-size: $font-size-28;
+				color: $color-system;
+				float: left;
+				background: #FFFFFF;
+				margin-left: 10rpx;
+			}
+		}
+		.good-search-tabs{
+			width: 702rpx;
+			height: auto;
+			flex: 1;
+			position: relative;
+			.good-search-tabs-t{
+				height: 64rpx;
+				width: 702rpx;
+				padding: 10rpx 0;
+				display: flex;
+				justify-content: center;
+				justify-items: center;
+				.tabs-item{
+					flex: 1;
+					height: 64rpx;
+					border-radius: 10rpx;
+					background: #F7F7F7;
+					margin-right: 22rpx;
+					line-height: 64rpx;
+					font-size: $font-size-28;
+					color: #333333;
+					text-align: center;
+					position: relative;
+					.icon-xiangxia1{
+						width: 64rpx;
+						height: 64rpx;
+						line-height: 64rpx;
+						text-align: center;
+						color: #333333;
+						font-size: $font-size-24;
+						transform:rotate(0deg);
+						&.reto{
+							transform:rotate(180deg);
+						}
+					}
+					&.active{
+						color: $color-system;
+						.icon-xiangxia1{
+							color: $color-system;
+						}
+					}
+					&:last-child{
+						margin-right: 0;
+					}
+				}
+			}
+			.tabs-item-first{
+				position: absolute;
+				bottom: -308rpx;
+				left: -24rpx;
+				height: auto;
+				width: 702rpx;
+				background-color: #FFF;
+				z-index: 999;
+				padding: 0 24rpx 10rpx 24rpx;
+				border-top: 1px solid #F7F7F7;
+				.tabs-item{
+					width: 100%;
+					height: 70rpx;
+					line-height: 70rpx;
+					font-size: $font-size-28;
+					color: #333333;
+					text-align: left;
+					float: left;
+					position: relative;
+					border-bottom: 1px solid #F7F7F7;
+					&:last-child{
+						border-bottom: none;
+					}
+					.icon-gou{
+						display: block;
+						width: 70rpx;
+						height: 70rpx;
+						line-height: 70rpx;
+						text-align: center;
+						color: #333333;
+						font-size: $font-size-40;
+						position: absolute;
+						right: 0;
+						top: 0;
+					}
+					&.active{
+						color: $color-system;
+						.icon-gou{
+							color: $color-system;
+						}
+					}
+				}
+			}
+		}
+	}
+	
+	.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;
+		}
+	}		
+	.list-details-info {
+		width: 100%;
+		flex-direction: column;
+		font-size: 26rpx;
+		position: relative;
+		.list-details-title {
+			position: relative;
+			.tabs{
+				width: 38rpx;
+				height: 38rpx;
+				position: absolute;
+				top: 0;
+				left: 0;
+				image{
+					width: 38rpx;
+					height: 38rpx;
+					display: block;
+				}
+			}
+			.name{
+				width: 100%;
+				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%;
+			display: inline-block;
+			margin-top: 8rpx;
+			color: #666666;
+		}
+		.list-details-miniQuantity {
+			width: 100%; 
+			display: inline-block;
+			margin-top: 7rpx;
+		}
+	}
+	.list-details-price {
+		width: 100%;
+		display: flex;
+		flex-direction: row;
+		justify-content: space-between;		
+		margin-top: 80rpx;
+		.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: 15rpx;
+			.price-small{
+				font-size:$font-size-24;
+				line-height: 40rpx;
+				color: #FF2A2A;
+			}
+		}
+		.list-price-loding{
+			flex: 6;
+			font-size:$font-size-24;
+			line-height: 64rpx;
+			color: #FF2A2A;
+		}
+		.list-shop{
+			width: 100%;
+			height: auto;
+			flex: 6;
+			overflow: hidden;
+			.list-price {
+				// width: 100%;
+				color: #FF2A2A;
+				float: left;
+				line-height:36rpx ;
+				align-items: center;
+				justify-content: center;
+				.price-larger {
+					margin-top: 20rpx;
+					font-size: $font-size-30;
+					display: inline-block;
+					margin-right: 20rpx;
+				}
+				.zuhe_price-larger{
+					color: #666666;
+					// float: left;
+					// margin-right: 85rpx;
+				}
+				.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: 400rpx;
+				overflow: hidden;
+				margin-top: 10rpx;
+			}
+			.count{
+				margin-top: 50rpx;
+				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: 156rpx;
+			height: 64rpx;
+			line-height: 64rpx;
+			border-radius: 32rpx;
+			color: #333333;
+			font-size: 26rpx;
+			margin-right: 0;
+			// background:linear-gradient(135deg,rgba(242,143,49,1) 0%,rgba(225,86,22,1) 100%);
+			background: #FFFFFF;
+			border: 2rpx solid #C9C9C9;
+		}
+		.zuhe_btn{
+			float: right;
+		}
+	}
+	.popup-tabs{
+		position: fixed;
+		top: 0;
+		width: 100%;
+		height: 100%;
+		z-index: 888;
+		.mask{
+			position: fixed;
+			top: 0;
+			width: 100%;
+			height: 100%;
+			z-index: 21;
+			background-color: rgba(0, 0, 0, 0.6);
+		}
+	}
+</style>

+ 135 - 0
components/cm-module/modelAlert/cancelAlert.vue

@@ -0,0 +1,135 @@
+<template name="alert">
+	<view class="alert spec">
+		<view class="model-warp">
+			<view class="model-alert">
+				<view class="model-content">
+					<view class="sm"><text>{{cenceAlertText}}</text></view>
+				</view>
+				<view class="alert-btn">
+					<view class="btn btn-cancel" @click="hideConfirm">放弃</view>
+					<view class="btn btn-confirm" @click="btnConfirm()">确定取消</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		name:'alert',
+		props:['isCenceModal','cenceAlertText'],
+		data() {
+			return{
+
+			}
+		},
+		created() {
+			
+		},
+		onLoad(){
+			
+		},
+		methods:{
+			hideConfirm(){
+				this.$parent.isCenceModal = false
+			},
+			//点击事件
+			btnConfirm(){
+				this.$emit('cenceConfirm')
+			}
+		},
+		onShow(){
+	
+		}
+	}
+</script>
+
+<style lang="scss">
+	/*弹窗*/
+	 .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: 316rpx;
+			position: absolute;
+			background: $bg-color;
+			left: 0;
+			right: 0;
+			bottom: 0;
+			top: 0;
+			margin: auto;
+			.alert-content{
+				width: 466rpx;
+				height: 152rpx;
+				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: 100%;
+				height: 88rpx;
+				display: flex;
+				.btn{
+					flex: 1;
+					line-height: 88rpx;
+					font-size: $font-size-28;
+					text-align: center;
+					color: #FFFFFF;
+					border-radius: 0;
+					padding: 0;
+					&.btn-cancel{
+						background: $btn-cancel;
+					}
+					&.btn-confirm{
+						background: $btn-confirm;
+					}
+				}
+			}
+		}
+	}
+</style>

+ 125 - 0
components/cm-module/modelAlert/errorAlert.vue

@@ -0,0 +1,125 @@
+<template name="alert">
+	<view class="alert spec" :class="specClass">
+		<!-- 运费弹窗说明 -->
+		<view class="freight-alert"  @tap="hideFreight">
+			<view class="content">
+				<view class="title">
+					<text>提示</text>
+				</view>
+				<view class="text-content">
+					<view class="text">
+						<text>系统检测到您的微信已绑定供应商账户,不能继续登录</text>
+					</view>
+					<view class="exit-btn">
+						<navigator open-type="exit" target="miniProgram" class="btn">退出</navigator>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		name:'alert',
+		props:{},
+		data() {
+			return{
+				
+			}
+		},
+		created() {
+			
+		},
+		onLoad(){
+			
+		},
+		methods:{
+			hideFreight(){
+				this.$parent.isErrorAlert = false
+			},
+		},
+		onShow(){
+	
+		}
+	}
+</script>
+
+<style lang="scss">
+	/*弹窗*/
+	.model-warp.none{
+		display: none;
+	}
+	.model-warp.show{
+		display: block;
+	}
+	.freight-alert{
+		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;
+		}
+		.content{
+			width: 530rpx;
+			height: 300rpx;
+			position: absolute;
+			background: $bg-color;
+			left: 0;
+			right: 0;
+			bottom: 0;
+			top: 0;
+			margin: auto;
+			padding: 20rpx 25rpx;
+			border-radius: 12rpx;
+			.title{
+				width: 100%;
+				height: 68rpx;
+				line-height: 68rpx;
+				font-size: $font-size-30;
+				color: $text-color;
+				text-align: center;
+				margin-bottom: 20rpx;
+				position: relative;
+			}
+			.text-content{
+				width: 70%;
+				height: auto;
+				margin: 0 auto;
+				.text{
+					line-height: 44rpx;
+					font-size: $font-size-28;
+					color:#666666;
+					text-align: center;
+				}
+				.exit-btn{
+					width: 100%;
+					height: 70rpx;
+					display: flex;
+					align-items: center;
+					flex-direction:column;
+					margin-top: 30rpx;
+					.btn{
+						width: 200rpx;
+						line-height: 70rpx;
+						font-size: $font-size-28;
+						text-align: center;
+						color: #FFFFFF;
+						border-radius: 35rpx;
+						padding: 0;
+						background: $btn-confirm;
+					}
+				}
+			}
+		}
+	}
+	
+</style>

+ 140 - 0
components/cm-module/modelAlert/freightAlert.vue

@@ -0,0 +1,140 @@
+<template name="alert">
+	<view class="alert spec" :class="specClass">
+		<!-- 运费弹窗说明 -->
+		<view class="freight-alert"  @tap="hideFreight">
+			<view class="content">
+				<view class="title">
+					<text>运费规则</text>
+					<text class="iconfont icon-iconfontguanbi" @click.stop="hideFreight"></text>
+				</view>
+				<view class="text-content">
+					<view class="text-h1">一、除含有仪器类、家具类等指定商品的订单,运费规则如下:</view>
+					<view class="text">
+						<text>1、首单,全国包邮(注:如果首单中含有不包邮的指定商品,则首单只能"到付");</text>
+						<text>2、订单商品总额满1000元,全国包邮;</text>
+						<text>3、订单商品总额不足1000元,深圳市内运费10元,广东省内深圳市外运费15元,其它地方运费到付;</text>
+						<text>4、地推送货上门无需运费(注:下单可选择运费是否到付)。</text>
+					</view>
+					<view class="text-h1">二、含有仪器类、家具类等指定商品的订单,运费到付。</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		name:'alert',
+		props:{},
+		data() {
+			return{
+				
+			}
+		},
+		created() {
+			
+		},
+		onLoad(){
+			
+		},
+		methods:{
+			hideFreight(){
+				this.$parent.isfreightTip = false
+			},
+		},
+		onShow(){
+	
+		}
+	}
+</script>
+
+<style lang="scss">
+	/*弹窗*/
+	.model-warp.none{
+		display: none;
+	}
+	.model-warp.show{
+		display: block;
+	}
+	.freight-alert{
+		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;
+		}
+		.content{
+			width: 530rpx;
+			height: 710rpx;
+			position: absolute;
+			background: $bg-color;
+			left: 0;
+			right: 0;
+			bottom: 0;
+			top: 0;
+			margin: auto;
+			padding: 20rpx 25rpx;
+			border-radius: 12rpx;
+			.title{
+				width: 100%;
+				height: 68rpx;
+				line-height: 68rpx;
+				font-size: $font-size-28;
+				color: $text-color;
+				text-align: center;
+				margin-bottom: 32rpx;
+				position: relative;
+				.icon-iconfontguanbi{
+					width: 68rpx;
+					height: 68rpx;
+					text-align: center;
+					line-height: 68rpx;
+					position: absolute;
+					right: 0;
+					top: 0;
+					font-size: $font-size-36;
+					color: #999999;
+				}
+			}
+			.text-content{
+				width: 100%;
+				height: auto;
+				.text{
+					padding: 40rpx 0;
+					line-height: 44rpx;
+					font-size: $font-size-26;
+					color:#666666;
+					text-align: justify;
+				}
+				.text-h1{
+					line-height: 44rpx;
+					font-size: $font-size-28;
+					color: $text-color;
+					text-align: justify;
+				}
+			}
+			.btn{
+				width: 100%;
+				height: 88rpx;
+				float: left;
+				background: $btn-confirm;
+				line-height: 88rpx;
+				font-size: $font-size-28;
+				text-align: center;
+				color: #FFFFFF;
+				border-radius: 0;
+				padding: 0;
+				margin-top: 2rpx;
+			}
+		}
+	}
+	
+</style>

+ 135 - 0
components/cm-module/modelAlert/modelAlert.vue

@@ -0,0 +1,135 @@
+<template name="alert">
+	<view class="alert spec" :class="specClass">
+		<view class="model-warp">
+			<view class="model-alert">
+				<view class="model-content">
+					<view class="sm"><text>{{alertText}}</text></view>
+				</view>
+				<view class="alert-btn">
+					<view class="btn btn-cancel" @click="hideConfirm">取消</view>
+					<view class="btn btn-confirm" @click="btnConfirm(alertType)">确定</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		name:'alert',
+		props:['isShowDelModal','alertText','alertType'],
+		data() {
+			return{
+
+			}
+		},
+		created() {
+			
+		},
+		onLoad(){
+			
+		},
+		methods:{
+			hideConfirm(){
+				this.$parent.isShowDelModal = false
+			},
+			//点击事件
+			btnConfirm(type){
+				this.$emit('btnConfirm',type)
+			}
+		},
+		onShow(){
+	
+		}
+	}
+</script>
+
+<style lang="scss">
+	/*弹窗*/
+	 .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: 316rpx;
+			position: absolute;
+			background: $bg-color;
+			left: 0;
+			right: 0;
+			bottom: 0;
+			top: 0;
+			margin: auto;
+			.alert-content{
+				width: 466rpx;
+				height: 152rpx;
+				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: 100%;
+				height: 88rpx;
+				display: flex;
+				.btn{
+					flex: 1;
+					line-height: 88rpx;
+					font-size: $font-size-28;
+					text-align: center;
+					color: #FFFFFF;
+					border-radius: 0;
+					padding: 0;
+					&.btn-cancel{
+						background: $btn-cancel;
+					}
+					&.btn-confirm{
+						background: $btn-confirm;
+					}
+				}
+			}
+		}
+	}
+</style>

+ 148 - 0
components/cm-module/modelAlert/order-alert.vue

@@ -0,0 +1,148 @@
+<template name="sharealert">
+	<view class="alert spec" >
+		<view class="model-warp" @click.stop="hideConfirm">
+			<view class="content" v-if="modelType == 1">
+				<view class="content-title"></view>
+				<view class="text-content clearfix">
+					<view class="text">
+						<text>您有采美余额¥{{payModelData.ableUserMoney}}暂未使用,是否需要抵扣订单?</text>
+						<text>抵扣后您只需再支付¥{{payModelData.pendingPayments}}</text></view>
+					<view class="alert-btn" @click="cancelConfirm(dataInfo)">不抵扣,继续付款</view>
+					<view class="alert-btn" @click="paymentConfirm(1,dataInfo)">抵扣,继续付款</view>
+				</view>				
+			</view>
+			<view class="content" v-if="modelType == 2">
+				<view class="content-title"></view>
+				<view class="text-content clearfix">
+					<view class="text">您有采美余额¥{{payModelData.ableUserMoney}}暂未使用,是否需要抵扣订单?抵扣后订单支付完成</view>
+					<view class="alert-btn" @click="cancelConfirm(dataInfo)">不抵扣,继续付款</view>
+					<view class="alert-btn" @click="paymentConfirm(2,dataInfo)">抵扣</view>
+				</view>				
+			</view>
+			<view class="content" v-if="modelType == 3">
+				<view class="content-title"></view>
+				<view class="text-content clearfix">
+					<view class="text">目前机构余额剩余¥{{payModelData.ableUserMoney.toFixed(2)}}是否抵扣订单?</view>
+					<view class="alert-btn" @click="hideConfirm">取消,不抵扣</view>
+					<view class="alert-btn" @click="paymentConfirm(3,dataInfo)">抵扣</view>
+				</view>				
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		name:'sharealert',
+		props:{
+			modelType:{
+				type:Number,
+				default:3
+			},
+			payModelData:{
+				type:Object
+			}
+		},
+		data() {
+			return{
+				dataInfo:{}
+			}
+		},
+		created() {
+			this.infoData(this.payModelData)
+		},
+		methods:{
+			infoData(el){
+				this.dataInfo = el
+			},
+			hideConfirm(){
+				this.$parent.isPayModel = false
+			},
+			cancelConfirm(data){
+				this.$emit('cancelConfirm',data)
+			},
+			paymentConfirm(type,data){
+				this.$parent.isPayModel = false
+				let _data = {type:type,order:data}
+				this.$emit('paymentConfirm',_data)
+			},
+			btnConfirm(data){//点击事件
+				this.$emit('btnConfirm',data)
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	/*弹窗*/
+	 .model-warp.none{
+		 display: none;
+	 }
+	 .model-warp.show{
+		 display: block;
+	 }
+	 .model-warp{
+		width: 100%;
+		height: 100%;
+		background: rgba(0,0,0,0.3);
+		position: fixed;
+		top: 0;
+		left: 0;
+		z-index: 10000;
+		transition: all 0.4s;
+		&.none{
+			display: none;			
+		}
+		&.show{
+			display: block;
+		}
+		.content{
+			width: 540rpx;
+			min-height: 310rpx;
+			box-sizing: border-box;
+			position: absolute;
+			left: 50%;
+			top: 50%;
+			transform: translate(-50%,-50%);
+			border-radius: 14rpx;
+			background-color: #FFFFFF;
+			padding-top: 180rpx;
+			.content-title{
+				position: absolute;
+				left: 0;
+				top: -53rpx;
+				width: 100%;
+				height: 232rpx;
+				background: url(https://admin-b.caimei365.com/userfiles/1/images/photo/2020/08/alert%402x.png) no-repeat;
+				background-size: contain;
+			}
+			.text-content{
+				width: 100%;
+				min-height: 208rpx;
+				box-sizing: border-box;
+				padding:24rpx;
+				float: left;
+				background-color: #FFFFFF;
+				border-radius:0 0 14rpx 14rpx;
+				.text{
+					letter-spacing: 2rpx;
+					line-height: 50rpx;
+					font-size: $font-size-26;
+					color: $text-color;
+					text-align: justify;
+					margin-bottom: 30rpx;
+				}
+			}
+			.alert-btn{
+				width: 492rpx;
+				height: 88rpx;
+				background: $btn-confirm;
+				line-height: 88rpx;
+				text-align: center;
+				border-radius: 44rpx;
+				color: #FFFFFF;
+				margin-top: 20rpx;
+			}
+		}	
+	}
+</style>

+ 150 - 0
components/cm-module/modelAlert/sellerShareAlert.vue

@@ -0,0 +1,150 @@
+<template name="sharealert">
+	<view class="alert spec" :class="specClass">
+		<view class="model-warp">
+			<view class="content">
+				<view class="text-content">
+					<view class="title">分享订单</view>
+					<view class="share">您的分享码:<text class="txt">{{shareCode}}</text></view>
+					<view class="text">
+						<text>有效期为24小时。订单分享后若对方无法直接登录小程序查看订单,请提供该分享码给对方,通过输入分享码查看</text>
+					</view>
+				</view>				
+				<view class="alert-btn">
+					<view class="btn btn-cancel" @click="hideConfirm">取消</view>
+					<!-- #ifdef MP-WEIXIN -->
+					<button class="btn btn-confirm" open-type="share" @click="btnConfirm(shareCode)">去分享</button>
+					<!-- #endif -->
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		name:'sharealert',
+		props:{
+			orderID:{
+				type:Number
+			}
+		},
+		data() {
+			return{
+				shareCode:'',
+			}
+		},
+		created() {
+			this.getShareCode(this.orderID)
+		},
+		methods:{
+			getShareCode(res){
+				this.OrderService.QueryOrderShareCode({orderID:res}).then(response =>{
+					this.shareCode = response.data
+					this.$parent.shareCode = this.shareCode;
+				}).catch(error =>{
+					this.$parent.isShareModal = false;
+					this.$util.modal('提示',error.msg,'确定','',false,() =>{})
+				})
+			},
+			hideConfirm(){
+				this.$parent.isShareModal = false
+			},
+			btnConfirm(code){//点击事件
+				this.$emit('btnConfirm')
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	/*弹窗*/
+	 .model-warp.none{
+		 display: none;
+	 }
+	 .model-warp.show{
+		 display: block;
+	 }
+	 .model-warp{
+		width: 100%;
+		height: 100%;
+		background: rgba(0,0,0,0.3);
+		position: fixed;
+		top: 0;
+		left: 0;
+		z-index: 10000;
+		transition: all 0.4s;
+		&.none{
+			display: none;			
+		}
+		&.show{
+			display: block;
+		}
+		.content{
+			width: 518rpx;
+			height: 418rpx;
+			position: absolute;
+			background: $bg-color;
+			left: 0;
+			right: 0;
+			bottom: 0;
+			top: 0;
+			margin: auto;
+			border-radius: 14rpx;
+			.text-content{
+				width: 448rpx;
+				height: 264rpx;
+				padding: 20rpx 35rpx;
+				float: left;
+				.title{
+					line-height: 40rpx;
+					font-size: $font-size-28;
+					color: $text-color;
+					text-align: center;
+					font-weight: bold;
+					margin-bottom: 36rpx;
+				}
+				.share{
+					line-height: 36rpx;
+					font-size: $font-size-26;
+					color: $text-color;
+					text-align: justify;
+					margin-top: 22rpx;
+					font-weight: normal;
+					.txt{
+						margin-left: 10rpx;
+						color: #FF2A2A;
+					}
+				}
+				.text{
+					line-height: 36rpx;
+					font-size: $font-size-26;
+					color: $text-color;
+					text-align: justify;
+					margin-top: 22rpx;
+				}
+			}
+			.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: 35rpx;
+					padding: 0;
+					margin: 0 15rpx;
+					&.btn-cancel{
+						background: $btn-cancel;
+					}
+					&.btn-confirm{
+						background: $btn-confirm;
+					}
+				}
+			}
+		}	
+	}
+</style>

+ 150 - 0
components/cm-module/modelAlert/shareAlert.vue

@@ -0,0 +1,150 @@
+<template name="sharealert">
+	<view class="alert spec" :class="specClass">
+		<view class="model-warp">
+			<view class="content">
+				<view class="text-content">
+					<view class="title">分享订单</view>
+					<view class="share">您的分享码:<text class="txt">{{shareCode}}</text></view>
+					<view class="text">
+						<text>有效期为24小时。如果对方不是您机构的运营人员,需要输入该分享码才能查看本订单</text>
+					</view>
+				</view>				
+				<view class="alert-btn">
+					<view class="btn btn-cancel" @click="hideConfirm">取消</view>
+					<!-- #ifdef MP-WEIXIN -->
+					<button class="btn btn-confirm" open-type="share" @click="btnConfirm(shareCode)">去分享</button>
+					<!-- #endif -->
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		name:'sharealert',
+		props:{
+			orderID:{
+				type:Number
+			}
+		},
+		data() {
+			return{
+				shareCode:'',
+			}
+		},
+		created() {
+			this.getShareCode(this.orderID)
+		},
+		methods:{
+			getShareCode(res){
+				this.OrderService.QueryOrderShareCode({orderID:res}).then(response =>{
+					this.shareCode = response.data
+					this.$parent.shareCode = this.shareCode;
+				}).catch(error =>{
+					this.$parent.isShareModal = false;
+					this.$util.modal('提示',error.msg,'确定','',false,() =>{})
+				})
+			},
+			hideConfirm(){
+				this.$parent.isShareModal = false
+			},
+			btnConfirm(code){//点击事件
+				this.$emit('btnConfirm')
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	/*弹窗*/
+	 .model-warp.none{
+		 display: none;
+	 }
+	 .model-warp.show{
+		 display: block;
+	 }
+	 .model-warp{
+		width: 100%;
+		height: 100%;
+		background: rgba(0,0,0,0.3);
+		position: fixed;
+		top: 0;
+		left: 0;
+		z-index: 10000;
+		transition: all 0.4s;
+		&.none{
+			display: none;			
+		}
+		&.show{
+			display: block;
+		}
+		.content{
+			width: 518rpx;
+			height: 418rpx;
+			position: absolute;
+			background: $bg-color;
+			left: 0;
+			right: 0;
+			bottom: 0;
+			top: 0;
+			margin: auto;
+			border-radius: 24rpx;
+			.text-content{
+				width: 448rpx;
+				height: 264rpx;
+				padding: 20rpx 35rpx;
+				float: left;
+				.title{
+					line-height: 40rpx;
+					font-size: $font-size-28;
+					color: $text-color;
+					text-align: center;
+					font-weight: bold;
+					margin-bottom: 36rpx;
+				}
+				.share{
+					line-height: 36rpx;
+					font-size: $font-size-26;
+					color: $text-color;
+					text-align: justify;
+					margin-top: 22rpx;
+					font-weight: normal;
+					.txt{
+						margin-left: 10rpx;
+						color: #FF2A2A;
+					}
+				}
+				.text{
+					line-height: 36rpx;
+					font-size: $font-size-26;
+					color: $text-color;
+					text-align: justify;
+					margin-top: 22rpx;
+				}
+			}
+			.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: 35rpx;
+					padding: 0;
+					margin: 0 15rpx;
+					&.btn-cancel{
+						background: $btn-cancel;
+					}
+					&.btn-confirm{
+						background: $btn-confirm;
+					}
+				}
+			}
+		}	
+	}
+</style>

+ 158 - 0
components/cm-module/modelAlert/supplierRegisreAlert.vue

@@ -0,0 +1,158 @@
+<template name="alert">
+	<view class="alert spec" :class="specClass">
+		<!-- 运费弹窗说明 -->
+		<view class="freight-alert">
+			<view class="content clearfix">
+				<view class="title">供应商注册需知</view>
+				<view class="text">采美采购商城(隶属于采美365网)是美容行业一站式B2B采购交易服务平台,供应商入驻需平台审核。注册说明如下,请您仔细阅读:</view>
+				<view class="text">1、本商城商品需绝对保证正品,谢绝非自营/自有品牌(以登记备案为准),代理商应出具授权书等说明文件,杜绝山寨、假冒伪劣等侵权、侵害他人利益的行为。</view>
+				<view class="text">2、注册需要提供公司名称、营业执照、公司地址、联系人等基本信息。</view>
+				<view class="text">3、供应商注册审核通过后需缴纳平台信息服务管理费用。</view>
+				<view class="register-agree">
+					<view class="agree-text"  @tap.stop="agreeCheck()">
+						<button class="checkbox iconfont" :class="[isCheck?'icon-gouxuan':'icon-weigouxuan']"></button>
+						<text class="text">我已阅读供应商注册需知</text>
+					</view>	
+				</view>
+				<view class="text-btn">
+					<view class="btn" :class="isCheck?'':'none'" @click.stop="hideAlert">确定</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import { cancelPrompt } from "@/api/use.js"
+	export default{
+		name:'alert',
+		props:{
+			clubStatus:{
+				type:Number
+			}
+		},
+		data() {
+			return{
+				isCheck:false
+			}
+		},
+		created() {
+			this.status = this.clubStatus
+		},
+		onLoad(){
+			
+		},
+		methods:{
+			hideAlert(){
+				if(!this.isCheck){
+					return
+				}
+				this.$parent.isSupplierAlert = false
+			},
+			agreeCheck() {
+				this.isCheck = !this.isCheck
+			}
+		},
+		onShow(){
+	
+		}
+	}
+</script>
+
+<style lang="scss">
+	/*弹窗*/
+	.model-warp.none{
+		display: none;
+	}
+	.model-warp.show{
+		display: block;
+	}
+	.freight-alert{
+		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;
+		}
+		.content{
+			width: 580rpx;
+			height: 770rpx;
+			position: absolute;
+			left: 0;
+			right: 0;
+			bottom: 0;
+			top: 0;
+			margin: auto;
+			border-radius: 16rpx;
+			padding: 0 30rpx 30rpx 30rpx;
+			box-sizing: border-box;
+			background-color: #FFFFFF;
+			.title{
+				line-height: 80rpx;
+				font-size: $font-size-30;
+				color: #333333;
+				text-align: center;
+				font-weight: bold;
+			}
+			.text{
+				line-height: 44rpx;
+				font-size: $font-size-26;
+				color: #666666;
+				text-align: justify;
+			}
+			.register-agree{
+				display: flex;
+				flex-direction: column;
+				align-items: center;
+				margin: 20rpx 0;
+				.agree-text{
+					.checkbox{
+						float: left;
+						margin: 4rpx 6rpx 0 0;
+						color: #999999;
+						font-size: $font-size-34;
+						&.icon-gouxuan{
+							color: $color-system;
+						}
+					}
+					font-size: $font-size-22;
+					line-height: 44rpx;
+					color: #999999;
+					.text{
+						color:#1890f9;
+					}
+				}
+			}
+			.text-btn{
+				width: 100%;
+				height: auto;
+				margin-top: 20rpx;
+				.btn{
+					width: 420rpx;
+					height: 84rpx;
+					margin: 0 auto;
+					background: $btn-confirm;
+					line-height: 84rpx;
+					font-size: $font-size-28;
+					text-align: center;
+					color: #FFFFFF;
+					border-radius: 42rpx;
+					padding: 0;
+					&.none{
+						background: #e1e1e1;
+						color: #FFFFFF;
+					}
+				}
+			}
+		}
+	}
+	
+</style>

+ 178 - 0
components/cm-module/modelAlert/supplierShareAlert.vue

@@ -0,0 +1,178 @@
+<template name="alert">
+	<view class="alert spec" :class="specClass">
+		<!-- 运费弹窗说明 -->
+		<view class="freight-alert"  @click.stop="hideConfirm">
+			<view class="content clearfix">
+				<view class="text-content">
+					<view class="text-t">分享码</view>
+					<view class="text-c">{{shareCode}} <text class="clipboard" @click.stop="clipboard(shareCode)">复制</text></view>
+					<view class="text-h1">有效期为72小时。如果对方还没有绑定采美账号,需要输入该分享码才能查看本订单</view>
+				</view>
+				<view class="text-btn">
+					<!-- #ifdef MP-WEIXIN -->
+					<button class="btn" open-type="share" @click="btnConfirm(shareCode)">去分享</button>
+					<!-- #endif -->
+					<view class="btn-none" @click.stop="hideConfirm(shareCode)">取消</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	const thorui = require("@/components/clipboard/clipboard.thorui.js")
+	export default{
+		name:'alert',
+		props:{
+			shopOrderID:{
+				type:Number
+			}
+		},
+		data() {
+			return{
+				shareCode:'',
+			}
+		},
+		created() {
+			this.getShareCode(this.shopOrderID)
+		},
+		onLoad(){
+			
+		},
+		methods:{
+			getShareCode(data){
+				this.ShopService.ShopOrderShareCode({shopOrderId:data}).then(response =>{
+					this.shareCode = response.data
+					this.$parent.shareCode = this.shareCode;
+				}).catch(error =>{
+					this.$parent.isShareModal = false;
+					this.$util.modal('提示',error.msg,'确定','',false,() =>{})
+				})
+			},
+			clipboard(data) {
+				thorui.getClipboardData(data, (res) => {
+					if (res) {
+						this.$util.msg("复制成功",2000,true,'success');
+					} else {
+						this.$util.msg("复制失败",2000,true,'none');
+					}
+				})
+			},
+			hideConfirm(){
+				this.$parent.isShareModal = false
+			},
+			btnConfirm(code){//点击事件
+				this.$emit('btnConfirm')
+			}
+		},
+		onShow(){
+	
+		}
+	}
+</script>
+
+<style lang="scss">
+	/*弹窗*/
+	.model-warp.none{
+		display: none;
+	}
+	.model-warp.show{
+		display: block;
+	}
+	.freight-alert{
+		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;
+		}
+		.content{
+			width: 492rpx;
+			height: 666rpx;
+			position: absolute;
+			background: url(https://img.caimei365.com/group1/M00/03/95/Cmis2F76nVaAPs9JAAHGoKa8KvY492.png) no-repeat;
+			background-size: cover;
+			left: 0;
+			right: 0;
+			bottom: 0;
+			top: 0;
+			margin: auto;
+			padding:0 24rpx 20rpx 24rpx;
+			border-radius: 12rpx;
+			.text-content{
+				width: 100%;
+				height: auto;
+				margin-top: 210rpx;
+				.text-t{
+					font-size: $font-size-28;
+					color: $text-color;
+					text-align: center;
+					line-height: 44rpx;
+				}
+				.text-c{
+					font-size: $font-size-44;
+					color: #16E17C;
+					text-align: center;
+					line-height: 80rpx;
+					position: relative;
+					.clipboard{
+						width: 84rpx;
+						height: 36rpx;
+						background: #EFEFEF;
+						text-align: center;
+						font-size: $font-size-24;
+						color: #999999;
+						border-radius: 4rpx;
+						line-height: 36rpx;
+						display: inline-block;
+						position: absolute;
+						top: 29%;
+						right: 18%;
+					}
+				}
+				.text-h1{
+					line-height: 40rpx;
+					font-size: $font-size-28;
+					color: $text-color;
+					text-align: justify;
+				}
+			}
+			.text-btn{
+				width: 100%;
+				height: auto;
+				margin-top: 40rpx;
+				.btn{
+					width: 80%;
+					height: 70rpx;
+					margin: 0 auto;
+					background: $btn-confirm;
+					line-height: 70rpx;
+					font-size: $font-size-28;
+					text-align: center;
+					color: #FFFFFF;
+					border-radius: 35rpx;
+					padding: 0;
+				}
+				.btn-none{
+					width: 100%;
+					height: 70rpx;
+					float: left;
+					line-height: 70rpx;
+					font-size: $font-size-28;
+					text-align: center;
+					color: #666666;
+					padding: 0;
+				}
+			}
+		}
+	}
+	
+</style>

+ 156 - 0
components/cm-module/modelAlert/upgradeAlert.vue

@@ -0,0 +1,156 @@
+<template name="alert">
+	<view class="alert spec" :class="specClass">
+		<!-- 运费弹窗说明 -->
+		<view class="freight-alert"  @click.stop="unBindUpgrade">
+			<view class="content clearfix">
+				<view class="title"><text class="iconfont icon-iconfontguanbi" @click.stop="unBindUpgrade"></text></view>
+				<view class="text-content">
+					<view class="text-h1">您目前为<text class="col">普通机构用户</text></view>
+					<view class="text-h1">可以升级<text class="col">会员机构</text>享受更多更好的服务</view>
+				</view>
+				<view class="text-btn">
+					<view class="btn" @click.stop="GoApply">去升级</view>
+					<view class="btn-none" @click.stop="unBindUpgrade">暂不升级</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import { cancelPrompt } from "@/api/use.js"
+	export default{
+		name:'alert',
+		props:{
+			clubStatus:{
+				type:Number
+			}
+		},
+		data() {
+			return{
+				status:""
+			}
+		},
+		created() {
+			this.status = this.clubStatus
+		},
+		onLoad(){
+			
+		},
+		methods:{
+			GoApply(){
+				this.$emit('GoApply')
+			},
+			unBindUpgrade(){
+				this.$emit('unBindUpgrade')
+			}
+		},
+		onShow(){
+	
+		}
+	}
+</script>
+
+<style lang="scss">
+	/*弹窗*/
+	.model-warp.none{
+		display: none;
+	}
+	.model-warp.show{
+		display: block;
+	}
+	.freight-alert{
+		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;
+		}
+		.content{
+			width: 492rpx;
+			height: 710rpx;
+			position: absolute;
+			background: url(https://img.caimei365.com/group1/M00/03/B0/Cmis217Z9BSAERyCAAG9lz_TNN0938.png) no-repeat;
+			background-size: contain;
+			left: 0;
+			right: 0;
+			bottom: 0;
+			top: 0;
+			margin: auto;
+			padding:0 24rpx 20rpx 24rpx;
+			border-radius: 12rpx;
+			.title{
+				width: 100%;
+				height: 68rpx;
+				line-height: 68rpx;
+				text-align: center;
+				position: relative;
+				.icon-iconfontguanbi{
+					width: 50rpx;
+					height: 50rpx;
+					text-align: center;
+					line-height: 50rpx;
+					border-radius: 50%;
+					border: 1px solid #FFFFFF;
+					position: absolute;
+					right: -20rpx;
+					top: 0;
+					font-size: $font-size-32;
+					color: #FFFFFF;
+				}
+			}
+			.text-content{
+				width: 100%;
+				height: auto;
+				margin-top: 280rpx;
+				.text-h1{
+					line-height: 60rpx;
+					font-size: $font-size-28;
+					color: $text-color;
+					text-align: justify;
+					.col{
+						color: $color-system;
+						margin: 0 6rpx;
+					}
+				}
+			}
+			.text-btn{
+				width: 100%;
+				height: auto;
+				margin-top: 40rpx;
+				.btn{
+					width: 100%;
+					height: 88rpx;
+					float: left;
+					background: $btn-confirm;
+					line-height: 88rpx;
+					font-size: $font-size-28;
+					text-align: center;
+					color: #FFFFFF;
+					border-radius: 44rpx;
+					padding: 0;
+				}
+				.btn-none{
+					width: 100%;
+					height: 88rpx;
+					float: left;
+					line-height: 88rpx;
+					font-size: $font-size-28;
+					text-align: center;
+					color: #666666;
+					padding: 0;
+					margin-top: 20rpx;
+				}
+			}
+		}
+	}
+	
+</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>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

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

@@ -0,0 +1,471 @@
+<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-if="information.secondHandOrderFlag==1">{{item.shopName}}<label class="paymenttext" v-if="information.affirmPaymentFlag==1">已确认打款供应商</label></view>
+					<view class="title-text" v-else @click="goShophome(item.shopID)">{{item.shopName}}<label class="iconfont icon-jinrudianpu"></label></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">¥{{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">¥{{pros.discountPrice | NumFormat}}</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{
+					this.$api.navigateTo(`/pages/goods/product?id=${pros.productID}`)
+				}
+			},	
+			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;
+					}
+				}
+				
+			}
+			.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;
+						}
+					}
+				}
+				.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:10rpx 0 0 0;
+					.floor-tags{
+						height: 28rpx;
+						border-radius: 6rpx;
+						background-color: #FFFFFF;
+						line-height: 28rpx;
+						color: $color-system;
+						text-align: center;
+						display: inline-block;
+						padding:0 16rpx;
+						font-size: $font-size-20;
+						border: 1px solid #E15616;
+						float: left;
+					}
+				}
+				.floor-item-act{
+					height: 56rpx;
+					text-align: center;
+					box-sizing: border-box;
+					float: left;
+					padding: 10rpx 0;
+					margin-right: 12rpx;
+					.floor-tags{
+						float: left;
+						height: 28rpx;
+						border-radius: 6rpx;
+						background-color: #FFFFFF;
+						line-height: 28rpx;
+						color: $color-system;
+						text-align: center;
+						display: inline-block;
+						padding:0 16rpx;
+						font-size: $font-size-20;
+						border: 1px solid #E15616;
+					}
+				}
+			}
+			.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>

+ 197 - 0
components/cm-module/orderDetails/invoiceTent.vue

@@ -0,0 +1,197 @@
+<template name="invoice">
+	<view class="invoice-template">
+		 <!-- 发票信息 -->
+		 <view class="invoice-content">
+		 	<view class="invoice-title">发票信息</view>
+			<view class="invoice-empty" v-if="isEmpty">
+			 	<text>不要发票</text></text>
+			</view>
+			<view class="invoice-text" v-else>
+				<view class="invoice-top" @click="showInvoice">
+					<view class="name">{{orderInvoice.invoiceTitle ? orderInvoice.invoiceTitle : ''}}</view>
+					<text class="iconfont icon-web_xiangxiazhankai" :class="{'icon-web_xiangxiazhankai-active':isOpen}"></text>
+				</view>
+				<view :class="{'invoice-warp--hide':!isOpen}" class="invoice-warp">
+					<view  class="invoice-warp__wrapper invoice-animation" 
+						   :style="{'transform':isOpen?'translateY(0)':'translateY(-50%)','-webkit-transform':isOpen?'translateY(0)':'translateY(-50%)'}">
+						<view class="table">
+							<text class="label-name">单位名称:</text>
+							<text>{{orderInvoice.invoiceTitle ? orderInvoice.invoiceTitle : ''}}</text>
+						</view>
+						<view class="table long">
+							<text class="label-name">纳锐人识别号:</text>
+							<text>{{orderInvoice.corporationTaxNum ? orderInvoice.corporationTaxNum :''}}</text> 
+						</view>
+						<view class="table">
+							<text class="label-name">注册地址:</text>
+							<text>{{orderInvoice.registeredAddress ? orderInvoice.registeredAddress : ''}}</text> 
+						</view>
+						<view class="table">
+							<text class="label-name">注册电话:</text>
+							<text>{{orderInvoice.registeredPhone ? orderInvoice.registeredPhone : ''}}</text>
+						</view>
+						<view class="table">
+							<text class="label-name">开户银行:</text>
+							<text>{{orderInvoice.openBank ? orderInvoice.openBank : ''}}</text>
+						</view>
+						<view class="table">
+							<text class="label-name">银行账号:</text>
+							<text>{{bankAccountNo ? bankAccountNo : ''}}</text>
+						</view>
+					</view>
+				</view>
+			</view>
+		 </view>
+	</view>
+</template>
+
+<script>
+	export default{
+		name:"invoice",
+		props:{
+			orderInvoice:{
+				type:Object
+			}
+		},
+		data() {
+			return{
+				isEmpty:false,
+				title:'发票信息',
+				isOpen:false,
+				bankAccountNo:''
+			}
+		},
+		created(){
+			this.initData(this.orderInvoice)
+		},
+		computed: {
+
+		},
+		methods:{
+			initData(res) {
+				if(res == null || res.type == '0'){
+					this.isEmpty = true
+				}else{
+					this.isEmpty = false
+					this.bankAccountNo = this.$reg.bankRegex(res.bankAccountNo)
+				}
+			},
+			onMessage(pros){
+			},
+			showInvoice(){
+				this.isOpen = !this.isOpen
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.invoice-template{
+		width: 100%;
+		height: auto;
+		background: #FFFFFF;
+		float: left;
+		margin-top: 24rpx;
+		.invoice-content{
+			width: 702rpx;
+			padding: 20rpx 24rpx;
+		}
+		.invoice-title{
+			font-size: $font-size-28;
+			color: $text-color;
+			text-align: left;
+			line-height: 40rpx;
+			font-weight: bold;
+			margin-bottom: 30rpx;
+		}
+		.invoice-empty{
+			font-size: $font-size-28;
+			color: $text-color;
+			text-align: left;
+			line-height: 40rpx;
+			.txt{
+				font-size: $font-size-24;
+				color: #999999;
+			}
+		}
+		.invoice-animation {
+			/* transition: transform 0.3s ease;*/
+			transition-property: transform;
+			transition-duration: 0.3s;
+			transition-timing-function: ease;
+		}
+		.invoice-text{
+			width: 100%;
+			height: auto;
+			.invoice-top{
+				width: 100%;
+				height: 40rpx;
+				line-height: 40rpx;
+				font-size: $font-size-28;
+				color: $text-color;
+				text-align: left;
+				.name{
+					width: 400rpx;
+					float: left;
+					-o-text-overflow: ellipsis;
+					text-overflow: ellipsis;
+					display: -webkit-box;
+					word-break: break-all;
+					-webkit-box-orient: vertical;
+					-webkit-line-clamp: 1;
+					overflow: hidden;
+				}
+				.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);
+				}
+			}
+			.invoice-warp{
+				width: 100%;
+				padding: 24rpx 0 0 0;
+				overflow: hidden;
+				.table{
+					padding-left: 130rpx;
+					height: auto;
+					line-height: 64rpx;
+					font-size: $font-size-26;
+					color: $text-color;
+					text-align: left;
+					position: relative;
+					.label-name{
+						display: inline-block;
+						line-height: 64rpx;
+						position: absolute;
+						left: 0;
+						top: 0;
+					}
+					&.long{
+						padding-left: 180rpx;
+					}
+				}
+			}	
+			.invoice-warp__wrapper{
+				/* #ifndef APP-NVUE */
+				display: flex;
+				/* #endif */
+				flex-direction: column;
+				padding-top: 20rpx;
+			}
+			.invoice-warp--hide {
+				padding: 0 0;
+				height: 0px;
+				line-height: 0px;
+			}		
+		}
+	}
+</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/temp/line@3x.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: 46rpx;
+			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-xiayibu {
+			font-size: 32rpx;
+			color: $text-color;
+			margin-right: 30rpx;
+		}
+		.a-bg {
+			position: absolute;
+			left: 0;
+			bottom: 0;
+			display: block;
+			width: 100%;
+			height: 5rpx;
+		}
+	}
+</style>

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

@@ -0,0 +1,232 @@
+<template name="button">
+	<view class="button-template" :style="{paddingBottom :isIphoneX ? '68rpx' : '0rpx'}">
+		<!-- 底部按钮 -->
+		<view class="button-content">
+			<view class="btn btn-payment" v-if="order.affirmPaymentFlag=='00'" @click.stop="btnConfirm('payment',order)">确认打款<text>供应商</text></view>
+			<view class="btn btn-confirm" v-if="btnState.isConfirmation" @click.stop="btnConfirm('confirmation',order)">确认订单</view>
+			<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:'isConfirmation',val:[0],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,
+						isConfirmation: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: #666666;
+				text-align: center;
+				float: right;
+				border: 2rpx solid #999999;
+				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{
+				background:#f94b4b;
+				margin-right: 0;
+				border: 2rpx solid #f94b4b;
+				color: #fff;
+			}
+			.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>

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

@@ -0,0 +1,280 @@
+<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></view>
+				</view>
+			</view>
+			<view class="information-view same">
+				<view class="view-num">订单总额:<label class="label">¥{{ orderData.payTotalFee =='undefined' ? '' : orderData.payTotalFee | NumFormat }}</label></view>
+			</view>
+			<view class="information-view">
+				<view class="view-num bold">
+					订单标识:<label class="label">{{ orderData.orderMark =='undefined' ? '' : orderData.orderMark }}</label>
+					<text class="clipboard" @click="clipboard(orderData.orderMark)">复制</text>
+				</view>
+			</view>
+			<view class="information-view same">
+				<view class="view-num">待付金额:<text class="red">¥{{ orderData.pendingPayments =='undefined' ? '0.00' : orderData.pendingPayments | NumFormat }}</text></view>
+				<view class="view-man"></view>
+			</view>
+			<template v-if="openShowflag">
+				<view class="information-view">
+					<view class="view-num time">下单时间:<label class="label">{{ orderData.orderTime =='undefined' ? '' : orderData.orderTime }}</label></view>
+					<!-- <view class="view-type">{{ orderData.status | TextFormat }}</view> -->
+				</view>
+				<view class="information-view same">
+					<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 same">
+					<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 same">
+					<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 same">
+					<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: 55%;
+				display: inline-block;
+				&.same{
+					width: 45%;
+					text-align: right;
+				}
+				// &.title{
+				// 	height: 68rpx;
+				// 	line-height: 68rpx;
+				// 	margin-bottom: 5rpx;
+				// }
+				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-buss{
+						display: inline-block;
+						width: 72rpx;
+						height: 30rpx;
+						background:radial-gradient(circle,rgba(255,39,180,1) 0%,rgba(193,77,245,1) 100%);
+						border-radius: 4rpx;
+						line-height: 30rpx;
+						font-size: $font-size-24;
+						text-align: center;
+						color: #FFFFFF;
+						margin-top: 10rpx;
+					}
+					.bage-auto{
+						display: inline-block;
+						width: 72rpx;
+						height: 30rpx;
+						background:radial-gradient(circle,rgba(255,180,39,1) 0%,rgba(245,142,77,1) 100%);
+						border-radius: 4rpx;
+						line-height: 30rpx;
+						font-size: $font-size-24;
+						text-align: center;
+						color: #FFFFFF;
+						margin-top: 10rpx;
+					}
+					.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: 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;
+				}
+			}
+		}
+	}
+	.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>

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

@@ -0,0 +1,212 @@
+<template name="button">
+	<view class="button-template">
+		<!-- 底部按钮 -->
+		<view class="button-content">
+			<view class="btn btn-payment" v-if="order.affirmPaymentFlag=='00'" @click.stop="btnConfirm('payment',order)">确认打款<text>供应商</text></view>
+			<view class="btn btn-pay" v-if="btnState.isPay" @click.stop="btnConfirm('pay',order)">付款</view>
+			<view class="btn btn-confirm" v-if="btnState.isConfirmation" @click.stop="btnConfirm('confirmation',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:'isConfirmation',val:[0],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,
+						isConfirmation:false,
+					}
+				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: 150rpx;
+				height:  64rpx;
+				margin: 22rpx 0 20rpx 20rpx;
+				line-height: 64rpx;
+				font-size:$font-size-26;
+				color: #999999;
+				text-align: center;
+				float: right;
+				border-radius: 34rpx;
+				border: 2rpx solid #999999;
+				&.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-pay{
+				background:#f94b4b;
+				color: #FFFFFF;
+				border: 2rpx solid #f94b4b;
+			}
+			.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>

+ 259 - 0
components/cm-module/orderDetails/sellerDetaileButton.vue

@@ -0,0 +1,259 @@
+<template name="button">
+	<view class="button-template" :style="{paddingBottom :isIphoneX ? '68rpx' : '0rpx'}">
+		<!-- 底部按钮 -->
+		<view class="button-content">
+			<view class="btn btn-cancel"  v-if="secondHandOrderFlag!=1"  @click.stop="btnConfirm('again',order)">再来一单</view>
+			<view class="btn btn-cancel" v-if="btnState.isCancel"  @click.stop="btnConfirm('cancel',order)">取消订单</view>
+			<view class="btn btn-cancel" v-if="btnState.isDelete"  @click.stop="btnConfirm('delete',order)">删除订单</view>
+			<view class="btn btn-share" @click.stop="onShareCode">
+				<view class="tips" v-if="shareCode">分享码:{{shareCode}}</view>
+				分享订单
+			</view>	
+			<view class="btn btn-color" v-if="btnState.isConfirm" @click.stop="btnConfirm('confirm',order)">确认订单</view>
+			<view class="btn btn-color" v-if="btnState.isPay && ableUserMoney > 0 && !rechargeGoods" @click.stop="btnConfirm('balance',order)">余额抵扣</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		name:"button",
+		props:{
+			status:{
+				type:Number
+			},
+			order: {
+				type:Object
+			},
+			ableUserMoney:{
+				type:Number
+			},
+			rechargeGoods:{
+				type:Boolean
+			},
+			shareCode:{
+				type:String
+			},
+			serviceProviderId:{
+				type:Number
+			},
+			secondHandOrderFlag:{
+				type:String
+			}
+		},
+		watch:{
+			status:{
+				handler:function(val){
+					this.initData(val)
+				},
+				deep:true//对象内部的属性监听,也叫深度监听
+			}
+		},
+		data() {
+			return{
+				btnState:this.initStatus(),
+				isIphoneX:this.$store.state.isIphoneX,
+				invoiceStatus:false,
+				mapStateArr:[
+					{label:'isDelete',val:[6],status: true},
+					{label:'isCancel',val:[0,111],status: true},
+					{label:'isConfirm',val:[0],status: true},
+					{label:'isPay',val:[11,12,13,21,22,23,111],status: true},
+				]
+			}
+		},
+		created(){
+			console.log(this.rechargeGoods);
+			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
+							//console.log(this.btnState[el.label]);
+						}
+					})
+				})
+			},
+			initStatus(){
+				let btnState= {
+						isQuery: false,
+						isDelete: false,
+						isCancel: false,
+						isConfirm: false,
+						isPay: false,
+					}
+				return 	btnState
+			},
+			getShareCode(code){
+				this.shareCode = code
+			},
+			onShareCode(){
+				if(this.order.onlinePayFlag!= '1'){
+					this.PayService.PayOrderCheckoutCounter({orderId:this.order.orderID}).then(response =>{
+						let data = response.data.order
+						this.invoiceStatus =  data.invoiceStatus
+						//判断线上线下显示
+						if(this.invoiceStatus){
+							this.$util.modal('提示','由于商品发票属性的限制,本订单不能进行线上支付,请让客户选择线下转账方式付款','继续分享','知道了',true,() =>{
+								this.$parent.isShareModal = true
+							})		
+						}else{
+							this.$parent.isShareModal = true
+						}
+					}).catch(error =>{
+						this.$util.msg(error.msg,2000)
+					})
+				}else{
+					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;
+			margin: 20rpx 0;
+			.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;
+				line-height: 64rpx;
+				font-size:$font-size-26;
+				color: #FFFFFF;
+				text-align: center;
+				border-radius: 34rpx;
+				float: right;
+			}
+			.btn-color{
+				background: #f94b4b;
+				// margin: 20rpx 0 20rpx 20rpx;
+				.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-cancel{
+				background:#FFFFFF;
+				color: #666666;
+				float: left;
+				// margin: 22rpx 0;
+				margin-right: 15rpx;
+				border: 2rpx solid #999999;
+			}
+			.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:linear-gradient(315deg,rgba(231,0,0,1) 0%,rgba(255,104,1,1) 100%);
+			}
+			.btn-share{
+				background:#FFFFFF;
+				color: #666666;
+				float: left;
+				// margin: 22rpx 0;
+				margin-right: 15rpx;
+				border: 2rpx solid #999999;
+				position: relative;
+				.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: -69rpx;
+					&:before{
+						content: "";
+						width: 25rpx;
+						height: 25rpx;
+						background:#E15616;
+						position: absolute;
+						bottom: -8rpx;
+						left: 30rpx;
+						z-index: -1;
+						transform:rotate(45deg);
+					}
+				}
+			}
+		}
+	}
+</style>

+ 195 - 0
components/cm-module/orderDetails/sellerOrderButton.vue

@@ -0,0 +1,195 @@
+<template name="button">
+	<view class="button-template">
+		<!-- 底部按钮 -->
+		<view class="button-content"> 
+			<view class="btn btn-cancel" v-if="btnState.isCancel" @click.stop="btnConfirm('cancel',orderID)">取消订单</view>
+			<view class="btn btn-cancel" v-if="btnState.isDelete" @click.stop="btnConfirm('delete',orderID)">删除订单</view>
+			<view class="btn btn-cancel" v-if="secondHandOrderFlag!=1"  @click.stop="btnConfirm('again',orderID)">再来一单</view>
+			<view class="btn btn-cancel"  @click.stop="onShareCode(orderID,userID)">分享订单</view>	
+			<view class="btn btn-color" v-if="btnState.isConfirm" @click.stop="btnConfirm('confirm',orderID)">确认订单</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		name:"button",
+		props:{
+			status: {
+				type:Number
+			},
+			orderID: {
+				type:Number
+			},
+			userID:{
+				type:Number
+			},
+			serviceProviderId:{
+				type:Number
+			},
+			secondHandOrderFlag:{
+				type:String
+			}
+		},
+		data() {
+			return{
+				isShare:true,
+				shareCode:'',
+				btnState:this.initStatus(),
+				mapStateArr:[
+					{label:'isDelete',val:[6],status: true},
+					{label:'isCancel',val:[0,111],status: true},
+					{label:'isConfirm',val:[0],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= {
+						isDelete: false,
+						isCancel: false,
+						isConfirm: false,
+						isShare: true
+					}
+				return 	btnState
+			},
+			getShareCode(code){
+				this.shareCode = code
+			},
+			onShareCode(oID,uID){
+				this.$parent.isShareModal = true
+				this.$parent.btnoRderID = oID,
+				this.$parent.btnClubUserID = uID
+				this.$emit('shareConfirm')
+			},
+			btnConfirm(type,id){
+				let data = {
+						type:type,
+						orderId:id,
+					}
+				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;
+			margin: 20rpx 0;
+			.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;
+				line-height: 64rpx;
+				font-size:$font-size-26;
+				color: #FFFFFF;
+				text-align: center;
+				border-radius:34rpx;
+				// float: right; 
+				display: inline-block;
+			}
+			.btn-color{
+				background: $btn-confirm;
+				// margin: 22rpx 0 22rpx 22rpx;
+			}
+			.btn-cancel{
+				border: 2rpx solid #999999;
+				background:#FFFFFF;
+				color: #666666;
+				// float: left;
+				margin-right: 15rpx;
+			}
+			.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:linear-gradient(315deg,rgba(231,0,0,1) 0%,rgba(255,104,1,1) 100%);
+			}
+			.btn-share{
+				background:linear-gradient(315deg,rgba(0,212,150,1) 0%,rgba(126,243,174,1) 100%);
+				margin-right: 0;
+				position: relative;
+				.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>

+ 195 - 0
components/cm-module/orderDetails/supplierDetaileButton.vue

@@ -0,0 +1,195 @@
+<template name="button">
+	<view class="button-template clearfix" :style="{paddingBottom :isIphoneX ? '68rpx' : '0rpx'}">
+		<!-- 底部按钮 -->
+		<view class="btn btn-color" v-if="btnState.isDeliver"  @click.stop="btnConfirm('deliver')">发货</view>
+		<view class="btn btn-cancel" @click.stop="onShareCode">
+			<view class="tips" v-if="shareCode">分享码:{{shareCode}}</view>
+			分享订单
+		</view>	
+		<view class="btn btn-cancel" v-if="btnState.isRecord" @click.stop="btnConfirm('record')">发货记录</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		name:"button",
+		props:{
+			status:{
+				type:Number
+			},
+			shareCode:{
+				type:String,
+				default: ''
+			}
+		},
+		watch:{
+			status:{
+				handler:function(val){
+					this.initData(val)
+				},
+				deep:true//对象内部的属性监听,也叫深度监听
+			}
+		},
+		data() {
+			return{
+				btnState:this.initStatus(),
+				isIphoneX:this.$store.state.isIphoneX,
+				mapStateArr:[
+					{label:'isDeliver',val:[1,2],status: true},
+					{label:'isRecord',val:[2,3],status: true},
+				]
+			}
+		},
+		created(){
+			this.initData(this.status)
+		},
+		computed: {
+
+		},
+		methods:{
+			initData(resVal) {
+				/**
+				 * @分享按钮统一显示
+				 * @按钮根据状态显示
+				 * @(1,2)显示[发货]按钮
+				 */
+				this.btnState = this.initStatus()
+				this.mapStateArr.forEach(el => {
+					el.val.forEach(value => {
+						if(resVal === value){
+							this.btnState[el.label] = el.status
+							//console.log(this.btnState[el.label]);
+						}
+					})
+				})
+			},
+			initStatus(){
+				let btnState= {
+						isDeliver: false,
+						isRecord: false,
+					}
+				return 	btnState
+			},
+			getShareCode(code){
+				this.shareCode = code
+			},
+			onShareCode(){
+				this.$parent.isShareModal = true
+				this.$emit('shareConfirm')
+			},
+			btnConfirm(type){
+				this.$emit('buttonConfirm',type)
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.button-template{
+		width: 100%;
+		padding:0 24rpx;
+		height: auto;
+		background-color: #FFF;
+		-webkit-box-shadow: 0px 3px 10px rgba(51, 51, 51, 0.5);
+		box-shadow: 0px 3px 10px rgba(51, 51, 51, 0.5);
+		padding-bottom: 24rpx;
+		z-index: 999;
+		box-sizing: border-box;
+		.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;
+			line-height: 64rpx;
+			font-size:$font-size-26;
+			color: #FFFFFF;
+			text-align: center;
+			border-radius: 34rpx;
+			float: right;
+		}
+		.btn-color{
+			background: #ff7a51;
+		}
+		.btn-cancel{
+			background:#FFFFFF;
+			color: #666666;
+			border: 1px solid #666666;
+			.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-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:linear-gradient(315deg,rgba(231,0,0,1) 0%,rgba(255,104,1,1) 100%);
+		}
+		.btn-share{
+			background:linear-gradient(315deg,rgba(0,212,150,1) 0%,rgba(126,243,174,1) 100%);
+			margin-right: 0;
+			position: relative;
+			.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>

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

@@ -0,0 +1,203 @@
+<template name="button">
+	<view class="button-template clearfix">
+		<!-- 底部按钮 -->
+		<view class="btn btn-color" v-if="btnState.isDeliver"  @click.stop="btnConfirm('deliver',orderInfo)">发货</view>
+		<view class="btn btn-cancel" @click.stop="onShareCode(orderInfo.shopOrderID)">
+			<view class="tips" v-if="shareCode">分享码:{{shareCode}}</view>
+			分享订单
+		</view>	
+		<view class="btn btn-cancel" v-if="btnState.isRecord" @click.stop="btnConfirm('record',orderInfo)">发货记录</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		name:"button",
+		props:{
+			status:{
+				type:Number
+			},
+			orderInfo:{
+				type:Object
+			},
+			shareCode:{
+				type:String,
+				default: ''
+			}
+		},
+		watch:{
+			status:{
+				handler:function(val){
+					this.initData(val)
+				},
+				deep:true//对象内部的属性监听,也叫深度监听
+			}
+		},
+		data() {
+			return{
+				btnState:this.initStatus(),
+				isIphoneX:this.$store.state.isIphoneX,
+				mapStateArr:[
+					{label:'isDeliver',val:[1,2],status: true},
+					{label:'isRecord',val:[2,3],status: true},
+				]
+			}
+		},
+		created(){
+			console.log(this.status)
+			this.initData(this.status)
+		},
+		computed: {
+
+		},
+		methods:{
+			initData(resVal) {
+				/**
+				 * @分享按钮统一显示
+				 * @按钮根据状态显示
+				 * @(1,2)显示[发货]按钮
+				 */
+				this.btnState = this.initStatus()
+				this.mapStateArr.forEach(el => {
+					el.val.forEach(value => {
+						if(resVal === value){
+							this.btnState[el.label] = el.status
+							console.log(this.btnState[el.label]);
+						}
+					})
+				})
+			},
+			initStatus(){
+				let btnState= {
+						isDeliver: false,
+						isRecord: false,
+					}
+				return 	btnState
+			},
+			getShareCode(code){
+				this.shareCode = code
+			},
+			onShareCode(shopOrderID){
+				console.log(shopOrderID)
+				this.$parent.isShareModal = true
+				this.$parent.btnoRderID = shopOrderID
+				this.$emit('shareConfirm')
+			},
+			btnConfirm(type,orderInfo){
+				console.log(orderInfo)
+				let data = {type:type, orderInfo:orderInfo}
+				this.$emit('buttonConfirm',data)
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.button-template{
+		width: 100%;
+		height: auto;
+		background-color: #FFF;
+		// -webkit-box-shadow: 0px 3px 10px rgba(51, 51, 51, 0.5);
+		// box-shadow: 0px 3px 10px rgba(51, 51, 51, 0.5);
+		z-index: 999;
+		box-sizing: border-box;
+		.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;
+			line-height: 64rpx;
+			font-size:$font-size-26;
+			color: #FFFFFF;
+			text-align: center;
+			border-radius: 34rpx;
+			float: right;
+			margin-right: 0;
+		}
+		.btn-color{
+			background: #ff7a51;
+		}
+		.btn-cancel{
+			background:#FFFFFF;
+			color: #666666;
+			border: 1px solid #666666;
+			.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-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:linear-gradient(315deg,rgba(231,0,0,1) 0%,rgba(255,104,1,1) 100%);
+		}
+		.btn-share{
+			background:linear-gradient(315deg,rgba(0,212,150,1) 0%,rgba(126,243,174,1) 100%);
+			margin-right: 0;
+			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>

+ 127 - 0
components/cm-module/orderDetails/supplierRecorgButton.vue

@@ -0,0 +1,127 @@
+<template name="button">
+	<view class="button-template">
+		<!-- 底部按钮 -->
+		<view class="button-content">
+			<view class="btn btn-color" v-if="hanldData.mailer == '1'" @click.stop="btnConfirm('cancel',hanldData)">撤销发货</view>
+			<view class="btn btn-color" @click.stop="btnConfirm('add',hanldData)">添加物流</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		name:"button",
+		props:{
+			hanldData: {
+				type:Object
+			}
+		},
+		data() {
+			return{
+
+			}
+		},
+		created(){
+			
+		},
+		computed: {
+			
+		},
+		methods:{
+			btnConfirm(type,hanldData){
+				let data = { hanldType:type,hanldData:hanldData }
+				this.$emit('buttonConfirm',data)
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.button-template{
+		width: 100%;
+		height: auto;
+		float: left;
+		background: #FFFFFF;
+		.button-content{
+			width: 702rpx;
+			padding: 0 24rpx;
+			height: auto;
+			float: left;
+			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;
+				line-height: 64rpx;
+				font-size:$font-size-26;
+				color: #FFFFFF;
+				text-align: center;
+				border-radius: 10rpx;
+				float: right;
+			}
+			.btn-color{
+				background: $btn-confirm;
+				margin: 22rpx 0 22rpx 22rpx;
+			}
+			.btn-cancel{
+				background:#FFFFFF;
+				color: #999999;
+				float: left;
+				margin: 22rpx 0;
+				text-align: left;
+			}
+			.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:linear-gradient(315deg,rgba(231,0,0,1) 0%,rgba(255,104,1,1) 100%);
+			}
+			.btn-share{
+				background:linear-gradient(315deg,rgba(0,212,150,1) 0%,rgba(126,243,174,1) 100%);
+				margin-right: 0;
+				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>

+ 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>

+ 347 - 0
components/cm-module/pageFloorTemplate/templateA.vue

@@ -0,0 +1,347 @@
+<template>
+	<view class="section_page_main clearfix">
+		<view class="floor-item ad_02">
+			<image class="item-img-gg" 
+				   :src="floorData.floorContent.appletsAdsImage1" 
+					@click="BannerNavigateTo(
+						floorData.floorContent.linkType1,
+						floorData.floorContent.linkParam1.id ? floorData.floorContent.linkParam1.id : '',
+						floorData.floorContent.adsLink1,
+						floorData.floorContent.linkParam1.keyword ? floorData.floorContent.linkParam1.keyword : ''
+					)"
+				   mode="aspectFill">
+			</image>
+		</view>
+		<view class="floor-item ad_04 clearfix" v-for="(item, idx) in floorData.floorImageList" :key="idx" @click.stop="navToDetailPage(item)">
+			<image class="item-img tui-skeleton-fillet" :src="item.image" mode="aspectFill"></image>
+			<view class="floor-item_tag" v-if="item.listType == 2">
+				<text>{{ item.label }}</text>
+			</view>
+			<view class="floor-item-content">
+				<view class="title tui-skeleton-rect">
+					<text class="mclap-tag" v-if="item.product.beautyActFlag == '1'">美博会</text>
+					<text class="mclap" :class="item.product.beautyActFlag == '1' ? 'indent' : ''">{{item.name}} </text>
+				</view>
+				<view class="floor-item-price" v-if="item.listType == 1">
+					<view class="floor-item-act">
+						<template v-if="userIdentity === 3">
+							<template v-if="item.product.actStatus===1">
+								<view class="floor-tags" v-if="PromotionsFormat(item.product.promotions)">
+									{{item.product.promotions.name}}
+									<text v-if="hasLogin && item.product.price1TextFlag != 1 && item.product.shopID == shopId">:¥{{item.product.retailPrice | NumFormat}}</text>
+								</view>
+								<view class="floor-tags" v-else>{{item.product.promotions.name}}</view>	
+							</template>
+							<template v-if="item.product.actStatus ===0  &&  item.product.ladderPriceFlag===1">
+								<view class="floor-tags">阶梯价格</view>	
+							</template>
+						</template>	
+						<template v-else>
+							<template v-if="item.product.actStatus===1">
+								<view class="floor-tags" v-if="PromotionsFormat(item.product.promotions)">
+									{{item.product.promotions.name}}
+									<text v-if="hasLogin && item.product.price1TextFlag != 1">:¥{{item.product.retailPrice | NumFormat}}</text>
+								</view>
+								<view class="floor-tags" v-else>{{item.product.promotions.name}}</view>	
+							</template>
+							<template v-if="item.product.actStatus ===0  &&  item.product.ladderPriceFlag===1">
+								<view class="floor-tags">阶梯价格</view>	
+							</template>
+						</template>
+					</view>	
+					<view v-if="hasLogin">
+						<template v-if="item.product.productCategory == 1">
+							<template v-if="userIdentity == 3">
+								<template v-if="item.product.shopID == shopId">
+									<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+										<text class="p big">¥未公开价格</text>
+									</view>
+									<view class="price tui-skeleton-rect" v-else :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+										<text class="p sm">¥</text>
+										<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+									</view>
+								</template>	
+								<template v-else>
+									<view class="no-price">
+										<view class="p-stars">
+											<text class="p-no">¥</text>
+											<uni-grader :grade="Number(item.product.price1Grade)" :margin="14"></uni-grader>
+										</view>
+									</view>	
+								</template>
+							</template>
+							<template v-else-if="userIdentity ===4">
+								<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+									<text class="p big">¥未公开价格</text>
+								</view>
+								<view class="title-none"  v-if="item.product.price1TextFlag === '2'">
+									<text class="p big">¥价格仅会员可见</text>
+								</view>
+								<view class="price tui-skeleton-rect" v-if="item.product.price1TextFlag === '0'" :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+									<text class="p sm">¥</text>
+									<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+								</view>
+							</template>
+							<template v-else>
+								<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+									<text class="p big">¥未公开价格</text>
+								</view>
+								<view class="price tui-skeleton-rect" v-else :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+									<text class="p sm">¥</text>
+									<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+								</view>
+							</template>
+						</template>	
+						<template v-else>
+							<view class="price tui-skeleton-rect" v-if="item.product.detailTalkFlag == '2'">
+								<text class="p sm">¥</text>
+								<text class="p big">价格详聊</text>
+							</view>
+							<view class="price tui-skeleton-rect" v-else>
+								<text class="p sm">¥</text>
+								<text class="p big">{{ item.product.retailPrice | NumFormat }}</text>
+							</view>
+						</template>
+					</view>
+					<view v-else class="no-price">
+						<template v-if="item.product.productCategory == 1">
+							<view class="p-stars">
+								<text class="p-no">¥</text>
+								<uni-grader :grade="Number(item.product.price1Grade)" :margin="14"></uni-grader>
+							</view>
+						</template>
+						<template v-else>
+							<view class="p-stars">
+								<text class="p-no">¥登录可见</text>
+							</view>
+						</template>
+					</view>	
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import { mapState,mapMutations} from 'vuex';
+	import uniGrader from '@/components/uni-grade/uni-grade.vue'
+	export default{
+		name:"templateA",
+		components:{
+			uniGrader
+		},
+		props:{
+			pageData:{
+				type:Object
+			},
+			userIdentity:{
+				type:Number
+			}
+		},
+		data() {
+			return{
+				shopId:0,
+				floorData:{}
+			}
+		},
+		filters: {
+			NumFormat:function(text) {//处理金额				
+				return Number(text).toFixed(2);			
+			},		
+		},
+		created(){
+			this.initData(this.pageData)
+		},
+		computed: {
+			...mapState(['hasLogin','userInfo','isActivity'])
+		},
+		watch: {
+			pageData: {
+				handler: function (el) {//监听对象的变换使用 function,箭头函数容易出现this指向不正确
+					this.pageData = el
+					this.initData(this.pageData)
+				},
+				deep: true
+			}
+		},
+		methods:{
+			initData(data){
+				this.$api.getStorage().then((resolve) =>{
+					this.shopId = resolve.shopID ? resolve.shopID : 0
+				})
+				this.floorData = data
+				console.log(this.floorData)
+			},
+			PromotionsFormat(promo){//促销活动类型数据处理
+				if(promo!=null){
+					if(promo.type == 1 && promo.mode == 1){
+						return true
+					}else{
+						return false
+					}
+				}
+				return false
+			},
+			navToDetailPage(pros) {//跳转商品详情页
+				this.$api.FlooryNavigateTo(pros)
+			},
+			BannerNavigateTo(linkType,linkId,linkHref,keyword) {//跳转商品详情页
+				this.$api.BannerNavigateTo(linkType,linkId,linkHref,keyword)
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.section_page_main{
+		width: 100%;
+		height: auto;
+		box-sizing: border-box;
+		.floor-item{
+			width: 339rpx;
+			height: 516rpx;
+			margin-right: 20rpx;
+			font-size: $font-size-24;
+			color: $text-color;
+			background: #FFFFFF;
+			line-height: 36rpx;
+			border-radius: 16rpx;
+			margin-bottom: 20rpx;
+			float: left;
+			box-sizing: border-box;
+			position: relative;
+			&:nth-child(2n){
+				margin-right: 0;
+			}
+			.item-img-gg{
+				width: 339rpx;
+				height: 516rpx;
+				display: block;
+				border-radius: 16rpx;
+			}
+			.item-img{
+				width: 339rpx;
+				height: 339rpx;
+				border-radius: 16rpx 16rpx 0 0;
+				display: block;
+				margin-bottom: 8rpx;
+			}
+			.floor-item_tag{
+				width: 100%;
+				height: 32rpx;
+				float: left;
+				margin: 20rpx 0;
+				padding: 0 20rpx;
+				box-sizing: border-box;
+				text{
+					display: inline-block;
+					padding: 0 8rpx;
+					border: 1px solid #e3ebf7;
+					border-radius: 8rpx ;
+					color: #9aa5b5;
+					font-size: $font-size-22;
+					line-height: 32rpx;
+					text-align: center;
+					float: left;
+				}
+			}
+			.floor-item-content{
+				width: 100%;
+				padding: 0 20rpx;
+				box-sizing: border-box;
+			}
+			.floor-item-act{
+				display: block;
+				width: 100%;
+				height: 32rpx;
+				text-align: center;
+				box-sizing: border-box;
+			}
+			.floor-tags{
+				height: 28rpx;
+				border-radius: 6rpx;
+				background-color: #FFFFFF;
+				line-height: 28rpx;
+				color: $color-system;
+				text-align: center;
+				display: inline-block;
+				padding:0 16rpx;
+				font-size: $font-size-20;
+				border: 1px solid #E15616;
+				float: left;
+			}
+			.title-none{
+				font-size: $font-size-26;
+				color: #FF2A2A;
+				line-height: 54rpx;
+			}
+			.title{
+				width: 100%;
+				height: 70rpx;
+				display: flex;
+				line-height: 35rpx;
+				flex-direction: column;
+				margin: 8rpx 0;
+				padding: 0;
+				position: relative;
+				.mclap{
+					width: 100%;
+					line-height:35rpx;
+					text-overflow:ellipsis;
+					display: -webkit-box;
+					word-break: break-all;
+					-webkit-box-orient: vertical;
+					-webkit-line-clamp: 2;
+					overflow: hidden;
+					font-size: 26rpx;
+					&.indent{
+						text-indent: 95rpx;
+					}
+				}
+				.mclap-tag{
+					display: block;
+					width: 84rpx;
+					height: 32rpx;
+					background-image: linear-gradient(270deg, #f9c023 0%, #f83600 100%);
+					border-radius: 4rpx 48rpx 4px 4px;
+					line-height: 32rpx;
+					font-size: $font-size-22;
+					color: #FFFFFF;
+					text-align: center;
+					position: absolute;
+					left: 0;
+					top: 0;
+				}
+			}
+			.no-price{
+				height: 54rpx;
+				line-height: 54rpx;
+				display: flex;
+				box-sizing: border-box;
+				.p-no{
+					font-size: $font-size-28;
+					color: $text-color;
+					display: block;
+					float: left;
+				}
+				.p-stars{
+					float: left;
+				}
+			}
+			.price{
+				color: #FF2A2A;
+				line-height:54rpx;
+				&.none{
+					text-decoration: line-through;
+					color: #999999;
+				}
+				.sm{
+					font-size: $font-size-24;
+				}
+				.big{
+					font-size: $font-size-28;
+				}
+			}
+		}
+	}
+</style>

+ 359 - 0
components/cm-module/pageFloorTemplate/templateB.vue

@@ -0,0 +1,359 @@
+<template>
+	<view class="section_page_main clearfix">
+		<view class="floor-item ad_02">
+			<image  class="item-img-gg" 
+					:src="floorData.floorContent.appletsAdsImage1" 
+					@click="BannerNavigateTo(
+						floorData.floorContent.linkType1,
+						floorData.floorContent.linkParam1.id ? floorData.floorContent.linkParam1.id : '',
+						floorData.floorContent.adsLink1,
+						floorData.floorContent.linkParam1.keyword ? floorData.floorContent.linkParam1.keyword : ''
+					)"
+					mode="aspectFill">
+			</image>
+		</view>
+		<view class="floor-item ad_02">
+			<image 	class="item-img-gg" 
+					:src="floorData.floorContent.appletsAdsImage2" 
+					@click="BannerNavigateTo(
+						floorData.floorContent.linkType2,
+						floorData.floorContent.linkParam2.id ? floorData.floorContent.linkParam2.id : '',
+						floorData.floorContent.adsLink2,
+						floorData.floorContent.linkParam2.keyword ? floorData.floorContent.linkParam2.keyword : ''
+					)"
+					mode="aspectFill">
+			</image>
+		</view>
+		<view class="floor-item ad_04 clearfix" v-for="(item, idx) in floorData.floorImageList" :key="idx" @click.stop="navToDetailPage(item)">
+			<image class="item-img tui-skeleton-fillet" :src="item.image" mode="aspectFill"></image>
+			<view class="floor-item_tag" v-if="item.listType == 2">
+				<text>{{ item.label }}</text>
+			</view>
+			<view class="floor-item-content">
+				<view class="title tui-skeleton-rect">
+					<text class="mclap-tag" v-if="item.product.beautyActFlag == '1'">美博会</text>
+					<text class="mclap" :class="item.product.beautyActFlag == '1' ? 'indent' : ''">{{item.name}} </text>
+				</view>
+				<view class="floor-item-price" v-if="item.listType == 1">
+					<view class="floor-item-act">
+						<template v-if="userIdentity === 3">
+							<template v-if="item.product.actStatus===1">
+								<view class="floor-tags" v-if="PromotionsFormat(item.product.promotions)">
+									{{item.product.promotions.name}}
+									<text v-if="hasLogin && item.product.price1TextFlag != 1 && item.product.shopID == shopId">:¥{{item.product.retailPrice | NumFormat}}</text>
+								</view>
+								<view class="floor-tags" v-else>{{item.product.promotions.name}}</view>	
+							</template>
+							<template v-if="item.product.actStatus ===0  &&  item.product.ladderPriceFlag===1">
+								<view class="floor-tags">阶梯价格</view>	
+							</template>
+						</template>	
+						<template v-else>
+							<template v-if="item.product.actStatus===1">
+								<view class="floor-tags" v-if="PromotionsFormat(item.product.promotions)">
+									{{item.product.promotions.name}}
+									<text v-if="hasLogin && item.product.price1TextFlag != 1">:¥{{item.product.retailPrice | NumFormat}}</text>
+								</view>
+								<view class="floor-tags" v-else>{{item.product.promotions.name}}</view>	
+							</template>
+							<template v-if="item.product.actStatus ===0  &&  item.product.ladderPriceFlag===1">
+								<view class="floor-tags">阶梯价格</view>	
+							</template>
+						</template>
+					</view>	
+					<view v-if="hasLogin">
+						<template v-if="item.product.productCategory == 1">
+							<template v-if="userIdentity == 3">
+								<template v-if="item.product.shopID == shopId">
+									<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+										<text class="p big">¥未公开价格</text>
+									</view>
+									<view class="price tui-skeleton-rect" v-else :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+										<text class="p sm">¥</text>
+										<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+									</view>
+								</template>	
+								<template v-else>
+									<view class="no-price">
+										<view class="p-stars">
+											<text class="p-no">¥</text>
+											<uni-grader :grade="Number(item.product.price1Grade)" :margin="14"></uni-grader>
+										</view>
+									</view>	
+								</template>
+							</template>
+							<template v-else-if="userIdentity ===4">
+								<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+									<text class="p big">¥未公开价格</text>
+								</view>
+								<view class="title-none"  v-if="item.product.price1TextFlag === '2'">
+									<text class="p big">¥价格仅会员可见</text>
+								</view>
+								<view class="price tui-skeleton-rect" v-if="item.product.price1TextFlag === '0'" :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+									<text class="p sm">¥</text>
+									<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+								</view>
+							</template>
+							<template v-else>
+								<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+									<text class="p big">¥未公开价格</text>
+								</view>
+								<view class="price tui-skeleton-rect" v-else :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+									<text class="p sm">¥</text>
+									<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+								</view>
+							</template>
+						</template>	
+						<template v-else>
+							<view class="price tui-skeleton-rect" v-if="item.product.detailTalkFlag == '2'">
+								<text class="p sm">¥</text>
+								<text class="p big">价格详聊</text>
+							</view>
+							<view class="price tui-skeleton-rect" v-else>
+								<text class="p sm">¥</text>
+								<text class="p big">{{ item.product.retailPrice | NumFormat }}</text>
+							</view>
+						</template>
+					</view>
+					<view v-else class="no-price">
+						<template v-if="item.product.productCategory == 1">
+							<view class="p-stars">
+								<text class="p-no">¥</text>
+								<uni-grader :grade="Number(item.product.price1Grade)" :margin="14"></uni-grader>
+							</view>
+						</template>
+						<template v-else>
+							<view class="p-stars">
+								<text class="p-no">¥登录可见</text>
+							</view>
+						</template>
+					</view>	
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import { mapState,mapMutations} from 'vuex';
+	import uniGrader from '@/components/uni-grade/uni-grade.vue'
+	export default{
+		name:"templateB",
+		components:{
+			uniGrader
+		},
+		props:{
+			pageData:{
+				type:Object
+			},
+			userIdentity:{
+				type:Number
+			}
+		},
+		data() {
+			return{
+				shopId:0,
+				floorData:{}
+			}
+		},
+		filters: {
+			NumFormat:function(text) {//处理金额				
+				return Number(text).toFixed(2);			
+			},		
+		},
+		created(){
+			this.initData(this.pageData)
+		},
+		computed: {
+			...mapState(['hasLogin','userInfo','isActivity'])
+		},
+		watch: {
+			pageData: {
+				handler: function (el) {//监听对象的变换使用 function,箭头函数容易出现this指向不正确
+					this.pageData = el
+					this.initData(this.pageData)
+				},
+				deep: true
+			}
+		},
+		methods:{
+			initData(data){
+				this.$api.getStorage().then((resolve) =>{
+					this.shopId = resolve.shopID ? resolve.shopID : 0
+				})
+				this.floorData = data
+				// console.log(this.floorData)
+			},
+			PromotionsFormat(promo){//促销活动类型数据处理
+				if(promo!=null){
+					if(promo.type == 1 && promo.mode == 1){
+						return true
+					}else{
+						return false
+					}
+				}
+				return false
+			},
+			navToDetailPage(pros) {//跳转商品详情页
+				this.$api.FlooryNavigateTo(pros)
+			},
+			BannerNavigateTo(linkType,linkId,linkHref,keyword) {//跳转商品详情页
+				this.$api.BannerNavigateTo(linkType,linkId,linkHref,keyword)
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.section_page_main{
+		width: 100%;
+		height: auto;
+		box-sizing: border-box;
+		.floor-item{
+			width: 339rpx;
+			height: 516rpx;
+			margin-right: 20rpx;
+			font-size: $font-size-24;
+			color: $text-color;
+			background: #FFFFFF;
+			line-height: 36rpx;
+			border-radius: 16rpx;
+			margin-bottom: 20rpx;
+			float: left;
+			box-sizing: border-box;
+			position: relative;
+			&:nth-child(2n){
+				margin-right: 0;
+			}
+			.item-img-gg{
+				width: 339rpx;
+				height: 516rpx;
+				display: block;
+				border-radius: 16rpx;
+			}
+			.item-img{
+				width: 339rpx;
+				height: 339rpx;
+				border-radius: 16rpx 16rpx 0 0;
+				display: block;
+				margin-bottom: 8rpx;
+			}
+			.floor-item_tag{
+				width: 100%;
+				height: 32rpx;
+				float: left;
+				margin: 20rpx 0;
+				padding: 0 20rpx;
+				box-sizing: border-box;
+				text{
+					display: inline-block;
+					padding: 0 8rpx;
+					border: 1px solid #e3ebf7;
+					border-radius: 8rpx ;
+					color: #9aa5b5;
+					font-size: $font-size-22;
+					line-height: 32rpx;
+					text-align: center;
+					float: left;
+				}
+			}
+			.floor-item-content{
+				width: 100%;
+				padding: 0 20rpx;
+				box-sizing: border-box;
+			}
+			.floor-item-act{
+				display: block;
+				width: 100%;
+				height: 32rpx;
+				text-align: center;
+				box-sizing: border-box;
+			}
+			.floor-tags{
+				height: 28rpx;
+				border-radius: 6rpx;
+				background-color: #FFFFFF;
+				line-height: 28rpx;
+				color: $color-system;
+				text-align: center;
+				display: inline-block;
+				padding:0 16rpx;
+				font-size: $font-size-20;
+				border: 1px solid #E15616;
+				float: left;
+			}
+			.title-none{
+				font-size: $font-size-26;
+				color: #FF2A2A;
+				line-height: 54rpx;
+			}
+			.title{
+				width: 100%;
+				height: 70rpx;
+				display: flex;
+				line-height: 35rpx;
+				flex-direction: column;
+				margin: 8rpx 0;
+				padding: 0;
+				position: relative;
+				.mclap{
+					width: 100%;
+					line-height:35rpx;
+					text-overflow:ellipsis;
+					display: -webkit-box;
+					word-break: break-all;
+					-webkit-box-orient: vertical;
+					-webkit-line-clamp: 2;
+					overflow: hidden;
+					font-size: 26rpx;
+					&.indent{
+						text-indent: 95rpx;
+					}
+				}
+				.mclap-tag{
+					display: block;
+					width: 84rpx;
+					height: 32rpx;
+					background-image: linear-gradient(270deg, #f9c023 0%, #f83600 100%);
+					border-radius: 4rpx 48rpx 4px 4px;
+					line-height: 32rpx;
+					font-size: $font-size-22;
+					color: #FFFFFF;
+					text-align: center;
+					position: absolute;
+					left: 0;
+					top: 0;
+				}
+			}
+			.no-price{
+				height: 54rpx;
+				line-height: 54rpx;
+				display: flex;
+				box-sizing: border-box;
+				.p-no{
+					font-size: $font-size-28;
+					color: $text-color;
+					display: block;
+					float: left;
+				}
+				.p-stars{
+					float: left;
+				}
+			}
+			.price{
+				color: #FF2A2A;
+				line-height:54rpx;
+				&.none{
+					text-decoration: line-through;
+					color: #999999;
+				}
+				.sm{
+					font-size: $font-size-24;
+				}
+				.big{
+					font-size: $font-size-28;
+				}
+			}
+		}
+	}
+</style>

+ 392 - 0
components/cm-module/pageFloorTemplate/templateC.vue

@@ -0,0 +1,392 @@
+<template>
+	<view class="section_page_main clearfix">
+		<view class="floor-item ad_01">
+			<image 	class="item-img-gg" 
+					:src="floorData.floorContent.appletsAdsImage1" 
+					@click="BannerNavigateTo(
+						floorData.floorContent.linkType1,
+						floorData.floorContent.linkParam1.id ? floorData.floorContent.linkParam1.id : '',
+						floorData.floorContent.adsLink1,
+						floorData.floorContent.linkParam1.keyword ? floorData.floorContent.linkParam1.keyword : ''
+					)"
+					mode="aspectFill">
+			</image>
+		</view>
+		<view class="floor-item ad_02">
+			<image 	class="item-img-gg" 
+					:src="floorData.floorContent.appletsAdsImage2" 
+					@click="BannerNavigateTo(
+						floorData.floorContent.linkType2,
+						floorData.floorContent.linkParam2.id ? floorData.floorContent.linkParam2.id : '',
+						floorData.floorContent.adsLink2,
+						floorData.floorContent.linkParam2.keyword ? floorData.floorContent.linkParam2.keyword : ''
+					)"
+					mode="aspectFill">
+			</image>
+		</view>
+		<view class="floor-item ad_04 clearfix" v-for="(item, idx) in floorData.floorImageList" :key="idx" @click.stop="navToDetailPage(item)">
+			<image class="item-img tui-skeleton-fillet" :src="item.image" mode="aspectFill"></image>
+			<view class="floor-item_tag" v-if="item.listType == 2">
+				<text>{{ item.label }}</text>
+			</view>
+			<view class="floor-item-content">
+				<view class="title tui-skeleton-rect">
+					<text class="mclap-tag" v-if="item.product.beautyActFlag == '1'">美博会</text>
+					<text class="mclap" :class="item.product.beautyActFlag == '1' ? 'indent' : ''">{{item.name}} </text>
+				</view>
+				<view class="floor-item-price" v-if="item.listType == 1">
+					<view class="floor-item-act">
+						<template v-if="userIdentity === 3">
+							<template v-if="item.product.actStatus===1">
+								<view class="floor-tags" v-if="PromotionsFormat(item.product.promotions)">
+									{{item.product.promotions.name}}
+									<text v-if="hasLogin && item.product.price1TextFlag != 1 && item.product.shopID == shopId">:¥{{item.product.retailPrice | NumFormat}}</text>
+								</view>
+								<view class="floor-tags" v-else>{{item.product.promotions.name}}</view>	
+							</template>
+							<template v-if="item.product.actStatus ===0  &&  item.product.ladderPriceFlag===1">
+								<view class="floor-tags">阶梯价格</view>	
+							</template>
+						</template>	
+						<template v-else>
+							<template v-if="item.product.actStatus===1">
+								<view class="floor-tags" v-if="PromotionsFormat(item.product.promotions)">
+									{{item.product.promotions.name}}
+									<text v-if="hasLogin && item.product.price1TextFlag != 1">:¥{{item.product.retailPrice | NumFormat}}</text>
+								</view>
+								<view class="floor-tags" v-else>{{item.product.promotions.name}}</view>	
+							</template>
+							<template v-if="item.product.actStatus ===0  &&  item.product.ladderPriceFlag===1">
+								<view class="floor-tags">阶梯价格</view>	
+							</template>
+						</template>
+					</view>	
+					<view v-if="hasLogin">
+						<template v-if="item.product.productCategory == 1">
+							<template v-if="userIdentity == 3">
+								<template v-if="item.product.shopID == shopId">
+									<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+										<text class="p big">¥未公开价格</text>
+									</view>
+									<view class="price tui-skeleton-rect" v-else :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+										<text class="p sm">¥</text>
+										<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+									</view>
+								</template>	
+								<template v-else>
+									<view class="no-price">
+										<view class="p-stars">
+											<text class="p-no">¥</text>
+											<uni-grader :grade="Number(item.product.price1Grade)" :margin="14"></uni-grader>
+										</view>
+									</view>	
+								</template>
+							</template>
+							<template v-else-if="userIdentity ===4">
+								<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+									<text class="p big">¥未公开价格</text>
+								</view>
+								<view class="title-none"  v-if="item.product.price1TextFlag === '2'">
+									<text class="p big">¥价格仅会员可见</text>
+								</view>
+								<view class="price tui-skeleton-rect" v-if="item.product.price1TextFlag === '0'" :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+									<text class="p sm">¥</text>
+									<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+								</view>
+							</template>
+							<template v-else>
+								<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+									<text class="p big">¥未公开价格</text>
+								</view>
+								<view class="price tui-skeleton-rect" v-else :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+									<text class="p sm">¥</text>
+									<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+								</view>
+							</template>
+						</template>	
+						<template v-else>
+							<view class="price tui-skeleton-rect" v-if="item.product.detailTalkFlag == '2'">
+								<text class="p sm">¥</text>
+								<text class="p big">价格详聊</text>
+							</view>
+							<view class="price tui-skeleton-rect" v-else>
+								<text class="p sm">¥</text>
+								<text class="p big">{{ item.product.retailPrice | NumFormat }}</text>
+							</view>
+						</template>
+					</view>
+					<view v-else class="no-price">
+						<template v-if="item.product.productCategory == 1">
+							<view class="p-stars">
+								<text class="p-no">¥</text>
+								<uni-grader :grade="Number(item.product.price1Grade)" :margin="14"></uni-grader>
+							</view>
+						</template>
+						<template v-else>
+							<view class="p-stars">
+								<text class="p-no">¥登录可见</text>
+							</view>
+						</template>
+					</view>	
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import { mapState,mapMutations} from 'vuex';
+	import uniGrader from '@/components/uni-grade/uni-grade.vue'
+	export default{
+		name:"templateC",
+		components:{
+			uniGrader
+		},
+		props:{
+			pageData:{
+				type:Object
+			},
+			userIdentity:{
+				type:Number
+			}
+		},
+		data() {
+			return{
+				shopId:0,
+				floorData:{}
+			}
+		},
+		filters: {
+			NumFormat:function(text) {//处理金额				
+				return Number(text).toFixed(2);			
+			},		
+		},
+		created(){
+			this.initData(this.pageData)
+		},
+		computed: {
+			...mapState(['hasLogin','userInfo','isActivity'])
+		},
+		watch: {
+			pageData: {
+				handler: function (el) {//监听对象的变换使用 function,箭头函数容易出现this指向不正确
+					this.pageData = el
+					this.initData(this.pageData)
+				},
+				deep: true
+			}
+		},
+		methods:{
+			initData(data){
+				this.$api.getStorage().then((resolve) =>{
+					this.shopId = resolve.shopID ? resolve.shopID : 0
+				})
+				this.floorData = data
+				// console.log(this.floorData)
+			},
+			PromotionsFormat(promo){//促销活动类型数据处理
+				if(promo!=null){
+					if(promo.type == 1 && promo.mode == 1){
+						return true
+					}else{
+						return false
+					}
+				}
+				return false
+			},
+			navToDetailPage(pros) {//跳转商品详情页
+				this.$api.FlooryNavigateTo(pros)
+			},
+			BannerNavigateTo(linkType,linkId,linkHref,keyword) {//跳转商品详情页
+				this.$api.BannerNavigateTo(linkType,linkId,linkHref,keyword)
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.section_page_main{
+		width: 100%;
+		height: auto;
+		box-sizing: border-box;
+		.floor-item{
+			width: 339rpx;
+			height: 516rpx;
+			margin-right: 20rpx;
+			font-size: $font-size-24;
+			color: $text-color;
+			background: #FFFFFF;
+			line-height: 36rpx;
+			border-radius: 16rpx;
+			margin-bottom: 20rpx;
+			float: left;
+			box-sizing: border-box;
+			position: relative;
+			&.ad_01{
+				width: 100%;
+				height: 240rpx;
+				.item-img-gg{
+					width: 100%;
+					height: 240rpx;
+					display: block;
+					border-radius: 16rpx;
+				}
+			}
+			&.ad_02{
+				margin-right: 20rpx;
+			}	
+			&:nth-child(odd){
+				margin-right: 0;
+			}
+			.item-img-gg{
+				width: 339rpx;
+				height: 516rpx;
+				display: block;
+				border-radius: 16rpx;
+			}
+			.item-img{
+				width: 339rpx;
+				height: 339rpx;
+				border-radius: 16rpx 16rpx 0 0;
+				display: block;
+				margin-bottom: 8rpx;
+			}
+			.floor-item_tag{
+				width: 100%;
+				height: 32rpx;
+				float: left;
+				margin: 20rpx 0;
+				padding: 0 20rpx;
+				box-sizing: border-box;
+				text{
+					display: inline-block;
+					padding: 0 8rpx;
+					border: 1px solid #e3ebf7;
+					border-radius: 8rpx ;
+					color: #9aa5b5;
+					font-size: $font-size-22;
+					line-height: 32rpx;
+					text-align: center;
+					float: left;
+				}
+			}
+			.floor-item_tag{
+				width: 100%;
+				height: 32rpx;
+				float: left;
+				margin: 8rpx 0;
+				padding: 0 20rpx;
+				box-sizing: border-box;
+				margin-bottom: 20rpx;
+				text{
+					display: inline-block;
+					padding: 0 8rpx;
+					border: 1px solid #e3ebf7;
+					border-radius: 8rpx ;
+					color: #9aa5b5;
+					font-size: $font-size-22;
+					line-height: 32rpx;
+					text-align: center;
+					float: left;
+				}
+			}
+			.floor-item-content{
+				width: 100%;
+				padding: 0 20rpx;
+				box-sizing: border-box;
+			}
+			.floor-item-act{
+				display: block;
+				width: 100%;
+				height: 32rpx;
+				text-align: center;
+				box-sizing: border-box;
+			}
+			.floor-tags{
+				height: 28rpx;
+				border-radius: 6rpx;
+				background-color: #FFFFFF;
+				line-height: 28rpx;
+				color: $color-system;
+				text-align: center;
+				display: inline-block;
+				padding:0 16rpx;
+				font-size: $font-size-20;
+				border: 1px solid #E15616;
+				float: left;
+			}
+			.title-none{
+				font-size: $font-size-26;
+				color: #FF2A2A;
+				line-height: 54rpx;
+			}
+			.title{
+				width: 100%;
+				height: 70rpx;
+				display: flex;
+				line-height: 35rpx;
+				flex-direction: column;
+				margin: 8rpx 0;
+				padding: 0;
+				position: relative;
+				.mclap{
+					width: 100%;
+					line-height:35rpx;
+					text-overflow:ellipsis;
+					display: -webkit-box;
+					word-break: break-all;
+					-webkit-box-orient: vertical;
+					-webkit-line-clamp: 2;
+					overflow: hidden;
+					font-size: 26rpx;
+					&.indent{
+						text-indent: 95rpx;
+					}
+				}
+				.mclap-tag{
+					display: block;
+					width: 84rpx;
+					height: 32rpx;
+					background-image: linear-gradient(270deg, #f9c023 0%, #f83600 100%);
+					border-radius: 4rpx 48rpx 4px 4px;
+					line-height: 32rpx;
+					font-size: $font-size-22;
+					color: #FFFFFF;
+					text-align: center;
+					position: absolute;
+					left: 0;
+					top: 0;
+				}
+			}
+			.no-price{
+				height: 54rpx;
+				line-height: 54rpx;
+				display: flex;
+				box-sizing: border-box;
+				.p-no{
+					font-size: $font-size-28;
+					color: $text-color;
+					display: block;
+					float: left;
+				}
+				.p-stars{
+					float: left;
+				}
+			}
+			.price{
+				color: #FF2A2A;
+				line-height:54rpx;
+				&.none{
+					text-decoration: line-through;
+					color: #999999;
+				}
+				.sm{
+					font-size: $font-size-24;
+				}
+				.big{
+					font-size: $font-size-28;
+				}
+			}
+		}
+	}
+</style>

+ 382 - 0
components/cm-module/pageFloorTemplate/templateD.vue

@@ -0,0 +1,382 @@
+<template>
+	<view class="section_page_main clearfix">
+		<view class="floor-item ad_01">
+			<image 	class="item-img-gg" 
+					:src="floorData.floorContent.appletsAdsImage1" 
+					@click="BannerNavigateTo(
+						floorData.floorContent.linkType1,
+						floorData.floorContent.linkParam1.id ? floorData.floorContent.linkParam1.id : '',
+						floorData.floorContent.adsLink1,
+						floorData.floorContent.linkParam1.keyword ? floorData.floorContent.linkParam1.keyword : ''
+					)"
+					mode="aspectFill">
+			</image>
+		</view>
+		<view class="floor-item ad_02">
+			<image 	class="item-img-gg" 
+					:src="floorData.floorContent.appletsAdsImage2" 
+					@click="BannerNavigateTo(
+						floorData.floorContent.linkType2,
+						floorData.floorContent.linkParam2.id ? floorData.floorContent.linkParam2.id : '',
+						floorData.floorContent.adsLink2,
+						floorData.floorContent.linkParam2.keyword ? floorData.floorContent.linkParam2.keyword : ''
+					)"
+					mode="aspectFill">
+			</image>
+		</view>
+		<view class="floor-item ad_03">
+			<image 	class="item-img-gg" 
+					:src="floorData.floorContent.appletsAdsImage3" 
+					@click="BannerNavigateTo(
+						floorData.floorContent.linkType3,
+						floorData.floorContent.linkParam3.id ? floorData.floorContent.linkParam3.id : '',
+						floorData.floorContent.adsLink3,
+						floorData.floorContent.linkParam3.keyword ? floorData.floorContent.linkParam3.keyword : ''
+					)"
+					mode="aspectFill">
+			</image>
+		</view>
+		<view class="floor-item ad_04 clearfix" v-for="(item, idx) in floorData.floorImageList" :key="idx" @click.stop="navToDetailPage(item)">
+			<image class="item-img tui-skeleton-fillet" :src="item.image" mode="aspectFill"></image>
+			<view class="floor-item_tag" v-if="item.listType == 2">
+				<text>{{ item.label }}</text>
+			</view>
+			<view class="floor-item-content">
+				<view class="title tui-skeleton-rect">
+					<text class="mclap-tag" v-if="item.product.beautyActFlag == '1'">美博会</text>
+					<text class="mclap" :class="item.product.beautyActFlag == '1' ? 'indent' : ''">{{item.name}} </text>
+				</view>
+				<view class="floor-item-price" v-if="item.listType == 1">
+					<view class="floor-item-act">
+						<template v-if="userIdentity === 3">
+							<template v-if="item.product.actStatus===1">
+								<view class="floor-tags" v-if="PromotionsFormat(item.product.promotions)">
+									{{item.product.promotions.name}}
+									<text v-if="hasLogin && item.product.price1TextFlag != 1 && item.product.shopID == shopId">:¥{{item.product.retailPrice | NumFormat}}</text>
+								</view>
+								<view class="floor-tags" v-else>{{item.product.promotions.name}}</view>	
+							</template>
+							<template v-if="item.product.actStatus ===0  &&  item.product.ladderPriceFlag===1">
+								<view class="floor-tags">阶梯价格</view>	
+							</template>
+						</template>	
+						<template v-else>
+							<template v-if="item.product.actStatus===1">
+								<view class="floor-tags" v-if="PromotionsFormat(item.product.promotions)">
+									{{item.product.promotions.name}}
+									<text v-if="hasLogin && item.product.price1TextFlag != 1">:¥{{item.product.retailPrice | NumFormat}}</text>
+								</view>
+								<view class="floor-tags" v-else>{{item.product.promotions.name}}</view>	
+							</template>
+							<template v-if="item.product.actStatus ===0  &&  item.product.ladderPriceFlag===1">
+								<view class="floor-tags">阶梯价格</view>	
+							</template>
+						</template>
+					</view>	
+					<view v-if="hasLogin">
+						<template v-if="item.product.productCategory == 1">
+							<template v-if="userIdentity == 3">
+								<template v-if="item.product.shopID == shopId">
+									<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+										<text class="p big">¥未公开价格</text>
+									</view>
+									<view class="price tui-skeleton-rect" v-else :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+										<text class="p sm">¥</text>
+										<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+									</view>
+								</template>	
+								<template v-else>
+									<view class="no-price">
+										<view class="p-stars">
+											<text class="p-no">¥</text>
+											<uni-grader :grade="Number(item.product.price1Grade)" :margin="14"></uni-grader>
+										</view>
+									</view>	
+								</template>
+							</template>
+							<template v-else-if="userIdentity ===4">
+								<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+									<text class="p big">¥未公开价格</text>
+								</view>
+								<view class="title-none"  v-if="item.product.price1TextFlag === '2'">
+									<text class="p big">¥价格仅会员可见</text>
+								</view>
+								<view class="price tui-skeleton-rect" v-if="item.product.price1TextFlag === '0'" :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+									<text class="p sm">¥</text>
+									<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+								</view>
+							</template>
+							<template v-else>
+								<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+									<text class="p big">¥未公开价格</text>
+								</view>
+								<view class="price tui-skeleton-rect" v-else :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+									<text class="p sm">¥</text>
+									<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+								</view>
+							</template>
+						</template>	
+						<template v-else>
+							<view class="price tui-skeleton-rect" v-if="item.product.detailTalkFlag == '2'">
+								<text class="p sm">¥</text>
+								<text class="p big">价格详聊</text>
+							</view>
+							<view class="price tui-skeleton-rect" v-else>
+								<text class="p sm">¥</text>
+								<text class="p big">{{ item.product.retailPrice | NumFormat }}</text>
+							</view>
+						</template>
+					</view>
+					<view v-else class="no-price">
+						<template v-if="item.product.productCategory == 1">
+							<view class="p-stars">
+								<text class="p-no">¥</text>
+								<uni-grader :grade="Number(item.product.price1Grade)" :margin="14"></uni-grader>
+							</view>
+						</template>
+						<template v-else>
+							<view class="p-stars">
+								<text class="p-no">¥登录可见</text>
+							</view>
+						</template>
+					</view>	
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import { mapState,mapMutations} from 'vuex';
+	import uniGrader from '@/components/uni-grade/uni-grade.vue'
+	export default{
+		name:"templateD",
+		components:{
+			uniGrader
+		},
+		props:{
+			pageData:{
+				type:Object
+			},
+			userIdentity:{
+				type:Number
+			}
+		},
+		data() {
+			return{
+				shopId:0,
+				floorData:{}
+			}
+		},
+		filters: {
+			NumFormat:function(text) {//处理金额				
+				return Number(text).toFixed(2);			
+			},		
+		},
+		created(){
+			this.initData(this.pageData)
+		},
+		computed: {
+			...mapState(['hasLogin','userInfo','isActivity'])
+		},
+		watch: {
+			pageData: {
+				handler: function (el) {//监听对象的变换使用 function,箭头函数容易出现this指向不正确
+					this.pageData = el
+					this.initData(this.pageData)
+				},
+				deep: true
+			}
+		},
+		methods:{
+			initData(data){
+				this.$api.getStorage().then((resolve) =>{
+					this.shopId = resolve.shopID ? resolve.shopID : 0
+				})
+				this.floorData = data
+				// console.log(this.floorData)
+			},
+			PromotionsFormat(promo){//促销活动类型数据处理
+				if(promo!=null){
+					if(promo.type == 1 && promo.mode == 1){
+						return true
+					}else{
+						return false
+					}
+				}
+				return false
+			},
+			navToDetailPage(pros) {//跳转商品详情页
+				this.$api.FlooryNavigateTo(pros)
+			},
+			BannerNavigateTo(linkType,linkId,linkHref,keyword) {//跳转商品详情页
+				this.$api.BannerNavigateTo(linkType,linkId,linkHref,keyword)
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.section_page_main{
+		width: 100%;
+		height: auto;
+		box-sizing: border-box;
+		.floor-item{
+			width: 339rpx;
+			height: 516rpx;
+			margin-right: 20rpx;
+			font-size: $font-size-24;
+			color: $text-color;
+			background: #FFFFFF;
+			line-height: 36rpx;
+			border-radius: 16rpx;
+			margin-bottom: 20rpx;
+			float: left;
+			box-sizing: border-box;
+			position: relative;
+			&.ad_01{
+				width: 100%;
+				height: 240rpx;
+				margin-right: 0;
+				.item-img-gg{
+					width: 100%;
+					height: 240rpx;
+					display: block;
+					border-radius: 16rpx;
+				}
+			}
+			&:nth-child(odd){
+				margin-right: 0;
+			}
+			.item-img-gg{
+				width: 339rpx;
+				height: 516rpx;
+				display: block;
+				border-radius: 16rpx;
+			}
+			.item-img{
+				width: 339rpx;
+				height: 339rpx;
+				border-radius: 16rpx 16rpx 0 0;
+				display: block;
+				margin-bottom: 8rpx;
+			}
+			.floor-item_tag{
+				width: 100%;
+				height: 32rpx;
+				float: left;
+				margin: 20rpx 0;
+				padding: 0 20rpx;
+				box-sizing: border-box;
+				text{
+					display: inline-block;
+					padding: 0 8rpx;
+					border: 1px solid #e3ebf7;
+					border-radius: 8rpx ;
+					color: #9aa5b5;
+					font-size: $font-size-22;
+					line-height: 32rpx;
+					text-align: center;
+					float: left;
+				}
+			}
+			.floor-item-content{
+				width: 100%;
+				padding: 0 20rpx;
+				box-sizing: border-box;
+			}
+			.floor-item-act{
+				display: block;
+				width: 100%;
+				height: 32rpx;
+				text-align: center;
+				box-sizing: border-box;
+			}
+			.floor-tags{
+				height: 28rpx;
+				border-radius: 6rpx;
+				background-color: #FFFFFF;
+				line-height: 28rpx;
+				color: $color-system;
+				text-align: center;
+				display: inline-block;
+				padding:0 16rpx;
+				font-size: $font-size-20;
+				border: 1px solid #E15616;
+				float: left;
+			}
+			.title-none{
+				font-size: $font-size-26;
+				color: #FF2A2A;
+				line-height: 54rpx;
+			}
+			.title{
+				width: 100%;
+				height: 70rpx;
+				display: flex;
+				line-height: 35rpx;
+				flex-direction: column;
+				margin: 8rpx 0;
+				padding: 0;
+				position: relative;
+				.mclap{
+					width: 100%;
+					line-height:35rpx;
+					text-overflow:ellipsis;
+					display: -webkit-box;
+					word-break: break-all;
+					-webkit-box-orient: vertical;
+					-webkit-line-clamp: 2;
+					overflow: hidden;
+					font-size: 26rpx;
+					&.indent{
+						text-indent: 95rpx;
+					}
+				}
+				.mclap-tag{
+					display: block;
+					width: 84rpx;
+					height: 32rpx;
+					background-image: linear-gradient(270deg, #f9c023 0%, #f83600 100%);
+					border-radius: 4rpx 48rpx 4px 4px;
+					line-height: 32rpx;
+					font-size: $font-size-22;
+					color: #FFFFFF;
+					text-align: center;
+					position: absolute;
+					left: 0;
+					top: 0;
+				}
+			}
+			.no-price{
+				height: 54rpx;
+				line-height: 54rpx;
+				display: flex;
+				box-sizing: border-box;
+				.p-no{
+					font-size: $font-size-28;
+					color: $text-color;
+					display: block;
+					float: left;
+				}
+				.p-stars{
+					float: left;
+				}
+			}
+			.price{
+				color: #FF2A2A;
+				line-height:54rpx;
+				&.none{
+					text-decoration: line-through;
+					color: #999999;
+				}
+				.sm{
+					font-size: $font-size-24;
+				}
+				.big{
+					font-size: $font-size-28;
+				}
+			}
+		}
+	}
+</style>

+ 360 - 0
components/cm-module/pageFloorTemplate/templateE.vue

@@ -0,0 +1,360 @@
+<template>
+	<view class="section_page_main clearfix">
+		<view class="floor-item ad_01">
+			<image 	class="item-img-gg" 
+					:src="floorData.floorContent.appletsAdsImage1" 
+					@click="BannerNavigateTo(
+						floorData.floorContent.linkType1,
+						floorData.floorContent.linkParam1.id ? floorData.floorContent.linkParam1.id : '',
+						floorData.floorContent.adsLink1,
+						floorData.floorContent.linkParam1.keyword ? floorData.floorContent.linkParam1.keyword : ''
+					)"
+					mode="aspectFill">
+			</image>
+		</view>
+		<view class="floor-item ad_04 clearfix" v-for="(item, idx) in floorData.floorImageList" :key="idx" @click.stop="navToDetailPage(item)">
+			<image class="item-img tui-skeleton-fillet" :src="item.image" mode="aspectFill"></image>
+			<view class="floor-item_tag" v-if="item.listType == 2">
+				<text>{{ item.label }}</text>
+			</view>
+			<view class="floor-item-content">
+				<view class="title tui-skeleton-rect">
+					<text class="mclap-tag" v-if="item.product.beautyActFlag == '1'">美博会</text>
+					<text class="mclap" :class="item.product.beautyActFlag == '1' ? 'indent' : ''">{{item.name}} </text>
+				</view>
+				<view class="floor-item-price" v-if="item.listType == 1">
+					<view class="floor-item-act">
+						<template v-if="userIdentity === 3">
+							<template v-if="item.product.actStatus===1">
+								<view class="floor-tags" v-if="PromotionsFormat(item.product.promotions)">
+									{{item.product.promotions.name}}
+									<text v-if="hasLogin && item.product.price1TextFlag != 1 && item.product.shopID == shopId">:¥{{item.product.retailPrice | NumFormat}}</text>
+								</view>
+								<view class="floor-tags" v-else>{{item.product.promotions.name}}</view>	
+							</template>
+							<template v-if="item.product.actStatus ===0  &&  item.product.ladderPriceFlag===1">
+								<view class="floor-tags">阶梯价格</view>	
+							</template>
+						</template>	
+						<template v-else>
+							<template v-if="item.product.actStatus===1">
+								<view class="floor-tags" v-if="PromotionsFormat(item.product.promotions)">
+									{{item.product.promotions.name}}
+									<text v-if="hasLogin && item.product.price1TextFlag != 1">:¥{{item.product.retailPrice | NumFormat}}</text>
+								</view>
+								<view class="floor-tags" v-else>{{item.product.promotions.name}}</view>	
+							</template>
+							<template v-if="item.product.actStatus ===0  &&  item.product.ladderPriceFlag===1">
+								<view class="floor-tags">阶梯价格</view>	
+							</template>
+						</template>
+					</view>	
+					<view v-if="hasLogin">
+						<template v-if="item.product.productCategory == 1">
+							<template v-if="userIdentity == 3">
+								<template v-if="item.product.shopID == shopId">
+									<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+										<text class="p big">¥未公开价格</text>
+									</view>
+									<view class="price tui-skeleton-rect" v-else :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+										<text class="p sm">¥</text>
+										<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+									</view>
+								</template>	
+								<template v-else>
+									<view class="no-price">
+										<view class="p-stars">
+											<text class="p-no">¥</text>
+											<uni-grader :grade="Number(item.product.price1Grade)" :margin="14"></uni-grader>
+										</view>
+									</view>	
+								</template>
+							</template>
+							<template v-else-if="userIdentity ===4">
+								<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+									<text class="p big">¥未公开价格</text>
+								</view>
+								<view class="title-none"  v-if="item.product.price1TextFlag === '2'">
+									<text class="p big">¥价格仅会员可见</text>
+								</view>
+								<view class="price tui-skeleton-rect" v-if="item.product.price1TextFlag === '0'" :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+									<text class="p sm">¥</text>
+									<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+								</view>
+							</template>
+							<template v-else>
+								<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+									<text class="p big">¥未公开价格</text>
+								</view>
+								<view class="price tui-skeleton-rect" v-else :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+									<text class="p sm">¥</text>
+									<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+								</view>
+							</template>
+						</template>	
+						<template v-else>
+							<view class="price tui-skeleton-rect" v-if="item.product.detailTalkFlag == '2'">
+								<text class="p sm">¥</text>
+								<text class="p big">价格详聊</text>
+							</view>
+							<view class="price tui-skeleton-rect" v-else>
+								<text class="p sm">¥</text>
+								<text class="p big">{{ item.product.retailPrice | NumFormat }}</text>
+							</view>
+						</template>
+					</view>
+					<view v-else class="no-price">
+						<template v-if="item.product.productCategory == 1">
+							<view class="p-stars">
+								<text class="p-no">¥</text>
+								<uni-grader :grade="Number(item.product.price1Grade)" :margin="14"></uni-grader>
+							</view>
+						</template>
+						<template v-else>
+							<view class="p-stars">
+								<text class="p-no">¥登录可见</text>
+							</view>
+						</template>
+					</view>	
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import { mapState,mapMutations} from 'vuex';
+	import uniGrader from '@/components/uni-grade/uni-grade.vue'
+	export default{
+		name:"templateE",
+		components:{
+			uniGrader
+		},
+		props:{
+			pageData:{
+				type:Object
+			},
+			userIdentity:{
+				type:Number
+			}
+		},
+		data() {
+			return{
+				shopId:0,
+				floorData:{}
+			}
+		},
+		filters: {
+			NumFormat:function(text) {//处理金额				
+				return Number(text).toFixed(2);			
+			},		
+		},
+		created(){
+			this.initData(this.pageData)
+		},
+		computed: {
+			...mapState(['hasLogin','userInfo','isActivity'])
+		},
+		watch: {
+			pageData: {
+				handler: function (el) {//监听对象的变换使用 function,箭头函数容易出现this指向不正确
+					this.pageData = el
+					this.initData(this.pageData)
+				},
+				deep: true
+			}
+		},
+		methods:{
+			initData(data){
+				this.$api.getStorage().then((resolve) =>{
+					this.shopId = resolve.shopID ? resolve.shopID : 0
+				})
+				this.floorData = data
+				// console.log(this.floorData)
+			},
+			PromotionsFormat(promo){//促销活动类型数据处理
+				if(promo!=null){
+					if(promo.type == 1 && promo.mode == 1){
+						return true
+					}else{
+						return false
+					}
+				}
+				return false
+			},
+			navToDetailPage(pros) {//跳转商品详情页
+				this.$api.FlooryNavigateTo(pros)
+			},
+			BannerNavigateTo(linkType,linkId,linkHref,keyword) {//跳转商品详情页
+				this.$api.BannerNavigateTo(linkType,linkId,linkHref,keyword)
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.section_page_main{
+		width: 100%;
+		height: auto;
+		box-sizing: border-box;
+		.floor-item{
+			width: 339rpx;
+			height: 516rpx;
+			margin-right: 20rpx;
+			font-size: $font-size-24;
+			color: $text-color;
+			background: #FFFFFF;
+			line-height: 36rpx;
+			border-radius: 16rpx;
+			margin-bottom: 20rpx;
+			float: left;
+			box-sizing: border-box;
+			position: relative;
+			&.ad_01{
+				width: 100%;
+				height: 240rpx;
+				.item-img-gg{
+					width: 100%;
+					height: 240rpx;
+					display: block;
+					border-radius: 16rpx;
+				}
+			}
+			&.ad_02{
+				margin-right: 20rpx;
+			}	
+			&:nth-child(odd){
+				margin-right: 0;
+			}
+			.item-img-gg{
+				width: 339rpx;
+				height: 516rpx;
+				display: block;
+				border-radius: 16rpx;
+			}
+			.item-img{
+				width: 339rpx;
+				height: 339rpx;
+				border-radius: 16rpx 16rpx 0 0;
+				display: block;
+				margin-bottom: 8rpx;
+			}
+			.floor-item_tag{
+				width: 100%;
+				height: 32rpx;
+				float: left;
+				margin: 20rpx 0;
+				padding: 0 20rpx;
+				box-sizing: border-box;
+				text{
+					display: inline-block;
+					padding: 0 8rpx;
+					border: 1px solid #e3ebf7;
+					border-radius: 8rpx ;
+					color: #9aa5b5;
+					font-size: $font-size-22;
+					line-height: 32rpx;
+					text-align: center;
+					float: left;
+				}
+			}
+			.floor-item-content{
+				width: 100%;
+				padding: 0 20rpx;
+				box-sizing: border-box;
+			}
+			.floor-item-act{
+				display: block;
+				width: 100%;
+				height: 32rpx;
+				text-align: center;
+				box-sizing: border-box;
+			}
+			.floor-tags{
+				height: 28rpx;
+				border-radius: 6rpx;
+				background-color: #FFFFFF;
+				line-height: 28rpx;
+				color: $color-system;
+				text-align: center;
+				display: inline-block;
+				padding:0 16rpx;
+				font-size: $font-size-20;
+				border: 1px solid #E15616;
+				float: left;
+			}
+			.title-none{
+				font-size: $font-size-26;
+				color: #FF2A2A;
+				line-height: 54rpx;
+			}
+			.title{
+				width: 100%;
+				height: 70rpx;
+				display: flex;
+				line-height: 35rpx;
+				flex-direction: column;
+				margin: 8rpx 0;
+				padding: 0;
+				position: relative;
+				.mclap{
+					width: 100%;
+					line-height:35rpx;
+					text-overflow:ellipsis;
+					display: -webkit-box;
+					word-break: break-all;
+					-webkit-box-orient: vertical;
+					-webkit-line-clamp: 2;
+					overflow: hidden;
+					font-size: 26rpx;
+					&.indent{
+						text-indent: 95rpx;
+					}
+				}
+				.mclap-tag{
+					display: block;
+					width: 84rpx;
+					height: 32rpx;
+					background-image: linear-gradient(270deg, #f9c023 0%, #f83600 100%);
+					border-radius: 4rpx 48rpx 4px 4px;
+					line-height: 32rpx;
+					font-size: $font-size-22;
+					color: #FFFFFF;
+					text-align: center;
+					position: absolute;
+					left: 0;
+					top: 0;
+				}
+			}
+			.no-price{
+				height: 54rpx;
+				line-height: 54rpx;
+				display: flex;
+				box-sizing: border-box;
+				.p-no{
+					font-size: $font-size-28;
+					color: $text-color;
+					display: block;
+					float: left;
+				}
+				.p-stars{
+					float: left;
+				}
+			}
+			.price{
+				color: #FF2A2A;
+				line-height:54rpx;
+				&.none{
+					text-decoration: line-through;
+					color: #999999;
+				}
+				.sm{
+					font-size: $font-size-24;
+				}
+				.big{
+					font-size: $font-size-28;
+				}
+			}
+		}
+	}
+</style>

+ 332 - 0
components/cm-module/pageFloorTemplate/templateF.vue

@@ -0,0 +1,332 @@
+<template>
+	<view class="section_page_main clearfix">
+		<view class="floor-item ad_04 clearfix" v-for="(item, idx) in floorData.floorImageList" :key="idx" @click.stop="navToDetailPage(item)">
+			<image class="item-img tui-skeleton-fillet" :src="item.image" mode="aspectFill"></image>
+			<view class="floor-item_tag" v-if="item.listType == 2">
+				<text>{{ item.label }}</text>
+			</view>
+			<view class="floor-item-content">
+				<view class="title tui-skeleton-rect">
+					<text class="mclap-tag" v-if="item.product.beautyActFlag == '1'">美博会</text>
+					<text class="mclap" :class="item.product.beautyActFlag == '1' ? 'indent' : ''">{{item.name}} </text>
+				</view>
+				<view class="floor-item-price" v-if="item.listType == 1">
+					<view class="floor-item-act">
+						<template v-if="userIdentity === 3">
+							<template v-if="item.product.actStatus===1">
+								<view class="floor-tags" v-if="PromotionsFormat(item.product.promotions)">
+									{{item.product.promotions.name}}
+									<text v-if="hasLogin && item.product.price1TextFlag != 1 && item.product.shopID == shopId">:¥{{item.product.retailPrice | NumFormat}}</text>
+								</view>
+								<view class="floor-tags" v-else>{{item.product.promotions.name}}</view>	
+							</template>
+							<template v-if="item.product.actStatus ===0  &&  item.product.ladderPriceFlag===1">
+								<view class="floor-tags">阶梯价格</view>	
+							</template>
+						</template>	
+						<template v-else>
+							<template v-if="item.product.actStatus===1">
+								<view class="floor-tags" v-if="PromotionsFormat(item.product.promotions)">
+									{{item.product.promotions.name}}
+									<text v-if="hasLogin && item.product.price1TextFlag != 1">:¥{{item.product.retailPrice | NumFormat}}</text>
+								</view>
+								<view class="floor-tags" v-else>{{item.product.promotions.name}}</view>	
+							</template>
+							<template v-if="item.product.actStatus ===0  &&  item.product.ladderPriceFlag===1">
+								<view class="floor-tags">阶梯价格</view>	
+							</template>
+						</template>
+					</view>	
+					<view v-if="hasLogin">
+						<template v-if="item.product.productCategory == 1">
+							<template v-if="userIdentity == 3">
+								<template v-if="item.product.shopID == shopId">
+									<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+										<text class="p big">¥未公开价格</text>
+									</view>
+									<view class="price tui-skeleton-rect" v-else :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+										<text class="p sm">¥</text>
+										<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+									</view>
+								</template>	
+								<template v-else>
+									<view class="no-price">
+										<view class="p-stars">
+											<text class="p-no">¥</text>
+											<uni-grader :grade="Number(item.product.price1Grade)" :margin="14"></uni-grader>
+										</view>
+									</view>	
+								</template>
+							</template>
+							<template v-else-if="userIdentity ===4">
+								<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+									<text class="p big">¥未公开价格</text>
+								</view>
+								<view class="title-none"  v-if="item.product.price1TextFlag === '2'">
+									<text class="p big">¥价格仅会员可见</text>
+								</view>
+								<view class="price tui-skeleton-rect" v-if="item.product.price1TextFlag === '0'" :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+									<text class="p sm">¥</text>
+									<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+								</view>
+							</template>
+							<template v-else>
+								<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+									<text class="p big">¥未公开价格</text>
+								</view>
+								<view class="price tui-skeleton-rect" v-else :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+									<text class="p sm">¥</text>
+									<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+								</view>
+							</template>
+						</template>	
+						<template v-else>
+							<view class="price tui-skeleton-rect" v-if="item.product.detailTalkFlag == '2'">
+								<text class="p sm">¥</text>
+								<text class="p big">价格详聊</text>
+							</view>
+							<view class="price tui-skeleton-rect" v-else>
+								<text class="p sm">¥</text>
+								<text class="p big">{{ item.product.retailPrice | NumFormat }}</text>
+							</view>
+						</template>
+					</view>
+					<view v-else class="no-price">
+						<template v-if="item.product.productCategory == 1">
+							<view class="p-stars">
+								<text class="p-no">¥</text>
+								<uni-grader :grade="Number(item.product.price1Grade)" :margin="14"></uni-grader>
+							</view>
+						</template>
+						<template v-else>
+							<view class="p-stars">
+								<text class="p-no">¥登录可见</text>
+							</view>
+						</template>
+					</view>	
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import { mapState,mapMutations} from 'vuex';
+	import uniGrader from '@/components/uni-grade/uni-grade.vue'
+	export default{
+		name:"templateG",
+		components:{
+			uniGrader
+		},
+		props:{
+			pageData:{
+				type:Object
+			},
+			userIdentity:{
+				type:Number
+			}
+		},
+		data() {
+			return{
+				shopId:0,
+				floorData:{}
+			}
+		},
+		filters: {
+			NumFormat:function(text) {//处理金额				
+				return Number(text).toFixed(2);			
+			},		
+		},
+		created(){
+			this.initData(this.pageData)
+		},
+		computed: {
+			...mapState(['hasLogin','userInfo','isActivity'])
+		},
+		watch: {
+			pageData: {
+				handler: function (el) {//监听对象的变换使用 function,箭头函数容易出现this指向不正确
+					this.pageData = el
+					this.initData(this.pageData)
+				},
+				deep: true
+			}
+		},
+		methods:{
+			initData(data){
+				this.$api.getStorage().then((resolve) =>{
+					this.shopId = resolve.shopID ? resolve.shopID : 0
+				})
+				this.floorData = data
+				// console.log(this.floorData)
+			},
+			PromotionsFormat(promo){//促销活动类型数据处理
+				if(promo!=null){
+					if(promo.type == 1 && promo.mode == 1){
+						return true
+					}else{
+						return false
+					}
+				}
+				return false
+			},
+			navToDetailPage(pros) {//跳转商品详情页
+				this.$api.FlooryNavigateTo(pros)
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.section_page_main{
+		width: 100%;
+		height: auto;
+		box-sizing: border-box;
+		.floor-item{
+			width: 339rpx;
+			height: 516rpx;
+			margin-right: 20rpx;
+			font-size: $font-size-24;
+			color: $text-color;
+			background: #FFFFFF;
+			line-height: 36rpx;
+			border-radius: 16rpx;
+			margin-bottom: 20rpx;
+			float: left;
+			box-sizing: border-box;
+			position: relative;
+			&:nth-child(2n){
+				margin-right: 0;
+			}
+			.item-img-gg{
+				width: 339rpx;
+				height: 516rpx;
+				display: block;
+				border-radius: 16rpx;
+			}
+			.item-img{
+				width: 339rpx;
+				height: 339rpx;
+				border-radius: 16rpx 16rpx 0 0;
+				display: block;
+				margin-bottom: 8rpx;
+			}
+			.floor-item_tag{
+				width: 100%;
+				height: 32rpx;
+				float: left;
+				margin: 20rpx 0;
+				padding: 0 20rpx;
+				box-sizing: border-box;
+				text{
+					display: inline-block;
+					padding: 0 8rpx;
+					border: 1px solid #e3ebf7;
+					border-radius: 8rpx ;
+					color: #9aa5b5;
+					font-size: $font-size-22;
+					line-height: 32rpx;
+					text-align: center;
+					float: left;
+				}
+			}
+			.floor-item-content{
+				width: 100%;
+				padding: 0 20rpx;
+				box-sizing: border-box;
+			}
+			.floor-item-act{
+				display: block;
+				width: 100%;
+				height: 32rpx;
+				text-align: center;
+				box-sizing: border-box;
+			}
+			.floor-tags{
+				height: 28rpx;
+				border-radius: 6rpx;
+				background-color: #FFFFFF;
+				line-height: 28rpx;
+				color: $color-system;
+				text-align: center;
+				display: inline-block;
+				padding:0 16rpx;
+				font-size: $font-size-20;
+				border: 1px solid #E15616;
+				float: left;
+			}
+			.title-none{
+				font-size: $font-size-26;
+				color: #FF2A2A;
+				line-height: 54rpx;
+			}
+			.title{
+				width: 100%;
+				height: 70rpx;
+				display: flex;
+				line-height: 35rpx;
+				flex-direction: column;
+				margin: 8rpx 0;
+				padding: 0;
+				position: relative;
+				.mclap{
+					width: 100%;
+					line-height:35rpx;
+					text-overflow:ellipsis;
+					display: -webkit-box;
+					word-break: break-all;
+					-webkit-box-orient: vertical;
+					-webkit-line-clamp: 2;
+					overflow: hidden;
+					font-size: 26rpx;
+					&.indent{
+						text-indent: 95rpx;
+					}
+				}
+				.mclap-tag{
+					display: block;
+					width: 84rpx;
+					height: 32rpx;
+					background-image: linear-gradient(270deg, #f9c023 0%, #f83600 100%);
+					border-radius: 4rpx 48rpx 4px 4px;
+					line-height: 32rpx;
+					font-size: $font-size-22;
+					color: #FFFFFF;
+					text-align: center;
+					position: absolute;
+					left: 0;
+					top: 0;
+				}
+			}
+			.no-price{
+				height: 54rpx;
+				line-height: 54rpx;
+				display: flex;
+				box-sizing: border-box;
+				.p-no{
+					font-size: $font-size-30;
+					color: $text-color;
+					display: block;
+					float: left;
+				}
+				.p-stars{
+					float: left;
+				}
+			}
+			.price{
+				color: #FF2A2A;
+				line-height:54rpx;
+				&.none{
+					text-decoration: line-through;
+					color: #999999;
+				}
+				.sm{
+					font-size: $font-size-24;
+				}
+				.big{
+					font-size: $font-size-28;
+				}
+			}
+		}
+	}
+</style>

+ 347 - 0
components/cm-module/pageTemplate/templateA.vue

@@ -0,0 +1,347 @@
+<template>
+	<view class="section_page_main clearfix">
+		<view class="floor-item ad_02">
+			<image 	class="item-img-gg" 
+					:src="floorData.floorContent.appletsAdsImage1" 
+					@click="BannerNavigateTo(
+						floorData.floorContent.linkType1,
+						floorData.floorContent.linkParam1.id ? floorData.floorContent.linkParam1.id : '',
+						floorData.floorContent.adsLink1,
+						floorData.floorContent.linkParam1.keyword ? floorData.floorContent.linkParam1.keyword : ''
+					)"
+					mode="aspectFill" >
+			</image>
+		</view>
+		<view class="floor-item ad_04 clearfix" v-for="(item, idx) in floorData.floorImageList" v-if="idx < 3" :key="idx" @click.stop="navToDetailPage(item)">
+			<image class="item-img tui-skeleton-fillet" :src="item.image" mode="aspectFill"></image>
+			<view class="floor-item_tag" v-if="item.listType == 2">
+				<text>{{ item.label }}</text>
+			</view>
+			<view class="floor-item-content">
+				<view class="title tui-skeleton-rect">
+					<text class="mclap-tag" v-if="item.product.beautyActFlag == '1'">美博会</text>
+					<text class="mclap" :class="item.product.beautyActFlag == '1' ? 'indent' : ''">{{item.name}} </text>
+				</view>
+				<view class="floor-item-price" v-if="item.listType == 1">
+					<view class="floor-item-act" >
+						<template v-if="userIdentity === 3">
+							<template v-if="item.product.actStatus===1">
+								<view class="floor-tags" v-if="PromotionsFormat(item.product.promotions)">
+									{{item.product.promotions.name}}
+									<text v-if="hasLogin && item.product.price1TextFlag != 1 && item.product.shopID == shopId">:¥{{item.product.retailPrice | NumFormat}}</text>
+								</view>
+								<view class="floor-tags" v-else>{{item.product.promotions.name}}</view>	
+							</template>
+							<template v-if="item.product.actStatus ===0  &&  item.product.ladderPriceFlag===1">
+								<view class="floor-tags">阶梯价格</view>	
+							</template>
+						</template>	
+						<template v-else>
+							<template v-if="item.product.actStatus===1">
+								<view class="floor-tags" v-if="PromotionsFormat(item.product.promotions)">
+									{{item.product.promotions.name}}
+									<text v-if="hasLogin && item.product.price1TextFlag != 1">:¥{{item.product.retailPrice | NumFormat}}</text>
+								</view>
+								<view class="floor-tags" v-else>{{item.product.promotions.name}}</view>	
+							</template>
+							<template v-if="item.product.actStatus ===0  &&  item.product.ladderPriceFlag===1">
+								<view class="floor-tags">阶梯价格</view>	
+							</template>
+						</template>
+					</view>	
+					<view v-if="hasLogin">
+						<template v-if="item.product.productCategory == 1">
+							<template v-if="userIdentity == 3">
+								<template v-if="item.product.shopID == shopId">
+									<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+										<text class="p big">¥未公开价格</text>
+									</view>
+									<view class="price tui-skeleton-rect" v-else :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+										<text class="p sm">¥</text>
+										<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+									</view>
+								</template>	
+								<template v-else>
+									<view class="no-price">
+										<view class="p-stars">
+											<text class="p-no">¥</text>
+											<uni-grader :grade="Number(item.product.price1Grade)" :margin="14"></uni-grader>
+										</view>
+									</view>	
+								</template>
+							</template>
+							<template v-else-if="userIdentity ===4">
+								<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+									<text class="p big">¥未公开价格</text>
+								</view>
+								<view class="title-none"  v-if="item.product.price1TextFlag === '2'">
+									<text class="p big">¥价格仅会员可见</text>
+								</view>
+								<view class="price tui-skeleton-rect" v-if="item.product.price1TextFlag === '0'" :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+									<text class="p sm">¥</text>
+									<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+								</view>
+							</template>
+							<template v-else>
+								<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+									<text class="p big">¥未公开价格</text>
+								</view>
+								<view class="price tui-skeleton-rect" v-else :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+									<text class="p sm">¥</text>
+									<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+								</view>
+							</template>
+						</template>	
+						<template v-else>
+							<view class="price tui-skeleton-rect" v-if="item.product.detailTalkFlag == '2'">
+								<text class="p sm">¥</text>
+								<text class="p big">价格详聊</text>
+							</view>
+							<view class="price tui-skeleton-rect" v-else>
+								<text class="p sm">¥</text>
+								<text class="p big">{{ item.product.retailPrice | NumFormat }}</text>
+							</view>
+						</template>
+					</view>
+					<view v-else class="no-price">
+						<template v-if="item.product.productCategory == 1">
+							<view class="p-stars">
+								<text class="p-no">¥</text>
+								<uni-grader :grade="Number(item.product.price1Grade)" :margin="14"></uni-grader>
+							</view>
+						</template>
+						<template v-else>
+							<view class="p-stars">
+								<text class="p-no">¥登录可见</text>
+							</view>
+						</template>
+					</view>	
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import { mapState,mapMutations} from 'vuex';
+	import uniGrader from '@/components/uni-grade/uni-grade.vue'
+	export default{
+		name:"templateA",
+		components:{
+			uniGrader
+		},
+		props:{
+			pageData:{
+				type:Object
+			},
+			userIdentity:{
+				type:Number
+			}
+		},
+		data() {
+			return{
+				shopId:0,
+				floorData:{}
+			}
+		},
+		filters: {
+			NumFormat:function(text) {//处理金额				
+				return Number(text).toFixed(2);			
+			},		
+		},
+		created(){
+			this.initData(this.pageData)
+		},
+		computed: {
+			...mapState(['hasLogin','userInfo','isActivity'])
+		},
+		watch: {
+			pageData: {
+				handler: function (el) {//监听对象的变换使用 function,箭头函数容易出现this指向不正确
+					this.pageData = el
+					this.initData(this.pageData)
+				},
+				deep: true
+			}
+		},
+		methods:{
+			initData(data){
+				this.$api.getStorage().then((resolve) =>{
+					this.shopId = resolve.shopID ? resolve.shopID : 0
+				})
+				this.floorData = data
+				// console.log(this.floorData)
+			},
+			PromotionsFormat(promo){//促销活动类型数据处理
+				if(promo!=null){
+					if(promo.type == 1 && promo.mode == 1){
+						return true
+					}else{
+						return false
+					}
+				}
+				return false
+			},
+			navToDetailPage(pros) {//跳转
+				this.$api.FlooryNavigateTo(pros)
+			},
+			BannerNavigateTo(linkType,linkId,linkHref,keyword) {//跳转
+				this.$api.BannerNavigateTo(linkType,linkId,linkHref,keyword)
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.section_page_main{
+		width: 100%;
+		height: auto;
+		box-sizing: border-box;
+		.floor-item{
+			width: 339rpx;
+			height: 516rpx;
+			margin-right: 20rpx;
+			font-size: $font-size-24;
+			color: $text-color;
+			background: #FFFFFF;
+			line-height: 36rpx;
+			border-radius: 16rpx;
+			margin-bottom: 20rpx;
+			float: left;
+			box-sizing: border-box;
+			position: relative;
+			&:nth-child(2n){
+				margin-right: 0;
+			}
+			.item-img-gg{
+				width: 339rpx;
+				height: 516rpx;
+				display: block;
+				border-radius: 16rpx;
+			}
+			.item-img{
+				width: 339rpx;
+				height: 339rpx;
+				border-radius: 16rpx 16rpx 0 0;
+				display: block;
+				margin-bottom: 8rpx;
+			}
+			.floor-item_tag{
+				width: 100%;
+				height: 32rpx;
+				float: left;
+				margin: 20rpx 0;
+				padding: 0 20rpx;
+				box-sizing: border-box;
+				text{
+					display: inline-block;
+					padding: 0 8rpx;
+					border: 1px solid #e3ebf7;
+					border-radius: 8rpx ;
+					color: #9aa5b5;
+					font-size: $font-size-22;
+					line-height: 32rpx;
+					text-align: center;
+					float: left;
+				}
+			}
+			.floor-item-content{
+				width: 100%;
+				padding: 0 20rpx;
+				box-sizing: border-box;
+			}
+			.floor-item-act{
+				display: block;
+				width: 100%;
+				height: 32rpx;
+				text-align: center;
+				box-sizing: border-box;
+			}
+			.floor-tags{
+				height: 28rpx;
+				border-radius: 6rpx;
+				background-color: #FFFFFF;
+				line-height: 28rpx;
+				color: $color-system;
+				text-align: center;
+				display: inline-block;
+				padding:0 16rpx;
+				font-size: $font-size-20;
+				border: 1px solid #E15616;
+				float: left;
+			}
+			.title-none{
+				font-size: $font-size-26;
+				color: #FF2A2A;
+				line-height: 54rpx;
+			}
+			.title{
+				width: 100%;
+				height: 70rpx;
+				display: flex;
+				line-height: 35rpx;
+				flex-direction: column;
+				margin: 8rpx 0;
+				padding: 0;
+				position: relative;
+				.mclap{
+					width: 100%;
+					line-height:35rpx;
+					text-overflow:ellipsis;
+					display: -webkit-box;
+					word-break: break-all;
+					-webkit-box-orient: vertical;
+					-webkit-line-clamp: 2;
+					overflow: hidden;
+					font-size: 26rpx;
+					&.indent{
+						text-indent: 95rpx;
+					}
+				}
+				.mclap-tag{
+					display: block;
+					width: 84rpx;
+					height: 32rpx;
+					background-image: linear-gradient(270deg, #f9c023 0%, #f83600 100%);
+					border-radius: 4rpx 48rpx 4px 4px;
+					line-height: 32rpx;
+					font-size: $font-size-22;
+					color: #FFFFFF;
+					text-align: center;
+					position: absolute;
+					left: 0;
+					top: 0;
+				}
+			}
+			.no-price{
+				height: 54rpx;
+				line-height: 54rpx;
+				display: flex;
+				box-sizing: border-box;
+				.p-no{
+					font-size: $font-size-28;
+					color: $text-color;
+					display: block;
+					float: left;
+				}
+				.p-stars{
+					float: left;
+				}
+			}
+			.price{
+				color: #FF2A2A;
+				line-height:54rpx;
+				&.none{
+					text-decoration: line-through;
+					color: #999999;
+				}
+				.sm{
+					font-size: $font-size-24;
+				}
+				.big{
+					font-size: $font-size-28;
+				}
+			}
+		}
+	}
+</style>

+ 359 - 0
components/cm-module/pageTemplate/templateB.vue

@@ -0,0 +1,359 @@
+<template>
+	<view class="section_page_main clearfix">
+		<view class="floor-item ad_02">
+			<image 	class="item-img-gg" 
+					:src="floorData.floorContent.appletsAdsImage1" 
+					@click="BannerNavigateTo(
+						floorData.floorContent.linkType1,
+						floorData.floorContent.linkParam1.id ? floorData.floorContent.linkParam1.id : '',
+						floorData.floorContent.adsLink1,
+						floorData.floorContent.linkParam1.keyword ? floorData.floorContent.linkParam1.keyword : ''
+					)"
+					mode="aspectFill">
+			</image>
+		</view>
+		<view class="floor-item ad_02">
+			<image 	class="item-img-gg" 
+					:src="floorData.floorContent.appletsAdsImage2" 
+					@click="BannerNavigateTo(
+						floorData.floorContent.linkType2,
+						floorData.floorContent.linkParam2.id ? floorData.floorContent.linkParam2.id : '',
+						floorData.floorContent.adsLink2,
+						floorData.floorContent.linkParam2.keyword ? floorData.floorContent.linkParam2.keyword : ''
+					)"
+					mode="aspectFill">
+			</image>
+		</view>
+		<view class="floor-item ad_04 clearfix" v-for="(item, idx) in floorData.floorImageList" v-if="idx < 2" :key="idx" @click.stop="navToDetailPage(item)">
+			<image class="item-img tui-skeleton-fillet" :src="item.image" mode="aspectFill"></image>
+			<view class="floor-item_tag" v-if="item.listType == 2">
+				<text>{{ item.label }}</text>
+			</view>
+			<view class="floor-item-content">
+				<view class="title tui-skeleton-rect">
+					<text class="mclap-tag" v-if="item.product.beautyActFlag == '1'">美博会</text>
+					<text class="mclap" :class="item.product.beautyActFlag == '1' ? 'indent' : ''">{{item.name}} </text>
+				</view>
+				<view class="floor-item-price" v-if="item.listType == 1">
+					<view class="floor-item-act">
+						<template v-if="userIdentity === 3">
+							<template v-if="item.product.actStatus===1">
+								<view class="floor-tags" v-if="PromotionsFormat(item.product.promotions)">
+									{{item.product.promotions.name}}
+									<text v-if="hasLogin && item.product.price1TextFlag != 1 && item.product.shopID == shopId">:¥{{item.product.retailPrice | NumFormat}}</text>
+								</view>
+								<view class="floor-tags" v-else>{{item.product.promotions.name}}</view>	
+							</template>
+							<template v-if="item.product.actStatus ===0  &&  item.product.ladderPriceFlag===1">
+								<view class="floor-tags">阶梯价格</view>	
+							</template>
+						</template>	
+						<template v-else>
+							<template v-if="item.product.actStatus===1">
+								<view class="floor-tags" v-if="PromotionsFormat(item.product.promotions)">
+									{{item.product.promotions.name}}
+									<text v-if="hasLogin && item.product.price1TextFlag != 1">:¥{{item.product.retailPrice | NumFormat}}</text>
+								</view>
+								<view class="floor-tags" v-else>{{item.product.promotions.name}}</view>	
+							</template>
+							<template v-if="item.product.actStatus ===0  &&  item.product.ladderPriceFlag===1">
+								<view class="floor-tags">阶梯价格</view>	
+							</template>
+						</template>
+					</view>	
+					<view v-if="hasLogin">
+						<template v-if="item.product.productCategory == 1">
+							<template v-if="userIdentity == 3">
+								<template v-if="item.product.shopID == shopId">
+									<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+										<text class="p big">¥未公开价格</text>
+									</view>
+									<view class="price tui-skeleton-rect" v-else :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+										<text class="p sm">¥</text>
+										<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+									</view>
+								</template>	
+								<template v-else>
+									<view class="no-price">
+										<view class="p-stars">
+											<text class="p-no">¥</text>
+											<uni-grader :grade="Number(item.product.price1Grade)" :margin="14"></uni-grader>
+										</view>
+									</view>	
+								</template>
+							</template>
+							<template v-else-if="userIdentity ===4">
+								<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+									<text class="p big">¥未公开价格</text>
+								</view>
+								<view class="title-none"  v-if="item.product.price1TextFlag === '2'">
+									<text class="p big">¥价格仅会员可见</text>
+								</view>
+								<view class="price tui-skeleton-rect" v-if="item.product.price1TextFlag === '0'" :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+									<text class="p sm">¥</text>
+									<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+								</view>
+							</template>
+							<template v-else>
+								<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+									<text class="p big">¥未公开价格</text>
+								</view>
+								<view class="price tui-skeleton-rect" v-else :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+									<text class="p sm">¥</text>
+									<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+								</view>
+							</template>
+						</template>	
+						<template v-else>
+							<view class="price tui-skeleton-rect" v-if="item.product.detailTalkFlag == '2'">
+								<text class="p sm">¥</text>
+								<text class="p big">价格详聊</text>
+							</view>
+							<view class="price tui-skeleton-rect" v-else>
+								<text class="p sm">¥</text>
+								<text class="p big">{{ item.product.retailPrice | NumFormat }}</text>
+							</view>
+						</template>
+					</view>
+					<view v-else class="no-price">
+						<template v-if="item.product.productCategory == 1">
+							<view class="p-stars">
+								<text class="p-no">¥</text>
+								<uni-grader :grade="Number(item.product.price1Grade)" :margin="14"></uni-grader>
+							</view>
+						</template>
+						<template v-else>
+							<view class="p-stars">
+								<text class="p-no">¥登录可见</text>
+							</view>
+						</template>
+					</view>	
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import { mapState,mapMutations} from 'vuex';
+	import uniGrader from '@/components/uni-grade/uni-grade.vue'
+	export default{
+		name:"templateB",
+		components:{
+			uniGrader
+		},
+		props:{
+			pageData:{
+				type:Object
+			},
+			userIdentity:{
+				type:Number
+			}
+		},
+		data() {
+			return{
+				shopId:0,
+				floorData:{}
+			}
+		},
+		filters: {
+			NumFormat:function(text) {//处理金额				
+				return Number(text).toFixed(2);			
+			},		
+		},
+		created(){
+			this.initData(this.pageData)
+		},
+		computed: {
+			...mapState(['hasLogin','userInfo','isActivity'])
+		},
+		watch: {
+			pageData: {
+				handler: function (el) {//监听对象的变换使用 function,箭头函数容易出现this指向不正确
+					this.pageData = el
+					this.initData(this.pageData)
+				},
+				deep: true
+			}
+		},
+		methods:{
+			initData(data){
+				this.$api.getStorage().then((resolve) =>{
+					this.shopId = resolve.shopID ? resolve.shopID : 0
+				})
+				this.floorData = data
+				// console.log(this.floorData)
+			},
+			PromotionsFormat(promo){//促销活动类型数据处理
+				if(promo!=null){
+					if(promo.type == 1 && promo.mode == 1){
+						return true
+					}else{
+						return false
+					}
+				}
+				return false
+			},
+			navToDetailPage(pros) {//跳转商品详情页
+				this.$api.FlooryNavigateTo(pros)
+			},
+			BannerNavigateTo(linkType,linkId,linkHref,keyword) {//跳转商品详情页
+				this.$api.BannerNavigateTo(linkType,linkId,linkHref,keyword)
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.section_page_main{
+		width: 100%;
+		height: auto;
+		box-sizing: border-box;
+		.floor-item{
+			width: 339rpx;
+			height: 516rpx;
+			margin-right: 20rpx;
+			font-size: $font-size-24;
+			color: $text-color;
+			background: #FFFFFF;
+			line-height: 36rpx;
+			border-radius: 16rpx;
+			margin-bottom: 20rpx;
+			float: left;
+			box-sizing: border-box;
+			position: relative;
+			&:nth-child(2n){
+				margin-right: 0;
+			}
+			.item-img-gg{
+				width: 339rpx;
+				height: 516rpx;
+				display: block;
+				border-radius: 16rpx;
+			}
+			.item-img{
+				width: 339rpx;
+				height: 339rpx;
+				border-radius: 16rpx 16rpx 0 0;
+				display: block;
+				margin-bottom: 8rpx;
+			}
+			.floor-item_tag{
+				width: 100%;
+				height: 32rpx;
+				float: left;
+				margin: 20rpx 0;
+				padding: 0 20rpx;
+				box-sizing: border-box;
+				text{
+					display: inline-block;
+					padding: 0 8rpx;
+					border: 1px solid #e3ebf7;
+					border-radius: 8rpx ;
+					color: #9aa5b5;
+					font-size: $font-size-22;
+					line-height: 32rpx;
+					text-align: center;
+					float: left;
+				}
+			}
+			.floor-item-content{
+				width: 100%;
+				padding: 0 20rpx;
+				box-sizing: border-box;
+			}
+			.floor-item-act{
+				display: block;
+				width: 100%;
+				height: 32rpx;
+				text-align: center;
+				box-sizing: border-box;
+			}
+			.floor-tags{
+				height: 28rpx;
+				border-radius: 6rpx;
+				background-color: #FFFFFF;
+				line-height: 28rpx;
+				color: $color-system;
+				text-align: center;
+				display: inline-block;
+				padding:0 16rpx;
+				font-size: $font-size-20;
+				border: 1px solid #E15616;
+				float: left;
+			}
+			.title-none{
+				font-size: $font-size-26;
+				color: #FF2A2A;
+				line-height: 54rpx;
+			}
+			.title{
+				width: 100%;
+				height: 70rpx;
+				display: flex;
+				line-height: 35rpx;
+				flex-direction: column;
+				margin: 8rpx 0;
+				padding: 0;
+				position: relative;
+				.mclap{
+					width: 100%;
+					line-height:35rpx;
+					text-overflow:ellipsis;
+					display: -webkit-box;
+					word-break: break-all;
+					-webkit-box-orient: vertical;
+					-webkit-line-clamp: 2;
+					overflow: hidden;
+					font-size: 26rpx;
+					&.indent{
+						text-indent: 95rpx;
+					}
+				}
+				.mclap-tag{
+					display: block;
+					width: 84rpx;
+					height: 32rpx;
+					background-image: linear-gradient(270deg, #f9c023 0%, #f83600 100%);
+					border-radius: 4rpx 48rpx 4px 4px;
+					line-height: 32rpx;
+					font-size: $font-size-22;
+					color: #FFFFFF;
+					text-align: center;
+					position: absolute;
+					left: 0;
+					top: 0;
+				}
+			}
+			.no-price{
+				height: 54rpx;
+				line-height: 54rpx;
+				display: flex;
+				box-sizing: border-box;
+				.p-no{
+					font-size: $font-size-28;
+					color: $text-color;
+					display: block;
+					float: left;
+				}
+				.p-stars{
+					float: left;
+				}
+			}
+			.price{
+				color: #FF2A2A;
+				line-height:54rpx;
+				&.none{
+					text-decoration: line-through;
+					color: #999999;
+				}
+				.sm{
+					font-size: $font-size-24;
+				}
+				.big{
+					font-size: $font-size-28;
+				}
+			}
+		}
+	}
+</style>

+ 392 - 0
components/cm-module/pageTemplate/templateC.vue

@@ -0,0 +1,392 @@
+<template>
+	<view class="section_page_main clearfix">
+		<view class="floor-item ad_01">
+			<image 	class="item-img-gg" 
+					:src="floorData.floorContent.appletsAdsImage1" 
+					@click="BannerNavigateTo(
+						floorData.floorContent.linkType1,
+						floorData.floorContent.linkParam1.id ? floorData.floorContent.linkParam1.id : '',
+						floorData.floorContent.adsLink1,
+						floorData.floorContent.linkParam1.keyword ? floorData.floorContent.linkParam1.keyword : ''
+					)"
+					mode="aspectFill">
+			</image>
+		</view>
+		<view class="floor-item ad_02">
+			<image 	class="item-img-gg" 
+					:src="floorData.floorContent.appletsAdsImage2" 
+					@click="BannerNavigateTo(
+						floorData.floorContent.linkType2,
+						floorData.floorContent.linkParam2.id ? floorData.floorContent.linkParam2.id : '',
+						floorData.floorContent.adsLink2,
+						floorData.floorContent.linkParam2.keyword ? floorData.floorContent.linkParam2.keyword : ''
+					)"
+					mode="aspectFill">
+			</image>
+		</view>
+		<view class="floor-item ad_04 clearfix" v-for="(item, idx) in floorData.floorImageList" v-if="idx < 3" :key="idx" @click.stop="navToDetailPage(item)">
+			<image class="item-img tui-skeleton-fillet" :src="item.image" mode="aspectFill"></image>
+			<view class="floor-item_tag" v-if="item.listType == 2">
+				<text>{{ item.label }}</text>
+			</view>
+			<view class="floor-item-content">
+				<view class="title tui-skeleton-rect">
+					<text class="mclap-tag" v-if="item.product.beautyActFlag == '1'">美博会</text>
+					<text class="mclap" :class="item.product.beautyActFlag == '1' ? 'indent' : ''">{{item.name}} </text>
+				</view>
+				<view class="floor-item-price" v-if="item.listType == 1">
+					<view class="floor-item-act">
+						<template v-if="userIdentity === 3">
+							<template v-if="item.product.actStatus===1">
+								<view class="floor-tags" v-if="PromotionsFormat(item.product.promotions)">
+									{{item.product.promotions.name}}
+									<text v-if="hasLogin && item.product.price1TextFlag != 1 && item.product.shopID == shopId">:¥{{item.product.retailPrice | NumFormat}}</text>
+								</view>
+								<view class="floor-tags" v-else>{{item.product.promotions.name}}</view>	
+							</template>
+							<template v-if="item.product.actStatus ===0  &&  item.product.ladderPriceFlag===1">
+								<view class="floor-tags">阶梯价格</view>	
+							</template>
+						</template>	
+						<template v-else>
+							<template v-if="item.product.actStatus===1">
+								<view class="floor-tags" v-if="PromotionsFormat(item.product.promotions)">
+									{{item.product.promotions.name}}
+									<text v-if="hasLogin && item.product.price1TextFlag != 1">:¥{{item.product.retailPrice | NumFormat}}</text>
+								</view>
+								<view class="floor-tags" v-else>{{item.product.promotions.name}}</view>	
+							</template>
+							<template v-if="item.product.actStatus ===0  &&  item.product.ladderPriceFlag===1">
+								<view class="floor-tags">阶梯价格</view>	
+							</template>
+						</template>
+					</view>	
+					<view v-if="hasLogin">
+						<template v-if="item.product.productCategory == 1">
+							<template v-if="userIdentity == 3">
+								<template v-if="item.product.shopID == shopId">
+									<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+										<text class="p big">¥未公开价格</text>
+									</view>
+									<view class="price tui-skeleton-rect" v-else :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+										<text class="p sm">¥</text>
+										<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+									</view>
+								</template>	
+								<template v-else>
+									<view class="no-price">
+										<view class="p-stars">
+											<text class="p-no">¥</text>
+											<uni-grader :grade="Number(item.product.price1Grade)" :margin="14"></uni-grader>
+										</view>
+									</view>	
+								</template>
+							</template>
+							<template v-else-if="userIdentity ===4">
+								<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+									<text class="p big">¥未公开价格</text>
+								</view>
+								<view class="title-none"  v-if="item.product.price1TextFlag === '2'">
+									<text class="p big">¥价格仅会员可见</text>
+								</view>
+								<view class="price tui-skeleton-rect" v-if="item.product.price1TextFlag === '0'" :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+									<text class="p sm">¥</text>
+									<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+								</view>
+							</template>
+							<template v-else>
+								<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+									<text class="p big">¥未公开价格</text>
+								</view>
+								<view class="price tui-skeleton-rect" v-else :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+									<text class="p sm">¥</text>
+									<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+								</view>
+							</template>
+						</template>	
+						<template v-else>
+							<view class="price tui-skeleton-rect" v-if="item.product.detailTalkFlag == '2'">
+								<text class="p sm">¥</text>
+								<text class="p big">价格详聊</text>
+							</view>
+							<view class="price tui-skeleton-rect" v-else>
+								<text class="p sm">¥</text>
+								<text class="p big">{{ item.product.retailPrice | NumFormat }}</text>
+							</view>
+						</template>
+					</view>
+					<view v-else class="no-price">
+						<template v-if="item.product.productCategory == 1">
+							<view class="p-stars">
+								<text class="p-no">¥</text>
+								<uni-grader :grade="Number(item.product.price1Grade)" :margin="14"></uni-grader>
+							</view>
+						</template>
+						<template v-else>
+							<view class="p-stars">
+								<text class="p-no">¥登录可见</text>
+							</view>
+						</template>
+					</view>	
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import { mapState,mapMutations} from 'vuex';
+	import uniGrader from '@/components/uni-grade/uni-grade.vue'
+	export default{
+		name:"templateC",
+		components:{
+			uniGrader
+		},
+		props:{
+			pageData:{
+				type:Object
+			},
+			userIdentity:{
+				type:Number
+			}
+		},
+		data() {
+			return{
+				shopId:0,
+				floorData:{}
+			}
+		},
+		filters: {
+			NumFormat:function(text) {//处理金额				
+				return Number(text).toFixed(2);			
+			},		
+		},
+		created(){
+			this.initData(this.pageData)
+		},
+		computed: {
+			...mapState(['hasLogin','userInfo','isActivity'])
+		},
+		watch: {
+			pageData: {
+				handler: function (el) {//监听对象的变换使用 function,箭头函数容易出现this指向不正确
+					this.pageData = el
+					this.initData(this.pageData)
+				},
+				deep: true
+			}
+		},
+		methods:{
+			initData(data){
+				this.$api.getStorage().then((resolve) =>{
+					this.shopId = resolve.shopID ? resolve.shopID : 0
+				})
+				this.floorData = data
+				// console.log(this.floorData)
+			},
+			PromotionsFormat(promo){//促销活动类型数据处理
+				if(promo!=null){
+					if(promo.type == 1 && promo.mode == 1){
+						return true
+					}else{
+						return false
+					}
+				}
+				return false
+			},
+			navToDetailPage(pros) {//跳转商品详情页
+				this.$api.FlooryNavigateTo(pros)
+			},
+			BannerNavigateTo(linkType,linkId,linkHref,keyword) {//跳转商品详情页
+				this.$api.BannerNavigateTo(linkType,linkId,linkHref,keyword)
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.section_page_main{
+		width: 100%;
+		height: auto;
+		box-sizing: border-box;
+		.floor-item{
+			width: 339rpx;
+			height: 516rpx;
+			margin-right: 20rpx;
+			font-size: $font-size-24;
+			color: $text-color;
+			background: #FFFFFF;
+			line-height: 36rpx;
+			border-radius: 16rpx;
+			margin-bottom: 20rpx;
+			float: left;
+			box-sizing: border-box;
+			position: relative;
+			&.ad_01{
+				width: 100%;
+				height: 240rpx;
+				.item-img-gg{
+					width: 100%;
+					height: 240rpx;
+					display: block;
+					border-radius: 16rpx;
+				}
+			}
+			&.ad_02{
+				margin-right: 20rpx;
+			}	
+			&:nth-child(odd){
+				margin-right: 0;
+			}
+			.item-img-gg{
+				width: 339rpx;
+				height: 516rpx;
+				display: block;
+				border-radius: 16rpx;
+			}
+			.item-img{
+				width: 339rpx;
+				height: 339rpx;
+				border-radius: 16rpx 16rpx 0 0;
+				display: block;
+				margin-bottom: 8rpx;
+			}
+			.floor-item_tag{
+				width: 100%;
+				height: 32rpx;
+				float: left;
+				margin: 20rpx 0;
+				padding: 0 20rpx;
+				box-sizing: border-box;
+				text{
+					display: inline-block;
+					padding: 0 8rpx;
+					border: 1px solid #e3ebf7;
+					border-radius: 8rpx ;
+					color: #9aa5b5;
+					font-size: $font-size-22;
+					line-height: 32rpx;
+					text-align: center;
+					float: left;
+				}
+			}
+			.floor-item_tag{
+				width: 100%;
+				height: 32rpx;
+				float: left;
+				margin: 8rpx 0;
+				padding: 0 20rpx;
+				box-sizing: border-box;
+				margin-bottom: 20rpx;
+				text{
+					display: inline-block;
+					padding: 0 8rpx;
+					border: 1px solid #e3ebf7;
+					border-radius: 8rpx ;
+					color: #9aa5b5;
+					font-size: $font-size-22;
+					line-height: 32rpx;
+					text-align: center;
+					float: left;
+				}
+			}
+			.floor-item-content{
+				width: 100%;
+				padding: 0 20rpx;
+				box-sizing: border-box;
+			}
+			.floor-item-act{
+				display: block;
+				width: 100%;
+				height: 32rpx;
+				text-align: center;
+				box-sizing: border-box;
+			}
+			.floor-tags{
+				height: 28rpx;
+				border-radius: 6rpx;
+				background-color: #FFFFFF;
+				line-height: 28rpx;
+				color: $color-system;
+				text-align: center;
+				display: inline-block;
+				padding:0 16rpx;
+				font-size: $font-size-20;
+				border: 1px solid #E15616;
+				float: left;
+			}
+			.title-none{
+				font-size: $font-size-26;
+				color: #FF2A2A;
+				line-height: 54rpx;
+			}
+			.title{
+				width: 100%;
+				height: 70rpx;
+				display: flex;
+				line-height: 35rpx;
+				flex-direction: column;
+				margin: 8rpx 0;
+				padding: 0;
+				position: relative;
+				.mclap{
+					width: 100%;
+					line-height:35rpx;
+					text-overflow:ellipsis;
+					display: -webkit-box;
+					word-break: break-all;
+					-webkit-box-orient: vertical;
+					-webkit-line-clamp: 2;
+					overflow: hidden;
+					font-size: 26rpx;
+					&.indent{
+						text-indent: 95rpx;
+					}
+				}
+				.mclap-tag{
+					display: block;
+					width: 84rpx;
+					height: 32rpx;
+					background-image: linear-gradient(270deg, #f9c023 0%, #f83600 100%);
+					border-radius: 4rpx 48rpx 4px 4px;
+					line-height: 32rpx;
+					font-size: $font-size-22;
+					color: #FFFFFF;
+					text-align: center;
+					position: absolute;
+					left: 0;
+					top: 0;
+				}
+			}
+			.no-price{
+				height: 54rpx;
+				line-height: 54rpx;
+				display: flex;
+				box-sizing: border-box;
+				.p-no{
+					font-size: $font-size-28;
+					color: $text-color;
+					display: block;
+					float: left;
+				}
+				.p-stars{
+					float: left;
+				}
+			}
+			.price{
+				color: #FF2A2A;
+				line-height:54rpx;
+				&.none{
+					text-decoration: line-through;
+					color: #999999;
+				}
+				.sm{
+					font-size: $font-size-24;
+				}
+				.big{
+					font-size: $font-size-28;
+				}
+			}
+		}
+	}
+</style>

+ 382 - 0
components/cm-module/pageTemplate/templateD.vue

@@ -0,0 +1,382 @@
+<template>
+	<view class="section_page_main clearfix">
+		<view class="floor-item ad_01">
+			<image 	class="item-img-gg" 
+					:src="floorData.floorContent.appletsAdsImage1" 
+					@click="BannerNavigateTo(
+						floorData.floorContent.linkType1,
+						floorData.floorContent.linkParam1.id ? floorData.floorContent.linkParam1.id : '',
+						floorData.floorContent.adsLink1,
+						floorData.floorContent.linkParam1.keyword ? floorData.floorContent.linkParam1.keyword : ''
+					)"
+					mode="aspectFill">
+			</image>
+		</view>
+		<view class="floor-item ad_02">
+			<image 	class="item-img-gg" 
+					:src="floorData.floorContent.appletsAdsImage2" 
+					@click="BannerNavigateTo(
+						floorData.floorContent.linkType2,
+						floorData.floorContent.linkParam2.id ? floorData.floorContent.linkParam2.id : '',
+						floorData.floorContent.adsLink2,
+						floorData.floorContent.linkParam2.keyword ? floorData.floorContent.linkParam2.keyword : ''
+					)"
+					mode="aspectFill">
+			</image>
+		</view>
+		<view class="floor-item ad_03">
+			<image 	class="item-img-gg" 
+					:src="floorData.floorContent.appletsAdsImage3" 
+					@click="BannerNavigateTo(
+						floorData.floorContent.linkType3,
+						floorData.floorContent.linkParam3.id ? floorData.floorContent.linkParam3.id : '',
+						floorData.floorContent.adsLink3,
+						floorData.floorContent.linkParam3.keyword ? floorData.floorContent.linkParam3.keyword : ''
+					)"
+					mode="aspectFill">
+			</image>
+		</view>
+		<view class="floor-item ad_04 clearfix" v-for="(item, idx) in floorData.floorImageList" v-if="idx < 2" :key="idx" @click.stop="navToDetailPage(item)">
+			<image class="item-img tui-skeleton-fillet" :src="item.image" mode="aspectFill"></image>
+			<view class="floor-item_tag" v-if="item.listType == 2">
+				<text>{{ item.label }}</text>
+			</view>
+			<view class="floor-item-content">
+				<view class="title tui-skeleton-rect">
+					<text class="mclap-tag" v-if="item.product.beautyActFlag == '1'">美博会</text>
+					<text class="mclap" :class="item.product.beautyActFlag == '1' ? 'indent' : ''">{{item.name}} </text>
+				</view>
+				<view class="floor-item-price" v-if="item.listType == 1">
+					<view class="floor-item-act">
+						<template v-if="userIdentity === 3">
+							<template v-if="item.product.actStatus===1">
+								<view class="floor-tags" v-if="PromotionsFormat(item.product.promotions)">
+									{{item.product.promotions.name}}
+									<text v-if="hasLogin && item.product.price1TextFlag != 1 && item.product.shopID == shopId">:¥{{item.product.retailPrice | NumFormat}}</text>
+								</view>
+								<view class="floor-tags" v-else>{{item.product.promotions.name}}</view>	
+							</template>
+							<template v-if="item.product.actStatus ===0  &&  item.product.ladderPriceFlag===1">
+								<view class="floor-tags">阶梯价格</view>	
+							</template>
+						</template>	
+						<template v-else>
+							<template v-if="item.product.actStatus===1">
+								<view class="floor-tags" v-if="PromotionsFormat(item.product.promotions)">
+									{{item.product.promotions.name}}
+									<text v-if="hasLogin && item.product.price1TextFlag != 1">:¥{{item.product.retailPrice | NumFormat}}</text>
+								</view>
+								<view class="floor-tags" v-else>{{item.product.promotions.name}}</view>	
+							</template>
+							<template v-if="item.product.actStatus ===0  &&  item.product.ladderPriceFlag===1">
+								<view class="floor-tags">阶梯价格</view>	
+							</template>
+						</template>
+					</view>	
+					<view v-if="hasLogin">
+						<template v-if="item.product.productCategory == 1">
+							<template v-if="userIdentity == 3">
+								<template v-if="item.product.shopID == shopId">
+									<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+										<text class="p big">¥未公开价格</text>
+									</view>
+									<view class="price tui-skeleton-rect" v-else :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+										<text class="p sm">¥</text>
+										<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+									</view>
+								</template>	
+								<template v-else>
+									<view class="no-price">
+										<view class="p-stars">
+											<text class="p-no">¥</text>
+											<uni-grader :grade="Number(item.product.price1Grade)" :margin="14"></uni-grader>
+										</view>
+									</view>	
+								</template>
+							</template>
+							<template v-else-if="userIdentity ===4">
+								<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+									<text class="p big">¥未公开价格</text>
+								</view>
+								<view class="title-none"  v-if="item.product.price1TextFlag === '2'">
+									<text class="p big">¥价格仅会员可见</text>
+								</view>
+								<view class="price tui-skeleton-rect" v-if="item.product.price1TextFlag === '0'" :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+									<text class="p sm">¥</text>
+									<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+								</view>
+							</template>
+							<template v-else>
+								<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+									<text class="p big">¥未公开价格</text>
+								</view>
+								<view class="price tui-skeleton-rect" v-else :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+									<text class="p sm">¥</text>
+									<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+								</view>
+							</template>
+						</template>	
+						<template v-else>
+							<view class="price tui-skeleton-rect" v-if="item.product.detailTalkFlag == '2'">
+								<text class="p sm">¥</text>
+								<text class="p big">价格详聊</text>
+							</view>
+							<view class="price tui-skeleton-rect" v-else>
+								<text class="p sm">¥</text>
+								<text class="p big">{{ item.product.retailPrice | NumFormat }}</text>
+							</view>
+						</template>
+					</view>
+					<view v-else class="no-price">
+						<template v-if="item.product.productCategory == 1">
+							<view class="p-stars">
+								<text class="p-no">¥</text>
+								<uni-grader :grade="Number(item.product.price1Grade)" :margin="14"></uni-grader>
+							</view>
+						</template>
+						<template v-else>
+							<view class="p-stars">
+								<text class="p-no">¥登录可见</text>
+							</view>
+						</template>
+					</view>	
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import { mapState,mapMutations} from 'vuex';
+	import uniGrader from '@/components/uni-grade/uni-grade.vue'
+	export default{
+		name:"templateD",
+		components:{
+			uniGrader
+		},
+		props:{
+			pageData:{
+				type:Object
+			},
+			userIdentity:{
+				type:Number
+			}
+		},
+		data() {
+			return{
+				shopId:0,
+				floorData:{}
+			}
+		},
+		filters: {
+			NumFormat:function(text) {//处理金额				
+				return Number(text).toFixed(2);			
+			},		
+		},
+		created(){
+			this.initData(this.pageData)
+		},
+		computed: {
+			...mapState(['hasLogin','userInfo','isActivity'])
+		},
+		watch: {
+			pageData: {
+				handler: function (el) {//监听对象的变换使用 function,箭头函数容易出现this指向不正确
+					this.pageData = el
+					this.initData(this.pageData)
+				},
+				deep: true
+			}
+		},
+		methods:{
+			initData(data){
+				this.$api.getStorage().then((resolve) =>{
+					this.shopId = resolve.shopID ? resolve.shopID : 0
+				})
+				this.floorData = data
+				// console.log(this.floorData)
+			},
+			PromotionsFormat(promo){//促销活动类型数据处理
+				if(promo!=null){
+					if(promo.type == 1 && promo.mode == 1){
+						return true
+					}else{
+						return false
+					}
+				}
+				return false
+			},
+			navToDetailPage(pros) {//跳转商品详情页
+				this.$api.FlooryNavigateTo(pros)
+			},
+			BannerNavigateTo(linkType,linkId,linkHref,keyword) {//跳转商品详情页
+				this.$api.BannerNavigateTo(linkType,linkId,linkHref,keyword)
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.section_page_main{
+		width: 100%;
+		height: auto;
+		box-sizing: border-box;
+		.floor-item{
+			width: 339rpx;
+			height: 516rpx;
+			margin-right: 20rpx;
+			font-size: $font-size-24;
+			color: $text-color;
+			background: #FFFFFF;
+			line-height: 36rpx;
+			border-radius: 16rpx;
+			margin-bottom: 20rpx;
+			float: left;
+			box-sizing: border-box;
+			position: relative;
+			&.ad_01{
+				width: 100%;
+				height: 240rpx;
+				margin-right: 0;
+				.item-img-gg{
+					width: 100%;
+					height: 240rpx;
+					display: block;
+					border-radius: 16rpx;
+				}
+			}
+			&:nth-child(odd){
+				margin-right: 0;
+			}
+			.item-img-gg{
+				width: 339rpx;
+				height: 516rpx;
+				display: block;
+				border-radius: 16rpx;
+			}
+			.item-img{
+				width: 339rpx;
+				height: 339rpx;
+				border-radius: 16rpx 16rpx 0 0;
+				display: block;
+				margin-bottom: 8rpx;
+			}
+			.floor-item_tag{
+				width: 100%;
+				height: 32rpx;
+				float: left;
+				margin: 20rpx 0;
+				padding: 0 20rpx;
+				box-sizing: border-box;
+				text{
+					display: inline-block;
+					padding: 0 8rpx;
+					border: 1px solid #e3ebf7;
+					border-radius: 8rpx ;
+					color: #9aa5b5;
+					font-size: $font-size-22;
+					line-height: 32rpx;
+					text-align: center;
+					float: left;
+				}
+			}
+			.floor-item-content{
+				width: 100%;
+				padding: 0 20rpx;
+				box-sizing: border-box;
+			}
+			.floor-item-act{
+				display: block;
+				width: 100%;
+				height: 32rpx;
+				text-align: center;
+				box-sizing: border-box;
+			}
+			.floor-tags{
+				height: 28rpx;
+				border-radius: 6rpx;
+				background-color: #FFFFFF;
+				line-height: 28rpx;
+				color: $color-system;
+				text-align: center;
+				display: inline-block;
+				padding:0 16rpx;
+				font-size: $font-size-20;
+				border: 1px solid #E15616;
+				float: left;
+			}
+			.title-none{
+				font-size: $font-size-26;
+				color: #FF2A2A;
+				line-height: 54rpx;
+			}
+			.title{
+				width: 100%;
+				height: 70rpx;
+				display: flex;
+				line-height: 35rpx;
+				flex-direction: column;
+				margin: 8rpx 0;
+				padding: 0;
+				position: relative;
+				.mclap{
+					width: 100%;
+					line-height:35rpx;
+					text-overflow:ellipsis;
+					display: -webkit-box;
+					word-break: break-all;
+					-webkit-box-orient: vertical;
+					-webkit-line-clamp: 2;
+					overflow: hidden;
+					font-size: 26rpx;
+					&.indent{
+						text-indent: 95rpx;
+					}
+				}
+				.mclap-tag{
+					display: block;
+					width: 84rpx;
+					height: 32rpx;
+					background-image: linear-gradient(270deg, #f9c023 0%, #f83600 100%);
+					border-radius: 4rpx 48rpx 4px 4px;
+					line-height: 32rpx;
+					font-size: $font-size-22;
+					color: #FFFFFF;
+					text-align: center;
+					position: absolute;
+					left: 0;
+					top: 0;
+				}
+			}
+			.no-price{
+				height: 54rpx;
+				line-height: 54rpx;
+				display: flex;
+				box-sizing: border-box;
+				.p-no{
+					font-size: $font-size-28;
+					color: $text-color;
+					display: block;
+					float: left;
+				}
+				.p-stars{
+					float: left;
+				}
+			}
+			.price{
+				color: #FF2A2A;
+				line-height:54rpx;
+				&.none{
+					text-decoration: line-through;
+					color: #999999;
+				}
+				.sm{
+					font-size: $font-size-24;
+				}
+				.big{
+					font-size: $font-size-28;
+				}
+			}
+		}
+	}
+</style>

+ 360 - 0
components/cm-module/pageTemplate/templateE.vue

@@ -0,0 +1,360 @@
+<template>
+	<view class="section_page_main clearfix">
+		<view class="floor-item ad_01">
+			<image 	class="item-img-gg" 
+					:src="floorData.floorContent.appletsAdsImage1" 
+					@click="BannerNavigateTo(
+						floorData.floorContent.linkType1,
+						floorData.floorContent.linkParam1.id ? floorData.floorContent.linkParam1.id : '',
+						floorData.floorContent.adsLink1,
+						floorData.floorContent.linkParam1.keyword ? floorData.floorContent.linkParam1.keyword : ''
+					)"
+					mode="aspectFill">
+			</image>
+		</view>
+		<view class="floor-item ad_04 clearfix" v-for="(item, idx) in floorData.floorImageList" v-if="idx < 4" :key="idx" @click.stop="navToDetailPage(item)">
+			<image class="item-img tui-skeleton-fillet" :src="item.image" mode="aspectFill"></image>
+			<view class="floor-item_tag" v-if="item.listType == 2">
+				<text>{{ item.label }}</text>
+			</view>
+			<view class="floor-item-content">
+				<view class="title tui-skeleton-rect">
+					<text class="mclap-tag" v-if="item.product.beautyActFlag == '1'">美博会</text>
+					<text class="mclap" :class="item.product.beautyActFlag == '1' ? 'indent' : ''">{{item.name}} </text>
+				</view>
+				<view class="floor-item-price" v-if="item.listType == 1">
+					<view class="floor-item-act">
+						<template v-if="userIdentity === 3">
+							<template v-if="item.product.actStatus===1">
+								<view class="floor-tags" v-if="PromotionsFormat(item.product.promotions)">
+									{{item.product.promotions.name}}
+									<text v-if="hasLogin && item.product.price1TextFlag != 1 && item.product.shopID == shopId">:¥{{item.product.retailPrice | NumFormat}}</text>
+								</view>
+								<view class="floor-tags" v-else>{{item.product.promotions.name}}</view>	
+							</template>
+							<template v-if="item.product.actStatus ===0  &&  item.product.ladderPriceFlag===1">
+								<view class="floor-tags">阶梯价格</view>	
+							</template>
+						</template>	
+						<template v-else>
+							<template v-if="item.product.actStatus===1">
+								<view class="floor-tags" v-if="PromotionsFormat(item.product.promotions)">
+									{{item.product.promotions.name}}
+									<text v-if="hasLogin && item.product.price1TextFlag != 1">:¥{{item.product.retailPrice | NumFormat}}</text>
+								</view>
+								<view class="floor-tags" v-else>{{item.product.promotions.name}}</view>	
+							</template>
+							<template v-if="item.product.actStatus ===0  &&  item.product.ladderPriceFlag===1">
+								<view class="floor-tags">阶梯价格</view>	
+							</template>
+						</template>
+					</view>	
+					<view v-if="hasLogin">
+						<template v-if="item.product.productCategory == 1">
+							<template v-if="userIdentity == 3">
+								<template v-if="item.product.shopID == shopId">
+									<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+										<text class="p big">¥未公开价格</text>
+									</view>
+									<view class="price tui-skeleton-rect" v-else :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+										<text class="p sm">¥</text>
+										<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+									</view>
+								</template>	
+								<template v-else>
+									<view class="no-price">
+										<view class="p-stars">
+											<text class="p-no">¥</text>
+											<uni-grader :grade="Number(item.product.price1Grade)" :margin="14"></uni-grader>
+										</view>
+									</view>	
+								</template>
+							</template>
+							<template v-else-if="userIdentity ===4">
+								<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+									<text class="p big">¥未公开价格</text>
+								</view>
+								<view class="title-none"  v-if="item.product.price1TextFlag === '2'">
+									<text class="p big">¥价格仅会员可见</text>
+								</view>
+								<view class="price tui-skeleton-rect" v-if="item.product.price1TextFlag === '0'" :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+									<text class="p sm">¥</text>
+									<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+								</view>
+							</template>
+							<template v-else>
+								<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+									<text class="p big">¥未公开价格</text>
+								</view>
+								<view class="price tui-skeleton-rect" v-else :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+									<text class="p sm">¥</text>
+									<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+								</view>
+							</template>
+						</template>	
+						<template v-else>
+							<view class="price tui-skeleton-rect" v-if="item.product.detailTalkFlag == '2'">
+								<text class="p sm">¥</text>
+								<text class="p big">价格详聊</text>
+							</view>
+							<view class="price tui-skeleton-rect" v-else>
+								<text class="p sm">¥</text>
+								<text class="p big">{{ item.product.retailPrice | NumFormat }}</text>
+							</view>
+						</template>
+					</view>
+					<view v-else class="no-price">
+						<template v-if="item.product.productCategory == 1">
+							<view class="p-stars">
+								<text class="p-no">¥</text>
+								<uni-grader :grade="Number(item.product.price1Grade)" :margin="14"></uni-grader>
+							</view>
+						</template>
+						<template v-else>
+							<view class="p-stars">
+								<text class="p-no">¥登录可见</text>
+							</view>
+						</template>
+					</view>	
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import { mapState,mapMutations} from 'vuex';
+	import uniGrader from '@/components/uni-grade/uni-grade.vue'
+	export default{
+		name:"templateE",
+		components:{
+			uniGrader
+		},
+		props:{
+			pageData:{
+				type:Object
+			},
+			userIdentity:{
+				type:Number
+			}
+		},
+		data() {
+			return{
+				shopId:0,
+				floorData:{}
+			}
+		},
+		filters: {
+			NumFormat:function(text) {//处理金额				
+				return Number(text).toFixed(2);			
+			},		
+		},
+		created(){
+			this.initData(this.pageData)
+		},
+		computed: {
+			...mapState(['hasLogin','userInfo','isActivity'])
+		},
+		watch: {
+			pageData: {
+				handler: function (el) {//监听对象的变换使用 function,箭头函数容易出现this指向不正确
+					this.pageData = el
+					this.initData(this.pageData)
+				},
+				deep: true
+			}
+		},
+		methods:{
+			initData(data){
+				this.$api.getStorage().then((resolve) =>{
+					this.shopId = resolve.shopID ? resolve.shopID : 0
+				})
+				this.floorData = data
+				// console.log(this.floorData)
+			},
+			PromotionsFormat(promo){//促销活动类型数据处理
+				if(promo!=null){
+					if(promo.type == 1 && promo.mode == 1){
+						return true
+					}else{
+						return false
+					}
+				}
+				return false
+			},
+			navToDetailPage(pros) {//跳转商品详情页
+				this.$api.FlooryNavigateTo(pros)
+			},
+			BannerNavigateTo(linkType,linkId,linkHref,keyword) {//跳转商品详情页
+				this.$api.BannerNavigateTo(linkType,linkId,linkHref,keyword)
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.section_page_main{
+		width: 100%;
+		height: auto;
+		box-sizing: border-box;
+		.floor-item{
+			width: 339rpx;
+			height: 516rpx;
+			margin-right: 20rpx;
+			font-size: $font-size-24;
+			color: $text-color;
+			background: #FFFFFF;
+			line-height: 36rpx;
+			border-radius: 16rpx;
+			margin-bottom: 20rpx;
+			float: left;
+			box-sizing: border-box;
+			position: relative;
+			&.ad_01{
+				width: 100%;
+				height: 240rpx;
+				.item-img-gg{
+					width: 100%;
+					height: 240rpx;
+					display: block;
+					border-radius: 16rpx;
+				}
+			}
+			&.ad_02{
+				margin-right: 20rpx;
+			}	
+			&:nth-child(odd){
+				margin-right: 0;
+			}
+			.item-img-gg{
+				width: 339rpx;
+				height: 516rpx;
+				display: block;
+				border-radius: 16rpx;
+			}
+			.item-img{
+				width: 339rpx;
+				height: 339rpx;
+				border-radius: 16rpx 16rpx 0 0;
+				display: block;
+				margin-bottom: 8rpx;
+			}
+			.floor-item_tag{
+				width: 100%;
+				height: 32rpx;
+				float: left;
+				margin: 20rpx 0;
+				padding: 0 20rpx;
+				box-sizing: border-box;
+				text{
+					display: inline-block;
+					padding: 0 8rpx;
+					border: 1px solid #e3ebf7;
+					border-radius: 8rpx ;
+					color: #9aa5b5;
+					font-size: $font-size-22;
+					line-height: 32rpx;
+					text-align: center;
+					float: left;
+				}
+			}
+			.floor-item-content{
+				width: 100%;
+				padding: 0 20rpx;
+				box-sizing: border-box;
+			}
+			.floor-item-act{
+				display: block;
+				width: 100%;
+				height: 32rpx;
+				text-align: center;
+				box-sizing: border-box;
+			}
+			.floor-tags{
+				height: 28rpx;
+				border-radius: 6rpx;
+				background-color: #FFFFFF;
+				line-height: 28rpx;
+				color: $color-system;
+				text-align: center;
+				display: inline-block;
+				padding:0 16rpx;
+				font-size: $font-size-20;
+				border: 1px solid #E15616;
+				float: left;
+			}
+			.title-none{
+				font-size: $font-size-26;
+				color: #FF2A2A;
+				line-height: 54rpx;
+			}
+			.title{
+				width: 100%;
+				height: 70rpx;
+				display: flex;
+				line-height: 35rpx;
+				flex-direction: column;
+				margin: 8rpx 0;
+				padding: 0;
+				position: relative;
+				.mclap{
+					width: 100%;
+					line-height:35rpx;
+					text-overflow:ellipsis;
+					display: -webkit-box;
+					word-break: break-all;
+					-webkit-box-orient: vertical;
+					-webkit-line-clamp: 2;
+					overflow: hidden;
+					font-size: 26rpx;
+					&.indent{
+						text-indent: 95rpx;
+					}
+				}
+				.mclap-tag{
+					display: block;
+					width: 84rpx;
+					height: 32rpx;
+					background-image: linear-gradient(270deg, #f9c023 0%, #f83600 100%);
+					border-radius: 4rpx 48rpx 4px 4px;
+					line-height: 32rpx;
+					font-size: $font-size-22;
+					color: #FFFFFF;
+					text-align: center;
+					position: absolute;
+					left: 0;
+					top: 0;
+				}
+			}
+			.no-price{
+				height: 54rpx;
+				line-height: 54rpx;
+				display: flex;
+				box-sizing: border-box;
+				.p-no{
+					font-size: $font-size-28;
+					color: $text-color;
+					display: block;
+					float: left;
+				}
+				.p-stars{
+					float: left;
+				}
+			}
+			.price{
+				color: #FF2A2A;
+				line-height:54rpx;
+				&.none{
+					text-decoration: line-through;
+					color: #999999;
+				}
+				.sm{
+					font-size: $font-size-24;
+				}
+				.big{
+					font-size: $font-size-28;
+				}
+			}
+		}
+	}
+</style>

+ 378 - 0
components/cm-module/pageTemplate/templateF.vue

@@ -0,0 +1,378 @@
+<template>
+	<view class="section_page_main clearfix">
+		<view class="floor-item ad_04 clearfix" v-for="(item, idx) in floorData.floorImageList" v-if="idx < 4" :key="idx" @click.stop="navToDetailPage(item)">
+			<image class="item-img tui-skeleton-fillet" :src="item.image" mode="aspectFill"></image>
+			<view class="floor-item_tag" v-if="item.listType == 2">
+				<text>{{ item.label }}</text>
+			</view>
+			<view class="floor-item-content">
+				<view class="title tui-skeleton-rect">
+					<text class="mclap-tag" v-if="item.product.beautyActFlag == '1'">美博会</text>
+					<text class="mclap" :class="item.product.beautyActFlag == '1' ? 'indent' : ''">{{item.name}} </text>
+				</view>
+				<view class="floor-item-price" v-if="item.listType == 1">
+					<view class="floor-item-act">
+						<template v-if="userIdentity === 3">
+							<template v-if="item.product.actStatus===1">
+								<view class="floor-tags" v-if="PromotionsFormat(item.product.promotions)">
+									{{item.product.promotions.name}}
+									<text v-if="hasLogin && item.product.price1TextFlag != 1 && item.product.shopID == shopId">:¥{{item.product.retailPrice | NumFormat}}</text>
+								</view>
+								<view class="floor-tags" v-else>{{item.product.promotions.name}}</view>	
+							</template>
+							<template v-if="item.product.actStatus ===0  &&  item.product.ladderPriceFlag===1">
+								<view class="floor-tags">阶梯价格</view>	
+							</template>
+						</template>	
+						<template v-else>
+							<template v-if="item.product.actStatus===1">
+								<view class="floor-tags" v-if="PromotionsFormat(item.product.promotions)">
+									{{item.product.promotions.name}}
+									<text v-if="hasLogin && item.product.price1TextFlag != 1">:¥{{item.product.retailPrice | NumFormat}}</text>
+								</view>
+								<view class="floor-tags" v-else>{{item.product.promotions.name}}</view>	
+							</template>
+							<template v-if="item.product.actStatus ===0  &&  item.product.ladderPriceFlag===1">
+								<view class="floor-tags">阶梯价格</view>	
+							</template>
+						</template>
+					</view>	
+					<view v-if="hasLogin">
+						<template v-if="item.product.productCategory == 1">
+							<template v-if="userIdentity == 3">
+								<template v-if="item.product.shopID == shopId">
+									<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+										<text class="p big">¥未公开价格</text>
+									</view>
+									<view class="price tui-skeleton-rect" v-else :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+										<text class="p sm">¥</text>
+										<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+									</view>
+								</template>	
+								<template v-else>
+									<view class="no-price">
+										<view class="p-stars">
+											<text class="p-no">¥</text>
+											<uni-grader :grade="Number(item.product.price1Grade)" :margin="14"></uni-grader>
+										</view>
+									</view>	
+								</template>
+							</template>
+							<template v-else-if="userIdentity ===4">
+								<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+									<text class="p big">¥未公开价格</text>
+								</view>
+								<view class="title-none"  v-if="item.product.price1TextFlag === '2'">
+									<text class="p big">¥价格仅会员可见</text>
+								</view>
+								<view class="price tui-skeleton-rect" v-if="item.product.price1TextFlag === '0'" :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+									<text class="p sm">¥</text>
+									<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+								</view>
+							</template>
+							<template v-else>
+								<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+									<text class="p big">¥未公开价格</text>
+								</view>
+								<view class="price tui-skeleton-rect" v-else :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+									<text class="p sm">¥</text>
+									<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+								</view>
+							</template>
+						</template>	
+						<template v-else>
+							<view class="price tui-skeleton-rect" v-if="item.product.detailTalkFlag == '2'">
+								<text class="p sm">¥</text>
+								<text class="p big">价格详聊</text>
+							</view>
+							<view class="price tui-skeleton-rect" v-else>
+								<text class="p sm">¥</text>
+								<text class="p big">{{ item.product.retailPrice | NumFormat }}</text>
+							</view>
+						</template>
+					</view>
+					<view v-else class="no-price">
+						<template v-if="item.product.productCategory == 1">
+							<view class="p-stars">
+								<text class="p-no">¥</text>
+								<uni-grader :grade="Number(item.product.price1Grade)" :margin="14"></uni-grader>
+							</view>
+						</template>
+						<template v-else>
+							<view class="p-stars">
+								<text class="p-no">¥登录可见</text>
+							</view>
+						</template>
+					</view>		
+				</view>
+			</view>
+		</view>
+		<view class="floor-item ad_01">
+			<image 	class="item-img-gg" 
+					:src="floorData.floorContent.appletsAdsImage1" 
+					@click="BannerNavigateTo(
+						floorData.floorContent.linkType1,
+						floorData.floorContent.linkParam1.id ? floorData.floorContent.linkParam1.id : '',
+						floorData.floorContent.adsLink1,
+						floorData.floorContent.linkParam1.keyword ? floorData.floorContent.linkParam1.keyword : ''
+					)"
+					mode="aspectFill">
+			</image>
+		</view>
+	</view>
+</template>
+
+<script>
+	import { mapState,mapMutations} from 'vuex';
+	import uniGrader from '@/components/uni-grade/uni-grade.vue'
+	export default{
+		name:"templateF",
+		components:{
+			uniGrader
+		},
+		props:{
+			pageData:{
+				type:Object
+			},
+			userIdentity:{
+				type:Number
+			}
+		},
+		data() {
+			return{
+				shopId:0,
+				floorData:{}
+			}
+		},
+		filters: {
+			NumFormat:function(text) {//处理金额				
+				return Number(text).toFixed(2);			
+			},		
+		},
+		created(){
+			this.initData(this.pageData)
+		},
+		computed: {
+			...mapState(['hasLogin','userInfo','isActivity'])
+		},
+		watch: {
+			pageData: {
+				handler: function (el) {//监听对象的变换使用 function,箭头函数容易出现this指向不正确
+					this.pageData = el
+					this.initData(this.pageData)
+				},
+				deep: true
+			}
+		},
+		methods:{
+			initData(data){
+				this.$api.getStorage().then((resolve) =>{
+					this.shopId = resolve.shopID ? resolve.shopID : 0
+				})
+				this.floorData = data
+				// console.log(this.floorData)
+			},
+			PromotionsFormat(promo){//促销活动类型数据处理
+				if(promo!=null){
+					if(promo.type == 1 && promo.mode == 1){
+						return true
+					}else{
+						return false
+					}
+				}
+				return false
+			},
+			navToDetailPage(pros) {//跳转商品详情页
+				this.$api.FlooryNavigateTo(pros)
+			},
+			BannerNavigateTo(linkType,linkId,linkHref,keyword) {//跳转商品详情页
+				this.$api.BannerNavigateTo(linkType,linkId,linkHref,keyword)
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.section_page_main{
+		width: 100%;
+		height: auto;
+		box-sizing: border-box;
+		.floor-item{
+			width: 339rpx;
+			height: 516rpx;
+			margin-right: 20rpx;
+			font-size: $font-size-24;
+			color: $text-color;
+			background: #FFFFFF;
+			line-height: 36rpx;
+			border-radius: 16rpx;
+			margin-bottom: 20rpx;
+			float: left;
+			box-sizing: border-box;
+			position: relative;
+			&.ad_01{
+				width: 100%;
+				height: 240rpx;
+				margin-right: 0;
+				.item-img-gg{
+					width: 100%;
+					height: 240rpx;
+					display: block;
+					border-radius: 16rpx;
+				}
+			}
+			&:nth-child(2n){
+				margin-right: 0;
+			}
+			.item-img-gg{
+				width: 339rpx;
+				height: 516rpx;
+				display: block;
+				border-radius: 16rpx;
+			}
+			.item-img{
+				width: 339rpx;
+				height: 339rpx;
+				border-radius: 16rpx 16rpx 0 0;
+				display: block;
+				margin-bottom: 8rpx;
+			}
+			.floor-item_tag{
+				width: 100%;
+				height: 32rpx;
+				float: left;
+				margin: 20rpx 0;
+				padding: 0 20rpx;
+				box-sizing: border-box;
+				text{
+					display: inline-block;
+					padding: 0 8rpx;
+					border: 1px solid #e3ebf7;
+					border-radius: 8rpx ;
+					color: #9aa5b5;
+					font-size: $font-size-22;
+					line-height: 32rpx;
+					text-align: center;
+					float: left;
+				}
+			}
+			.floor-item_tag{
+				width: 100%;
+				height: 32rpx;
+				float: left;
+				margin: 8rpx 0;
+				padding: 0 20rpx;
+				box-sizing: border-box;
+				margin-bottom: 20rpx;
+				text{
+					display: inline-block;
+					padding: 0 8rpx;
+					border: 1px solid #e3ebf7;
+					border-radius: 8rpx ;
+					color: #9aa5b5;
+					font-size: $font-size-22;
+					line-height: 32rpx;
+					text-align: center;
+					float: left;
+				}
+			}
+			.floor-item-content{
+				width: 100%;
+				padding: 0 20rpx;
+				box-sizing: border-box;
+			}
+			.floor-item-act{
+				display: block;
+				width: 100%;
+				height: 32rpx;
+				text-align: center;
+				box-sizing: border-box;
+			}
+			.floor-tags{
+				height: 28rpx;
+				border-radius: 6rpx;
+				background-color: #FFFFFF;
+				line-height: 28rpx;
+				color: $color-system;
+				text-align: center;
+				display: inline-block;
+				padding:0 16rpx;
+				font-size: $font-size-20;
+				border: 1px solid #E15616;
+				float: left;
+			}
+			.title-none{
+				font-size: $font-size-26;
+				color: #FF2A2A;
+				line-height: 54rpx;
+			}
+			.title{
+				width: 100%;
+				height: 70rpx;
+				display: flex;
+				line-height: 35rpx;
+				flex-direction: column;
+				margin: 8rpx 0;
+				padding: 0;
+				position: relative;
+				.mclap{
+					width: 100%;
+					line-height:35rpx;
+					text-overflow:ellipsis;
+					display: -webkit-box;
+					word-break: break-all;
+					-webkit-box-orient: vertical;
+					-webkit-line-clamp: 2;
+					overflow: hidden;
+					font-size: 26rpx;
+					&.indent{
+						text-indent: 95rpx;
+					}
+				}
+				.mclap-tag{
+					display: block;
+					width: 84rpx;
+					height: 32rpx;
+					background-image: linear-gradient(270deg, #f9c023 0%, #f83600 100%);
+					border-radius: 4rpx 48rpx 4px 4px;
+					line-height: 32rpx;
+					font-size: $font-size-22;
+					color: #FFFFFF;
+					text-align: center;
+					position: absolute;
+					left: 0;
+					top: 0;
+				}
+			}
+			.no-price{
+				height: 54rpx;
+				line-height: 54rpx;
+				display: flex;
+				box-sizing: border-box;
+				.p-no{
+					font-size: $font-size-28;
+					color: $text-color;
+					display: block;
+					float: left;
+				}
+				.p-stars{
+					float: left;
+				}
+			}
+			.price{
+				color: #FF2A2A;
+				line-height:54rpx;
+				&.none{
+					text-decoration: line-through;
+					color: #999999;
+				}
+				.sm{
+					font-size: $font-size-24;
+				}
+				.big{
+					font-size: $font-size-28;
+				}
+			}
+		}
+	}
+</style>

+ 333 - 0
components/cm-module/pageTemplate/templateG.vue

@@ -0,0 +1,333 @@
+<template>
+	<view class="section_page_main clearfix">
+		<view class="floor-item ad_04 clearfix" v-for="(item, idx) in floorData.floorImageList" v-if="idx < 4" :key="idx" @click.stop="navToDetailPage(item)">
+			<image class="item-img tui-skeleton-fillet" :src="item.image" mode="aspectFill"></image>
+			<view class="floor-item_tag" v-if="item.listType == 2">
+				<text>{{ item.label }}</text>
+			</view>
+			<view class="floor-item-content">
+				<view class="title tui-skeleton-rect">
+					<text class="mclap-tag" v-if="item.product.beautyActFlag == '1'">美博会</text>
+					<text class="mclap" :class="item.product.beautyActFlag == '1' ? 'indent' : ''">{{item.name}} </text>
+				</view>
+				<view class="floor-item-price" v-if="item.listType == 1">
+					<view class="floor-item-act">
+						<template v-if="userIdentity === 3">
+							<template v-if="item.product.actStatus===1">
+								<view class="floor-tags" v-if="PromotionsFormat(item.product.promotions)">
+									{{item.product.promotions.name}}
+									<text v-if="hasLogin && item.product.price1TextFlag != 1 && item.product.shopID == shopId">:¥{{item.product.retailPrice | NumFormat}}</text>
+								</view>
+								<view class="floor-tags" v-else>{{item.product.promotions.name}}</view>	
+							</template>
+							<template v-if="item.product.actStatus ===0  &&  item.product.ladderPriceFlag===1">
+								<view class="floor-tags">阶梯价格</view>	
+							</template>
+						</template>	
+						<template v-else>
+							<template v-if="item.product.actStatus===1">
+								<view class="floor-tags" v-if="PromotionsFormat(item.product.promotions)">
+									{{item.product.promotions.name}}
+									<text v-if="hasLogin && item.product.price1TextFlag != 1">:¥{{item.product.retailPrice | NumFormat}}</text>
+								</view>
+								<view class="floor-tags" v-else>{{item.product.promotions.name}}</view>	
+							</template>
+							<template v-if="item.product.actStatus ===0  &&  item.product.ladderPriceFlag===1">
+								<view class="floor-tags">阶梯价格</view>	
+							</template>
+						</template>
+					</view>	
+					<view v-if="hasLogin">
+						<template v-if="item.product.productCategory == 1">
+							<template v-if="userIdentity == 3">
+								<template v-if="item.product.shopID == shopId">
+									<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+										<text class="p big">¥未公开价格</text>
+									</view>
+									<view class="price tui-skeleton-rect" v-else :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+										<text class="p sm">¥</text>
+										<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+									</view>
+								</template>	
+								<template v-else>
+									<view class="no-price">
+										<view class="p-stars">
+											<text class="p-no">¥</text>
+											<uni-grader :grade="Number(item.product.price1Grade)" :margin="14"></uni-grader>
+										</view>
+									</view>	
+								</template>
+							</template>
+							<template v-else-if="userIdentity ===4">
+								<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+									<text class="p big">¥未公开价格</text>
+								</view>
+								<view class="title-none"  v-if="item.product.price1TextFlag === '2'">
+									<text class="p big">¥价格仅会员可见</text>
+								</view>
+								<view class="price tui-skeleton-rect" v-if="item.product.price1TextFlag === '0'" :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+									<text class="p sm">¥</text>
+									<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+								</view>
+							</template>
+							<template v-else>
+								<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+									<text class="p big">¥未公开价格</text>
+								</view>
+								<view class="price tui-skeleton-rect" v-else :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+									<text class="p sm">¥</text>
+									<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+								</view>
+							</template>
+						</template>	
+						<template v-else>
+							<view class="price tui-skeleton-rect" v-if="item.product.detailTalkFlag == '2'">
+								<text class="p sm">¥</text>
+								<text class="p big">价格详聊</text>
+							</view>
+							<view class="price tui-skeleton-rect" v-else>
+								<text class="p sm">¥</text>
+								<text class="p big">{{ item.product.retailPrice | NumFormat }}</text>
+							</view>
+						</template>
+					</view>
+					<view v-else class="no-price">
+						<template v-if="item.product.productCategory == 1">
+							<view class="p-stars">
+								<text class="p-no">¥</text>
+								<uni-grader :grade="Number(item.product.price1Grade)" :margin="14"></uni-grader>
+							</view>
+						</template>
+						<template v-else>
+							<view class="p-stars">
+								<text class="p-no">¥登录可见</text>
+							</view>
+						</template>
+					</view>	
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import { mapState,mapMutations} from 'vuex';
+	import uniGrader from '@/components/uni-grade/uni-grade.vue'
+	export default{
+		name:"templateG",
+		components:{
+			uniGrader
+		},
+		props:{
+			pageData:{
+				type:Object
+			},
+			userIdentity:{
+				type:Number
+			}
+		},
+		data() {
+			return{
+				shopId:0,
+				floorData:{}
+			}
+		},
+		filters: {
+			NumFormat:function(text) {//处理金额				
+				return Number(text).toFixed(2);			
+			},		
+		},
+		created(){
+			this.initData(this.pageData)
+		},
+		computed: {
+			...mapState(['hasLogin','userInfo','isActivity'])
+		},
+		watch: {
+			pageData: {
+				handler: function (el) {//监听对象的变换使用 function,箭头函数容易出现this指向不正确
+					this.pageData = el
+					this.initData(this.pageData)
+				},
+				deep: true
+			}
+		},
+		methods:{
+			initData(data){
+				this.$api.getStorage().then((resolve) =>{
+					this.shopId = resolve.shopID ? resolve.shopID : 0
+				})
+				this.floorData = data
+				// console.log(this.floorData)
+			},
+			PromotionsFormat(promo){//促销活动类型数据处理
+				if(promo!=null){
+					if(promo.type == 1 && promo.mode == 1){
+						return true
+					}else{
+						return false
+					}
+				}
+				return false
+			},
+			
+			navToDetailPage(pros) {//跳转商品详情页
+				this.$api.FlooryNavigateTo(pros)
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.section_page_main{
+		width: 100%;
+		height: auto;
+		box-sizing: border-box;
+		.floor-item{
+			width: 339rpx;
+			height: 516rpx;
+			margin-right: 20rpx;
+			font-size: $font-size-24;
+			color: $text-color;
+			background: #FFFFFF;
+			line-height: 36rpx;
+			border-radius: 16rpx;
+			margin-bottom: 20rpx;
+			float: left;
+			box-sizing: border-box;
+			position: relative;
+			&:nth-child(2n){
+				margin-right: 0;
+			}
+			.item-img-gg{
+				width: 339rpx;
+				height: 516rpx;
+				display: block;
+				border-radius: 16rpx;
+			}
+			.item-img{
+				width: 339rpx;
+				height: 339rpx;
+				border-radius: 16rpx 16rpx 0 0;
+				display: block;
+				margin-bottom: 8rpx;
+			}
+			.floor-item_tag{
+				width: 100%;
+				height: 32rpx;
+				float: left;
+				margin: 20rpx 0;
+				padding: 0 20rpx;
+				box-sizing: border-box;
+				text{
+					display: inline-block;
+					padding: 0 8rpx;
+					border: 1px solid #e3ebf7;
+					border-radius: 8rpx ;
+					color: #9aa5b5;
+					font-size: $font-size-22;
+					line-height: 32rpx;
+					text-align: center;
+					float: left;
+				}
+			}
+			.floor-item-content{
+				width: 100%;
+				padding: 0 20rpx;
+				box-sizing: border-box;
+			}
+			.floor-item-act{
+				display: block;
+				width: 100%;
+				height: 32rpx;
+				text-align: center;
+				box-sizing: border-box;
+			}
+			.floor-tags{
+				height: 28rpx;
+				border-radius: 6rpx;
+				background-color: #FFFFFF;
+				line-height: 28rpx;
+				color: $color-system;
+				text-align: center;
+				display: inline-block;
+				padding:0 16rpx;
+				font-size: $font-size-20;
+				border: 1px solid #E15616;
+				float: left;
+			}
+			.title-none{
+				font-size: $font-size-26;
+				color: #FF2A2A;
+				line-height: 54rpx;
+			}
+			.title{
+				width: 100%;
+				height: 70rpx;
+				display: flex;
+				line-height: 35rpx;
+				flex-direction: column;
+				margin: 8rpx 0;
+				padding: 0;
+				position: relative;
+				.mclap{
+					width: 100%;
+					line-height:35rpx;
+					text-overflow:ellipsis;
+					display: -webkit-box;
+					word-break: break-all;
+					-webkit-box-orient: vertical;
+					-webkit-line-clamp: 2;
+					overflow: hidden;
+					font-size: 26rpx;
+					&.indent{
+						text-indent: 95rpx;
+					}
+				}
+				.mclap-tag{
+					display: block;
+					width: 84rpx;
+					height: 32rpx;
+					background-image: linear-gradient(270deg, #f9c023 0%, #f83600 100%);
+					border-radius: 4rpx 48rpx 4px 4px;
+					line-height: 32rpx;
+					font-size: $font-size-22;
+					color: #FFFFFF;
+					text-align: center;
+					position: absolute;
+					left: 0;
+					top: 0;
+				}
+			}
+			.no-price{
+				height: 54rpx;
+				line-height: 54rpx;
+				display: flex;
+				box-sizing: border-box;
+				.p-no{
+					font-size: $font-size-30;
+					color: $text-color;
+					display: block;
+					float: left;
+				}
+				.p-stars{
+					float: left;
+				}
+			}
+			.price{
+				color: #FF2A2A;
+				line-height:54rpx;
+				&.none{
+					text-decoration: line-through;
+					color: #999999;
+				}
+				.sm{
+					font-size: $font-size-24;
+				}
+				.big{
+					font-size: $font-size-28;
+				}
+			}
+		}
+	}
+</style>

+ 395 - 0
components/cm-module/pageTemplate/templateH.vue

@@ -0,0 +1,395 @@
+<template>
+	<view class="section_page_main clearfix">
+		<view class="recommend-list">
+			<swiper class="tui-banner-swiper" :autoplay="true" :interval="5000" :duration="500" :circular="true" @change="swiperChange">
+				<swiper-item v-for="(product,index) in productList" :key="index">
+					<view class="floor-item ad_04 clearfix" v-for="(item, idx) in product" :key="idx" @click.stop="navToDetailPage(item)">
+						<image class="item-img tui-skeleton-fillet" :src="item.image" mode="aspectFill"></image>
+						<view class="floor-item_tag" v-if="item.listType == 2">
+							<text>{{ item.label }}</text>
+						</view>
+						<view class="floor-item-content">
+							<view class="title tui-skeleton-rect">
+								<text class="mclap-tag" v-if="item.product.beautyActFlag == '1'">美博会</text>
+								<text class="mclap" :class="item.product.beautyActFlag == '1' ? 'indent' : ''">{{item.name}} </text>
+							</view>
+							<view class="floor-item-price" v-if="item.listType == 1">
+								<view class="floor-item-act">
+									<template v-if="userIdentity === 3">
+										<template v-if="item.product.actStatus===1">
+											<view class="floor-tags" v-if="PromotionsFormat(item.product.promotions)">
+												{{item.product.promotions.name}}
+												<text v-if="hasLogin && item.product.price1TextFlag != 1 && item.product.shopID == shopId">:¥{{item.product.retailPrice | NumFormat}}</text>
+											</view>
+											<view class="floor-tags" v-else>{{item.product.promotions.name}}</view>	
+										</template>
+										<template v-if="item.product.actStatus ===0  &&  item.product.ladderPriceFlag===1">
+											<view class="floor-tags">阶梯价格</view>	
+										</template>
+									</template>	
+									<template v-else>
+										<template v-if="item.product.actStatus===1">
+											<view class="floor-tags" v-if="PromotionsFormat(item.product.promotions)">
+												{{item.product.promotions.name}}
+												<text v-if="hasLogin && item.product.price1TextFlag != 1">:¥{{item.product.retailPrice | NumFormat}}</text>
+											</view>
+											<view class="floor-tags" v-else>{{item.product.promotions.name}}</view>	
+										</template>
+										<template v-if="item.product.actStatus ===0  &&  item.product.ladderPriceFlag===1">
+											<view class="floor-tags">阶梯价格</view>	
+										</template>
+									</template>
+								</view>	
+								<view v-if="hasLogin">
+									<template v-if="item.product.productCategory == 1">
+										<template v-if="userIdentity == 3">
+											<template v-if="item.product.shopID == shopId">
+												<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+													<text class="p big">¥未公开价格</text>
+												</view>
+												<view class="price tui-skeleton-rect" v-else :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+													<text class="p sm">¥</text>
+													<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+												</view>
+											</template>	
+											<template v-else>
+												<view class="no-price">
+													<view class="p-stars">
+														<text class="p-no">¥</text>
+														<uni-grader :grade="Number(item.product.price1Grade)" :margin="14"></uni-grader>
+													</view>
+												</view>	
+											</template>
+										</template>
+										<template v-else-if="userIdentity ===4">
+											<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+												<text class="p big">¥未公开价格</text>
+											</view>
+											<view class="title-none"  v-if="item.product.price1TextFlag === '2'">
+												<text class="p big">¥价格仅会员可见</text>
+											</view>
+											<view class="price tui-skeleton-rect" v-if="item.product.price1TextFlag === '0'" :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+												<text class="p sm">¥</text>
+												<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+											</view>
+										</template>
+										<template v-else>
+											<view class="title-none" v-if="item.product.price1TextFlag === '1'">
+												<text class="p big">¥未公开价格</text>
+											</view>
+											<view class="price tui-skeleton-rect" v-else :class="PromotionsFormat(item.product.promotions) ? 'none' : ''">
+												<text class="p sm">¥</text>
+												<text class="p big">{{ (PromotionsFormat(item.product.promotions) ? item.product.price1 : item.product.retailPrice ) | NumFormat}}</text>
+											</view>
+										</template>
+									</template>	
+									<template v-else>
+										<view class="price tui-skeleton-rect" v-if="item.product.detailTalkFlag == '2'">
+											<text class="p sm">¥</text>
+											<text class="p big">价格详聊</text>
+										</view>
+										<view class="price tui-skeleton-rect" v-else>
+											<text class="p sm">¥</text>
+											<text class="p big">{{ item.product.retailPrice | NumFormat }}</text>
+										</view>
+									</template>
+								</view>
+								<view v-else class="no-price">
+									<template v-if="item.product.productCategory == 1">
+										<view class="p-stars">
+											<text class="p-no">¥</text>
+											<uni-grader :grade="Number(item.product.price1Grade)" :margin="14"></uni-grader>
+										</view>
+									</template>
+									<template v-else>
+										<view class="p-stars">
+											<text class="p-no">¥登录可见</text>
+										</view>
+									</template>
+								</view>	
+							</view>
+						</view>
+					</view>
+				</swiper-item>
+			</swiper>
+			<view class="swiper__recommenddots-box" v-if="productList.length > 1">
+				<view v-for="(item,idx) in productList" 
+					  :key="idx" 
+					  :class="[idx===swiperCurrent?'swiper__dots-long':'none']" 
+					  :data-index="swiperCurrent" class="swiper__dots-item">
+				</view>	  
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import { mapState,mapMutations} from 'vuex';
+	import uniGrader from '@/components/uni-grade/uni-grade.vue'
+	export default{
+		name:"templateH",
+		components:{
+			uniGrader
+		},
+		props:{
+			pageData:{
+				type:Object
+			},
+			userIdentity:{
+				type:Number
+			}
+		},
+		data() {
+			return{
+				shopId:0,
+				productList:[],
+				current:100,
+				swiperCurrent:0,
+				pageSize:4,
+			}
+		},
+		filters: {
+			NumFormat:function(text) {//处理金额				
+				return Number(text).toFixed(2);			
+			},		
+		},
+		created(){
+			this.initData(this.pageData)
+		},
+		computed: {
+			...mapState(['hasLogin','userInfo','isActivity'])
+		},
+		watch: {
+			pageData: {
+				handler: function (el) {//监听对象的变换使用 function,箭头函数容易出现this指向不正确
+					this.pageData = el
+					this.initData(this.pageData)
+				},
+				deep: true
+			}
+		},
+		methods:{
+			initData(data){
+				this.$api.getStorage().then((resolve) =>{
+					this.shopId = resolve.shopID ? resolve.shopID : 0
+				})
+				if(data.floorImageList.length>0){
+					this.productList.splice(0,this.productList.length);
+					for (var i = 0, j = data.floorImageList.length; i < j; i += this.pageSize) {
+						this.productList.push(data.floorImageList.slice(i, i + this.pageSize));
+					}
+				}
+			},
+			PromotionsFormat(promo){//促销活动类型数据处理
+				if(promo!=null){
+					if(promo.type == 1 && promo.mode == 1){
+						return true
+					}else{
+						return false
+					}
+				}
+				return false
+			},
+			tabClick(index) {//轮播图切换
+				this.current = index;
+			},
+			swiperChange(e) {//轮播切换
+				const index = e.detail.current;
+				this.swiperCurrent = index;
+			},
+			navToDetailPage(pros) {//跳转商品详情页
+				this.$api.FlooryNavigateTo(pros)
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.section_page_main{
+		width: 100%;
+		height: auto;
+		box-sizing: border-box;
+		.recommend-list{
+			width: 100%;
+			height: 1100rpx;
+			position: relative;
+			padding-bottom: 20rpx;
+			.tui-banner-swiper {
+				width: 100%;
+				margin: 0 auto;
+				background: #F7F7F7;
+				height: 1100rpx;
+				overflow: hidden;
+				transform: translateY(0);
+				.floor-item{
+					width: 339rpx;
+					height: 516rpx;
+					margin-right: 20rpx;
+					font-size: $font-size-24;
+					color: $text-color;
+					background: #FFFFFF;
+					line-height: 36rpx;
+					border-radius: 16rpx;
+					margin-bottom: 20rpx;
+					float: left;
+					box-sizing: border-box;
+					position: relative;
+					&:nth-child(2n){
+						margin-right: 0;
+					}
+					.item-img{
+						width: 339rpx;
+						height: 339rpx;
+						border-radius: 16rpx 16rpx 0 0;
+						display: block;
+						margin-bottom: 8rpx;
+					}
+					.floor-item_tag{
+						width: 100%;
+						height: 32rpx;
+						float: left;
+						margin: 20rpx 0;
+						padding: 0 20rpx;
+						box-sizing: border-box;
+						text{
+							display: inline-block;
+							padding: 0 8rpx;
+							border: 1px solid #e3ebf7;
+							border-radius: 8rpx ;
+							color: #9aa5b5;
+							font-size: $font-size-22;
+							line-height: 32rpx;
+							text-align: center;
+							float: left;
+						}
+					}
+					.floor-item-content{
+						width: 100%;
+						padding: 0 20rpx;
+						box-sizing: border-box;
+					}
+					.floor-item-act{
+						display: block;
+						width: 100%;
+						height: 32rpx;
+						text-align: center;
+						box-sizing: border-box;
+					}
+					.floor-tags{
+						height: 28rpx;
+						border-radius: 6rpx;
+						background-color: #FFFFFF;
+						line-height: 28rpx;
+						color: $color-system;
+						text-align: center;
+						display: inline-block;
+						padding:0 16rpx;
+						font-size: $font-size-20;
+						border: 1px solid #E15616;
+						float: left;
+					}
+					.title-none{
+						font-size: $font-size-26;
+						color: #FF2A2A;
+						line-height: 54rpx;
+					}
+					.title{
+						width: 100%;
+						height: 70rpx;
+						display: flex;
+						line-height: 35rpx;
+						flex-direction: column;
+						margin: 8rpx 0;
+						padding: 0;
+						position: relative;
+						.mclap{
+							width: 100%;
+							line-height:35rpx;
+							text-overflow:ellipsis;
+							display: -webkit-box;
+							word-break: break-all;
+							-webkit-box-orient: vertical;
+							-webkit-line-clamp: 2;
+							overflow: hidden;
+							font-size: 26rpx;
+							&.indent{
+								text-indent: 95rpx;
+							}
+						}
+						.mclap-tag{
+							display: block;
+							width: 84rpx;
+							height: 32rpx;
+							background-image: linear-gradient(270deg, #f9c023 0%, #f83600 100%);
+							border-radius: 4rpx 48rpx 4px 4px;
+							line-height: 32rpx;
+							font-size: $font-size-22;
+							color: #FFFFFF;
+							text-align: center;
+							position: absolute;
+							left: 0;
+							top: 0;
+						}
+					}
+					.no-price{
+						height: 54rpx;
+						line-height: 54rpx;
+						display: flex;
+						box-sizing: border-box;
+						.p-no{
+							font-size: $font-size-28;
+							color: $text-color;
+							display: block;
+							float: left;
+						}
+						.p-stars{
+							float: left;
+						}
+					}
+					.price{
+						color: #FF2A2A;
+						line-height:54rpx;
+						&.none{
+							text-decoration: line-through;
+							color: #999999;
+						}
+						.sm{
+							font-size: $font-size-24;
+						}
+						.big{
+							font-size: $font-size-28;
+						}
+					}
+				}
+			}
+		}	
+		.swiper__recommenddots-box{
+			position: absolute;
+			bottom: 0;
+			left: 0;
+			right: 0;
+			/* #ifndef APP-NVUE */
+			display: flex;
+			/* #endif */
+			flex: 1;
+			flex-direction: row;
+			justify-content: center;
+			align-items: center;
+			height: 60rpx;
+			.swiper__dots-item{
+				width: 8rpx;
+				height: 8rpx;
+				border-radius: 100%;
+				margin-left: 6px;
+				background-color:rgba(225,86,22,.3);
+			}
+			.swiper__dots-long{
+				width: 32rpx;
+				height: 8rpx;
+				border-radius: 4rpx;
+				background-color: #e15616;
+				transition: all 0.4s;
+			}
+		}
+	}
+</style>

+ 147 - 0
components/cm-module/pageTemplate/templateNav.vue

@@ -0,0 +1,147 @@
+<template name="navbars">
+	<view>
+		<view class="navbars-content clearfix">
+			<view class="nav-item" v-for="(item,index) in navList" :key="index" @click="NavToDetailPage(item,index)">
+				<view class="icon">
+					<image class="icon-image" :src="item.crmIcon" mode=""></image>
+				</view>
+				<view class="name">{{ item.name }}</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		name:"navbars",
+		props:{
+			list:{
+				type:Array
+			}
+		},
+		data() {
+			return{
+				current:100,
+				navList:[]
+			}
+		},
+		created(){
+			this.initData(this.list)
+		},
+		computed: {
+	
+		},
+		methods:{
+			initData(list){
+				this.navList = list
+				console.log(this.navList)
+			},
+			NavToDetailPage(item){//分类导航跳转
+				this.$api.navigateTo(`/pages/goods/goods-classify?classType=1&id=${item.bigTypeID}&title=${item.name}`)
+				// uni.setStorage({
+				// 	key: 'commodity_id',
+				// 	data: pro.tinyTypeID,
+				// 	success: function () {
+				// 		self.$api.navigateTo(`/pages/goods/goods-classify?title=${pro.name}&id=${pro.bigTypeID}`)
+				// 	}
+				// })
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.navbars-content{
+		width: 100%;
+		height: auto;
+		box-sizing: border-box;
+		padding: 0 24rpx;
+		margin-top: 30rpx;
+		.nav-item{
+			width: 164rpx;
+			height: auto;
+			float: left;
+			margin-bottom: 30rpx;
+			margin-right: 15.3rpx;
+			&:nth-child(4){
+				margin-right: 0;
+			}
+			&:nth-child(8){
+				margin-right: 0;
+			}
+			.icon{
+				width: 72rpx;
+				height: 72rpx;
+				margin: 0 auto;
+				position: relative;
+				.icon-image{
+					width: 72rpx;
+					height: 72rpx;
+					display: block;
+				}
+				.icon-new{
+					width: 44rpx;
+					height: 22rpx;
+					display: block;
+					position: absolute;
+					right: 0;
+					top: 20rpx;
+				}
+			}
+			.name{
+				width: 100%;
+				height: 40rpx;
+				line-height: 40rpx;
+				text-align: center;
+				font-size: $font-size-24;
+				color: #666666;
+			}
+			.nav-cell-main{
+				width: 100%;
+				height: auto;
+				position: absolute;
+				right: 0;
+				.nav-cell{
+					width: 164rpx;
+					height: auto;
+					float: left;
+					margin-bottom: 30rpx;
+					margin-right: 15.3rpx;
+					&:nth-child(4){
+						margin-right: 0;
+					}
+					&:nth-child(8){
+						margin-right: 0;
+					}
+					.icon{
+						width: 130rpx;
+						height: 130rpx;
+						margin: 0 auto;
+						position: relative;
+						.icon-image{
+							width: 130rpx;
+							height: 130rpx;
+							display: block;
+						}
+						.icon-new{
+							width: 44rpx;
+							height: 22rpx;
+							display: block;
+							position: absolute;
+							right: 0;
+							top: 20rpx;
+						}
+					}
+					.name{
+						width: 100%;
+						height: 40rpx;
+						line-height: 40rpx;
+						text-align: center;
+						font-size: $font-size-28;
+						color: #666666;
+					}
+				}
+			}
+		}
+	}
+</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.ladderFlag == 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.ladderPrices" :key="index">
+							<view class="ladder-item-td">{{ ladd.numRange }}</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.promotions.status == 1">不限时</text>
+						<text class="txt" v-else>{{ product.promotions.beginTime }} ~ {{ product.promotions.endTime }}</text>
+					</view>
+					<view class="box-title" v-show="product.promotions.mode ==2">
+						<text>购买{{product.promotions.name}}商品,满</text>
+						<text class="txt">¥{{product.promotions == null ? '0.00' : product.promotions.touchPrice | NumFormat}}</text>减
+						<text class="txt">¥{{product.promotions == null ? '0.00' : product.promotions.reducedPrice | NumFormat}}</text>
+					</view>
+					<view class="box-title" v-show="product.promotions.mode==3">
+						<text>购买{{product.promotions.name}}商品,满</text>
+						<text class="txt">¥{{product.promotions.touchPrice}}</text>赠送商品
+					</view>
+					<view class="box-product" v-show="product.promotions.mode==3">
+						<view class="box-product-main"  v-for="(item, index) in product.promotions.giftList" :key="index">
+							<view class="image"><image :src="item.image" mode="widthFix"></image></view>
+							<view class="info">
+								<view class="name">{{ item.name }}</view>
+								<view class="num">X{{ item.number }}</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.promotions.type == 2" @click="goGoodActiveFn(product.promotions.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: $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;
+				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>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

部分文件因文件數量過多而無法顯示