소스 검색

上传所有文件

LAPTOP-1LHD2FP6\joeny 1 년 전
커밋
4067e9544b
100개의 변경된 파일13890개의 추가작업 그리고 0개의 파일을 삭제
  1. 14 0
      .gitignore
  2. 220 0
      App.vue
  3. 72 0
      LICENSE
  4. 3 0
      README.md
  5. 63 0
      components/CalendarForm/CalendarForm.scss
  6. 94 0
      components/CalendarForm/CalendarForm.vue
  7. 58 0
      components/ChairMan/ChairMan.scss
  8. 66 0
      components/ChairMan/ChairMan.vue
  9. 59 0
      components/CourseAddress/CourseAddress.scss
  10. 71 0
      components/CourseAddress/CourseAddress.vue
  11. 80 0
      components/CourseItem/CourseItem.scss
  12. 45 0
      components/CourseItem/CourseItem.vue
  13. 83 0
      components/CourseSkill/CourseSkill.scss
  14. 38 0
      components/CourseSkill/CourseSkill.vue
  15. 155 0
      components/DonateKeyForm/DonateKeyForm.scss
  16. 122 0
      components/DonateKeyForm/DonateKeyForm.vue
  17. 161 0
      components/EventItem/EventItem.scss
  18. 78 0
      components/EventItem/EventItem.vue
  19. 245 0
      components/FitPackageForm/FitPackageForm.scss
  20. 155 0
      components/FitPackageForm/FitPackageForm.vue
  21. 34 0
      components/Footer/Footer.scss
  22. 82 0
      components/Footer/Footer.vue
  23. 77 0
      components/GoodsItem/GoodsItem.scss
  24. 33 0
      components/GoodsItem/GoodsItem.vue
  25. 49 0
      components/PlanDate/PlanDate.scss
  26. 78 0
      components/PlanDate/PlanDate.vue
  27. 59 0
      components/Protocal/Protocal.scss
  28. 45 0
      components/Protocal/Protocal.vue
  29. 427 0
      components/RenewForm/RenewForm.scss
  30. 357 0
      components/RenewForm/RenewForm.vue
  31. 53 0
      components/SchoolUserHeader/SchoolUserHeader.scss
  32. 121 0
      components/SchoolUserHeader/SchoolUserHeader.vue
  33. 80 0
      components/SoundForm/SoundForm.scss
  34. 55 0
      components/SoundForm/SoundForm.vue
  35. 56 0
      components/TeacherCourse/TeacherCourse.scss
  36. 51 0
      components/TeacherCourse/TeacherCourse.vue
  37. 67 0
      components/TeacherSection/TeacherSection.scss
  38. 52 0
      components/TeacherSection/TeacherSection.vue
  39. 106 0
      components/VideoItem/VideoItem.scss
  40. 71 0
      components/VideoItem/VideoItem.vue
  41. 430 0
      components/VipForm/VipForm.scss
  42. 167 0
      components/VipForm/VipForm.vue
  43. 134 0
      components/agree/agree.vue
  44. 209 0
      components/liuyuno-tabs/liuyuno-tabs.vue
  45. 29 0
      components/load.vue
  46. 357 0
      components/model.vue
  47. 19 0
      components/no-none.vue
  48. 167 0
      components/page-btm-bar/page-btm-bar.vue
  49. 123 0
      components/page-top-bar/page-top-bar.vue
  50. 400 0
      components/shoppingCar.vue
  51. 376 0
      components/shoppingCart.scss
  52. 193 0
      components/v-phone/v-button.vue
  53. 286 0
      components/v-phone/v-phone.vue
  54. 212 0
      components/wm-poster/wm-poster.vue
  55. 46 0
      components/zx-top/zx-top.vue
  56. 137 0
      diy/Module.vue
  57. 236 0
      diy/audio.vue
  58. 31 0
      diy/close.vue
  59. 286 0
      diy/coupon.vue
  60. 613 0
      diy/home.vue
  61. 216 0
      diy/module/ad.vue
  62. 32 0
      diy/module/bg.vue
  63. 145 0
      diy/module/contitle.vue
  64. 90 0
      diy/module/contopimg.vue
  65. 403 0
      diy/module/duo.vue
  66. 143 0
      diy/module/getPhone.vue
  67. 406 0
      diy/module/goods.css
  68. 562 0
      diy/module/goods.vue
  69. 175 0
      diy/module/miaosha.vue
  70. 183 0
      diy/module/ms_goods.vue
  71. 78 0
      diy/module/nav.vue
  72. 118 0
      diy/module/pt_goods.vue
  73. 103 0
      diy/module/store.vue
  74. 92 0
      diy/module/text.vue
  75. 41 0
      diy/module/title.vue
  76. 81 0
      diy/module/tuijian.vue
  77. 305 0
      diy/module/tuwen.vue
  78. 31 0
      diy/module/twtit.vue
  79. 140 0
      diy/module/yy_goods.vue
  80. 213 0
      diy/swiper.vue
  81. 9 0
      ext.json
  82. 33 0
      main.js
  83. 129 0
      manifest.json
  84. 657 0
      menber/goods_detail.vue
  85. 278 0
      menber/shop.vue
  86. 16 0
      node_modules/.bin/he
  87. 17 0
      node_modules/.bin/he.cmd
  88. 28 0
      node_modules/.bin/he.ps1
  89. 16 0
      node_modules/.bin/sass
  90. 17 0
      node_modules/.bin/sass.cmd
  91. 28 0
      node_modules/.bin/sass.ps1
  92. 265 0
      node_modules/.package-lock.json
  93. 15 0
      node_modules/anymatch/LICENSE
  94. 87 0
      node_modules/anymatch/README.md
  95. 20 0
      node_modules/anymatch/index.d.ts
  96. 104 0
      node_modules/anymatch/index.js
  97. 48 0
      node_modules/anymatch/package.json
  98. 263 0
      node_modules/binary-extensions/binary-extensions.json
  99. 3 0
      node_modules/binary-extensions/binary-extensions.json.d.ts
  100. 14 0
      node_modules/binary-extensions/index.d.ts

+ 14 - 0
.gitignore

@@ -0,0 +1,14 @@
+# ---> Actionscript
+# Build and Release Folders
+bin/
+bin-debug/
+bin-release/
+.hbuilderx/
+unpackage/
+# Other files and folders
+.settings/
+
+# Project files, i.e. `.project`, `.actionScriptProperties` and `.flexProperties`
+# should NOT be excluded as they contain compiler settings and other important
+# information for Eclipse / Flash Builder.
+

+ 220 - 0
App.vue

@@ -0,0 +1,220 @@
+<script>
+	import siteinfo from './siteinfo.js';
+	import $http from './utils/http.js'
+	let q, store_id, table_id, turntable_id, app_id, defInfo = {},merchant_id,
+		number = 0; //门店id 餐桌id  大转盘id
+	export default {
+		onLaunch: function(options) {
+			uni.hideTabBar();
+			uni.removeStorageSync('baseUrl');
+		},
+		async onShow(options) {
+			uni.hideTabBar();
+			this.initSocket();
+			let query = options.query,
+				queryCode = null;
+			if (query && query.share_user_id) {
+				uni.setStorageSync('share_user_id', query.share_user_id)
+			}
+	
+			// #ifdef MP-ALIPAY
+			 // 合伙人邀请
+			if (query && query.give_user_id) {
+				let use= {
+				   store_id:query.store_id,
+				   give_user_id:query.give_user_id
+				}	
+				getApp().globalData.give_user = use
+				    //由于这里是网络请求,可能会在 Page.onLoad 之后才返回
+				     // 所以此处加入 callback 以防止这种情况
+				if (this.employIdCallback){
+				     
+				}
+			}
+			
+			if (query) {
+				queryCode = query.qrCode || '';
+			}
+			
+			// #endif
+		
+			// #ifdef MP-WEIXIN
+			queryCode = query.q;
+			// #endif
+			
+			//跳转选择地址的时候,返回会走默认门店,阻止默认门店
+			if (!this.$store.state.prevent && !queryCode) {
+				return
+			}
+			if (queryCode) {
+				q = decodeURIComponent(queryCode)
+                 if(q.indexOf("?") == -1){
+					let code;
+					 code = q.split("/smdc/");
+					 code = code[1]?code:q.split("/zhjy/"); 
+					await $http.request('yy/empty_code', {
+						 code:code[1]
+					 }).then(res => {
+						store_id = res.data.store_id;
+						table_id = res.data.table_id;
+						merchant_id = '';
+					 })
+				 }else{
+					 store_id = await this.gettParameter(q, 'store_id')
+					 table_id = await this.gettParameter(q, 'table_id')
+					 turntable_id = await this.gettParameter(q, 'id')
+					 merchant_id = await this.gettParameter(q, 'merchant_id')
+				 }
+				// console.log(merchant_id,q,"merchant_id")
+			}else {
+				// #ifdef MP-ALIPAY
+				defInfo = await my.getExtConfigSync()
+				// #endif
+				// #ifdef MP-WEIXIN
+				defInfo = await wx.getExtConfigSync()
+				// #endif
+				store_id = defInfo.store_id;
+				table_id = defInfo.table_id;
+				app_id = defInfo.appId;
+			}
+			
+			// var store_id=176,table_id=211;
+			this.$store.commit('SET_STORE_ID', 3)
+			this.$store.commit('SET_MERCHANT_ID', merchant_id)
+			this.$store.commit('SET_TABLE_ID', 1)
+			this.$store.commit('SET_TURNTABLE_ID', turntable_id)
+			this.$store.commit('SET_APP_ID', app_id)
+			this.$store.dispatch('getSystemColor', store_id);
+			this.$store.dispatch('getSystemStup', store_id);
+			this.$store.dispatch('getOpenid', store_id);
+			// 更新提示
+			this.getUpdateManager();
+			//判断打烊
+			this.getIsClose()
+		},
+
+		onHide: function() {
+			getApp().globalData.isApp = true; //清除控制赋能,只赋能一次
+		},
+
+		onUnload() {},
+ 
+		methods: {
+			getIsClose(options) {
                // console.log('options', options)
                $http.request('xcx/system', {
                    store_id: uni.getStorageSync('store_id'),
                    table_id: uni.getStorageSync('table_id'),
                }).then(res => {
                    // console.log(res)
                    // #ifdef MP-ALIPAY
                    if (res.data.is_alipay == 2) {
                        uni.reLaunch({
                            url: '/pages/closeInfo/closeInfo'
                        })
                    }
                    // #endif
+			         // #ifdef MP-WEIXIN
                    if (res.data.is_wechat == 2) {
                        uni.reLaunch({
                            url: '/pages/closeInfo/closeInfo'
                        })
                    }
                    // #endif
+			       })
            },
+			
+
+			
+
+			//统一发送消息,可以在其他页面调用此方法发送消息
+			sendSocketMessage: function(msg) {
+				let that = this
+				return new Promise((resolve, reject) => {
+					if (this.globalData.localSocket.readyState === 1) {
+						uni.sendSocketMessage({
+							data: msg,
+							success: function(res) {
+								resolve(res)
+								that.globalData.readyReset = 1;
+							},
+							fail: function(e) {
+								reject(e)
+							}
+						})
+					} else {
+						// console.log('已断开')
+						that.globalData.readyReset = 2;
+					}
+				})
+			},
+
+			storeColor() {
+				let that = this;
+				return new Promise((resolve, reject) => {
+					$http.request('xcx/store_color', {
+						store_id: store_id,
+					}, "", "", true).then(res => {
+						resolve(res)
+					})
+				})
+			},
+
+			storeSystem() {
+				return new Promise((resolve, reject) => {
+					$http.request('xcx/system', {
+						store_id: store_id,
+						table_id: table_id,
+					}, "", "", true).then(res => {
+						resolve(res)
+						$http.request('xcx/template', {
+							admin_id: res.data.admin_id,
+						}, "", "", true).then(r => {
+							if (r.code == '200') {
+								uni.setStorageSync('balance_subscribe', r.data)
+							}
+						})
+					})
+				})
+			},
+
+			getUpdateManager: function() {
+				const updateManager = uni.getUpdateManager(); // 获取更新管理器对象
+				updateManager.onCheckForUpdate(function(res) {
+					if (res.hasUpdate) {
+						updateManager.onUpdateReady(function() {
+							uni.showModal({
+								title: '更新提示',
+								content: '新版本已经准备好,是否重启应用?',
+								showCancel: false,
+								success: res => {
+									if (res.confirm) {
+										updateManager.applyUpdate();
+									}
+								}
+							})
+						})
+						updateManager.onUpdateFailed(function() {
+							uni.showModal({
+								title: '提示',
+								content: '检查到有新版本,但是下载失败,请检查网络设置',
+								showCancel: false
+							})
+						})
+					}
+				})
+			},
+			gettParameter: function(url, name) {
+				let val = ''
+				if (url.indexOf('?' + name + '=') !== -1) {
+					val = url.split('?' + name + '=')[1].split(/&|#/)[0];
+				} else if (url.indexOf('&' + name + '=') !== -1) {
+					val = url.split('&' + name + '=')[1].split(/&|#/)[0];
+				}
+				return val
+			},
+		},
+
+		globalData: {
+			localSocket: {},
+			callback: function() {},
+			closeCallback: function() {},
+			onSocketOpen: function() {},
+			URL: siteinfo.siteroot,
+			isApp: true,
+			SocketOpen: false,
+			readyState: 0,
+			readyReset: 1,
+			give_user:{
+				store_id:'',
+				give_user_id:''
+			}
+		}
+	}
+
+</script>
+
+<style lang="scss">
+    @import url("/static/css/iconfont.css");
+    @import url("/static/css/app.css");
+</style>

+ 72 - 0
LICENSE

@@ -0,0 +1,72 @@
+Apache License 
+Version 2.0, January 2004 
+http://www.apache.org/licenses/
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
+
+"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
+
+"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
+
+"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
+
+"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
+
+"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
+
+"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
+
+"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
+
+"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
+
+"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
+
+(a) You must give any other recipients of the Work or Derivative Works a copy of this License; and
+
+(b) You must cause any modified files to carry prominent notices stating that You changed the files; and
+
+(c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
+
+(d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.
+
+You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+Licensed under the Apache License, Version 2.0 (the "License"); 
+you may not use this file except in compliance with the License. 
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software 
+distributed under the License is distributed on an "AS IS" BASIS, 
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+See the License for the specific language governing permissions and 
+limitations under the License.

+ 3 - 0
README.md

@@ -0,0 +1,3 @@
+# wxminiprogram
+
+微信小程序

+ 63 - 0
components/CalendarForm/CalendarForm.scss

@@ -0,0 +1,63 @@
+.com-calendar-form{
+	
+	background:#FFF;
+	min-height:300px;
+	border-top-left-radius: 10px;
+	border-top-right-radius: 10px;
+	.date{
+		height:50px;
+		width:100%;
+		padding-left:20px; 
+		display:flex;
+		justify-content: flex-start;
+		align-items: center;
+		font-weight: bold;
+	}
+	.title{
+		width:100%;
+		display:flex;
+		justify-content: center;
+		align-items: center;
+		font-size: 16px;
+		font-weight: bold;
+	}
+	.content{
+		padding:10px 20px;
+		font-size:14px;
+		padding-bottom: 20px;
+		.btn{
+			width:100%;
+			display:flex;
+			justify-content:space-between;
+			align-items: center;
+			height:50px;
+			.link{
+				font-size:12px;
+			}
+			
+			
+			.hx-btn{
+				color:blue;
+			}
+		}
+	}
+	
+	
+	.qr-code{
+		background:#FFF;
+		border-radius: 10px;
+		overflow: hidden; 
+		.qr-box{
+			 display:flex;
+			 justify-content: center;
+			 align-items: center;
+			 padding:20px;
+		}
+		.qr-text{
+			text-align:center;
+			font-size:12px;
+			padding-bottom:20px;
+		}
+	}
+	
+}

+ 94 - 0
components/CalendarForm/CalendarForm.vue

@@ -0,0 +1,94 @@
+<template>
+	<view class="com-calendar-form" v-if="info">
+		<view class="date">{{info.tripDate}}</view>
+		<view class="title">{{info.intro}}</view>
+		<view class="content">
+			<rich-text :nodes="info.content"></rich-text>  
+			<view class="btn"  v-if="info.path!=''" > 
+				<view class="hx-btn" v-if="info.userTicket" @click="onViewQrCode(info.userTicket.hxCode)">
+					查看核销码					
+				</view>
+				<view v-else></view>
+				<view  @click="onViewPage(info.path)" class="link">立即访问</view>
+			</view>
+		</view>
+		
+		
+		
+		<uni-popup ref="qrForm">
+			<view class="qr-code" > 
+					
+				  	<view class="qr-box">
+							<view class="qrcode">
+							  <view v-for="(row, rowI) in modules" :key="rowI" style="display: flex;flex-direction: row;">
+									 <view v-for="(col, colI) in row" :key="colI">
+										   <view v-if="col.isBlack" style="width: 5px;height: 5px;background-color: black;">
+											 <!-- 黑色码点 -->
+										   </view>
+										   <view v-else style="width: 5px;height: 5px;background-color: white;">
+											 <!-- 白色码点 -->
+										   </view>
+									 </view>
+							  </view>
+							</view>
+					</view>
+					<view class="qr-text">核销码:{{qrText}}</view>
+			</view>
+		</uni-popup>
+	</view>
+</template>
+
+<script>
+	import UQRCode from '../../uni_modules/Sansnn-uQRCode/js_sdk/uqrcode/uqrcode.js';
+	
+	export default {
+		name:"CalendarForm",
+		props:{
+			info:{
+				type:Object,
+				default:()=>{
+					return null;
+				}
+			}
+		},
+		watch:{
+			'info':{
+				handler(val){
+					console.log("val",val);
+					
+				},
+				deep:true,
+				immediate:true,
+			}
+		},
+		data() {
+			return {
+				qrText:'二维码内容',
+				modules: [],
+			};
+		},
+		methods:{
+			//查看二维码
+			onViewQrCode(e){
+				let _this=this; 
+				_this.qrText=e;
+			 
+				 // 获取uQRCode实例
+				const qr = new UQRCode();
+				 qr.data = e+"&T"; 
+				 qr.make();
+				_this.modules = qr.modules; 
+				_this.$refs.qrForm.open("center"); 
+			},
+			onViewPage(url){
+				uni.navigateTo({
+					url:url,
+				})
+			}
+		},
+	}
+</script>
+
+<style lang="scss">
+@import './CalendarForm.scss'
+</style>

+ 58 - 0
components/ChairMan/ChairMan.scss

@@ -0,0 +1,58 @@
+.com-chair-man{
+	width:100%;  
+	background:#f9f9f9;
+	padding-top:5px;
+	height:150px;
+	.title{ 
+		font-size: 14px;
+		color:#000;
+		font-weight: bold;
+		height:30px;
+		line-height: 30px;
+		margin-left:10px;
+	}
+	
+	.content{ 
+		display: flex;
+		flex-direction: row;
+		height:80px;
+		.header{
+			display: flex;
+			width:25%;
+			height:100%;
+			justify-content: center;
+			align-items: center;
+			.icon{
+				width:80px;
+				height:80px;
+				margin-top:20px;
+				border-radius: 10px;
+			}
+		}
+		.intro{
+			display: flex;
+			width:70%;
+			justify-content: flex-start;
+			align-items: flex-start;
+			flex-direction: column;
+			margin-left:10px;
+			.name{
+				font-size:14px;
+				font-weight: bold;
+				height:40px;
+				line-height: 40px;
+			}
+			.tags{
+				display:flex;
+				flex-direction: row;
+				.uni-tag{
+					font-size:12px;
+					margin-right: 10px;
+				}
+			}
+			.point{
+				margin-top:5px;
+			}
+		}
+	}
+}

+ 66 - 0
components/ChairMan/ChairMan.vue

@@ -0,0 +1,66 @@
+<template>
+	<view class='com-chair-man' v-if="info">
+		<view class="title" v-if="type==1">当家主持人</view>
+		<view class="title" v-if="type==2">主理人</view>
+		<view class="content" @click="onViewChair">
+			<view class="header">
+				<image :src="info.headerImg" mode="aspectFill" class="icon"></image>
+			</view>
+			<view class="intro">
+				<view class="name">{{info.name}}</view>
+				<view class="tags">
+					<block v-for="(it,index) in info.tags">
+						<uni-tag :text="it" :inverted="true" :circle="true" type="error" style="margin-right:10px;"></uni-tag>
+					</block> 
+				</view>
+				<view class="point">
+					<uni-rate color="#CCCCCC" activeColor="#b11b1c" :value="info.point"  readonly/> 
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name:"ChairMan",
+		props:{	
+			type:{
+				type:Number,
+				default:1,
+			}, 
+			info:{
+				type:Object,
+				default:()=>{
+					return null;
+				}
+			},
+		},
+		watch:{
+			'info':{
+				handler(val){
+					 
+				},
+				deep:true,
+				immediate:true,
+			}
+		},
+		data() {
+			return {
+				
+			};
+		},
+		methods:{
+			onViewChair(e){
+				 
+				uni.navigateTo({
+					url:'/pages/theater/chair-man/chair-man?id='+this.info.id
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+@import './ChairMan.scss'
+</style>

+ 59 - 0
components/CourseAddress/CourseAddress.scss

@@ -0,0 +1,59 @@
+.com-course-address{
+	background:#1a1a1a;
+	display:flex;
+	flex-direction: row;
+	margin-left:10px;
+	margin-right: 10px;
+	border-radius: 10px; 
+
+	padding:10px;
+	.address{
+		display: flex;
+		flex-direction: column;
+		width:80%;
+		.time{
+			display: flex;
+			flex-direction: row; 
+			align-items: center;
+			justify-content: flex-start;
+			height:30px;
+			 
+			.icon{
+				display: flex;  
+				align-items: center;
+				justify-content: center;
+				width:10%;
+				 
+				.img{
+					height:16px;
+					width:16px;
+				}
+			}
+			.tips{
+				color:#FFF;
+				font-size:12px;
+				margin-left:5px;
+				
+			}
+		}
+	}
+	.service{
+		display: flex;
+		width:20%;
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+		.icon{
+			display: flex;
+			.img{
+				height:16px;
+				width:16px;
+			}
+		}
+		.tips{
+			font-size:12px;
+			color:#fFF;
+			margin-top:5px;
+		}
+	}
+}

+ 71 - 0
components/CourseAddress/CourseAddress.vue

@@ -0,0 +1,71 @@
+<template>
+	<view class="com-course-address" v-if="course">
+		<view class="address">
+			<view class="time">
+				<view class="icon"><image src="/static/images/timer.png" class="img"></image></view>
+				<view class="tips">时间:{{course.openTime}}</view>
+			</view>
+			<view class="time">
+				<view class="icon"><image src="/static/images/local.png" class="img"></image></view>
+				<view class="tips" @click="onOpenMap">地址:{{course.address}}</view>
+			</view>
+		</view>
+		<view class="service">
+			<view class="icon">
+				<image src="/static/images/customservice.png" class="img"></image>
+			</view>
+			<view class="tips">
+				客服
+			</view>
+		</view>
+		<map id="map" ref="map" style="display: none;"  v-if="course && course.id>0" :show-location="true" :latitude="course.latitude" :longitude="course.longitude"></map>
+	</view>
+</template>
+
+<script>
+	export default {
+		name:"CourseAddress",
+		props:{
+			 
+			course:{
+				type:Object,
+				default:()=>{
+					return null;
+				}
+			}
+		},
+		
+	
+		data() {
+			return {
+				
+			};
+	
+		},
+		methods:{
+			
+			onOpenMap(e){
+			  let _this=this;  
+			  _this._mapContext = uni.createMapContext("map", _this); 
+			  _this._mapContext.openMapApp({
+				  longitude:parseFloat(_this.course.longitude),
+				  latitude:parseFloat(_this.course.latitude),
+				  destination:_this.course.address,
+				  success:(res)=>{ 
+				  },
+				  fail:(res)=>{ 
+					  
+				  },
+				  complete:(res)=>{
+					  
+				  }
+			  }) 
+			
+			}
+			}
+	}
+</script>
+
+<style lang="scss">
+@import './CourseAddress.scss'
+</style>

+ 80 - 0
components/CourseItem/CourseItem.scss

@@ -0,0 +1,80 @@
+.com-teacher{
+ 
+	display: flex;
+	flex-direction: row;
+	justify-content: flex-start;
+	align-items: flex-start;  
+	height:100px;
+	background:#505050;
+	border-bottom:10px;
+	border-bottom:1px solid #434343;
+	.header{
+		width:30%;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		height:100%;
+		.img{
+			width:60px;
+			height:60px;
+			border-radius: 50%;
+		}
+	}
+	.intro{
+		width:50%;
+		color:#FFF;
+		display: flex;
+		flex-direction: column;
+		.name{
+			font-size:14px;
+			font-weight: bold;
+			height:30px;
+			line-height: 30px;
+			margin-top:15px;
+		}
+		.time{
+			color:#CCC;
+		}
+		.tags{
+			display: flex;
+			flex-direction: row;
+			margin-top:5px;
+			font-size:12px;
+			color:#CCC;
+			// .tag{
+			// 	border:1px solid $teacher-main-color;
+			// 	color:$teacher-main-color;
+			// 	margin-right:5px;
+			// 	border-radius: 3px;
+			// 	padding:0px 3px;
+			// 	font-size:12px;
+			// }
+		}
+	}
+	.btns{
+		width:30%;
+		height:100%;
+		display:flex;
+		justify-content: center;
+		align-items: center; 
+		.btn{
+			padding:0px;
+			margin:0px;
+			height:30px;
+			width:80%;
+			font-size:12px;
+			line-height: 30px;
+			border-radius:10px;
+			
+			
+		}
+		.disabled{
+			background:#CCC;
+			
+		}
+		.active{
+			background:$teacher-main-color;
+			color:#FFF;
+		}
+	}
+}

+ 45 - 0
components/CourseItem/CourseItem.vue

@@ -0,0 +1,45 @@
+<template>
+	<view class="com-teacher" v-if="info && info.id>0">
+		<view class="header"> 
+			<image :src="info.imgUrl" class="img"></image>
+		</view>
+		<view class="intro">
+			<view class="name">{{info.name}}</view>
+			<view class="time">{{info.openTime}}</view>
+			<view class="tags">{{info.tips}}</view>
+		</view>
+		<view class="btns">
+			<button class="btn active" @click="onStart">查看</button>
+		</view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		name:"TeacherItem",
+		emits:['onStart'],
+		props:{
+			info:{
+				type:Object,
+				default:{
+					id:0 
+				}
+			}
+		},
+		data() {
+			return {
+				
+			};
+		},
+		methods:{
+			onStart(e){
+				this.$emit("onStart",this.info.id);
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+@import './CourseItem.scss';
+</style>

+ 83 - 0
components/CourseSkill/CourseSkill.scss

@@ -0,0 +1,83 @@
+.com-course-skill{
+	background:#1a1a1a;
+	display:flex;
+	flex-direction: row;
+	margin-left:10px;
+	margin-right: 10px;
+	border-radius: 10px; 
+	margin-top:10px;
+	height:80px;
+	color:#FFF;
+	.skill-number{
+		height:100%;
+		width:30%;
+		display: flex;
+		flex-direction: column;
+		height:100%;
+		.skill-out{
+			background:$teacher-main-color;
+			border-radius: 10px;
+			color:#FFf; 
+			height:100%;
+			.out-bg{
+				
+				background-repeat: no-repeat;
+				background-position:bottom left;
+				height:80%; 
+				margin:10px; 
+				.txt{ 
+					margin-top:20px;
+					font-size:24px; 
+				}
+				.sign{
+					font-size:20px;
+				}
+			} 
+			
+		}
+		
+	}
+	.skill-item{
+		border:1px solid $teacher-main-color;
+		margin-left:10px;
+		width:70%;
+		border-radius: 10px;
+		display:flex;
+		flex-direction: column;
+		overflow:hidden;
+		padding:10px; 
+		padding-top:5px;
+		line-height: 26px;
+		font-size:12px;
+		.item{
+			height:25px;
+			display: flex;
+			flex-direction: row;
+			justify-content: flex-start;
+			align-items: center;
+			
+			.sign{
+				width:10%;
+				display: flex; 
+				height:100%;
+				justify-content:center;
+				align-items: center;
+				.circle{
+					width:10px;
+					height:10px;
+					border-radius: 50%;
+					background:$teacher-main-color;
+				 
+				}
+			}
+			.title{
+				display:flex;
+				width:90%;
+				height:100%; 
+				justify-content:flex-start;
+				align-items: center;
+				font-size:12px;
+			}
+		}
+	}
+}

+ 38 - 0
components/CourseSkill/CourseSkill.vue

@@ -0,0 +1,38 @@
+<template>
+	<view class="com-course-skill" v-if="course">
+		<view class="skill-number">
+			<view class="skill-out">
+				<view class="out-bg">
+					<text class="txt">{{course.kcal}} </text>
+					<text class="sign">Kcal</text>
+				</view>
+				
+			</view>
+		</view>
+		<view class="skill-item" v-html="course.tips"> 
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name:"CourseSkill",
+		props:{
+			course:{
+				type:Object,
+				default:()=>{
+					return null;
+				}
+			}
+		},
+		data() {
+			return {
+				
+			};
+		}
+	}
+</script>
+
+<style lang="scss">
+@import './CourseSkill.scss'
+</style>

+ 155 - 0
components/DonateKeyForm/DonateKeyForm.scss

@@ -0,0 +1,155 @@
+.com-donate-key{
+	width:95%; 
+	margin:auto;
+	margin-bottom:10px;
+	border:3px solid #653b18;
+	border-radius: 10px;
+	height:260px;
+	display:flex;
+	flex-direction: column;
+	position:relative;
+	overflow: hidden;
+	z-index:890;
+	margin-bottom:70px;
+	.bg{		
+		width:100%;
+		height:100%;
+		position: absolute;
+		background:#FFF;
+		top:0px;
+		left:0px;
+		opacity: 0.8;
+		z-index:-1; 
+	}
+	.current{
+		height:40px;
+		line-height: 40px;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		font-size:12px;
+		color:$teacher-main-color;
+	}
+	.press-key{
+		height:30px;
+		line-height: 30px;
+		display:flex;
+		flex-direction: row;
+		justify-content: center;
+		align-items: center;
+		.sign{
+			background:#9b7f6a;
+			height:25px;
+			width: 30px;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			color:#FFF;
+			
+		}
+		.text{
+			width:50px;
+			height:25px;
+			overflow: hidden;
+			text-align:center;
+		}
+	
+		.left{
+			border-top-left-radius: 10px;
+			border-bottom-left-radius: 10px;
+			
+		}
+		.right{
+			border-top-right-radius: 10px;
+			border-bottom-right-radius: 10px;
+		}
+	}
+	.number-key{
+		display: flex;
+		margin-left: 10px;
+		margin-right: 10px;
+		margin-top:10px;
+		flex-direction:row;
+		
+		.left{
+			display: flex;
+			width:70%; 
+			flex-direction: column;
+			.number{
+				.key{
+					float:left;
+					background:#9b7f6a;
+					width:30%;
+					margin-right: 3px;
+					height:40px;
+					margin-bottom:5px;
+					margin-left:3px;
+					display:flex;
+					justify-content: center;
+					align-items: center;
+					color:#FFF;
+					border-radius: 10px;
+					font-size:12px;
+				}
+			}
+			.number1{
+				display:flex;
+				flex-direction: row;
+				height:30px;
+				.key{
+					width:40%;
+					display:flex;
+					justify-content: center;
+					align-items: center;
+					color:#FFF;
+					border-radius: 10px;
+					background:#9b7f6a;
+					margin-left:5px;
+					font-size:12px;
+				}
+				.all{
+					width:60%;
+					display:flex;
+					justify-content: center;
+					align-items: center;
+					color:#FFF;
+					border-radius: 10px;
+					background:#9b7f6a;
+					margin-left:5px;
+					margin-right: 10px;
+					font-size:12px;
+				}
+			}
+		}
+		.right{
+			width:30%;
+			display: flex; 
+			flex-direction: column;
+			.delete{
+				background:#9b7f6a;
+				// margin-left:5px;
+				margin-right:5px;
+				display: flex;
+				color:#FFF;
+				justify-content: center;
+				align-items: center;
+				height:30%;
+				border-radius: 10px;
+				font-size:12px;
+			}
+			.enter{
+				background:#9b7f6a;
+				// margin-left:5px;
+				margin-right:5px;
+				display: flex;
+				color:#FFF;
+				justify-content: center;
+				align-items: center;
+				height:65%;
+				border-radius: 10px;
+				margin-top:5px;
+				font-size:12px;
+			}
+		}
+	}
+}

+ 122 - 0
components/DonateKeyForm/DonateKeyForm.vue

@@ -0,0 +1,122 @@
+<template>
+	<view class="com-donate-key" v-if="info">
+		<view class="bg"></view>
+		<view class="current">您当前有{{info.user.integral}}个爱心币可捐</view>
+		<view class="press-key">
+			<view class="sign left" @click="onChangeQty(-1)">-</view>
+			<view class="text">{{qty}}</view>
+			<view class="sign right" @click="onChangeQty(1)">+</view>
+		</view>
+		<view class="number-key">
+			<view class="left">
+				<view class="number">
+					<block v-for="(it,index) in nums">
+						<view class="key" @click="onDonate(it)">{{it}}</view>
+					</block> 
+				</view>
+				<view class="number1">
+					<view class="key" @click="onDonate(0)">0</view>
+					<view class="all" @click="onDonate(999)">全部捐出</view>
+				</view>
+			</view>
+			<view class="right">
+				<view class="delete" @click="onDonate(-1)">删除</view>
+				<view class="enter" @click="onSave">确认捐款</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name:"DonateKeyForm",
+		emits:['onSuccess'],
+		props:{
+			info:{
+				type:Object,
+				default:()=>{
+					return null;
+				}
+			},
+			storeId:{
+				type:Number,
+				default:()=>{
+					return 0;
+				}
+			}
+		},
+		data() {
+			return {
+				qty:0,
+				nums:[1,2,3,4,5,6,7,8,9],
+			};
+		},
+		methods:{
+			
+			onSave(e){
+				let _this=this;
+				let par={
+					'donateId':_this.info.info.id,
+					'userId':_this.info.user.id,
+					'qty':_this.qty,
+					'storeId':_this.storeId,
+				}
+				this.$http.request('donate/create', par, "", "", true).then(res => {
+					
+					if(res.code=='200'){
+						uni.showToast({
+							title:"感谢您的爱心捐赠",
+							icon:"success"
+						})
+						_this.$emit("onSuccess")
+					}  
+				}).catch(err => {})
+			},
+			
+			onDonate(qty){
+				let _this=this; 
+				if(qty==999){
+					//捐出所有
+					_this.qty=_this.info.user.integral;
+					return;
+				} 
+				if(qty==-1){
+					_this.qty=0;
+					return ;
+				}
+				// console.log("start qty:",_this.qty);
+				_this.qty+=""+qty;
+				_this.qty=parseInt(_this.qty);
+				
+				// console.log(_this.qty);
+				// console.log("_this.info.user.integral",_this.info.user.integral);
+				if(_this.qty*1>=_this.info.user.integral*1){
+					// console.log("A");
+					_this.qty=_this.info.user.integral;
+				} 
+				// console.log("_this.qty",_this.qty);
+			},
+			//修改金额
+			onChangeQty(qty){
+				let _this=this; 
+				if(qty<1){ 
+					if(_this.qty<=0){ 
+						_this.qty=0;
+					}else{ 
+						_this.qty+=qty;
+					}
+				}else{ 
+					_this.qty+=qty;
+				} 
+				if(_this.qty>_this.info.user.integral){ 
+					_this.qty=_this.info.user.integral;
+				}
+			},
+			
+		}
+	}
+</script>
+
+<style lang="scss">
+@import './DonateKeyForm.scss'
+</style>

+ 161 - 0
components/EventItem/EventItem.scss

@@ -0,0 +1,161 @@
+
+.event-content{
+	background:#F0F0F0;
+	width:100%;
+	
+	
+}
+.com-event-item{
+	background:#FFF;
+	display: flex;
+	flex-direction: row;
+
+	min-height:80px;
+	margin-bottom:5px;
+	padding-top: 5px;
+	.event-img{
+		
+		display: flex;
+		width:90px;
+		height:90px;
+		vertical-align: top;
+		align-items: center;
+		margin: 10px 15px 0px 10px;
+		border-radius: 5px;
+		overflow: hidden;
+		
+		
+		.img{
+			
+			width:100%;
+			height:100%;
+			
+		} 
+	}
+	.event-info{
+		
+		display:flex;
+		width:45%;
+		flex-direction: column;
+		.name{
+			height:30px;
+			line-height: 30px;
+			font-size:14px;
+			font-weight: bold;
+			color:#000; 
+			white-space: nowrap;
+			  overflow: hidden;
+			  text-overflow: ellipsis;
+		}
+		.tip{
+			font-size:12px;
+			color:#333;
+			height:20px;
+			line-height: 20px;
+		}
+		.header{
+			margin-top:5px; 
+			margin-bottom: 5px;
+			
+		 
+			.user{
+				height:30px;
+				width:30px;
+				float:left;
+				margin-right: 5px;
+				border-radius: 50%;
+				overflow: hidden;
+				.header-icon{
+					width:30px;
+					height:30px;
+					border-radius: 50%;
+				}
+			}
+			.more{
+				border-radius: 50%;
+				overflow: hidden;
+				border:1px solid #b21c1c;
+				display:flex;
+				justify-content: center;
+				align-items: center;
+				padding-bottom:10px;
+			}
+		}
+		
+	}
+	
+	.tags{
+		display: flex;
+		flex-direction: row;
+		
+		
+		.tag{
+			margin-right: 4px;
+			font-size:12px;
+			border:1px solid #b21c1c;
+			border-radius: 7px;
+			color: #b21c1c;
+			padding: 0px 5px;
+		}
+	}
+	.event-btn{
+		font-size:12px;
+		
+		display: flex;
+		flex-direction: column;
+		margin-top: 30px;
+		width: 80px;
+		margin-left: 10px;
+		.btn{
+			margin-top:10px;
+			margin-right:10px;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			.btn-yy{
+				height:30px;
+				line-height: 30px;
+				width:60px;
+				padding:0px;
+				background:#b21c1c;
+				font-size:12px;
+				color:#FFF;
+				border-radius: 10px;
+			}
+		}
+		.qty{
+			font-size:12px;
+			margin-top:10px;
+		}
+	}
+}
+
+.part_area{
+	margin-top: -5px;
+	width: 150px;
+	height: 40px;
+	overflow: hidden;
+	display: flex;
+	
+	flex-wrap: wrap;
+	
+	
+	
+}
+.partic{
+	
+	border-radius: 50%;width: 20px; height: 20px; overflow: hidden;  margin-right:1px; margin-bottom:2px; display: flex;
+	
+	
+}
+.partic img {
+	width: 100%;
+	height:100%;
+	
+}
+.parttip{
+		width: 100%;
+		position: relative;
+		
+		font-size: 12px;
+		}

+ 78 - 0
components/EventItem/EventItem.vue

@@ -0,0 +1,78 @@
+<template>
+	<view class="event-content">
+	<view class="com-event-item" v-if="info">
+		<view class="event-img"  @click="onViewTheater">
+			<image :src="info.imageUrl" class="img"/>
+		</view>
+		<view class="event-info">
+			<view class="name"  @click="onViewTheater">{{info.name}}</view>
+			<view class="tip">时间:
+				<block v-if="info.plan && info.plan.startTime"> {{info.plan.startDate}} 至 {{info.plan.endDate}}</block>
+				<block v-else>暂无时间按排</block> 
+			</view>
+			<view class="header" style=" height: 30px; width:100%; ">  
+				<view class="tags">
+					<block v-for="(it,index) in info.tags">
+						<view class="tag">{{it}}</view>
+					</block> 
+				</view> 
+			</view> 
+			<view class="part_area" >
+				<view class="parttip" >已报名:{{info.userList.length+info.underLineQty}} 人 </view>
+				
+				<!-- 报名会员头像 -->
+				 <!-- <view class="partic" v-if="info.userList.length > 0 && index < 6" v-for="(it,index) in info.userList  " >
+				    <view><img :src="it.user.headerImg"></view>
+					  
+				  </view><view v-if="info.userList.length>6">...</view>  -->
+				  
+			
+			
+			
+			</view>
+		</view>
+		<view class="event-btn">
+			<view class="btn"  @click="onViewTheater"><button class="btn-yy">{{ info.type === 1 ? '拼场' : (info.type === 2 ? '预约' : '') }}</button></view>
+			<view class="qty">
+				¥{{info.price}}元/人
+			</view>
+		</view>
+	</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name:"EventItem",
+		props:{
+			info:{
+				type:Object,
+				default:()=>{
+					return null;
+				}
+			}
+		},
+		data() {
+			return {
+				
+			};
+		},
+		methods:{
+			onViewPerformer(e){
+				uni.navigateTo({
+					url:'/pages/theater/chair-man/chair-man?id='+e
+				})
+			},
+			
+			onViewTheater(e){
+				uni.navigateTo({
+					url:'/pages/theater/movie/movie?id='+this.info.id
+				})
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+@import './EventItem.scss'
+</style>

+ 245 - 0
components/FitPackageForm/FitPackageForm.scss

@@ -0,0 +1,245 @@
+.com-renew-form{ 
+	width:100%;
+	min-height:500px;
+	position:relative;
+	.renew-form{
+		width:90%;
+		height:100%;
+		min-height:500px;
+		margin:auto;
+		border-top-right-radius: 10px;
+		border-top-left-radius: 10px;
+		background:#FFF;
+		overflow: hidden;
+		.renew-top{
+			height:40px;
+			background:#a07c5a;
+			display:flex;
+			flex-direction: row;
+			.renew-top-header{
+				height:100%;
+				width:20%;
+				display:flex; 
+				justify-content: center;
+				align-items: center;
+				.icon{
+					width:30px;
+					height:30px;
+					border-radius: 50%;
+				}
+			}
+			.renew-top-name{
+				height:100%;
+				width:80%;
+				display:flex; 
+				padding-left:10px;
+				justify-content: flex-start;
+				align-items: center;
+				color:#FFF;
+			}
+		}
+	}
+	.renew-tips{
+		height:30px;
+		display: flex;
+		justify-content: flex-start;
+		align-items: center;
+		margin-top:20px;
+		.text{
+			margin-left:20px;
+			font-weight: bold;
+			color:#593320;
+			.txt{
+				color:#b21c1c;
+			}
+		}
+	}
+	.renew-list{
+	 
+		margin-left:10px;
+		margin-right: 10px; 
+		display: flex;
+		flex-direction: row;
+		overflow-y: auto;
+		overflow-x: auto;
+		padding-top:20px;
+		height:240px;
+		.list-items{
+			display: flex;
+			flex-direction: row;
+			.item{
+				width:180px;
+				// height:220px;
+				border:1px solid #CCC; 
+				margin-right:10px;
+				border-radius: 10px;
+				position:relative;
+				background:#faf9fa;
+				display:flex;
+				overflow: hidden;
+				flex-direction: column;
+				.active{
+					position:absolute;
+					right:0px;
+					top:0px;
+					z-index:999;
+					background:#FFF;
+					border-radius: 50%;;
+				}
+				
+				.tips{
+					display: flex;
+					justify-content: center;
+					align-items: center; 
+					background:#b21c1c;
+					border-bottom-right-radius: 20px;
+					color:#FFF;
+					width:100px;
+					height:25px;
+					line-height: 25px;
+					overflow: hidden;
+					left:0px;
+					top:0px;
+					position:absolute; 
+					z-index:99; 
+				}
+				.item-img{
+					padding-top:30px;
+					.package-img{ 
+						width:100%;
+						height:160px;
+					} 
+					 .bottomBg{
+						 border-bottom:1px dashed #a1a1a1;
+					 }
+					 .vip-list{
+						 display:flex;
+						 width:95%; 
+						 margin-left:5px;
+						 margin-right:5px;
+						 flex-direction: column;
+						   border:1px solid red;
+						 .vip-item{
+							 display:flex;
+							 flex-direction: row;
+							 border:1px solid red;
+							 min-height:30px;
+							 line-height: 30px;
+							 font-size:12px; 
+							 .vip-img{
+								 display:flex;
+								 width:10%;
+								 height:100%;
+								
+								 justify-content:center;
+								 align-items: center;
+								 
+								 .img{
+									 width:24px;
+									 height:18px; 
+									 margin-top:10px;
+								 }
+								 
+							 }
+							 .vip-content{
+								 display:flex;
+								 width:90%;
+								 height:100%;
+								 flex-direction: column; 
+								 justify-content: flex-start;
+								 align-items: center;
+									 
+								 .content-item{
+									 display:flex;
+									 flex-direction: row;
+									 width:100%;
+									 height:100%;
+									 justify-content: flex-start;
+									 align-items: center; 
+									 
+									 .vip-item-cap{
+										 display:flex;
+										 width:50%;
+										 height:100%;
+										 justify-content: flex-start;
+										 align-items: center;
+										 margin-left:10px;
+									 }
+									 .vip-item-text{
+										 display:flex;
+										 width:70%;
+										 height:100%;
+										 margin-right: 10px;
+										 justify-content: flex-end;
+										 align-items: center;
+									 }
+								 }
+								 
+								 
+								 
+							 }
+							 
+							 
+						 }
+					 }
+					 
+					 
+				}
+				.item-price{
+					background:#CCC;
+					height:40px;
+					display: flex;
+					flex-direction: row;
+					justify-content: center;
+					align-items: center;
+					color:#FFF;
+					border-bottom-left-radius: 10px;
+					border-bottom-right-radius: 10px;
+					.price{
+						font-size:18px;
+						.sign{
+							font-size:12px;
+						}
+					}
+				}
+			}
+			
+			.actived{
+				border:1px solid #b21c1c!important;
+				.item-price{
+					background:#b21c1c!important;
+				}
+			}
+		}
+	}
+	
+	.renew-btns{
+		width:100%;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		margin-top:20px;
+		.btn-pay{
+			width:200px;
+			height:30px;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			border-radius: 10px;
+			background:#b21c1c;
+			padding:0px;
+			border:none;
+			color:#FFF;
+			line-height: 30px;
+			font-size:14px;
+		}
+	}
+	.letter{
+		background: url(/static/images/letter.png) no-repeat;
+		height:120px;
+		position:absolute;
+		width:100%;
+		bottom:0px;
+		left:0px;
+	}
+}

+ 155 - 0
components/FitPackageForm/FitPackageForm.vue

@@ -0,0 +1,155 @@
+<template>
+	<view class="com-renew-form">
+
+		<view class="renew-form">
+			<view class="renew-top"> 
+				<view class="renew-top-name">
+				套餐订购
+				</view>
+			</view>
+
+			<view class="renew-tips">
+				<view class="text">您当前要订购的是<text class="txt">{{courseInfo.name}}</text>套餐:</view>
+			</view>
+
+			<view class="renew-list">
+
+				<view class="list-items">
+
+					<block v-for="(it,index) in packageList">
+						<view class="item " :class="activeIndex==index?'actived':''" @click="onPickLeve(index)">
+							<view class="tips">{{it.name}}</view>
+							<view class="item-img">
+							   <image :src="it.icon" class="package-img"></image> 
+							</view>
+							<view class="item-price">
+								<view class="price">
+									<text class="sign">¥</text>{{it.salePrice}}
+								</view>
+							</view>
+
+							<view class="active" v-if="activeIndex==index">
+								<uni-icons type="checkbox-filled" size="30"></uni-icons>
+
+							</view>
+						</view>
+
+					</block>
+
+
+
+
+				</view>
+
+
+			</view>
+			<view class="renew-btns">
+				<button class="btn-pay" @click="onBuyOrder">立即支付</button>
+			</view>
+		</view>
+
+		<view class="letter"></view>
+	</view>
+</template>
+
+<script>
+	import {
+		mapState,
+		mapMutations
+	} from 'vuex'
+	export default {
+		name: "RenewForm",
+		emits:['onCloseRenew'],
+		props: {
+			packageList: {
+				type: Array,
+				default: () => {
+					return [];
+				}
+			},
+			courseInfo:{
+				type:Object,
+				default:()=>{
+					return null;
+				}
+			},
+		},
+		watch: {
+			'packageList': {
+				handler(newVar, oldVar) {
+					console.log("newVar", newVar);
+
+				},
+				deep: true,
+				immediate: true,
+			}
+		},
+		data() {
+			return {
+				activeIndex: 0,
+			};
+		},
+		computed: {
+			...mapState(['systemInfo', 'store_id', 'userInfo']),
+		},
+		onShow() {
+
+		},
+		methods: {
+			onPickLeve(e) {
+				this.activeIndex = e;
+			},
+
+			onBuyOrder(e) {
+				let _this = this;
+				let packageId = _this.packageList[_this.activeIndex].id;
+				let par = { 
+					package_id:packageId,
+					user_id: _this.userInfo.id,
+					course_id:_this.courseInfo.id,
+					store_id:_this.store_id,
+					pay_type: 1,
+				}
+				_this.$http.request('fitness/addCourseOrder', {
+					...par
+				}, "", "", true).then(res => {
+
+					if (res.code == '200') {
+						// #ifdef MP-WEIXIN
+						wx.requestPayment({
+							timeStamp: res.data.timeStamp,
+							nonceStr: res.data.nonceStr,
+							package: res.data.package,
+							signType: res.data.signType,
+							paySign: res.data.paySign,
+							success: (res) => { 
+								uni.showToast({
+									title:'您已支付成功,现在可以直接提交预约啦',
+									icon:'success',
+									success: (e) => {
+										_this.$emit("onCloseRenew");
+									}
+								}) 
+							},
+							fail: (res) => { 
+								uni.showToast({
+									title:'支付失败',
+									icon:'error',
+									success: (e) => {
+										_this.$emit("onCloseRenew");
+									}
+								})
+							}
+						})
+						// #endif
+					}  
+				}).catch(err => {})
+			},
+
+		}
+	}
+</script>
+
+<style lang="scss">
+	@import './FitPackageForm.scss'
+</style>

+ 34 - 0
components/Footer/Footer.scss

@@ -0,0 +1,34 @@
+.com-footer{
+	height:60px;
+	// border:1px solid red;
+	background:#FFF;
+	border-top:1px solid #CCC;
+	position:fixed;
+	bottom:0px;
+	width:100%;
+	display:flex;
+	flex-direction: row;
+	.menu{
+		width:25%;
+		display:flex;
+		flex-direction: column;
+		.icon{
+			display:flex;
+			flex-direction: column;
+			justify-content: center;
+			align-items: center;
+			margin-top:10px;
+			.img{
+				height:18px;
+				width:18px;
+			}
+		}
+		.name{
+			font-size:12px;
+			display:flex;
+			justify-content: center;
+			align-items: center;
+			margin-top:5px;
+		}
+	}
+}

+ 82 - 0
components/Footer/Footer.vue

@@ -0,0 +1,82 @@
+<template>
+	<view class="com-footer">
+		<view class="menu" @click="onViewFitness">
+			<view class="icon">
+				<image src="/static/images/ftMenu1.png" class="img"></image>
+			</view>
+			<view class="name">健身房</view>
+		</view>
+		<view class="menu" @click="onViewTheater">
+			<view class="icon">
+				<image src="/static/images/ftmenu2.png" class="img"></image>
+			</view>
+			<view class="name">社区中心</view>
+		</view>
+		<view class="menu" @click="onViewCoffee">
+			<view class="icon">
+				<image src="/static/images/ftmenu3.png" class="img"></image>
+			</view>
+			<view class="name">商城</view>
+		</view>
+		<view class="menu" @click="onViewSchool">
+			<view class="icon">
+				<image src="/static/images/ftmenu4.png" class="img"></image>
+			</view>
+			<view class="name">爱心地</view>
+		</view>
+		<view class="menu" @click="onViewMy">
+			<view class="icon">
+				<image src="/static/images/ftmenu5.png" class="img"></image>
+			</view>
+			<view class="name">我的</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name:"Footer",
+		data() {
+			return {
+				
+			};
+		},
+		methods:{
+			
+			onViewFitness(e){
+				uni.navigateTo({
+					url:'/pages/fitness/index/index'
+				})
+			},
+			
+			onViewCoffee(e){
+				uni.navigateTo({
+					url:'/shop/Category/Category'
+				})
+			},
+			
+			onViewTheater(e){
+				uni.navigateTo({
+					url:'/pages/theater/index/index'
+				})
+			},
+			
+			onViewSchool(e){
+				uni.navigateTo({
+					url:'/pages/school/index/index'
+				})
+			},
+			
+			//访问会员中心
+			onViewMy(e){
+				uni.switchTab({
+					url:'/pages/home/home'
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+@import './Footer.scss'
+</style>

+ 77 - 0
components/GoodsItem/GoodsItem.scss

@@ -0,0 +1,77 @@
+.com-goods-item{
+	display:flex;
+	flex-direction: row;
+	height:80px;
+	padding:10px;
+	.goods-img{
+		display:flex;
+		height:100%;
+		width:30%;
+		.img{
+			width:60px;
+			height:60px;
+			border-radius: 10px;
+		}
+	}
+	.goods-info{
+		width:70%;
+		display:flex;
+		flex-direction: column;
+		position:relative;
+		.name{
+			font-size:14px;
+			font-weight:bold;
+		}
+		.tips{
+			font-size:12px;
+			color:#CCC;
+			
+		}
+		.price{
+			font-size:14px;
+			color:$teacher-main-color;
+			.sign{
+				font-size:12px;
+			} 
+		}
+		.btn-opt{
+			position:absolute;
+			right:10px;
+			bottom:5px;
+			display:flex;
+			flex-direction: row;
+			.btn-mus{
+				border-radius: 50%;
+				display:flex;
+				width:20px;
+				height:20px;
+				background:$teacher-main-color;
+				color:#FFF;
+				justify-content: center;
+				align-content: center;
+				font-size:12px;
+			}
+			.btn-num{
+				width:20px;
+				text-align:center;
+				font-size:12px;
+			}
+			.btn-plus{
+				border-radius: 50%;
+				display:flex;
+				width:20px;
+				height:20px;
+				font-size:12px;
+				background:$teacher-main-color;
+				color:#FFF;
+				justify-content: center;
+				align-content: center;
+			}
+				
+		}
+	}
+
+	
+	
+	
+}

+ 33 - 0
components/GoodsItem/GoodsItem.vue

@@ -0,0 +1,33 @@
+<template>
+	<view class="com-goods-item">
+		<view class="goods-img">
+			<image src="/static/temp/temp.png" class="img"></image>
+		</view>
+		<view class="goods-info">
+			<view class="name">商品名称</view>
+			<view class="tips">商品描述</view>
+			<view class="price"><text class="sign">¥</text>199</view>
+			<view class="btn-opt">
+				<view class="btn-mus">-</view>
+				<view class="btn-num">1</view>
+				<view class="btn-plus">+</view>
+			</view>
+			
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name:"GoodsItem",
+		data() {
+			return {
+				
+			};
+		}
+	}
+</script>
+
+<style lang="scss">
+@import './GoodsItem.scss'
+</style>

+ 49 - 0
components/PlanDate/PlanDate.scss

@@ -0,0 +1,49 @@
+.calendar {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  width: 100%;
+ 
+  
+}
+
+.row {
+	
+	width: 100%;
+  display: flex;
+  flex-wrap: wrap;
+  margin-left: 15px;
+  
+}
+
+.item {
+  margin: 5px 7px;
+  height: 20px;
+  width: 10%;
+ 
+
+  border-radius: 5px;
+}
+
+
+.text {
+font-size: 12px;
+font-weight: bold;
+}
+
+.active{
+			
+					color:#FFf;
+					
+					width:28px;
+					height:28px;
+				    line-height: 28px;
+				    text-align: center;
+					margin-left: -5px;
+					margin-top: -5px;
+					
+					background:#b21c1c;
+					border-radius: 50%;
+				
+			
+		}

+ 78 - 0
components/PlanDate/PlanDate.vue

@@ -0,0 +1,78 @@
+<template>
+	<view class="com-plan-date calendar"> 
+		<view class="list">
+			<view  class="row" v-for="(row, rowIndex) in calendarRows" :key="rowIndex">
+				<view  class="item" v-for="(item, itemIndex) in row" :key="itemIndex">
+					<text  v-if="rowIndex === 0" class="text">{{ item }}</text>
+					<!-- 显示日期 -->
+					<view   @click="onViewDate(item, itemIndex)" class="text" v-else :class="{ active: rowIndex === 1 && itemIndex === activeIndex }">{{ item.day }}</view>
+				</view>
+			</view>
+		</view> 
+	</view>
+</template>
+<script>
+	export default {
+		name:"PlanDate",
+		emits:['onSetDate'],
+		data(){
+			return {
+				dataList:[],
+				activeIndex:0,
+				calendarRows:''
+			}
+		},
+		created() {
+			this.initDate();
+		},
+		methods:{
+			
+			onViewDate(e,index){
+				this.activeIndex=index;
+				console.log(e.date);
+				this.$emit("onSetDate",e.date);
+			}, 
+		initDate() {
+			
+		    let _this = this;
+		    let d = new Date();
+		    let weeks = ['日', '一', '二', '三', '四', '五', '六'];
+		
+		    // 创建一个新的数组来存储日历的行
+		    _this.calendarRows = [];
+		
+		    // 首行显示星期日到星期六
+		    _this.calendarRows.push(weeks);
+	
+		    // 下面显示最近的14天
+		    let datesRow = [];
+		    for (var i = 0; i < 14; i++) {
+		        let temp = {
+		            'date': d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d.getDate(),
+		            'week': weeks[d.getDay()],
+		            'day': d.getDate() < 10 ? '0' + d.getDate() : d.getDate(),
+		        }
+		         datesRow.push(temp);
+		        
+		                
+		        
+		                d.setDate(d.getDate() + 1);
+		    }
+		
+		    // 如果日期少于7个,添加空元素
+		    while (datesRow.length < 7) {
+		        datesRow.push({});
+		    }
+		
+		    _this.calendarRows.push(datesRow);
+		}
+		},
+		
+		
+	}
+</script>
+
+
+<style scoped>
+@import url(./PlanDate.scss);
+</style>

+ 59 - 0
components/Protocal/Protocal.scss

@@ -0,0 +1,59 @@
+.protocal-content{
+		background:#FFF;
+		min-height:360px;
+		width:90%;
+		margin:auto;
+		border-top-right-radius: 20px;
+		border-top-left-radius: 20px; 
+		box-shadow: 0px 0px 20px #5a5a5a;
+		.title{
+			font-size: 18px;
+			font-weight: bold;
+			width:100%;
+			height:50px;			
+			display:flex;
+			justify-content: center;
+			align-items: center;
+		}
+		.content{
+			margin-left:20px;
+			margin-right: 20px;
+			font-size:14px;
+			line-height: 25px;
+			.pro{
+				margin-bottom: 10px;
+				.red{
+					color:#b21c1c;
+				}
+			}
+			
+		}
+		.btns{
+			width:100%;
+			height:50px; 
+			margin-top:20px;
+			display: flex;
+			flex-direction: row;
+			justify-content: space-between;
+			align-items: center;
+			.btn{
+				width:50%; 
+				display:flex;
+				justify-content: center;
+				align-items: center;
+				font-size:14px;
+				.btn-disagree{
+					width:60%;
+					font-size:14px;
+					border-radius: 5px;
+				}
+				.btn-agree{
+					width:60%;
+					font-size:14px;
+					border-radius: 5px;
+					background:#b21c1c;
+					color:#FFF;
+				}
+			}
+		}
+	}

+ 45 - 0
components/Protocal/Protocal.vue

@@ -0,0 +1,45 @@
+<template>
+
+	<view class="protocal-content">
+		<view class="logs">
+			<view class="and-home">
+				<image src="/static/images/log2.png" mode="heightFix" class="img"></image>
+			</view>
+			<view class="log">
+				<image src="/static/images/log1.png" mode="heightFix" class="img"></image>
+			</view>
+		</view> 
+		<view class="title">服务协议与隐私政策</view>
+		<view class="content">
+			<view class="pro">感谢您信任并使用Coffunity小程序,依据最新法律要求,我们更新了会员服务协议、隐私政策。请您仔细阅读《Coffunity会员服务协议》和《隐私
+	政策》,并确认了解我们对您的个人信息处理
+	原则。</view>
+			<view class="pro">
+				如您同意 <text class="red">《Coffunity会员服务协议》</text>和<text class="red">《隐私政策》</text>,请点击“同意”后使用我们的产品和服务,我们
+	依法全力保护您的个人信息安全。
+				
+			</view>
+					
+		</view> 
+		<view class="btns">
+			<view class="btn"><button class="btn-disagree">不同意</button></view>
+			<view class="btn"><button class="btn-agree">(6)同意</button></view>
+		</view>
+	</view>
+	 
+</template>
+
+<script>
+	export default {
+		name:"Protocal",
+		data() {
+			return {
+				
+			};
+		}
+	}
+</script>
+
+<style lang="scss">
+@import './Protocal.scss'
+</style>

+ 427 - 0
components/RenewForm/RenewForm.scss

@@ -0,0 +1,427 @@
+.com-renew-form{ 
+	width:100%;
+	
+	position:relative;
+	.renew-form{
+		width:90%;
+		height:100%;
+		min-height: 600px;
+		
+		margin:auto;
+		border-top-right-radius: 10px;
+		border-top-left-radius: 10px;
+		background:#FFF;
+		overflow: hidden;
+		.renew-top{
+			height:40px;
+			background:#a07c5a;
+			display:flex;
+			flex-direction: row;
+			.renew-top-header{
+				height:100%;
+				width:20%;
+				display:flex; 
+				justify-content: center;
+				align-items: center;
+				.icon{
+					width:30px;
+					height:30px;
+					border-radius: 50%;
+				}
+			}
+			.renew-top-name{
+				height:100%;
+				width:80%;
+				display:flex; 
+				justify-content: flex-start;
+				align-items: center;
+				color:#FFF;
+			}
+		}
+	}
+	.renew-tips{
+		height:30px;
+		display: flex;
+		justify-content: flex-start;
+		align-items: center;
+		margin-top:20px;
+		.text{
+			margin-left:20px;
+			font-weight: bold;
+			color:#593320;
+			.txt{
+				color:#b21c1c;
+			}
+		}
+	}
+	.renew-list{
+	 
+		margin-left:10px;
+		margin-right: 10px; 
+		display: flex;
+		flex-direction: row;
+		overflow-y: auto;
+		overflow-x: auto;
+		padding-top:20px;
+		.list-items{
+			display: flex;
+			flex-direction: row;
+			.item{
+				width:290px;
+				
+				// height:220px;
+				border:1px solid #CCC; 
+		
+				margin-right:10px;
+				border-radius: 10px;
+				position:relative;
+				background:#faf9fa;
+				display:flex;
+				overflow: hidden;
+				flex-direction: column;
+				.active{
+					position:absolute;
+					right:0px;
+					top:0px;
+					z-index:999;
+					background:#FFF;
+					border-radius: 50%;;
+				}
+				
+				.tips{
+					display: flex;
+					justify-content: center;
+					align-items: center; 
+					background:#666666;
+					color:#FFF;
+					width:100%;
+					height:25px;
+					line-height: 25px;
+					overflow: hidden;
+					left:0px;
+					top:0px;
+					position:absolute;
+					
+					z-index:99; 
+				}
+				.item-img{
+				
+					padding-top:40px;
+					 .bottomBg{
+						 border-bottom:1px dashed #a1a1a1;
+					 }
+					 .vip-list{
+						 display:flex;
+						 width:95%; 
+						 margin-left:5px;
+						 margin-right:5px;
+						 flex-direction: column;
+						 .vip-item{
+							 display:flex;
+							 flex-direction: row;
+							 min-height:30px;
+							 line-height: 30px;
+							 font-size:12px; 
+							 .vip-img{
+								 display:flex;
+								 width:10%;
+								 height:100%;
+								 
+								 justify-content:center;
+								 align-items: center;
+								 
+								 .img{
+									 width:24px;
+									 height:18px; 
+									 margin-top:10px;
+								 }
+								 
+							 }
+							 .vip-content{
+								 min-height: 40px;
+								 display:flex;
+								 width:90%;
+								 height:100%;
+								 flex-direction: column; 
+								 justify-content: flex-start;
+								 align-items: center;
+								
+								 .content-item{
+									 
+									 display:flex;
+									 flex-direction: row;
+									 width:100%;
+									 height:100%;
+									 justify-content: flex-start;
+									 align-items: center; 
+									 
+									 .vip-item-cap{
+										 display:flex;
+										 width:80%;
+										 height:100%;
+										 justify-content: flex-start;
+										 align-items: center;
+										 margin-left:10px;
+									 }
+									 .vip-item-text{
+										 display:flex;
+										 width:70%;
+										 height:100%;
+										 margin-right: 10px;
+										 justify-content: flex-end;
+										 align-items: center;
+									 }
+								 }
+								 
+								 
+								 
+							 }
+							 
+							 
+						 }
+					 }
+					 
+					 
+				}
+				.item-price{
+					background:#666666;
+					height:30px;
+		            text-align: center;
+					flex-direction: row;
+					color:#FFF;
+					position: absolute;
+					width: 100%;
+					bottom: 0px;
+					border-bottom-left-radius: 10px;
+					border-bottom-right-radius: 10px;
+					.price{
+						font-size:18px;
+						.sign{
+							font-size:12px;
+						}
+					}
+				}
+			}
+			
+			.actived{
+				border:1px solid #b21c1c!important;
+				.item-price{
+					background:#b21c1c!important;
+				}
+				.tips{
+					background:#b21c1c!important;
+				}
+			}
+		}
+	}
+	
+	.renew-btns{
+		width:100%;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		margin-top:20px;
+		.btn-pay{
+			width:80px;
+			height:30px;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			border-radius: 10px;
+			background:#b21c1c;
+			padding:0px;
+			border:none;
+			color:#FFF;
+			line-height: 30px;
+			font-size:14px;
+		}
+	}
+	
+}
+
+.RenewInfo{
+	
+	width: 90%;
+	margin:0 auto;
+    font-size: 12px;
+	padding: 10px 0px 70px 0px;
+	line-height: 20px;
+}
+
+
+.btncoup_date{
+	position: absolute;
+	left: 5px;
+	bottom:35px;
+	
+	width: 100px;
+	color: #b21c1c;
+	text-align: center;
+	border-radius: 5px;
+	margin-left: 5px;
+	line-height: 16px;
+	font-size: 14px;
+	
+}
+.btncoup{
+									
+									position: absolute;
+									right: 5px;
+									bottom:35px;
+							        
+									width: 100px;
+									color: #b21c1c;
+									text-align: center;
+									border-radius: 5px;
+									margin-left: 5px;
+									line-height: 16px;
+									font-size: 14px;
+									
+									
+									
+								}
+								
+								
+								
+
+			
+	.vip_head{
+		background-color: #593320;
+		width: 100%;
+		height: 40px;
+		.vip-form-title{
+			color:#FFF;
+			font-size: 12px;
+			line-height: 40px;
+			padding-left: 30px;
+			
+		}
+	}
+	.txtred{
+		color: #b21c1c;
+	}
+	.vip-form{
+			width:95%;
+			margin:auto;
+			margin-top:5px;
+			margin-bottom:40px;
+			border-bottom: 2px solid #F0F0F0;
+			padding: 10px;
+		    max-height: 150px;
+			min-height: 30px;
+			overflow: auto;
+			
+			.vip-form-tab{
+				
+				
+				.tab{
+					width:100%;
+					display: flex;
+					flex-direction: row;
+					justify-content: space-between;
+					align-items: center;
+					 min-height:20px;
+					 font-size: 12px;
+					.col1{
+						width:10%;
+						 height: 100%;
+						display:flex;
+						justify-content: left;
+						align-items: center;
+						
+					
+						
+						.icon{
+							width: 25px;
+							height:25px;
+							
+						}
+					}
+					.col2{
+						width:80%;
+						height:100%; 
+						text-align: left;
+						margin-left: 0px;
+						display:flex;
+						justify-content: left;
+						align-items: center;
+					}
+					.col3{
+						width:10%;
+						height:100%;
+					
+					
+						display:flex;
+						justify-content: left;
+						align-items: center;
+					}
+					
+				}
+				.tab1{
+					width:100%;
+					display: flex;
+					flex-direction: row;
+					justify-content: space-between;
+					align-items: center;
+					height:120px;
+					.col1{
+						width:30%;
+						
+						 height:100%;
+						display:flex;
+						justify-content: center;
+						align-items: center;
+						border-left: 1px solid #593320;
+						border-top: 1px solid #593320;
+						border-right: 1px solid #593320;
+						.icon{
+							height:25px;
+							
+						}
+					}
+					.col-more{
+						display: flex;
+						width:70%;
+						 height:100%;
+						flex-direction: column;
+						.item{
+							display: flex;
+							flex-direction: row;
+							width:100%;
+							height:40px;
+							.col2{
+								width:50%;  
+								display: flex;
+								justify-content: center;
+								align-items: center;
+								
+							}
+							.col3{
+								width:50%;
+								display: flex;
+								justify-content: center;
+								align-items: center;
+								// border-left: 1px solid #593320;
+								border-top: 1px solid #593320;
+								border-right: 1px solid #593320;
+							}
+						}
+					}
+				}
+				
+			}
+		}
+	
+	.cardcoup{
+		
+	font-size: 12px;
+	color: #FFF;
+width: 100px;
+display: flex;
+height: 20px;
+line-height: 20px;
+position: absolute;
+right: 25px;
+top:10px;
+		
+	}

+ 357 - 0
components/RenewForm/RenewForm.vue

@@ -0,0 +1,357 @@
+<template>
+	<view class="com-renew-form">
+
+		<view class="renew-form">
+			<view class="vip_head"><view class="vip-form-title">{{userInfo.nickname}},您的权益情况:</view> 	<view class="cardcoup" @click="onViewEquity"><text>查看我的卡券</text></view></view>
+				<view class="vip-form">
+				
+				<view class="vip-form-tab"   >
+					<block v-if="ticketList ">
+					<block v-for="(it,index) in ticketList" >
+						<view class="tab" @click="onViewEquity">
							<view class="col1">
+								<!-- 商品券 -->
								<image src="/static/images/coffeecup.png" v-if="it.ticket.type==1" class="icon"  mode="aspectFit"/>
+								<!-- 课程券 -->								
+								<image src="/static/images/gl.png" v-if="it.ticket.type==2" class="icon"  mode="aspectFit"/>
+								<!-- 剧场活动 -->								
+								<image src="/static/images/door.png" v-if="it.ticket.type==3" class="icon"  mode="aspectFit"/>
+								<!-- 早鸟会员 -->									
								<image src="/static/images/door.png" v-if="it.ticket.type==4" class="icon"  mode="aspectFit"/>
							</view>
							<view class="col2"><text class="txtred">{{it.ticket.name}}</text>--{{formatIntro(it.ticket.intro)}}</view> 
+							<view class="col3"  > 
+							
+							<block v-if="it.ticket.type==1">{{it.qty}}份</block>
+							<block v-if="it.ticket.type==2">{{it.qty}}节</block>
+							<block v-if="it.ticket.type==3">{{it.qty}}场</block>
+							<block v-if="it.ticket.type==4">{{it.qty}}节</block>
+							</view>
						</view>
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+						
+					</block>
+					
+					<view class="tab" v-if="userInfo.zlDays>0">
+						<view class="col1">
+							
+							<!-- 早鸟会员 -->									
+							<image src="/static/images/door.png"  class="icon"  mode="aspectFit"/>
+						</view>
+						<view class="col2"><text class="txtred">会员早鸟</text>--社区中心早鸟权益提前{{userInfo.zlDays}}天</view> 
+						<view class="col3"  > 
+						
+						<block >享有</block>
+						
+						</view>
+					</view>
+					</block>
+				
+					<block v-else><view class="RenewInfo">目前您还没有购买任何会员</view></block>
+				
+				</view>
+				
+			</view>
+			<view class="renew-tips">
+				<block v-for="(it,index) in leveList">
+				<view class="text" v-if="activeIndex==index">您当前选择了:<text class="txt">{{it.name}}</text></view>
+				</block>
+			</view>
+
+			<view class="renew-list">
+
+				<view class="list-items">
+
+					<block v-for="(it,index) in leveList">
+						<view class="item " :class="activeIndex==index?'actived':''" @click="onPickLeve(index)">
+							<view class="tips" >{{it.name}}</view>
+							<view class="item-img">
+								<view class="vip-list">
+									
+									<block v-for="(item,itemIndex) in it.items">
+										<view class="vip-item bottomBg">
+											<view class="vip-img">
+												<!-- 商品券 -->
+												<image src="/static/images/coffeecup.png" v-if="item.ticket.type==1" class='img' mode="aspectFit"/>
+												<!-- 课程券 -->								
+												<image src="/static/images/gl.png" v-if="item.ticket.type==2" class='img' mode="aspectFit"/>
+												<!-- 剧场活动 -->								
+												<image src="/static/images/door.png" v-if="item.ticket.type==3" class='img' mode="aspectFit"/>
+												
+											</view>
+											<view class="vip-content">
+												<view class="content-item">
+													<view class="vip-item-cap">{{item.name}}</view>
+													<view class="vip-item-text" v-if="item.ticket.type!=4">{{item.qty}} 
+													<block v-if="item.ticket.type==1">份</block>
+													<block v-if="item.ticket.type==2">节</block>
+													<block v-if="item.ticket.type==3">场</block>
+													</view>
+													
+												</view>
+												
+												
+											</view>
+											
+										</view>
+										
+									</block>
+                   
+ <!-- 
+									<view class="vip-item bottomBg">
+										<view class="vip-img"><image src="/static/images/gl.png" mode="widthFix" class="img"></image></view>
+										<view class="vip-content">
+											<view class="content-item">
+												<view class="vip-item-cap">器械区</view>
+												<view class="vip-item-text">{{it.qixie}}天</view>
+											</view>
+											<view class="content-item">
+												<view class="vip-item-cap">私教课</view>
+												<view class="vip-item-text">{{it.sijiaoday}}天内{{it.sijiaojie}}节</view>
+											</view>
+											<view class="content-item">
+												<view class="vip-item-cap">小班课</view>
+												<view class="vip-item-text">{{it.xiaobanday}}天内{{it.xiaobanjie}}节</view>
+											</view>
+										</view>
+									</view>
+
+									<view class="vip-item bottomBg">
+										<view class="vip-img"><image src="/static/images/ftmenu2.png" mode="widthFix" class="img"></image></view> 
+										<view class="vip-content">
+											<view class="content-item">
+												<view class="vip-item-cap">早鸟特权</view>
+												<view class="vip-item-text">{{it.early}}天</view>
+											</view>
+										</view>
+									</view>   -->
+
+<view class="vip-item bottomBg" v-if="it.zlDays>0">
+											<view class="vip-img">
+												
+												<!-- 剧场活动 -->								
+												<image src="/static/images/door.png"  class='img' mode="aspectFit"/>
+												
+											</view>
+											<view class="vip-content">
+												<view class="content-item">
+													<view class="vip-item-cap">赠送社区中心早鸟权益</view>
+													<view class="vip-item-text" >提前{{it.zlDays}} 
+													
+													<block >天</block>
+													
+													</view>
+													
+												</view>
+												
+												
+											</view>
+											
+										</view>
+
+
+
+
+
+
+                        
+								</view>
+                           <view class="btncoup_date">有效期:{{it.items[0].expireTime}}天</view>  <view class="btncoup" @click="onViewEquity"><text>我的卡券</text></view>
+
+                            <view class="RenewInfo">{{it.intro}}</view>
+							</view>
+							<view class="item-price">
+								<view class="price">
+									<text class="sign">¥</text>{{it.price}}
+								</view>
+							</view>
+
+							<view class="active" v-if="activeIndex==index">
+								<uni-icons type="checkbox-filled" size="30"></uni-icons>
+
+							</view>
+						</view>
+
+					</block>
+
+
+
+
+				</view>
+
+
+			</view>
+			<view class="renew-btns">
+				
+				<button class="btn-pay" @click="onBuyOrder">立即支付</button>
+			</view>
+			
+			
+			
+		</view>
+
+		<view class="letter"></view>
+	
+	</view>
+</template>
+
+<script>
+	import {
+		mapState,
+		mapMutations
+	} from 'vuex'
+	export default {
+		formattedIntro:'',	
+		name: "RenewForm",
+		emits:['onCloseRenew'],
+		props: {
+		  leveList: {
+		    type: Array,
+		    default: () => {
+		      return [];
+		    }
+		  }
+		},
+        watch:{
+			'leveList':{
+				handler(newVar,oldVar){
+					
+					console.log("NewVar",newVar);
+				},
+				deep:true,
+				immediate:true,
+			},
+        	
+        	'userInfo':{
+        		handler(newVar,oldVar){
+        			
+        			this.initUserLevel();
+        		},
+        		deep:true,
+        		immediate:true,
+        	}
+        },
+		computed: {
+			
+		    userInfo() {
+		      return this.$store.state.userInfo;
+		    },
+		  },
+		data() {
+			
+				
+				
+				return {
+					activeIndex: 0,
+					
+					ticketList: [],
+				    };
+			
+			
+			
+		},
+		created() {
+		   this.fetchUserTicket();
+		 },
+		computed: {
+			...mapState(['systemInfo', 'store_id', 'userInfo']),
+		},
+		onShow() {
+
+		},
+		methods: {
+			formatIntro: function(intro) {
+			   if (intro && intro.length > 15) {
+			     return intro.substring(0, 15) + "...";
+			   } else {
+			     return intro || '';
+			   }
+			 },
+						
+			fetchUserTicket() {
+			  this.$http
+			    .request('userticket/search', { userId: this.userInfo.id, page: 1, pageSize: 999 }, 				'', '', true)
+			    .then((res) => {
+			      this.ticketList = res.data.dataList;
+			    })
+			    .catch((err) => {
+			      console.error(err);
+			    });
+			},
+			onPickLeve(e) {
+				this.activeIndex = e;
+			},
+           onViewEquity(e){
+           	uni.navigateTo({
+           		url:'/pages/equity/equity',
+           	})
+			},
+			initUserLevel(){
+				let _this=this;
+				_this.$http.request('member/getMemberLevelInfo', {
+					openid:_this.userInfo.openid,
+				}, "", "", true).then(res => {  
+					let js=JSON.parse(res.data.data.levelData); 
+					_this.currentLevel=js;   
+				}).catch(err => {}) 
+			},
+			onBuyOrder(e) {
+				let _this = this;
+				let level = _this.leveList[_this.activeIndex];
+				let par = {
+					level_id: level.id,
+					user_id: _this.userInfo.id,
+					pay_type: 1,
+				}
+				_this.$http.request('theater/addLevelOrder', {
+					...par
+				}, "", "", true).then(res => {
+
+					if (res.code == '200') {
+						// #ifdef MP-WEIXIN
+						wx.requestPayment({
+							timeStamp: res.data.timeStamp,
+							nonceStr: res.data.nonceStr,
+							package: res.data.package,
+							signType: res.data.signType,
+							paySign: res.data.paySign,
+							success: (res) => { 
+								
+								uni.showToast({
+									title:'您已支付成功',
+									icon:'success',
+									success: (e) => {
+										_this.fetchUserTicket();
+										_this.$emit("onCloseRenew");
+									}
+								}) 
+							},
+							fail: (res) => { 
+								uni.showToast({
+									title:'支付失败',
+									icon:'error',
+									success: (e) => {
+										_this.$emit("onCloseRenew");
+									}
+								})
+							}
+						})
+						// #endif
+					}
+
+
+
+
+				}).catch(err => {})
+			},
+
+		}
+	}
+</script>
+
+<style lang="scss">
+	@import './RenewForm.scss'
+</style>

+ 53 - 0
components/SchoolUserHeader/SchoolUserHeader.scss

@@ -0,0 +1,53 @@
+.com-school-user-header{
+	display:flex;
+	flex-direction: row;
+	background:#643b17;
+	width:150px;
+	height:60px;
+	overflow: hidden;
+	
+	.header{
+		height:100%;
+		display:flex;
+		width:30%;
+		justify-content: center;
+		align-items: center; 
+		.avatarBtn{
+			height:40px;
+			width:40px;
+				border-radius: 10px;
+			.avatar{
+				width:40px;
+				height:40px; 
+			}
+		}
+		
+	}
+	.user{
+		display:flex;
+		width:70%; 
+		font-size:12px;
+		flex-direction: column;
+		.name{
+			font-size:14px;
+			
+			color:#cccccc;
+			margin-left:10px;
+			height:30px;
+			line-height: 30px;
+		}
+		.icon{
+			height:30px;
+			display:flex;
+			flex-direction: row;
+			align-items: flex-end;
+			justify-content: flex-start;
+			margin-bottom: 10px;
+			.img{
+			 
+				width:20px;
+				margin-left:10px;
+			}
+		}
+	}
+}

+ 121 - 0
components/SchoolUserHeader/SchoolUserHeader.vue

@@ -0,0 +1,121 @@
+<template>
+	<view class="com-school-user-header" v-if="info">
+		<view class="header">
+			
+			<button class="avatarBtn" open-type="chooseAvatar" @chooseavatar="onChooseAvatar">
+				<image class="avatar" :src="info.avatar" mode="scaleToFill"></image> 
+			</button> 
+		</view>
+		<view class="user">
+			<view class="name">{{info.nickname}}</view>
+			<view class="icon">
+				<image src="/static/images/gl.png" mode="widthFix" class="img"></image>
+				<image src="/static/images/coffeecup.png" mode="widthFix" class="img"></image>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		mapState,
+		mapMutations
+	} from 'vuex'
+	export default {
+		name:"SchoolUserHeader",
+		props:{
+			info:{
+				type:Object,
+				default:()=>{
+					return null
+				}
+			}
+		},
+		watch:{
+			'info':{
+				handler(val){
+				
+				
+				console.log(this.userInfo);
+				console.log("val",val);	
+				},
+				deep:true,
+				immediate:true,
+				
+			}
+		},
+		computed: {
+			...mapState(['systemInfo', 'store_id', 'userInfo']), 
+		}, 
+		data() {
+			return {
+				
+			};
+		},
+		methods:{
+			
+			
+			onChooseAvatar(e) { 
+				let _this=this;
+				const { avatarUrl } = e.detail;
+				this.avatar = avatarUrl;
+				
+				uni.uploadFile({
+					url: siteinfo.siteroot + '/index.php?s=/api/upload/upload',
+					filePath: avatarUrl,
+					name: 'file',
+					formData: {
+						'openId': _this.userInfo.openid,
+						'token': uni.getStorageSync('token'),
+					},
+					success: ({data}) => {
+						let res = JSON.parse(data); 
+						if (res.code == 2) {
+							// this.userInfo.avatar = res.src;
+							_this.info.avatar=res.src;
+							_this.onSave();
+							
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none',
+								mask: true
+							});
+						}
+					},
+					fail: () => {
+						uni.showToast({
+							title: '头像上传失败,请稍后重试~',
+							icon: 'none',
+							mask: true
+						});
+					}
+				});
+			},
+			
+			onSave(e){
+				let _this=this;
+				let par={
+					openid:_this.userInfo.openid,
+					avatar:_this.info.avatar,
+					nickname:_this.userInfo.nickname,
+					gender:_this.userInfo.gender,
+					born:_this.userInfo.born,
+					province:_this.userInfo.province,
+					city:_this.userInfo.city,
+					district:_this.userInfo.district, 
+				} 
+				_this.$http.request('member/saveMemberInfo',par, "", "", true).then(res => { 
+					 
+				}).catch(err => { 
+				})
+			},
+			
+			
+		}
+	}
+</script>
+
+<style lang="scss">
+@import "./SchoolUserHeader.scss"
+</style>

+ 80 - 0
components/SoundForm/SoundForm.scss

@@ -0,0 +1,80 @@
+
+.hw{
+	width:320px;
+	height:320px;  
+	overflow: hidden;
+	
+	.hw-header{
+		height:80px;
+		width:100%; 
+		display:flex; 
+		flex-direction: row;
+		.syj{
+			height:100%;
+			margin-top: 20px;
+			justify-content: center;
+			align-items: center;
+			.img{
+				max-height: 100%;
+			}
+		}
+		.hw-img{
+			height:100%;
+			margin-top: 20px;
+			margin-left: 30px;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			.img{
+				max-height: 50%;
+			}
+		}
+	}
+	
+	.hw-content{
+		background-color: white;
+		background-size: contain;					
+	    border: 1px solid #ccc;
+		border-radius: 50px;
+		width:100%;
+		height:260px;
+		margin-top:-30px; 
+		clear:both;
+		display:flex;
+		.hw-items{ 
+			height:140px;
+			width:100%; 
+			margin-left:25px;
+			margin-right:55px;  
+			margin-top:70px;
+			overflow: hidden;  
+			
+			.scroll{
+				width:100%;
+				display:flex;
+				flex-direction: row;
+				.item{
+					float:left;
+					display: flex;
+					flex-direction: column;
+					width:50%;
+					
+					.name{
+						font-size:12px;
+						width:100%;
+						text-align:center;
+					}
+					.image{
+						padding:8px;
+						.img{
+							width:100px;
+							height:100px;
+						}
+					}
+				}
+			}
+			
+		}
+	} 
+	
+}

+ 55 - 0
components/SoundForm/SoundForm.vue

@@ -0,0 +1,55 @@
+<template>
+	<view class="hw">
+		<view class="hw-header">
+			<view class="syj">
+				<image src="../../static/images/syj1.png" class="img" mode="heightFix"/>					
+			</view>
+			<!-- <view class="hw-img">
+				<image src="../../static/images/hw.png" class="img" mode="heightFix"/>
+			</view> -->
+		</view>
+		<view class="hw-content"> 
+			<view class="hw-items">
+								
+				<view class="scroll"> 
+
+	<view @click=onViewZc style="padding: 0px 26px 0px 35px; font-size: 22px; font-weight: bold; width: 100%; "><view>请选择:</view>
+		<view style="border: 1px solid #ccc; text-align: center; border-radius: 7px;width: 80%; margin: 10px auto; height: 40px; line-height: 40px; background-color: #F0F0F0;">发布场地</view>
+		<view @click=onViewZc style="border: 1px solid #ccc; text-align: center; border-radius: 7px;width: 80%; margin: 10px auto;height: 40px; line-height: 40px; background-color: #F0F0F0;">发布活动</view>
+		</view>
+				</view> 
+			</view> 
+		</view> 
+	</view> 
+</template>
+
+<script>
+	export default {
+		name:"SoundForm",
+		props:{
+			dataList:{
+				type:Array,
+				default:()=>{
+					return [];
+				}
+			}
+		},
+		data() {
+			return {
+				
+			};
+		},
+		methods:{
+			onViewZc(){
+				uni.navigateTo({
+					url:'/pages/my/index',
+				})
+			},
+			
+		}
+	}
+</script>
+
+<style lang="scss">
+@import './SoundForm.scss'
+</style>

+ 56 - 0
components/TeacherCourse/TeacherCourse.scss

@@ -0,0 +1,56 @@
+.com-teacher-course{
+	display: flex;
+	flex-direction: row;
+	margin-left:10px;
+	margin-right:10px;
+	height:80px; 
+	margin-bottom:5px;
+	background:#1a1a1a;
+	border-radius: 10px;
+	.header{
+		display: flex;
+		width:25%;
+		justify-content: center;
+		align-items: center;
+		.img{
+			width:70px;
+			height:70px;
+			border-radius: 50%;
+		} 
+	}
+	.intro{
+		display: flex;
+		width:50%;
+		color: #FFF;
+		flex-direction: column;
+		.name{
+			font-weight: bold;
+			font-size:14px;
+			height:40px;
+			line-height: 40px;
+		}
+		.tips{
+			font-size: 12px;
+			.sign{
+				color:$teacher-main-color;
+				font-size:12px;
+			}
+			.price{
+				color:$teacher-main-color;
+				font-size:14px;
+			}
+		}
+	}
+	.btns{
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		.btn{
+			background:$teacher-main-color;
+			font-size:12px;
+			width:80px;
+			color:#FFF;
+			border-radius: 10px;
+		}
+	}
+}

+ 51 - 0
components/TeacherCourse/TeacherCourse.vue

@@ -0,0 +1,51 @@
+<template>
+	<view class="com-teacher-course" v-if="info">
+		<view class="header">
+			<image :src="info.imgUrl" class="img"></image>
+		</view>
+		<view class="intro">
+			<view class="name">{{info.name}}</view>
+			<view class="tips">
+				体验
+				<text class="sign">¥</text>
+				<text class="price">{{info.singlePrice}}</text>/课时
+			</view>
+		</view>
+		<view class="btns">
+			<button class="btn" @click="onViewCourse(info.id)">预约</button>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name:"TeacherCourse",
+		emits:['onViewReserve'],
+		props:{
+			info:{
+				type:Object,
+				default:()=>{
+					return null;
+				}
+			}
+		},
+		data() {
+			return {
+				
+			};
+		},
+		methods:{
+			
+			onViewCourse(id){ 
+				this.$emit("onViewReserve",id);
+				// uni.navigateTo({
+				// 	url:'/pages/fitness/Course/Course?id='+id,
+				// })
+			},
+		},
+	}
+</script>
+
+<style lang="scss">
+@import "./TeacherCourse.scss";
+</style>

+ 67 - 0
components/TeacherSection/TeacherSection.scss

@@ -0,0 +1,67 @@
+.com-teacher-section{
+	background:#1a1a1a;
+	display:flex;
+	flex-direction: row;
+	margin-left:10px;
+	margin-right: 10px;
+	padding-top:10px;
+	padding-bottom:10px;
+	border-bottom:1px solid #3a3a3a;
+	.header{
+		display:flex;
+		width:25%;
+		justify-content: center;
+		align-items: center;
+		.image{
+			width:60px;
+			height:60px;
+			border-radius: 50%;
+		}
+	}
+	.intro{
+		display:flex;
+		width:45%;
+		justify-content:flex-start;
+		align-items: flex-start;
+		flex-direction: column; 
+		.name{
+			color:$teacher-main-color;
+			font-size:14px;
+			font-weight: bold;
+			height:30px;
+			line-height: 30px;
+		}
+		.tips{
+			font-size:12px;
+			color:#c5c5c5; 
+		}
+	}
+	.yy{
+		display: flex;
+		width:30%;
+		justify-content: flex-end;
+		align-items: center;
+		color:#c5c5c5;
+		font-size:12px; 
+		flex-direction: column;
+		.btn{
+			height:50%; 
+			.btn-yy{
+				height:30px;
+				line-height: 30px;
+				width:90px;
+				border-radius: 10px;
+				background:#eb5c20;
+				font-size:12px;
+				color:#FFF;  
+			}
+		}
+		.txt{
+			height:50%;
+			color:$teacher-main-color; 
+			margin-left:5px;
+			margin-right:10px;
+			margin-top:5px;
+		}
+	}
+}

+ 52 - 0
components/TeacherSection/TeacherSection.vue

@@ -0,0 +1,52 @@
+<template>
+	<view class="com-teacher-section" v-if="info!=null">
+		<view class="header" @click="onViewTeacher">
+			<image :src="info.headerImg" class="image"></image>
+		</view>
+		<view class="intro" @click="onViewTeacher">
+			<view class="name">{{info.name}}</view>
+			<view class="tips">{{info.tips}}</view>
+		</view>
+		<view class="yy">
+			<view class="btn">
+				<button class="btn-yy"  @click="onViewReserve">预约</button>
+			</view>
+			<view class="text">
+				共有<text class="txt"> {{info.reqTotal}}</text>人预约
+			</view>
+			
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name:"TeacherSection",
+		emits:['onViewTeacher','onViewReserve'],
+		props:{
+			info:{
+				type:Object,
+				default:()=>{
+					return null
+				}
+			}
+		},
+		data() {
+			return {
+				
+			};
+		},
+		methods:{
+			onViewTeacher(e){ 
+				this.$emit("onViewTeacher",this.info.id);
+			},
+			onViewReserve(e){
+				this.$emit("onViewReserve",this.info.id);
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+@import './TeacherSection.scss'
+</style>

+ 106 - 0
components/VideoItem/VideoItem.scss

@@ -0,0 +1,106 @@
+.com-video-item{ 
+	display:flex;
+	flex-direction: row;
+	justify-content: flex-start;
+	align-items: center; 
+	min-height:110px;
+	background:#FFF;
+	margin-left:10px;
+	margin-right: 10px;
+	margin-top:5px;
+	font-size:12px;
+	border-radius: 7px;
+	.left{
+		display: flex;
+		width:80px;
+		justify-content: center;
+		align-items: center;
+		height:80px;
+		border-radius: 5px;
+		overflow: hidden;
+		margin: 0px 8px;
+		.img{
+			width:100%;
+			height:100%;
+		}
+	}
+	.right{
+		display: flex;
+		width:75%;
+		flex-direction: column;
+		justify-content: flex-start;
+		align-items: flex-start;
+		height:100px;
+		margin-top: -10px;
+		.title{
+			height:50px; 
+			display:flex;
+			width:100%;
+			display:flex;
+			flex-direction:row;
+			justify-content: space-between;
+			align-items: center;
+			.price{
+				color:#470505; 
+				font-size:14px;
+				margin-right:10px;
+				.sign{
+					font-size:12px;
+				}
+			}
+		}
+		.uni-tag{
+			margin-right: 10px;
+		}
+	
+	}
+}
+.part_area{
+	margin-top: -5px;
+	width: 150px;
+	height: 40px;
+	overflow: hidden;
+	display: flex;
+	
+	flex-wrap: wrap;
+	
+	
+	
+}
+.partic{
+	
+	border-radius: 50%;width: 20px; height: 30px; overflow: hidden;  margin-right:1px; margin-bottom:2px; display: flex;
+	
+	
+}
+.partic img {
+	width: 100%;
+	height:100%;
+	
+}
+.parttip{
+		width: 100%;
+		position: relative;
+		
+		font-size: 12px;
+		margin-top: 10px;
+		}
+		
+.tags{
+		display: flex;
+		flex-direction: row;
+		margin-top: 5px;
+		
+		.tag{
+			margin-right: 4px;
+			font-size:12px;
+			border:1px solid #b21c1c;
+			border-radius: 7px;
+			color: #b21c1c;
+			padding: 0px 5px;
+		}
+	}
+.tip{
+margin-top: -5px;	
+	
+}

+ 71 - 0
components/VideoItem/VideoItem.vue

@@ -0,0 +1,71 @@
+<template>
+	<view class="com-video-item" v-if="item"  @click="onViewVideo">
+		<view class="left">
+			<image :src="item.imageUrl" class="img"></image>
+		</view>
+		<view class="right">
+			<view class="title">
+				<view class="name">{{item.name}}</view>
+				<view class="price"><text class="sign">¥</text>{{item.price}}</view>				
+			</view>
+			<view class="tip">时间:
+				<block v-if="item.plan && item.plan.startTime "> {{item.plan.startDate}} 至 {{item.plan.endDate}}</block>
+				<block v-else> 暂无时间按排</block>
+				
+				
+				</view>
+					<view class="tags">
+						<block v-for="(it,index) in item.tags">
+							<view class="tag">{{it}}</view>
+						</block> 
+					</view>
+
+				
+			<view class="part_area"  >
+				<view class="parttip" >已报名:{{item.userList.length}} 人 </view>
+				
+				<!-- 报名会员头像 -->
+				 <!-- <view class="partic" v-if="info.userList.length > 0 && index < 6" v-for="(it,index) in info.userList  " >
+				    <view><img :src="it.user.headerImg"></view>
+					  
+				  </view><view v-if="info.userList.length>6">...</view>  -->
+				  
+			
+			
+			
+			</view>
+		</view> 
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		name:"VideoItem",
+		props:{
+			item:{
+				type:Object,
+				default:()=>{
+					return null;
+				}
+			}
+		},
+		data() {
+			return {
+				
+			};
+		},
+		methods:{
+			onViewVideo(e){
+				uni.navigateTo({
+					url:'/pages/theater/movie/movie?id='+this.item.id
+				})
+			}
+		},
+		
+	}
+</script>
+
+<style lang="scss">
+@import './VideoItem.scss'
+</style>

+ 430 - 0
components/VipForm/VipForm.scss

@@ -0,0 +1,430 @@
+
+	.shop-vip-form{
+		background:#FFF;
+		border-radius: 30px;
+		width:320px;
+		min-height: 550px; 
+		.vip-bg{
+			background-image:  url(/static/images/vipbg.png); 
+			background-size:contain;
+			background-repeat: no-repeat;
+			width:100%;
+			height:80px;
+		}
+		.header{
+			display:flex;
+			flex-direction:column;
+			height:100px;
+			justify-content:flex-start;
+			align-items: left;
+			.img{
+				width:60px;
+				margin-left:30px;
+				display: flex;
+				justify-content:flex-start;
+				align-items: left;
+				border-radius: 15px;
+				overflow: hidden;
+				.header-img{
+					width:60px;
+					height:60px;
+					
+				}
+			}
+			.name{
+				display:flex;
+				
+				color:#593320;
+				font-size: 12px;
+				height:20px;
+				padding-left: 30px;
+				line-height: 30px;
+			}
+		}
+		.tips{
+			color:#593320;
+			margin-top:10px;
+			margin-left:30px;
+			font-weight: bold;
+		}
+		.vip-step{
+			display: flex;
+			flex-direction: row;
+			margin-top:20px;
+			margin-left:10px;
+			margin-right:20px;;
+			.step-item{
+				width:33%;
+				flex-grow: 1;
+				flex-shrink: 1;
+				display: flex;
+				flex-direction: column;
+				padding-left:20px;
+				padding-right: 20px;
+				.icon{ 
+					display: flex;
+					justify-content: center;
+					align-items: center; 
+					.icon{
+						height:30px;
+						 
+					}
+					
+				}
+				.name{
+					margin-top:10px;
+					.box{
+						background:#593320;
+						padding:1px 2px;
+						color:#FFF;
+						border-radius: 10px;
+						text-align: center;
+					}
+				}
+				.disabled{
+					background:#CCC!important;
+				}
+			}
+		}
+		
+		.vip-form{ 
+			width:85%;
+			margin:auto;
+			margin-top:20px;
+			.vip-form-title{
+				color:#593320;
+				font-size: 12px;
+			}
+			.vip-form-tab{
+				margin-top:10px;
+				border-bottom:1px solid #593320;
+				.tab{
+					width:100%;
+					display: flex;
+					flex-direction: row;
+					justify-content: space-between;
+					align-items: center;
+					height:40px;
+					.col1{
+						width:30%;
+						 height:100%;
+						display:flex;
+						justify-content: center;
+						align-items: center;
+						border-left: 1px solid #593320;
+						border-top: 1px solid #593320;
+						border-right: 1px solid #593320;
+						.icon{
+							height:25px;
+							
+						}
+					}
+					.col2{
+						width:45%;
+						height:100%; 
+						border-top: 1px solid #593320;
+						border-right: 1px solid #593320;
+						display:flex;
+						justify-content: center;
+						align-items: center;
+					}
+					.col3{
+						width:45%;
+						height:100%;
+						border-top: 1px solid #593320;
+						border-right: 1px solid #593320;
+						display:flex;
+						justify-content: center;
+						align-items: center;
+					}
+				}
+				.tab1{
+					width:100%;
+					display: flex;
+					flex-direction: row;
+					justify-content: space-between;
+					align-items: center;
+					height:120px;
+					.col1{
+						width:30%;
+						
+						 height:100%;
+						display:flex;
+						justify-content: center;
+						align-items: center;
+						border-left: 1px solid #593320;
+						border-top: 1px solid #593320;
+						border-right: 1px solid #593320;
+						.icon{
+							height:25px;
+							
+						}
+					}
+					.col-more{
+						display: flex;
+						width:70%;
+						 height:100%;
+						flex-direction: column;
+						.item{
+							display: flex;
+							flex-direction: row;
+							width:100%;
+							height:40px;
+							.col2{
+								width:50%;  
+								display: flex;
+								justify-content: center;
+								align-items: center;
+								// border-left: 1px solid #593320;
+								border-top: 1px solid #593320;
+								border-right: 1px solid #593320;
+							}
+							.col3{
+								width:50%;
+								display: flex;
+								justify-content: center;
+								align-items: center;
+								// border-left: 1px solid #593320;
+								border-top: 1px solid #593320;
+								border-right: 1px solid #593320;
+							}
+						}
+					}
+				}
+				
+			}
+		}
+	}
+	
+	.com-renew-form{
+		width:100%;
+		
+		position:relative;
+		.renew-form{
+			width:90%;
+			height:100%;
+			
+			margin:auto;
+			border-top-right-radius: 10px;
+			border-top-left-radius: 10px;
+			background:#FFF;
+			overflow: hidden;
+			.renew-top{
+				height:40px;
+				background:#a07c5a;
+				display:flex;
+				flex-direction: row;
+				.renew-top-header{
+					height:100%;
+					width:20%;
+					display:flex; 
+					justify-content: center;
+					align-items: center;
+					.icon{
+						width:30px;
+						height:30px;
+						border-radius: 50%;
+					}
+				}
+				.renew-top-name{
+					height:100%;
+					width:80%;
+					display:flex; 
+					justify-content: flex-start;
+					align-items: center;
+					color:#FFF;
+				}
+			}
+		}
+		.renew-tips{
+			height:30px;
+			display: flex;
+			justify-content: flex-start;
+			align-items: center;
+			margin-top:20px;
+			.text{
+				margin-left:20px;
+				font-weight: bold;
+				color:#593320;
+				.txt{
+					color:#b21c1c;
+				}
+			}
+		}
+		.renew-list{
+		 
+			margin-left:10px;
+			margin-right: 10px; 
+			display: flex;
+			flex-direction: row;
+			overflow-y: auto;
+			overflow-x: auto;
+			padding-top:20px;
+			.list-items{
+				display: flex;
+				flex-direction: row;
+				.item{
+					width:180px;
+					// height:220px;
+					border:1px solid #CCC; 
+					margin-right:10px;
+					border-radius: 10px;
+					position:relative;
+					background:#faf9fa;
+					display:flex;
+					overflow: hidden;
+					flex-direction: column;
+					.active{
+						position:absolute;
+						right:0px;
+						top:0px;
+						z-index:999;
+						background:#FFF;
+						border-radius: 50%;;
+					}
+					
+					.tips{
+						display: flex;
+						justify-content: center;
+						align-items: center; 
+						background:#b21c1c;
+						border-bottom-right-radius: 20px;
+						color:#FFF;
+						width:100px;
+						height:25px;
+						line-height: 25px;
+						overflow: hidden;
+						left:0px;
+						top:0px;
+						position:absolute;
+						
+						z-index:99; 
+					}
+					.item-img{
+					
+						padding-top:40px;
+						 .bottomBg{
+							 border-bottom:1px dashed #a1a1a1;
+						 }
+						 .vip-list{
+							 display:flex;
+							 width:95%; 
+							 margin-left:5px;
+							 margin-right:5px;
+							 flex-direction: column;
+							 .vip-item{
+								 display:flex;
+								 flex-direction: row;
+								 min-height:30px;
+								 line-height: 30px;
+								 font-size:12px; 
+								 .vip-img{
+									 display:flex;
+									 width:10%;
+									 height:100%;
+									 
+									 justify-content:center;
+									 align-items: center;
+									 
+									 .img{
+										 width:24px;
+										 height:18px; 
+										 margin-top:10px;
+									 }
+									 
+								 }
+								 .vip-content{
+									 display:flex;
+									 width:90%;
+									 height:100%;
+									 flex-direction: column; 
+									 justify-content: flex-start;
+									 align-items: center;
+										 
+									 .content-item{
+										 display:flex;
+										 flex-direction: row;
+										 width:100%;
+										 height:100%;
+										 justify-content: flex-start;
+										 align-items: center; 
+										 
+										 .vip-item-cap{
+											 display:flex;
+											 width:50%;
+											 height:100%;
+											 justify-content: flex-start;
+											 align-items: center;
+											 margin-left:10px;
+										 }
+										 .vip-item-text{
+											 display:flex;
+											 width:70%;
+											 height:100%;
+											 margin-right: 10px;
+											 justify-content: flex-end;
+											 align-items: center;
+										 }
+									 }
+									 
+									 
+									 
+								 }
+								 
+								 
+							 }
+						 }
+						 
+						 
+					}
+					.item-price{
+						background:#CCC;
+						height:30px;
+						display: flex;
+						flex-direction: row;
+						justify-content: center;
+						align-items: center;
+						color:#FFF;
+						border-bottom-left-radius: 10px;
+						border-bottom-right-radius: 10px;
+						.price{
+							font-size:18px;
+							.sign{
+								font-size:12px;
+							}
+						}
+					}
+				}
+				
+				.actived{
+					border:1px solid #b21c1c!important;
+					.item-price{
+						background:#b21c1c!important;
+					}
+				}
+			}
+		}
+		
+		.renew-btns{
+			width:100%;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			margin-top:20px;
+			.btn-pay{
+				width:200px;
+				height:30px;
+				display: flex;
+				justify-content: center;
+				align-items: center;
+				border-radius: 10px;
+				background:#b21c1c;
+				padding:0px;
+				border:none;
+				color:#FFF;
+				line-height: 30px;
+				font-size:14px;
+			}
+		}
+		
+	}

+ 167 - 0
components/VipForm/VipForm.vue

@@ -0,0 +1,167 @@
+<template>
+	<view class="shop-vip-form" v-if="userInfo!=null">
+		<view class="vip-bg"></view>
+	
+		<view class="tips">{{userInfo.nickname}},</view>
+		<view class="tips">您当前权益状态如下:</view>
+		<view class="vip-step">
+			<view class="step-item">
+				<view class="icon"><image src="/static/images/coffeecup.png" class="icon"  mode="aspectFit"/></view>
+				<view class="name">							
+					<view class="box" @click="onOpenRenew">查看</view>
+				</view>
+			</view>
+			<view class="step-item">
+				<view class="icon"><image src="/static/images/gl.png" class="icon"  mode="aspectFit"/></view>
+				<view class="name">							
+					<view class="box disabled" @click="onOpenRenew">查看</view>
+				</view>
+			</view>
+			<view class="step-item">
+				<view class="icon"><image src="/static/images/door.png" class="icon" mode="aspectFit"/></view>
+				<view class="name">							
+					<view class="box disabled" @click="onOpenRenew">查看</view>
+				</view>
+			</view> 
+		</view>
+		<view class="vip-form">
+			<view class="vip-form-title">您当前正在享受的收取权益情况:</view>
+			<view class="vip-form-tab">
+				<block v-for="(it,index) in currentLevel">
+					<view class="tab">
+						<view class="col1">
+							<image src="/static/images/coffeecup.png" class="icon"  mode="aspectFit"/>
+						</view>
+						<view class="col2">{{it.name}}</view>
+						<view class="col3">
+						
+						{{it.qty}}
+						<block v-if="it.type==1">天</block>
+						<block v-if="it.type==2">份</block>
+						</view>
+					</view>
+				</block>
+			</view>
+	
+		</view>
+		
+
+			<view class="letter"></view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		mapState,
+		mapMutations
+	} from 'vuex'
+	export default {
+
+	props: {
+	  leveList: {
+	    type: Array,
+	    default: () => {
+	      return [];
+	    }
+	  }
+	},
+		watch:{
+			
+			'userInfo':{
+				handler(newVar,oldVar){
+					
+					this.initUserLevel();
+				},
+				deep:true,
+				immediate:true,
+			}
+		},
+		
+		
+		
+	
+		data() {
+			return {
+				
+				activeIndex: 0,
+				currentLevel: null,
+			};
+			
+			
+		},
+		
+		computed: {
+			...mapState(['systemInfo', 'store_id', 'userInfo']),
+		},
+		onShow() {
+
+		},
+		methods:{
+			onPickLeve(e) {
+				this.activeIndex = e;
+			},
+			onBuyOrder(e) {
+				let _this = this;
+				let level = _this.leveList[_this.activeIndex];
+				let par = {
+					level_id: level.id,
+					user_id: _this.userInfo.id,
+					pay_type: 1,
+				}
+				_this.$http.request('theater/addLevelOrder', {
+					...par
+				}, "", "", true).then(res => {
+					if (res.code == '200') {
+						// #ifdef MP-WEIXIN
+						wx.requestPayment({
+							timeStamp: res.data.timeStamp,
+							nonceStr: res.data.nonceStr,
+							package: res.data.package,
+							signType: res.data.signType,
+							paySign: res.data.paySign,
+							success: (res) => { 
+								uni.showToast({
+									title:'您已支付成功',
+									icon:'success',
+									success: (e) => {
+										_this.$emit("onCloseRenew");
+									}
+								}) 
+							},
+							fail: (res) => { 
+								uni.showToast({
+									title:'支付失败',
+									icon:'error',
+									success: (e) => {
+										_this.$emit("onCloseRenew");
+									}
+								})
+							}
+						})
+						// #endif
+					}
+				}).catch(err => {})
+				
+			},
+			
+			onOpenRenew(e){
+				this.$emit('onOpenRenew', this.leveList);
+			},
+			initUserLevel(){
+				let _this=this;
+				_this.$http.request('member/getMemberLevelInfo', {
+					openid:_this.userInfo.openid,
+				}, "", "", true).then(res => {  
+					let js=JSON.parse(res.data.data.levelData); 
+					_this.currentLevel=js;   
+				}).catch(err => {}) 
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	@import './VipForm.scss'
+
+</style>

+ 134 - 0
components/agree/agree.vue

@@ -0,0 +1,134 @@
+<template>
+	<view class="">
+		<view class="model_notice flex-center" v-if="is_text">
+			<view class="model_notice_content">
+				
+				<view class="model_notice_color">
+					<scroll-view scroll-y style="min-height: 500rpx;height: 500rpx;" scroll-y="true">
+						<mp-html :content="nodes" />
+					</scroll-view>
+				</view>
+				<view class="box-pack-between ft32 " style="padding: 38rpx 40rpx;">
+					<navigator class="guanbis flex-center" hover-class="none" target="miniProgram" open-type="exit">
+						拒绝
+					</navigator>
+					<view class="confirm flex-center" @click="bindconfirm">
+						同意并继续
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+	import mpHtml from '@/uni_modules/mp-html/components/mp-html/mp-html'
+	export default {		
+		components: {
+			mpHtml
+		},
+		data() {
+			return {
+				is_text: false,
+				nodes:`<p style=";line-height: 32px;font-size: medium;font-family: Cambria, serif;font-weight: bold;white-space: normal">
+					<span style="font-family: 微软雅黑, sans-serif">&nbsp;</span>
+				</p>
+				<p style=";text-align: center;font-size: medium;font-family: Calibri, sans-serif;white-space: normal">
+					<strong><span style="font-size: 16px;font-family: 宋体">用户协议及隐私协议</span></strong>
+				</p>
+				<p style=";text-align: justify;font-size: medium;font-family: Calibri, sans-serif;white-space: normal">
+					<span style="font-size: 16px;font-family: 宋体"></span>
+				</p>
+				<p style="margin-top:5px;margin-right:0;margin-bottom:5px;margin-left:0;text-indent:0">
+					<span style="color: rgb(77, 77, 77);letter-spacing: 0;font-size: 16px">用户协议及隐私声明</span>
+				</p>
+				<p style="margin-top:5px;margin-right:0;margin-bottom:5px;margin-left:0;text-indent:0">
+					<span style="color: rgb(77, 77, 77);letter-spacing: 0;font-size: 16px">本协议为您与本小程序管理者之间所订立的契约,具有合同的法律效力,请您仔细阅读。</span>
+				</p>
+				<p style="margin-top:5px;margin-right:0;margin-bottom:5px;margin-left:0;text-indent:0">
+					<span style="color: rgb(77, 77, 77);letter-spacing: 0;font-size: 16px"><span style="font-family:sans-serif">一、本协议内容、生效、变更。本协议内容包括协议正文及所有本小程序已经发布的或将来可能发布的各类规则。所有规则为本协议不可分割的组成部分,与协议正文具有同等法律效力。如您对协议有任何疑问,应向本小程序咨询。您在同意所有协议条款并完成注册程序,才能成为本站的正式用户,您勾选</span><span style="font-family:sans-serif">“我以阅读并同意本小程序用户协议和法律协议”按钮后,本协议即生效,对双方产生约束力。只要您使用本小程序平台服务,则本协议即对您产生约束,届时您不应以未阅读本协议的内容或者未获得本小程序对您问询的解答等理由,主张本协议无效,或要求撤销本协议。您确认:本协议条款是处理双方权利义务的契约,始终有效,法律另有强制性规定或双方另有特别约定的,依其规定。 您承诺接受并遵守本协议的约定。如果您不同意本协议的约定,您应立即停止注册程序或停止使用本小程序平台服务。本小程序有权根据需要不定期地制订、修改本协议及/或各类规则,并在本小程序平台公示,不再另行单独通知用户。变更后的协议和规则一经在网站公布,立即生效。如您不同意相关变更,应当立即停止使用本小程序平台服务。您继续使用本小程序平台服务的,即表明您接受修订后的协议和规则。</span></span>
+				</p>
+				<p style="margin-top:5px;margin-right:0;margin-bottom:5px;margin-left:0;text-indent:0">
+					<span style="color: rgb(77, 77, 77);letter-spacing: 0;font-size: 16px"><span style="font-family:sans-serif">二、注册资格用户须具有法定的相应权利能力和行为能力的自然人、法人或其他组织,能够独立承担法律责任。您完成注册程序或其他本小程序平台同意的方式实际使用本平台服务时,即视为您确认自己具备主体资格,能够独立承担法律责任。若因您不具备主体资格,而导致的一切后果,由您及您的监护人自行承担。</span>2.1用户应自行诚信向本站提供注册资料,用户同意其提供的注册资料真实、准确、完整、合法有效,用户注册资料如有变动的,应及时更新其注册资料。如果用户提供的注册资料不合法、不真实、不准确、不详尽的,用户需承担因此引起的相应责任及后果,并且本小程序保留终止用户使用本平台各项服务的权利。2.2用户在本站进行浏览等活动时,涉及用户真实姓名/名称、通信地址、联系电话、电子邮箱等隐私信息的,本站将予以严格保密,除非得到用户的授权或法律另有规定,本站不会向外界披露用户隐私信息。为完成创建账号,用户需提供以下信息:用户的姓名、身份证号、密码、户籍地址、家庭住址、手机号等信息。用户提供的上述信息,将在用户使用本服务期间持续授权我们使用。在用户注销账号时,我们将停止使用并删除上述信息。上述信息将存储于中华人民共和国境内。如需跨境传输,我们将会单独征得用户的授权同意。</span>
+				</p>
+				<p style="margin-top:5px;margin-right:0;margin-bottom:5px;margin-left:0;text-indent:0">
+					<span style="color: rgb(77, 77, 77);letter-spacing: 0;font-size: 16px"><span style="font-family:sans-serif">三、账户</span>3.1您注册成功后,即成为本小程序平台的用户,将持有本小程序平台唯一编号的账户信息,您可以根据本站规定改变您的密码。3.2您设置的姓名为真实姓名,不得侵犯或涉嫌侵犯他人合法权益。否则,本小程序有权终止向您提供服务,注销您的账户。账户注销后,相应的用户名将开放给任意用户注册登记使用。3.3您应谨慎合理的保存、使用您的会员名和密码,应对通过您的会员名和密码实施的行为负责。除非有法律规定或司法裁定,且征得本小程序的同意,否则,会员名和密码不得以任何方式转让、赠与或继承(与账户相关的财产权益除外)。3.4用户不得将在本站注册获得的账户借给他人使用,否则用户应承担由此产生的全部责任,并与实际使用人承担连带责任。3.5如果发现任何非法使用等可能危及您的账户安全的情形时,您应当立即以有效方式通知本小程序要求暂停相关服务,并向公安机关报案。您理解本小程序对您的请求采取行动需要合理时间,本小程序对在采取行动前已经产生的后果(包括但不限于您的任何损失)不承担任何责任。</span>
+				</p>
+				<p style="margin-top:5px;margin-right:0;margin-bottom:5px;margin-left:0;text-indent:0">
+					<span style="color: rgb(77, 77, 77);letter-spacing: 0;font-size: 16px"><span style="font-family:sans-serif">四、用户信息的合理使用</span>4.1您同意本小程序平台拥有通过邮件、短信电话等形式,向在本站注册用户发送信息等告知信息的权利。4.2您了解并同意,本小程序有权应国家司法、行政等主管部门的要求,向其提供您在本小程序平台填写的注册信息和交易记录等必要信息。如您涉嫌侵犯他人知识产权,则本小程序亦有权在初步判断涉嫌侵权行为存在的情况下,向权利人提供您必要的身份信息。4.3用户同意本小程序有权使用用户的注册信息、用户名、密码等信息,登陆进入用户的注册账户,进行证据保全,包括但不限于公证、见证等。</span>
+				</p>
+				<p style="margin: 5px 0px; text-indent: 0px;">
+					<span style="color: rgb(77, 77, 77);letter-spacing: 0;font-size: 16px"><span style="font-family:sans-serif">五、免责条款</span>5.1 本平台仅提供信息对接,发生一切纠纷问题皆与本平台无关,请通过仲裁部门维护各自权益。</span>
+				</p>`,
+		}
+		},
+	   created() {
+		   
+	   	if (!uni.getStorageSync("agree_user")) {
+	   		this.nodes = this.$store.state.systemInfo.set.agreement||this.nodes;
+	   		this.is_text = true;
+	   	}
+		
+	   },
+		
+		methods:{
+			bindconfirm() {
+				this.is_text = false;
+				uni.setStorageSync("agree_user", true)
+			},
+		}
+	}
+</script>
+
+<style>
+	.model_notice {
+		position: fixed;
+		width: 100%;
+		height: 100%;
+		top: 0;
+		left: 0;
+		z-index: 999;
+		background: rgba(0, 0, 0, 0.5);
+	}
+	
+	.model_notice_content {
+		border-radius: 16rpx;
+		background: #fff;
+		font-size: 28rpx;
+		overflow: hidden;
+	}
+	
+	.model_notice_color {
+		width: 650rpx;
+		min-height: 350rpx;
+		padding: 20rpx 40rpx;
+		padding-bottom: 0;
+		overflow: hidden;
+	}
+	
+	.model_notice_title {
+		height: 220rpx;
+		text-align: center;
+	}
+	
+	.model_notice_title image {
+		height: 100%;
+		width: 100%;
+	}
+	
+	.guanbis {
+		width: 200rpx;
+		height: 88rpx;
+		background: #f6f6f6;
+		border-radius: 8rpx;
+		color: #666666;
+	}
+	
+	.confirm {
+		width: 330rpx;
+		height: 88rpx;
+		background: #a4907e;
+		border-radius: 8rpx;
+		
+		color: #FFFFFF;
+	}
+</style>

+ 209 - 0
components/liuyuno-tabs/liuyuno-tabs.vue

@@ -0,0 +1,209 @@
+<template>
+	<view class="tab-box" id="tab-box">
+		<view class="horizontal">
+			<scroll-view :scroll-x="true" style="white-space: nowrap; " scroll-with-animation
+				:scroll-left="slider.scrollLeft">
+				<view v-for="(item, index) in tabList" :key="index" style="display: inline-block;">
+					<block>
+						<view class="flex-grow-1 flex-center">
+							<view class="item" :class="{ active: activeIndex === index }" :id="'tab_'+index"
+								@click="tabClick(index)">{{ item.name || item }}
+							</view>
+						</view>
+					</block>
+				</view>
+				<view class="underline"
+					:style="'transform:translateX(' + slider.left + 'px);width:' + slider.width + 'px'"></view>
+			</scroll-view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'liuyuno-tabs',
+		props: {
+			tabData: {
+				type: Array,
+				default: () => []
+			},
+			defaultIndex: {
+				type: Number,
+				default: 0
+			},
+			underLinePadding: {
+				type: Number,
+				default: 10
+			},
+		},
+		data() {
+			return {
+				tabList: [],
+				tabListSlider: [],
+				box: {
+					left: 0,
+					right: 0,
+					top: 0,
+					width: 0,
+					height: 0,
+					bottom: 0,
+				},
+				slider: {
+					left: 0,
+					width: 0,
+					scrollLeft: 0
+				},
+				activeIndex: 0
+			};
+		},
+
+		watch: {
+			tabData(value) {
+				this.tabList = value;
+				setTimeout(() => {
+					this.updateTabWidth();
+				}, 100);
+			},
+		},
+		mounted() {
+			this.tabList = this.tabData;
+			this.activeIndex = this.defaultIndex;
+			this.$nextTick(() => {
+
+				// #ifdef MP-ALIPAY
+				var query = my.createSelectorQuery()
+				query.select('.tab-box').boundingClientRect().exec((ret) => {
+					// console.log(ret[0], "tab-box")
+					let res=ret[0];	
+					this.box =res;
+					this.updateTabWidth();
+				})
+				// #endif
+
+				// #ifdef MP-WEIXIN
+				var query = uni.createSelectorQuery().in(this);
+				query.select('.tab-box').boundingClientRect((res) => {
+					// console.log(res, "tab-box")
+					this.box = res;
+					this.updateTabWidth();
+				}).exec();
+				// #endif
+
+
+			})
+		},
+
+		methods: {
+
+			tabClick(index) {
+				this.activeIndex = index;
+				this.tabToIndex(index);
+				this.$emit('tabClick', index);
+			},
+
+			tabToIndex(index) {
+				let _slider = this.tabListSlider[index];
+				
+				this.slider = {
+					left: _slider.left + (_slider.width / 2) - (_slider.width / 4),
+					width: (_slider.width) / 2,
+					scrollLeft: _slider.scrollLeft,
+					// left: _slider.left + this.underLinePadding,
+					// width: _slider.width - this.underLinePadding * 2,
+					// scrollLeft: _slider.scrollLeft,
+				}
+
+			},
+
+			updateTabWidth(index = 0) {
+				let data = this.tabList;
+				if (data.length == 0) return false;
+				// console.log(data, "data")
+				// #ifdef MP-ALIPAY
+				var query = my.createSelectorQuery()
+				query.select('#tab_' + index).boundingClientRect().exec((ret) => {
+					// console.log(ret[0], "tab-box")
+					let res=ret[0];
+					let _prev_slider = this.tabListSlider[index - 1];
+					this.tabListSlider[index] = {
+						left: res.left - this.box.left,
+						width: res.width,
+						scrollLeft: res.left - this.box.left - (_prev_slider ? _prev_slider.width : 0),
+					}
+					
+					if (this.activeIndex == index) {
+						this.tabToIndex(this.activeIndex);
+					}
+					index++;
+					if (data.length > index) {
+						this.updateTabWidth(index);
+					}
+				})
+				// #endif
+
+				// #ifdef MP-WEIXIN
+				var query = uni.createSelectorQuery().in(this);
+				query.select('#tab_' + index).boundingClientRect((res) => {
+					let _prev_slider = this.tabListSlider[index - 1];
+					this.tabListSlider[index] = {
+						left: res.left - this.box.left,
+						width: res.width,
+						scrollLeft: res.left - this.box.left - (_prev_slider ? _prev_slider.width : 0),
+					}
+					if (this.activeIndex == index) {
+						this.tabToIndex(this.activeIndex);
+					}
+					index++;
+					if (data.length > index) {
+						this.updateTabWidth(index);
+					}
+				}).exec();
+				// #endif
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.tab-box {
+		width: 100%;
+		color: rgba(0, 0, 0, 0.8);
+		display: flex;
+		height: 100rpx;
+		background: #fff;
+		font-size: 28upx;
+		box-shadow: 0 1px 5px rgba(0, 0, 0, 0.06);
+		position: relative;
+		z-index: 10;
+		overflow: hidden;
+	}
+
+	.horizontal .active {
+		color: #000;
+	}
+
+	.horizontal {
+		width: 100%;
+	}
+
+	.wd33 {
+		width: 33%;
+	}
+
+	.item {
+		display: inline-block;
+		text-align: center;
+		padding: 0 30upx;
+		height: 80rpx;
+		line-height: 90upx;
+		font-size: 32rpx;
+		color: #A0A0A0;
+	}
+
+	.underline {
+		height: 4upx;
+		background-color: #000;
+		border-radius: 3px;
+		transition: .5s;
+	}
+</style>

+ 29 - 0
components/load.vue

@@ -0,0 +1,29 @@
+<template>
+	<view>
+		<view class="is_load_more" v-if="is_load">
+			<image v-if="is_load_more" class="qrcode_close" src="/static/qrcode_close.gif" ></image>
+		    <text v-else class="no-more">----已经到底部了----</text>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		props:{
+			is_load:Boolean,
+			is_load_more:Boolean,
+		}
+	}
+</script>
+
+<style lang="scss">
+	.is_load_more{
+		width: 100%;
+		text-align: center;
+		padding-top:20rpx;
+		.qrcode_close{
+			width: 40rpx;
+			height: 40rpx;
+		}
+	}
+</style>

+ 357 - 0
components/model.vue

@@ -0,0 +1,357 @@
+<template>
+	<view>
+		<view class="js_dialog" :class="is_show?'showCont':''" id="iosDialog2">
+			<view class="weui-mask" @click="hideModal"></view>
+			<view class="weui-dialog">
+				<view class="weui-dialog__hd">
+					<text class="weui-dialog__title">提示</text>
+				</view>
+				<view class="weui-dialog__bd">{{obj.content}}</view>
+				<view class="weui-dialog__ft">
+					<view hover-class="weui-dialog__btn_cl" @click="hideModal"
+						class="weui-dialog__btn weui-dialog__btn_default">
+						{{cancelText}}
+					</view>
+					<button hover-class="weui-dialog__btn_cl" :data-tel="mobile" open-type="getPhoneNumber"
+						@getphonenumber="onGetphoneNumber" class="weui-dialog__btn weui-dialog__btn_primary">
+						{{confirmText}}
+					</button>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+	import {
+		mapState,
+		mapMutations
+	} from 'vuex'
+	export default {
+		props: {
+			obj: {
+				type: Object,
+				default: {
+					content: null,
+					href: null,
+					showCancel: false,
+				}
+			},
+
+			title: {
+				type: String,
+				default: "温馨提示"
+			},
+
+			cancelText: {
+				type: String,
+				default: "取消"
+			},
+
+			confirmText: {
+				type: String,
+				default: "马上完善"
+			},
+		},
+
+		computed: {
+			...mapState(['is_show'])
+		},
+
+		data() {
+			return {
+				is_hide: false,
+			}
+		},
+		
+		methods: {
+			showModal(e) {
+				this.$store.state.is_show = false;
+			},
+			hideModal(e) {
+				this.$store.state.is_show = false;
+			},
+			// 微信成为会员
+			onGetphoneNumber(e) {
+				let userInfo=uni.getStorageSync("userInfo"), 
+				    store_id=uni.getStorageSync("store_id");
+				if (e.detail.errMsg == "getPhoneNumber:ok") {
+					this.$http.request('xcx/Jiemi', {
+						id:userInfo.id,
+						data: e.detail.encryptedData,
+						iv: e.detail.iv,
+						sessionKey: uni.getStorageSync('user_xcx_info').session_key,
+						store_id: store_id,
+					}, "", "", true).then(res => {
+						this.phoneNumber = res.data.phoneNumber;
+						uni.setStorageSync('phone', res.data.phoneNumber);
+						uni.showModal({
+							title: '授权成功',
+							content: '享受更多优惠!',
+							showCancel: false,
+							cancelText: '',
+							confirmText: '确定',
+							success: res => {	
+								let subscribe = uni.getStorageSync('balance_subscribe');
+								this.$store.state.is_show = false;
+								uni.requestSubscribeMessage({
+									tmplIds: [subscribe.member_tid],
+									success: (r) => {
+									},
+									complete: (r) => {
+										this.menber_info();
+									}
+								})
+							},
+							fail: () => {},
+							complete: () => {}
+						});
+					})
+				} else {
+					uni.showToast({
+						title: "授权失败,请重新授权",
+						icon: 'none'
+					})
+				}
+			},
+			// 成为会员,更新用户信息
+			menber_info() {
+				let userInfo = uni.getStorageSync('userInfo');
+				this.$http.request('xcx/userinfo', {
+					id: userInfo.id,
+				}, "", "", true).then(res => {	
+					if (res.code == "200"&&res.data.mobile) {
+						this.$store.commit("SET_USER_INFO",res.data) 
+						// uni.setStorageSync('userInfo', res.data);
+						// uni.switchTab({
+						// 	url:"../pages/my/my"
+						// })
+                        console.log(411111)
+                         this.$emit("success",res.data); 
+					}
+				}).catch((res) => {
+					uni.showToast({
+						title: res.message,
+						icon: 'none'
+					})
+				});
+			},
+			
+		},
+	}
+</script>
+<style>
+	.iosDialog2 {
+		position: fixed;
+		left: 0;
+		top: 0;
+		background-color: rgba(0, 0, 0, 0.5);
+		width: 100%;
+		height: 100%;
+		z-index: 999;
+	}
+
+	.js_dialog {
+		display: none;
+	}
+
+	/*定义样式*/
+	page .showCont {
+		display: block;
+		/* animation: showPopUp 0.5s; */
+		/* animation-fill-mode: forwards; */
+	}
+
+	page .hiddenCont {
+		display: none;
+		/* animation: hiddenPopUp 0.5s; */
+		/* animation-fill-mode: forwards; */
+	}
+
+	/*定义动画*/
+	@keyframes showPopUp {
+		0% {
+			opacity: 0;
+			z-index: 999;
+		}
+
+		100% {
+			opacity: 1;
+			z-index: 999;
+
+		}
+	}
+
+	@keyframes hiddenPopUp {
+		0% {
+			opacity: 0;
+			z-index: 999;
+		}
+
+		100% {
+			opacity: 1;
+			display: none;
+			z-index: 999;
+		}
+	}
+
+	.weui-mask {
+		position: fixed;
+		top: 0;
+		right: 0;
+		left: 0;
+		bottom: 0;
+		background: rgba(0, 0, 0, 0.6);
+		z-index: 999;
+	}
+
+	.weui-dialog {
+		position: fixed;
+		width: 600rpx;
+		margin: 0 auto;
+		top: 50%;
+		left: 16px;
+		right: 16px;
+		-webkit-transform: translate(0, -50%);
+		transform: translate(0, -50%);
+		background-color: #fff;
+		text-align: center;
+		border-radius: 12px;
+		overflow: hidden;
+		display: -webkit-box;
+		display: -webkit-flex;
+		display: flex;
+		-webkit-flex-direction: column;
+		-webkit-box-orient: vertical;
+		-webkit-box-direction: normal;
+		flex-direction: column;
+		max-height: 90%;
+		z-index: 999;
+	}
+
+	.weui-dialog__hd {
+		padding: 64rpx 48rpx 32rpx;
+	}
+
+	.weui-dialog__title {
+		font-weight: 700;
+		font-size: 34rrpx;
+		line-height: 1.4;
+	}
+
+	.weui-dialog__bd:first-child {
+		min-height: 40px;
+		padding: 32px 24px 0;
+		font-weight: 700;
+		color: rgba(0, 0, 0, 0.9);
+		display: -webkit-box;
+		display: -webkit-flex;
+		display: flex;
+		-webkit-flex-direction: column;
+		-webkit-box-orient: vertical;
+		-webkit-box-direction: normal;
+		flex-direction: column;
+		-webkit-box-pack: center;
+		-webkit-justify-content: center;
+		justify-content: center;
+	}
+
+	.weui-dialog__bd {
+		/* overflow-y: auto; */
+		-webkit-overflow-scrolling: touch;
+		padding: 0 24px;
+		margin-bottom: 32px;
+		font-size: 17px;
+		line-height: 1.4;
+		word-wrap: break-word;
+		-webkit-hyphens: auto;
+		hyphens: auto;
+		color: rgba(0, 0, 0, 0.5);
+	}
+
+	.weui-dialog__ft {
+		position: relative;
+		line-height: 56px;
+		min-height: 56px;
+		font-size: 17px;
+		display: -webkit-box;
+		display: -webkit-flex;
+		display: flex;
+	}
+
+	.weui-dialog__btn {
+		display: block;
+		-webkit-box-flex: 1;
+		-webkit-flex: 1;
+		flex: 1;
+		color: #576b95;
+		font-weight: 700;
+		text-decoration: none;
+		-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+		position: relative;
+	}
+
+	.weui-dialog__btn:after {
+		content: " ";
+		position: absolute;
+		left: 0;
+		top: 0;
+		width: 1px;
+		bottom: 0;
+		border-left: 1px solid rgba(0, 0, 0, 0.1);
+		border-left: 1px solid
+			/* var(--weui-DIALOG-LINE-COLOR) */
+		;
+		color: rgba(0, 0, 0, 0.1);
+		/* color: var(--weui-DIALOG-LINE-COLOR); */
+		-webkit-transform-origin: 0 0;
+		transform-origin: 0 0;
+		-webkit-transform: scaleX(0.5);
+		transform: scaleX(0.5);
+	}
+
+	.weui-dialog__ft:after {
+		content: " ";
+		position: absolute;
+		left: 0;
+		top: 0;
+		right: 0;
+		height: 1px;
+		border-top: 1px solid rgba(0, 0, 0, 0.1);
+		color: rgba(0, 0, 0, 0.1);
+		-webkit-transform-origin: 0 0;
+		transform-origin: 0 0;
+		-webkit-transform: scaleY(0.5);
+		transform: scaleY(0.5);
+	}
+
+	.weui-dialog__btn_default {
+		color: rgba(0, 0, 0, 0.9);
+	}
+
+	.weui-dialog__btn_cl {
+		background: #F1F1F1;
+	}
+
+	/* 去除button默认样式 */
+
+	.weui-dialog__ft button::after {
+		border: none;
+
+	}
+
+	.weui-dialog__ft button {
+		background-color: transparent;
+
+		padding-left: 0;
+
+		padding-right: 0;
+
+		line-height: inherit;
+
+	}
+
+   .weui-dialog__ft button {
+		border-radius: 0;
+
+	}
+</style>

+ 19 - 0
components/no-none.vue

@@ -0,0 +1,19 @@
+<template>
+	<view class="content empty flex-center">
+		<image class="" src="/static/no-more.png" mode="widthFix"></image>
+		<!-- <view class="col">暂无信息</view> -->
+	</view>
+</template>
+<script>
+</script>
+
+<style>
+	.empty{
+		flex-direction: column;
+	}
+	.empty image {
+		width:300px;
+		height:180rpx;
+		margin: 100rpx 0 30rpx 0;
+	}
+</style>

+ 167 - 0
components/page-btm-bar/page-btm-bar.vue

@@ -0,0 +1,167 @@
+<template>
+	<view>
+		<view class="tab-bar">
+			<view class="item"  :style="[active == 2?{color: '#a07c5a'}:'']" 
+			:class="active == 2?'active':''" 
+			@click="navTo(2,'/pages/theater/index/index')">
+				<image src="/static/images/huodong.png" class="menu-icon"/>
+				<text class="title"  :style="[active == 2?{color: '#a07c5a'}:'']">活 动</text>
+			</view>
+			<view class="item"  :style="[active == 1?{color: '#a07c5a'}:'']" 
+				:class="active == 1?'active':''" 
+			      @click="navTo(1,'/pages/home/home')">
+				  <image src="/static/images/changdi.png" class="menu-icon"/> 
+				<text class="title" :style="[active == 1?{color: '#a07c5a'}:'']">场 地</text>
+			</view>
+			
+			<view class="item"  :style="[active == 3?{color: '#a07c5a'}:'']" 
+			:class="active == 3?'active':''"
+			 @click="onOpenHw">
+				<image src="/static/images/2ndhome.png" class="menu-icon" style="width: 64px;height: 64px">
+				
+			</view>
+			
+			<view class="item" :style="[active == 4?{color: '#a07c5a'}:'']" 
+			:class="active == 4?'active':''"
+			 @click="navTo(4,'/pages/index/index?store_id=3')">
+				<image src="/static/images/gongyi.png" class="menu-icon"/>
+				<text class="title" :style="[active ==4?{color: '#a07c5a'}:'']">商 城</text>
+			</view>
+			<view class="item" :style="[active == 5?{color: '#a07c5a'}:'']"
+			:class="active == 5?'active':''"
+			 @click="navTo(5,'/pages/home/myhome')">
+				<image src="/static/images/wode.png" class="menu-icon" />
+				<text class="title" :style="[active ==5?{color: '#a07c5a'}:'']">我 的</text>
+			</view>
+		</view>
+		<!-- 号外号外 -->
+		<uni-popup ref="hwPopForm" type="center" style="z-index: 60;">
+			 <SoundForm :dataList="movieList"></SoundForm>
+		</uni-popup>
+	</view>
+
+</template>
+<script>
+		import SoundForm from '@/components/SoundForm/SoundForm.vue'
+	export default {
+		props: {
+			active: {
+				type: Number,
+				default: 1
+			}
+		},
+		components: {
+			
+			
+			SoundForm
+		},
+		
+		data() {
+			return {
+				// diy:2
+				// active:1
+			};
+		},
+		
+		computed: {
+			
+			diy() {
+				
+				return this.$store.state.systemInfo.is_vip;
+			},
+			
+			setColor() {
+		
+				return this.$store.state.setColor;
+			}
+			
+		},
+		watch:{
+			active(val){
+				console.log(val);
+				this.active=val
+			}
+		},
+		
+		methods: {
+
+			navTo(index, url) {	
+				console.log(index);
+				if (index != this.active) {
+					uni.switchTab({
+						url: url
+					})
+					
+				}
+				
+			},
+			//打开收音机
+			onOpenHw(e){ 
+				this.$refs.hwPopForm.open('center');
+			},
+			
+		}
+	}
+</script>
+
+<style scoped>
+	.tab-bar {
+		background-color: #fff;
+		width: 100vw;
+		
+		/*兼容 IOS<11.2*/
+		padding-bottom: constant(safe-area-inset-bottom);
+		/*兼容 IOS>11.2*/
+		padding-bottom: env(safe-area-inset-bottom);
+		
+		display: flex;
+		flex-flow: row nowrap;
+		justify-tab-bar: space-around;
+		align-items: center;
+		border-top: 1px solid #f0f0f0;
+		position: fixed;
+		left: 0;
+		bottom: 0;
+		z-index: 900;
+
+	}
+
+	.tab-bar .item {
+		flex: auto;
+		display: flex;
+		flex-flow: column nowrap;
+		justify-content: center;
+		align-items: center;
+		color: #8a8a8a;
+		height: 120rpx;
+	}
+	
+	.menu-icon{
+		width:24px;
+		height:24px;
+	}
+
+	.tab-bar .iconfont {
+		display: block;
+		font-size: 48rpx;
+		/* color: #8a8a8a; */
+	}
+
+	.tab-bar .active .iconfont {
+		/* color: #3387FF; */
+	}
+
+	.tab-bar .title {
+		font-size: 28rpx;
+		height: 36rpx;
+		line-height: 48rpx;
+		text-align: center;
+		/* color: #8a8a8a; */
+	}
+
+	.tab-bar .active .title {
+		/* color: #3387FF; */
+		color: #8a8a8a;
+		font-weight: bold;
+	}
+</style>

+ 123 - 0
components/page-top-bar/page-top-bar.vue

@@ -0,0 +1,123 @@
+<template>
+	<view>
+		<view class="top-bar" >
+			<view class="row">
+				
+				<view class="column column1" @click="navTo(1,'/pages/home/home')"><image src="../../static/images/backhome.png" style="width: 24px; height: 24px;"></image></view>
+				  <view class="column column2"><input class="input-box" type="text" placeholder="搜索内容" style="width: 100%;"/></view>
+				  <view class="column column3"><image src="../../static/images/fangdajing.png" style="width: 21px; height: 21px;"></image></view>
+				  <view class="column column4" ></view>
+				</view>
+				
+		</view>
+		
+		
+	</view>
+</template>
+<script>
+
+	export default {
+		props: {
+			active: {
+				type: Number,
+				default: 1
+			}
+		},
+		
+
+		
+		data() {
+			return {
+				// diy:2
+			};
+		},
+		
+		computed: {
+			
+			diy() {
+				
+				return this.$store.state.systemInfo.is_vip;
+			},
+			
+			setColor() {
+		
+				return this.$store.state.setColor;
+			}
+			
+		},
+		
+		methods: {
+
+			navTo(index, url) {
+	
+				if (index != this.active) {
+					
+					uni.switchTab({
+						url: url
+					})
+				}
+			},
+			onViewBind(e){
+				uni.navigateTo({
+					url:'/pages/user-detail/user-detail'
+				})
+			},
+			
+			
+		}
+	}
+</script>
+
+<style scoped>
+	.top-bar {
+		/* background-color: #745A42; */
+		background-color: #593320;
+		width: 100vw;
+		
+		/*兼容 IOS<11.2*/
+		padding-bottom: constant(safe-area-inset-bottom);
+		/*兼容 IOS>11.2*/
+		padding-bottom: env(safe-area-inset-bottom);
+		height: 120px;
+		display: flex;
+		flex-flow: row nowrap;
+		justify-tab-bar: space-around;
+		align-items: center;
+		padding-top: 30px;
+		
+		position: fixed;
+		left: 0;
+		top: 0;
+		z-index: 900;
+
+	}
+	.row {
+		padding-top: 40px;
+	    display: flex;
+		justify-content: space-between;
+		width: 100%;
+	  }
+	  .column {
+	    padding: 10px 0px 0px 0px;
+	
+	    text-align: left; /* 文本居中 */
+		width: 100%;
+	  }
+	  .column1 { width: 24%; padding-left: 30px; }
+	  .column2 { width: 48%;padding-left:20px }
+	  .column3 { width: 20px; padding-left:10px; padding-top: 12px;}
+	  .column4 { width: 20%;margin-right: 30px; }
+
+ .input-box {
+     border: 1px solid #CCC; /* 白色边框 */
+     border-radius: 10px; /* 边框弧形角度 */
+     padding: 0px 5px; /* 内边距 */
+	 height: 24px;
+	 color: #FFF;
+	
+   }
+    .input-box::placeholder {
+       color: #FFF; /* 占位符文字颜色 */
+       
+     }
+</style>

+ 400 - 0
components/shoppingCar.vue

@@ -0,0 +1,400 @@
+<template>
+	<view class="container">
+		<view :class="navBtn?'footer-block-act':'footer-block'">
+			<view v-if="!is_business" class="content-gice-is_business flex-center">
+				店铺不在营业时间
+			</view>
+			<view v-else class="content-gice flex flex-y-center"  >
+				<view class="car-block flex flex-x-center flex-y-center" @click="showCarGoods">
+					
+					<uni-icons type="cart" size="20"></uni-icons>
+ 
+					<view class="car-num" v-if="carNum>0">{{carNum}}</view>
+				</view>
+				<view class="money-block" v-if="carNum>0">
+					<view class="flex-y-center">
+						<view class="txt">预计到手:</view>
+						<view class="sign">¥</view>
+						<view class="money">{{carTotal}}</view>
+					</view>
+					<view class="ft22" v-if="teen_index==2" style="color: #F1F1F1">
+						另需配送费¥{{deliveryPrice}}
+					</view>
+				</view>
+				<view class="no-goods" v-if="carNum == 0">
+					购物车空空如也呢!
+				</view>
+				<view v-if="isDistance==2&&teen_index==2" class="sub-btn flex-center"
+					style="background:#999;width:300rpx;">
+					<view>
+						超出配送范围
+					</view>
+				</view>
+				<view v-if="isDistance==3&&teen_index==2" class="sub-btn flex-center"
+					style="background:#999;width:300rpx;">
+					<view @click="getWechatAddress">
+						请选择地址
+					</view>
+				</view>
+				<view v-else class="sub-btn flex-center">
+					<view style="width: 100%;height: 100%;">
+						<view class="sub-btn-font flex-center" style="background:#999;width:300rpx;"
+							v-if="teen_index==2&&Number(carTotal)<Number(systemInfo.set.delivery_price)">
+							¥{{systemInfo.set.delivery_price}}起送
+						</view>
+						<view v-else class="sub-btn-settlement flex-center" @click="onCreatOrder">
+							去结算
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+		<view class="footer-mask" v-if="carGoodsPop" @click="showCarGoods"></view>
+		<view :class="navBtn?'car-goods-block1':'car-goods-block'" class="car-goods-block" v-if="carGoodsPop">
+			<view class="top flex flex-x-between flex-y-center">
+				<view class="title">已选商品</view>
+				<view class="clear-btn flex flex-nowarp flex-y-center" @click="clearCar">
+					<image src="../static/icon_3.png" mode="aspectFit" class="icon-3"></image>
+					<view class="btn-text">清空购物车</view>
+				</view>
+			</view>
+			<scroll-view scroll-y class="car-goods-list">
+				<view class="list">
+					<block>
+						<view v-for="(goods,idx) in carGoods" :key="idx">
+							<view class="flex-y-center radio" @click="chooseBag(goods.pocket)">
+								<view class="radio__inner"
+									:style="is_checked == goods.pocket?('border: 1rpx solid' + getColorItem):''">
+									<view :style="is_checked== goods.pocket?('background:'+ getColorItem):''"
+										class="radio__inner-icon radio__inner-icon is-default-checked">
+									</view>
+								</view>
+								装入口袋{{goods.pocket}}
+								<block v-if="teen_index==2 && goods.packing_fee">(包装费 <text
+										style="color: red;">¥{{goods.packing_fee}}</text> )</block>
+							</view>
+							<view class="item flex flex-y-center flex-nowarp" v-for="(item,index) in goods.list"
+								:key="index" v-if="item.num>0">
+								<image :src="getImgSrc(item.spec_image)" mode="aspectFill" class="img"></image>
+								<view class="goods-info">
+									<view class="name">{{item.name}}</view>
+									<view class="unit">{{item.spec}}</view>
+									<view class="price flex-y-bottom">
+										<block v-if="item.is_rebate==1">
+											<view>¥{{item.first_price}}</view>
+											<view class="textDecoration">¥{{item.price}}</view>
+										</block>
+										<block v-else>
+											<view>¥{{item.price}}</view>
+										</block>
+									</view>
+								</view>
+								<view class="goods-num-block " :style="{color:getColorItem}">
+									<view class="flex flex-x-between flex-y-center">
+										<view class="num-btn num-btn-1 iconfont icon-jian1"
+											@click="changeNum(item.category_id,item.goods_id,1,'car',index,'',item.many_rebate,item.is_rebate,goods.pocket)">
+										</view>
+										<view class="num">{{item.num}}</view>
+										<view class="num-btn num-btn-2 iconfont icon-jia1"
+											@click="changeNum(item.category_id,item.goods_id,2,'car',index,'',item.many_rebate,item.is_rebate,goods.pocket)">
+										</view>
+									</view>
+									<view class="ft24 many_rebate" v-if="item.many_rebate>0 && item.is_rebate==1">
+										{{item.many_rebate}}{{item.unit}}起购
+									</view>
+								</view>
+							</view>
+						</view>
+
+						<view class="flex-y-center radio" style="padding-bottom: 10rpx;"
+							@click="chooseBag(carGoods[carGoods.length-1].pocket+1)">
+							<view class="radio__inner"
+								:style="is_checked==(carGoods[carGoods.length-1].pocket+1)?('border: 1rpx solid' + getColorItem):''">
+								<view
+									:style="is_checked==(carGoods[carGoods.length-1].pocket+1)?('background:'+ getColorItem):''"
+									class="radio__inner-icon radio__inner-icon is-default-checked">
+								</view>
+							</view>
+							装入口袋{{carGoods[carGoods.length-1].pocket+1}} <text class="radio_tip">选用后,加购商品将自动放入该口袋</text>
+						</view>
+					</block>
+					<!-- 
+					<block v-else>
+						<view class="item flex flex-y-center flex-nowarp" v-for="(item,index) in carGoods" :key="index"
+							v-if="item.num>0">
+							<image :src="getImgSrc(item.spec_image)" mode="aspectFill" class="img"></image>
+							<view class="goods-info">
+								<view class="name">{{item.name}}</view>
+								<view class="unit">{{item.spec}}</view>
+								<view class="price flex-y-bottom">
+									<block v-if="item.is_rebate==1">
+										<view>¥{{item.first_price}}</view>
+										<view class="textDecoration">¥{{item.price}}</view>
+									</block>
+									<block v-else>
+										<view>¥{{item.price}}</view>
+									</block>
+								</view>
+							</view>
+							<view class="goods-num-block " :style="{color:getColorItem}">
+								<view class="flex flex-x-between flex-y-center">
+									<view class="num-btn num-btn-1 iconfont icon-jian1"
+										@click="changeNum(item.category_id,item.goods_id,1,'car',index,'',item.many_rebate,item.is_rebate)">
+									</view>
+									<view class="num">{{item.num}}</view>
+									<view class="num-btn num-btn-2 iconfont icon-jia1"
+										@click="changeNum(item.category_id,item.goods_id,2,'car',index,'',item.many_rebate,item.is_rebate)">
+									</view>
+								</view>
+								<view class="ft24 many_rebate" v-if="item.many_rebate>0 && item.is_rebate==1">
+									{{item.many_rebate}}{{item.unit}}起购
+								</view>
+							</view>
+						</view>
+					</block> -->
+
+				</view>
+			</scroll-view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		mapState,
+		mapGetters,
+		mapMutations
+	} from 'vuex'
+	export default {
+		props: {
+
+			carNum: {
+				type: Number,
+				default: 0,
+			},
+
+			isDistance: {
+				type: Number,
+				default: 1,
+			},
+
+			carGoods: {
+				type: Array,
+				default: function() {
+					return []
+				}
+			},
+
+			carTotal: {
+				type: [Number, String],
+				default: 0
+			},
+
+			deliveryPrice: {
+				type: [Number, String],
+				default: '0.00'
+			},
+
+			userInfo: {
+				type: Object,
+				default: function() {
+					return {}
+				}
+			},
+			navBtn: {
+				type: Boolean,
+				default: false,
+			},
+
+			//选择就餐人数
+			eat_people: {
+				type: [Number, String],
+				default: 0
+			},
+			checked: {
+				type: [Number, String],
+				default: 0
+			}
+		},
+
+		data() {
+			return {
+				// store_id: '',
+				table_id: '',
+				carGoodsPop: false,
+				distance: 1,
+				is_checked: 1
+			};
+		},
+
+		mounted() {
+			// this.store_id = uni.getStorageSync('store_id')
+			this.table_id = uni.getStorageSync('table_id')
+			// this.systemInfo = uni.getStorageSync('systemInfo')
+			// console.log(this.systemInfo.set,"this.systemInfo")
+		},
+
+		computed: {
+			...mapState(['teen_index', 'store_id', 'is_business']),
+			getColorItem() {
+				return this.$store.state.setColor
+			},
+			systemInfo() {
+				if (this.$store.state.systemInfo) {
+					return this.$store.state.systemInfo
+				}
+			}
+		},
+
+		watch: {
+			carNum: function(newNum, oldNum) {
+				if (newNum == 0) {
+					this.carGoodsPop = false
+				}
+			},
+			checked: {
+				handler(newName, oldName) {
+					console.log(newName, "is_checked")
+					this.is_checked = newName
+				},
+				// 开启深度监听
+				deep: true
+			}
+		},
+
+		methods: {
+
+			chooseBag(index) {
+				this.is_checked = index;
+				this.$emit("choosebag", index)
+			},
+
+			// 选择外卖地址
+			getWechatAddress: function(e) {
+				uni.navigateTo({
+					url: '/pages/address/address?teen_index=1'
+				})
+			},
+			//去创建订单
+			onCreatOrder() {
+				// 示例
+				// #ifdef MP-ALIPAY
+				my.getAuthCode({
+					// 订单服务授权:order_service。如需同时获取用户多项授权,可在 scopes 中传入多个 scope 值。
+					scopes: ['order_service'],
+					success: (res) => {
+						console.log(res, "res")
+						// 订单服务授权成功
+						this.fastTake();
+					},
+					fail: (res) => {
+						// 订单服务授权失败,根据自己的业务场景来进行错误处理
+						this.fastTake();
+					},
+				});
+				// #endif
+				// #ifdef MP-WEIXIN
+				this.fastTake();
+				// #endif
+				
+				// #ifdef H5
+				//仅供测试使用
+				this.fastTake();
+				// #endif
+			},
+
+			fastTake() {
+				// console.log("jiesuan")
+				if (this.carNum == 0) {
+					uni.showToast({
+						title: '请先选择商品',
+						icon: 'none'
+					})
+					return false
+				}
+				//获取购物车数据
+				this.$http.request('xcx/fastTake', {
+					store_id: this.store_id,
+					user_id: uni.getStorageSync('user_id'),
+					state: Number(this.teen_index),
+				}, "", "", true).then(res => {
+					this.$store.commit('SET_CREAT', false)
+					//重置购物车
+					uni.navigateTo({
+						// url: `/pages/creatOrder/creatOrder?teen_index=${this.teen_index}`
+						//新增点餐人数
+						url: '/pages/creatOrder/creatOrder?teen_index=' + this.teen_index +
+							'&eat_people=' + this.eat_people
+					})
+				}).catch(err => {
+					console.log(err)
+				})
+			},
+
+
+			//拼接图片全路径
+			getImgSrc(src) {
+				return this.$utils.getImgSrc(src)
+			},
+
+			//显示购物车列表
+			showCarGoods() {
+				if (this.carGoods.length == 0) {
+					return
+				}
+				this.carGoodsPop = !this.carGoodsPop
+			},
+			/**
+			 * 改变商品数量
+			 * @category_id:分类id
+			 * @goods_id:商品id
+			 * @type:1减少 2增加
+			 * @data_from 购物车列表传 'car' 规格弹窗传 'spec' 无规格传 'goods' 否则不传
+			 * @car_index 购物车下标 data_form = 'car'传
+			 * @goods_price 商品价格 data_from = 'goods' 传
+			 * */
+			changeNum(category_id, goods_id, type, data_from, car_index, goods_price, many_rebate = '', is_rebate = '',
+				pocket = '') {
+				console.log(this.carGoods, goods_price, many_rebate, is_rebate, pocket)
+				this.$parent.changeNum(category_id, goods_id, type, data_from, car_index, goods_price, many_rebate,
+					is_rebate, pocket);
+			},
+
+			//清空购物车
+			clearCar() {
+				uni.showModal({
+					content: "确定清空购物车",
+					success: (r) => {
+						if (r.confirm) {
+							var url, data;
+							if (this.$store.state.systemInfo.is_qian_many == 1 && getApp().globalData
+								.readyReset == 1) {
+								url = 'xcx/delete_carta';
+								data = {
+									user_id: this.userInfo.id,
+									table_id: this.systemInfo.table_id,
+								}
+							} else {
+								url = 'xcx/delete_cart';
+								data = {
+									user_id: this.userInfo.id,
+								}
+							}
+							this.$http.request(url, data).then(res => {
+								this.carGoodsPop = false
+								this.$parent.clearCar()
+							}).catch(err => {
+								console.log(err)
+							})
+						}
+					}
+				})
+
+			},
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+@import './shoppingCart.scss'
+</style>

+ 376 - 0
components/shoppingCart.scss

@@ -0,0 +1,376 @@
+.container {
+		box-sizing: inherit;
+	}
+
+	/* 底部购物车 *************************************************************/
+	.footer-block {
+		width: 90vw;
+		height: 30px; 
+		position: fixed;
+		left:20px; 
+		bottom: 150rpx;
+		bottom: calc(150rpx + constant(safe-area-inset-bottom));
+		bottom: calc(150rpx + env(safe-area-inset-bottom));
+		z-index: 199;
+		overflow: inherit;
+		border-radius: 10px;
+	}
+
+	.footer-block-act {
+		width: 100vw;
+		height: 100rpx;
+		// height: calc(100rpx + constant(safe-area-inset-bottom));
+		// height: calc(100rpx + env(safe-area-inset-bottom));
+		position: fixed;
+		left: 0;
+		// bottom: 0;
+		bottom: 0rpx;
+		bottom: constant(safe-area-inset-bottom);
+		bottom: env(safe-area-inset-bottom);
+		z-index: 199;
+		overflow: inherit;
+	}
+
+
+	.content-gice {
+		height:100%; 
+		background-color: #fff5ea;
+		box-sizing: inherit;
+	}
+
+	.content-gice cover-view {
+		background: none;
+	}
+
+	.car-block {
+		width: 100rpx;
+		height: 100rpx;
+		padding-left: 30rpx;
+		padding-right: 20rpx;
+		flex: none;
+		position: relative;
+		background: none;
+		font-size: 12px;
+	}
+
+	.car-block .icon-2 {
+		flex: none;
+		width: 20px;
+		height: 20px;
+		display: block;
+	}
+
+	.car-block .car-num { 
+		height: 15px;
+		min-width: 15px;
+		background-color: #ff6565;
+		border-radius: 50%;
+		font-size: 12px;
+		font-weight: 500; 
+		color: #fff;
+		line-height: 40rpx;
+		position: absolute;
+		right: 10rpx;
+		top: 25rpx; 
+		display:flex;
+		justify-content: center;
+		align-items: center;
+	}
+
+	.money-block {
+		padding: 0 20rpx;
+		color: #333;
+		font-weight: 500;
+		align-items: baseline;
+		background: none;
+		font-size:12px;
+	}
+
+	.money-block .sign {
+		font-size: 9px;
+	}
+
+	.money-block .money {
+		font-size: 14px;
+	}
+
+	.no-goods {
+		color: #333;
+		font-weight: 500;
+		font-size: 12px;
+		padding: 0 20rpx;
+		background: none;
+	}
+
+	.sub-btn {
+		// flex: none;
+		width: 250rpx;
+		height: 100rpx;
+		margin-left: auto;
+		text-align: center;
+		// line-height: 100rpx;
+		border-left: 1rpx solid #fff;
+		font-size:14px;
+		font-weight: 500;
+		color: #fff;
+		background: #a4907e;
+		z-index: 999;
+	}
+
+	.sub-btn-font {
+		font-size: 26rpx;
+		width: 100%;
+		height: 100%;
+	}
+
+	.sub-btn-settlement {
+		font-size: 30rpx;
+		width: 100%;
+		height: 100%;
+	}
+
+	.footer-mask {
+		width: 100vw;
+		height: 100vh;
+		background: rgba(0, 0, 0, 0.7);
+		position: fixed;
+		left: 0;
+		top: 0;
+		z-index: 110;
+	}
+
+	.container .car-goods-block1 {
+		bottom: calc(150rpx + constant(safe-area-inset-bottom));
+		bottom: calc(150rpx + env(safe-area-inset-bottom));
+	}
+
+	.car-goods-block {
+		width: 100vw;
+		max-height: 500rpx;
+		background: #fff;
+		position: fixed;
+		left: 0;
+		bottom: 120px;
+		bottom: calc(120px + constant(safe-area-inset-bottom));
+		bottom: calc(120px + env(safe-area-inset-bottom));
+		z-index: 110;
+		box-sizing: border-box;
+	}
+
+	.car-goods-block .top {
+		box-sizing: border-box;
+		height: 80rpx;
+		border-bottom: 1rpx solid #efefef;
+		padding: 0 30rpx;
+	}
+
+	.car-goods-block .top .title {
+		font-size: 32rpx;
+		font-weight: bold;
+	}
+
+	.car-goods-block .top .clear-btn {
+		font-size: 26rpx;
+		color: #bbb;
+	}
+
+	.car-goods-block .top .icon-3 {
+		display: block;
+		width: 40rpx;
+		height: 40rpx;
+	}
+
+	.car-goods-block .car-goods-list {
+		max-height: 420rpx;
+
+		box-sizing: border-box;
+	}
+
+	.car-goods-block .car-goods-list .list {
+		padding: 0 30rpx;
+	}
+
+	.car-goods-block .car-goods-list .item {
+		padding: 20rpx 0;
+		border-bottom: 1rpx solid #efefef;
+	}
+
+	.car-goods-block .car-goods-list .item .img {
+		display: block;
+		flex: none;
+		width: 140rpx;
+		height: 140rpx;
+		border-radius: 15rpx;
+	}
+
+	.car-goods-block .car-goods-list .item .goods-info {
+		padding: 0 20rpx;
+		flex: auto;
+	}
+
+	.car-goods-block .car-goods-list .item .goods-info .name {
+		font-size: 32rpx;
+		color: #555;
+		word-break: break-all;
+	}
+
+	.car-goods-block .car-goods-list .item .goods-info .unit {
+		font-size: 26rpx;
+		color: #666;
+		margin: 10rpx 0;
+		word-break: break-all;
+	}
+
+	.car-goods-block .car-goods-list .item .goods-info .price {
+		font-size: 30rpx;
+		font-weight: 500;
+		color: #ff6565;
+	}
+
+	.car-goods-block .car-goods-list .item .goods-num-block {
+		flex: none;
+		margin-top: auto;
+		margin-bottom: 15rpx;
+	}
+
+	.car-goods-block .car-goods-list .item .goods-num-block .num-btn {
+		flex: none;
+		width: 42rpx;
+		height: 42rpx;
+		// border: 1rpx solid $theme-color;
+		border-radius: 50%;
+		position: relative;
+		font-size: 42rpx;
+	}
+
+	// .car-goods-block .car-goods-list .item .goods-num-block .num-btn::before {
+	// 	display: block;
+	// 	content: "";
+	// 	width: 28rpx;
+	// 	height: 6rpx;
+	// 	border-radius: 3rpx;
+	// 	background-color: $theme-color;
+	// 	position: absolute;
+	// 	left: 50%;
+	// 	top: 50%;
+	// 	margin: -3rpx 0 0 -14rpx;
+	// }
+
+	// .car-goods-block .car-goods-list .item .goods-num-block .num-btn-2 {
+	// 	background: $theme-color;
+	// }
+
+	// .car-goods-block .car-goods-list .item .goods-num-block .num-btn-2::before,
+	// .car-goods-block .car-goods-list .item .goods-num-block .num-btn-2::after {
+	// 	display: block;
+	// 	content: "";
+	// 	width: 28rpx;
+	// 	height: 6rpx;
+	// 	border-radius: 3rpx;
+	// 	background-color: #fff;
+	// 	position: absolute;
+	// 	left: 50%;
+	// 	top: 50%;
+	// 	margin: -3rpx 0 0 -14rpx;
+	// }
+
+	.car-goods-block .car-goods-list .item .goods-num-block .num-btn-2::after {
+		transform: rotate(90deg);
+	}
+
+	.car-goods-block .car-goods-list .item .goods-num-block .num {
+		flex: none;
+		min-width: 60rpx;
+		text-align: center;
+		font-size: 26rpx;
+		font-weight: 500;
+		color: #555;
+	}
+
+	.content-gice-is_business {
+		background-color: #ccc;
+		color: #fff;
+		text-align: center;
+		width: 100%;
+		height: 100%;
+	}
+
+	.many_rebate {
+		color: red;
+		text-align: right;
+	}
+
+	.textDecoration {
+		text-decoration: line-through;
+		color: #999999;
+		font-size: 20rpx;
+	}
+
+	.radio {
+		font-size: 28rpx;
+		padding: 15rpx 0 10rpx 0;
+	}
+
+	.radio__inner {
+		-webkit-flex-shrink: 0;
+		flex-shrink: 0;
+
+		display: -webkit-box;
+		display: -webkit-flex;
+		display: flex;
+
+		-webkit-box-pack: center;
+		-webkit-justify-content: center;
+		justify-content: center;
+		-webkit-box-align: center;
+		-webkit-align-items: center;
+		align-items: center;
+		position: relative;
+		border: 1px solid #DCDFE6;
+		border-radius: 2px;
+		box-sizing: border-box;
+		width: 16px;
+		height: 16px;
+		border-radius: 16px;
+		background-color: #fff;
+		z-index: 1;
+		-webkit-transition: border-color .3s;
+		transition: border-color .3s;
+		margin-right: 6rpx;
+	}
+
+	.radio__inner-icon {
+		width: 8px;
+		height: 8px;
+		border-radius: 10px;
+		opacity: 0;
+		-webkit-transition: -webkit-transform .3s;
+		transition: -webkit-transform .3s;
+		transition: transform .3s;
+		transition: transform .3s, -webkit-transform .3s;
+	}
+
+	.is-default-checked {
+		opacity: 1;
+		-webkit-transform: rotate(45deg) scaleY(1);
+		transform: rotate(45deg) scaleY(1);
+	}
+
+	.checklist-text {
+		font-size: 28rpx;
+		margin-left: 5px;
+		-webkit-transition: color 0.2s;
+		transition: color 0.2s;
+		color: #000;
+	}
+
+	.act_border {
+		border: 1rpx solid #007aff;
+	}
+
+	.radio_tip {
+		font-size: 24rpx;
+		color: #999;
+		margin-left: 4rpx;
+
+	}

+ 193 - 0
components/v-phone/v-button.vue

@@ -0,0 +1,193 @@
+<template>
+	<view class="">
+		<uni-popup ref="popup" type="center" @maskClick="maskClick" :mask-click="false" :is-mask-click='false'>
+			  <view class="get-menber-pop"> 
+		      	<view class="title">
+		      		<view class="flex flex-y-center flex-x-center">温馨提示</view>
+		      	</view>
+				<view class="content">
+					<view class="flex flex-y-center flex-x-center">完善资料享有更多优惠,是否完善</view>
+				</view>
+		      	<view class="btm-block flex-y-center">
+		      		<button class="btn flex-grow-1 flex-center" @click="hideGetPhone">继续下单</button>
+					<view class="line"></view>
+					<!-- #ifdef MP-WEIXIN -->
+					<button class="btn flex-grow-1 flex-center" open-type="getPhoneNumber"
+					@getphonenumber="onGetphoneNumber" :style="{color:setColor}">马上完善</button>
+					<!-- #endif -->
+					<!-- #ifdef MP-ALIPAY -->
+					<button  @click="onGetphone"
+					class="btn flex-grow-1 flex-center" :style="{color:setColor}">马上完善</button>
+					<!-- #endif -->
+		      	</view>
+		      </view>
+		</uni-popup>
+		<Vphone :getPhonePop="getPhonePop" @close="setClose"></Vphone>
+	</view>
+</template>
+<script>
+	import {
+		mapState,
+		mapMutations
+	} from 'vuex'
+	let hideLoading = true;
+	import Vphone from '@/components/v-phone/v-phone.vue';
+	export default {
+		props: {
+			getMenberPop: {
+				type: Boolean,
+				default: false
+			},
+		},
+		watch: {
+			getMenberPop: {
+				handler(newVal) {
+					console.log(newVal)
+					if (newVal) {
+						this.$refs.popup.open();
+					}
+				},
+			}
+		},
+		data() {
+			return {
+				getPhonePop: false
+			}
+		},
+		components: {
+			Vphone
+		},
+		computed: {
+			...mapState(['systemInfo', 'setColor', 'store_id', 'userInfo', 'teen_index', 'address'])
+		},
+		methods: {
+			maskClick(){
+				this.$emit('maskClick',false) 
+			},
+			hideGetPhone(){
+			    this.$emit('modelGetClose',false)
+				this.$refs.popup.close();
+			},
+			onGetphoneNumber(e) {
+				 let pages = getCurrentPages();
+				 let { route, options } = pages[pages.length-1];
+				// #ifdef MP-WEIXIN
+				if (e.detail.errMsg == "getPhoneNumber:ok") {
+					this.$http.request('xcx/Jiemi', {
+						id: this.userInfo.id,
+						data: e.detail.encryptedData,
+						iv: e.detail.iv,
+						sessionKey: uni.getStorageSync('user_xcx_info').session_key,
+						store_id: this.store_id,
+					}, "", "", hideLoading).then(res => {
+						this.phoneNumber = res.data.phoneNumber;
+						uni.setStorageSync('phone', res.data.phoneNumber);
+						uni.showToast({
+							title: '授权成功',
+							icon: 'none'
+						})
+						setTimeout(()=>{
+							this.$http.request('xcx/userinfo', {
+								id: this.userInfo.id,
+							}, "", "", hideLoading).then(res => {
+								if (res.code == "200") {
+									this.$store.commit('SET_USER_INFO',res.data)
+									if (route =="pages/creatOrder/creatOrder") {
+											uni.redirectTo({
+												url: `/pages/creatOrder/creatOrder?teen_index=${options.teen_index}&eat_people=${options.eat_people}`
+											})
+									}
+								}
+							}).catch((res) => {
+								uni.showToast({
+									title: res.message,
+									icon: 'none'
+								})
+							});
+						},1500)
+					})
+				} else {
+					uni.showToast({
+						title: "授权失败,请重新授权",
+						icon: 'none'
+					})
+				}
+				// #endif
+			},
+			
+			// 子组件传参
+			setClose(e) {
+				this.getPhonePop = e;
+	 		},
+			
+	        // 开启会员弹窗
+			onGetphone(e) {
+				if (this.userInfo.mobile) {
+					uni.showToast({
+						title: "您已经完善过会员信息了,无需重复操作!",
+						icon: 'none'
+					})
+					return
+				}
+				this.getPhonePop = true;
+			},
+		},
+	}
+</script>
+
+<style scoped lang="scss">
+	.get-menber-pop{
+		background: #FFFFFF;
+		font-size: 30rpx;
+		width: 560rpx;
+		border-radius: 8rpx;
+		box-shadow: 0 1px 2px #ccc;
+		.title{
+		   text-align: center;
+		   font-size: 28rpx;
+		   padding: 30rpx 0;
+		}
+		.content{
+			padding-bottom: 55rpx;
+			padding-top: 29rpx;
+		}
+		.btm-block{
+			font-size: 28rpx;
+			height: 90rpx;
+			border-top: 1rpx solid #f1f1f1;
+			.line{
+				width: 1rpx;
+				height: 100%;
+				background: #F1F1F1;
+			}
+			.btn{
+				font-size: 30rpx;
+				width: 50%;    
+				color: #999;
+			}
+		    button::after {
+				border: none;
+			}
+			button {
+				background: none !important;
+				height: auto !important;
+				border: none !important;
+				border-radius: 0 !important;
+				font-family: inherit !important;
+				// color: inherit !important;
+				text-align: inherit;
+			}
+		}
+	}
+	
+	.sub-btn {
+		// width: 200rpx;
+		// height: 100rpx;
+		// background-color: $theme-color;
+		// color: #fff;
+		// font-weight: bold;
+		// line-height: 100rpx;
+		// text-align: center;
+		// font-size: 32rpx;
+	}
+</style>

+ 286 - 0
components/v-phone/v-phone.vue

@@ -0,0 +1,286 @@
+<template>
+	<view>
+		<uni-popup ref="popup" type="center" @change="maskClick">
+			<view class="get-phone-pop">
+				<view class="content-block">
+					<view class="content flex flex-y-center flex-x-center">完善资料享有更多优惠,是否完善</view>
+				</view>
+				<form @submit="getbang">
+					<view class="flex-y-center content-tel">
+						<text style="min-width: 130rpx;">手机号码</text>
+						<view class="flex-y-center content-tel-bor">
+							<input type="number" maxlength="11" @input="getphone" name='tel'
+								placeholder-class="content-tel-bor-input" placeholder="请输入手机号码" />
+						</view>
+					</view>
+					<view class="flex-y-center content-tel">
+						<view class="flex-y-center content-tel-bor" style="border: none;">
+							<input type="number" placeholder-class="content-tel-bor-input" name='code'
+								placeholder="请输入验证码" />
+							<view class="code-btn" @click="getCode" :style="{'background-color':setColor}">
+								{{codeConfig.type == 1?'获取验证码':'重试('+codeConfig.time+'s)'}}
+							</view>
+						</view>
+					</view>
+					<view class="btm-block flex flex-nowarp flex-x-between">
+						<button class="btn" @click="showGetPhone">取消</button>
+						<button form-type="submit" class="btn sub-btn" :style="{color:setColor}">马上完善</button>
+					</view>
+				</form>
+			</view>
+		</uni-popup>
+	</view>
+</template>
+<script>
+	// #ifdef MP-ALIPAY
+	// const {
+	// 	requestSubscribeMessage
+	// } = requirePlugin('subscribeMsg');
+	// #endif
+	export default {
+		props: {
+			getPhonePop: {
+				type: Boolean,
+				default: false
+			},
+		},
+		watch: {
+			getPhonePop: {
+				handler(newVal) {
+					console.log(newVal,"newVal")
+					if (newVal) {
+						this.$refs.popup.open();
+					}
+				},
+			}
+		},
+
+		data() {
+			return {
+				phone: null,
+				codeConfig: {
+					type: 1,
+					time: 60
+				}
+			}
+		},
+
+		methods: {
+
+			maskClick(e) {
+				if (!e.show) {
+					this.$emit('close', false);
+				}
+			},
+
+			getphone(e) {
+				this.phone = e.detail.value;
+			},
+			
+			showGetPhone() {
+				this.$refs.popup.close();
+			},
+
+			// 获取验证码
+			getCode() {
+				if (this.codeConfig.type != 1) {
+					return
+				}
+				if (!/^1[0-9]{10}/.test(this.phone)) {
+					uni.showToast({
+						title: "请正确输入手机号",
+						icon: 'none'
+					})
+					return false
+				}
+				this.$http.request('xcx/sendcode', {
+					tel: this.phone,
+					store_id:this.$store.state.store_id,
+				}, "", "", true).then(res => {
+					if (res.code == "200") {
+						this.codeConfig.type = 2
+						this._timer = setInterval(() => {
+							if (this.codeConfig.time == 1) {
+								this.codeConfig = {
+									type: 1,
+									time: 30
+								}
+								clearInterval(this._timer)
+							}
+							this.codeConfig.time--
+						}, 1000)
+					}
+				}).catch((res) => {
+					uni.showToast({
+						title: res.message,
+						icon: 'none'
+					})
+				});
+			},
+
+			// 支付宝成为会员
+			getbang(e) {
+				let subscribe = uni.getStorageSync('balance_subscribe');
+				let data = {},
+					url;
+				if (!/^1[0-9]{10}/.test(e.detail.value.tel)) {
+					uni.showToast({
+						title: "请正确输入手机号",
+						icon: 'none'
+					})
+					return false
+				}
+				if (!e.detail.value.code) {
+					uni.showToast({
+						title: "请输入验证码",
+						icon: 'none'
+					})
+					return false
+				}
+				data.tel = e.detail.value.tel;
+				data.store_id = this.$store.state.store_id,
+				data.id = this.$store.state.userInfo.id,
+				data.code = e.detail.value.code;
+				// console.log(this.$store.state.store_id, this.$store.state.userInfo.id, this.$store.state.systemInfo
+					// .alipay_appid)
+				this.$http.request('xcx/alipaytel', data, "", "", true).then(res => {
+					if (res.code == "200") {
+						this.phoneNumber = res.data.phoneNumber;
+						uni.setStorageSync('phone', res.data.phoneNumber);
+						uni.showModal({
+							title: '恭喜完成!',
+							content: '享受更多优惠!',
+							showCancel: false,
+							cancelText: '',
+							confirmText: '确定',
+							success: res => {
+								this.$refs.popup.close();
+								let that = this;
+								// 调用方法,唤起订阅组件
+								my.requestSubscribeMessage({
+									thirdTypeAppId: this.$store.state.systemInfo
+									.alipay_appid, // 可选,isv接入场景下必填
+									entityIds: [subscribe.alipay_user], // 模板id列表,最多3个
+									// 接收结果的回调方法
+									complete:(r)=> {
+										console.log('订阅回调', r);
+									},
+								});
+								that.menber_info();
+							},
+							fail: () => {},
+							complete: () => {}
+						});
+					}
+				}).catch((res) => {
+					uni.showToast({
+						title: res.message,
+						icon: 'none'
+					})
+				});
+			},
+
+			menber_info() {
+				let userInfo = this.$store.state.userInfo;
+				 let pages = getCurrentPages();
+				 let { route, options } = pages[pages.length-1];
+				this.$http.request('xcx/userinfo', {
+					id: userInfo.id,
+				}, "", "", true).then(res => {
+					if (res.code == "200") {
+						this.$store.commit('SET_USER_INFO', res.data)
+						if (route =="pages/creatOrder/creatOrder") {
+								uni.redirectTo({
+									url: `/pages/creatOrder/creatOrder?teen_index=${options.teen_index}&eat_people=${options.eat_people}`
+								})
+						}
+					}
+				}).catch((res) => {
+					uni.showToast({
+						title: res.message,
+						icon: 'none'
+					})
+				});
+			},
+			
+		}
+	}
+</script>
+
+<style>
+	/* 成为会员 */
+	.get-phone-pop {
+		width: 660rpx;
+		background-color: #fff;
+		border-radius: 14rpx;
+		overflow: hidden;
+	}
+
+	.code-btn {
+		flex: none;
+		width: 170rpx;
+		height: 60rpx;
+		border-radius: 30rpx;
+		background-color: #3387FF;
+		text-align: center;
+		line-height: 60rpx;
+		color: #fff;
+		font-size: 24rpx;
+	}
+
+	.get-phone-pop .content {
+		// height: 180rpx;
+		text-align: center;
+		font-size: 35rpx;
+		color: #000;
+		// line-height: 60rpx;
+		padding: 30rpx 0;
+	}
+
+	.get-phone-pop .btm-block {
+		width: 100%;
+		height: 115rpx;
+		border-top: 1rpx solid #eef0ef;
+	}
+
+	.get-phone-pop .btm-block .btn {
+		flex: none;
+		width: 50%;
+		height: 115rpx;
+		box-sizing: border-box;
+		text-align: center;
+		line-height: 115rpx;
+		color: #010101;
+		font-weight: bold;
+		padding: 0;
+		margin: 0;
+		border: none;
+		border-radius: 0;
+		background-color: #fff;
+		font-size: 35rpx;
+	}
+
+	.get-phone-pop .btm-block .btn::after {
+		padding: 0;
+		border: none;
+		border-radius: 0;
+	}
+
+	.get-phone-pop .btm-block .sub-btn {
+		color: #626c90;
+		border-left: 1px solid #eef0fe;
+	}
+
+	.content-tel {
+		padding: 20rpx 40rpx;
+	}
+
+	.content-tel-bor {
+		border-bottom: 1rpx solid #F1F1F1;
+		margin-left: 10rpx;
+	}
+
+	.content-tel-bor-input {
+		font-size: 26rpx;
+	}
+</style>

+ 212 - 0
components/wm-poster/wm-poster.vue

@@ -0,0 +1,212 @@
+<template>
+	<view>
+		<canvas :canvas-id="CanvasID" :style="{ width: canvasW + 'px', height: canvasH + 'px' }"></canvas>
+	</view>
+</template>
+
+<script>
+	var _this;
+export default {
+	name: 'wm-poster',
+	props: {
+		CanvasID:{		//CanvasID 等同于 canvas-id
+			Type:String,
+			default:'PosterCanvas'
+		},
+		imgSrc:{		//展示图
+			Type:String,
+			default:''
+		},
+		QrSrc:{			//二维码
+			Type:String,
+			default:''
+		},
+		Title:{			//文本内容
+			Type:String,
+			default:''
+		},
+		TitleColor:{	//标题颜色
+			Type:String,
+			default:'#333333'
+		},
+		LineType:{		//标题显示行数		(注超出2行显示会导致画布布局絮乱)
+			Type:[String,Boolean],
+			default:true
+		},
+		PriceTxt:{		//价格值
+			Type:String,
+			default:''
+		},
+		PriceColor:{	//价格颜色
+			Type:String,
+			default:'#e31d1a'
+		},
+		OriginalTxt:{	//原价值
+			Type:String,
+			default:''
+		},
+		OriginalColor:{	//默认颜色(如原价与扫描二维码颜色)
+			Type:String,
+			default:'#b8b8b8'
+		},
+		Width:{			//画布宽度  (高度根据图片比例计算 单位upx)
+			Type:String,
+			default:1500
+		},
+		CanvasBg:{		//canvas画布背景色
+			Type:String,		
+			default:'#ffffff'
+		},
+		Referrer:{		//推荐人信息
+			Type:String,
+			default:''
+		},
+		ViewDetails:{	//描述提示文字
+			Type:String,
+			default:'长按或扫描识别二维码'
+		}
+	},
+	data() {
+		return {
+			canvasW:0,
+			canvasH: 0,
+			canvasImgSrc:'',
+			ctx:null
+		};
+	},
+	methods: {
+		async OnCanvas() {
+			_this.ctx = uni.createCanvasContext(_this.CanvasID,this);
+			const C_W = uni.upx2px(_this.Width), //canvas宽度
+				C_P = uni.upx2px(60), //canvas Paddng 间距
+				C_Q = uni.upx2px(300); //二维码或太阳码宽高
+			let _strlineW = 0; //文本宽度
+			let _imgInfo = await _this.getImageInfo({ imgSrc: _this.imgSrc }); //广告图
+			let _QrCode = await _this.getImageInfo({ imgSrc: _this.QrSrc }); //二维码或太阳码
+			let r = [_imgInfo.width, _imgInfo.height];
+			let q = [_QrCode.width, _QrCode.height];
+			let imgW = C_W - C_P * 2;
+			if (r[0] != imgW) {
+				r[1] = Math.floor((imgW / r[0]) * r[1]);
+				r[0] = imgW;
+			}
+			if (q[0] != C_Q) {
+				q[1] = Math.floor((C_Q / q[0]) * q[1]);
+				q[0] = C_Q;
+			}
+			_this.canvasW = C_W;
+			_this.canvasH = r[1] + q[1] + 256;
+			_this.ctx.setFillStyle(_this.CanvasBg); //canvas背景颜色
+			_this.ctx.fillRect(0, 0, C_W, _this.canvasH); //canvas画布大小
+			
+			//添加图片展示
+			_this.ctx.drawImage(_imgInfo.path, C_P, C_P, r[0], r[1]);
+			//添加图片展示 end
+
+			//设置文本
+			_this.ctx.setFontSize(uni.upx2px(56)); //设置标题字体大小
+			_this.ctx.setFillStyle(_this.TitleColor); //设置标题文本颜色
+			let _strLastIndex = 0; //每次开始截取的字符串的索引
+			let _strHeight = r[1] + C_P * 2 + 20; //绘制字体距离canvas顶部的初始高度
+			let _num=1;
+			for (let i = 0; i < _this.Title.length; i++) {
+				_strlineW += _this.ctx.measureText(_this.Title[i]).width;
+				if (_strlineW > r[0]) {
+					if(_num == 2&&_this.LineType){
+						//文字换行数量大于二进行省略号处理
+						_this.ctx.fillText(_this.Title.substring(_strLastIndex, i-8)+'...', C_P, _strHeight);
+						_strlineW = 0;
+						_strLastIndex = i;
+						_num++;
+						break;
+					}else{
+						_this.ctx.fillText(_this.Title.substring(_strLastIndex, i), C_P, _strHeight);
+						_strlineW = 0;
+						_strHeight += 40;
+						_strLastIndex = i;
+						_num++;
+					}
+				}else if (i == _this.Title.length - 1) {
+					_this.ctx.fillText(_this.Title.substring(_strLastIndex, i + 1), C_P, _strHeight);
+					_strlineW = 0;
+				}
+			}
+			//设置文本 end
+
+			//设置价格
+			_strlineW = C_P;
+			_strHeight += uni.upx2px(120);
+			if(_num==1){
+				_strHeight += 40;	//单行标题时占位符
+			}
+			
+			if(_this.PriceTxt !=''){	//判断是否有销售价格
+				_this.ctx.setFillStyle(_this.PriceColor);
+				_this.ctx.setFontSize(uni.upx2px(76));
+				_this.ctx.fillText(_this.PriceTxt, _strlineW, _strHeight); //商品价格
+				_strlineW += _this.ctx.measureText(_this.PriceTxt).width + uni.upx2px(20);
+			}
+			if(_this.PriceTxt !='' && _this.OriginalTxt !=''){	//判断是否有销售价格且原价
+				_this.ctx.setFillStyle(_this.OriginalColor);
+				_this.ctx.setFontSize(uni.upx2px(48));
+				_this.ctx.fillText(_this.OriginalTxt, _strlineW, _strHeight); //商品原价
+			}
+			_this.ctx.strokeStyle = _this.OriginalColor;
+			_this.ctx.moveTo(_strlineW, _strHeight - uni.upx2px(20)); //起点
+			_this.ctx.lineTo(_strlineW + _this.ctx.measureText(_this.OriginalTxt).width, _strHeight - uni.upx2px(20)); //终点
+			_this.ctx.stroke();
+			//设置价格 end
+
+			//添加二维码
+			_strHeight += uni.upx2px(40);
+			_this.ctx.drawImage(_QrCode.path, r[0] - q[0] + C_P, _strHeight, q[0], q[1]);
+			//添加二维码 end
+
+			//添加推荐人与描述
+			_this.ctx.setFillStyle(_this.TitleColor);
+			_this.ctx.setFontSize(uni.upx2px(60));
+			_this.ctx.fillText(_this.Referrer, C_P, _strHeight + q[1] / 2);
+			_this.ctx.setFillStyle(_this.OriginalColor);
+			_this.ctx.setFontSize(uni.upx2px(48));
+			_this.ctx.fillText(_this.ViewDetails, C_P, _strHeight + q[1] / 2 + 40);
+			//添加推荐人与描述 end
+			
+			//延迟后渲染至canvas上
+			setTimeout(function() {
+				_this.ctx.draw(true,(ret)=>{
+					_this.getNewImage();
+				});
+			}, 600);
+		},
+		async getImageInfo({ imgSrc }) {
+			return new Promise((resolve, errs) => {
+				uni.getImageInfo({
+					src: imgSrc,
+					success: function(image) {
+						resolve(image);
+					},
+					fail(err) {
+						errs(err);
+					}
+				});
+			});
+		},
+		getNewImage(){
+			uni.canvasToTempFilePath({
+				canvasId: _this.CanvasID,
+				quality: 1,
+				complete: (res) => {
+					console.log(res.tempFilePath);
+					_this.$emit('success',res);
+				}
+			},this);
+		}
+		
+	},
+	mounted() {
+		_this = this;
+	}
+};
+</script>
+
+<style></style>

+ 46 - 0
components/zx-top/zx-top.vue

@@ -0,0 +1,46 @@
+<template>
+	<view class="content">
+		<image src='../../static/top.png' class='goTop' v-if='status' @click="goTop"></image>
+	</view>
+</template>
+<script>
+	export default {
+		data() {
+			return {
+				floorstatus: false
+			}
+		},
+		props: {
+			status: Boolean,
+		},
+		methods: {
+			//回到顶部
+			goTop: function(e) { // 一键回到顶部
+				if (uni.pageScrollTo) {
+					uni.pageScrollTo({
+						scrollTop: 0
+					})
+				} else {
+					uni.showModal({
+						title: '提示',
+						content: '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。'
+					})
+				}
+			},
+		}
+	}
+</script>
+
+<style>
+	/* 返回顶部 */
+	.goTop {
+		height: 80rpx;
+		width: 80rpx;
+		position: fixed;
+		bottom: 20%;
+		background: rgba(0, 0, 0, .3);
+		right: 30rpx;
+		border-radius: 50%;
+		z-index: 999;
+	}
+</style>

+ 137 - 0
diy/Module.vue

@@ -0,0 +1,137 @@
+<template>
+	<view id="module" class="xcx-module-container">
+		<div class="header-title" v-for="(item,index) in obj.controlList"  v-if="item.title.s" :key="index">
+		    <conTitle v-if="item.type==1 && item.check " :title="item" :name="obj.name"  :prev="true"/>
+		</div>
+		<div :style="'height:'+height+'px'" v-if="obj.controlList[0].title.s"></div>
+		<view class="section-module" v-for="(element, index) in obj.moduleList" :key="index">
+			<view class="xcx-module-item" :class="selectIndex === index ? 'on' : ''">
+			
+				<template v-if="!prev">
+					<span class="xline"></span>
+					<span class="xline"></span>
+					<span class="xline"></span>
+					<span class="xline"></span>
+				</template>
+				
+				<moduleNav :module="element" v-if="element.type == 1" />
+				<moduleDuo :module="element" v-if="element.type == 2" />
+				<modlueTuwen :module="element" v-if="element.type == 3" />
+				<modlueGoods :module="element" v-if="element.type == 4"/>
+				<modlueTuijian :module="element" v-if="element.type == 5" />
+				<modlueMsGoods :module="element" v-if="element.type == 6"/>
+				<modluePtGoods :module="element" v-if="element.type == 7"/>
+				<modlueYyGoods :module="element" v-if="element.type == 8"/>
+		
+				<!-- #ifdef MP-WEIXIN -->
+				<modlueAd :module="element" v-if="element.type == 9"/>
+				<!-- #endif -->
+				
+				<template v-if="element.type == 10">
+					<modlueStore v-if="element.base.s==0" :module="element" />
+					<!-- #ifdef MP-ALIPAY -->
+					<template v-if="element.base.s==1">
+					   <slot name='getCoupon'></slot>
+					 </template>
+					<template v-if="element.base.s==2">
+					   <mkt v-if="canIUse" mode="AUTOMATIC" boothCode="MERCHANT_SELF_TINYAPP" :cityCode="cityCode" version="2"  class='mkt'/>
+					</template>			
+					 <!-- #endif -->
+				</template>
+				
+			</view>
+		</view>
+		<view style="height: 100rpx;"></view>
+	</view>
+</template>
+<script>
+	import moduleNav from './module/nav.vue';
+	import moduleDuo from './module/duo.vue';
+	import modlueTuwen from './module/tuwen.vue';
+	import modlueGoods from './module/goods.vue';
+	import modlueTuijian from './module/tuijian.vue';
+	import conTitle from './module/contitle.vue';
+	import modlueMsGoods from './module/ms_goods.vue';
+	import modluePtGoods from './module/pt_goods.vue';
+	import modlueYyGoods from './module/yy_goods.vue';
+	import modlueAd from './module/ad.vue';
+	import modlueStore from './module/store.vue';
+	import {
+		mapState,
+		mapGetters,
+		mapMutations
+	} from 'vuex'
+	
+	export default {
+		name: 'module',
+		props: {
+			obj:{
+			  type: Object,
+			  default: () => []	
+			},
+			'prev': {
+				default: false
+			},
+			cityCode:{
+				type:[Number,String],
+				default:0
+			}
+		},
+		created() {
+			var _this = this;
+			uni.getSystemInfo({
+				success: function(e) {
+					// #ifdef MP-WEIXIN
+					var custom = uni.getMenuButtonBoundingClientRect();
+					_this.height = custom.bottom + custom.top - e.statusBarHeight;
+					// #endif
+					// #ifdef MP-ALIPAY
+					var custom = e.titleBarHeight;
+					_this.height = custom+e.statusBarHeight;
+					// #endif
+				}
+			})
+		},
+		
+		components: {
+			moduleNav,
+			moduleDuo,
+			modlueTuwen,
+			modlueGoods,
+			modlueTuijian,
+			conTitle,modlueMsGoods,modluePtGoods,modlueYyGoods,
+			modlueAd
+			,modlueStore
+			
+		},
+		data() {
+			return {
+				// #ifdef MP-ALIPAY
+				canIUse: my.canIUse('mkt'),
+				// #endif
+				placeholder: false,
+				selectIndex: '', //选中
+				activeIndex: '', //当前活动active
+				height: 60,
+			};
+		},
+		activated() {
+			// console.log(this.moduleList)
+		},
+		computed: {
+			...mapState(['systemInfo', 'setColor', 'store_id', 'userInfo', 'teen_index', 'address'])
+		},
+		onLoad() {
+
+		},
+	};
+</script>
+<style>
+.header-title{
+	position: fixed;
+	top: 0;
+	left: 0;
+	width: 100%;
+	z-index: 999;
+}
+</style>

+ 236 - 0
diy/audio.vue

@@ -0,0 +1,236 @@
+<template>
+	<view>
+		<view class="box-1" id="list-box">
+			<view class="list-box-hader flex-center">
+				<!-- 语音公告 -->
+				<image src="https://zxzhdc.zx-xcx.com/dining/musicNote.png" mode="widthFix"></image>
+			</view> 
+			<view class="talk-list">
+				<scroll-view scroll-y="true" :scroll-top="scrollTop" style="max-height: 520rpx;min-height: 200rpx;">
+					<view v-for="(item,index) in talkList" :key="index" :id="`msg-${item.id}`">
+						<view class="item flex-y-center" :class=" item.type == 1 ? 'push':'pull' ">
+							<image :src="item.pic" mode="aspectFill" class="pic"></image>
+							<view class="content" @click="play" :data-index='index' :data-play='item.is_check'>
+								<image v-if="item.is_check==1" src="/static/home/yuyin1.png" class="play"></image>
+								<image v-if="item.is_check==2" src="https://zxzhdc.zx-xcx.com/dining/play.gif" class="play"></image>
+							</view>
+						</view> 
+					</view>
+				</scroll-view>
+			</view>
+		</view>
+		<view class="close">
+			<gbClose @bindClose="bindClose"/>
+		</view>
+	</view>
+</template>
+<script>
+	import gbClose from './close.vue';
+	import {
+		mapState,
+	} from 'vuex'
+	const innerAudioContext = uni.createInnerAudioContext();
+	export default {
+		components: {
+			gbClose,
+		},
+		computed: {
+			...mapState(['systemInfo', 'store_id', 'userInfo', 'audioList', 'setColor']),
+		},
+		data() {
+			return {
+				talkList: [],
+				// 	content: "https://empdouyinv.zx-xcx.com/uploads/admin/admin_thumb/20210414/fd1a9acc5559a9acd78b61e865505933.mp3"
+				// 	content: "https://empdouyinv.zx-xcx.com//uploads/admin/admin_thumb/20210414/a7fdd9ecaf0d9c1123f776a0cd61f1d7.mp3"
+				// 	content: "https://empdouyinv.zx-xcx.com/uploads/admin/admin_thumb/20210419/8ffa29ef0ade32ad1fa9f6ff5670ecf5.mp3"
+				// 	content: "https://empdouyinv.zx-xcx.com/uploads/admin/admin_thumb/20210419/2da36448ea5a2c12aeabfad70e9ac7d8.mp3"
+				Aindex: 0,
+				url: '',
+				scrollTop: 0,
+				is_off: 1
+			}
+		},
+		watch: {
+			// #ifdef MP-WEIXIN 
+			audioList: {
+				handler(val) {
+					if (val.length > 0) {
+						this.talkList = val;
+						if (this.is_off == 1) {
+							this.is_off = 2;
+							innerAudioContext.src = this.talkList[0].content;
+							innerAudioContext.autoplay = true;
+							this.talkList[0].is_check = 2;
+						}
+					}
+				},
+				deep: true,
+			},
+			// #endif
+		},
+
+		mounted() {
+			// #ifdef MP-ALIPAY
+			let val = this.$store.state.audioList;
+			if (val.length > 0) {
+				this.talkList = val;
+				if (this.is_off == 1) {
+					this.is_off = 2;
+					innerAudioContext.autoplay = true;
+					innerAudioContext.src = this.talkList[0].content;
+					this.talkList[0].is_check = 2;
+				}
+			}
+			// #endif
+		},
+
+		created(e) {
+
+			innerAudioContext.onPlay(() => {
+				console.log('开始播放');
+			});
+
+			innerAudioContext.onError((res) => {
+				console.log('错误事件',res);
+			});
+
+			innerAudioContext.onEnded(() => {
+				// console.log('自然结束');
+				this.talkList.forEach((i, v) => {
+					i.is_check = 1
+				})
+				let Aindex = this.Aindex + 1;
+				if (Aindex >= this.talkList.length) {
+					return
+				}
+				this.talkList[Aindex].is_check = 2;
+				this.scrollTop = Aindex * 60;
+				this.url = this.talkList[Aindex].content;
+				innerAudioContext.src = this.talkList[Aindex].content;
+				this.Aindex = Aindex;
+			});
+
+			innerAudioContext.onStop(() => {
+				// console.log('停止播放');
+			});
+
+			innerAudioContext.onCanplay((res) => {
+			});
+
+			innerAudioContext.onPause(() => {
+				// console.log('暂停播放');
+			});
+		},
+
+		methods: {
+			// ...mapMutations(['SET_AUDIO']),
+			bindClose() {
+				// console.log("停止")
+				innerAudioContext.stop();
+			},
+
+			play(e) {
+				let isplay = e.currentTarget.dataset.play,
+					index = e.currentTarget.dataset.index;
+				this.talkList.forEach((i, v) => {
+					i.is_check = 1
+				})
+				// 2 正在播放,1没有播放
+				if (isplay == 2) {
+					innerAudioContext.pause();
+					this.talkList[index].is_check = 1;
+				} else {
+					innerAudioContext.src = this.talkList[index].content;
+					innerAudioContext.play();
+					this.talkList[index].is_check = 2;
+				}
+				this.Aindex = index;
+			},
+
+		}
+	}
+</script>
+
+<style lang="scss">
+	page {
+		background-color: #F3F3F3;
+		font-size: 28rpx;
+	}
+
+	.play {
+		width: 50rpx;
+		height: 50rpx;
+	}
+
+	.close {
+		/* #ifdef MP-WEIXIN */
+		margin-top: 30rpx;
+		/* #endif */
+		
+	}
+
+	.box-1 {
+		background-color: #F3F3F3;
+		width: 600rpx;
+		overflow: hidden;
+		border-radius: 10rpx;
+	}
+
+	.list-box-hader {
+		width: 100%;
+		color: #FFFFFF;
+	}
+	
+	.list-box-hader image{
+	    width: 100%;
+		height:100rpx;
+	}
+	
+	.talk-list {
+		/* 消息项,基础类 */
+		.item {
+			padding: 20rpx 20rpx 0 20rpx;
+			align-items: flex-start;
+			align-content: flex-start;
+			color: #333;
+			margin-bottom: 20rpx;
+
+			.pic {
+				width: 92rpx;
+				height: 92rpx;
+				border-radius: 50%;
+				border: #fff solid 1px;
+			}
+
+			.content {
+				padding: 20rpx;
+				border-radius: 4px;
+				max-width: 500rpx;
+				word-break: break-all;
+				position: relative;
+				width: 300rpx;
+			}
+
+			/* 收到的消息 */
+			&.pull {
+				.content {
+					margin-left: 32rpx;
+					background-color: #6E8FFF;
+
+					&::after {
+						content: '';
+						display: block;
+						width: 0;
+						height: 0;
+						border-top: 16rpx solid transparent;
+						border-bottom: 16rpx solid transparent;
+						border-right: 20rpx solid #6E8FFF;
+						position: absolute;
+						top: 30rpx;
+						left: -18rpx;
+					}
+				}
+			}
+		}
+	}
+</style>

+ 31 - 0
diy/close.vue

@@ -0,0 +1,31 @@
+<template>
+		<view class="icon" @click="close">
+			<view class="iconfont icon-guanbi2" style="font-size: 25px;"></view>
+		</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				 
+			}
+		},
+		methods:{
+			close(){
+				this.bus.$emit('send', 2);
+				this.$emit("bindClose")
+			},
+		}
+	}
+</script>
+
+<style>
+	.icon {
+		text-align: center;
+		color: #F1F1F1;
+	}
+	.icon-guanbi2 {
+		font-size: 55rpx;
+	}
+</style>

+ 286 - 0
diy/coupon.vue

@@ -0,0 +1,286 @@
+<template>
+	<view class="">
+		<view class="coupon_bg">
+			<image class="coupon_bg_title" src="https://zxzhdc.zx-xcx.com/dining/model-title.png"></image>
+			<view class="coupon_bg_content">
+				<scroll-view scroll-y="true" style="max-height: 300rpx;">
+					<view>
+						<view class="coupon flex" v-for="(item,index) of couponList" :key='index'>
+							<view class="coupon-left flex-y-center">
+								<view class="w100">
+									<view class="title text-1">
+										{{item.name}}
+									</view>
+									<view v-if="item.type==1" class="title text-1"
+										style="font-size: 26rpx;color: #EB8E55;">
+										满¥{{Number(item.full)}}元减¥<text
+											style="color: red;font-size:30rpx;">{{ Number(item.reduce) }} </text>元
+									</view>
+									<view v-if="item.type==3" class="date text-1">
+										<text style="color: red;font-size: 28rpx;">{{ item.gift }}</text>
+									</view>
+									<view class="date text-1">
+										有效期: {{item.start_time}}~{{item.end_time}}
+									</view>
+								</view>
+							</view>
+							<view class="coupon-center">
+								<view class="rund top">
+								</view>
+								<view class="line">
+								</view>
+								<view class="rund bottom">
+								</view>
+							</view>
+							<view class="coupon-right flex-center flex-grow-1">
+								<view class="ft28 getCoupon" v-if="item.state == 1" @tap="receive" :data-id='item.id'
+									:data-index="index">
+									<view class="">
+										立即
+									</view>
+									<view class="">
+										领取
+									</view>
+								</view>
+								<block v-if="item.state == 2">
+									<view class="flex-x-center flex-y-center info-btn fs-sm" style="color:#999;">已领取
+									</view>
+								</block>
+							</view>
+						</view>
+					</view>
+				</scroll-view>
+				
+				<view class="coupon_bg_content_pr flex-y-bottom flex-x-center">
+					<image class="img2" src="../static/home/model-bg-btn.png"></image>
+					<view class="img3" @click="Getall">
+						<image class="" src="/static/home/model-btn.png"></image>
+						<view class="img3-pr flex-center">一键领取</view>
+					</view>
+				</view>
+				
+			</view>
+		</view>
+		<gbClose/>
+	</view>
+</template>
+<script>
+	import gbClose from './close.vue';
+	import {
+		mapState,
+	} from 'vuex'
+	export default {
+		components: {
+			gbClose
+		},
+		data() {
+			return {
+				couponLists: [],
+			}
+		},
+		computed: {
+			...mapState(['systemInfo', 'store_id', 'userInfo', 'couponList']),
+		},
+
+		watch: {
+			couponList: {
+				handler(val) {
+					console.log(val, "val")
+					if (val.length > 0) {
+						this.couponLists = val;
+					}
+				},
+				deep: true,
+			},
+		},
+
+		mounted() {
+			if (this.couponList.length > 0) {
+				this.couponLists = this.couponList;
+			}
+		},
+		
+		methods: {
+			receive: function(t) {
+				let subscribe = uni.getStorageSync('balance_subscribe');
+				console.log(t)
+				var that = this,
+					id = t.currentTarget.dataset.id,
+					index = t.currentTarget.dataset.index;
+					
+					that.$http.request('xcx/LqCoupons', {
+						user_id: this.userInfo.id,
+						store_id: this.store_id,
+						coupon_id: id,
+					}, "", "", true).then(res => {
+						that.couponList[index].state = 2;
+						let couponLength = that.couponList.filter((v, i) => v.state == 2);
+						if(couponLength.length == that.couponList.length){
+							console.log( "领取关闭");
+							that.bus.$emit('send', 2);
+						}
+						uni.showToast({
+							title: '领取成功',
+							icon: 'none'
+						})
+					})
+				
+				
+			},
+			
+			
+			Getall(e){
+				var that = this
+				that.$http.request('xcx/yijianLqCoupons', {
+					user_id: this.userInfo.id,
+					store_id: this.store_id,
+				}, "", "", true).then(res => {
+					that.couponList.forEach((v)=>{
+						v.state=2
+					})
+					that.bus.$emit('send', 2);
+					uni.showToast({
+						title: '领取成功',
+						icon: 'none'
+					})
+				})
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	.coupon_bg {
+		width: 100%;
+		text-align: center;
+		border-radius: 0px 0px 16px 16px;
+	}
+
+	.coupon_bg_title {
+		width: 688rpx;
+		height: 404rpx;
+		display: block;
+		margin-bottom: -2px;
+	}
+
+	.coupon_bg_content {
+		width: 600rpx;
+		// height: 460rpx;
+		background: #f41018;
+		margin: 0 auto;
+		border-bottom-left-radius: 10px;
+		border-bottom-right-radius: 10px;
+	}
+
+	.coupon_bg_content .img1 {
+		width: 528rpx;
+		height: 160rpx;
+	}
+
+	.coupon_bg_content_pr {
+		position: relative;
+	}
+
+	.coupon_bg_content .img2 {
+		width: 600rpx;
+		height: 166rpx;
+	}
+
+	.coupon_bg_content .img3 {
+		width: 323rpx;
+		height: 77rpx;
+		position: absolute;
+		bottom: 20rpx;
+		color: #751300;
+	}
+
+	.coupon_bg_content .img3 image {
+		width: 100%;
+		height: 100%;
+	}
+
+	.coupon_bg_content .img3 .img3-pr {
+		position: absolute;
+		left: 0;
+		top: 0;
+		width: 100%;
+		height: 90%;
+	}
+
+	.coupon {
+		width: 528rpx;
+		height: 160rpx;
+		background: linear-gradient(180deg, #ffefb4 33%, #ffee75 89%);
+		border-radius: 8rpx;
+		margin: 0 auto;
+		margin-bottom: 20rpx;
+
+		.coupon-left {
+			width: 404rpx;
+			font-size: 28rpx;
+			font-weight: 400;
+			color: #EB8E55;
+			padding-left: 22rpx;
+			text-align: left;
+
+			.title {
+				font-size: 32rpx;
+				font-family: Source Han Sans CN, Source Han Sans CN-Medium;
+				font-weight: 500;
+				color: #F03100;
+				margin-bottom: 4rpx;
+			}
+
+			.date {
+				margin-bottom: 4rpx;
+				font-size: 24rpx;
+			}
+
+			.code {
+				font-size: 24rpx;
+			}
+		}
+
+		.coupon-center {
+			position: relative;
+			width: 30rpx;
+
+			.rund {
+				width: 24rpx;
+				height: 24rpx;
+				background: #F41018;
+				border-radius: 50%;
+				position: absolute;
+			}
+
+			.top {
+				top: -10rpx;
+			}
+
+			.bottom {
+				bottom: -10rpx;
+			}
+
+			.line {
+				width: 1rpx;
+				height: 124rpx;
+				border: 2rpx dashed #EB8E55;
+				position: absolute;
+				left: 10rpx;
+				top: 20rpx;
+			}
+		}
+
+		.coupon-right {
+			.used {
+				width: 140rpx;
+				height: 140rpx;
+			}
+
+			.getCoupon {
+				color: #EB8E55;
+				font-weight: 600;
+			}
+		}
+	}
+</style>

+ 613 - 0
diy/home.vue

@@ -0,0 +1,613 @@
+<template>
+    <view>
+        <view class="swiper">
+            <swiper v-if="banner.length>0" class="swiper-box" :indicator-dots="true" :autoplay="true" :interval="3000"
+                :duration="1000">
+                <block v-for="(item,index) of banner" :key='index'>
+                    <swiper-item>
+                        <view class="swiper-item" @click.stop="bindPreview(item.type,item.appid,URL+item.thumb,index,item.wifi_id)">
+                            <image :src="URL+item.thumb"></image>
+                        </view>
+                    </swiper-item>
+                </block>
+            </swiper>
+            <view class="swiper-item" v-else>
+                <image src="https://zxzhdc.zx-xcx.com/dining/banner.png" mode="aspectFit"></image>
+            </view>
+        </view>
+
+        <view class="flex-y-center home-header box-pack-between">
+            <view class="home-header-contentLeft flex-center" @click="canTeen">
+                <view class="">
+                    <image class="home-header-icon" :src="URL+obj.to_store_log"></image>
+                    <view class="home-header-title">
+                        {{obj.to_store_title||''}}
+                    </view>
+                    <view class="home-header-tip">
+                        {{obj.to_store_desc||''}}
+                    </view>
+                </view>
+            </view>
+            <!-- <view class="home-header-line"></view> -->
+            <view class="home-header-contentRight flex-col box-pack-between">
+                <view class="flex-center home-header-contentRight1" @click="takeFood">
+                    <view class="flex-y-center">
+                        <image class="home-header-icon-take" :src="URL+obj.takeout_log"></image>
+                        <view class="">
+                            <view class="home-header-title">
+                                {{obj.takeout_title||''}}
+                            </view>
+                            <view class="home-header-tip">
+                                {{obj.takeout_desc||''}}
+                            </view>
+                        </view>
+                    </view>
+                </view>
+                <view class="flex-center home-header-contentRight1" @click="SelfMention">
+                    <view class="flex-y-center">
+                        <image class="home-header-icon-take" :src="URL+obj.self_logo"></image>
+                        <view class="">
+                            <view class="home-header-title">
+                                {{obj.self_title||''}}
+                            </view>
+                            <view class="home-header-tip">
+                                {{obj.self_desc||''}}
+                            </view>
+                        </view>
+                    </view>
+                </view>
+            </view>
+        </view>
+
+        <slot name='getCoupon'></slot>
+
+        <!-- #ifdef MP-ALIPAY -->
+        <mkt v-if="canIUse" mode="AUTOMATIC" boothCode="MERCHANT_SELF_TINYAPP" :cityCode="cityCode" version="2"
+            class='mkt' />
+        <!-- #endif -->
+
+        <navigator url="/pages/onPay/onPay" class="box-pack-between home-pay flex-y-center">
+            <view class="home-pay-title">
+                {{obj.pay_title||''}}
+                <view class="home-pay-tip">
+                    {{obj.pay_desc||''}}
+                </view>
+            </view>
+            <image class="home-pay-jiantou" src="/static/home/jiantou.png"></image>
+        </navigator>
+
+        <view class="home-store flex-y-center">
+            <view class="flex-grow-1">
+                <view class="box-pack-between flex-grow-1 flex-y-center">
+                    <text>{{systemInfo.title}}</text>
+                    <view class="more-businessTime flex-y-center" @click="getShop"><text
+                            style="margin-right: 6rpx;">更多门店</text><text class="iconfont icon-jiantou1"></text></view>
+                </view>
+                <view class="businessTime flex-grow-1 box-pack-between flex-y-center">
+                    <view class="flex-grow-1">
+                        <view class="businessTime businessTimeItem" v-if="systemInfo.is_rest==2 && systemInfo.time">
+                            营业时间:{{systemInfo.time}}-{{systemInfo.time2}}
+                        </view>
+                        <view class=" box-pack-between flex-grow-1" @click="getNavigation">
+                            <text class="iconfont icon-dizhi">{{systemInfo.address}}</text>
+                            <text class="iconfont icon-icon-test"></text>
+                        </view>
+                    </view>
+                </view>
+            </view>
+        </view>
+
+        <view class="flex home-item-content box-pack-between">
+            <view class="home-item home-item-one" v-if="applet_info.name" @click="navigateMiniProgram">
+                <view class="">
+                    <view class="">
+                        {{applet_info.name||''}}
+                    </view>
+                    <view class="home-item-one-tip flex-y-center">
+                        {{applet_info.desc||''}}
+                    </view>
+                </view>
+                <image class="home-item-icon1" src="https://zxzhdc.zx-xcx.com/dining/home2.png"></image>
+            </view>
+
+            <navigator class="home-item home-item-two" url="/subscribe/index">
+                <view class="">
+                    {{obj.yy_title||''}}
+                </view>
+                <image class="home-item-icon1" :src="URL+obj.yy_logo"></image>
+            </navigator>
+
+            <navigator class="home-item home-item-two" url="/pages/lineup/lineup">
+                <view class="">
+                    {{obj.queue_title||''}}
+                </view>
+                <image class="home-item-icon1" :src="URL+obj.queue_logo"></image>
+            </navigator>
+
+            <navigator class="home-item home-item-three" url="../coupon-list/coupon-list">
+                <view class="">
+                    {{obj.coupon_title||''}}
+                </view>
+                <image class="home-item-icon1" :src="URL+obj.coupon_logo"></image>
+            </navigator>
+        </view>
+        <getPhone />
+        <model :obj="modelObj"></model>
+        <Vphone :getPhonePop="getPhonePop" @close="setClose"></Vphone>
+
+        <uni-popup ref="popup" type="bottom">
+            <view class="popup_content flex-grow-1 ">
+                <view class="popup_content_title">
+                    <text v-if="systemInfo.table" class="ft28">您现在已经在{{systemInfo.table||''}}点餐,是要切换到其他餐桌吗?</text>
+                </view>
+                <view class="flex-y-center flex-grow-1 box-pack-between" style="padding-bottom: 25rpx;">
+                    <view class="flex-center popup_content_left popup_content_left1" @click="canTeen_yz">
+                        <view class="flex-y-center">
+                            <view class="">
+                                原桌点餐
+                            </view>
+                        </view>
+                    </view>
+                    <view class="flex-center popup_content_left popup_content_left2" @click="bindScan">
+                        <view class="flex-y-center">
+                            <view class="">
+                                重选餐桌
+                            </view>
+                        </view>
+                    </view>
+                </view>
+            </view>
+        </uni-popup>
+
+    </view>
+</template>
+<script>
+    let hideLoading = true;
+    import getPhone from './module/getPhone.vue';
+    import Vphone from '@/components/v-phone/v-phone.vue';
+    // import getCoupon from  "plugin://couponPlugin/get-coupon";
+    import {
+        mapState,
+        mapMutations
+    } from 'vuex'
+    export default {
+        components: {
+            getPhone,
+            Vphone,
+            // getCoupon
+        },
+        props: {
+            cityCode: {
+                type: [Number, String],
+                default: 0
+            }
+        },
+        data() {
+            return {
+                URL: getApp().globalData.URL,
+                banner: [],
+                applet_info: {},
+                obj: {},
+                getPhonePop: false,
+                modelObj: null,
+                // cityCode: "",
+                // #ifdef MP-ALIPAY
+                canIUse: my.canIUse('mkt'),
+                // #endif
+            }
+        },
+
+        computed: {
+            ...mapState(['systemInfo', 'setColor', 'store_id', 'userInfo'])
+        },
+
+        watch: {
+            store_id(nVal) {
+                this.banner_list();
+                this.applet();
+                this.setCopy();
+                this.getCouponList();
+            },
+        },
+
+        created() {
+            this.banner_list();
+            this.applet();
+            this.setCopy();
+            this.home();
+            // this.getCouponList(); 
+        },
+
+        methods: {
+            ...mapMutations(['SET_ADDRESS', 'SET_TEEN_INDEX', 'SET_SELFMENTION']),
+            bindScan(e) {
+                // 允许从相机和相册扫码
+                uni.scanCode({
+                    success: (res) => {
+                        var store_id = this.gettParameter(res.result, 'store_id')
+                        var table_id = this.gettParameter(res.result, 'table_id')
+                        // console.log(store_id, table_id)
+                        this.$store.commit('SET_SYSTEM', '') //清空
+                        this.$store.commit('SET_STORE_ID', store_id)
+                        this.$store.commit('SET_TEEN_INDEX', 1) //重置默认
+                        this.$store.commit('SET_TABLE_ID', table_id)
+                        this.$store.commit('SET_CATE_ID', '')
+                        this.$store.dispatch('getSystemStup', store_id);
+                        this.$store.dispatch('getOpenid', store_id);
+                        uni.switchTab({
+                            url: "/pages/index/index"
+                        })
+                        this.$refs.popup.close();
+                    }
+                })
+            },
+
+            gettParameter: function(url, name) {
+                let val = ''
+                if (url.indexOf('?' + name + '=') !== -1) {
+                    val = url.split('?' + name + '=')[1].split(/&|#/)[0];
+                } else if (url.indexOf('&' + name + '=') !== -1) {
+                    val = url.split('&' + name + '=')[1].split(/&|#/)[0];
+                }
+                return val
+            },
+
+            getShop(e) {
+                uni.navigateTo({
+                    url: "../../shop/index/index"
+                })
+            },
+
+            // 首页内容
+            home() {
+                this.$http.request('xcx/home', {
+                    store_id: this.store_id,
+                }, "", "", hideLoading).then(res => {
+                    this.obj = res.data;
+                })
+            },
+            // 打开地图
+            getNavigation() {
+                // console.log(this.systemInfo.set.coordinates)
+                let obj = this.systemInfo.set.coordinates.split(",");
+                uni.openLocation({
+                    latitude: Number(obj[0]),
+                    longitude: Number(obj[1]),
+                    name: this.systemInfo.title,
+                    address: this.systemInfo.address,
+                    success: function() {
+                        console.log('success');
+                    }
+                });
+            },
+
+            // 赋能
+            setCopy() {
+
+                if (getApp().globalData.isApp) {
+                    this.$http.request('xcx/funeng', {
+                        store_id: this.store_id,
+                    }, "", "", hideLoading).then(res => {
+                        let way_power = res.data.way_power;
+                        if (!way_power) {
+                            return
+                        }
+                        let content = way_power.replace(/<br\s*\/?\s*>/ig, "\n");
+                        uni.setClipboardData({
+                            data: content,
+                            success: function(r) {
+                                console.log('success', r);
+                                getApp().globalData.isApp = false
+                            }
+                        });
+                        // // #ifdef MP-WEIXIN
+                        // 	wx.showLoading();
+                        // 	uni.setClipboardData({
+                        // 		data: content,
+                        // 		success: (res) => {
+                        // 			wx.hideLoading()
+
+                        // 		}
+                        // 	});
+                        // // #endif
+                        // // #ifdef MP-ALIPAY
+                        // uni.setClipboardData({
+                        // 	data: content,
+                        // 	success: (res) => {}
+                        // });
+                        // // #endif
+                    })
+                }
+            },
+
+            // 开启会员弹窗
+            onGetphone(e) {
+                this.getPhonePop = true;
+            },
+            // 子组件传参
+            setClose(e) {
+                this.getPhonePop = e;
+            },
+
+            // 跳转小程序、内页面
+            bindPreview(type, appId, thumb, index,wifi_id) {
+                console.log(type, appId, thumb, index, 888)
+                let {
+                    is_article
+                } = this.banner[index]
+                if (type == 1) {
+                    if (appId) {
+                        uni.navigateToMiniProgram({
+                            appId: appId,
+                            success(res) {
+                                // 打开成功
+                            }
+                        })
+                    }
+                } else if (type == 2) {
+                    if (appId) {
+                        if ("/pages/index/index" == appId || "/pages/my/my" == appId ||
+                            "/pages/myOrderList/myOrderList" == appId) {
+                            uni.switchTab({
+                                url: appId
+                            })
+                        } else {
+                            uni.navigateTo({
+                                url: appId
+                            })
+                        }
+                    } else {
+                        // let url = this.URL + info.thumb;
+                        uni.previewImage({
+                            urls: [thumb],
+                        });
+                    }
+                } else if (type == 3) {
+                    if (!this.userInfo.mobile) {
+                        // #ifdef MP-WEIXIN
+                        this.modelObj = {
+                            content: "完善资料才能享有领取权利,是否完善?",
+                        };
+                        this.$store.commit('showAttrPicker', true)
+                        // #endif
+                        // #ifdef MP-ALIPAY
+                        this.getPhonePop = true;
+                        // #endif
+                        return
+                    } else {
+                        uni.showToast({
+                            title: '您已经完善过会员信息了,无需重复操作!',
+                            icon: 'none'
+                        })
+                    }
+                } else if (type == 4) {
+                    uni.navigateTo({
+                        url: `/shop/richText/index?id=${is_article}`
+                    })
+                } else if(type == 5 && wifi_id){
+                    uni.navigateToMiniProgram({
+                        appId: appId,
+                        extraData:{
+                            id:wifi_id
+                        },
+                        success(res) {
+                            // 打开成功
+                        }
+                    })
+                }
+            },
+
+            applet() {
+                let type;
+                // #ifdef MP-WEIXIN
+                type = 1
+                // #endif
+                // #ifdef MP-ALIPAY
+                type = 2
+                // #endif
+                this.$http.request('xcx/applet_index', {
+                    store_id: this.store_id,
+                    type: type,
+                }, "", "", true).then(res => {
+                    this.applet_info = res.data;
+                })
+            },
+
+            banner_list() {
+                this.$http.request('xcx/banner_list', {
+                    store_id: this.store_id,
+                    type_id: 2,
+                }, "", "", true).then(res => {
+                    // console.log(res, "LqCoupons_lists")
+                    this.banner = res.data;
+                })
+            },
+
+            // 子组件传参
+            // setClose(e) {
+            // 	this.getPhonePop = e;
+            // }
+
+            canTeen() {
+                if (this.systemInfo.is_hall == 1) {
+                    if (this.systemInfo.set.change_table == 1) {
+                        this.$refs.popup.open();
+                    } else {
+                        this.SET_TEEN_INDEX(1);
+                        uni.switchTab({
+                            url: `../index/index`
+                        })
+                    }
+                    return
+                }
+                uni.showToast({
+                    title: "敬请期待!",
+                    icon: 'none'
+                })
+            },
+
+            canTeen_yz() {
+                this.SET_TEEN_INDEX(1);
+                uni.switchTab({
+                    url: `../index/index`
+                })
+                this.$refs.popup.close();
+            },
+
+            // 外卖
+            takeFood(e) {
+                if (this.systemInfo.is_waimai == 1) {
+                    this.SET_TEEN_INDEX(2);
+                    uni.switchTab({
+                        url: `../index/index`
+                    })
+                    return
+                }
+                uni.showToast({
+                    title: "敬请期待!",
+                    icon: 'none'
+                })
+            },
+            // 自提
+            SelfMention(e) {
+                // if (this.systemInfo.is_waimai == 1) {
+                if (this.systemInfo.is_ziti == 1) {
+                    if (this.systemInfo.pay_type == 2 && this.systemInfo.is_ziti == 1) {
+                        uni.showToast({
+                            icon: "none",
+                            title: '餐后付款不能自提!'
+                        })
+                        return
+                    }
+                    this.SET_TEEN_INDEX(3);
+                    uni.switchTab({
+                        url: `../index/index`
+                    })
+                    return
+                }
+                uni.showToast({
+                    title: "敬请期待!",
+                    icon: 'none'
+                })
+                // return
+                // }
+            },
+
+            navigateMiniProgram() {
+                // 	uni.navigateToMiniProgram({
+                // 		appId: "wxc7811d73da68c79e",
+                // 		path: "pages/index/index",
+                // 		envVersion: 'develop',
+                // 		success(res) {
+
+                // 		}
+                // 	})
+
+                // 	return
+                if (!this.applet_info.appid) {
+                    uni.showToast({
+                        title: "敬请期待!",
+                        icon: 'none'
+                    })
+                    return
+                }
+                var mobile = this.userInfo.mobile,
+                    path = '',
+                    type = this.userInfo.mobile ? 1 : 2;
+
+                // uni.navigateToMiniProgram({
+                // 	appId: 'wx394da23b82f9863a',
+                // 	path: `pages/integral-index/index?mobile=${mobile}&type=${type}`,
+                // 	envVersion: 'develop',
+                // 	success(res) {}
+                // })
+
+
+
+                if ('wx394da23b82f9863a' == this.applet_info.appid) {
+                    path = `${this.applet_info.pages}?mobile=${mobile}&type=${type}`; //跳转智豆商圈
+                } else if ('wxc7811d73da68c79e' == this.applet_info.appid) {
+                    path = `${this.applet_info.pages}?mobile=${mobile}&type=${type}`; //跳转智豆商圈
+                } else {
+                    path = this.applet_info.pages;
+                }
+
+                uni.navigateToMiniProgram({
+                    appId: this.applet_info.appid,
+                    path: path,
+                    envVersion: 'develop',
+                    success(res) {
+                        // 打开成功
+                    }
+                })
+            },
+        }
+    }
+</script>
+
+<style>
+    .popup_content {
+        background-color: #FFFFFF;
+        height: 400rpx;
+        padding: 0 30rpx;
+    }
+
+    .popup_content_title {
+        padding: 30rpx 0;
+        font-size: 32rpx;
+    }
+
+    .popup_content_left {
+        border-radius: 14rpx;
+        height: 155rpx;
+        text-align: left;
+        width: 300rpx;
+        font-size: 35rpx;
+    }
+
+    .popup_content_left1 {
+        background: linear-gradient(to right, #fb652e, 34%, #F0AD4E);
+        color: #FFFFFF;
+        box-shadow: 0rpx 8rpx 16rpx 8rpx #F1F1F1;
+    }
+
+    .popup_content_left2 {
+        background: #FFFFFF;
+        color: #000;
+        box-shadow: 0rpx 8rpx 16rpx 8rpx #F1F1F1;
+    }
+
+    .home-store {
+        font-size: 30rpx;
+        width: 690rpx;
+        background-color: #FFFFFF;
+        margin: 0 auto;
+        /* height: 180rpx; */
+        margin-top: 25rpx;
+        padding: 20rpx 40rpx;
+        border-radius: 14rpx;
+        box-shadow: 0rpx 8rpx 16rpx 0rpx rgba(204, 215, 230, 0.08);
+    }
+
+    .home-pay-title {
+        font-size: 30rpx;
+    }
+
+    .more-businessTime {
+        font-size: 24rpx;
+    }
+
+    .businessTime {
+        font-size: 24rpx;
+        color: #999999;
+        padding-top: 10rpx;
+    }
+
+    .businessTimeItem {
+        margin-bottom: 10rpx;
+    }
+
+    .businessTime .icon-dizhi {
+        font-size: 24rpx;
+    }
+</style>

+ 216 - 0
diy/module/ad.vue

@@ -0,0 +1,216 @@
+<template>
+	<div class="module-item-tuwen" :style="!module.base.m ? 'margin-top:0':''">
+		<div class="item-tuwen-con">
+			<moduleBg :base="module.base" />
+			<!--样式一-->
+			<div class="item-tuwen-style1" :style="!module.base.m ? 'padding:0':''" v-if="module.base.s == 0">
+				<ad v-if="banner_id" :unitId="banner_id"></ad>
+			</div>
+			<!--样式二-->
+			<div class="item-tuwen-style2" :style="!module.base.m ? 'padding:0':''" v-if="module.base.s == 1">
+				<div @click="bindad" class="item" :style="!module.base.m ? 'margin:0' : ''">
+					<p v-if="module.img">
+						<image :style="style" :src="module.img" />
+					</p>
+					<p v-else><img :src="$util.icon('img.jpg')" alt=""></p>
+					<div class="note" v-if="module.note.s">
+						<moduleText :text="module.note" />
+					</div>
+				</div>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	import moduleBg from './bg.vue';
+	import moduleText from './text.vue';
+	export default {
+		props: ['module'],
+		components: {
+			moduleBg,
+			moduleText
+		},
+		data() {
+			return {
+				banner_id: '',
+			};
+		},
+
+		computed: {
+			style() {
+				let style = `height:${this.module.note.h}px;`;
+				return style;
+			},
+		},
+
+		mounted() {
+			this.banner_id = uni.getStorageSync("systemInfo").set.banner_id;
+		},
+
+		methods: {
+			bindad() {
+				let that = this;
+				let videoAd = wx.createRewardedVideoAd({
+					adUnitId: uni.getStorageSync("systemInfo").set.jili_id,
+				});
+				try {
+					if (videoAd.closeHandler) {
+						videoAd.offClose(videoAd.closeHandler);
+						console.log("---videoAd.offClose 卸载成功---");
+					}
+				} catch (e) {
+					console.log("---videoAd.offClose 卸载失败---");
+					console.error(e);
+				}
+				videoAd.closeHandler = function(res) {
+					// 用户点击了【关闭广告】按钮
+					if (res && res.isEnded || res === undefined) {
+						// 正常播放结束,可以下发奖励
+						console.log("播放完毕");
+						that.advertisements()
+					} else {
+						//提前关闭小程序
+						uni.showToast({
+							title: '观看结束才能获得积分喔',
+							icon: 'none'
+						})
+					}
+				};
+				videoAd.onClose(videoAd.closeHandler);
+				videoAd.onLoad((err) => {
+					console.log(err, '激励视频 广告加载成功')
+				})
+				videoAd.onError((err) => {
+					console.log(err, '激励视频 广告显示失败')
+				})
+
+				if (videoAd) {
+					videoAd.show().catch(() => {
+						// 失败重试
+						videoAd.load()
+							.then(() => videoAd.show())
+							.catch(err => {
+								console.log(err, '激励视频 广告显示失败')
+								uni.showToast({
+									title: '激励视频,广告显示失败',
+									icon: 'none'
+								})
+							})
+					})
+				}
+
+			},
+
+			advertisements() {
+               let params = {
+                    user_id: this.$store.state.userInfo.id,
+                    store_id: this.$store.state.store_id,
+                }
+                let share_user_id = uni.getStorageSync('share_user_id')
+                if (share_user_id) {
+                    params.share_id = share_user_id
+                }		
+				this.$http.request('yy/get_advertisements', params, "", "", true).then(res => {
+					if (res.code == "200") {
+						uni.showToast({
+							title: res.message,
+							icon: 'none'
+						})
+					}
+				}).catch((res) => {});
+			},
+		}
+	};
+</script>
+
+<style lang="less">
+	/***图文模块***/
+	.module-item-tuwen {
+		margin-top: 10px;
+		position: relative;
+
+		.mg0 {
+			margin-top: 0;
+		}
+
+		.item-tuwen-con {
+			position: relative;
+			overflow: hidden;
+		}
+
+		.item-tuwen-style1 {
+			position: relative;
+			z-index: 1;
+			padding: 10px 0;
+			overflow: hidden;
+
+			.tit {
+				white-space: nowrap;
+				font-size: 14px;
+				padding: 10px;
+				text-align: center;
+				overflow: hidden;
+				text-overflow: ellipsis;
+			}
+
+			.item {
+				margin: 0 10px;
+				position: relative;
+				overflow: hidden;
+				width: auto;
+
+				image {
+					display: block;
+					height: 150px;
+					width: 100%;
+				}
+
+				.note {
+					line-height: 18px;
+					color: #fff;
+					background: rgba(0, 0, 0, 0.5);
+					position: absolute;
+					bottom: 0;
+					padding: 6px 10px;
+					width: 100%;
+				}
+			}
+		}
+
+		.item-tuwen-style2 {
+			position: relative;
+			display: flex;
+			flex-wrap: wrap;
+			z-index: 1;
+			padding: 10px 0;
+			overflow: hidden;
+
+			.item {
+				margin: 0 10px;
+				width: 100%;
+
+				image {
+					display: block;
+					height: 150px;
+					width: 100%;
+				}
+
+				.tit {
+					white-space: nowrap;
+					font-size: 14px;
+					padding-top: 10px;
+					text-align: center;
+					overflow: hidden;
+					text-overflow: ellipsis;
+				}
+
+				.note {
+					line-height: 20px;
+					color: #999;
+					padding: 6px 10px;
+				}
+			}
+		}
+	}
+</style>

+ 32 - 0
diy/module/bg.vue

@@ -0,0 +1,32 @@
+<template>
+	<div class="module-background" :style="style"></div>
+</template>
+
+<script>
+	 export default{
+			  name:'moduleBg',
+					props:['base'],				
+					computed:{
+						 style(){
+								 let bg = '';
+								 if(this.base.bg==2){ bg = 'background:none;';}
+									else if(this.base.bg==3){
+										 if(this.base.bt==1){ bg = `background:${this.base.bc};`; }		
+											else if(this.base.bt==2 && this.base.bi!=''){ bg = `background:url(${this.base.bi}) no-repeat center;background-size:cover;`; }									
+									}
+									return bg;
+							} 
+					}
+		}
+</script>
+
+<style>
+	.module-background {
+	  background: #fff;
+	  position: absolute;
+	  left: 0;
+	  top: 0;
+	  right: 0;
+	  bottom: 0;
+	}
+</style>

+ 145 - 0
diy/module/contitle.vue

@@ -0,0 +1,145 @@
+<template>
+	<div :style="style+'padding-top:'+statusBarHeight+'px'" >
+		<div class="xcx-title flex-center" @click.stop="controlClick" :style="'height:'+height+'px;'">
+			<span class="el-icon-arrow-left" :style="fhstyle" v-if="title.fh.s"></span>
+			<p class="tit" v-if="title.title.s">
+				<moduleText :text="title.title" :name="name" />
+			</p>
+			<!-- <img src="@/assets/xcx.png" alt="" /> -->
+			<moduleBg :base="title.base" />
+		</div>
+	</div>
+
+</template>
+
+<script>
+	import moduleText from './text.vue';
+	import moduleBg from './bg.vue';
+	export default {
+		props: {
+			'title': {
+				type: Object
+			},
+			'name': {
+				default: ''
+			},
+			'prev': {
+				default: false
+			}
+		},
+		components: {
+			moduleText,
+			moduleBg
+		},
+		data() {
+			return {
+				height: 50,
+				statusBarHeight: 0
+			}
+		},
+		created() {
+			var _this = this;
+			uni.getSystemInfo({
+				success: function(e) {
+					// #ifdef MP-WEIXIN
+					var custom = uni.getMenuButtonBoundingClientRect();
+					_this.height = custom.height+3*(custom.top-e.statusBarHeight);
+					// #endif
+					// 导航栏高度=状态栏高度+标题栏高度,标题栏高度=胶囊按钮高度+3*(胶囊按钮Top-状态栏高度)
+					// #ifdef MP-ALIPAY
+					var custom = e.titleBarHeight;
+					_this.height = custom;
+					// #endif
+					// console.log(custom, e, "getSystemInfo")
+					_this.statusBarHeight = e.statusBarHeight
+				}
+			})
+		},
+		computed: {
+			style() {
+				let bg = '';
+				if (this.title.base.bg == 2) {
+					bg = 'background:none;';
+				} else if (this.title.base.bg == 3) {
+					if (this.title.base.bt == 1) {
+						bg = `background:${this.title.base.bc};`;
+					} else if (this.title.base.bt == 2 && this.title.base.bi != '') {
+						bg = `background: rgba(0,0,0,0.2);;background-size:cover;`;
+					}
+				}
+				return bg;
+			},
+
+			fhstyle() {
+				if (this.title.fh.d) {
+					let style = `font-size:${this.title.fh.f}px;color:${this.title.fh.c};`;
+					if (this.title.fh.b) {
+						style += 'font-weight:bold;';
+					}
+					if (this.title.fh.i) {
+						style += 'font-style:italic;';
+					}
+					if (this.title.fh.u) {
+						style += 'text-decoration:underline;';
+					}
+					return style;
+				}
+			}
+		},
+
+		methods: {
+			controlClick() {
+				if (!this.prev) {
+					this.$parent.controlClick(this.title.type);
+				}
+			}
+		}
+	}
+</script>
+
+<style>
+	.xcx-title {
+		height: 50px;
+		position: relative;
+		background: #fff;
+		text-align: center;
+		/* padding-top: 15px; */
+		z-index: 999;
+	}
+
+	.xcx-title img {
+		position: absolute;
+		z-index: 1;
+		right: 12px;
+		top: 50%;
+		transform: translateY(-50%);
+		width: 72px;
+		height: 30px;
+		background: rgba(0, 0, 0, 0.2);
+		border-radius: 30px;
+	}
+
+	.xcx-title .tit {
+		font-size: 15px;
+		/* line-height: 50px; */
+		margin: 0;
+		padding: 0;
+		position: relative;
+		z-index: 1;
+	}
+
+	.xcx-title .el-icon-arrow-left {
+		position: absolute;
+		left: 0;
+		top: 0;
+		z-index: 1;
+		width: 40px;
+		height: 100%;
+		color: #888;
+		cursor: pointer;
+		font-size: 20px;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+	}
+</style>

+ 90 - 0
diy/module/contopimg.vue

@@ -0,0 +1,90 @@
+<template>
+	 <div class="xcx-page-topimg" @click.stop="controlClick">	 
+			<p class="pic">
+				<img :src="item.img" v-if="item.img">
+			</p> 
+			<p class="tit" v-if="item.title.s"><moduleText :text="item.title" /></p>
+			<div class="note" v-if="item.note.s"><moduleText :text="item.note" /></div>
+			<moduleBg class="bg" :base="item.base.dbg" />
+			<moduleBg :base="item.base.ubg" />
+	 </div>
+</template>
+
+<script>	
+	import moduleText from './text.vue';
+	import moduleBg from './bg.vue';
+	export default{
+		 name:'conTopimg',
+		 props:{
+			 'item':{type:Object},
+			 'prev':{default:false}
+		 },
+		 components:{moduleText,moduleBg},
+		 data(){
+			 return{				 
+			 }
+		 },	
+		 methods:{
+			  controlClick(){
+					if(!this.prev){
+						this.$parent.controlClick(this.item.type);
+					}
+			  }
+		 }
+	}
+</script>
+
+<style>
+	 .xcx-page-topimg {
+	  position: relative;
+	  padding: 0 12px;
+	  overflow: hidden;
+	  padding-top: 65px;
+	  padding-bottom: 12px;
+	}
+	 .xcx-page-topimg .module-background.bg {
+	  z-index: 1;
+	  height: 100px;
+	  width: 110%;
+	  left: -5%;
+	  background-color: #29c8a1;
+	  border-bottom-left-radius: 50%;
+	  border-bottom-right-radius: 50%;
+	}
+	 .xcx-page-topimg .pic {
+	  width: 68px;
+	  position: relative;
+	  z-index: 2;
+	  border-radius: 50%;
+	  overflow: hidden;
+	  height: 68px;
+	  border: 2px solid rgba(255, 255, 255, 0.2);
+	  background: rgba(255, 255, 255, 0.5);
+	  margin: 0 auto;
+	}
+	 .xcx-page-topimg .pic img {
+	  width: 100%;
+	  height: 100%;
+	  object-fit: cover;
+	}
+	 .xcx-page-topimg .tit {
+	  font-size: 14px;
+	  position: relative;
+	  text-align: center;
+	  z-index: 2;
+	  display: block;
+	  overflow: hidden;
+	  white-space: nowrap;
+	  text-overflow: ellipsis;
+	  padding-top: 5px;
+	}
+	 .xcx-page-topimg .note {
+	  color: #999;
+	  position: relative;
+	  z-index: 2;
+	  font-size: 12px;
+	  line-height: 22px;
+	  padding-top: 5px;
+	}
+	
+</style>

+ 403 - 0
diy/module/duo.vue

@@ -0,0 +1,403 @@
+<template>
+	<div class="module-item-duo" :style="!module.base.m?'margin-top:0' : ''">
+		<moduleTitle :title="module.title" v-if="module.title.t.s" />
+		<view class="item-duo-con" :style="style">
+			<moduleBg :base="module.base" />
+			<!--样式一-->
+			<view class="item-duo-style1" :class="'col' + module.base.c" v-if="module.base.s == 0">
+				<view @click="$util.openAttr(module.list,index)" class="item" :url="item.link.n"
+					v-for="(item,index) of module.list" :key="index" :data-url="item.link.n" :data-islink="item.link.g">
+					<view class="c">
+						<p class="pic">
+							<image :src="item.icon.img" v-if="item.icon.img" mode="widthFix"></image>
+							<image v-else :src="$util.icon('img')" mode="aspectFit"></image>
+						</p>
+						<view class="txt" v-if="item.text.s">
+							<moduleText :text="item.text" :colorf="module.base.fc" />
+						</view>
+					</view>
+				</view>
+			</view>
+
+			<!--样式二-->
+			<view class="item-duo-style2" v-if="module.base.s == 1">
+				<scroll-view v-if="module.list.length>0" scroll-x="true" class="scroll-view" style="width: 100%;">
+					<view v-for="(item,index) of module.list" :key='index' @click="$util.openAttr(module.list,index)"
+						:data-url="item.link.p" :data-is_link="item.link.g" class="swiper-slide item">
+						<p>
+							<image :src="item.icon.img" v-if="item.icon.img" mode="aspectFit"></image>
+							<image v-else :src="$util.icon('img')"></image>
+						</p>
+						<view class="txt" v-if="item.text.s">
+							<moduleText :text="item.text" :colorf="module.base.fc" />
+						</view>
+					</view>
+				</scroll-view>
+			</view>
+
+			<!--样式三-->
+			<view class="item-duo-style3" v-if="module.base.s == 2">
+				<swiper v-if="module.list.length>0" class="screen-swiper card-swiper" interval="5000" duration="300"
+					circular="true">
+					<block v-for=" (item,index) of module.list" :key='index'>
+						<swiper-item>
+							<view @click="$util.openAttr(module.list,index)" class="swiper-item" :url="item.link.n"
+								:data-url="item.link.p" :data-islink="item.link.g">
+								<p class="pic">
+									<image :src="item.icon.img" v-if="item.icon.img" mode="aspectFit"></image>
+									<image v-else :src="$util.icon('img')" mode="aspectFit"></image>
+								</p>
+								<p class="txt" v-if="item.text.s">
+									<moduleText :text="item.text" :colorf="module.base.fc" />
+								</p>
+							</view>
+						</swiper-item>
+					</block>
+				</swiper>
+			</view>
+			
+			
+			<!--样式四-->
+			<view class="item-duo-style4" v-if="module.base.s == 3">
+				<swiper v-if="module.list.length>0" class="item" autoplay="true" interval="5000" duration="300"
+					indicator-color="#999" indicator-active-color="#007aff" indicator-dots="true" circular="true">
+					<block v-for="(item,index) of module.list" :key='index'>
+						<swiper-item>
+							<view @click="$util.openAttr(module.list,index)" class="swiper-item" :url="item.link.n"
+								:data-url="item.link.p" :data-islink="item.link.g">
+								<p class="pic">
+									<image :src="item.icon.img" v-if="item.icon.img" mode="aspectFit"></image>
+									<image v-else :src="$util.icon('img')" mode="aspectFit"></image>
+								</p>
+								<p class="txt" v-if="item.text.s">
+									<moduleText :text="item.text" :colorf="module.base.fc" />
+								</p>
+							</view>
+						</swiper-item>
+					</block>
+				</swiper>
+			</view>
+		</view>
+	</div>
+</template>
+<script>
+	import moduleBg from './bg.vue';
+	import moduleText from './text.vue';
+	import moduleTitle from './title.vue';
+	// import { Swiper, SwiperSlide, directive } from 'vue-awesome-swiper';
+	// import Swiper2, { Pagination } from 'swiper';
+	// Swiper2.use([Pagination]);
+	// import 'swiper/swiper-bundle.css';
+	let that = null;
+	export default {
+		props: ['module'],
+		components: {
+			moduleBg,
+			moduleText,
+			moduleTitle
+		},
+		// directives: { swiper: directive },
+		data() {
+			return {
+				nav: [],
+				swiperOption1: {
+					slidesPerView: 4,
+					spaceBetween: 10,
+					observer: true,
+					observeParents: true,
+					loop: false,
+					on: {
+						click: function(e) {
+							that.$util.openAttr(that.module.list, e.clickedIndex);
+						}
+					}
+				},
+				swiperOption2: {
+					slidesPerView: 'auto',
+					spaceBetween: 10,
+					observer: true,
+					observeParents: true,
+					loop: false,
+					on: {
+						click: function(e) {
+							that.$util.openAttr(that.module.list, e.clickedIndex);
+						}
+					}
+				},
+				swiperOption3: {
+					loop: true,
+					autoplay: 3000,
+					observer: true,
+					observeParents: true,
+					pagination: {
+						el: '.swiper-pagination'
+					},
+					on: {
+						click: function(e) {
+							that.$util.openAttr(that.module.list, e.clickedIndex);
+						}
+					}
+				}
+			};
+		},
+
+		created() {
+			that = this;
+		},
+
+		computed: {
+			style() {
+				if (this.module.base.fc != '') {
+					return `color:${this.module.base.fc}`;
+				}
+			},
+		},
+
+		mounted() {},
+		methods: {}
+	};
+</script>
+
+<style>
+	.module-item-duo {
+		margin-top: 10px;
+		position: relative;
+	}
+
+	.module-item-duo .mg0 {
+		margin-top: 0;
+	}
+
+	.module-item-duo .item-duo-con {
+		position: relative;
+		overflow: hidden;
+	}
+
+	.module-item-duo .item-duo-style1 {
+		position: relative;
+		display: flex;
+		flex-wrap: wrap;
+		z-index: 1;
+		/* padding: 0 10px; */
+		padding-top: 10px;
+		padding-right: 10px;
+		overflow: hidden;
+		/* justify-content: space-between; */
+	}
+
+	.module-item-duo .item-duo-style1.col1 .item {
+		width: 100%;
+	}
+
+	.module-item-duo .item-duo-style1.col2 .item {
+		width: 50%;
+	}
+
+	.module-item-duo .item-duo-style1.col3 .item {
+		width: 33.333333%;
+	}
+
+	.module-item-duo .item-duo-style1.col4 .item {
+		width: 25%;
+	}
+
+	.module-item-duo .item-duo-style1 .item {
+		width: 33.3333333%;
+		padding-left: 10px;
+		padding-bottom: 10px;
+	}
+
+	.module-item-duo .item-duo-style1 .item .c {
+		overflow: hidden;
+	}
+
+	.module-item-duo .item-duo-style1 .item .c image {
+		/* object-fit: cover; */
+		display: block;
+		width: 100%;
+		height: 150rpx;
+	}
+
+	.module-item-duo .item-duo-style1 .item .c .txt {
+		white-space: nowrap;
+		padding: 15rpx 0px;
+		text-align: center;
+		overflow: hidden;
+		text-overflow: ellipsis;
+	}
+
+
+	.module-item-duo .item-duo-style2 {
+		position: relative;
+		z-index: 1;
+		padding: 10px 0;
+		overflow: hidden;
+	}
+
+	.module-item-duo .item-duo-style2 .item {
+		width: 25%;
+		display: inline-block;
+	}
+
+	.module-item-duo .item-duo-style2 .scroll-view {
+		white-space: nowrap;
+	}
+
+	.module-item-duo .item-duo-style2 .item image {
+		display: block;
+		width: 60px;
+		margin: 0 auto;
+		height: 60px;
+		border-radius: 50%;
+		object-fit: cover;
+	}
+
+	.module-item-duo .item-duo-style2 .item .txt {
+		white-space: nowrap;
+		padding: 15rpx 0px;
+		text-align: center;
+		overflow: hidden;
+		text-overflow: ellipsis;
+	}
+
+	.swiper-slide {
+		width: 100%;
+		height: 100%;
+	}
+
+
+	.module-item-duo .item-duo-style4 {
+		position: relative;
+		z-index: 1;
+		height: 170px;
+		padding: 10px;
+	}
+
+	.module-item-duo .item-duo-style4 .item {
+		width: 100%;
+		height: 100%;
+	}
+
+	.module-item-duo .item-duo-style4 .item .pic {
+		width: 100%;
+		height: 100%;
+	}
+
+	.module-item-duo .item-duo-style4 .item .pic image {
+		display: block;
+		width: 100%;
+		height: 100%;
+	}
+
+	.module-item-duo .item-duo-style4 .item .txt {
+		position: absolute;
+		left: 0;
+		bottom: 0;
+		z-index: 1;
+		white-space: nowrap;
+		padding: 10px;
+		overflow: hidden;
+		text-overflow: ellipsis;
+	}
+
+	.module-item-duo .item-duo-style3 {
+		position: relative;
+		z-index: 1;
+		padding: 10px;
+	}
+
+	.module-item-duo .item-duo-style3 .item {
+		height: 150px;
+	}
+
+	.module-item-duo .item-duo-style3 .item .pic {
+		height: 150px;
+	}
+
+	.module-item-duo .item-duo-style3 .item .pic image {
+		display: block;
+		width: 100%;
+		height: 100%;
+		object-fit: cover;
+	}
+
+	.module-item-duo .item-duo-style3 .item .txt {
+		position: absolute;
+		left: 0;
+		bottom: 0;
+		z-index: 1;
+		white-space: nowrap;
+		padding: 10px;
+		overflow: hidden;
+		text-overflow: ellipsis;
+	}
+
+	.screen-swiper {
+		/* min-height: 375rpx; */
+	}
+
+	.screen-swiper image,
+	.screen-swiper video,
+	.swiper-item image,
+	.swiper-item video {
+		width: 100%;
+		display: block;
+		height: 100%;
+		margin: 0;
+		pointer-events: none;
+	}
+
+	.card-swiper {
+		height: 126px !important;
+	}
+
+	.card-swiper swiper-item {
+		/* width: 610rpx !important; */
+		/* left: 0rpx; */
+		box-sizing: border-box;
+		/* padding: 40rpx 0rpx 70rpx; */
+		overflow: initial;
+	}
+
+	.card-swiper swiper-item .swiper-item {
+		width: 100%;
+		display: block;
+		height: 100%;
+		border-radius: 10rpx;
+		-webkit-transform: scale(0.9);
+		transform: scale(0.9);
+		-webkit-transition: all 0.2s ease-in 0s;
+		transition: all 0.2s ease-in 0s;
+		overflow: hidden;
+	}
+
+	.card-swiper swiper-item .swiper-item .pic {
+		width: 100%;
+		/* height: 100%; */
+	}
+
+	.card-swiper swiper-item.cur .swiper-item {
+		-webkit-transform: none;
+		transform: none;
+		-webkit-transition: all 0.2s ease-in 0s;
+		transition: all 0.2s ease-in 0s;
+	}
+
+
+	.item-duo-style3 .swiper-item .pic{
+		height: 100px;
+	}
+
+	.item-duo-style3 .swiper-item .txt {
+	/* 	position: absolute;
+		left: 0;
+		bottom: 0; */
+		z-index: 1;
+		white-space: nowrap;
+		padding: 10px;
+		overflow: hidden;
+		text-overflow: ellipsis;
+	}
+	
+	
+</style>

+ 143 - 0
diy/module/getPhone.vue

@@ -0,0 +1,143 @@
+<template>
+	<view>
+		<block v-if="systemInfo.is_vip == 1">
+			<!-- #ifdef MP-WEIXIN -->
+			<block v-if="userInfo.mobile">
+				<view hover-class="none" class="home-btn" @click="onGetphone">
+					<image src="https://zxzhdc.zx-xcx.com/dining/home6.png"></image>
+				</view>
+			</block>
+			<block v-else>
+				<button hover-class="none" class="home-btn" open-type="getPhoneNumber"
+					@getphonenumber="onGetphoneNumber">
+					<image src="https://zxzhdc.zx-xcx.com/dining/home6.png"></image>
+				</button>
+			</block>
+			<!-- #endif -->
+			<!-- #ifdef MP-ALIPAY -->
+			<view @click="onGetphone" class="home-btn">
+				<image src="https://zxzhdc.zx-xcx.com/dining/home6.png"></image>
+			</view>
+			<!-- #endif -->
+		</block>
+		<Vphone :getPhonePop="getPhonePop" @close="setClose"></Vphone>
+	</view>
+</template>
+<script>
+	import {
+		mapState,
+		mapMutations
+	} from 'vuex'
+	let hideLoading = true;
+	import Vphone from '@/components/v-phone/v-phone.vue';
+	
+	// #ifdef MP-ALIPAY
+	// const {
+	// 	requestSubscribeMessage
+	// } = requirePlugin('subscribeMsg');
+	// #endif
+	
+	export default {
+		data() {
+			return {
+				getPhonePop: false
+			}
+		},
+		components: {
+			Vphone
+		},
+		computed: {
+			...mapState(['systemInfo', 'setColor', 'store_id', 'userInfo', 'teen_index', 'address'])
+		},
+		methods: {
+
+			onGetphoneNumber(e) {
+				if (this.userInfo.mobile) {
+					uni.showToast({
+						title: "您已经完善过会员信息了,无需重复操作!",
+						icon: 'none'
+					})
+					return
+				}
+				// #ifdef MP-WEIXIN
+				if (e.detail.errMsg == "getPhoneNumber:ok") {
+					this.$http.request('xcx/Jiemi', {
+						id: this.userInfo.id,
+						data: e.detail.encryptedData,
+						iv: e.detail.iv,
+						sessionKey: uni.getStorageSync('user_xcx_info').session_key,
+						store_id: this.store_id,
+					}, "", "", hideLoading).then(res => {
+						this.phoneNumber = res.data.phoneNumber;
+						uni.setStorageSync('phone', res.data.phoneNumber);
+						uni.showModal({
+							title: '授权成功',
+							content: '享受更多优惠!',
+							showCancel: false,
+							cancelText: '',
+							confirmText: '确定',
+							success: res => {
+								let subscribe = uni.getStorageSync('balance_subscribe');
+								uni.requestSubscribeMessage({
+									tmplIds: [subscribe.member_tid],
+									success: (r) => {},
+									complete: (r) => {
+										var pages = getCurrentPages();
+										this.$http.request('xcx/userinfo', {
+											id: this.userInfo.id,
+										}, "", "", hideLoading).then(res => {
+											if (res.code == "200") {
+												this.$store.commit('SET_USER_INFO',
+													res.data)
+												if (pages[pages.length-1].route ==
+													"pages/creatOrder/creatOrder"
+													) {
+													uni.redirectTo({
+														url: '/pages/creatOrder/creatOrder'
+													})
+												}
+											}
+										}).catch((res) => {
+											uni.showToast({
+												title: res.message,
+												icon: 'none'
+											})
+										});
+
+									}
+								})
+
+							},
+							fail: () => {},
+							complete: () => {}
+						});
+					})
+				} else {
+					uni.showToast({
+						title: "授权失败,请重新授权",
+						icon: 'none'
+					})
+				}
+				// #endif
+			},
+			// 子组件传参
+			setClose(e) {
+				this.getPhonePop = e;
+			},
+			// 开启会员弹窗
+			onGetphone(e) {
+				if (this.userInfo.mobile) {
+					uni.showToast({
+						title: "您已经完善过会员信息了,无需重复操作!",
+						icon: 'none'
+					})
+					return
+				}
+				this.getPhonePop = true;
+			},
+		}
+	}
+</script>
+
+<style>
+</style>

+ 406 - 0
diy/module/goods.css

@@ -0,0 +1,406 @@
+.module-item-goods {
+	margin-top: 10px;
+}
+
+.scroll-true {
+	white-space: nowrap;
+	overflow-x: auto;
+}
+
+.scroll-true .item {
+	display: inline-block;
+	width: 30%;
+	margin-right: 10px;
+}
+
+.el-scrollbar__wrap {
+	overflow-y: hidden;
+}
+
+.pic_img {
+	width: 106px;
+	height: 106px;
+}
+
+.item-goods-style1 {
+	position: relative;
+	padding: 20rpx 0;
+}
+
+.module-item-goods {
+	margin-top: 10px;
+	position: relative;
+}
+
+.module-item-goods .mg0 {
+	margin-top: 0;
+}
+
+.module-item-goods .item-goods-con {
+	position: relative;
+	overflow: hidden;
+}
+
+.module-item-goods .noadd {
+	height: 200px;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	width: 100%;
+}
+
+.module-item-goods .item-goods-style1 {
+	position: relative;
+	z-index: 1;
+	display: flex;
+	flex-wrap: wrap;
+	justify-content: space-between;
+	padding: 10px;
+	padding-top: 0;
+	overflow: hidden;
+}
+
+.module-item-goods .item-goods-style1.style2 .item {
+	width: calc(100%/2 - 5px);
+	background: #FFFFFF;
+}
+
+.module-item-goods .item-goods-style1.style2 .item .yh {
+	font-size: 10px;
+}
+
+.module-item-goods .item-goods-style1.style2 .item .price span b {
+	font-size: 12px;
+}
+
+.module-item-goods .item-goods-style1.style2 .item .price span i {
+	font-size: 10px;
+}
+
+.module-item-goods .item-goods-style1 .item {
+	width: 100%;
+	margin-top: 12px;
+	border-radius: 3px;
+	position: relative;
+	overflow: hidden;
+}
+
+.module-item-goods .item-goods-style1 .item .pic {
+	overflow: hidden;
+	position: relative;
+	height: 150px;
+}
+
+.module-item-goods .item-goods-style1 .item .pic image {
+	object-fit: cover;
+	display: block;
+	height: 100%;
+	width: 100%;
+}
+
+.module-item-goods .item-goods-style1 .item .pic span {
+	background: red;
+	color: #fff;
+	padding: 2px 5px;
+	border-bottom-right-radius: 5px;
+	position: absolute;
+	left: 0;
+	top: 0;
+}
+
+.module-item-goods .item-goods-style1 .item .c {
+	padding: 0 5px;
+}
+
+.module-item-goods .item-goods-style1 .item .tit {
+	white-space: nowrap;
+	padding-top: 5px;
+	font-size: 14px;
+	overflow: hidden;
+	text-overflow: ellipsis;
+}
+
+.module-item-goods .item-goods-style1 .item .yh {
+	display: flex;
+	overflow: hidden;
+	justify-content: space-between;
+	align-items: center;
+	color: #999;
+	margin-top: 5px;
+}
+
+.module-item-goods .item-goods-style1 .item .yh span {
+	padding: 2px 5px;
+	background: #F73E44;
+	color: #fff;
+	font-size: 12px;
+}
+
+.module-item-goods .item-goods-style1 .item .yh label {
+	flex: 1;
+	overflow: hidden;
+	text-align: right;
+}
+
+.module-item-goods .item-goods-style1 .item .price {
+	/* padding-top: 5px; */
+	color: #666; 
+	display: flex;
+	/* overflow: hidden; */
+	justify-content: space-between;
+	align-items: center;
+	margin-right: 6rpx;
+}
+
+.module-item-goods .item-goods-style1 .item .price span {
+	flex: 1;
+	overflow: hidden;
+}
+
+.module-item-goods .item-goods-style1 .item .price span b {
+	font-size: 14px;
+	color: #F73E44;
+}
+
+.module-item-goods .item-goods-style1 .item .price span i {
+	color: #bfbfbf;
+	font-style: normal;
+	padding-left: 5px;
+	text-decoration: line-through;
+}
+
+.module-item-goods .item-goods-style1 .item .price .car-goods {
+	padding: 5px;
+	/* background: #F73E44; */
+	color: #F73E44;
+	border-radius: 4rpx;
+	font-size: 36rpx;
+}
+
+.module-item-goods .item-goods-style1 .item .ju {
+	padding-top: 5px;
+	color: #999;
+	font-size: 11px;
+	white-space: nowrap;
+	overflow: hidden;
+	text-overflow: ellipsis;
+}
+
+.goods-num-block .num {
+	color: #000000;
+	padding: 0 6rpx;
+}
+
+.spec-btn {
+	height: 60rpx;
+	padding: 0 30rpx;
+	background-color: #ff6565;
+	border-radius: 30rpx;
+	color: #fff;
+	font-size: 26rpx;
+	line-height: 60rpx;
+	position: relative;
+}
+
+.spec-btn .spec-num {
+	/* display: inline-block; */
+	height: 35rpx;
+	width: 35rpx;
+	box-sizing: border-box;
+	border-radius: 120rpx;
+	background-color: red;
+	color: #fff;
+	/* padding: 0 10rpx; */
+	/* line-height: 40rpx; */
+	font-size: 22rpx;
+	position: absolute;
+	right: -7rpx;
+	top: -7rpx;
+}
+
+
+/* 弹窗 */
+.mask {
+	width: 100vw;
+	height: 100vh;
+	background: rgba(0, 0, 0, 0.8);
+	position: fixed;
+	left: 0;
+	top: 0;
+	z-index: 999;
+}
+
+.pop-block {
+	width: 660rpx;
+	background: #fff;
+	border-radius: 20rpx;
+	overflow: hidden;
+	position: relative;
+}
+
+.pop-block .title {
+	font-size: 34rpx;
+	color: #555;
+	line-height: 50rpx;
+	padding-top: 30rpx;
+	text-align: center;
+	font-weight: 500;
+	margin-bottom: 20rpx;
+}
+
+
+.pop-block .content-block {
+	max-height: 60vh;
+}
+
+.content-tel {
+	padding: 20rpx 40rpx;
+}
+
+.content-tel-bor {
+	border-bottom: 1rpx solid #F1F1F1;
+	margin-left: 10rpx;
+}
+
+.content-tel-bor-input {
+	font-size: 26rpx;
+}
+
+.pop-block .content {
+	padding: 0 30rpx;
+}
+
+//
+//公告弹窗
+.notice-pop .sub-btn {
+	height: 80rpx;
+	line-height: 80rpx;
+	text-align: center;
+	font-size: 32rpx;
+	color: $theme-color;
+	border-top: 1rpx solid #efefef;
+	margin-top: 30rpx;
+}
+
+.notice-pop .content {
+	font-size: 30rpx;
+	line-height: 1.5;
+	color: #555;
+	text-align: center;
+}
+
+// 规格弹窗
+.spec-pop .content .spec-cat-title {
+	font-size: 32rpx;
+	font-weight: 500;
+}
+
+.spec-pop .content .spec-list {
+	padding: 10rpx 0 30rpx;
+	flex-flow: row wrap;
+	align-content: flex-start;
+}
+
+.spec-pop .content .spec-list .spec-item {
+	font-size: 26rpx;
+	padding: 10rpx 20rpx;
+	border: 1rpx solid #eee;
+	border-radius: 8rpx;
+	margin-top: 15rpx;
+	margin-right: 10rpx;
+}
+
+.spec-pop .content .spec-list .spec-item.active {
+	background-color: $theme-color;
+	border-color: $theme-color;
+	color: #fff;
+}
+
+
+.spec-close-btn {
+	display: block;
+	width: 64rpx;
+	height: 64rpx;
+	margin-top: 40rpx;
+}
+
+.spec-pop .btm-block {
+	padding: 20rpx 30rpx;
+	background-color: #eee;
+}
+
+.spec-pop .btm-block .price {
+	font-size: 40rpx;
+	font-weight: bold;
+	color: #ff6565;
+}
+
+.spec-pop .btm-block .unit {
+	font-size: 26rpx;
+	color: #666;
+}
+
+.spec-pop .choose-spec-list {
+	font-size: 26rpx;
+	color: #666;
+	margin-left: 20rpx;
+	margin-right: 20rpx;
+}
+
+.spec-pop .btm-block .add-car-btn {
+	margin-left: auto;
+	height: 60rpx;
+	font-size: 28rpx;
+	color: #fff;
+	background-color: $theme-color;
+	font-weight: bold;
+	line-height: 60rpx;
+	text-align: center;
+	padding: 0 20rpx;
+	border-radius: 30rpx;
+	min-width: 200rpx;
+}
+
+.spec-pop .btm-block .goods-num-block {
+	margin-left: auto;
+	height: 60rpx;
+}
+
+.spec-pop .btm-block .goods-num-block .num-btn {
+	flex: none;
+	width: 42rpx;
+	height: 42rpx;
+	// border: 1rpx solid $theme-color;
+	border-radius: 50%;
+	position: relative;
+	font-size: 42rpx;
+}
+
+.spec-pop .btm-block .goods-num-block .num {
+	flex: none;
+	min-width: 60rpx;
+	text-align: center;
+	font-size: 26rpx;
+	font-weight: 500;
+	color: #555;
+}
+
+.rebate-border {
+	border: 1rpx solid #ff6565;
+	border-radius: 4rpx;
+	font-size: 20rpx;
+	display: inline-block;
+	padding: 2rpx 4rpx;
+	color: #ff6565;
+}
+
+.many_rebate {
+	color: red;
+	text-align: right;
+}
+
+.textDecoration {
+	text-decoration: line-through;
+	color: #999999;
+	font-size: 20rpx;
+}

+ 562 - 0
diy/module/goods.vue

@@ -0,0 +1,562 @@
+<template>
+	<div class="module-item-goods" :style="!module.base.m ? 'margin-top:0' : ''" v-if="goodsList.length>0">
+		<div class="item-goods-con" :style="style">
+			<moduleBg :base="module.base" />
+			<moduleTwtit :type="module.type" :title="module.title" v-if="module.title.s" />
+			<div class="item-goods-style1" :class="module.base.s == 1 ? 'style2' : ''">
+				<div class="item" v-for="(item, index) in goodsList" :key="index">
+					<div class="pic"  @click="$util.openGoods(module.list,index)">
+						<image :src="url+item.cm.thumb"  />
+						<template v-if="module.base.sth">
+							<span v-if="item.cm.isPreferential === 1 && item.cm.type === 1">特惠</span>
+							<span v-if="item.cm.isBuyGive === 1 && item.cm.type === 1">买赠</span>
+						</template>
+					</div>
+					<div class="c">
+						<div class="tit" v-if="module.base.t.s">
+							<moduleText :text="module.base.t" :type="module.type" :name="item.cm.name" /></div>
+						<div class="price" v-if="module.base.sjg || module.base.sgm">
+							
+							<template v-if="module.base.sjg">
+								<span>
+									<b>¥{{ item.cm.price }}</b>
+								</span>
+								<span v-if="item.cm.type == 2">
+									<b>{{ item.cm.priceDescribe }}</b>
+								</span>
+							</template>
+							
+							<block v-if="systemInfo.set.is_cart==1">
+								<view v-if="module.base.sgm && item.cm.stock > 0">
+										<view class="flex flex-x-end flex-y-center">
+											<view class="spec-btn"
+												v-if="item.cm.is_gg == 2" @click="showSpec(item.cm.id)">
+												选规格<view class="spec-num flex-center" v-if="item.cm.num>0">{{item.cm.num}}</view>
+											</view>
+											
+											<view class="goods-num-block flex flex-x-end flex-y-center" v-else
+												:style="{color:setColor}">
+												<view class="car-goods iconfont icon-jian1"
+													@click="changeNum(item.cm.category_id,item.cm.id,1,'goods','',item.cm.price,item.cm.many_rebate,item.cm.is_rebate)"
+													v-if="item.cm.num>0"></view>
+												<view class="num" v-if="item.cm.num>0">{{item.cm.num}}</view>
+												<view class="car-goods iconfont icon-jia1 gdsf"
+													@click="changeNum(item.cm.category_id,item.cm.id,2,'goods','',item.cm.price,item.cm.many_rebate,item.cm.is_rebate)">
+												</view>
+											</view>
+										</view>
+										
+										<view class="flex-y-center">
+											<view class="price" v-if="item.cm.is_rebate==1 && item.cm.rebate">
+												<view class="rebate-border">
+													{{item.cm.rebate}}
+												</view>
+											</view>
+			
+											<view class="ft24 many_rebate" v-if="item.cm.many_rebate>0 && item.cm.is_rebate==1">
+												{{item.cm.many_rebate}}{{item.cm.unit}}起购
+											</view>
+										</view>
+								</view>
+							</block>
+							
+							<block v-else>
+								<view @click="$util.openGoods(module.list,index)" class="car-goods iconfont icon-gouwuche2" v-if="module.base.sgm && item.cm.stock > 0"></view>
+							</block>
+							
+						</div>
+					</div>
+				</div>
+			</div>
+		</div>
+		
+         <block v-if="systemInfo.set.is_cart==1">
+	     	<shopping-car :carNum="carNum" :isDistance="is_distance" :navBtn="false" 
+					:deliveryPrice="delivery_price" :carTotal="carTotal" :carGoods="carGoods" :userInfo="userInfo"
+					 @choosebag="choosebag" :checked="pocket"/>
+		</block>
+		
+		<view class="mask flex flex-column flex-nowarp flex-x-center flex-y-center" v-show="maskPop">
+			<!-- 规格弹窗 -->
+			<block v-if="specPop">
+				<view class="pop-block spec-pop">
+					<view class="title">{{goodsDetail.name}}</view>
+					<scroll-view scroll-y="true" class="content-block">
+						<view class="content">
+							<block v-for="(item,index) in goodsDetail.edit_value" :key="index">
+								<view class="spec-cat-title">
+									<text>{{item.spec_name}}</text>
+									<text style="font-size:24rpx;color:#aaa">(仅单选)</text>
+								</view>
+								<view class="spec-list flex">
+									<view v-for="(spec,specIndex) in item.spec" :key="specIndex"
+										@click="chooseSpec(index,specIndex)"
+										:class="['spec-item',spec.active?'active':'']"
+										:style="[spec.active?{'background-color':setColor,'border-color':setColor}:'']">
+										{{spec.name}}
+										<block v-if="spec.price">¥{{spec.price}}</block>
+									</view>
+								</view>
+							</block>
+						</view>
+					</scroll-view>
+					<view class="btm-block flex flex-y-baseline flex-nowarp">
+						<view class="flex flex-nowarp flex-y-baseline">
+							<view class="price">¥{{goodsDetail.spec_price}}</view>
+							<view class="unit">/{{goodsDetail.unit}}</view>
+						</view>
+						<view class="choose-spec-list text-3" v-if="goodsDetail.specName">
+							({{goodsDetail.specName}})</view>
+						<block>
+							<view class="add-car-btn" :style="{'background-color':setColor}"
+								v-if="goodsDetail.num == 0"
+								@click="changeNum(goodsDetail.category_id,goodsDetail.id,2,'spec',goodsDetail.many_rebate,goodsDetail.is_rebate)">
+								加入购物车</view>
+							<view class="goods-num-block flex flex-x-end flex-y-center" v-else
+								:style="{color:setColor}">
+								<view class="num-btn num-btn-1 iconfont icon-jian1"
+									@click="changeNum(goodsDetail.category_id,goodsDetail.id,1,'spec',goodsDetail.many_rebate,goodsDetail.is_rebate)">
+								</view>
+								<view class="num">{{goodsDetail.num}}</view>
+								<view class="num-btn num-btn-2 iconfont icon-jia1"
+									@click="changeNum(goodsDetail.category_id,goodsDetail.id,2,'spec',goodsDetail.many_rebate,goodsDetail.is_rebate)">
+								</view>
+							</view>
+						</block>
+					</view>
+				</view>
+				<image src="/static/icon_5.png" mode="aspectFit" class="spec-close-btn" @click="showSpec"></image>
+			</block>
+		</view>
+			
+	</div>
+</template>
+<script>
+import moduleBg from './bg.vue';
+import moduleText from './text.vue';
+import moduleTwtit from './twtit.vue';
+// import SelectGoods from '@/views/attr/selectGoods.vue';
+import shoppingCar from '@/components/shoppingCar.vue';
+import { mapState } from 'vuex';
+export default {
+	props: ['module'],
+	components: { moduleBg, moduleText,moduleTwtit,shoppingCar},
+	data() {
+		return {
+			goodsList:this.module.list,
+			 showSelectGoods:false,
+			 url:getApp().globalData.URL,
+			carGoods: [], //购物车商品
+			carTotal:0,
+			is_distance:0,
+			delivery_price:0,
+			carNum:0,
+			specPop: false,
+			maskPop:false,
+			goodsDetail:null,
+			pocket:1
+		};
+	},
+
+	computed: {
+		...mapState(['systemInfo', 'store_id', 'userInfo', 'setColor','table_id','vx_carGoods','teen_index', 'address',]),
+		style() {
+			if (this.module.base.fc != '') {
+				return `color:${this.module.base.fc}`;
+			}
+		},
+		dateRanges() {
+			const {
+				store_id,
+				userInfo,
+			} = this;
+			return {
+				store_id,
+				userInfo,
+			}
+		},
+	},
+	
+    watch:{	
+		vx_carGoods(nVal){
+			
+			console.log(nVal,"goods")
+			
+			if (nVal) {
+				this.getCarList();
+				this.getDeliveryPrice();
+			}
+		},
+      // 弹窗校检
+      dateRange: {
+      	handler(val) {
+			this.getCarList();
+		  }
+	   }
+	},
+	
+	mounted() {
+		if(this.userInfo && this.store_id ){
+			this.getCarList();
+		}
+	},
+	
+	methods: {
+		choosebag(index) {
+			this.pocket = index;
+		},
+		
+		// 获取配送费
+		getDeliveryPrice() {
+			this.$http.request('xcx/getDeliveryPrice', {
+				lat: this.address.lat || '',
+				lng: this.address.lng || '',
+				store_id: this.store_id,
+			}, "", "", true).then(res => {
+		
+				let distance = Number(res.data.distance);
+				if (distance) {
+					if (!distance) {
+						this.is_distance = 2;
+						return
+					}
+					this.delivery_price = Number(res.data.delivery_price);
+					if (!this.systemInfo.set.number || !distance) {
+						this.is_distance = 1;
+						return
+					}
+					// 如果大于商家距离is_distance = 2 提出超出距离
+					if (distance > this.systemInfo.set.number) {
+						this.is_distance = 2;
+					} else {
+						this.is_distance = 1;
+					}
+				} else {
+					this.is_distance = 3;
+				}
+			}).catch(err => {})
+		},
+		
+		/**
+			 * 改变商品数量
+			 * @category_id:分类id
+			 * @goods_id:商品id
+			 * @type:1减少 2增加
+			 * @data_from 购物车列表传 'car' 规格弹窗传 'spec' 无规格传 'goods' 否则不传
+			 * @car_index 购物车下标 data_form = 'car'传
+			 * @goods_price 商品价格 data_from = 'goods' 传
+			 * */
+		changeNum(category_id, goods_id, type, data_from, car_index, goods_price, many_rebate = '', is_rebate = '',
+				idx = '') {
+				/* pocket 购物口袋
+				  goodsList 数据列表
+				  idx 如果是有从购物车加入 */
+				let money = 0,
+					pocket = this.pocket,
+					carGoods,
+					num = 0,
+					spec = '',
+					new_list = this.new_list,
+					carItem = false;
+				carGoods = this.carGoods;
+				pocket = idx === '' ? pocket : idx;
+				if (type == 2) {
+					for (let i of new_list) {
+						if (i.pocket == pocket) {
+							carGoods = i.list;
+						}
+					}
+				}
+				
+				if (type == 1) {
+					function getData(new_list,pocket,goods_id) {
+	                    let as = false
+						for (let i of new_list) {
+							for(let j of i.list){	
+								if (i.pocket == pocket && j.goods_id == goods_id) {
+									  as = true
+								}
+							}
+						}
+						return as	
+					}
+					// 判断当前选中的购物口袋是否选中并且还有产品
+					let isAllStudentType = getData(new_list,pocket,goods_id)
+					if (isAllStudentType) {
+						for (let i of new_list) {
+						  if (i.pocket == pocket) {
+						        carGoods = i.list;
+						   }
+						}
+					} else {
+						for (let i of new_list) {
+							for (let j of i.list) {
+								if (j.goods_id == goods_id) {
+									pocket = i.pocket
+									carGoods = i.list
+								}
+							}
+						}
+					}
+				}
+				if (data_from == 'car') {
+					//购物车规格
+					carItem = carGoods[car_index]
+					spec = carItem.spec || ''
+					money = carItem.price
+				} else if (data_from == 'spec') {
+					let specArr = []
+					let specList = this.goodsDetail.edit_value
+					for (let i in specList) {
+						for (let j in specList[i].spec)
+							if (specList[i].spec[j].active) {
+								specArr.push(specList[i].spec_name + ':' + specList[i].spec[j].name)
+								break
+							}
+					}
+					if (specArr.length != specList.length) {
+						uni.showToast({
+							title: "请选择规格",
+							icon: 'none'
+						})
+						return false
+					} else {
+						spec = specArr.join(',')
+						money = this.goodsDetail.spec_price
+					}
+				} else if (data_from == 'goods') {
+					//无规格商品
+					spec = ''
+					money = goods_price
+				}
+				if (data_from != 'car') {
+					for (let i in carGoods) {
+						if (carGoods[i].goods_id == goods_id && carGoods[i].spec == spec) {
+							carItem = carGoods[i]
+							break
+						}
+					}
+				}
+				num = carItem ? carItem.num : 0
+				if (type == 1) {
+					if (num > 0) {
+						// 起购
+						if (many_rebate > 0 && is_rebate == 1) {
+							if (many_rebate >= num) {
+								num = num - many_rebate;
+							} else {
+								num--;
+							}
+						} else {
+							num--
+						}
+					} else {
+						return false
+					}
+				} else if (type == 2) {
+					// 起购
+					if (many_rebate > 0 && is_rebate == 1) {
+						if (many_rebate <= num) {
+							num++
+						} else {
+							num = num + many_rebate;
+						}
+					} else {
+						num++
+					}
+				} else {
+					return false
+				}
+
+				let datas = {
+					user_id: this.userInfo.id,
+					category_id: category_id, //分类id
+					goods_id: goods_id, //是	string	商品id
+					num: num <= 0 ? 0 : num, //是	string	购买数量
+					table_id: this.table_id, //是	string	桌号
+					spec: spec, //是	string	规格(json),有的传
+					money: money,
+					group: this.table_id,
+					type: 'add_cart',
+					store_id: this.store_id,
+					pocket: pocket
+				}
+				if (this.systemInfo.is_qian_many == 1 && app.globalData.readyReset == 1) {
+					app.sendSocketMessage(JSON.stringify(datas)).then(res => {
+						this.number = num;
+					})
+				} else {
+					this.$http.request('xcx/add_cart', datas, 'POST', false, true).then(res => {
+						if (res.data.list.length == 0 && data_from == 'car') {
+							this.pocket =1
+							this.maskPop = false
+							this.carGoodsPop = false
+						}
+						let arr = this.$utils.removal(res.data.list)
+						this.new_list = res.data.new_list;
+						this.computGoodsNum(arr, res.data.total_price, num, res.data.new_list)
+					}).catch(err => {})
+				}
+			},
+			//获取购物车数据
+			getCarList() {
+				var url = 'xcx/cart_list',
+					datas;
+			        datas = {
+						user_id: this.userInfo.id,
+						store_id: this.store_id,
+				   }
+				this.$http.request(url, datas, "", "", true).then(res => {
+					if(res.data.list<=0){
+						this.pocket = 1
+					}
+					let arr = this.$utils.removal(res.data.list)
+					this.new_list = res.data.new_list;
+					this.computGoodsNum(arr, res.data.total_price, 0, res.data.new_list)
+					this.isloading = false;
+				}).catch(err => {})
+			},
+
+			//根据购物车列表计算购物车数据
+			computGoodsNum(list, total_price, spec_num, new_list = []) {
+
+					if (this.goodsList.length <= 0) {
+						return
+					}
+					let num = 0
+					//计算商品数量
+					let goodsList = this.goodsList;
+					for (let i in goodsList) {
+						goodsList[i].cm.num = 0
+					}
+					for (let i in list) {
+						num += list[i].num
+						for (let j in goodsList) {
+							if (list[i].goods_id == goodsList[j].cm.id) {
+								goodsList[j].cm.num += list[i].num
+								break
+							}
+						}
+					}
+					this.goodsList = goodsList
+					this.carNum = num
+					this.carGoods = new_list
+					this.carTotal = total_price
+					if (this.detailPop || this.specPop) {
+						this.goodsDetail.num = spec_num
+					}
+			
+			},
+
+			//清空购物车
+			clearCar() {
+				console.log("clearCar")
+				this.pocket = 1
+				this.new_list = []
+				this.carGoods = []
+				this.$store.commit('SET_CARGOODS', []) //监听购物车是否有变化
+				this.carNum = 0
+				this.carTotal = 0
+				this.maskPop = false
+				this.carGoodsPop = false
+				let goodsList = this.goodsList
+				for (let i in goodsList) {
+					goodsList[i].cm.num = 0
+				}
+				this.goodsList = goodsList
+			},
+
+			//显示规格弹窗
+			showSpec(goods_id) {
+				if (this.specPop) {
+					this.maskPop = false
+					this.specPop = false
+					return false
+				}
+				this.$http.request('xcx/goodinfo', {
+					goods_id: goods_id
+				}, "", "", true).then(res => {
+					let info = res.data.goods
+					let edit_value = info.edit_value
+					for (let i in edit_value) {
+						for (let j in edit_value[i].spec) {
+							edit_value[i].spec[j] = {
+								'name': edit_value[i].spec[j],
+								active: false
+							}
+						}
+					}
+					info.edit_value = edit_value
+					info.spec_price = info.price
+					info.num = 0
+					info.specName = ""
+					this.goodsDetail = info
+					this.maskPop = true
+					this.specPop = true
+				}).catch(err => {})
+			},
+			
+			//选择规格
+			chooseSpec(index, specIndex) {
+				let spec = this.goodsDetail.edit_value[index].spec
+				for (let i in spec) {
+					if (i == specIndex) {
+						spec[i].active = true
+					} else {
+						spec[i].active = false
+					}
+				}
+				this.goodsDetail.edit_value[index].spec = spec
+				this.goodsDetail.num = 0
+				this.computSpecPrice()
+			},
+			//计算规格价格
+			computSpecPrice() {
+				let edit_value = this.goodsDetail.edit_value
+				let specNameArr = [],
+					carSpecArr = []
+				for (let i in edit_value) {
+					for (let j in edit_value[i].spec) {
+						if (edit_value[i].spec[j].active) {
+							specNameArr.push(edit_value[i].spec[j].name)
+							carSpecArr.push(edit_value[i].spec_name + ':' + edit_value[i].spec[j].name)
+							break
+						}
+					}
+				}
+				let specName = specNameArr.join(":")
+				this.goodsDetail.specName = specNameArr.join(',')
+				let spec = this.goodsDetail.spec
+				for (let i in spec) {
+					if (spec[i].spec == specName) {
+						this.goodsDetail.spec_price = this.userInfo.is_vip == 1 ? spec[i].growth : spec[i].growth
+						break
+					}
+				}
+				let carGoods = this.carGoods
+				carSpecArr = carSpecArr.join(",")
+				for (let i in carGoods) {
+					if (this.goodsDetail.id == carGoods[i].goods_id && carSpecArr == carGoods[i].spec) {
+						this.goodsDetail.num = carGoods[i].num
+						break
+					}
+				}
+			},
+	}
+};
+</script>
+
+<style>
+	@import url("./goods.css");
+	.many_rebate {
+		color: red;
+		text-align: right;
+	}
+	
+	.textDecoration {
+		text-decoration: line-through;
+		color: #999999;
+		font-size: 20rpx;
+	}
+	
+</style>

+ 175 - 0
diy/module/miaosha.vue

@@ -0,0 +1,175 @@
+<template>
+	<div class="flex-grow-1">
+		<div class="flex-grow-1 box-pack-between flex-y-center">
+			<div class="flex-grow-0">
+				<!-- {{rest_time}} -->
+				<block>
+					<div class='flex-y-center miaosha-time-item'>
+						<div class="miaosha-time-item-name">{{miaosha_name}}</div>
+						<view class="time flex">
+								<div v-if="times.d" class='flex-y-center flex-x-center'>{{(times.d?times.d:"00")}}:
+								</div>
+								<div  class='flex-y-center flex-x-center'>{{(times.h?times.h:"00")}}: </div>
+								<div class='flex-y-center flex-x-center'>{{(times.m?times.m:"00")}}:</div>
+								<div class='flex-y-center flex-x-center'>{{(times.s?times.s:"00")}} </div>
+						</view>
+					</div>
+				</block>
+			</div>
+			<div class="flex-y-center ft26 col" v-if='times.m && times.h' @click="navList">
+				<span>更多</span>
+				<text class="iconfont icon-jiantou" style="font-size: 26rpx;"></text>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	import $util from '@/utils/util.js'
+	let timer = '';
+	export default {
+		name: 'moduleMiaosha',
+		props: {
+			'miaosha': {
+				type: Object,
+			},
+		},
+		data() {
+			return {
+				times: {},
+				miaosha_name: '活动已结束',
+				dateTime: {},
+			}
+		},
+
+		mounted() {
+		},
+
+		computed: {
+			timers(val) {
+				this.miaosha_name = this.miaosha.name;
+				var rest_time = this.miaosha.rest_time;
+				if (rest_time) {
+					timer = setInterval(() => {
+						rest_time = rest_time - 1;
+						if (rest_time < 0) {
+							clearInterval(timer)
+							this.miaosha_name='活动已结束'
+						}
+						this.times = $util.setTimeList(rest_time)
+					}, 1e3)
+				}
+			}
+		},
+
+		methods: {
+			navList() {
+				uni.navigateTo({
+					url: "../../miaosha/index"
+				})
+			},
+		}
+
+	};
+</script>
+
+<style>
+	.time {
+		border: 1px solid #FF0000;
+		border-left: 0;
+		padding: 2px 6px;
+
+		border-top-right-radius: 50px;
+		border-bottom-right-radius: 50px;
+	}
+
+	.miaosha-time-item-name {
+		background: #FF0000;
+		color: #fff;
+		padding: 2px 6px;
+		height: 100%;
+		border: 1px solid #FF0000;
+		border-top-left-radius: 50px;
+		border-bottom-left-radius: 50px;
+	}
+
+	.miaosha-time-item {
+		color: #FF0000;
+
+		padding: 0px 6px 0px 0px;
+		overflow: hidden;
+		margin-left: 20px;
+		font-size: 14px;
+	}
+
+	.flex {
+		display: -webkit-box;
+		display: -webkit-flex;
+		display: flex;
+	}
+
+	.flex-row {
+		display: -webkit-box;
+		display: -webkit-flex;
+		display: flex;
+		-webkit-box-orient: horizontal;
+		-webkit-flex-direction: row;
+		flex-direction: row;
+	}
+
+	.flex-col {
+		display: -webkit-box;
+		display: -webkit-flex;
+		display: flex;
+		-webkit-box-orient: vertical;
+		-webkit-flex-direction: column;
+		flex-direction: column;
+	}
+
+	.flex-grow-0 {
+		min-width: 0;
+		-webkit-box-flex: 0;
+		-webkit-flex-grow: 0;
+		-ms-flex-positive: 0;
+		flex-grow: 0;
+		-webkit-flex-shrink: 0;
+		-ms-flex-negative: 0;
+		flex-shrink: 0;
+	}
+
+	.flex-grow-1 {
+		min-width: 0;
+		-webkit-box-flex: 1;
+		-webkit-flex-grow: 1;
+		-ms-flex-positive: 1;
+		flex-grow: 1;
+		-webkit-flex-shrink: 1;
+		-ms-flex-negative: 1;
+		flex-shrink: 1;
+	}
+
+	.flex-x-center {
+		display: -webkit-box;
+		display: -webkit-flex;
+		display: flex;
+		-webkit-box-pack: center;
+		-webkit-justify-content: center;
+		-ms-flex-pack: center;
+		justify-content: center;
+	}
+
+	.flex-y-center {
+		display: -webkit-box;
+		display: -webkit-flex;
+		display: flex;
+		-webkit-box-align: center;
+		-webkit-align-items: center;
+		-ms-flex-align: center;
+		-ms-grid-row-align: center;
+		align-items: center;
+	}
+
+	.col {
+		color: #999
+	}
+</style>

+ 183 - 0
diy/module/ms_goods.vue

@@ -0,0 +1,183 @@
+<template>
+	<div class="module-item-goods" :style="!module.base.m ? 'margin-top:0' : ''" v-if="list.length>0">
+		<div class="item-goods-con" :style="style">
+			<view class="">
+				<moduleBg :base="module.base" />
+				<moduleTwtit :miaosha='miaosha' :type="module.type" :title="module.title" v-if="module.title.s" />
+			</view>
+			<div class="item-goods-style1" :class="module.base.s == 1 ? 'style2' : ''">
+				<div class="scroll-true flex-grow-1">
+					<div class="item" style="width: 30%;" v-for="(item, index) in list" :key="index"
+						@click="$util.openMsGoods(list,index)">
+						<div class="pic" style="height: auto;">
+							<image style="width: 100%;height: 212upx;" class="pic_img" :src="url+item.thumb" />
+						</div>
+						<div class="c" style="padding: 0 5px;">
+							<div class="tit" v-if="module.base.t.s">
+								<moduleText :text="module.base.t" :name="item.name" />
+							</div>
+							<div class="price" v-if="module.base.sjg ">
+								<template v-if="module.base.sjg">
+									<span>
+										<b>¥{{ item.price }}</b>
+									</span>
+								</template>
+							</div>
+							<div v-if="module.base.sgm">
+								<span style="text-decoration:line-through;color: #999" class='ft24'>
+									¥{{item.original_price }}
+								</span>
+							</div>
+						</div>
+					</div>
+				</div>
+			</div>
+			<div class="noadd" v-if="list.length == 0">
+				暂无秒杀商品
+			</div>
+		</div>
+	</div>
+</template>
+<script>
+	import moduleBg from './bg.vue';
+	import moduleText from './text.vue';
+	import moduleTwtit from './twtit.vue';
+	export default {
+		props: ['module'],
+		components: {
+			moduleBg,
+			moduleText,
+			moduleTwtit
+		},
+		data() {
+			return {
+				url: getApp().globalData.URL,
+				shopList: [],
+				t: {},
+				list: [],
+				miaosha: {},
+			};
+		},
+
+		computed: {
+			style() {
+				if (this.module.base.fc != '') {
+					return `color:${this.module.base.fc}`;
+				}
+			},
+		},
+
+		mounted() {
+			this.getGoodsList();
+		},
+
+		methods: {
+			//获取商品列表
+			getGoodsList() {
+				// console.log(this.module, "获取商品列表")
+				this.$http.request('seckill/index', {
+					store_id: this.$store.state.store_id,
+					controller: "admin",
+					page: 1,
+					limit: 8,
+				}, "", "", "").then(t => {
+					// console.log(t, "列表")
+					if (t.code == 200) {
+						var name = '',
+							times = 0;
+						var shopList = [];
+						var timestamp = Date.parse(new Date()) / 1000; //当前时间
+						if (t.data.start_time && t.data.end_time) {
+							var s_time = t.data.start_time - timestamp;
+							var end_time = t.data.end_time - timestamp;
+							if (s_time > 0) {
+								name = '活动未开始'
+								times = s_time;
+							}
+							if (s_time < 0 && end_time > 0) {
+								name = '活动进行中'
+								times = end_time;
+							}
+							if (end_time < 0) {
+								name = '活动已结束'
+								times = 0;
+							}
+							var miaosha = {
+								start_time: t.data.start_time,
+								end_time: t.data.end_time,
+								name: name,
+								rest_time: times,
+							}
+							this.module.miaosha = miaosha;
+							this.miaosha = miaosha;
+							for (let i of t.data.list) {
+								shopList.push({
+									name: i.name,
+									price: i.price,
+									original_price: i.original_price,
+									thumb: i.image_brief,
+									id: i.id
+								})
+							}
+							this.list = shopList;
+							this.module.list = shopList;
+						} else {
+							var miaosha = {
+								start_time: 0,
+								end_time: 0,
+								name: '活动已结束',
+								rest_time: 0,
+							}
+							this.module.miaosha = miaosha;
+							this.miaosha = miaosha;
+							this.list = shopList;
+							this.module.list = shopList;
+						}
+						// console.log(s_time, timestamp,this.module.miaosha,"this.module.miaosha")
+						// console.log(this.module,"this.module.list")
+					}
+
+				}).catch((function(e) {}))
+
+			},
+		},
+
+	};
+</script>
+
+<style>
+	@import url("./goods.css");
+	.module-item-goods {
+		margin-top: 10px;
+	}
+
+	.scroll-true {
+		white-space: nowrap;
+		overflow-x: auto;
+	}
+
+	.scroll-true .item {
+		display: inline-block;
+		width: 30%;
+		margin-right: 10px;
+	}
+
+	.el-scrollbar__wrap {
+		overflow-y: hidden;
+	}
+
+	.pic_img {
+		width: 106px;
+		height: 106px;
+	}
+
+	.item-goods-style1 {
+		position: relative;
+		padding: 20rpx 0;
+	}
+
+	.noadd {
+		position: relative;
+		color: #999;
+	}
+</style>

+ 78 - 0
diy/module/nav.vue

@@ -0,0 +1,78 @@
+<template>
+	<div class="module-item-nav module-common" :style="!module.base.m?'margin-top:0':''">
+		<moduleBg :base="module.base" />
+		<div class="item-nav-con" :class="module.base.c==5?'col5':''" v-if="module.base.s==0">
+			<div class="item" v-for="(item,index) in module.list" @click="$util.openAttr(module.list,index)"
+				:key='index'>
+				<template v-if="item.icon.s!=2">
+					<image mode="aspectFill" class="item-nav-img" :src="item.icon.z"
+						v-if="item.icon.s==3 && item.icon.z">
+						<image mode="aspectFill" class="item-nav-img" :src="$util.icon('img.jpg')" v-else>
+				</template>
+				<div class="item-nav-text" :style="module.base.fc!=''?'color:'+module.base.fc:''" v-if="item.text.s">
+					<moduleText :text="item.text" />
+				</div>
+			</div>
+		</div>
+	</div>
+</template>
+<script>
+	import moduleText from './text.vue'
+	import moduleBg from './bg.vue'
+	export default {
+		props: ['module'],
+		components: {
+			moduleText,
+			moduleBg
+		},
+		data() {
+			return {
+				nav: [],
+			}
+		},
+		computed: {
+
+		}
+	}
+</script>
+
+<style>
+	.module-common {
+		margin-top: 10px;
+		position: relative;
+	}
+
+	.module-item-nav .item-nav-con {
+		position: relative;
+		z-index: 1;
+		padding: 0 5px;
+		padding-bottom: 10px;
+		display: flex;
+		flex-wrap: wrap;
+	}
+
+	.module-item-nav .item-nav-con.col5 .item {
+		width: 20%;
+	}
+
+	.module-item-nav .item-nav-con .item {
+		padding-top: 12px;
+		width: 25%;
+		text-align: center;
+	}
+
+	.module-item-nav .item-nav-con .item .item-nav-img {
+		width: 55px;
+		height: 55px;
+		margin: 0 auto;
+	}
+
+	.module-item-nav .item-nav-con .item .item-nav-text {
+		font-size: 12px;
+		overflow: hidden;
+		white-space: nowrap;
+		text-overflow: ellipsis;
+		color: #333;
+		padding-top: 5px;
+	}
+</style>

+ 118 - 0
diy/module/pt_goods.vue

@@ -0,0 +1,118 @@
+<template>
+	<div class="module-item-goods" :style="!module.base.m ? 'margin-top:0' : ''" v-if="shopList.length>0">
+		<div class="item-goods-con" :style="style">
+			<view>
+				<moduleBg :base="module.base" />
+				<moduleTwtit :type="module.type" :title="module.title" v-if="module.title.s" />
+			</view>
+			
+			<div class="item-goods-style1" :class="module.base.s == 1 ? 'style2' : ''">
+				<div class="scroll-true flex-grow-1">
+					<div class="item" style="width: 30%;" v-for="(item, index) in shopList" :key="index"
+						@click="$util.openPtGoods(shopList,index)">
+						<div class="pic" style="height: auto;">
+							<image style="width: 100%;height: 212upx;" class="pic_img" :src="url+item.thumb" />
+						</div>
+						<div class="c" style="padding: 0 5px;">
+							<div class="tit" v-if="module.base.t.s">
+								<moduleText :text="module.base.t" :name="item.name" />
+							</div>
+							<div class="price" v-if="module.base.sjg ">
+								<template v-if="module.base.sjg">
+									<span>
+										<b>¥{{ item.collage_price }}</b>
+									</span>
+								</template>
+							</div>
+
+							<div v-if="module.base.sgm">
+								<span style="text-decoration:line-through;color: #999" class='ft24'>
+									¥{{item.price }}
+								</span>
+							</div>
+
+						</div>
+					</div>
+				</div>
+			</div>
+			
+			<div class="noadd" v-if="shopList.length == 0">
+				暂无拼团商品
+			</div>
+			
+		</div>
+	</div>
+</template>
+
+<script>
+	import moduleBg from './bg.vue';
+	import moduleText from './text.vue';
+	import moduleTwtit from './twtit.vue';
+	export default {
+		props: ['module'],
+		components: {
+			moduleBg,
+			moduleText,
+			moduleTwtit
+		},
+
+		data() {
+			return {
+				url: getApp().globalData.URL,
+				shopList: [],
+			};
+		},
+
+		computed: {
+			style() {
+				if (this.module.base.fc != '') {
+					return `color:${this.module.base.fc}`;
+				}
+			}
+		},
+
+		mounted() {
+			this.getGoodsList();
+		},
+
+		methods: {
+			getGoodsList() {
+				var shopList = [];
+				this.$http.request('template/collageGoodsList', {
+					store_id: this.$store.state.store_id,
+					controller: "admin",
+					page: 1,
+					limit: 6,
+				}, "", true, "").then(t => {
+					if (t.code == '200' || t.code == '0' ||t.code == 200) {
+						for (let i of t.data) {
+							shopList.push({
+								name: i.name,
+								price: i.price,
+								collage_price: i.collage_price,
+								thumb: i.thumb,
+								id: i.id,
+								collage_id: i.collage_id,
+							})
+						}
+						this.module.list = shopList;
+						this.shopList = shopList;
+						// console.log(this.module.list, "this.module.list")
+					} else {
+						this.shopList = [];
+						this.module.list = shopList;
+					}
+				})
+			},
+		},
+
+	};
+</script>
+
+<style>
+	@import url("./goods.css");
+	.noadd {
+		position: relative;
+		color: #999;
+	}
+</style>

+ 103 - 0
diy/module/store.vue

@@ -0,0 +1,103 @@
+<template>
+	<view>
+		<view class="home-store flex-y-center">
+			
+			<view class="flex-grow-1">
+				<view class="box-pack-between flex-grow-1 flex-y-center">
+					<text>{{systemInfo.title}}</text>
+					<view class="more-businessTime flex-y-center" @click="getShop"><text
+							style="margin-right: 6rpx;">更多门店</text><text class="iconfont icon-jiantou1"></text></view>
+				</view>
+				<view class="businessTime flex-grow-1 box-pack-between flex-y-center">
+					<view class="flex-grow-1">
+						<view class="businessTime businessTimeItem" v-if="systemInfo.is_rest==2 && systemInfo.time">
+							营业时间:{{systemInfo.time}}-{{systemInfo.time2}}
+						</view>
+						<view class=" box-pack-between flex-grow-1" @click="getNavigation">
+							<text class="iconfont icon-dizhi">{{systemInfo.address}}</text>
+							<text class="iconfont icon-icon-test"></text>
+						</view>
+					</view>
+				</view>
+			</view>
+			
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		mapState,
+		mapMutations
+	} from 'vuex'
+	export default {
+		data() {
+			return {
+		
+			}
+		},
+		
+		computed: {
+			...mapState(['systemInfo'])
+		},
+		methods:{
+			getShop(e) {
+				uni.navigateTo({
+					url: "../../shop/index/index"
+				})
+			},
+			
+			// 打开地图
+			getNavigation() {
+				// console.log(this.systemInfo.set.coordinates)
+				let obj = this.systemInfo.set.coordinates.split(",");
+				uni.openLocation({
+					latitude: Number(obj[0]),
+					longitude: Number(obj[1]),
+					name: this.systemInfo.title,
+					address: this.systemInfo.address,
+					success: function() {
+						console.log('success');
+					}
+				});
+			},
+		}
+	}
+</script>
+
+<style>
+	
+	.home-store {
+		font-size: 30rpx;
+		/* width: 690rpx; */
+		background-color: #FFFFFF;
+		margin: 0 auto;
+		/* height: 180rpx; */
+		margin-top: 25rpx;
+		padding: 20rpx 40rpx;
+		border-radius: 14rpx;
+		box-shadow: 0rpx 8rpx 16rpx 0rpx rgba(204, 215, 230, 0.08);
+	}
+	
+	.home-pay-title {
+		font-size: 30rpx;
+	}
+	
+	.more-businessTime {
+		font-size: 24rpx;
+	}
+	
+	.businessTime {
+		font-size: 24rpx;
+		color: #999999;
+		padding-top: 10rpx;
+	}
+	
+	.businessTimeItem {
+		margin-bottom: 10rpx;
+	}
+	
+	.businessTime .icon-dizhi {
+		font-size: 24rpx;
+	}
+</style>

+ 92 - 0
diy/module/text.vue

@@ -0,0 +1,92 @@
+<template>
+	<view class="flex-grow-1">
+		<block v-if="type==4 ||type==7 || type==8">
+			<view @click="bindCate(type,text.link.id||'')" :style="style" v-if="name==''"
+				class="box-pack-between flex-y-center border-b">
+				<text>{{ text.t }}</text>
+				<text class="iconfont icon-jiantou"></text>
+			</view>
+			<view :style="style" class="text-overflow" v-else>{{ name }}</view>
+		</block>
+		<block v-else>
+			<view :style="style" v-if="name==''">{{ text.t }}</view>
+			<view :style="style" class="text-overflow" v-else>{{ name }}</view>
+		</block>
+		<!-- {{type}} -->
+		<!-- <span :style="style" v-if="name==''">{{ text.t }}</span>
+	        <span :style="style" v-else>{{ name }}</span>-->
+	</view>
+</template>
+
+<script>
+	import store from '../../store/index.js'
+	export default {
+		name: 'moduleText',
+		props: {
+			'text': {
+				type: Object
+			},
+			'name': {
+				default: ''
+			},
+			'type': {
+				default: 1
+			},
+		},
+		computed: {
+			style() {
+				if (this.text.d) {
+					let style = `font-size:${this.text.f}px;color:${this.text.c};`;
+					if (this.text.b) {
+						style += 'font-weight:bold;';
+					}
+					if (this.text.i) {
+						style += 'font-style:italic;';
+					}
+					if (this.text.u) {
+						style += 'text-decoration:underline;';
+					}
+					return style;
+				}
+			}
+		},
+
+		methods: {
+			bindCate(type, id) {
+				console.log(id, type, "id")
+				if (type == 4) {
+					store.commit('SET_CATE_ID', id || '')
+					uni.switchTab({
+						url: "../../pages/index/index"
+					})
+				}
+				if (type == 7) {
+					uni.navigateTo({
+						url: "../../pintuan/list"
+					})
+				}
+				if (type == 8) {
+					uni.navigateTo({
+						url: "../../subscribe/shopsSubscrbe"
+					})
+				}
+
+			}
+		},
+
+	};
+</script>
+<style>
+	.icon-jiantou {
+		font-size: 24rpx;
+	}
+
+	/* 	view{
+		font-size: 24rpx;
+	} */
+	.text-overflow {
+		overflow: hidden;
+		text-overflow: ellipsis;
+		white-space: nowrap;
+	}
+</style>

+ 41 - 0
diy/module/title.vue

@@ -0,0 +1,41 @@
+<template>
+	<navigator :url="title.link.n" @click="$util.openOnly(title.link)" class="module-item-title" >
+		<div class="tit">
+			<moduleText :text="title.t" />
+		</div>
+		<div class="mo flex-y-center" v-if="title.m.s">
+			<moduleText :text="title.m" />
+			<!-- <text class="iconfont icon-jiantou"></text> -->
+		</div>
+	</navigator>
+</template>
+
+<script>
+	import moduleText from './text.vue'
+	export default {
+		name: 'moduleTitle',
+		props: ['title'],
+		components: {
+			moduleText
+		}
+	}
+</script>
+<style>
+	 .module-item-title {
+	  background: #fff;
+	  position: relative;
+	  z-index: 1;
+	  font-size: 14px;
+	  padding: 14px 12px;
+	  border-bottom: 1px solid #eee;
+	  display: flex;
+	  justify-content: space-between;
+	  align-items: center;
+	}
+	 .module-item-title .mo {
+	  color: #666;
+	}
+.icon-jiantou{
+	font-size: 20rpx;
+}
+</style>

+ 81 - 0
diy/module/tuijian.vue

@@ -0,0 +1,81 @@
+<template>
+	<div class="module-item-tuijian" :style="!module.base.m ? 'margin-top:0' : ''">
+		<div class="item-tuijian-con">
+			<moduleBg :base="module.base" />
+			<moduleTwtit :title="module.title" v-if="module.title.s" />
+			<!--样式一-->
+			<div class="item-tuijian-style1" v-if="module.base.s == 0">
+				<div class="item" v-for="(item,index) in module.list" @click="$util.openAttr(module.list,index)" :key="index">
+					<p v-if="item.img"><image  mode="aspectFill" :src="item.img"  /></p>
+					<p v-else><image  mode="aspectFill" :src="$util.icon('img.jpg')" alt=""></p>
+					<div class="note" v-if="module.note.s"><moduleText :text="module.note" :name="item.m" /></div>
+				</div>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script>
+import moduleBg from './bg.vue';
+import moduleText from './text.vue';
+import moduleTwtit from './twtit.vue';
+export default {
+	props: ['module'],
+	components: { moduleBg, moduleText, moduleTwtit},
+	data() {
+		return {};
+	},
+	mounted() {
+			// console.log(this.module,"module")
+	},
+	watch:{
+		module(value){
+			// console.log(value,"value")
+		}
+	},
+	methods: {
+		
+	}
+};
+</script>
+
+<style>
+	 .module-item-tuijian {
+	  margin-top: 10px;
+	  position: relative;
+	}
+	 .module-item-tuijian .mg0 {
+	  margin-top: 0;
+	}
+	 .module-item-tuijian .item-tuijian-con {
+	  position: relative;
+	  overflow: hidden;
+	}
+	 .module-item-tuijian .item-tuijian-style1 {
+	  position: relative;
+	  z-index: 1;
+	  padding: 10px 0;
+	  overflow: hidden;
+	}
+	 .module-item-tuijian .item-tuijian-style1 .item {
+	  margin: 0 10px;
+	  margin-bottom: 10px;
+	  position: relative;
+	  overflow: hidden;
+	}
+	 .module-item-tuijian .item-tuijian-style1 .item image {
+	  object-fit: cover;
+	  display: block;
+	  height: 150px;
+	  width: 100%;
+	}
+	 .module-item-tuijian .item-tuijian-style1 .item .note {
+	  line-height: 18px;
+	  color: #fff;
+	  background: rgba(0, 0, 0, 0.5);
+	  position: absolute;
+	  bottom: 0;
+	  padding: 6px 10px;
+	  width: 100%;
+	}
+</style>

+ 305 - 0
diy/module/tuwen.vue

@@ -0,0 +1,305 @@
+<template>
+	<div class="module-item-tuwen" :style="!module.base.m ? 'margin-top:0' : ''">
+		<div class="item-tuwen-con">
+			<moduleBg :base="module.base" />
+			<!--开通会员样式一-->
+			<block v-if="module.link.type==3&&module.link.n=='openMenber'">
+				<!-- 已经开通会员 -->
+				<!-- #ifdef MP-WEIXIN -->
+				<block v-if="userInfo.mobile">
+					<div class="item-tuwen-style1" :style="!module.base.m ? 'padding:0':''" @click="onGetphone" v-if="module.base.s == 0">
+						<p class="tit" v-if="module.title.s">
+							<moduleText :text="module.title" />
+						</p>
+						<div class="item" :style="!module.base.m ? 'margin:0' : ''">
+							<p v-if="module.img">
+								<image :style="style" :src="module.img" />
+							</p>
+							<p v-else><img :src="$util.icon('img.jpg')" alt=""></p>
+							<div class="note" v-if="module.note.s">
+								<moduleText :text="module.note" />
+							</div>
+						</div>
+					</div>
+					<!--样式二-->
+					<div @click="onGetphone" class="item-tuwen-style2" :style="!module.base.m ? 'padding:0':''" v-if="module.base.s == 1">
+						<div class="item" :style="!module.base.m ? 'margin:0' : ''">
+							<p v-if="module.img">
+								<image :style="style" :src="module.img" />
+							</p>
+							<p v-else>
+								<image :style="style" :src="$util.icon('img.jpg')" alt="">
+							</p>
+							<p class="tit" v-if="module.title.s">
+								<moduleText :text="module.title" />
+							</p>
+							<div class="note" v-if="module.note.s">
+								<moduleText :text="module.note" />
+							</div>
+						</div>
+					</div>
+				</block>
+
+				<block v-else>
+					<!-- 样式一 -->
+					<button class="item-tuwen-style1" hover-class="none" :style="!module.base.m ? 'padding:0':''" open-type="getPhoneNumber" @getphonenumber="onGetphoneNumber"
+						v-if="module.base.s == 0">
+						<p class="tit" v-if="module.title.s">
+							<moduleText :text="module.title" />
+						</p>
+						<div class="item" :style="!module.base.m ? 'margin:0' : ''">
+							<p v-if="module.img">
+								<image :style="style" :src="module.img" />
+							</p>
+							<p v-else><img :src="$util.icon('img.jpg')" alt=""></p>
+							<div class="note" v-if="module.note.s">
+								<moduleText :text="module.note" />
+							</div>
+						</div>
+					</button>
+					<!--样式二-->
+					<button open-type="getPhoneNumber" hover-class="none" @getphonenumber="onGetphoneNumber" class="item-tuwen-style2" :style="!module.base.m ? 'padding:0':''"
+						v-if="module.base.s == 1">
+						<div class="item" :style="!module.base.m ? 'margin:0' : ''">
+							<p v-if="module.img">
+								<image :style="style" :src="module.img" />
+							</p>
+							<p v-else>
+								<image :style="style" :src="$util.icon('img.jpg')" alt="">
+							</p>
+							<p class="tit" v-if="module.title.s">
+								<moduleText :text="module.title" />
+							</p>
+							<div class="note" v-if="module.note.s">
+								<moduleText :text="module.note" />
+							</div>
+						</div>
+					</button>
+				</block>
+				<!-- #endif -->
+
+				<!-- #ifdef MP-ALIPAY -->
+				<div class="item-tuwen-style1" :style="!module.base.m ? 'padding:0':''" @click="onGetphone" v-if="module.base.s == 0">
+					<p class="tit" v-if="module.title.s">
+						<moduleText :text="module.title" />
+					</p>
+					<div class="item" :style="!module.base.m ? 'margin:0' : ''">
+						<p v-if="module.img">
+							<image :style="style" :src="module.img" />
+						</p>
+						<p v-else><img :src="$util.icon('img.jpg')" alt=""></p>
+						<div class="note" v-if="module.note.s">
+							<moduleText :text="module.note" />
+						</div>
+					</div>
+				</div>
+				<!--样式二-->
+				<div @click="onGetphone" class="item-tuwen-style2" :style="!module.base.m ? 'padding:0':''" v-if="module.base.s == 1">
+					<div class="item" :style="!module.base.m ? 'margin:0' : ''">
+						<p v-if="module.img">
+							<image :style="style" :src="module.img" />
+						</p>
+						<p v-else>
+							<image :style="style" :src="$util.icon('img.jpg')" alt="">
+						</p>
+						<p class="tit" v-if="module.title.s">
+							<moduleText :text="module.title" />
+						</p>
+						<div class="note" v-if="module.note.s">
+							<moduleText :text="module.note" />
+						</div>
+					</div>
+				</div>
+				<!-- #endif -->
+			</block>
+
+			<!-- 默认样式 -->
+			<block v-else>
+				
+				<view @click="$util.openOnly(module.link)" :style="!module.base.m ? 'padding:0':''"  
+				:url="module.link.n" class="item-tuwen-style1"  v-if="module.base.s == 0">
+					<p class="tit" v-if="module.title.s">
+						<moduleText :text="module.title" />
+					</p>
+					<div class="item"  :style="!module.base.m ? 'margin:0' : ''">
+						<p v-if="module.img">
+							<image :style="style"  :src="module.img" />
+						</p>
+						<p v-else><img  :style="style"  :src="$util.icon('img.jpg')" alt=""></p>
+						<div class="note" v-if="module.note.s">
+							<moduleText :text="module.note" />
+						</div>
+					</div>
+				</view>
+				
+				<!--样式二-->
+				<view  @click="$util.openOnly(module.link)" class="item-tuwen-style2" :style="!module.base.m ? 'padding:0':''" :url="module.link.n" v-if="module.base.s == 1">
+					<div class="item"  :style="!module.base.m ? 'margin:0' : ''">
+						<p v-if="module.img">
+							<image :style="style"  :src="module.img" />
+						</p>
+						<p v-else>
+							<image :style="style" :src="$util.icon('img.jpg')" alt="">
+						</p>
+						<p class="tit" v-if="module.title.s">
+							<moduleText :text="module.title" />
+						</p>
+						<div class="note" v-if="module.note.s">
+							<moduleText :text="module.note" />
+						</div>
+					</div>
+				</view>
+				
+				
+				
+			</block>
+		</div>
+		<Vphone :getPhonePop="getPhonePop" @close="setClose"></Vphone>
+	</div>
+</template>
+
+<script>
+	import moduleBg from './bg.vue';
+	import moduleText from './text.vue';
+	import Vphone from '@/components/v-phone/v-phone.vue';
+	let hideLoading = true;
+	import {
+		mapState,
+		mapMutations
+	} from 'vuex'
+	export default {
+		props: ['module'],
+		components: {
+			moduleBg,
+			moduleText,
+			Vphone
+		},
+		data() {
+			return {
+				getPhonePop: false,
+	
+			};
+		},
+		computed: {
+			...mapState(['systemInfo', 'setColor', 'store_id', 'userInfo', 'teen_index', 'address']),
+			style() {
+				if (this.module.note.h) {
+					let style = `height:${this.module.note.h}px;`
+					return style;
+				}
+			}
+		},
+		mounted() {
+
+		},
+		methods: {
+			// 子组件传参
+			setClose(e) {
+				this.getPhonePop = e;
+			},
+			onGetphoneNumber(e) {
+				if (this.userInfo.mobile) {
+					uni.showToast({
+						title: "您已经完善过会员信息了,无需重复操作!",
+						icon: 'none'
+					})
+					return
+				}
+				// #ifdef MP-WEIXIN
+				if (e.detail.errMsg == "getPhoneNumber:ok") {
+					this.$http.request('xcx/Jiemi', {
+						id: this.userInfo.id,
+						data: e.detail.encryptedData,
+						iv: e.detail.iv,
+						sessionKey: uni.getStorageSync('user_xcx_info').session_key,
+						store_id: this.store_id,
+					}, "", "", hideLoading).then(res => {
+						this.phoneNumber = res.data.phoneNumber;
+						uni.setStorageSync('phone', res.data.phoneNumber);
+						uni.showModal({
+							title: '授权成功',
+							content: '享受更多优惠!',
+							showCancel: false,
+							cancelText: '',
+							confirmText: '确定',
+							success: res => {
+								let subscribe = uni.getStorageSync('balance_subscribe');
+								uni.requestSubscribeMessage({
+									tmplIds: [subscribe.member_tid],
+									success: (r) => {
+										// console.log(r, "success")
+									},
+									complete: (r) => {
+										// console.log(r, "complete")
+										uni.switchTab({
+											url: "../my/my"
+										})
+									}
+								})
+							},
+							fail: () => {},
+							complete: () => {}
+						});
+					})
+				} else {
+					uni.showToast({
+						title: "授权失败,请重新授权",
+						icon: 'none'
+					})
+				}
+				// #endif
+			},
+
+			// 开启会员弹窗
+			onGetphone(e) {
+				if (this.userInfo.mobile) {
+					uni.showToast({
+						title: "您已经完善过会员信息了,无需重复操作!",
+						icon: 'none'
+					})
+					return
+				}
+				this.getPhonePop = true;
+			},
+
+		}
+	};
+</script>
+
+<style lang="less" scoped>
+	/***图文模块***/
+	.module-item-tuwen{ margin-top:10px; position: relative; .mg0{ margin-top:0;}
+		  .item-tuwen-con{ position: relative; overflow: hidden;}
+				.item-tuwen-style1{ position: relative; z-index: 1;  padding:10px 0;  overflow: hidden;	
+							.tit{ white-space: nowrap; font-size:14px; padding:10px; text-align:center; overflow: hidden; text-overflow: ellipsis;}		
+							.item{ margin:0 10px; position: relative; overflow: hidden;width:auto;
+									image{  display:block; height:150px; width:100%;} 										
+								.note{ line-height:18px; color:#fff; background:rgba(0,0,0,0.5); position: absolute; bottom:0; 
+								padding:6px 10px; width:100%;}
+							}
+				} 
+				.item-tuwen-style2{ position: relative; display:flex; flex-wrap: wrap; z-index: 1; padding:10px 0; overflow: hidden;
+							.item{  margin:0 10px;width:100%;
+									image{  display:block; height:150px; width:100%;} 
+									.tit{ white-space: nowrap; font-size:14px; padding-top:10px; text-align:center; overflow: hidden; text-overflow: ellipsis;}
+									.note{ line-height:20px; color:#999; padding:6px 10px;}
+							}
+				}
+		}
+
+	/* 去除button默认样式 */
+	button::after {
+		border: none;
+	}
+
+	button {
+		background-color: transparent;
+		padding-left: 0;
+		padding-right: 0;
+		line-height: inherit;
+	}
+
+	button {
+		border-radius: 0;
+	}
+</style>

+ 31 - 0
diy/module/twtit.vue

@@ -0,0 +1,31 @@
+<template>
+	<div class="module-item-twtit flex-y-center flex-grow-1">
+		<moduleText :class="miaosha?'flex-grow-0':'flex-grow-1'"  :text="title" :type="type" />
+		<moduleMiaosha class="flex-grow-1" :text="title" v-if="miaosha" :miaosha='miaosha' />
+	</div>
+</template>
+
+<script>
+	import moduleText from './text.vue'
+	import moduleMiaosha from './miaosha.vue'
+	export default {
+		name: 'moduleTwtit',
+		props: ['title', 'type','miaosha'],
+		components: {
+			moduleText,
+			moduleMiaosha
+		}
+	}
+</script>
+
+<style scoped>
+	.module-item-twtit {
+		font-size: 14px;
+		position: relative;
+		z-index: 1;
+		padding: 0 12px;
+		padding-top: 10px;
+	}
+</style>
+
+

+ 140 - 0
diy/module/yy_goods.vue

@@ -0,0 +1,140 @@
+<template>
+	<div class="module-item-goods" :style="!module.base.m ? 'margin-top:0' : ''" v-if="shopList.length>0">
+		<div class="item-goods-con" :style="style">
+			<moduleBg :base="module.base" />
+			<moduleTwtit :type="module.type" :title="module.title" v-if="module.title.s" />
+			<div class="item-goods-style1 style2" :class="module.base.s == 1 ? 'style2' : ''">
+				<div class="item" v-for="(item, index) in shopList" :key="index"
+					@click="$util.openYyGoods(shopList,index)">
+					<div class="pic">
+						<img :src="url+item.thumb" alt="" />
+					</div>
+					<div class="c" style="padding: 0 5px;">
+						<div class="tit" v-if="module.base.t.s">
+							<moduleText :text="module.base.t" :name="item.name" />
+						</div>
+						<div class="price" v-if="module.base.sjg || module.base.sgm">
+							<template v-if="module.base.sjg">
+								<span>
+									<b>¥{{ item.price }}</b>
+								</span>
+								<span v-if="item.type == 2">
+									<b>{{ item.priceDescribe }}</b>
+								</span>
+							</template>
+							<template v-if="module.base.sgm">
+								<!-- <button >预约</button>  -->
+								<button class="yy_button flex-center" size="mini" type="danger">预约</button>
+							</template>
+						</div>
+					</div>
+				</div>
+				<div class="noadd" v-if="shopList.length == 0">
+					暂无预约商品
+				</div>
+			</div>
+		</div>
+	</div>
+</template>
+<script>
+	import moduleBg from './bg.vue';
+	import moduleText from './text.vue';
+	import moduleTwtit from './twtit.vue';
+	export default {
+		props: ['module'],
+		components: {
+			moduleBg,
+			moduleText,
+			moduleTwtit
+		},
+		data() {
+			return {
+				url: getApp().globalData.URL,
+				shopList: [],
+			};
+		},
+
+		computed: {
+			style() {
+				if (this.module.base.fc != '') {
+					return `color:${this.module.base.fc}`;
+				}
+			}
+		},
+
+		mounted() {
+			this.getGoodsList();
+		},
+
+		methods: {
+			//获取商品列表
+			getGoodsList() {
+				var shopList = [];
+				// console.log(this.module, "获取商品列表")
+				this.$http.request('template/yygoods_lists', {
+					store_id: this.$store.state.store_id,
+					controller: "admin",
+					page: 1,
+					limit: 6,
+				}, "", "", "").then(t => {
+					if (t.code == 200) {
+						for (let i of t.data) {
+							shopList.push({
+								name: i.name,
+								price: i.price,
+								thumb: i.cover_pic,
+								id: i.id
+							})
+						}
+						this.module.list = shopList;
+						this.shopList= shopList;
+					} else {
+						this.shopList= [];
+						this.module.list = shopList;	
+					}
+				})
+			},
+		},
+	};
+</script>
+
+<style>
+	@import url("./goods.css");
+	.yy_button{
+		color: #FFF;border-radius: 40px;background-color: #F56C6C; border-color: #F56C6C;
+	}
+	
+	.module-item-goods {
+		margin-top: 10px;
+	}
+
+	.scroll-true {
+		white-space: nowrap;
+		overflow-x: auto;
+	}
+
+	.scroll-true .item {
+		display: inline-block;
+		width: 30%;
+		margin-right: 10px;
+	}
+
+	.el-scrollbar__wrap {
+		overflow-y: hidden;
+	}
+
+	.pic_img {
+		width: 106px;
+		height: 106px;
+	}
+
+	.item-goods-style1 {
+		position: relative;
+		padding: 20rpx 0;
+	}
+
+	.noadd {
+		position: relative;
+		color: #999;
+	}
+</style>

+ 213 - 0
diy/swiper.vue

@@ -0,0 +1,213 @@
+<template>
+	<view class="swiper">
+		<swiper class="swiper" circular indicator-dots="true" autoplay indicator-active-color="#fff"
+			indicator-color="rgba(255,255,255,0.5)">
+			<block v-for="(item,index) of swiperList" :key='index'>
+				<swiper-item>
+					<!-- #ifdef MP-ALIPAY -->
+				  	<image v-if="item.type==4"  @click="bindPath(index)" :src="URL+item.thumb" class="img"></image>
+					<!-- #endif -->
+					<!-- #ifdef MP-WEIXIN -->
+					<button v-if="item.type==4" hover-class="none" class="img" open-type="getPhoneNumber"
+						@getphonenumber="onGetphoneNumber">
+						<image :src="URL+item.thumb" class="img"></image>
+					</button>
+					<!-- #endif -->
+					<image v-if="item.type!=4"  @click="bindPath(index)" :src="URL+item.thumb" class="img"></image>
+				</swiper-item>
+			</block>
+		</swiper>
+		<gbClose />
+		<Vphone :getPhonePop="getPhonePop" @close="setClose"></Vphone>
+	</view>
+</template>
+<script>
+	import Vphone from '@/components/v-phone/v-phone.vue';
+	import gbClose from './close.vue';
+	import {
+		mapState,
+	} from 'vuex'
+	export default {
+		components: {
+			gbClose,
+			Vphone
+		},
+		computed: {
+			...mapState(['systemInfo', 'store_id', 'userInfo', 'swiperList', 'setColor']),
+		},
+		data() {
+			return {
+				URL: getApp().globalData.URL,
+				getPhonePop: false,
+			}
+		},
+		onLoad() {
+
+		},
+		methods: {
+
+			bindPath(index) {
+				let {
+					type,
+					url
+				} = this.swiperList[index];
+				if (type == 0) {
+					return
+				}
+				if (type == 2) {
+					if ("/pages/index/index" == url) {
+						console.log(url, "url")
+						uni.switchTab({
+							url: url
+						})
+						return
+					}
+					uni.navigateTo({
+						url: url
+					})
+				}
+
+				if (type == 1) {
+					uni.navigateToMiniProgram({
+						appId: url,
+						success(res) {
+							// 打开成功
+						}
+					})
+				}
+
+				if (type == 3) {
+					uni.setStorageSync("web", url)
+					uni.navigateTo({
+						url: "/pages/web/web"
+					})
+				}
+				if (type == 4) {
+					if (this.userInfo.mobile) {
+						uni.showToast({
+							title: "您已经完善过会员信息了,无需重复操作!",
+							icon: 'none'
+						})
+						return
+					}
+					this.getPhonePop = true;
+					
+				}
+			},
+
+			onGetphoneNumber(e) {
+				if (this.userInfo.mobile) {
+					uni.showToast({
+						title: "您已经完善过会员信息了,无需重复操作!",
+						icon: 'none'
+					})
+					return
+				}
+				// #ifdef MP-WEIXIN
+				if (e.detail.errMsg == "getPhoneNumber:ok") {
+					this.$http.request('xcx/Jiemi', {
+						id: this.userInfo.id,
+						data: e.detail.encryptedData,
+						iv: e.detail.iv,
+						sessionKey: uni.getStorageSync('user_xcx_info').session_key,
+						store_id: this.store_id,
+					}, "", "", true).then(res => {
+						this.phoneNumber = res.data.phoneNumber;
+						uni.setStorageSync('phone', res.data.phoneNumber);
+						uni.showModal({
+							title: '授权成功',
+							content: '享受更多优惠!',
+							showCancel: false,
+							cancelText: '',
+							confirmText: '确定',
+							success: res => {
+								let subscribe = uni.getStorageSync('balance_subscribe');
+
+								uni.requestSubscribeMessage({
+									tmplIds: [subscribe.member_tid],
+									success: (r) => {
+										// console.log(r, "success")
+									},
+									complete: (r) => {
+										// console.log(r, "complete")
+										uni.switchTab({
+											url: "../../pages/my/my"
+										})
+									}
+								})
+
+							},
+							fail: () => {},
+							complete: () => {}
+						});
+					})
+				} else {
+					uni.showToast({
+						title: "授权失败,请重新授权",
+						icon: 'none'
+					})
+				}
+				// #endif
+			},
+			// 子组件传参
+			setClose(e) {
+				this.getPhonePop = e;
+			},
+			// 开启会员弹窗
+			onGetphone(e) {
+				// console.log("gggggggggggg",this.userInfo.mobile)
+				if (this.userInfo.mobile) {
+					uni.showToast({
+						title: "您已经完善过会员信息了,无需重复操作!",
+						icon: 'none'
+					})
+					return
+				}
+				this.getPhonePop = true;
+				// this.$emit("getPhonePop",true)
+			},
+
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.swiper {
+		width: 550rpx;
+		height: 550rpx;
+		margin: 0 auto;
+		border-radius: 10rpx;
+		background-color: #FFFFFF;
+		margin-top: -200rpx;
+
+		.img {
+			display: block;
+			width: 100%;
+			height: 100%;
+			border-radius: 10rpx;
+		}
+		
+		button::after {
+				border: none;
+
+			}
+
+			 button {
+				background-color: transparent;
+
+				padding-left: 0;
+
+				padding-right: 0;
+
+				line-height: inherit;
+
+			}
+
+		   button {
+				border-radius: 0;
+
+			}
+
+	}
+	
+</style>

+ 9 - 0
ext.json

@@ -0,0 +1,9 @@
+{
+	"extEnable": true,
+	"extAppid": "wx12fe97b833929f23",
+	"ext": {
+		"store_id": "3",
+		"table_id": "1",
+		"appId": "wx12fe97b833929f23"
+	}
+}

+ 33 - 0
main.js

@@ -0,0 +1,33 @@
+import Vue from 'vue'
+import App from './App'
+import http from './utils/http.js'
+import utils from './utils/utils.js'
+import noNone from './components/no-none.vue'
+import loading from './components/load.vue'
+import httpUpload from './utils/http-upload.js'
+import store from './store/index.js'
+import model from './components/model.vue'
+import util from '@/utils/util.js'
+import clickThrottle from '@/utils/clickThrottle.js'
+Vue.prototype.$util = util
+import api from '@/utils/api.js'
+Vue.prototype.$api = api
+import share from '@/utils/share.js'
+Vue.mixin(share)
+Vue.component('model',model)
+Vue.component('no-none',noNone)
+Vue.component('loading',loading)
+Vue.prototype.$http = http;
+Vue.prototype.$utils = utils;
+Vue.prototype.Upload = httpUpload;
+Vue.prototype.clickThrottle = clickThrottle;
+Vue.config.productionTip = false
+import pageBtmBar from './components/page-btm-bar/page-btm-bar.vue'
+Vue.component('page-btm-bar',pageBtmBar)
+Vue.prototype.$store = store
+App.mpType = 'app'
+Vue.prototype.bus = new Vue()  //全局的事件总线对象
+const app = new Vue({
+    ...App
+})
+app.$mount()

+ 129 - 0
manifest.json

@@ -0,0 +1,129 @@
+{
+    "name" : "Coffunity时光驿站",
+    "appid" : "__UNI__EF962AF",
+    "description" : "Coffunity时光驿站",
+    "versionName" : "1.0.2",
+    "versionCode" : "100",
+    "transformPx" : false,
+    /* 5+App特有相关 */
+    "app-plus" : {
+        "usingComponents" : true,
+        "nvueCompiler" : "uni-app",
+        "compilerVersion" : 3,
+        "splashscreen" : {
+            "alwaysShowBeforeRender" : true,
+            "waiting" : true,
+            "autoclose" : true,
+            "delay" : 0
+        },
+        /* 模块配置 */
+        "modules" : {},
+        /* 应用发布信息 */
+        "distribute" : {
+            /* android打包配置 */
+            "android" : {
+                "permissions" : [
+                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>",
+                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+                    "<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
+                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+                    "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+                    "<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
+                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
+                ]
+            },
+            /* ios打包配置 */
+            "ios" : {},
+            /* SDK配置 */
+            "sdkConfigs" : {}
+        }
+    },
+    /* 快应用特有相关 */
+    "quickapp" : {},
+    /* 小程序特有相关 */
+    "mp-weixin" : {
+        "appid" : "wxf5a2bd2f2e47b5b7",
+        "setting" : {
+            "urlCheck" : true,
+            "es6" : true,
+            "postcss" : true,
+            "minified" : true
+        },
+        // "plugins" : {
+        //     "live-player-plugin" : {
+        //         "version" : "1.3.5",
+        //         "provider" : "wx2b03c6e691cd7370"
+        //     }
+        // },
+        "usingComponents" : true,
+        "permission" : {
+            "scope.userLocation" : {
+                "desc" : "你的位置信息将用于小程序位置接口的效果展示"
+            }
+        },
+        "requiredPrivateInfos" : [ "getLocation", "chooseLocation", "chooseAddress" ],
+        "unipush" : {
+            "enable" : false
+        }
+    },
+    "mp-alipay" : {
+        "usingComponents" : true,
+        "appid" : "2021002137659970",
+        "plugins" : {
+            "couponPlugin" : {
+                "version" : "*",
+                "provider" : "2021002172680015"
+            },
+            "alipassToolKit" : {
+                // 请自定义插件名称
+                "version" : "*", // 目前只支持设置 * 拉取当前上架最新版本 
+                "provider" : "2021001107697072" // 固定值,插件 ID
+            },
+            "floatModal" : {
+                "version" : "*", // 目前只支持设置 * 拉取当前上架最新版本  
+                "provider" : "2021003142617780" // 请确认写入准确的插件appid  
+            }
+        }
+    },
+    "mp-baidu" : {
+        "usingComponents" : true
+    },
+    "mp-toutiao" : {
+        "usingComponents" : true
+    },
+    "uniStatistics" : {
+        "enable" : false
+    },
+    "h5" : {
+        "router" : {
+            "mode" : "history"
+        },
+        "sdkConfigs" : {
+            "maps" : {
+                "qqmap" : {
+                    "key" : "PJCBZ-U23RM-5XX63-6ZWGT-NV23K-E4FML"
+                }
+            }
+        },
+        "devServer" : {
+            "https" : false
+        }
+    },
+    "locale" : "zh-Hans",
+    "fallbackLocale" : "zh-Hans"
+}

+ 657 - 0
menber/goods_detail.vue

@@ -0,0 +1,657 @@
+<template>
+	<view>
+		<uni-nav-bar :fixed="true" title="咖啡屋" left-icon="left" backgroundColor="rgb(0,0,0,0)" :border="false" @clickLeft="onHome"/>
+		<!-- 详情弹窗 -->
+		<view class=" detail-pop">
+			<!-- <image src="../../static/icon_5.png" mode="aspectFit" class="detail-close-btn"
+				@click="showGoodsDetail"></image>-->
+			<!-- <scroll-view scroll-y="true" class="content-block"> -->
+			<image :src="URL+goodsDetail.thumb" mode="aspectFill" class="goods-img"></image>
+			<!-- <view class="" style="padding: 0 10rpx;">
+					<rich-text :nodes="goodsDetail.description"></rich-text>
+				</view> -->
+			<!-- </scroll-view> -->
+			<view class="btm-block">
+				<!-- <view class="goods-name ft28" style="font-size: 34rpx;">{{goodsDetail.name}}</view> -->
+				<view class="flex  box-pack-between">
+					<view class="goods-name ft28" style="font-size: 34rpx;flex: 1;">{{goodsDetail.name}}</view>
+					<view class="sales ft26 flex-center">已售:{{goodsDetail.fictitious?goodsDetail.fictitious:0}}</view>
+				</view>
+				<view class="goods-desc">{{goodsDetail.desc}}</view>
+				<view class="flex flex-y-center flex-nowarp box-pack-between">
+					<view class="">
+						<view class="flex flex-nowarp flex-y-baseline">
+							<view class="price">¥{{goodsDetail.price}}</view>
+							<view class="unit">/{{goodsDetail.unit}}</view>
+						</view>
+						<view class="price" v-if="goodsDetail.is_rebate==1">
+							<view class="rebate-border">
+								{{goodsDetail.rebate}}
+							</view>
+						</view>
+					</view>
+					<view>
+						<view class="add-car-btn" :style="{'background-color':setColor}" v-if="goodsDetail.is_gg == 2"
+							@click="showSpec(goodsDetail.id)">选规格</view>
+						<view class="add-car-btn" :data-i='goodsDetail.num' :style="{'background-color':setColor}"
+							v-else-if="goodsDetail.num == 0"
+							@click="changeNum(goodsDetail.category_id,goodsDetail.id,2,'goods','',goodsDetail.price,goodsDetail.many_rebate,goodsDetail.is_rebate)">
+							加入购物车
+						</view>
+						<block v-else>
+							<view class="goods-num-block flex flex-x-end flex-y-center" :style="{color:setColor}">
+								<view class="num-btn num-btn-1 iconfont icon-jian1"
+									@click="changeNum(goodsDetail.category_id,goodsDetail.id,1,'goods','',goodsDetail.price,goodsDetail.many_rebate,goodsDetail.is_rebate)">
+								</view>
+								<view class="num">{{goodsDetail.num}}</view>
+								<view class="num-btn num-btn-2  iconfont icon-jia1"
+									@click="changeNum(goodsDetail.category_id,goodsDetail.id,2,'goods','',goodsDetail.price,goodsDetail.many_rebate,goodsDetail.is_rebate)">
+								</view>
+							</view>
+							<view class="ft24 many_rebate" v-if="goodsDetail.many_rebate>0 && goodsDetail.is_rebate==1">
+								{{goodsDetail.many_rebate}}{{goodsDetail.unit}}起购
+							</view>
+						</block>
+					</view>
+				</view>
+			</view>
+
+			<view class="mask flex flex-column flex-nowarp flex-x-center flex-y-center" v-show="maskPop">
+				<!-- 规格弹窗 -->
+				<block v-if="specPop">
+					<view class="pop-block spec-pop">
+						<view class="title">{{goodsDetail.name}}</view>
+						<scroll-view scroll-y="true" class="content-block">
+							<view class="content">
+								<block v-for="(item,index) in goodsDetail.edit_value" :key="index">
+									<view class="spec-cat-title">
+										<text>{{item.spec_name}}</text>
+										<text style="font-size:24rpx;color:#aaa">(仅单选)</text>
+									</view>
+									<view class="spec-list flex">
+										<view v-for="(spec,specIndex) in item.spec" :key="specIndex"
+											@click="chooseSpec(index,specIndex)"
+											:class="['spec-item',spec.active?'active':'']"
+											:style="[spec.active?{'background-color':setColor,'border-color':setColor}:'']">
+											{{spec.name}}
+											<block v-if="spec.price">¥{{spec.price}}</block>
+										</view>
+									</view>
+								</block>
+							</view>
+						</scroll-view>
+						<view class="btm-block flex flex-y-baseline flex-nowarp">
+							<view class="flex flex-nowarp flex-y-baseline">
+								<view class="price">¥{{goodsDetail.spec_price}}</view>
+								<view class="unit">/{{goodsDetail.unit}}</view>
+							</view>
+							<view class="choose-spec-list text-3" v-if="goodsDetail.specName">
+								({{goodsDetail.specName}})</view>
+							<block>
+								<view class="add-car-btn" :style="{'background-color':setColor}"
+									v-if="goodsDetail.num == 0"
+									@click="changeNum(goodsDetail.category_id,goodsDetail.id,2,'spec',goodsDetail.many_rebate,goodsDetail.is_rebate)">
+									加入购物车</view>
+								<view class="goods-num-block flex flex-x-end flex-y-center" v-else
+									:style="{color:setColor}">
+									<view class="num-btn num-btn-1 iconfont icon-jian1"
+										@click="changeNum(goodsDetail.category_id,goodsDetail.id,1,'spec',goodsDetail.many_rebate,goodsDetail.is_rebate)">
+									</view>
+									<view class="num">{{goodsDetail.num}}</view>
+									<view class="num-btn num-btn-2 iconfont icon-jia1"
+										@click="changeNum(goodsDetail.category_id,goodsDetail.id,2,'spec',goodsDetail.many_rebate,goodsDetail.is_rebate)">
+									</view>
+								</view>
+							</block>
+						</view>
+					</view>
+					<image src="/static/icon_5.png" mode="aspectFit" class="spec-close-btn" @click="showSpec"></image>
+				</block>
+			</view>
+
+			<shopping-car :carNum="carNum" :isDistance="is_distance" :navBtn="true" :deliveryPrice="delivery_price"
+				:carTotal="carTotal" :carGoods="carGoods" :userInfo="userInfo" @choosebag="choosebag" :checked="pocket"/>
+
+
+			<view class="detail-title">
+				-- 商品详情 --
+			</view>
+
+			<view class="detail-content">
+				<mp-html :content="description" />
+				<!-- <rich-text :nodes="description"></rich-text> -->
+			</view>
+			<view class="hg100">
+			</view>
+		</view>
+
+		<!-- #ifdef MP-WEIXIN -->
+		<view v-if="goodsDetail.feedid || goodsDetail.finder" class="flex-row flex-y-center share_commission"
+			@click="openVideo">
+			<image src="/static/wx_video.png"></image>
+		</view>
+		<!-- #endif -->
+
+	</view>
+</template>
+<script>
+	import mpHtml from '@/uni_modules/mp-html/components/mp-html/mp-html'
+	let hideLoading = false;
+	import {
+		mapState,
+		mapMutations
+	} from 'vuex'
+	import shoppingCar from '@/components/shoppingCar.vue';
+	export default {
+		components: {
+			shoppingCar
+		},
+		data() {
+			return {
+				carGoods: [], //购物车商品
+				carNum: 0, //购物车数量
+				carTotal: 0, //购物车价格
+				goodsDetail: {}, //详情数据
+				URL: getApp().globalData.URL,
+				description: '', //文本
+				maskPop: false,
+				specPop: false,
+				goodsList: [],
+				goods_id: '',
+				is_distance: null,
+				delivery_price: 0,
+				pocket: 1,
+				list: []
+			}
+		},
+
+		onLoad(e) {
+			console.log(e, "eeee")
+			this.goods_id = e.id;
+			if (e.userInfo & e.store_id & e.setColor & e.systemInfo) {
+				this.userInfo = e.userInfo;
+				this.store_id = e.store_id;
+				this.setColor = e.setColor;
+				this.systemInfo = e.systemInfo;
+				this.$store.commit('SET_STORE_ID', e.store_id)
+				// this.$store.commit('SET_TEEN_INDEX', 1)
+				//重置默认
+				this.$store.commit('SET_TABLE_ID', "")
+				this.$store.commit('SET_CATE_ID', '')
+				this.$store.dispatch('getSystemStup', e.store_id);
+				this.$store.dispatch('getOpenid', e.store_id);
+				this.$store.dispatch('SET_USER_INFO', e.userInfo);
+				this.$store.dispatch('SET_MONITOR_COLOR', e.setColor);
+				this.$store.dispatch('SET_SYSTEM', e.systemInfo);
+			}
+
+			this.goodInfo();
+
+
+			uni.setNavigationBarColor({
+				frontColor: '#ffffff',
+				backgroundColor: this.setColor,
+			})
+		},
+		onShow() {
+			this.getDeliveryPrice();
+		},
+
+		onShareAppMessage(e) {
+			return {
+				title: this.goodsDetail.name,
+				path: 'menber/goods_detail?id=' + this.goodsDetail.id,
+				imageUrl: this.URL + this.goodsDetail.thumb,
+			}
+		},
+
+		onShareTimeline() {
+			return {
+				title: this.goodsDetail.name,
+				query: `id=${this.goodsDetail.id}&setColor=${this.setColor}&store_id=${this.store_id}&userInfo=${this.userInfo}&systemInfo=${this.systemInfo}`,
+				imageUrl: this.URL + this.goodsDetail.thumb,
+			}
+		},
+
+		computed: {
+			...mapState(['systemInfo', 'setColor', 'store_id', 'userInfo', 'address'])
+		},
+
+		watch: {
+			setColor(nVal) {
+				uni.setNavigationBarColor({
+					frontColor: '#ffffff',
+					backgroundColor: nVal,
+				})
+			},
+			address(val) {
+				this.getDeliveryPrice();
+			}
+		},
+
+		methods: {
+			choosebag(index) {
+				this.pocket = index;
+			},
+           onHome(e){
+           	uni.switchTab({
+           		url:'/pages/home/home'
+           	})
+           },
+			// 获取配送费
+			getDeliveryPrice() {
+				this.$http.request('xcx/getDeliveryPrice', {
+					lat: this.address.lat || '',
+					lng: this.address.lng || '',
+					store_id: this.store_id,
+				}, "", "", hideLoading).then(res => {
+					let distance = Number(res.data.distance);
+					if (distance) {
+						if (!distance) {
+							this.is_distance = 2;
+							return
+						}
+						this.delivery_price = Number(res.data.delivery_price);
+						if (!this.systemInfo.set.number || !distance) {
+							this.is_distance = 1;
+							return
+						}
+						// 如果大于商家距离is_distance = 2 提出超出距离
+						if (distance > this.systemInfo.set.number) {
+							this.is_distance = 2;
+						} else {
+							this.is_distance = 1;
+						}
+					} else {
+						this.is_distance = 3;
+					}
+				}).catch(err => {})
+			},
+
+			openVideo() {
+				let goods = this.goodsDetail;
+				if (goods.feedid && goods.finder) {
+					wx.openChannelsActivity({
+						finderUserName: goods.finder,
+						feedId: goods.feedid,
+						success: () => {
+							console.log("打开成功")
+						}
+					})
+				} else {
+					wx.openChannelsUserProfile({
+						finderUserName: goods.finder,
+						success: () => {
+							console.log("打开成功")
+						}
+					})
+				}
+			},
+			//清空购物车
+			clearCar() {
+				this.pocket=1
+				this.goodsDetail.num =0 
+				this.carGoods = []
+				this.$store.commit('SET_CARGOODS', []) //监听购物车是否有变化
+				this.carNum = 0
+				this.carTotal = 0
+				this.maskPop = false
+				this.carGoodsPop = false
+				let goodsList = this.goodsList
+				for (let i in goodsList) {
+					goodsList[i].num = 0
+					for (let j in goodsList[i].goods_list) {
+						goodsList[i].goods_list[j].num = 0
+					}
+				}
+				this.goodsList = goodsList
+				
+			},
+
+			showSpec() {
+				if (this.specPop) {
+					this.maskPop = false
+					this.specPop = false
+					return false
+				}
+				this.maskPop = true
+				this.specPop = true
+			},
+
+			goodInfo() {
+				this.$http.request('xcx/goodinfo', {
+					goods_id: this.goods_id,
+				}, "", "", hideLoading).then(res => {
+					let info = res.data.goods;
+					if (res.data.goods.description) {
+						this.description = res.data.goods.description.replace(/\<img/gi,
+							'<img style="max-width:100%;height:auto" ');
+					}
+					let edit_value = info.edit_value
+					for (let i in edit_value) {
+						for (let j in edit_value[i].spec) {
+							edit_value[i].spec[j] = {
+								'name': edit_value[i].spec[j],
+								active: false
+							}
+						}
+					}
+					info.edit_value = edit_value
+					info.spec_price = info.price
+					info.num = 0
+					info.specName = ""
+					this.category_id = info.category_id
+					this.goodsDetail = info;
+					this.getCarList();
+					console.log(info, "infoinfoinfoinfo")
+				}).catch(err => {})
+			},
+
+			//选择规格
+			chooseSpec(index, specIndex) {
+				let spec = this.goodsDetail.edit_value[index].spec
+				for (let i in spec) {
+					if (i == specIndex) {
+						spec[i].active = true
+					} else {
+						spec[i].active = false
+					}
+				}
+				this.goodsDetail.edit_value[index].spec = spec
+				this.goodsDetail.num = 0
+				this.computSpecPrice()
+			},
+
+			//计算规格价格
+			computSpecPrice() {
+				let edit_value = this.goodsDetail.edit_value
+				let specNameArr = [],
+					carSpecArr = []
+				for (let i in edit_value) {
+					for (let j in edit_value[i].spec) {
+						if (edit_value[i].spec[j].active) {
+							specNameArr.push(edit_value[i].spec[j].name)
+							carSpecArr.push(edit_value[i].spec_name + ':' + edit_value[i].spec[j].name)
+							break
+						}
+					}
+				}
+				let specName = specNameArr.join(":")
+				this.goodsDetail.specName = specNameArr.join(',')
+				let spec = this.goodsDetail.spec
+				for (let i in spec) {
+					if (spec[i].spec == specName) {
+						this.goodsDetail.spec_price = this.userInfo.is_vip == 1 ? spec[i].growth : spec[i].growth
+						break
+					}
+				}
+				// let carGoods = this.carGoods
+				// carSpecArr = carSpecArr.join(",")
+				// for (let i in carGoods) {
+				// 	if (this.goodsDetail.id == carGoods[i].goods_id && carSpecArr == carGoods[i].spec) {
+				// 		this.goodsDetail.num = carGoods[i].num
+				// 		break
+				// 	}
+				// }
+			},
+			
+			//获取购物车数据
+			getCarList() {
+				this.$http.request('xcx/cart_list', {
+					user_id: this.userInfo.id,
+				}, "", "", hideLoading).then(res => {
+					if(res.data.list<=0){
+						this.pocket=1
+					}
+					let arr = this.$utils.removal(res.data.list),
+						num = 0;
+					// this.list = arr;
+					this.computGoodsNum(arr, res.data.total_price, num, res.data.new_list);
+
+				}).catch(err => {})
+			},
+			/**
+			 * 改变商品数量
+			 * @category_id:分类id
+			 * @goods_id:商品id
+			 * @type:1减少 2增加
+			 * @data_from 购物车列表传 'car' 规格弹窗传 'spec' 无规格传 'goods' 否则不传
+			 * @car_index 购物车下标 data_form = 'car'传
+			 * @goods_price 商品价格 data_from = 'goods' 传
+			 * */
+			changeNum(category_id, goods_id, type, data_from, car_index, goods_price, many_rebate = '', is_rebate =
+				'', idx = '') {
+				console.log(many_rebate, is_rebate)
+				let money = 0,
+					pocket = this.pocket,
+					num = 0,
+					spec = '',
+					carItem = false,
+					new_list = this.carGoods,
+					carGoods = this.carGoods;
+
+				// carGoods = ? this.list : carGoods;
+				pocket = idx === '' ? pocket : idx;
+				if (type == 2) {
+					for (let i of new_list) {
+						if (i.pocket == pocket) {
+							carGoods = i.list;
+						}
+					}
+				}
+
+				if (type == 1) {
+					function getData(new_list, pocket, goods_id) {
+						let as = false
+						for (let i of new_list) {
+							for (let j of i.list) {
+								if (i.pocket == pocket && j.goods_id == goods_id) {
+									as = true
+								}
+							}
+						}
+						return as
+					}
+					// 判断当前选中的购物口袋是否选中并且还有产品
+					let isAllStudentType = getData(new_list, pocket, goods_id)
+					if (isAllStudentType) {
+						for (let i of new_list) {
+							if (i.pocket == pocket) {
+								carGoods = i.list;
+							}
+						}
+					} else {
+						for (let i of new_list) {
+							for (let j of i.list) {
+								if (j.goods_id == goods_id) {
+									pocket = i.pocket
+									carGoods = i.list
+								}
+							}
+						}
+					}
+				}
+
+				console.log(carGoods, "carGoods")
+
+				if (data_from == 'car') {
+					//购物车规格
+					carItem = carGoods[car_index]
+					spec = carItem.spec || ''
+					money = carItem.price
+					// console.log(money, "money")
+				} else if (data_from == 'spec') {
+					let specArr = []
+					let specList = this.goodsDetail.edit_value
+					for (let i in specList) {
+						for (let j in specList[i].spec)
+							if (specList[i].spec[j].active) {
+								specArr.push(specList[i].spec_name + ':' + specList[i].spec[j].name)
+								break
+							}
+					}
+					if (specArr.length != specList.length) {
+						uni.showToast({
+							title: "请选择规格",
+							icon: 'none'
+						})
+						return false
+					} else {
+						spec = specArr.join(',')
+						money = this.goodsDetail.spec_price
+					}
+				} else if (data_from == 'goods') {
+					//无规格商品
+					spec = ''
+					money = goods_price
+				}
+				if (data_from != 'car') {
+					for (let i in carGoods) {
+						if (carGoods[i].goods_id == goods_id && carGoods[i].spec == spec) {
+							carItem = carGoods[i]
+							break
+						}
+					}
+				}
+				num = carItem ? carItem.num : 0
+				if (type == 1) {
+					if (num > 0) {
+						// 起购
+						if (many_rebate > 0 && is_rebate == 1) {
+							if (many_rebate >= num) {
+								num = num - many_rebate;
+							} else {
+								num--;
+							}
+						} else {
+							num--
+						}
+					} else {
+						return false
+					}
+				} else if (type == 2) {
+					// 起购
+					if (many_rebate > 0 && is_rebate == 1) {
+						if (many_rebate <= num) {
+							num++
+						} else {
+							num = num + many_rebate;
+						}
+					} else {
+						num++
+					}
+				} else {
+					return false
+				}
+				this.$http.request('xcx/add_cart', {
+					user_id: this.userInfo.id, //是	string	用户id
+					category_id: category_id, //分类id
+					goods_id: goods_id, //是	string	商品id
+					num: num, //是	string	购买数量
+					table_id: this.systemInfo.table_id, //是	string	桌号
+					spec: spec, //是	string	规格(json),有的传
+					money: money,
+					pocket,
+				}, 'POST', false, true).then(res => {
+					// console.log(res)
+					if (res.data.list.length == 0 && data_from == 'car') {
+						this.pocket = 1
+						this.maskPop = false
+						this.carGoodsPop = false
+					}
+
+					let arr = this.$utils.removal(res.data.list)
+
+					this.computGoodsNum(arr, res.data.total_price, num, res.data.new_list)
+
+				}).catch(err => {})
+			},
+
+			//根据购物车列表计算购物车数据
+			computGoodsNum(list, total_price, spec_nums, new_list) {
+				let num = 0,
+					spec_num = 0;
+				//计算商品数量
+
+				for (let i in list) {
+					num += list[i].num
+				}
+
+				this.carNum = num
+				this.carGoods = new_list
+				this.list = list;
+
+				this.$store.commit('SET_CARGOODS', list) //监听购物车是否有变化
+				this.carTotal = total_price
+
+				// if (this.detailPop || this.specPop) {
+				for (let i of list) {
+					if (i.goods_id == this.goodsDetail.id) {
+						spec_num = i.num
+					}
+				}
+				this.goodsDetail.num = spec_num || 0
+				// }
+			},
+		},
+	}
+</script>
+
+<style>
+	@import url("../pages/index/index.css");
+
+	.sales {
+		font-size: 9pt;
+		color: #999;
+		padding-left: 20rpx;
+		min-width: 100rpx;
+	}
+
+	.share_commission {
+		position: absolute;
+		right: 0;
+		top: 450rpx;
+		border-top-left-radius: 40rpx;
+		border-bottom-left-radius: 40rpx;
+	}
+
+	.share_commission image {
+		width: 100rpx;
+		height: 126rpx;
+		margin-right: 14rpx;
+		margin-left: 20rpx;
+	}
+
+	.detail-pop {
+		width: 100%;
+	}
+
+	.detail-pop .goods-img {
+		width: 100%;
+	}
+
+	.detail-pop .btm-block {
+		background-color: #FFFFFF;
+		margin-bottom: 20rpx;
+	}
+
+	.detail-pop .detail-title {
+		height: 100rpx;
+		text-align: center;
+		background-color: #FFFFFF;
+		line-height: 100rpx;
+		border-bottom: 1rpx solid #f1f1f1;
+	}
+
+	.detail-pop .detail-content {
+		background-color: #FFFFFF;
+	}
+
+	.hg100 {
+		height: 100rpx;
+	}
+
+	.many_rebate {
+		margin-top: 20rpx;
+	}
+</style>

+ 278 - 0
menber/shop.vue

@@ -0,0 +1,278 @@
+<template>
+
+	<view class="content">
+
+		<map class="map" scale="16" :latitude="Number(lat)" :longitude="Number(lng)" :markers="markers"></map>
+		<view class="item flex-y-center">
+			<image class="icon" :src="URL+obj.thumb"></image>
+			<view class="">
+				<text class="item-title">{{obj.title||''}}</text>
+				<view class="announcement">
+					{{obj.announcement||''}}
+				</view>
+			</view>
+		</view>
+		<view class="item box-pack-between">
+			<view class="flex-y-center">
+				<view class="iconfont icon-dianhua"></view>
+				<text>{{obj.tel||''}}</text>
+			</view>
+			<view class="boda" @click="tel">
+				<!-- <image class="img" src="../../static/images/dianhua.png" mode=""></image> -->
+			</view>
+		</view>
+		<view class="flex-y-center item box-pack-between" style="padding-bottom: 27rpx;">
+			<view class="flex">
+				<view class="iconfont icon-dizhi"></view>
+				<text>{{obj.address}}</text>
+			</view>
+			<view class="flex-y-center map-dd" @click="Location" :style="{color:setColor}">
+				<text>导航到店</text>
+				<view class="iconfont icon-jiantou"></view>
+			</view>
+		</view>
+		<block v-if="obj.content">
+			<view class="shop-desc">
+				<view class="shop-desc-title flex-y-center">
+					商家介绍
+				</view>
+				<mp-html :content="obj.content" />
+			</view>
+			<view class="" style="height:70px;"></view>
+			<view class="box-pack-between  flex-y-center logo-pf">
+				<view class="flex-y-center left" :style="{color:setColor}">
+					<text class="iconfont icon-service"></text><text>商家热线</text>
+				</view>
+				<view class="right" @click="tel" :style="{background:setColor}">
+					一键拨号
+				</view>
+			</view>
+		</block>
+	</view>
+</template>
+
+<script>
+	import mpHtml from '@/uni_modules/mp-html/components/mp-html/mp-html'
+	export default {
+		components: {
+			mpHtml
+		},
+		data() {
+			return {
+				obj: {},
+				markers: [],
+				store_id: "",
+				lat: "",
+				lng: "",
+				URL: getApp().globalData.URL,
+				setColor: "",
+			}
+		},
+
+		onLoad(e) {
+			uni.setNavigationBarColor({
+				frontColor: '#ffffff',
+				backgroundColor: this.$store.state.color,
+			})
+			this.setColor = this.$store.state.color;
+			this.store_id = uni.getStorageSync('store_id')
+			this.system();
+		},
+
+		onShareAppMessage(e) {
+			return {}
+		},
+
+		methods: {
+
+			look() {
+				window.location.href = this.obj.url;
+			},
+
+			tel(e) {
+				uni.makePhoneCall({
+					phoneNumber: this.obj.tel //仅为示例
+				});
+			},
+
+			Location() {
+				// #ifdef MP-WEIXIN
+				uni.openLocation({
+					latitude: Number(this.lat),
+					longitude: Number(this.lng),
+					scale: 18,
+					address: this.obj.address,
+					name: this.obj.title,
+					fail: function() {
+						uni.getSetting({
+							success: function(e) {
+								e.authSetting["scope.location"] ? console.log("取消") : uni
+									.showModal({
+										title: "提示",
+										content: "您拒绝了获取地址授权,部分功能无法使用,点击确定重新获取授权。",
+										showCancel: !1,
+										success: function(e) {
+											e.confirm && uni.openSetting({
+												success: function(e) {
+													e.authSetting[
+														"scope.location"
+													];
+												},
+												fail: function(e) {}
+											});
+										}
+									});
+							}
+						});
+					}
+
+				})
+				// #endif
+
+				// #ifdef MP-ALIPAY
+				my.openLocation({
+					longitude: this.lng,
+					latitude: this.lat,
+					address: this.obj.address,
+					name: this.obj.title,
+					scale: 18
+				})
+				// #endif
+
+			},
+
+			system() {
+				this.$http.request('xcx/system', {
+					store_id: this.store_id,
+					table_id: ""
+				}, "", "", ).then(res => {
+					console.log(res, "res")
+					this.obj = res.data;
+					let markers = [];
+					let subscribe = res.data.set.coordinates.split(',');
+					this.lat = subscribe[0];
+					this.lng = subscribe[1];
+					markers.push({
+						id: 1,
+						latitude: subscribe[0],
+						longitude: subscribe[1],
+						title: res.data.title,
+						iconPath: this.URL + res.data.thumb,
+						width: 50,
+						height: 50,
+					});
+					this.markers = markers;
+					console.log(this.markers, "this.markers")
+				})
+			},
+
+		}
+	}
+</script>
+
+<style lang="scss">
+	page {
+		background: #F1F1F1;
+		font-size: 24rpx;
+	}
+
+	.iconfont {
+		margin-right: 20rpx;
+	}
+
+	.icon-service {
+		font-size: 50rpx;
+	}
+
+	.icon-jiantou {
+		font-size: 24rpx;
+	}
+
+	.map-dd {
+		min-width: 157rpx;
+	}
+
+	.item-title {
+		font-size: 32rpx;
+	}
+
+	.shop-desc {
+		padding: 0rpx 30rpx;
+		font-size: 26rpx;
+		background: #FFFFFF;
+		margin-top: 10rpx;
+	}
+
+	.shop-desc-title {
+		height: 86rpx;
+		background: rgba(255, 255, 255, 1);
+		font-size: 32rpx;
+		font-family: PingFangSC-Medium;
+		color: rgba(20, 31, 51, 1);
+		border-bottom: 1rpx solid #F1F1F1;
+	}
+
+	.content {
+		.map {
+			width: 100%;
+			height: 600rpx;
+		}
+
+		.item {
+			padding: 20rpx 30rpx;
+			font-size: 26rpx;
+			background: #FFFFFF;
+
+			.icon {
+				width: 80rpx;
+				height: 80rpx;
+				margin-right: 20rpx;
+				min-width: 80rpx;
+			}
+
+			.boda {
+				border-left: 1px solid #fff;
+
+				.img {
+					width: 40rpx;
+					height: 40rpx;
+					margin-left: 10px;
+
+				}
+			}
+		}
+
+		.logo-pf {
+			position: fixed;
+			width: 100%;
+			bottom: 0;
+			padding: 20rpx;
+			border-top: 1rpx solid #F1F1F1;
+			background-color: #FFFFFF;
+
+			.left {
+				font-size: 30rpx;
+
+				.icon {
+					width: 80rpx;
+					height: 80rpx;
+				}
+
+				.announcement {
+					font-size: 26rpx;
+				}
+			}
+
+			.right {
+				width: 200rpx;
+				height: 70rpx;
+				line-height: 70rpx;
+				background: #007AFF;
+				text-align: center;
+				font-size: 26rpx;
+				border-radius: 4rpx;
+				color: #FFFFFF;
+			}
+		}
+	}
+</style>

+ 16 - 0
node_modules/.bin/he

@@ -0,0 +1,16 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*|*MINGW*|*MSYS*)
+        if command -v cygpath > /dev/null 2>&1; then
+            basedir=`cygpath -w "$basedir"`
+        fi
+    ;;
+esac
+
+if [ -x "$basedir/node" ]; then
+  exec "$basedir/node"  "$basedir/../he/bin/he" "$@"
+else 
+  exec node  "$basedir/../he/bin/he" "$@"
+fi

+ 17 - 0
node_modules/.bin/he.cmd

@@ -0,0 +1,17 @@
+@ECHO off
+GOTO start
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
+:start
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+  SET "_prog=%dp0%\node.exe"
+) ELSE (
+  SET "_prog=node"
+  SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%"  "%dp0%\..\he\bin\he" %*

+ 28 - 0
node_modules/.bin/he.ps1

@@ -0,0 +1,28 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+  # Fix case when both the Windows and Linux builds of Node
+  # are installed in the same directory
+  $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+  # Support pipeline input
+  if ($MyInvocation.ExpectingInput) {
+    $input | & "$basedir/node$exe"  "$basedir/../he/bin/he" $args
+  } else {
+    & "$basedir/node$exe"  "$basedir/../he/bin/he" $args
+  }
+  $ret=$LASTEXITCODE
+} else {
+  # Support pipeline input
+  if ($MyInvocation.ExpectingInput) {
+    $input | & "node$exe"  "$basedir/../he/bin/he" $args
+  } else {
+    & "node$exe"  "$basedir/../he/bin/he" $args
+  }
+  $ret=$LASTEXITCODE
+}
+exit $ret

+ 16 - 0
node_modules/.bin/sass

@@ -0,0 +1,16 @@
+#!/bin/sh
+basedir=$(dirname "$(echo "$0" | sed -e 's,\\,/,g')")
+
+case `uname` in
+    *CYGWIN*|*MINGW*|*MSYS*)
+        if command -v cygpath > /dev/null 2>&1; then
+            basedir=`cygpath -w "$basedir"`
+        fi
+    ;;
+esac
+
+if [ -x "$basedir/node" ]; then
+  exec "$basedir/node"  "$basedir/../sass/sass.js" "$@"
+else 
+  exec node  "$basedir/../sass/sass.js" "$@"
+fi

+ 17 - 0
node_modules/.bin/sass.cmd

@@ -0,0 +1,17 @@
+@ECHO off
+GOTO start
+:find_dp0
+SET dp0=%~dp0
+EXIT /b
+:start
+SETLOCAL
+CALL :find_dp0
+
+IF EXIST "%dp0%\node.exe" (
+  SET "_prog=%dp0%\node.exe"
+) ELSE (
+  SET "_prog=node"
+  SET PATHEXT=%PATHEXT:;.JS;=;%
+)
+
+endLocal & goto #_undefined_# 2>NUL || title %COMSPEC% & "%_prog%"  "%dp0%\..\sass\sass.js" %*

+ 28 - 0
node_modules/.bin/sass.ps1

@@ -0,0 +1,28 @@
+#!/usr/bin/env pwsh
+$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent
+
+$exe=""
+if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) {
+  # Fix case when both the Windows and Linux builds of Node
+  # are installed in the same directory
+  $exe=".exe"
+}
+$ret=0
+if (Test-Path "$basedir/node$exe") {
+  # Support pipeline input
+  if ($MyInvocation.ExpectingInput) {
+    $input | & "$basedir/node$exe"  "$basedir/../sass/sass.js" $args
+  } else {
+    & "$basedir/node$exe"  "$basedir/../sass/sass.js" $args
+  }
+  $ret=$LASTEXITCODE
+} else {
+  # Support pipeline input
+  if ($MyInvocation.ExpectingInput) {
+    $input | & "node$exe"  "$basedir/../sass/sass.js" $args
+  } else {
+    & "node$exe"  "$basedir/../sass/sass.js" $args
+  }
+  $ret=$LASTEXITCODE
+}
+exit $ret

+ 265 - 0
node_modules/.package-lock.json

@@ -0,0 +1,265 @@
+{
+  "name": "cof_xcx_fronted",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "node_modules/anymatch": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+      "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+      "dev": true,
+      "dependencies": {
+        "normalize-path": "^3.0.0",
+        "picomatch": "^2.0.4"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/binary-extensions": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+      "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/braces": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+      "dev": true,
+      "dependencies": {
+        "fill-range": "^7.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/chokidar": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+      "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+      "dev": true,
+      "dependencies": {
+        "anymatch": "~3.1.2",
+        "braces": "~3.0.2",
+        "glob-parent": "~5.1.2",
+        "is-binary-path": "~2.1.0",
+        "is-glob": "~4.0.1",
+        "normalize-path": "~3.0.0",
+        "readdirp": "~3.6.0"
+      },
+      "engines": {
+        "node": ">= 8.10.0"
+      },
+      "funding": {
+        "url": "https://paulmillr.com/funding/"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.2"
+      }
+    },
+    "node_modules/fill-range": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+      "dev": true,
+      "dependencies": {
+        "to-regex-range": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/glob-parent": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+      "dev": true,
+      "dependencies": {
+        "is-glob": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/he": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+      "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+      "bin": {
+        "he": "bin/he"
+      }
+    },
+    "node_modules/immutable": {
+      "version": "4.3.6",
+      "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz",
+      "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==",
+      "dev": true
+    },
+    "node_modules/is-binary-path": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+      "dev": true,
+      "dependencies": {
+        "binary-extensions": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-glob": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+      "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+      "dev": true,
+      "dependencies": {
+        "is-extglob": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-number": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.12.0"
+      }
+    },
+    "node_modules/neo-async": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+      "dev": true
+    },
+    "node_modules/normalize-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/picomatch": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+      "dev": true,
+      "engines": {
+        "node": ">=8.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/readdirp": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+      "dev": true,
+      "dependencies": {
+        "picomatch": "^2.2.1"
+      },
+      "engines": {
+        "node": ">=8.10.0"
+      }
+    },
+    "node_modules/sass": {
+      "version": "1.77.2",
+      "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.2.tgz",
+      "integrity": "sha512-eb4GZt1C3avsX3heBNlrc7I09nyT00IUuo4eFhAbeXWU2fvA7oXI53SxODVAA+zgZCk9aunAZgO+losjR3fAwA==",
+      "dev": true,
+      "dependencies": {
+        "chokidar": ">=3.0.0 <4.0.0",
+        "immutable": "^4.0.0",
+        "source-map-js": ">=0.6.2 <2.0.0"
+      },
+      "bin": {
+        "sass": "sass.js"
+      },
+      "engines": {
+        "node": ">=14.0.0"
+      }
+    },
+    "node_modules/sass-loader": {
+      "version": "14.2.1",
+      "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-14.2.1.tgz",
+      "integrity": "sha512-G0VcnMYU18a4N7VoNDegg2OuMjYtxnqzQWARVWCIVSZwJeiL9kg8QMsuIZOplsJgTzZLF6jGxI3AClj8I9nRdQ==",
+      "dev": true,
+      "dependencies": {
+        "neo-async": "^2.6.2"
+      },
+      "engines": {
+        "node": ">= 18.12.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      },
+      "peerDependencies": {
+        "@rspack/core": "0.x || 1.x",
+        "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0",
+        "sass": "^1.3.0",
+        "sass-embedded": "*",
+        "webpack": "^5.0.0"
+      },
+      "peerDependenciesMeta": {
+        "@rspack/core": {
+          "optional": true
+        },
+        "node-sass": {
+          "optional": true
+        },
+        "sass": {
+          "optional": true
+        },
+        "sass-embedded": {
+          "optional": true
+        },
+        "webpack": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/source-map-js": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
+      "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/to-regex-range": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+      "dev": true,
+      "dependencies": {
+        "is-number": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=8.0"
+      }
+    }
+  }
+}

+ 15 - 0
node_modules/anymatch/LICENSE

@@ -0,0 +1,15 @@
+The ISC License
+
+Copyright (c) 2019 Elan Shanker, Paul Miller (https://paulmillr.com)
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted, provided that the above
+copyright notice and this permission notice appear in all copies.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

+ 87 - 0
node_modules/anymatch/README.md

@@ -0,0 +1,87 @@
+anymatch [![Build Status](https://travis-ci.org/micromatch/anymatch.svg?branch=master)](https://travis-ci.org/micromatch/anymatch) [![Coverage Status](https://img.shields.io/coveralls/micromatch/anymatch.svg?branch=master)](https://coveralls.io/r/micromatch/anymatch?branch=master)
+======
+Javascript module to match a string against a regular expression, glob, string,
+or function that takes the string as an argument and returns a truthy or falsy
+value. The matcher can also be an array of any or all of these. Useful for
+allowing a very flexible user-defined config to define things like file paths.
+
+__Note: This module has Bash-parity, please be aware that Windows-style backslashes are not supported as separators. See https://github.com/micromatch/micromatch#backslashes for more information.__
+
+
+Usage
+-----
+```sh
+npm install anymatch
+```
+
+#### anymatch(matchers, testString, [returnIndex], [options])
+* __matchers__: (_Array|String|RegExp|Function_)
+String to be directly matched, string with glob patterns, regular expression
+test, function that takes the testString as an argument and returns a truthy
+value if it should be matched, or an array of any number and mix of these types.
+* __testString__: (_String|Array_) The string to test against the matchers. If
+passed as an array, the first element of the array will be used as the
+`testString` for non-function matchers, while the entire array will be applied
+as the arguments for function matchers.
+* __options__: (_Object_ [optional]_) Any of the [picomatch](https://github.com/micromatch/picomatch#options) options.
+    * __returnIndex__: (_Boolean [optional]_) If true, return the array index of
+the first matcher that that testString matched, or -1 if no match, instead of a
+boolean result.
+
+```js
+const anymatch = require('anymatch');
+
+const matchers = [ 'path/to/file.js', 'path/anyjs/**/*.js', /foo.js$/, string => string.includes('bar') && string.length > 10 ] ;
+
+anymatch(matchers, 'path/to/file.js'); // true
+anymatch(matchers, 'path/anyjs/baz.js'); // true
+anymatch(matchers, 'path/to/foo.js'); // true
+anymatch(matchers, 'path/to/bar.js'); // true
+anymatch(matchers, 'bar.js'); // false
+
+// returnIndex = true
+anymatch(matchers, 'foo.js', {returnIndex: true}); // 2
+anymatch(matchers, 'path/anyjs/foo.js', {returnIndex: true}); // 1
+
+// any picomatc
+
+// using globs to match directories and their children
+anymatch('node_modules', 'node_modules'); // true
+anymatch('node_modules', 'node_modules/somelib/index.js'); // false
+anymatch('node_modules/**', 'node_modules/somelib/index.js'); // true
+anymatch('node_modules/**', '/absolute/path/to/node_modules/somelib/index.js'); // false
+anymatch('**/node_modules/**', '/absolute/path/to/node_modules/somelib/index.js'); // true
+
+const matcher = anymatch(matchers);
+['foo.js', 'bar.js'].filter(matcher);  // [ 'foo.js' ]
+anymatch master* ❯
+
+```
+
+#### anymatch(matchers)
+You can also pass in only your matcher(s) to get a curried function that has
+already been bound to the provided matching criteria. This can be used as an
+`Array#filter` callback.
+
+```js
+var matcher = anymatch(matchers);
+
+matcher('path/to/file.js'); // true
+matcher('path/anyjs/baz.js', true); // 1
+
+['foo.js', 'bar.js'].filter(matcher); // ['foo.js']
+```
+
+Changelog
+----------
+[See release notes page on GitHub](https://github.com/micromatch/anymatch/releases)
+
+- **v3.0:** Removed `startIndex` and `endIndex` arguments. Node 8.x-only.
+- **v2.0:** [micromatch](https://github.com/jonschlinkert/micromatch) moves away from minimatch-parity and inline with Bash. This includes handling backslashes differently (see https://github.com/micromatch/micromatch#backslashes for more information).
+- **v1.2:** anymatch uses [micromatch](https://github.com/jonschlinkert/micromatch)
+for glob pattern matching. Issues with glob pattern matching should be
+reported directly to the [micromatch issue tracker](https://github.com/jonschlinkert/micromatch/issues).
+
+License
+-------
+[ISC](https://raw.github.com/micromatch/anymatch/master/LICENSE)

+ 20 - 0
node_modules/anymatch/index.d.ts

@@ -0,0 +1,20 @@
+type AnymatchFn = (testString: string) => boolean;
+type AnymatchPattern = string|RegExp|AnymatchFn;
+type AnymatchMatcher = AnymatchPattern|AnymatchPattern[]
+type AnymatchTester = {
+  (testString: string|any[], returnIndex: true): number;
+  (testString: string|any[]): boolean;
+}
+
+type PicomatchOptions = {dot: boolean};
+
+declare const anymatch: {
+  (matchers: AnymatchMatcher): AnymatchTester;
+  (matchers: AnymatchMatcher, testString: null, returnIndex: true | PicomatchOptions): AnymatchTester;
+  (matchers: AnymatchMatcher, testString: string|any[], returnIndex: true | PicomatchOptions): number;
+  (matchers: AnymatchMatcher, testString: string|any[]): boolean;
+}
+
+export {AnymatchMatcher as Matcher}
+export {AnymatchTester as Tester}
+export default anymatch

+ 104 - 0
node_modules/anymatch/index.js

@@ -0,0 +1,104 @@
+'use strict';
+
+Object.defineProperty(exports, "__esModule", { value: true });
+
+const picomatch = require('picomatch');
+const normalizePath = require('normalize-path');
+
+/**
+ * @typedef {(testString: string) => boolean} AnymatchFn
+ * @typedef {string|RegExp|AnymatchFn} AnymatchPattern
+ * @typedef {AnymatchPattern|AnymatchPattern[]} AnymatchMatcher
+ */
+const BANG = '!';
+const DEFAULT_OPTIONS = {returnIndex: false};
+const arrify = (item) => Array.isArray(item) ? item : [item];
+
+/**
+ * @param {AnymatchPattern} matcher
+ * @param {object} options
+ * @returns {AnymatchFn}
+ */
+const createPattern = (matcher, options) => {
+  if (typeof matcher === 'function') {
+    return matcher;
+  }
+  if (typeof matcher === 'string') {
+    const glob = picomatch(matcher, options);
+    return (string) => matcher === string || glob(string);
+  }
+  if (matcher instanceof RegExp) {
+    return (string) => matcher.test(string);
+  }
+  return (string) => false;
+};
+
+/**
+ * @param {Array<Function>} patterns
+ * @param {Array<Function>} negPatterns
+ * @param {String|Array} args
+ * @param {Boolean} returnIndex
+ * @returns {boolean|number}
+ */
+const matchPatterns = (patterns, negPatterns, args, returnIndex) => {
+  const isList = Array.isArray(args);
+  const _path = isList ? args[0] : args;
+  if (!isList && typeof _path !== 'string') {
+    throw new TypeError('anymatch: second argument must be a string: got ' +
+      Object.prototype.toString.call(_path))
+  }
+  const path = normalizePath(_path, false);
+
+  for (let index = 0; index < negPatterns.length; index++) {
+    const nglob = negPatterns[index];
+    if (nglob(path)) {
+      return returnIndex ? -1 : false;
+    }
+  }
+
+  const applied = isList && [path].concat(args.slice(1));
+  for (let index = 0; index < patterns.length; index++) {
+    const pattern = patterns[index];
+    if (isList ? pattern(...applied) : pattern(path)) {
+      return returnIndex ? index : true;
+    }
+  }
+
+  return returnIndex ? -1 : false;
+};
+
+/**
+ * @param {AnymatchMatcher} matchers
+ * @param {Array|string} testString
+ * @param {object} options
+ * @returns {boolean|number|Function}
+ */
+const anymatch = (matchers, testString, options = DEFAULT_OPTIONS) => {
+  if (matchers == null) {
+    throw new TypeError('anymatch: specify first argument');
+  }
+  const opts = typeof options === 'boolean' ? {returnIndex: options} : options;
+  const returnIndex = opts.returnIndex || false;
+
+  // Early cache for matchers.
+  const mtchers = arrify(matchers);
+  const negatedGlobs = mtchers
+    .filter(item => typeof item === 'string' && item.charAt(0) === BANG)
+    .map(item => item.slice(1))
+    .map(item => picomatch(item, opts));
+  const patterns = mtchers
+    .filter(item => typeof item !== 'string' || (typeof item === 'string' && item.charAt(0) !== BANG))
+    .map(matcher => createPattern(matcher, opts));
+
+  if (testString == null) {
+    return (testString, ri = false) => {
+      const returnIndex = typeof ri === 'boolean' ? ri : false;
+      return matchPatterns(patterns, negatedGlobs, testString, returnIndex);
+    }
+  }
+
+  return matchPatterns(patterns, negatedGlobs, testString, returnIndex);
+};
+
+anymatch.default = anymatch;
+module.exports = anymatch;

+ 48 - 0
node_modules/anymatch/package.json

@@ -0,0 +1,48 @@
+{
+  "name": "anymatch",
+  "version": "3.1.3",
+  "description": "Matches strings against configurable strings, globs, regular expressions, and/or functions",
+  "files": [
+    "index.js",
+    "index.d.ts"
+  ],
+  "dependencies": {
+    "normalize-path": "^3.0.0",
+    "picomatch": "^2.0.4"
+  },
+  "author": {
+    "name": "Elan Shanker",
+    "url": "https://github.com/es128"
+  },
+  "license": "ISC",
+  "homepage": "https://github.com/micromatch/anymatch",
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/micromatch/anymatch"
+  },
+  "keywords": [
+    "match",
+    "any",
+    "string",
+    "file",
+    "fs",
+    "list",
+    "glob",
+    "regex",
+    "regexp",
+    "regular",
+    "expression",
+    "function"
+  ],
+  "scripts": {
+    "test": "nyc mocha",
+    "mocha": "mocha"
+  },
+  "devDependencies": {
+    "mocha": "^6.1.3",
+    "nyc": "^14.0.0"
+  },
+  "engines": {
+    "node": ">= 8"
+  }
+}

+ 263 - 0
node_modules/binary-extensions/binary-extensions.json

@@ -0,0 +1,263 @@
+[
+	"3dm",
+	"3ds",
+	"3g2",
+	"3gp",
+	"7z",
+	"a",
+	"aac",
+	"adp",
+	"afdesign",
+	"afphoto",
+	"afpub",
+	"ai",
+	"aif",
+	"aiff",
+	"alz",
+	"ape",
+	"apk",
+	"appimage",
+	"ar",
+	"arj",
+	"asf",
+	"au",
+	"avi",
+	"bak",
+	"baml",
+	"bh",
+	"bin",
+	"bk",
+	"bmp",
+	"btif",
+	"bz2",
+	"bzip2",
+	"cab",
+	"caf",
+	"cgm",
+	"class",
+	"cmx",
+	"cpio",
+	"cr2",
+	"cur",
+	"dat",
+	"dcm",
+	"deb",
+	"dex",
+	"djvu",
+	"dll",
+	"dmg",
+	"dng",
+	"doc",
+	"docm",
+	"docx",
+	"dot",
+	"dotm",
+	"dra",
+	"DS_Store",
+	"dsk",
+	"dts",
+	"dtshd",
+	"dvb",
+	"dwg",
+	"dxf",
+	"ecelp4800",
+	"ecelp7470",
+	"ecelp9600",
+	"egg",
+	"eol",
+	"eot",
+	"epub",
+	"exe",
+	"f4v",
+	"fbs",
+	"fh",
+	"fla",
+	"flac",
+	"flatpak",
+	"fli",
+	"flv",
+	"fpx",
+	"fst",
+	"fvt",
+	"g3",
+	"gh",
+	"gif",
+	"graffle",
+	"gz",
+	"gzip",
+	"h261",
+	"h263",
+	"h264",
+	"icns",
+	"ico",
+	"ief",
+	"img",
+	"ipa",
+	"iso",
+	"jar",
+	"jpeg",
+	"jpg",
+	"jpgv",
+	"jpm",
+	"jxr",
+	"key",
+	"ktx",
+	"lha",
+	"lib",
+	"lvp",
+	"lz",
+	"lzh",
+	"lzma",
+	"lzo",
+	"m3u",
+	"m4a",
+	"m4v",
+	"mar",
+	"mdi",
+	"mht",
+	"mid",
+	"midi",
+	"mj2",
+	"mka",
+	"mkv",
+	"mmr",
+	"mng",
+	"mobi",
+	"mov",
+	"movie",
+	"mp3",
+	"mp4",
+	"mp4a",
+	"mpeg",
+	"mpg",
+	"mpga",
+	"mxu",
+	"nef",
+	"npx",
+	"numbers",
+	"nupkg",
+	"o",
+	"odp",
+	"ods",
+	"odt",
+	"oga",
+	"ogg",
+	"ogv",
+	"otf",
+	"ott",
+	"pages",
+	"pbm",
+	"pcx",
+	"pdb",
+	"pdf",
+	"pea",
+	"pgm",
+	"pic",
+	"png",
+	"pnm",
+	"pot",
+	"potm",
+	"potx",
+	"ppa",
+	"ppam",
+	"ppm",
+	"pps",
+	"ppsm",
+	"ppsx",
+	"ppt",
+	"pptm",
+	"pptx",
+	"psd",
+	"pya",
+	"pyc",
+	"pyo",
+	"pyv",
+	"qt",
+	"rar",
+	"ras",
+	"raw",
+	"resources",
+	"rgb",
+	"rip",
+	"rlc",
+	"rmf",
+	"rmvb",
+	"rpm",
+	"rtf",
+	"rz",
+	"s3m",
+	"s7z",
+	"scpt",
+	"sgi",
+	"shar",
+	"snap",
+	"sil",
+	"sketch",
+	"slk",
+	"smv",
+	"snk",
+	"so",
+	"stl",
+	"suo",
+	"sub",
+	"swf",
+	"tar",
+	"tbz",
+	"tbz2",
+	"tga",
+	"tgz",
+	"thmx",
+	"tif",
+	"tiff",
+	"tlz",
+	"ttc",
+	"ttf",
+	"txz",
+	"udf",
+	"uvh",
+	"uvi",
+	"uvm",
+	"uvp",
+	"uvs",
+	"uvu",
+	"viv",
+	"vob",
+	"war",
+	"wav",
+	"wax",
+	"wbmp",
+	"wdp",
+	"weba",
+	"webm",
+	"webp",
+	"whl",
+	"wim",
+	"wm",
+	"wma",
+	"wmv",
+	"wmx",
+	"woff",
+	"woff2",
+	"wrm",
+	"wvx",
+	"xbm",
+	"xif",
+	"xla",
+	"xlam",
+	"xls",
+	"xlsb",
+	"xlsm",
+	"xlsx",
+	"xlt",
+	"xltm",
+	"xltx",
+	"xm",
+	"xmind",
+	"xpi",
+	"xpm",
+	"xwd",
+	"xz",
+	"z",
+	"zip",
+	"zipx"
+]

+ 3 - 0
node_modules/binary-extensions/binary-extensions.json.d.ts

@@ -0,0 +1,3 @@
+declare const binaryExtensionsJson: readonly string[];
+
+export = binaryExtensionsJson;

+ 14 - 0
node_modules/binary-extensions/index.d.ts

@@ -0,0 +1,14 @@
+/**
+List of binary file extensions.
+
+@example
+```
+import binaryExtensions = require('binary-extensions');
+
+console.log(binaryExtensions);
+//=> ['3ds', '3g2', …]
+```
+*/
+declare const binaryExtensions: readonly string[];
+
+export = binaryExtensions;

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.