Просмотр исходного кода

Merge branch 'master' of http://git.zthymaoyi.com/zyw/tourism

# Conflicts:
#	.gitignore
achao 2 лет назад
Родитель
Сommit
f73565eceb
100 измененных файлов с 12151 добавлено и 19 удалено
  1. 3 3
      .gitignore
  2. 43 2
      uni_applet/App.vue
  3. 138 0
      uni_applet/components/text-over-flow/text-over-flow.vue
  4. 2 1
      uni_applet/config/index.js
  5. 302 0
      uni_applet/pageA/find/createLifeService.vue
  6. 387 0
      uni_applet/pageA/find/search.vue
  7. 8 0
      uni_applet/pageA/food/groupBuying.vue
  8. 387 0
      uni_applet/pageA/food/search.vue
  9. 144 0
      uni_applet/pages.json
  10. 350 3
      uni_applet/pages/find/find.vue
  11. 414 3
      uni_applet/pages/food/food.vue
  12. BIN
      uni_applet/static/image/card/del.png
  13. BIN
      uni_applet/static/image/card/search.png
  14. BIN
      uni_applet/static/image/card/searchdel.png
  15. BIN
      uni_applet/static/image/card/voice.png
  16. BIN
      uni_applet/static/image/find/camera.png
  17. BIN
      uni_applet/static/image/find/geren.png
  18. BIN
      uni_applet/static/image/find/yingyezhizhao.png
  19. BIN
      uni_applet/static/image/find/yjt.png
  20. BIN
      uni_applet/static/image/nav-icon/antOutline-compass Copy.png
  21. BIN
      uni_applet/static/image/nav-icon/antOutline-compass.png
  22. BIN
      uni_applet/static/image/nav-icon/antOutline-user Copy.png
  23. BIN
      uni_applet/static/image/nav-icon/antOutline-user.png
  24. BIN
      uni_applet/static/image/nav-icon/iconPark-landscape Copy.png
  25. BIN
      uni_applet/static/image/nav-icon/iconPark-landscape.png
  26. BIN
      uni_applet/static/image/nav-icon/md-restaurant_menu Copy.png
  27. BIN
      uni_applet/static/image/nav-icon/md-restaurant_menu.png
  28. BIN
      uni_applet/static/image/nav-icon/riLine-hotel-line Copy.png
  29. BIN
      uni_applet/static/image/nav-icon/riLine-hotel-line.png
  30. BIN
      uni_applet/static/mic.png
  31. 32 0
      uni_applet/style/icons/iconfont-colors.css
  32. 0 2
      uni_applet/style/icons/iconfont.css
  33. 3 3
      uni_applet/uni_modules/d-search-log/components/d-search-log/d-search-log.vue
  34. 2 2
      uni_applet/uni_modules/uview-ui/components/u-form-item/u-form-item.vue
  35. 57 0
      uni_merchants_enter/App.vue
  36. 184 0
      uni_merchants_enter/colorui/animation.css
  37. 65 0
      uni_merchants_enter/colorui/components/cu-custom.vue
  38. 36 0
      uni_merchants_enter/colorui/icon.css
  39. 3935 0
      uni_merchants_enter/colorui/main.css
  40. 87 0
      uni_merchants_enter/common/helper.js
  41. 143 0
      uni_merchants_enter/components/ossutil/base64.js
  42. 9 0
      uni_merchants_enter/components/ossutil/config.js
  43. 178 0
      uni_merchants_enter/components/ossutil/crypto.js
  44. 34 0
      uni_merchants_enter/components/ossutil/hmac.js
  45. 79 0
      uni_merchants_enter/components/ossutil/sha1.js
  46. 394 0
      uni_merchants_enter/components/ossutil/signature.js
  47. 85 0
      uni_merchants_enter/components/ossutil/uploadFile.js
  48. 138 0
      uni_merchants_enter/components/text-over-flow/text-over-flow.vue
  49. 13 0
      uni_merchants_enter/config/index.js
  50. 20 0
      uni_merchants_enter/index.html
  51. 141 0
      uni_merchants_enter/js_sdk/district.js
  52. 52 0
      uni_merchants_enter/js_sdk/filterCity.js
  53. 0 0
      uni_merchants_enter/js_sdk/js-amap/__MACOSX/amap-wx.130.js
  54. 31 0
      uni_merchants_enter/js_sdk/js-amap/amap-wx.130.js
  55. 1122 0
      uni_merchants_enter/js_sdk/qqmap-wx-jssdk.js
  56. 0 0
      uni_merchants_enter/js_sdk/qqmap-wx-jssdk.min.js
  57. 50 0
      uni_merchants_enter/js_sdk/share.js
  58. 272 0
      uni_merchants_enter/js_sdk/wa-permission/permission.js
  59. 594 0
      uni_merchants_enter/js_sdk/xfl-DateFormat/DateFormat.js
  60. 38 0
      uni_merchants_enter/main.js
  61. 78 0
      uni_merchants_enter/manifest.json
  62. 373 0
      uni_merchants_enter/pageA/enter/cateringindustry.vue
  63. 283 0
      uni_merchants_enter/pageA/enter/homestay.vue
  64. 270 0
      uni_merchants_enter/pageA/enter/hotel.vue
  65. 22 0
      uni_merchants_enter/pageA/enter/myCateringdustry/addGroupBuying.vue
  66. 22 0
      uni_merchants_enter/pageA/enter/myCateringdustry/addGroupBuyingNext.vue
  67. 22 0
      uni_merchants_enter/pageA/enter/myCateringdustry/addfood.vue
  68. 22 0
      uni_merchants_enter/pageA/enter/myCateringdustry/index.vue
  69. 22 0
      uni_merchants_enter/pageA/enter/myCateringdustry/shopSetting/editCertificate.vue
  70. 22 0
      uni_merchants_enter/pageA/enter/myCateringdustry/shopSetting/editFoodClassify.vue
  71. 22 0
      uni_merchants_enter/pageA/enter/myCateringdustry/shopSetting/editShopImage.vue
  72. 22 0
      uni_merchants_enter/pageA/enter/myCateringdustry/shopSetting/editShopInformation.vue
  73. 22 0
      uni_merchants_enter/pageA/enter/myCateringdustry/shopSetting/foodInfomation.vue
  74. 22 0
      uni_merchants_enter/pageA/enter/myCateringdustry/shopSetting/groupBuying.vue
  75. 22 0
      uni_merchants_enter/pageA/enter/myCateringdustry/shopSetting/index.vue
  76. 22 0
      uni_merchants_enter/pageA/enter/myCateringdustry/shopSetting/lookGroupBuying.vue
  77. 22 0
      uni_merchants_enter/pageA/enter/myCateringdustry/shopSetting/saleroom.vue
  78. 22 0
      uni_merchants_enter/pageA/enter/myHomestay/add.vue
  79. 22 0
      uni_merchants_enter/pageA/enter/myHomestay/edit.vue
  80. 22 0
      uni_merchants_enter/pageA/enter/myHomestay/index.vue
  81. 22 0
      uni_merchants_enter/pageA/enter/myHomestay/search.vue
  82. 22 0
      uni_merchants_enter/pageA/my/bill.vue
  83. 22 0
      uni_merchants_enter/pageA/notice/noticedetail.vue
  84. 24 0
      uni_merchants_enter/pageA/webview.vue
  85. 284 0
      uni_merchants_enter/pages.json
  86. 329 0
      uni_merchants_enter/pages/enter/enter.vue
  87. 22 0
      uni_merchants_enter/pages/my/my.vue
  88. 98 0
      uni_merchants_enter/pages/notice/index.vue
  89. BIN
      uni_merchants_enter/static/image/enter/camera.png
  90. BIN
      uni_merchants_enter/static/image/enter/jingyingxukezheng.png
  91. BIN
      uni_merchants_enter/static/image/enter/news.png
  92. BIN
      uni_merchants_enter/static/image/enter/yingyezhizhao.png
  93. BIN
      uni_merchants_enter/static/image/logo.png
  94. BIN
      uni_merchants_enter/static/image/nav-icon/antOutline-team Copy.png
  95. BIN
      uni_merchants_enter/static/image/nav-icon/antOutline-team.png
  96. BIN
      uni_merchants_enter/static/image/nav-icon/antOutline-user Copy.png
  97. BIN
      uni_merchants_enter/static/image/nav-icon/antOutline-user.png
  98. BIN
      uni_merchants_enter/static/image/nav-icon/md-notifications_none Copy.png
  99. BIN
      uni_merchants_enter/static/image/nav-icon/md-notifications_none.png
  100. BIN
      uni_merchants_enter/static/image/yjt.png

+ 3 - 3
.gitignore

@@ -49,6 +49,7 @@ mvnw.cmd
 /unimall-launcher/target/
 /unimall-plugin-core/target/
 /unimall-app/unpackage/dist/
+
 /unimall-app/unpackage/resources/
 /unimall-app/unpackage/debug/
 /unimall-admin/dist.zip
@@ -70,10 +71,9 @@ unimall.log.*.tmp
 /unimall-admin/src/views/plugins/
 
 ### xcx ###
-.map/
+*.map
 /unpackage/
 *.wxss
 *.json
 *.wxml
-xiaochengxu/unpackage/
-node_modules/
+/uni_applet/unpackage/

+ 43 - 2
uni_applet/App.vue

@@ -21,9 +21,50 @@
 	@import '@/uni_modules/uni-scss/index.scss';
 	@import '@/static/styles/index.scss';
 	@import '@/style/icons/iconfont.css';
+	@import '@/style/icons/iconfont-colors.css';
 	// 设置整个项目的背景色
 	page {
-		background-color: #f5f5f5;
+		background-color: #f7f4ed;
+	}
+	.content{
+		padding-bottom:150rpx;
+	}
+	.wrap{
+		background:#fff;
+		border-radius:20rpx;
+		margin:20rpx;
+	}
+	.caution{
+		color:red;
+	}
+	.footer{
+		position:fixed;
+		bottom:0;
+		left:0;
+		background:#fff;
+		width:100%;
+		z-index:10;
+		padding:30rpx 0;
+		.submit{
+			background:#f8bc31;
+			color:#fff;
+			width:90%;
+		}
+	}
+	.flex{
+		display:flex;
+	}
+	.justify-space-between{
+		justify-content: space-between;
+	}
+	.align-item-center{
+		align-items: center;
+	}
+	.detailedAddress{
+		width:120rpx;
+		overflow:hidden;
+		white-space: nowrap;
+		text-overflow: ellipsis;
+		-o-text-overflow:ellipsis;
 	}
-	
 </style>

+ 138 - 0
uni_applet/components/text-over-flow/text-over-flow.vue

@@ -0,0 +1,138 @@
+<template>
+  <view>
+    <view style="position: relative" v-if="isHide">
+      <view class="dt-content" :style="'-webkit-line-clamp:'+line">
+        <text class="content">
+          <slot>{{ dt ? dt : '' }}</slot>
+        </text>
+      </view>
+      <view class="button-show" @tap="isHide = false" v-if="enableButton&&lines>line">
+        <text style="color: #C82229">{{ expandText }}</text>
+      </view>
+    </view>
+    <view v-else>
+      <view>
+        <text class="content">
+          <slot>{{ dt ? dt : '' }}</slot>
+        </text>
+      </view>
+      <view class="fold-hint" v-if="foldHint">
+        <view @tap="isHide = true">
+          {{ foldHint }}
+        </view>
+      </view>
+    </view>
+    <view>
+      <text class="placeholder">
+        {{ placeholder }}
+      </text>
+    </view>
+  </view>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      // 是否隐藏多余行。初始状态不隐藏
+      isHide: true,
+      // 全量所占文本高度
+      textHeight: 0,
+      // 单行文本所占高度
+      lineHeight: 1,
+      // 占位文本
+      placeholder: '占位'
+    };
+  },
+  props: {
+    // 展示多少行
+    line: {
+      type: [Number, String],
+      default: 1
+    },
+    // 文本
+    dt: {
+      type: [String],
+      default: ''
+    },
+    enableButton: {
+      type: Boolean,
+      default: true
+    },
+    // 自定义展开提示
+    expandText: {
+      type: String,
+      default: "展开"
+    },
+    // 自定义收起提示
+    foldHint: {
+      type: String,
+      default: "收起"
+    }
+  },
+
+  watch:{
+    dt(){
+      let that = this
+      setTimeout(() => {
+        let query = uni.createSelectorQuery().in(that);
+        // 获取所有文本在html中的高度
+        query.select('.content').boundingClientRect(data => {
+          that.textHeight = data.height
+        }).exec();
+      }, 100)
+    }
+  },
+
+  mounted() {
+    if (this.enableButton) {
+      let query = uni.createSelectorQuery().in(this);
+      // 获取所有文本在html中的高度
+      query.select('.content').boundingClientRect(data => {
+        this.textHeight = data.height
+      }).exec();
+
+      // 通过占位元素获取单行文本的高度
+      query.select('.placeholder').boundingClientRect(data => {
+        this.lineHeight = data.height
+      }).exec();
+    }
+    // 获取单行文本高度后,置空占位元素,使其释放占位
+    this.placeholder = ''
+  },
+  computed: {
+    // 全文本所占总行数
+    lines() {
+      if (!this.enableButton) {
+        return this.line
+      }
+      return Math.floor(this.textHeight > 0 && this.lineHeight > 0 ? this.textHeight / this.lineHeight : 0)
+    }
+  }
+}
+</script>
+
+<style scoped>
+.dt-content {
+  overflow: hidden;
+  text-overflow: clip;
+  display: -webkit-box;
+  -webkit-box-orient: vertical;
+}
+
+.button-show {
+  width: 70rpx;
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  z-index: 0;
+  text-align: right;
+  background-image: linear-gradient(-180deg, rgba(233, 236, 239, 0) 50%, #FFF 80%);
+  padding-top: 2rem;
+}
+
+.fold-hint {
+  color: #C82229;
+  text-align: right
+}
+</style>

+ 2 - 1
uni_applet/config/index.js

@@ -1,8 +1,9 @@
 const dev = {
 	// baseUrlNew: 'http://192.168.110.72:8182',
 	// baseUrlNew: 'http://192.168.110.138:8182',
+	baseUrlNew: 'http://192.168.110.138:8183',
 	// baseUrlNew: 'http://192.168.110.82:8182',
-	baseUrlNew: 'https://cardapi.eliangeyun.com',
+	// baseUrlNew: 'https://cardapi.eliangeyun.com',
 	h5Appid: 'wxb66b599f7f61b46f',
 	debug: false
 }

+ 302 - 0
uni_applet/pageA/find/createLifeService.vue

@@ -0,0 +1,302 @@
+<template>
+	<view class='content'>
+		<view class='wrap'>
+			<u--form  ref="uForm">
+				<u-form-item labelPosition='left' label="主体">
+					<u-radio-group placement='row'  v-model="form.mainBody">
+						<u-radio name="个人" >个人</u-radio>
+						<u-radio name="商铺" >商铺</u-radio>
+					</u-radio-group>
+				</u-form-item>
+				<u-form-item v-if='form.mainBody=="商铺"' labelWidth='80' labelPosition='left' label="店铺名称">	
+					<u-input inputAlign='right' border='none' placeholder='输入店铺名称' v-model="form.shopNames" />
+				</u-form-item>
+				<u-form-item v-if='form.mainBody=="个人"' labelWidth='80' labelPosition='left' label="服务名称">
+					<u-input inputAlign='right' border='none' placeholder='输入服务名称,如跑腿、代驾' v-model="form.shopNames" />
+				</u-form-item>
+				<u-form-item labelWidth='80' labelPosition='top' label="封面图片">
+					<u-upload :fileList="fileList1" @afterRead="afterRead($event,0)" @delete="deletePic" name="1" multiple
+						:maxCount="1"></u-upload>
+				</u-form-item>
+				
+				<u-form-item labelWidth='80' labelPosition='left' @click='placeSelect(),hideKeyboard()' label="店铺位置">
+					<view style='text-align:right;' v-if="form.province">{{ form.province }}{{ form.city }}{{ form.area }}</view>
+					<view style='text-align:right;' v-else>
+						<text style='text-align:right;'>选择位置 </text>
+						<image src="@/static/image/find/yjt.png" mode=""
+							style="margin-left:10rpx;width:12rpx;height: 21rpx;"></image>
+					</view>
+				</u-form-item>
+				<u-form-item labelWidth='80' labelPosition='left' label="详细地址">
+					<u-input inputAlign='right' border='none' placeholder='输入详细地址,不超过15个字' v-model="form.detailedAddress" />
+				</u-form-item>
+				<u-form-item  labelWidth='80' labelPosition='top' label="业务描述">
+					<u--textarea v-model="form.serviceDescription" autoHeight placeholder="输入业务描述,0-200个字" ></u--textarea> 
+				</u-form-item>
+				<view class='title'>以下信息为选填信息</view>
+				<u-form-item v-if='form.mainBody=="商铺"' labelWidth='160' labelPosition='left' label="联系人(仅平台可见)">
+					<u-input inputAlign='right' placeholder='输入联系人' border='none' v-model="form.realname" type="select" />
+				</u-form-item>
+				<u-form-item  v-if='form.mainBody=="个人"' labelWidth='160' labelPosition='left' label="姓名(仅平台可见)">
+					<u-input inputAlign='right' placeholder='输入姓名' border='none' v-model="form.realname" type="select" />
+				</u-form-item>
+				<u-form-item labelWidth='160' labelPosition='left' label="昵称(所有人可见)">
+					<u-input inputAlign='right' placeholder='输入昵称' border='none' v-model="form.sex" type="select" />
+				</u-form-item>
+				<u-form-item labelWidth='160' labelPosition='left' label="联系电话(所有人可见)">
+					<u-input inputAlign='right' maxlength="15" type='number' placeholder='输入联系电话' border='none' v-model="form.phone"  />
+				</u-form-item>
+				<u-form-item v-if='form.mainBody=="商铺"' labelWidth='80' labelPosition='top' label="营业执照">
+					<u-upload height='208' width='320' :fileList="fileList2" @afterRead="afterRead($event,1)" @delete="deletePic" name="2" multiple
+						:maxCount="1">
+						<image style='width:680rpx;height:417rpx;' src="../../static/image/find/yingyezhizhao.png" mode=""></image>
+						</u-upload>
+				</u-form-item>
+				<view v-if='form.mainBody=="个人"' class='caution'>注:如提供风险类服务,请上传身份证信息</view>
+				<u-form-item  v-if='form.mainBody=="个人"' labelWidth='120' labelPosition='top' label="身份证头像面">
+					<u-upload height='208' width='320' :fileList="fileList4" @afterRead="afterRead($event,2)" @delete="deletePic" name="4" multiple
+						:maxCount="1">
+						<view class="bgc">
+							<image class='circle' style='width:123rpx;height:123rpx;' src="../../static/image/find/camera.png" mode=""></image>
+							<view>请上传头像面</view>
+						</view>
+						</u-upload>
+				</u-form-item>
+				<u-form-item  v-if='form.mainBody=="个人"' labelWidth='120' labelPosition='top' label="身份证国徽面">
+					<u-upload  height='208' width='320' :fileList="fileList6" @afterRead="afterRead($event,3)" @delete="deletePic" name="6" multiple
+						:maxCount="1">
+						<view class="bgc1">
+							<image class='circle' style='width:123rpx;height:123rpx;' src="../../static/image/find/camera.png" mode=""></image>
+							<view>请上传国徽面</view>
+						</view>
+					</u-upload>
+				</u-form-item>
+				<u-form-item   v-if='form.mainBody=="个人"' labelWidth='120' labelPosition='left' label="身份证号码">
+					<u-input inputAlign='right' border='none' placeholder='请输入身份证号码' v-model="form.personNo" />
+				</u-form-item>
+				<view></view>
+			</u--form>
+			
+			<view class="footer">
+				<button @click='confirmSubmit' class="submit">提交</button>
+			</view>
+		</view>
+		<u-modal :show="isSubmit" :content='content' @confirm="$u.debounce(confirmSubmit, 500)" showCancelButton
+			@cancel="isSubmit=false" @close="isSubmit=false" closeOnClickOverlay></u-modal>
+	</view>
+</template>
+
+<script>
+	var that
+	import uploadImage from '@/components/ossutil/uploadFile.js';
+	export default {
+		data() {
+			return {
+				form:{
+					mainBody:'商铺',
+					city: '',
+					area: '',
+					province: '',
+					location: '',
+					detailedAddress: '',
+					personImageFront:'',
+					personImageBack:'',
+					personNo:'',
+					
+				},
+				content:'确定提交店铺信息',
+				isSubmit:false,
+				// 封面
+				fileList:[],
+				fileList1:[],
+				// 营业执照
+				fileList2:[],
+				fileList3:[],
+				// 头像面
+				fileList4:[],
+				fileList5:[],
+				// 国徽面
+				fileList6:[],
+				fileList7:[],
+			}
+		},
+		onLoad() {
+			that = this
+		
+		},
+		onShow() {
+			
+		},
+		methods: {
+			submit(){
+				if(this.form.mainBody=='商铺'){
+					this.content='确定提交店铺信息'
+				}else{
+					this.content='确定提交服务信息'
+				}
+				this.isSubmit = true
+			},
+			confirmSubmit() {
+				uni.showLoading({
+					title: '加载中',
+					mask: true
+				})
+				this.$request.baseRequest('admin.tourism.productManagement', 'add', {
+					productManagement: JSON.stringify(this.form)
+				}, failres => {
+					uni.showToast({
+						icon: "none",
+						title: failres.errmsg,
+						duration: 3000
+					});
+			
+					uni.hideLoading()
+				}).then(res => {
+					this.isSubmit = false
+					uni.showToast({
+						icon: "success",
+						title: '提交成功!',
+						duration: 2000
+					});
+					uni.navigateBack()
+			
+				})
+			},
+			placeSelect() {
+				uni.chooseLocation({
+					success: function(res) {
+						console.log(res);
+						that.form.location = res.latitude + ',' + res.longitude
+						let _address = that.$helper.formatLocation(res.address)
+						console.log(_address)
+						that.form.province = _address.Province
+						that.form.city = _address.City
+						that.form.area = _address.Country
+						that.form.detailedAddress = _address.Village
+						that.$forceUpdate()
+					}
+				});
+			},
+			hideKeyboard() {
+				uni.hideKeyboard()
+			},
+			// 删除图片
+			deletePic(event,status) {
+				this[`fileList${event.name}`].splice(event.index, 1)
+			},
+			// 新增图片
+			async afterRead(event,status) {
+				// 当设置 multiple 为 true 时, file 为数组格式,否则为对象格式
+				let lists = [].concat(event.file)
+				let fileListLen = this[`fileList${event.name}`].length
+				lists.map((item) => {
+					this[`fileList${event.name}`].push({
+						...item,
+						status: 'uploading',
+						message: '上传中'
+					})
+				})
+				for (let i = 0; i < lists.length; i++) {
+					const result = await this.uploadFilePromise(lists[i].url,status)
+					
+					let item = this[`fileList${event.name}`][fileListLen]
+					this[`fileList${event.name}`].splice(fileListLen, 1, Object.assign(item, {
+						status: 'success',
+						message: '',
+						url: result
+					}))
+					fileListLen++
+					console.log(that.form, this[`fileList${event.name}`])
+					
+				}
+			},
+			uploadFilePromise(res,status) {
+				return new Promise((resolve, reject) => {
+					uploadImage(res, 'cardImages/',
+						result => {
+							if(status==0){
+								that.form.coverImage = result
+							}else if(status==1){
+								that.form.businessLicense = result
+							}else if(status==2){
+								that.form.personImageFront = result
+									uni.showLoading({
+										title: '加载中',
+										mask: true
+									})
+									that.$request.baseRequest('admin.tourism.productManagement', 'personShibie', {
+										personImageFront: that.form.personImageFront
+									}, failres => {
+										uni.showToast({
+											icon: "none",
+											title: failres.errmsg,
+											duration: 3000
+										});	
+										uni.hideLoading()
+									}).then(res => {
+										console.log(res)
+										uni.hideLoading()
+										that.form.personNo=res.data.recPersonNo
+										console.log(that.form)
+										that.$forceUpdate()	
+									})
+							}else if(status==3){
+								that.form.personImageBack = result
+							}
+							resolve(res)
+						}
+					)
+				})
+			},
+			
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+ .wrap{
+	 padding:20rpx;
+ }
+ .title{
+	 font-size:32rpx;
+	 font-weight:600;
+ }
+ /deep/.u-radio-group,/deep/.u-radio-group--row {
+	flex-direction: row-reverse !important;
+	.u-radio{
+		margin-left:10rpx;
+	}
+ }
+ // 人像
+ .bgc,.bgc1{
+	 width:672rpx;
+	 height:417rpx;
+	 background:url('https://taohaoliang.oss-cn-beijing.aliyuncs.com/pcfiles/card2.png') no-repeat center;
+	 background-size: 100%;
+	 text-align:center;
+ }
+ // 国徽
+ .bgc1{
+ 	 background:url('https://taohaoliang.oss-cn-beijing.aliyuncs.com/pcfiles/card.png') no-repeat center;
+	 background-size: 100%;
+ }
+ .circle{
+	margin:110rpx 0 20rpx 0;
+ }
+ /deep/.u-upload {
+ 
+ 	.u-upload__deletable {
+ 		height: 40rpx;
+ 		width: 40rpx;
+ 		line-height: 40rpx;
+ 	}
+ 
+ 	.u-upload__deletable__icon {
+ 		top: 8rpx;
+ 	}
+ 
+ 	.uicon-close {
+ 		font-size: 20px !important;
+ 	}
+ }
+</style>

+ 387 - 0
uni_applet/pageA/find/search.vue

@@ -0,0 +1,387 @@
+<template>
+	<view>
+		<d-search-log :placeholder="'搜索名片'" :color_border="color_border" :color_text="color_border"
+			:search_list_old_man_num='15' :search_list_hot="search_list_hot" :store_key="store_key" :input_text="input_text"
+			@onClickDelAllApi="onClickDelAll" @onSearchNameApi="onSearchName" @onSearchvoiceApi='onSearchvoice'></d-search-log>
+		<u-popup :show="isRecorderManager" mode="bottom">
+			<view class="shqx" v-if="longPress == '2'">
+				上划取消
+			</view>
+			<view class="record-layer">
+				<view class="record-box">
+					<view class="record-btn-layer" v-if="tempFilePath == ''">
+						<view class="record-btn">
+							<image src="../../static/mic.png" mode="widthFix" style="width:120rpx;height: auto;"
+								@longpress="longpressBtn" @touchend="touchendBtn" @touchmove="handleTouchMove"></image>
+							<text class="text">{{longPress == '1' ? '按住说出姓名' : '松开自动识别'}}</text>
+						</view>
+					</view>
+					<view class="prompt-layer prompt-layer-1" v-if="longPress == '2'">
+						<view class="prompt-loader">
+							<view class="em" v-for="(item,index) in 15" :key="index"></view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</u-popup>
+		<u-toast ref="uToast"></u-toast>
+	</view>
+</template>
+
+<script>
+	import dSearchLog from '@/uni_modules/d-search-log/components/d-search-log/d-search-log.vue'
+	const recorderManager = uni.getRecorderManager();
+	const innerAudioContext = uni.createInnerAudioContext();
+	var init // 录制时长计时器
+	var timer // 播放 录制倒计时
+	export default {
+		components: {
+			"dSearchLog": dSearchLog
+		},
+		data() {
+			return {
+
+				duration: 2000, //录音最大值ms 60000/1分钟
+				tempFilePath: '', //音频路径
+				playStatus: 0, //录音播放状态 0:未播放 1:正在播放
+				longPress: '1',
+				tempFilePath: '',
+				color_border: "#00aaff",
+				search_list_hot: [],
+				store_key: 'search_list',
+				isRecorderManager: false,
+				is_clock: true,
+				startPoint: "",
+				input_text:""
+			};
+		},
+		onLoad(options) {
+			if (options.mic == 1) {
+				this.isRecorderManager = true
+			}
+		},
+		methods: {
+			onSearchvoice(e){
+				this.isRecorderManager = true
+			},
+			handleTouchMove: function(e) {
+				console.log("滑动")
+				if (Math.abs(e.touches[e.touches.length - 1].clientY - this.startPoint.clientY) > 35) {
+
+					this.is_clock = false
+				} else {
+
+					this.is_clock = true
+				}
+			},
+			longpressBtn(e) {
+				this.longPress = '2';
+				this.is_clock = true,
+					console.log(e);
+				this.startPoint = e.touches[0],
+					recorderManager.onStop((res) => {
+						console.log("录音结束")
+						this.tempFilePath = res.tempFilePath;
+					})
+				const options = {
+					duration: this.duration, // 指定录音的时长,单位 ms
+					sampleRate: 16000, // 采样率
+					numberOfChannels: 1, // 录音通道数
+					encodeBitRate: 96000, // 编码码率
+					// format: 'mp3', // 音频格式,有效值 aac/mp3
+					frameSize: 10, // 指定帧大小,单位 KB
+				}
+				recorderManager.start(options);
+				// 监听音频开始事件
+				recorderManager.onStart((res) => {
+					console.log(res)
+				})
+			},
+			touchendBtn() {
+				console.log("录音结束")
+				let that = this
+				this.longPress = '1'; 
+				that.isRecorderManager = false
+				recorderManager.onStop((res) => {
+					this.tempFilePath = res.tempFilePath
+					let _file = ''
+					if (that.is_clock) {
+						_file = uni.getFileSystemManager().readFileSync(res.tempFilePath, "base64")
+						console.log(_file)
+						uni.showLoading({
+							title:"正在识别"
+						})
+						that.$request.baseRequest('admin.tourism.productManagement', 'speechRecognition', {
+							voiceMessage: _file,
+						}, failres => {
+							console.log('res+++++', failres.errmsg)
+							uni.hideLoading()
+							uni.showToast({
+								icon:"none",
+								title: failres.errmsg,
+								duration: 3000
+							});
+						}).then(res => {
+							uni.hideLoading()
+							console.log(res)
+							if(res.data.text.length>10){
+								var text = res.data.text.substring(0, 10)
+							}else{
+								var text = res.data.text
+							}
+							that.input_text = text
+							// uni.setStorageSync('search_val', text);
+							// uni.switchTab({
+							// 	url: "/pages/cardHolder/search"
+
+							// })
+
+						})
+					}
+					recorderManager.stop()
+				})
+			},
+			onClickDelAll() {},
+			onSearchName(e) {
+				if(e.length>10){
+					var text = e.substring(0, 10)
+				}else{
+					var text = e
+				}
+				
+				uni.setStorageSync('search_val', text);
+				uni.switchTab({
+					url: "/pages/find/find"
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.shqx {
+		position: absolute;
+		top: -100rpx;
+		left: 0;
+		right: 0;
+		margin: auto;
+		text-align: center;
+		color: rgba(221, 221, 221, 1);
+	}
+
+	.record-box {
+		width: 100%;
+		position: relative;
+		top: 80rpx;
+	}
+
+	.record-btn-layer {
+		width: 100%;
+		display: flex;
+		justify-content: center;
+	}
+
+	.record-btn-layer button::after {
+		border: none;
+	}
+
+	.record-btn-layer button {
+		font-size: 14px;
+		line-height: 38px;
+		width: 100%;
+		height: 38px;
+		border-radius: 8px;
+		text-align: center;
+		background: rgba(56, 86, 156, 1);
+	}
+
+	.record-btn-layer button image {
+		width: 16px;
+		height: 16px;
+		margin-right: 4px;
+		vertical-align: middle;
+	}
+
+	.record-btn-layer .record-btn-2 {
+		background: rgba(56, 86, 156, 1);
+	}
+
+	.prompt-layer {
+		border-radius: 8px;
+		background: rgba(56, 86, 156, 1);
+		padding: 8px 16px;
+		box-sizing: border-box;
+		position: absolute;
+		left: 50%;
+		transform: translateX(-50%);
+	}
+
+	.prompt-layer::after {
+		content: '';
+		display: block;
+		border: 6px solid rgba(0, 0, 0, 0);
+		border-top-color: rgba(56, 86, 156, 1);
+		position: absolute;
+		bottom: -10px;
+		left: 50%;
+		transform: translateX(-50%);
+	}
+
+	.prompt-layer-1 {
+		font-size: 12px;
+		width: 128px;
+		text-align: center;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
+		top: -240px;
+	}
+
+	.del {
+		position: absolute;
+		top: -200rpx;
+
+		.img {
+			width: 100rpx;
+		}
+	}
+
+	.prompt-layer-1 .p {
+		color: #000000;
+	}
+
+	.prompt-layer-1 .span {
+		color: #fff;
+	}
+
+	.prompt-loader .em {}
+
+	.prompt-loader {
+		width: 96px;
+		height: 20px;
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		margin-bottom: 6px;
+	}
+
+	.prompt-loader .em {
+		display: block;
+		background: #fff;
+		width: 1px;
+		height: 10%;
+		margin-right: 2.5px;
+		float: left;
+	}
+
+	.prompt-loader .em:last-child {
+		margin-right: 0px;
+	}
+
+	.prompt-loader .em:nth-child(1) {
+		animation: load 2.5s 1.4s infinite linear;
+	}
+
+	.prompt-loader .em:nth-child(2) {
+		animation: load 2.5s 1.2s infinite linear;
+	}
+
+	.prompt-loader .em:nth-child(3) {
+		animation: load 2.5s 1s infinite linear;
+	}
+
+	.prompt-loader .em:nth-child(4) {
+		animation: load 2.5s 0.8s infinite linear;
+	}
+
+	.prompt-loader .em:nth-child(5) {
+		animation: load 2.5s 0.6s infinite linear;
+	}
+
+	.prompt-loader .em:nth-child(6) {
+		animation: load 2.5s 0.4s infinite linear;
+	}
+
+	.prompt-loader .em:nth-child(7) {
+		animation: load 2.5s 0.2s infinite linear;
+	}
+
+	.prompt-loader .em:nth-child(8) {
+		animation: load 2.5s 0s infinite linear;
+	}
+
+	.prompt-loader .em:nth-child(9) {
+		animation: load 2.5s 0.2s infinite linear;
+	}
+
+	.prompt-loader .em:nth-child(10) {
+		animation: load 2.5s 0.4s infinite linear;
+	}
+
+	.prompt-loader .em:nth-child(11) {
+		animation: load 2.5s 0.6s infinite linear;
+	}
+
+	.prompt-loader .em:nth-child(12) {
+		animation: load 2.5s 0.8s infinite linear;
+	}
+
+	.prompt-loader .em:nth-child(13) {
+		animation: load 2.5s 1s infinite linear;
+	}
+
+	.prompt-loader .em:nth-child(14) {
+		animation: load 2.5s 1.2s infinite linear;
+	}
+
+	.prompt-loader .em:nth-child(15) {
+		animation: load 2.5s 1.4s infinite linear;
+	}
+
+	@keyframes load {
+		0% {
+			height: 10%;
+		}
+
+		50% {
+			height: 100%;
+		}
+
+		100% {
+			height: 10%;
+		}
+	}
+
+	.prompt-layer-2 {
+		// top: -540px;
+	}
+
+	.prompt-layer-2 .text {
+		color: rgba(0, 0, 0, 1);
+		font-size: 12px;
+	}
+
+	.record-btn {
+		display: flex;
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+
+		.text {
+			margin-top: 20rpx;
+		}
+
+	}
+
+	/deep/.u-popup__content {
+		padding-bottom: 100rpx;
+		// background: linear-gradient(180deg, rgba(204, 204, 204, 0.95) 0%, rgba(203, 203, 203, 0.01) 100%) !important;
+		border-radius: 50% 50% 0 0;
+	}
+
+	.record-layerP {
+		position: relative;
+		top: 50px;
+	}
+</style>

+ 8 - 0
uni_applet/pageA/food/groupBuying.vue

@@ -0,0 +1,8 @@
+<template>
+</template>
+
+<script>
+</script>
+
+<style>
+</style>

+ 387 - 0
uni_applet/pageA/food/search.vue

@@ -0,0 +1,387 @@
+<template>
+	<view>
+		<d-search-log :placeholder="'搜索美食'" :color_border="color_border" :color_text="color_border"
+			:search_list_old_man_num='15' :search_list_hot="search_list_hot" :store_key="store_key" :input_text="input_text"
+			@onClickDelAllApi="onClickDelAll" @onSearchNameApi="onSearchName" @onSearchvoiceApi='onSearchvoice'></d-search-log>
+		<u-popup :show="isRecorderManager" mode="bottom">
+			<view class="shqx" v-if="longPress == '2'">
+				上划取消
+			</view>
+			<view class="record-layer">
+				<view class="record-box">
+					<view class="record-btn-layer" v-if="tempFilePath == ''">
+						<view class="record-btn">
+							<image src="../../static/mic.png" mode="widthFix" style="width:120rpx;height: auto;"
+								@longpress="longpressBtn" @touchend="touchendBtn" @touchmove="handleTouchMove"></image>
+							<text class="text">{{longPress == '1' ? '按住说出姓名' : '松开自动识别'}}</text>
+						</view>
+					</view>
+					<view class="prompt-layer prompt-layer-1" v-if="longPress == '2'">
+						<view class="prompt-loader">
+							<view class="em" v-for="(item,index) in 15" :key="index"></view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</u-popup>
+		<u-toast ref="uToast"></u-toast>
+	</view>
+</template>
+
+<script>
+	import dSearchLog from '@/uni_modules/d-search-log/components/d-search-log/d-search-log.vue'
+	const recorderManager = uni.getRecorderManager();
+	const innerAudioContext = uni.createInnerAudioContext();
+	var init // 录制时长计时器
+	var timer // 播放 录制倒计时
+	export default {
+		components: {
+			"dSearchLog": dSearchLog
+		},
+		data() {
+			return {
+
+				duration: 2000, //录音最大值ms 60000/1分钟
+				tempFilePath: '', //音频路径
+				playStatus: 0, //录音播放状态 0:未播放 1:正在播放
+				longPress: '1',
+				tempFilePath: '',
+				color_border: "#00aaff",
+				search_list_hot: [],
+				store_key: 'search_list',
+				isRecorderManager: false,
+				is_clock: true,
+				startPoint: "",
+				input_text:""
+			};
+		},
+		onLoad(options) {
+			if (options.mic == 1) {
+				this.isRecorderManager = true
+			}
+		},
+		methods: {
+			onSearchvoice(e){
+				this.isRecorderManager = true
+			},
+			handleTouchMove: function(e) {
+				console.log("滑动")
+				if (Math.abs(e.touches[e.touches.length - 1].clientY - this.startPoint.clientY) > 35) {
+
+					this.is_clock = false
+				} else {
+
+					this.is_clock = true
+				}
+			},
+			longpressBtn(e) {
+				this.longPress = '2';
+				this.is_clock = true,
+					console.log(e);
+				this.startPoint = e.touches[0],
+					recorderManager.onStop((res) => {
+						console.log("录音结束")
+						this.tempFilePath = res.tempFilePath;
+					})
+				const options = {
+					duration: this.duration, // 指定录音的时长,单位 ms
+					sampleRate: 16000, // 采样率
+					numberOfChannels: 1, // 录音通道数
+					encodeBitRate: 96000, // 编码码率
+					// format: 'mp3', // 音频格式,有效值 aac/mp3
+					frameSize: 10, // 指定帧大小,单位 KB
+				}
+				recorderManager.start(options);
+				// 监听音频开始事件
+				recorderManager.onStart((res) => {
+					console.log(res)
+				})
+			},
+			touchendBtn() {
+				console.log("录音结束")
+				let that = this
+				this.longPress = '1'; 
+				that.isRecorderManager = false
+				recorderManager.onStop((res) => {
+					this.tempFilePath = res.tempFilePath
+					let _file = ''
+					if (that.is_clock) {
+						_file = uni.getFileSystemManager().readFileSync(res.tempFilePath, "base64")
+						console.log(_file)
+						uni.showLoading({
+							title:"正在识别"
+						})
+						that.$request.baseRequest('admin.tourism.productManagement', 'speechRecognition', {
+							voiceMessage: _file,
+						}, failres => {
+							console.log('res+++++', failres.errmsg)
+							uni.hideLoading()
+							uni.showToast({
+								icon:"none",
+								title: failres.errmsg,
+								duration: 3000
+							});
+						}).then(res => {
+							uni.hideLoading()
+							console.log(res)
+							if(res.data.text.length>10){
+								var text = res.data.text.substring(0, 10)
+							}else{
+								var text = res.data.text
+							}
+							that.input_text = text
+							// uni.setStorageSync('search_val', text);
+							// uni.switchTab({
+							// 	url: "/pages/cardHolder/search"
+
+							// })
+
+						})
+					}
+					recorderManager.stop()
+				})
+			},
+			onClickDelAll() {},
+			onSearchName(e) {
+				if(e.length>10){
+					var text = e.substring(0, 10)
+				}else{
+					var text = e
+				}
+				
+				uni.setStorageSync('search_val', text);
+				uni.switchTab({
+					url: "/pages/food/food"
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.shqx {
+		position: absolute;
+		top: -100rpx;
+		left: 0;
+		right: 0;
+		margin: auto;
+		text-align: center;
+		color: rgba(221, 221, 221, 1);
+	}
+
+	.record-box {
+		width: 100%;
+		position: relative;
+		top: 80rpx;
+	}
+
+	.record-btn-layer {
+		width: 100%;
+		display: flex;
+		justify-content: center;
+	}
+
+	.record-btn-layer button::after {
+		border: none;
+	}
+
+	.record-btn-layer button {
+		font-size: 14px;
+		line-height: 38px;
+		width: 100%;
+		height: 38px;
+		border-radius: 8px;
+		text-align: center;
+		background: rgba(56, 86, 156, 1);
+	}
+
+	.record-btn-layer button image {
+		width: 16px;
+		height: 16px;
+		margin-right: 4px;
+		vertical-align: middle;
+	}
+
+	.record-btn-layer .record-btn-2 {
+		background: rgba(56, 86, 156, 1);
+	}
+
+	.prompt-layer {
+		border-radius: 8px;
+		background: rgba(56, 86, 156, 1);
+		padding: 8px 16px;
+		box-sizing: border-box;
+		position: absolute;
+		left: 50%;
+		transform: translateX(-50%);
+	}
+
+	.prompt-layer::after {
+		content: '';
+		display: block;
+		border: 6px solid rgba(0, 0, 0, 0);
+		border-top-color: rgba(56, 86, 156, 1);
+		position: absolute;
+		bottom: -10px;
+		left: 50%;
+		transform: translateX(-50%);
+	}
+
+	.prompt-layer-1 {
+		font-size: 12px;
+		width: 128px;
+		text-align: center;
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
+		top: -240px;
+	}
+
+	.del {
+		position: absolute;
+		top: -200rpx;
+
+		.img {
+			width: 100rpx;
+		}
+	}
+
+	.prompt-layer-1 .p {
+		color: #000000;
+	}
+
+	.prompt-layer-1 .span {
+		color: #fff;
+	}
+
+	.prompt-loader .em {}
+
+	.prompt-loader {
+		width: 96px;
+		height: 20px;
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		margin-bottom: 6px;
+	}
+
+	.prompt-loader .em {
+		display: block;
+		background: #fff;
+		width: 1px;
+		height: 10%;
+		margin-right: 2.5px;
+		float: left;
+	}
+
+	.prompt-loader .em:last-child {
+		margin-right: 0px;
+	}
+
+	.prompt-loader .em:nth-child(1) {
+		animation: load 2.5s 1.4s infinite linear;
+	}
+
+	.prompt-loader .em:nth-child(2) {
+		animation: load 2.5s 1.2s infinite linear;
+	}
+
+	.prompt-loader .em:nth-child(3) {
+		animation: load 2.5s 1s infinite linear;
+	}
+
+	.prompt-loader .em:nth-child(4) {
+		animation: load 2.5s 0.8s infinite linear;
+	}
+
+	.prompt-loader .em:nth-child(5) {
+		animation: load 2.5s 0.6s infinite linear;
+	}
+
+	.prompt-loader .em:nth-child(6) {
+		animation: load 2.5s 0.4s infinite linear;
+	}
+
+	.prompt-loader .em:nth-child(7) {
+		animation: load 2.5s 0.2s infinite linear;
+	}
+
+	.prompt-loader .em:nth-child(8) {
+		animation: load 2.5s 0s infinite linear;
+	}
+
+	.prompt-loader .em:nth-child(9) {
+		animation: load 2.5s 0.2s infinite linear;
+	}
+
+	.prompt-loader .em:nth-child(10) {
+		animation: load 2.5s 0.4s infinite linear;
+	}
+
+	.prompt-loader .em:nth-child(11) {
+		animation: load 2.5s 0.6s infinite linear;
+	}
+
+	.prompt-loader .em:nth-child(12) {
+		animation: load 2.5s 0.8s infinite linear;
+	}
+
+	.prompt-loader .em:nth-child(13) {
+		animation: load 2.5s 1s infinite linear;
+	}
+
+	.prompt-loader .em:nth-child(14) {
+		animation: load 2.5s 1.2s infinite linear;
+	}
+
+	.prompt-loader .em:nth-child(15) {
+		animation: load 2.5s 1.4s infinite linear;
+	}
+
+	@keyframes load {
+		0% {
+			height: 10%;
+		}
+
+		50% {
+			height: 100%;
+		}
+
+		100% {
+			height: 10%;
+		}
+	}
+
+	.prompt-layer-2 {
+		// top: -540px;
+	}
+
+	.prompt-layer-2 .text {
+		color: rgba(0, 0, 0, 1);
+		font-size: 12px;
+	}
+
+	.record-btn {
+		display: flex;
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+
+		.text {
+			margin-top: 20rpx;
+		}
+
+	}
+
+	/deep/.u-popup__content {
+		padding-bottom: 100rpx;
+		// background: linear-gradient(180deg, rgba(204, 204, 204, 0.95) 0%, rgba(203, 203, 203, 0.01) 100%) !important;
+		border-radius: 50% 50% 0 0;
+	}
+
+	.record-layerP {
+		position: relative;
+		top: 50px;
+	}
+</style>

+ 144 - 0
uni_applet/pages.json

@@ -0,0 +1,144 @@
+{
+	"easycom": {
+		"^u-(.*)": "@/uni_modules/uview-ui/components/u-$1/u-$1.vue"
+	},
+	"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
+		
+		{
+		    "path" : "pages/accommodation/accommodation",
+		    "style" :                                                                                    
+		    {
+		        "navigationBarTitleText": "住宿",
+		        "enablePullDownRefresh": false
+		    }
+		    
+		},
+		{
+			"path": "pages/my/my",
+			"style": {
+				"navigationBarTitleText": "我的"
+			}
+		}
+        ,{
+            "path" : "pages/food/food",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "美食",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+        ,{
+            "path" : "pages/play/play",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "游玩",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+        ,{
+            "path" : "pages/find/find",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "发现",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+    ],
+	"tabBar": {
+		"custom": false,
+		"color": "#656765",
+		"selectedColor": "#fbb612",
+		"borderStyle": "white",
+		"backgroundColor": "#ffffff",
+		"list": [{
+				"pagePath": "pages/accommodation/accommodation",
+				"iconPath": "static/image/nav-icon/riLine-hotel-line.png",
+				"selectedIconPath": "static/image/nav-icon/riLine-hotel-line Copy.png",
+				"text": "住宿"
+			},
+			{
+				"pagePath": "pages/food/food",
+				"iconPath": "static/image/nav-icon/md-restaurant_menu.png",
+				"selectedIconPath": "static/image/nav-icon/md-restaurant_menu Copy.png",
+				"text": "美食推荐"
+			},
+			{
+				"pagePath": "pages/play/play",
+				"iconPath": "static/image/nav-icon/iconPark-landscape.png",
+				"selectedIconPath": "static/image/nav-icon/iconPark-landscape Copy.png",
+				"text": "游玩"
+			},
+			{
+				"pagePath": "pages/find/find",
+				"iconPath": "static/image/nav-icon/antOutline-compass.png",
+				"selectedIconPath": "static/image/nav-icon/antOutline-compass Copy.png",
+				"text": "发现"
+			},
+			{
+				"pagePath": "pages/my/my",
+				"iconPath": "static/image/nav-icon/antOutline-user.png",
+				"selectedIconPath": "static/image/nav-icon/antOutline-user Copy.png",
+				"text": "我的"
+			}
+		]
+	},
+	"globalStyle": {
+		"navigationBarTextStyle": "black",
+		"navigationBarTitleText": "uni-app",
+		"navigationBarBackgroundColor": "#fbb612",
+		"backgroundColor": "#F8F8F8"
+	},
+	"uniIdRouter": {},
+	"subPackages": [
+		{
+			"root":"pageA",
+			"pages": [
+				{
+                    "path" : "find/createLifeService",
+                    "style" :                                                                                    
+                {
+                    "navigationBarTitleText": "全品类入驻",
+                    "enablePullDownRefresh": false
+                }
+                
+                },
+				{
+				    "path" : "find/search",
+				    "style" :                                                                                    
+				{
+				    "navigationBarTitleText": "搜索",
+				    "enablePullDownRefresh": false
+				}
+				
+				}
+                ,{
+                    "path" : "food/search",
+                    "style" :                                                                                    
+                {
+                    "navigationBarTitleText": "",
+                    "enablePullDownRefresh": false
+                }
+                
+                }
+                ,{
+                    "path" : "food/groupBuying",
+                    "style" :                                                                                    
+                {
+                    "navigationBarTitleText": "",
+                    "enablePullDownRefresh": false
+                }
+                
+                }
+            ]
+		}
+	],
+	"preloadRule": {
+			"pages/accommodation/accommodation": {
+				"network": "all",
+				"packages": ["pageA"]
+			}
+	}
+}

+ 350 - 3
uni_applet/pages/find/find.vue

@@ -1,19 +1,366 @@
 <template>
 	<view>
-		
+		<view class="flex content1">
+			<view @click='placeSelect' class='address flex'>
+			<view class='detailedAddress'>{{detailedAddress}}</view>
+			<view class='iconfont applet-xiala'></view>
+			</view>
+			<view class=" search-wrap">
+				<view class="search flex justify-space-between align-item-center flex-between" @click="search">
+					<view class="left flex">
+						<uni-icons type="search" size="24" color="#9199af"></uni-icons>
+						<text class="search-val"> {{searchVal?searchVal:'搜索店铺或服务 '}}</text>
+					</view>
+			
+					<view class="right">
+						<!-- <image style='width:32rpx;height:32rpx;' v-if="searchVal" @click.native.stop="delSearchVal"
+							src="../../static/imgs/card/searchdel.png" mode="widthFix"></image> -->
+					</view>
+				</view>
+			</view>
+		</view>
+		<view>
+			<u-swiper :list="fileList"
+			autoplay
+			imgMode='aspectFit'
+			height='200'
+			radius='0'
+			:circular="true"
+			@change="e => current = e.current" @click="click">
+				<view slot="indicator" class="indicator">
+					<view
+			            class="indicator__dot"
+			            v-for="(item, index) in fileList"
+			            :key="index"
+			            :class="[index === current && 'indicator__dot--active']">
+			        </view>
+				</view>
+			</u-swiper>
+		</view>
+		<view>
+			<mescroll-uni :up="upOption" :down="downOption" ref="mescrollRef" @init="mescrollInit"
+				@up="upCallback" @down="downCallback" height="660">
+				<view class='findItem' v-for='item in findList'>
+					<view style='align-items: flex-start;' class='flex'>
+						<view class="left">
+							<view class='cover'>
+								<u--image radius='4' :showLoading="true" :src="item.coverImage" width="80px" height="80px" @click="click"></u--image>
+							</view>
+						</view>
+						<view class="right">
+							<view class='flex'>
+								<view v-if='item.mainBody=="商铺"' class='iconfont applet-dianpu1'></view>
+								<u--image v-if='item.mainBody=="个人"'  :showLoading="true" src="/static/image/find/geren.png" width="20px" height="20px"></u--image>
+								<view  class='name'>{{item.shopNames}}</view>
+							</view>
+							<view class='description'>
+								<mote-lines-divide :dt="item.serviceDescription" :line="4" expandText="展开" foldHint="收起" />
+								</view>
+						</view>
+					</view>
+					<view class='address flex justify-space-between'>
+						<view  class='flex'>
+							<view class='iconfont applet-dizhi'></view>
+							<view>{{item.province}}{{item.city}}{{item.area}}</view>
+						</view>
+						<view>{{item.distance}}
+						<text style='font-weight:600;'>km</text></view>
+					</view>
+				</view>
+			</mescroll-uni>
+			<!-- <mescroll-body ref="mescrollRef" :up="upOption" :down="downOption" @init="mescrollInit" @up="upCallback" @down="downCallback"></mescroll-body> -->
+		</view>
+		<view class='add' @click='add'>
+			<view class="iconfont applet-colors-tianjia2"></view>
+		</view>
 	</view>
 </template>
 
 <script>
+	var that;
+	var QQMapWX = require('@/js_sdk/qqmap-wx-jssdk.min.js');
+	 var qqmapsdk = new QQMapWX({
+	        key: 'HQ6BZ-RMALQ-TGF5H-BXJQB-UFYN3-Q5BYM'
+	    });
+	import MoteLinesDivide from "@/components/text-over-flow/text-over-flow.vue"
+	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
 	export default {
+		components: {
+			MoteLinesDivide
+		},
+		mixins: [MescrollMixin],
 		data() {
 			return {
-				
+				searchVal:uni.getStorageSync("search_val")?uni.getStorageSync("search_val"):"",
+				current:0,
+				mescroll:null,
+				fileList:[],
+				findList:[],
+				handleList:[],
+				longitude:uni.getStorageSync("findlongitude")?uni.getStorageSync("findlongitude"):"",
+				latitude:uni.getStorageSync("findlatitude")?uni.getStorageSync("findlatitude"):'',
+				curPageLen:0,
+				totalPage:0,
+				detailedAddress:uni.getStorageSync("detailedAddress")?uni.getStorageSync("detailedAddress"):'',
+				downOption: {
+					auto: false,
+					textColor: '#bbb'
+				},
+				upOption: {
+					page: {
+						size: 10 // 每页数据的数量,默认10
+					},
+					auto: false,
+					noMoreSize: 1,
+					textNoMore: '没有更多了~',
+					textColor: '#bbb'
+				},
 			};
+		},
+		onLoad() {
+			that = this
+		this.getList()
+		console.log(this)
+		// this.mescroll.resetUpScroll();
+		},
+		onShow(){
+			if(!this.detailedAddress){
+				this.placeSelect()
+			}else{
+				that.upCallback({
+					num:1,
+					size:10
+				})
+			}
+		},
+		methods: {
+			search() {
+				// if (this.userInfo.phone) {
+					uni.navigateTo({
+						url: "/pageA/find/search"
+					})
+				// } else {
+				// 	this.showAuthorizePhone = true
+				// }
+			},
+			placeSelect() {
+				uni.chooseLocation({
+					success: function(res) {
+						console.log(res);
+						that.latitude = res.latitude
+						that.longitude = res.longitude
+						uni.setStorageSync("findlatitude",res.latitude)
+						uni.setStorageSync("findlongitude",res.longitude)
+						let _address = that.$helper.formatLocation(res.address)
+						that.detailedAddress = _address.Village
+						uni.setStorageSync("detailedAddress",_address.Village)
+						that.$forceUpdate()
+						that.upCallback({
+							num:1,
+							size:10
+						})
+					}
+				});
+			},
+			mescrollInit(mescroll) {
+				this.mescroll = mescroll;
+			},
+			downCallback() {
+				if (uni.getStorageSync("userInfo").phone) {
+					this.mescroll.resetUpScroll()
+				} else {
+					that.mescroll.endBySize(0, 0)
+					this.showAuthorizePhone = true
+				}
+			
+			},
+			getDistance(latitude,longitude){
+				console.log(latitude,longitude,that.latitude,that.longitude)
+				return new Promise((resolve, reject) => {
+					qqmapsdk.direction({
+					                    mode: 'driving', //可选值:'driving'(驾车)  trucking 货车
+					                    //from参数不填默认当前地址
+					                    // latitude纬度    longitude 经度
+					                    from: {
+					                        latitude: that.latitude,
+					                        longitude: that.longitude
+					                    },
+					                    to: {
+					                        latitude: latitude,
+					                        longitude:longitude
+					                    },
+					                    size: 4, // 车型 1: 微型车  2: 轻型车 3: 中型车 4: 重型车
+					                    policy: 'LEAST_TIME', //'9',  //参考实时路况,高速优先,尽量躲避拥堵
+					                    height: 4,
+					                    width: 2.5,
+					                    length: 13,
+					                    weight: 6.8,
+					                    axle_weight: 34,
+					                    axle_count: 6,
+					                    is_trailer: 1,
+					                 success: function(res1, data) {
+										 console.log(res1,data[0].distance,data)
+										 resolve(data[0])
+										 
+									 }
+					})
+				})
+			},
+			async upCallback(page) {
+					// if (uni.getStorageSync("userInfo").id) {
+						uni.showLoading({
+							title: '数据加载中'
+						})
+						await that.$request.baseRequest('admin.tourism.productManagement', 'list', {
+							page: page.num,
+							limit: page.size,
+							// searchContent: this.searchVal,
+							// classify: this.typeName
+						}, failres => {
+							uni.showToast({
+								icon: "none",
+								title: failres.errmsg,
+								duration: 3000
+							});
+							uni.hideLoading()
+						}).then(res => {
+							if (page.num == 1) that.findList = [],that.handleList = [];
+							that.curPageLen = res.data.items.length;
+							that.handleList = res.data.items
+							that.totalPage = res.data.total;
+							
+						})
+						for(var i=0;i<that.handleList.length;i++){
+							that.handleList[i].latitude=that.handleList[i].location.split(',')[0]
+							that.handleList[i].longitude=that.handleList[i].location.split(',')[1]
+							var data=await that.getDistance(that.handleList[i].latitude,that.handleList[i].longitude) 
+							that.handleList[i].distance=(data.distance/1000).toFixed(2)
+							console.log(data)
+							if(i==that.handleList.length-1){
+								setTimeout(()=>{
+									console.log(that.handleList)
+									that.findList = that.handleList
+									that.loading = false
+									that.$nextTick(() => {
+										that.mescroll.endBySize(that.curPageLen, that.totalPage)
+									});
+												
+									uni.hideLoading()
+								},100)
+							}
+						}
+			
+					// }
+			},
+		 add(){
+			console.log(111111111)
+			uni.navigateTo({
+				url: '/pageA/find/createLifeService'
+			})
+		 },
+		 getList(){
+			 this.$request.baseRequest('admin.tourism.carouselManagement', 'list', {
+			 	page: 1,
+			 	limit: 9999,
+				classify:'发现'
+			 }, failres => {
+			 	uni.showToast({
+			 		icon: "none",
+			 		title: failres.errmsg,
+			 		duration: 3000
+			 	});	
+			 }).then(res => {
+			 	this.fileList=res.data.items
+			 })
+		 }
 		}
 	}
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
+	
+	.content1 {
+		padding: 20rpx;
+		background-color: #fbb612;
+		.search {
+			// color: #9199af;
+			// background: #f9d27d;
+			border-radius: 50rpx;
+			padding: 10rpx 0 10rpx 30rpx;
+			box-sizing: border-box;
+			margin-right: 20rpx;
+		}
+
+		.left {
+			width: 80%;
+
+			text {
+				height: 46rpx;
+				white-space: nowrap;
+				overflow: scroll;
+				position: relative;
+				margin-left: 20rpx;
+				color:#9199af;
+			}
+		}
+
+		.right {
+			// width:14%;
+			margin-right: 20rpx
+		}
+	}
+	.search-wrap{
+		width:78%;
+		background: #ffff;
+		border: 1px solid #f9d27d;
+		border-radius: 50rpx;
+	}
+	.address{
+		width:22%;
+	}
+	.findItem{
+		background:#fff;
+		margin:10rpx;
+		border-radius:20rpx;
+		padding:20rpx;
+		font-size:32rpx;
+		.left{
+			margin-right:20rpx;
+			.cover{
+				border-radius: 8rpx;
+			}
+		}
+		.name{
+			font-size:36rpx;
+			color:#333;
+			margin-left:10rpx;
+		}
+		.description{
+			color:#666;
+			margin-top:10rpx;
+		}
+		.address{
+			margin-top:20rpx;
+			width:100%;
+			font-size:28rpx;
+			color:#393733;
+		}
+	}
+	.applet-dianpu1{
+		font-size:44rpx;
+		color:#eaad1a;
+	}
 
+	.applet-dizhi{
+		font-size:38rpx;
+		color:#393733;
+	}
+	.add{
+		background:#fff;
+		position: fixed;
+		right:0;bottom:10px;
+	}
+	.applet-colors-tianjia2{
+		font-size:100px;
+	}
 </style>

+ 414 - 3
uni_applet/pages/food/food.vue

@@ -1,19 +1,430 @@
 <template>
 	<view>
-		
+		<view class="flex content1">
+			<view @click='placeSelect' class='address flex'>
+			<view class='detailedAddress'>{{detailedAddress}}</view>
+			<view class='iconfont applet-xiala'></view>
+			</view>
+			<view class=" search-wrap">
+				<view class="search flex justify-space-between align-item-center flex-between" @click="search">
+					<view class="left flex">
+						<uni-icons type="search" size="24" color="#9199af"></uni-icons>
+						<text class="search-val"> {{searchVal?searchVal:'搜索美食'}}</text>
+					</view>
+			
+					<view class="right">
+						<!-- <image style='width:32rpx;height:32rpx;' v-if="searchVal" @click.native.stop="delSearchVal"
+							src="../../static/imgs/card/searchdel.png" mode="widthFix"></image> -->
+					</view>
+				</view>
+			</view>
+		</view>
+		<view class="tag-type">
+			<uni-tag :circle="true" :text="item.iname" type="warning"  :inverted="inverted" style="width: 61px;text-align: center; margin-left: 20px;"  v-for='item in jobs'  @click="change(item)"/>
+		</view>
+		<scroll-view  scroll-x="true" scroll-with-animation="true" class='list-type'>
+			<view  v-for='item in searchTypes' @click='changetype(item)' :class='searchType==item.value?"Semibold active":"Regular"' class="typeitem">{{item.name}}</view>
+		</scroll-view>
+		<view>
+			<mescroll-uni :up="upOption" :down="downOption" ref="mescrollRef" @init="mescrollInit"
+				@up="upCallback" @down="downCallback" height="660">
+				<view class='findItem' v-for='item in findList'>
+					<view style='align-items: flex-start;' class='flex'>
+						<view class="left">
+							<view class='cover'>
+								<u--image radius='4' :showLoading="true" :src="item.coverImage" width="80px" height="80px"></u--image>
+							</view>
+						</view>
+						<view class="right">
+							<view class='cover'>
+								<u--image radius='4' :showLoading="true" :src="item.indoorImage" width="80px" height="80px"></u--image>
+							</view>
+						</view>
+					</view>
+					<view class='flex'>
+						<view v-if='item.mainBody=="商铺"' class='iconfont applet-dianpu1'></view>
+						<u--image v-if='item.mainBody=="个人"'  :showLoading="true" src="/static/image/find/geren.png" width="20px" height="20px"></u--image>
+						<view  class='name'>{{item.shopNames}}</view>
+					</view>
+					<view class="tag-type">
+						<uni-tag :inverted="true"  :text="item" type="warning"  style="width: 61px;text-align: center; margin-left: 10px;"  v-for='item in item.labels'/>
+					</view>
+					<view class='address flex justify-space-between'>
+						<view  class='flex'>
+							<view class='iconfont applet-dizhi'></view>
+							<view>{{item.province}}{{item.city}}{{item.area}}</view>
+						</view>
+						<view>{{item.distance}}
+						<text style='font-weight:600;'>km</text></view>
+					</view>
+				</view>
+			</mescroll-uni>
+			<!-- <mescroll-body ref="mescrollRef" :up="upOption" :down="downOption" @init="mescrollInit" @up="upCallback" @down="downCallback"></mescroll-body> -->
+		</view>
+		<view class='group' @click='group'>
+			<button class="tuan">团</button>
+		</view>
 	</view>
 </template>
 
 <script>
+	var that;
+	var QQMapWX = require('@/js_sdk/qqmap-wx-jssdk.min.js');
+	 var qqmapsdk = new QQMapWX({
+	        key: 'HQ6BZ-RMALQ-TGF5H-BXJQB-UFYN3-Q5BYM'
+	    });
+	import MoteLinesDivide from "@/components/text-over-flow/text-over-flow.vue"
+	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
 	export default {
+		components: {
+			MoteLinesDivide
+		},
+		mixins: [MescrollMixin],
 		data() {
 			return {
-				
+				searchVal:uni.getStorageSync("search_val")?uni.getStorageSync("search_val"):"",
+				current:0,
+				mescroll:null,
+				findList:[],
+				inverted: true,
+				handleList:[],
+				labels:[],
+				searchType:'1',
+				label:'',
+				longitude:uni.getStorageSync("findlongitude")?uni.getStorageSync("findlongitude"):"",
+				latitude:uni.getStorageSync("findlatitude")?uni.getStorageSync("findlatitude"):'',
+				curPageLen:0,
+				totalPage:0,
+				detailedAddress:uni.getStorageSync("detailedAddress")?uni.getStorageSync("detailedAddress"):'',
+				downOption: {
+					auto: false,
+					textColor: '#bbb'
+				},
+				searchTypes:[
+				{name:'默认排序',value:'1'},{name:'距离最近',value:'2'},{name:'最多点赞',value:'3'},{name:'我的收藏',value:'4'}
+				],
+				jobs: [
+					{
+						id: 1,
+						iname: '海鲜',
+					},
+					{
+						id: 2,
+						iname: '自助'
+					}, {
+						id: 3,
+						iname: '烧烤',
+					},
+					{
+						id: 4,
+						iname: '火锅',
+					},
+					{
+						id: 5,
+						iname: '家常菜'
+					}
+				],
+				upOption: {
+					page: {
+						size: 10 // 每页数据的数量,默认10
+					},
+					auto: false,
+					noMoreSize: 1,
+					textNoMore: '没有更多了~',
+					textColor: '#bbb'
+				},
 			};
+		},
+		onLoad() {
+			that = this
+		// this.getList()
+		console.log(this)
+		// this.mescroll.resetUpScroll();
+		},
+		onShow(){
+			if(!this.detailedAddress){
+				this.placeSelect()
+			}else{
+				that.upCallback({
+					num:1,
+					size:10
+				})
+			}
+		},
+		methods: {
+			search() {
+				uni.navigateTo({
+					url: "/pageA/food/search"
+				})
+			},
+			change(item){
+				if(this.label==item.iname){
+					this.label=''
+				}
+				else{
+					this.label=item.iname
+					
+				}
+				this.inverted = !this.inverted;
+				that.upCallback({
+					num:1,
+					size:10
+				})
+			},
+			changetype(item){
+				this.searchType=item.value
+				that.upCallback({
+					num:1,
+					size:10
+				})
+			},
+			placeSelect() {
+				uni.chooseLocation({
+					success: function(res) {
+						console.log(res);
+						that.latitude = res.latitude
+						that.longitude = res.longitude
+						uni.setStorageSync("findlatitude",res.latitude)
+						uni.setStorageSync("findlongitude",res.longitude)
+						let _address = that.$helper.formatLocation(res.address)
+						that.detailedAddress = _address.Village
+						uni.setStorageSync("detailedAddress",_address.Village)
+						that.$forceUpdate()
+						that.upCallback({
+							num:1,
+							size:10
+						})
+					}
+				});
+			},
+			mescrollInit(mescroll) {
+				this.mescroll = mescroll;
+			},
+			downCallback() {
+				if (uni.getStorageSync("userInfo").phone) {
+					this.mescroll.resetUpScroll()
+				} else {
+					that.mescroll.endBySize(0, 0)
+					this.showAuthorizePhone = true
+				}
+			
+			},
+			getDistance(latitude,longitude){
+				console.log(latitude,longitude,that.latitude,that.longitude)
+				return new Promise((resolve, reject) => {
+					qqmapsdk.direction({
+					                    mode: 'driving', //可选值:'driving'(驾车)  trucking 货车
+					                    //from参数不填默认当前地址
+					                    // latitude纬度    longitude 经度
+					                    from: {
+					                        latitude: that.latitude,
+					                        longitude: that.longitude
+					                    },
+					                    to: {
+					                        latitude: latitude,
+					                        longitude:longitude
+					                    },
+					                    size: 4, // 车型 1: 微型车  2: 轻型车 3: 中型车 4: 重型车
+					                    policy: 'LEAST_TIME', //'9',  //参考实时路况,高速优先,尽量躲避拥堵
+					                    height: 4,
+					                    width: 2.5,
+					                    length: 13,
+					                    weight: 6.8,
+					                    axle_weight: 34,
+					                    axle_count: 6,
+					                    is_trailer: 1,
+					                 success: function(res1, data) {
+										 console.log(res1,data[0].distance,data)
+										 resolve(data[0])
+										 
+									 }
+					})
+				})
+			},
+			async upCallback(page) {
+						uni.showLoading({
+							title: '数据加载中'
+						})
+						await that.$request.baseRequest('admin.tourism.foodInfo', 'foodList', {
+							page: page.num,
+							limit: page.size,
+							searchType: this.searchType,
+							label: this.label,
+							place:this.detailedAddress,
+						}, failres => {
+							uni.showToast({
+								icon: "none",
+								title: failres.errmsg,
+								duration: 3000
+							});
+							uni.hideLoading()
+						}).then(res => {
+							if (page.num == 1) that.findList = [],that.handleList = [];
+							that.curPageLen = res.data.items.length;
+							that.handleList = res.data.items
+							that.totalPage = res.data.total;
+						})
+						if(that.handleList.length>0){
+						for(var i=0;i<that.handleList.length;i++){
+							
+							that.handleList[i].latitude=that.handleList[i].location.split(',')[0]
+							that.handleList[i].longitude=that.handleList[i].location.split(',')[1]
+							var data=await that.getDistance(that.handleList[i].latitude,that.handleList[i].longitude) 
+							that.handleList[i].distance=(data.distance/1000).toFixed(2)
+							if(that.handleList[i].label){
+								that.handleList[i].labels = that.handleList[i].label.split(",")
+							}
+							if(i==that.handleList.length-1){
+								setTimeout(()=>{
+									console.log(that.handleList)
+									that.findList = that.handleList
+									that.loading = false
+									that.$nextTick(() => {
+										that.mescroll.endBySize(that.curPageLen, that.totalPage)
+									});
+												
+									uni.hideLoading()
+								},100)
+							}
+						}
+					}
+					else{
+						uni.hideLoading()
+					}
+			},
+		 group(){
+			uni.navigateTo({
+				url: '/pageA/food/groupBuying'
+			})
+		 },
 		}
 	}
 </script>
 
-<style lang="scss">
+<style lang="scss" scoped>
+	
+	.content1 {
+		padding: 20rpx;
+		background-color: #fbb612;
+		.search {
+			// color: #9199af;
+			// background: #f9d27d;
+			border-radius: 50rpx;
+			padding: 10rpx 0 10rpx 30rpx;
+			box-sizing: border-box;
+			margin-right: 20rpx;
+		}
+
+		.left {
+			width: 80%;
+
+			text {
+				height: 46rpx;
+				white-space: nowrap;
+				overflow: scroll;
+				position: relative;
+				margin-left: 20rpx;
+				color:#9199af;
+			}
+		}
+
+		.right {
+			// width:14%;
+			margin-right: 20rpx
+		}
+	}
+	.search-wrap{
+		width:78%;
+		background: #ffff;
+		border: 1px solid #f9d27d;
+		border-radius: 50rpx;
+	}
+	.address{
+		width:22%;
+	}
+	.findItem{
+		background:#fff;
+		margin:10rpx;
+		border-radius:20rpx;
+		padding:20rpx;
+		font-size:32rpx;
+		.left{
+			margin-right:20rpx;
+			.cover{
+				border-radius: 8rpx;
+			}
+		}
+		.name{
+			font-size:36rpx;
+			color:#333;
+			margin-left:10rpx;
+		}
+		.description{
+			color:#666;
+			margin-top:10rpx;
+		}
+		.address{
+			margin-top:20rpx;
+			width:100%;
+			font-size:28rpx;
+			color:#393733;
+		}
+	}
+	.applet-dianpu1{
+		font-size:44rpx;
+		color:#eaad1a;
+	}
 
+	.applet-dizhi{
+		font-size:38rpx;
+		color:#393733;
+	}
+	.group{
+		position: fixed;
+		margin-left:350px;bottom:10px;
+	}
+	.tuan{
+		background:#eaad1a;
+		border-radius:50px;
+		color:#fff;
+	}
+	.applet-colors-tianjia2{
+		font-size:30px;
+	}
+	.text {
+		font-size: 26rpx;
+		font-weight: 500;
+		color: #eaad1a;
+		opacity: 0.5;
+		margin-right: 56rpx;
+	}
+	.tag-type{
+		background: #fff;
+	}
+	.list-type{
+		background: #fff;
+		width:100vw;
+		padding-top:5px;
+		height:49px;
+		overflow-x: scroll;
+		white-space: nowrap;
+	}
+	.typeitem{
+		margin:10px;
+		position:relative;
+		display:inline-block;
+		padding-bottom:10px;
+		font-size:17px;
+	}
+	.typeitem.active:after{
+		content:'';
+		display:block;
+		position:absolute;
+		height:3px;
+		bottom:0;
+		background:#eaad1a;
+		width:18px;
+		left:50%;
+		transform: translateX(-50%);
+	}
 </style>

BIN
uni_applet/static/image/card/del.png


BIN
uni_applet/static/image/card/search.png


BIN
uni_applet/static/image/card/searchdel.png


BIN
uni_applet/static/image/card/voice.png


BIN
uni_applet/static/image/find/camera.png


BIN
uni_applet/static/image/find/geren.png


BIN
uni_applet/static/image/find/yingyezhizhao.png


BIN
uni_applet/static/image/find/yjt.png


BIN
uni_applet/static/image/nav-icon/antOutline-compass Copy.png


BIN
uni_applet/static/image/nav-icon/antOutline-compass.png


BIN
uni_applet/static/image/nav-icon/antOutline-user Copy.png


BIN
uni_applet/static/image/nav-icon/antOutline-user.png


BIN
uni_applet/static/image/nav-icon/iconPark-landscape Copy.png


BIN
uni_applet/static/image/nav-icon/iconPark-landscape.png


BIN
uni_applet/static/image/nav-icon/md-restaurant_menu Copy.png


BIN
uni_applet/static/image/nav-icon/md-restaurant_menu.png


BIN
uni_applet/static/image/nav-icon/riLine-hotel-line Copy.png


BIN
uni_applet/static/image/nav-icon/riLine-hotel-line.png


BIN
uni_applet/static/mic.png


+ 32 - 0
uni_applet/style/icons/iconfont-colors.css

@@ -0,0 +1,32 @@
+@font-face {
+  font-family: "iconfont"; /* Project id 4106227 */
+  /* Color fonts */
+  src: 
+       url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAVUAAwAAAAAChQAAAUFAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIl4jHgZgADwKjAyJVgE2AiQDWAsuAAQgBYF8ByAb2wdRlArO38g+DuNY8P/KoLsrRiEfHjft/SQ1EqTmdFVhFYWqQ1nFdHQaJsZ2CkxVzkQS/8PfL/W/i8YcRukHHdAMr7N4NJ+dzbpsLTqd1XLmlqjTqBBtn0xPBMAAkAAIyNIpABagyczAuhCyEFqS0IqtWoPABojgLChwIBALpR6QwW0B2IHA3uwIIlhGhF8bYDgpuO3/Wgj5+lcBHwuCssKAvFLJUGuoDgDFfBnSAQVRINxDZHhJSWlJNi5B/sUvNC/wAM0jY591DihQ9wHIUUsGaAAOEBOeziAIgOWdRNRmpyAAgH70CB+52HncUOxEd4cBcAbIDYDqBRAigodBEkkZTqYEVsaphFR4vEzi4jQlQCJxkDswDkqRPImTz9TNHEt+Szeof+MN1vD8Ofhnz0TLXrxoNOwl+j0i0bJd4HezrQbnlWuczOYY2nPuDgfjKsfdwSaTo0mz4FPL4sw7nMzbHIyrHU3bHY9rDQb2ZPwb2qdvEH3VXJbIUMojtXFbzWja3iKqaK3TC6LXvqE9MqQ5nWra3rnvQsEL0TL1rWeqZ+A1q0cFy7jzTXsJfVDSLlD87tq7sjW2xtaKXwwatHeVFxVHT9QeSdvHmHIuSlsm+nDq+fznjXNFZP1hnRATCyibDV0l0RdK0TJSgp8YN3Mr934aEbmVFF9LxKbMfikR8U9mYt4hMq6Cid/KfDjrK0p3/tqmk87V72UNu8HvEi3bM/qRiBoqQlLmmIYl07+DlNd94ubHI87ujVMnoaJ5FQOkzK9IOroX6h1ToyvV0QpFwuALUxVVIq68xdly4liQyRRijt6JsADbl3rydrTeblsZvXQJv2qJ9RLtSPvfY+NvpIjtJv9egO5V/3nXepOTdxzd2rH564UiiqaclWW+yRmBsSuKav3La3Tbji+u8c4uTg+bfjAo2+v5W58ceRYWzO24b9lybHqtPLtMG1iY0DsYlemZ36WJn3Rcql+12FVXK+1In9SWTPmmvYGLmNbZEFg5hG1NYiK+lDCfMZkRwtnzuTVBAbsW/7UlhXYUF3eEJie3hxYX26qk5CZoR3Y8F4xXnaNy/2rDxdxcd9V64WuVW04uHF+vp2fl5l7cIHylcs95RTkYqVZHDapUpFCrK5VSBRCJjLweReaEwQREZSsm6+omFdk5YHCcYpIDUk72sZjbc6p0+fLSUz09YIBRjephx1puPVm7IVOny9wgv7aWKXQ6jKpFAlZXSrNk8Q7pwIA0W2aUDsz2BTIyzZ4l49fJZuHnac2783g+b3eLJRtd780e+oljWIsqpXFoyKTUaBIGcErTJ5TG4WGjUlNX5p++IHp7R0FNx7aM1ytqQ7paNiqaW3Acz+/JQ/wII/bhYiCGcT74ZRUHTvvBB4zwIatjP2xyJPStwGJIaKMwHVDhnAEDEoeM/qQdVp8QFuM8GBlIMa5R5ygF9T/5jD5BfQgiIc8ainj/vUZpym/WNKMd+HBb7myeJvAMaB5SSr5JIGOPZAD8W8AAfCkpYRLQLN1VQZ5aStNlAk9SoI80+H/aSIpBcmablmQsX/0foKeLPzgl2wkTYOAnvxtCTtNkiZIig7EBgWyA6RkpSAwObdKIg9cmAznUmxZww9hdlpDjJXSjFYMYQEf2tjFUoB2dGEcfmjGCaEQgKgomowSliTC7aLl8VLjRcmo3ubCqER7BKLppUH5CV0LVNMJ9haP4U7IJAAA=') format('woff2'),
+       url('//at.alicdn.com/t/c/font_4106227_b656u3mughe.woff?t=1686017789532') format('woff'),
+       url('//at.alicdn.com/t/c/font_4106227_b656u3mughe.ttf?t=1686017789532') format('truetype');
+}
+
+.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.applet-colors-tianjia1:before {
+  content: "\e7f2";
+}
+
+.applet-colors-tianjia:before {
+  content: "\e7f3";
+}
+
+.applet-colors-tianjia3:before {
+  content: "\e7f0";
+}
+
+.applet-colors-tianjia2:before {
+  content: "\e7f1";
+}

Разница между файлами не показана из-за своего большого размера
+ 0 - 2
uni_applet/style/icons/iconfont.css


+ 3 - 3
uni_applet/uni_modules/d-search-log/components/d-search-log/d-search-log.vue

@@ -3,13 +3,13 @@
 		
 		<view class="dSLComVueTop">
 			<view class="dSLComVueTopLeft">
-				<image class="dSLComVueTopLeftImg" style="width: 30rpx;height: 30rpx;flex: none;" src="@/static/imgs/card/search.png"></image>
+				<image class="dSLComVueTopLeftImg" style="width: 30rpx;height: 30rpx;flex: none;" src="@/static/image/card/search.png"></image>
 				<input  class="dSLComVueTopLeftInput" v-model="search_input" type="text" :placeholder="placeholder" @blur="onClickInput" />
 				<view class="dSLComVueTopLeftDel" v-if="search_input" @click="onClickDel">
 					<!-- <u-icon name="close" size="20"></u-icon> -->
 					<!-- <image src="/static/icon_img/del.png" class="dSLComVueTopLeftDelImg" style="width: 35rpx;height: 35rpx;flex: none;" ></image> -->
 				</view>
-				<image @click='onClickvoice' src="@/static/imgs/card/voice.png" class="dSLComVueTopLeftDelImg" style="width: 30rpx;height: 39rpx;flex: none;" ></image>
+				<image @click='onClickvoice' src="@/static/image/card/voice.png" class="dSLComVueTopLeftDelImg" style="width: 30rpx;height: 39rpx;flex: none;" ></image>
 			</view>
 			<view class="dSLComVueTopRight">
 				<view class="dSLComVueTopRightBtn" @click="onClickInput" >{{search_name?search_name:'搜索'}}</view>
@@ -21,7 +21,7 @@
 				<text>历史搜索</text>
 				<view style="width: 100rpx;height: 60rpx;display: flex;align-items: center;" @click="onClickDelAll">
 					<!-- <u-icon name="trash-fill" size="30"></u-icon> -->
-					<image src="@/static/imgs/card/del.png" style="width: 27rpx;height: 32rpx;margin-right: 35rpx;"></image>
+					<image src="@/static/image/card/del.png" style="width: 27rpx;height: 32rpx;margin-right: 35rpx;"></image>
 				</view>
 			</view>
 			

+ 2 - 2
uni_applet/uni_modules/uview-ui/components/u-form-item/u-form-item.vue

@@ -15,7 +15,7 @@
 					v-if="required || leftIcon || label"
 					:style="{
 						width: $u.addUnit(labelWidth || parentData.labelWidth),
-						marginBottom: parentData.labelPosition === 'left' ? 0 : '5px',
+						marginBottom: labelPosition === 'left' ? 0 : '30rpx',
 					}"
 				>
 					<!-- 为了块对齐 -->
@@ -45,7 +45,7 @@
 			</slot>
 			<view class="u-form-item__body__right">
 				<view class="u-form-item__body__right__content">
-					<view class="u-form-item__body__right__content__slot">
+					<view  class="u-form-item__body__right__content__slot">
 						<slot />
 					</view>
 					<view

+ 57 - 0
uni_merchants_enter/App.vue

@@ -0,0 +1,57 @@
+<script>
+	export default {
+		onLaunch: function() {
+			console.log('App Launch')
+		},
+		onShow: function() {
+			console.log('App Show')
+		},
+		onHide: function() {
+			console.log('App Hide')
+		}
+	}
+</script>
+
+<style lang='scss'>
+	/*每个页面公共css */
+	@import "@/uni_modules/uview-ui/index.scss";
+	@import '@/uni_modules/uni-scss/index.scss';
+		@import "colorui/main.css";
+		@import "colorui/icon.css";
+		@import '@/style/icon/iconfont_colors.css';
+		@import '@/style/icon/iconfont.css';
+		.content{
+			padding-bottom:150rpx;
+		}
+		.wrap{
+			background:#fff;
+			border-radius:20rpx;
+			margin:20rpx;
+		}
+		.caution{
+			color:red;
+		}
+		.footer{
+			position:fixed;
+			bottom:0;
+			left:0;
+			background:#fff;
+			width:100%;
+			z-index:10;
+			padding:30rpx 0;
+			.submit{
+				background:#5F7DE9;
+				color:#fff;
+				width:90%;
+			}
+		}
+		.flex{
+			display:flex;
+		}
+		.justify-space-between{
+			justify-content: space-between;
+		}
+		.align-item-center{
+			align-items: center;
+		}
+</style>

+ 184 - 0
uni_merchants_enter/colorui/animation.css

@@ -0,0 +1,184 @@
+/* 
+  Animation 微动画  
+  基于ColorUI组建库的动画模块 by 文晓港 2019年3月26日19:52:28
+ */
+
+/* css 滤镜 控制黑白底色gif的 */
+.gif-black{  
+  mix-blend-mode: screen;  
+}
+.gif-white{  
+  mix-blend-mode: multiply; 
+}
+
+
+/* Animation css */
+[class*=animation-] {
+    animation-duration: .5s;
+    animation-timing-function: ease-out;
+    animation-fill-mode: both
+}
+
+.animation-fade {
+    animation-name: fade;
+    animation-duration: .8s;
+    animation-timing-function: linear
+}
+
+.animation-scale-up {
+    animation-name: scale-up
+}
+
+.animation-scale-down {
+    animation-name: scale-down
+}
+
+.animation-slide-top {
+    animation-name: slide-top
+}
+
+.animation-slide-bottom {
+    animation-name: slide-bottom
+}
+
+.animation-slide-left {
+    animation-name: slide-left
+}
+
+.animation-slide-right {
+    animation-name: slide-right
+}
+
+.animation-shake {
+    animation-name: shake
+}
+
+.animation-reverse {
+    animation-direction: reverse
+}
+
+@keyframes fade {
+    0% {
+        opacity: 0
+    }
+
+    100% {
+        opacity: 1
+    }
+}
+
+@keyframes scale-up {
+    0% {
+        opacity: 0;
+        transform: scale(.2)
+    }
+
+    100% {
+        opacity: 1;
+        transform: scale(1)
+    }
+}
+
+@keyframes scale-down {
+    0% {
+        opacity: 0;
+        transform: scale(1.8)
+    }
+
+    100% {
+        opacity: 1;
+        transform: scale(1)
+    }
+}
+
+@keyframes slide-top {
+    0% {
+        opacity: 0;
+        transform: translateY(-100%)
+    }
+
+    100% {
+        opacity: 1;
+        transform: translateY(0)
+    }
+}
+
+@keyframes slide-bottom {
+    0% {
+        opacity: 0;
+        transform: translateY(100%)
+    }
+
+    100% {
+        opacity: 1;
+        transform: translateY(0)
+    }
+}
+
+@keyframes shake {
+
+    0%,
+    100% {
+        transform: translateX(0)
+    }
+
+    10% {
+        transform: translateX(-9px)
+    }
+
+    20% {
+        transform: translateX(8px)
+    }
+
+    30% {
+        transform: translateX(-7px)
+    }
+
+    40% {
+        transform: translateX(6px)
+    }
+
+    50% {
+        transform: translateX(-5px)
+    }
+
+    60% {
+        transform: translateX(4px)
+    }
+
+    70% {
+        transform: translateX(-3px)
+    }
+
+    80% {
+        transform: translateX(2px)
+    }
+
+    90% {
+        transform: translateX(-1px)
+    }
+}
+
+@keyframes slide-left {
+    0% {
+        opacity: 0;
+        transform: translateX(-100%)
+    }
+
+    100% {
+        opacity: 1;
+        transform: translateX(0)
+    }
+}
+
+@keyframes slide-right {
+    0% {
+        opacity: 0;
+        transform: translateX(100%)
+    }
+
+    100% {
+        opacity: 1;
+        transform: translateX(0)
+    }
+}

+ 65 - 0
uni_merchants_enter/colorui/components/cu-custom.vue

@@ -0,0 +1,65 @@
+<template>
+	<view>
+		<view class="cu-custom" :style="[{height:CustomBar + 'px'}]">
+			<view class="cu-bar fixed" :style="style" :class="[bgImage!=''?'none-bg text-white bg-img':'',bgColor]">
+				<view class="action" @tap="BackPage" v-if="isBack">
+					<text class="cuIcon-back"></text>
+					<slot name="backText"></slot>
+				</view>
+				<view class="content" :style="[{top:StatusBar + 'px'}]">
+					<slot name="content"></slot>
+				</view>
+				<slot name="right"></slot>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				StatusBar: this.StatusBar,
+				CustomBar: this.CustomBar
+			};
+		},
+		name: 'cu-custom',
+		computed: {
+			style() {
+				var StatusBar= this.StatusBar;
+				var CustomBar= this.CustomBar;
+				var bgImage = this.bgImage;
+				var style = `height:${CustomBar}px;padding-top:${StatusBar}px;`;
+				if (this.bgImage) {
+					style = `${style}background-image:url(${bgImage});`;
+				}
+				return style
+			}
+		},
+		props: {
+			bgColor: {
+				type: String,
+				default: ''
+			},
+			isBack: {
+				type: [Boolean, String],
+				default: false
+			},
+			bgImage: {
+				type: String,
+				default: ''
+			},
+		},
+		methods: {
+			BackPage() {
+				uni.navigateBack({
+					delta: 1
+				});
+			}
+		}
+	}
+</script>
+
+<style>
+
+</style>

Разница между файлами не показана из-за своего большого размера
+ 36 - 0
uni_merchants_enter/colorui/icon.css


+ 3935 - 0
uni_merchants_enter/colorui/main.css

@@ -0,0 +1,3935 @@
+/*
+  ColorUi for uniApp  v2.1.6 | by 文晓港 2019-05-31 10:44:24
+  仅供学习交流,如作它用所承受的法律责任一概与作者无关  
+  
+  *使用ColorUi开发扩展与插件时,请注明基于ColorUi开发 
+  
+  (QQ交流群:240787041)
+*/
+
+/* ==================
+        初始化
+ ==================== */
+body {
+	background-color: #f1f1f1;
+	font-size: 28upx;
+	color: #333333;
+	font-family: Helvetica Neue, Helvetica, sans-serif;
+}
+
+view,
+scroll-view,
+swiper,
+button,
+input,
+textarea,
+label,
+navigator,
+image {
+	box-sizing: border-box;
+}
+
+.round {
+	border-radius: 5000upx;
+}
+
+.radius {
+	border-radius: 6upx;
+}
+
+/* ==================
+          图片
+ ==================== */
+
+image {
+	max-width: 100%;
+	display: inline-block;
+	position: relative;
+	z-index: 0;
+}
+
+image.loading::before {
+	content: "";
+	background-color: #f5f5f5;
+	display: block;
+	position: absolute;
+	width: 100%;
+	height: 100%;
+	z-index: -2;
+}
+
+image.loading::after {
+	content: "\e7f1";
+	font-family: "cuIcon";
+	position: absolute;
+	top: 0;
+	left: 0;
+	width: 32upx;
+	height: 32upx;
+	line-height: 32upx;
+	right: 0;
+	bottom: 0;
+	z-index: -1;
+	font-size: 32upx;
+	margin: auto;
+	color: #ccc;
+	-webkit-animation: cuIcon-spin 2s infinite linear;
+	animation: cuIcon-spin 2s infinite linear;
+	display: block;
+}
+
+.response {
+	width: 100%;
+}
+
+/* ==================
+         开关
+ ==================== */
+
+switch,
+checkbox,
+radio {
+	position: relative;
+}
+
+switch::after,
+switch::before {
+	font-family: "cuIcon";
+	content: "\e645";
+	position: absolute;
+	color: #ffffff !important;
+	top: 0%;
+	left: 0upx;
+	font-size: 26upx;
+	line-height: 26px;
+	width: 50%;
+	text-align: center;
+	pointer-events: none;
+	transform: scale(0, 0);
+	transition: all 0.3s ease-in-out 0s;
+	z-index: 9;
+	bottom: 0;
+	height: 26px;
+	margin: auto;
+}
+
+switch::before {
+	content: "\e646";
+	right: 0;
+	transform: scale(1, 1);
+	left: auto;
+}
+
+switch[checked]::after,
+switch.checked::after {
+	transform: scale(1, 1);
+}
+
+switch[checked]::before,
+switch.checked::before {
+	transform: scale(0, 0);
+}
+
+/* #ifndef MP-ALIPAY */
+radio::before,
+checkbox::before {
+	font-family: "cuIcon";
+	content: "\e645";
+	position: absolute;
+	color: #ffffff !important;
+	top: 50%;
+	margin-top: -8px;
+	right: 5px;
+	font-size: 32upx;
+	line-height: 16px;
+	pointer-events: none;
+	transform: scale(1, 1);
+	transition: all 0.3s ease-in-out 0s;
+	z-index: 9;
+}
+
+radio .wx-radio-input,
+checkbox .wx-checkbox-input,
+radio .uni-radio-input,
+checkbox .uni-checkbox-input {
+	margin: 0;
+	width: 24px;
+	height: 24px;
+}
+
+checkbox.round .wx-checkbox-input,
+checkbox.round .uni-checkbox-input {
+	border-radius: 100upx;
+}
+
+/* #endif */
+
+switch[checked]::before {
+	transform: scale(0, 0);
+}
+
+switch .wx-switch-input,
+switch .uni-switch-input {
+	border: none;
+	padding: 0 24px;
+	width: 48px;
+	height: 26px;
+	margin: 0;
+	border-radius: 100upx;
+}
+
+switch .wx-switch-input:not([class*="bg-"]),
+switch .uni-switch-input:not([class*="bg-"]) {
+	background: #8799a3 !important;
+}
+
+switch .wx-switch-input::after,
+switch .uni-switch-input::after {
+	margin: auto;
+	width: 26px;
+	height: 26px;
+	border-radius: 100upx;
+	left: 0upx;
+	top: 0upx;
+	bottom: 0upx;
+	position: absolute;
+	transform: scale(0.9, 0.9);
+	transition: all 0.1s ease-in-out 0s;
+}
+
+switch .wx-switch-input.wx-switch-input-checked::after,
+switch .uni-switch-input.uni-switch-input-checked::after {
+	margin: auto;
+	left: 22px;
+	box-shadow: none;
+	transform: scale(0.9, 0.9);
+}
+
+radio-group {
+	display: inline-block;
+}
+
+
+
+switch.radius .wx-switch-input::after,
+switch.radius .wx-switch-input,
+switch.radius .wx-switch-input::before,
+switch.radius .uni-switch-input::after,
+switch.radius .uni-switch-input,
+switch.radius .uni-switch-input::before {
+	border-radius: 10upx;
+}
+
+switch .wx-switch-input::before,
+radio.radio::before,
+checkbox .wx-checkbox-input::before,
+radio .wx-radio-input::before,
+switch .uni-switch-input::before,
+radio.radio::before,
+checkbox .uni-checkbox-input::before,
+radio .uni-radio-input::before {
+	display: none;
+}
+
+radio.radio[checked]::after,
+radio.radio .uni-radio-input-checked::after {
+	content: "";
+	background-color: transparent;
+	display: block;
+	position: absolute;
+	width: 8px;
+	height: 8px;
+	z-index: 999;
+	top: 0upx;
+	left: 0upx;
+	right: 0;
+	bottom: 0;
+	margin: auto;
+	border-radius: 200upx;
+	/* #ifndef MP */
+	border: 7px solid #ffffff !important;
+	/* #endif */
+
+	/* #ifdef MP */
+	border: 8px solid #ffffff !important;
+	/* #endif */
+}
+
+.switch-sex::after {
+	content: "\e71c";
+}
+
+.switch-sex::before {
+	content: "\e71a";
+}
+
+.switch-sex .wx-switch-input,
+.switch-sex .uni-switch-input {
+	background: #e54d42 !important;
+	border-color: #e54d42 !important;
+}
+
+.switch-sex[checked] .wx-switch-input,
+.switch-sex.checked .uni-switch-input {
+	background: #0081ff !important;
+	border-color: #0081ff !important;
+}
+
+.switch-organ::after {
+	/* content: "\e71c"; */
+	content: "主企";
+	/* font-size: 12rpx; */
+}
+
+.switch-organ::before {
+	/* content: "\e71a"; */
+	/* content: "非主企业"; */
+}
+
+.switch-organ .wx-switch-input,
+.switch-organ .uni-switch-input {
+	background: #e54d42 !important;
+	border-color: #e54d42 !important;
+}
+
+.switch-organ[checked] .wx-switch-input,
+.switch-organ.checked .uni-switch-input {
+	background: #00BEB7 !important;
+	border-color: #00BEB7 !important;
+}
+
+switch.red[checked] .wx-switch-input.wx-switch-input-checked,
+checkbox.red[checked] .wx-checkbox-input,
+radio.red[checked] .wx-radio-input,
+switch.red.checked .uni-switch-input.uni-switch-input-checked,
+checkbox.red.checked .uni-checkbox-input,
+radio.red.checked .uni-radio-input {
+	background-color: #e54d42 !important;
+	border-color: #e54d42 !important;
+	color: #ffffff !important;
+}
+
+switch.orange[checked] .wx-switch-input,
+checkbox.orange[checked] .wx-checkbox-input,
+radio.orange[checked] .wx-radio-input,
+switch.orange.checked .uni-switch-input,
+checkbox.orange.checked .uni-checkbox-input,
+radio.orange.checked .uni-radio-input {
+	background-color: #f37b1d !important;
+	border-color: #f37b1d !important;
+	color: #ffffff !important;
+}
+
+switch.yellow[checked] .wx-switch-input,
+checkbox.yellow[checked] .wx-checkbox-input,
+radio.yellow[checked] .wx-radio-input,
+switch.yellow.checked .uni-switch-input,
+checkbox.yellow.checked .uni-checkbox-input,
+radio.yellow.checked .uni-radio-input {
+	background-color: #fbbd08 !important;
+	border-color: #fbbd08 !important;
+	color: #333333 !important;
+}
+
+switch.olive[checked] .wx-switch-input,
+checkbox.olive[checked] .wx-checkbox-input,
+radio.olive[checked] .wx-radio-input,
+switch.olive.checked .uni-switch-input,
+checkbox.olive.checked .uni-checkbox-input,
+radio.olive.checked .uni-radio-input {
+	background-color: #8dc63f !important;
+	border-color: #8dc63f !important;
+	color: #ffffff !important;
+}
+
+switch.green[checked] .wx-switch-input,
+switch[checked] .wx-switch-input,
+checkbox.green[checked] .wx-checkbox-input,
+checkbox[checked] .wx-checkbox-input,
+radio.green[checked] .wx-radio-input,
+radio[checked] .wx-radio-input,
+switch.green.checked .uni-switch-input,
+switch.checked .uni-switch-input,
+checkbox.green.checked .uni-checkbox-input,
+checkbox.checked .uni-checkbox-input,
+radio.green.checked .uni-radio-input,
+radio.checked .uni-radio-input {
+	background-color: #39b54a !important;
+	border-color: #39b54a !important;
+	color: #ffffff !important;
+	border-color: #39B54A !important;
+}
+
+switch.cyan[checked] .wx-switch-input,
+checkbox.cyan[checked] .wx-checkbox-input,
+radio.cyan[checked] .wx-radio-input,
+switch.cyan.checked .uni-switch-input,
+checkbox.cyan.checked .uni-checkbox-input,
+radio.cyan.checked .uni-radio-input {
+	background-color: #1cbbb4 !important;
+	border-color: #1cbbb4 !important;
+	color: #ffffff !important;
+}
+
+switch.blue[checked] .wx-switch-input,
+checkbox.blue[checked] .wx-checkbox-input,
+radio.blue[checked] .wx-radio-input,
+switch.blue.checked .uni-switch-input,
+checkbox.blue.checked .uni-checkbox-input,
+radio.blue.checked .uni-radio-input {
+	background-color: #0081ff !important;
+	border-color: #0081ff !important;
+	color: #ffffff !important;
+}
+
+switch.purple[checked] .wx-switch-input,
+checkbox.purple[checked] .wx-checkbox-input,
+radio.purple[checked] .wx-radio-input,
+switch.purple.checked .uni-switch-input,
+checkbox.purple.checked .uni-checkbox-input,
+radio.purple.checked .uni-radio-input {
+	background-color: #6739b6 !important;
+	border-color: #6739b6 !important;
+	color: #ffffff !important;
+}
+
+switch.mauve[checked] .wx-switch-input,
+checkbox.mauve[checked] .wx-checkbox-input,
+radio.mauve[checked] .wx-radio-input,
+switch.mauve.checked .uni-switch-input,
+checkbox.mauve.checked .uni-checkbox-input,
+radio.mauve.checked .uni-radio-input {
+	background-color: #9c26b0 !important;
+	border-color: #9c26b0 !important;
+	color: #ffffff !important;
+}
+
+switch.pink[checked] .wx-switch-input,
+checkbox.pink[checked] .wx-checkbox-input,
+radio.pink[checked] .wx-radio-input,
+switch.pink.checked .uni-switch-input,
+checkbox.pink.checked .uni-checkbox-input,
+radio.pink.checked .uni-radio-input {
+	background-color: #e03997 !important;
+	border-color: #e03997 !important;
+	color: #ffffff !important;
+}
+
+switch.brown[checked] .wx-switch-input,
+checkbox.brown[checked] .wx-checkbox-input,
+radio.brown[checked] .wx-radio-input,
+switch.brown.checked .uni-switch-input,
+checkbox.brown.checked .uni-checkbox-input,
+radio.brown.checked .uni-radio-input {
+	background-color: #a5673f !important;
+	border-color: #a5673f !important;
+	color: #ffffff !important;
+}
+
+switch.grey[checked] .wx-switch-input,
+checkbox.grey[checked] .wx-checkbox-input,
+radio.grey[checked] .wx-radio-input,
+switch.grey.checked .uni-switch-input,
+checkbox.grey.checked .uni-checkbox-input,
+radio.grey.checked .uni-radio-input {
+	background-color: #8799a3 !important;
+	border-color: #8799a3 !important;
+	color: #ffffff !important;
+}
+
+switch.gray[checked] .wx-switch-input,
+checkbox.gray[checked] .wx-checkbox-input,
+radio.gray[checked] .wx-radio-input,
+switch.gray.checked .uni-switch-input,
+checkbox.gray.checked .uni-checkbox-input,
+radio.gray.checked .uni-radio-input {
+	background-color: #f0f0f0 !important;
+	border-color: #f0f0f0 !important;
+	color: #333333 !important;
+}
+
+switch.black[checked] .wx-switch-input,
+checkbox.black[checked] .wx-checkbox-input,
+radio.black[checked] .wx-radio-input,
+switch.black.checked .uni-switch-input,
+checkbox.black.checked .uni-checkbox-input,
+radio.black.checked .uni-radio-input {
+	background-color: #333333 !important;
+	border-color: #333333 !important;
+	color: #ffffff !important;
+}
+
+switch.white[checked] .wx-switch-input,
+checkbox.white[checked] .wx-checkbox-input,
+radio.white[checked] .wx-radio-input,
+switch.white.checked .uni-switch-input,
+checkbox.white.checked .uni-checkbox-input,
+radio.white.checked .uni-radio-input {
+	background-color: #ffffff !important;
+	border-color: #ffffff !important;
+	color: #333333 !important;
+}
+
+/* ==================
+          边框
+ ==================== */
+
+/* -- 实线 -- */
+
+.solid,
+.solid-top,
+.solid-right,
+.solid-bottom,
+.solid-left,
+.solids,
+.solids-top,
+.solids-right,
+.solids-bottom,
+.solids-left,
+.dashed,
+.dashed-top,
+.dashed-right,
+.dashed-bottom,
+.dashed-left {
+	position: relative;
+}
+
+.solid::after,
+.solid-top::after,
+.solid-right::after,
+.solid-bottom::after,
+.solid-left::after,
+.solids::after,
+.solids-top::after,
+.solids-right::after,
+.solids-bottom::after,
+.solids-left::after,
+.dashed::after,
+.dashed-top::after,
+.dashed-right::after,
+.dashed-bottom::after,
+.dashed-left::after {
+	content: " ";
+	width: 200%;
+	height: 200%;
+	position: absolute;
+	top: 0;
+	left: 0;
+	border-radius: inherit;
+	transform: scale(0.5);
+	transform-origin: 0 0;
+	pointer-events: none;
+	box-sizing: border-box;
+}
+
+.solid::after {
+	border: 1upx solid rgba(0, 0, 0, 0.1);
+}
+
+.solid-top::after {
+	border-top: 1upx solid rgba(0, 0, 0, 0.1);
+}
+
+.solid-right::after {
+	border-right: 1upx solid rgba(0, 0, 0, 0.1);
+}
+
+.solid-bottom::after {
+	border-bottom: 1upx solid rgba(0, 0, 0, 0.1);
+}
+
+.solid-left::after {
+	border-left: 1upx solid rgba(0, 0, 0, 0.1);
+}
+
+.solids::after {
+	border: 8upx solid #eee;
+}
+
+.solids-top::after {
+	border-top: 8upx solid #eee;
+}
+
+.solids-right::after {
+	border-right: 8upx solid #eee;
+}
+
+.solids-bottom::after {
+	border-bottom: 8upx solid #eee;
+}
+
+.solids-left::after {
+	border-left: 8upx solid #eee;
+}
+
+/* -- 虚线 -- */
+
+.dashed::after {
+	border: 1upx dashed #ddd;
+}
+
+.dashed-top::after {
+	border-top: 1upx dashed #ddd;
+}
+
+.dashed-right::after {
+	border-right: 1upx dashed #ddd;
+}
+
+.dashed-bottom::after {
+	border-bottom: 1upx dashed #ddd;
+}
+
+.dashed-left::after {
+	border-left: 1upx dashed #ddd;
+}
+
+/* -- 阴影 -- */
+
+.shadow[class*='white'] {
+	--ShadowSize: 0 1upx 6upx;
+}
+
+.shadow-lg {
+	--ShadowSize: 0upx 40upx 100upx 0upx;
+}
+
+.shadow-warp {
+	position: relative;
+	box-shadow: 0 0 10upx rgba(0, 0, 0, 0.1);
+}
+
+.shadow-warp:before,
+.shadow-warp:after {
+	position: absolute;
+	content: "";
+	top: 20upx;
+	bottom: 30upx;
+	left: 20upx;
+	width: 50%;
+	box-shadow: 0 30upx 20upx rgba(0, 0, 0, 0.2);
+	transform: rotate(-3deg);
+	z-index: -1;
+}
+
+.shadow-warp:after {
+	right: 20upx;
+	left: auto;
+	transform: rotate(3deg);
+}
+
+.shadow-blur {
+	position: relative;
+}
+
+.shadow-blur::before {
+	content: "";
+	display: block;
+	background: inherit;
+	filter: blur(10upx);
+	position: absolute;
+	width: 100%;
+	height: 100%;
+	top: 10upx;
+	left: 10upx;
+	z-index: -1;
+	opacity: 0.4;
+	transform-origin: 0 0;
+	border-radius: inherit;
+	transform: scale(1, 1);
+}
+
+/* ==================
+          按钮
+ ==================== */
+
+.cu-btn {
+	position: relative;
+	border: 0upx;
+	display: inline-flex;
+	align-items: center;
+	justify-content: center;
+	box-sizing: border-box;
+	padding: 0 30upx;
+	font-size: 28upx;
+	height: 64upx;
+	line-height: 1;
+	text-align: center;
+	text-decoration: none;
+	overflow: visible;
+	margin-left: initial;
+	transform: translate(0upx, 0upx);
+	margin-right: initial;
+}
+
+.cu-btn::after {
+	display: none;
+}
+
+.cu-btn:not([class*="bg-"]) {
+	background-color: #f0f0f0;
+}
+
+.cu-btn[class*="line"] {
+	background-color: transparent;
+}
+
+.cu-btn[class*="line"]::after {
+	content: " ";
+	display: block;
+	width: 200%;
+	height: 200%;
+	position: absolute;
+	top: 0;
+	left: 0;
+	border: 1upx solid currentColor;
+	transform: scale(0.5);
+	transform-origin: 0 0;
+	box-sizing: border-box;
+	border-radius: 12upx;
+	z-index: 1;
+	pointer-events: none;
+}
+
+.cu-btn.round[class*="line"]::after {
+	border-radius: 1000upx;
+}
+
+.cu-btn[class*="lines"]::after {
+	border: 6upx solid currentColor;
+}
+
+.cu-btn[class*="bg-"]::after {
+	display: none;
+}
+
+.cu-btn.sm {
+	padding: 0 20upx;
+	font-size: 20upx;
+	height: 48upx;
+}
+
+.cu-btn.lg {
+	padding: 0 40upx;
+	font-size: 32upx;
+	height: 80upx;
+}
+
+.cu-btn.cuIcon.sm {
+	width: 48upx;
+	height: 48upx;
+}
+
+.cu-btn.cuIcon {
+	width: 64upx;
+	height: 64upx;
+	border-radius: 500upx;
+	padding: 0;
+}
+
+button.cuIcon.lg {
+	width: 80upx;
+	height: 80upx;
+}
+
+.cu-btn.shadow-blur::before {
+	top: 4upx;
+	left: 4upx;
+	filter: blur(6upx);
+	opacity: 0.6;
+}
+
+.cu-btn.button-hover {
+	transform: translate(1upx, 1upx);
+}
+
+.block {
+	display: block;
+}
+
+.cu-btn.block {
+	display: flex;
+}
+
+.cu-btn[disabled] {
+	opacity: 0.6;
+	color: #ffffff;
+}
+
+/* ==================
+          徽章
+ ==================== */
+
+.cu-tag {
+	font-size: 24upx;
+	vertical-align: middle;
+	position: relative;
+	display: inline-flex;
+	align-items: center;
+	justify-content: center;
+	box-sizing: border-box;
+	padding: 0upx 16upx;
+	height: 48upx;
+	font-family: Helvetica Neue, Helvetica, sans-serif;
+	white-space: nowrap;
+}
+
+.cu-tag:not([class*="bg"]):not([class*="line"]) {
+	background-color: #f1f1f1;
+}
+
+.cu-tag[class*="line-"]::after {
+	content: " ";
+	width: 200%;
+	height: 200%;
+	position: absolute;
+	top: 0;
+	left: 0;
+	border: 1upx solid currentColor;
+	transform: scale(0.5);
+	transform-origin: 0 0;
+	box-sizing: border-box;
+	border-radius: inherit;
+	z-index: 1;
+	pointer-events: none;
+}
+
+.cu-tag.radius[class*="line"]::after {
+	border-radius: 12upx;
+}
+
+.cu-tag.round[class*="line"]::after {
+	border-radius: 1000upx;
+}
+
+.cu-tag[class*="line-"]::after {
+	border-radius: 0;
+}
+
+.cu-tag+.cu-tag {
+	margin-left: 10upx;
+}
+
+.cu-tag.sm {
+	font-size: 20upx;
+	padding: 0upx 12upx;
+	height: 32upx;
+}
+
+.cu-capsule {
+	display: inline-flex;
+	vertical-align: middle;
+}
+
+.cu-capsule+.cu-capsule {
+	margin-left: 10upx;
+}
+
+.cu-capsule .cu-tag {
+	margin: 0;
+}
+
+.cu-capsule .cu-tag[class*="line-"]:last-child::after {
+	border-left: 0upx solid transparent;
+}
+
+.cu-capsule .cu-tag[class*="line-"]:first-child::after {
+	border-right: 0upx solid transparent;
+}
+
+.cu-capsule.radius .cu-tag:first-child {
+	border-top-left-radius: 6upx;
+	border-bottom-left-radius: 6upx;
+}
+
+.cu-capsule.radius .cu-tag:last-child::after,
+.cu-capsule.radius .cu-tag[class*="line-"] {
+	border-top-right-radius: 12upx;
+	border-bottom-right-radius: 12upx;
+}
+
+.cu-capsule.round .cu-tag:first-child {
+	border-top-left-radius: 200upx;
+	border-bottom-left-radius: 200upx;
+	text-indent: 4upx;
+}
+
+.cu-capsule.round .cu-tag:last-child::after,
+.cu-capsule.round .cu-tag:last-child {
+	border-top-right-radius: 200upx;
+	border-bottom-right-radius: 200upx;
+	text-indent: -4upx;
+}
+
+.cu-tag.badge {
+	border-radius: 200upx;
+	position: absolute;
+	top: -10upx;
+	right: -10upx;
+	font-size: 20upx;
+	padding: 0upx 10upx;
+	height: 28upx;
+	color: #ffffff;
+}
+
+.cu-tag.badge:not([class*="bg-"]) {
+	background-color: #dd514c;
+}
+
+.cu-tag:empty:not([class*="cuIcon-"]) {
+	padding: 0upx;
+	width: 16upx;
+	height: 16upx;
+	top: -4upx;
+	right: -4upx;
+}
+
+.cu-tag[class*="cuIcon-"] {
+	width: 32upx;
+	height: 32upx;
+	top: -4upx;
+	right: -4upx;
+}
+
+/* ==================
+          头像
+ ==================== */
+
+.cu-avatar {
+	font-variant: small-caps;
+	margin: 0;
+	padding: 0;
+	display: inline-flex;
+	text-align: center;
+	justify-content: center;
+	align-items: center;
+	background-color: #ccc;
+	color: #ffffff;
+	white-space: nowrap;
+	position: relative;
+	width: 64upx;
+	height: 64upx;
+	background-size: cover;
+	background-position: center;
+	vertical-align: middle;
+	font-size: 1.5em;
+}
+
+.cu-avatar.sm {
+	width: 48upx;
+	height: 48upx;
+	font-size: 1em;
+}
+
+.cu-avatar.lg {
+	width: 96upx;
+	height: 96upx;
+	font-size: 2em;
+}
+
+.cu-avatar.xl {
+	width: 128upx;
+	height: 128upx;
+	font-size: 2.5em;
+}
+
+.cu-avatar .avatar-text {
+	font-size: 0.4em;
+}
+
+.cu-avatar-group {
+	direction: rtl;
+	unicode-bidi: bidi-override;
+	padding: 0 10upx 0 40upx;
+	display: inline-block;
+}
+
+.cu-avatar-group .cu-avatar {
+	margin-left: -30upx;
+	border: 4upx solid #f1f1f1;
+	vertical-align: middle;
+}
+
+.cu-avatar-group .cu-avatar.sm {
+	margin-left: -20upx;
+	border: 1upx solid #f1f1f1;
+}
+
+/* ==================
+         进度条
+ ==================== */
+
+.cu-progress {
+	overflow: hidden;
+	height: 28upx;
+	background-color: #ebeef5;
+	display: inline-flex;
+	align-items: center;
+	width: 100%;
+}
+
+.cu-progress+view,
+.cu-progress+text {
+	line-height: 1;
+}
+
+.cu-progress.xs {
+	height: 10upx;
+}
+
+.cu-progress.sm {
+	height: 20upx;
+}
+
+.cu-progress view {
+	width: 0;
+	height: 100%;
+	align-items: center;
+	display: flex;
+	justify-items: flex-end;
+	justify-content: space-around;
+	font-size: 20upx;
+	color: #ffffff;
+	transition: width 0.6s ease;
+}
+
+.cu-progress text {
+	align-items: center;
+	display: flex;
+	font-size: 20upx;
+	color: #333333;
+	text-indent: 10upx;
+}
+
+.cu-progress.text-progress {
+	padding-right: 60upx;
+}
+
+.cu-progress.striped view {
+	background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
+	background-size: 72upx 72upx;
+}
+
+.cu-progress.active view {
+	animation: progress-stripes 2s linear infinite;
+}
+
+@keyframes progress-stripes {
+	from {
+		background-position: 72upx 0;
+	}
+
+	to {
+		background-position: 0 0;
+	}
+}
+
+/* ==================
+          加载
+ ==================== */
+
+.cu-load {
+	display: block;
+	line-height: 3em;
+	text-align: center;
+}
+
+.cu-load::before {
+	font-family: "cuIcon";
+	display: inline-block;
+	margin-right: 6upx;
+}
+
+.cu-load.loading::before {
+	content: "\e67a";
+	animation: cuIcon-spin 2s infinite linear;
+}
+
+.cu-load.loading::after {
+	content: "加载中...";
+}
+
+.cu-load.over::before {
+	content: "\e64a";
+}
+
+.cu-load.over::after {
+	content: "没有更多了";
+}
+
+.cu-load.erro::before {
+	content: "\e658";
+}
+
+.cu-load.erro::after {
+	content: "加载失败";
+}
+
+.cu-load.load-cuIcon::before {
+	font-size: 32upx;
+}
+
+.cu-load.load-cuIcon::after {
+	display: none;
+}
+
+.cu-load.load-cuIcon.over {
+	display: none;
+}
+
+.cu-load.load-modal {
+	position: fixed;
+	top: 0;
+	right: 0;
+	bottom: 140upx;
+	left: 0;
+	margin: auto;
+	width: 260upx;
+	height: 260upx;
+	background-color: #ffffff;
+	border-radius: 10upx;
+	box-shadow: 0 0 0upx 2000upx rgba(0, 0, 0, 0.5);
+	display: flex;
+	align-items: center;
+	flex-direction: column;
+	justify-content: center;
+	font-size: 28upx;
+	z-index: 9999;
+	line-height: 2.4em;
+}
+
+.cu-load.load-modal [class*="cuIcon-"] {
+	font-size: 60upx;
+}
+
+.cu-load.load-modal image {
+	width: 70upx;
+	height: 70upx;
+}
+
+.cu-load.load-modal::after {
+	content: "";
+	position: absolute;
+	background-color: #ffffff;
+	border-radius: 50%;
+	width: 200upx;
+	height: 200upx;
+	font-size: 10px;
+	border-top: 6upx solid rgba(0, 0, 0, 0.05);
+	border-right: 6upx solid rgba(0, 0, 0, 0.05);
+	border-bottom: 6upx solid rgba(0, 0, 0, 0.05);
+	border-left: 6upx solid #f37b1d;
+	animation: cuIcon-spin 1s infinite linear;
+	z-index: -1;
+}
+
+.load-progress {
+	pointer-events: none;
+	top: 0;
+	position: fixed;
+	width: 100%;
+	left: 0;
+	z-index: 2000;
+}
+
+.load-progress.hide {
+	display: none;
+}
+
+.load-progress .load-progress-bar {
+	position: relative;
+	width: 100%;
+	height: 4upx;
+	overflow: hidden;
+	transition: all 200ms ease 0s;
+}
+
+.load-progress .load-progress-spinner {
+	position: absolute;
+	top: 10upx;
+	right: 10upx;
+	z-index: 2000;
+	display: block;
+}
+
+.load-progress .load-progress-spinner::after {
+	content: "";
+	display: block;
+	width: 24upx;
+	height: 24upx;
+	-webkit-box-sizing: border-box;
+	box-sizing: border-box;
+	border: solid 4upx transparent;
+	border-top-color: inherit;
+	border-left-color: inherit;
+	border-radius: 50%;
+	-webkit-animation: load-progress-spinner 0.4s linear infinite;
+	animation: load-progress-spinner 0.4s linear infinite;
+}
+
+@-webkit-keyframes load-progress-spinner {
+	0% {
+		-webkit-transform: rotate(0);
+		transform: rotate(0);
+	}
+
+	100% {
+		-webkit-transform: rotate(360deg);
+		transform: rotate(360deg);
+	}
+}
+
+@keyframes load-progress-spinner {
+	0% {
+		-webkit-transform: rotate(0);
+		transform: rotate(0);
+	}
+
+	100% {
+		-webkit-transform: rotate(360deg);
+		transform: rotate(360deg);
+	}
+}
+
+/* ==================
+          列表
+ ==================== */
+.grayscale {
+	filter: grayscale(1);
+}
+
+.cu-list+.cu-list {
+	margin-top: 30upx
+}
+
+.cu-list>.cu-item {
+	transition: all .6s ease-in-out 0s;
+	transform: translateX(0upx)
+}
+
+.cu-list>.cu-item.move-cur {
+	transform: translateX(-260upx)
+}
+
+.cu-list>.cu-item .move {
+	position: absolute;
+	right: 0;
+	display: flex;
+	width: 260upx;
+	height: 100%;
+	transform: translateX(100%)
+}
+
+.cu-list>.cu-item .move view {
+	display: flex;
+	flex: 1;
+	justify-content: center;
+	align-items: center
+}
+
+.cu-list.menu-avatar {
+	overflow: hidden;
+}
+
+.cu-list.menu-avatar>.cu-item {
+	position: relative;
+	display: flex;
+	padding-right: 10upx;
+	height: 140upx;
+	background-color: #ffffff;
+	justify-content: flex-end;
+	align-items: center
+}
+
+.cu-list.menu-avatar>.cu-item>.cu-avatar {
+	position: absolute;
+	left: 30upx
+}
+
+.cu-list.menu-avatar>.cu-item .flex .text-cut {
+	max-width: 510upx
+}
+
+.cu-list.menu-avatar>.cu-item .content {
+	position: absolute;
+	left: 146upx;
+	width: calc(100% - 96upx - 60upx - 120upx - 20upx);
+	line-height: 1.6em;
+}
+
+.cu-list.menu-avatar>.cu-item .content.flex-sub {
+	width: calc(100% - 96upx - 60upx - 20upx);
+}
+
+.cu-list.menu-avatar>.cu-item .content>view:first-child {
+	font-size: 30upx;
+	display: flex;
+	align-items: center
+}
+
+.cu-list.menu-avatar>.cu-item .content .cu-tag.sm {
+	display: inline-block;
+	margin-left: 10upx;
+	height: 28upx;
+	font-size: 16upx;
+	line-height: 32upx
+}
+
+.cu-list.menu-avatar>.cu-item .action {
+	width: 100upx;
+	text-align: center
+}
+
+.cu-list.menu-avatar>.cu-item .action view+view {
+	margin-top: 10upx
+}
+
+.cu-list.menu-avatar.comment>.cu-item .content {
+	position: relative;
+	left: 0;
+	width: auto;
+	flex: 1;
+}
+
+.cu-list.menu-avatar.comment>.cu-item {
+	padding: 30upx 30upx 30upx 120upx;
+	height: auto
+}
+
+.cu-list.menu-avatar.comment .cu-avatar {
+	align-self: flex-start
+}
+
+.cu-list.menu>.cu-item {
+	position: relative;
+	display: flex;
+	padding: 0 30upx;
+	min-height: 100upx;
+	background-color: #ffffff;
+	justify-content: space-between;
+	align-items: center
+}
+
+.cu-list.menu>.cu-item:last-child:after {
+	border: none
+}
+
+.cu-list.menu-avatar>.cu-item:after,
+.cu-list.menu>.cu-item:after {
+	position: absolute;
+	top: 0;
+	left: 0;
+	box-sizing: border-box;
+	width: 200%;
+	height: 200%;
+	border-bottom: 1upx solid #ddd;
+	border-radius: inherit;
+	content: " ";
+	transform: scale(.5);
+	transform-origin: 0 0;
+	pointer-events: none
+}
+
+.cu-list.menu>.cu-item.grayscale {
+	background-color: #f5f5f5
+}
+
+.cu-list.menu>.cu-item.cur {
+	background-color: #fcf7e9
+}
+
+.cu-list.menu>.cu-item.arrow {
+	padding-right: 90upx
+}
+
+.cu-list.menu>.cu-item.arrow:before {
+	position: absolute;
+	top: 0;
+	right: 30upx;
+	bottom: 0;
+	display: block;
+	margin: auto;
+	width: 30upx;
+	height: 30upx;
+	color: #8799a3;
+	content: "\e6a3";
+	text-align: center;
+	font-size: 34upx;
+	font-family: cuIcon;
+	line-height: 30upx
+}
+
+.cu-list.menu>.cu-item button.content {
+	padding: 0;
+	background-color: transparent;
+	justify-content: flex-start
+}
+
+.cu-list.menu>.cu-item button.content:after {
+	display: none
+}
+
+.cu-list.menu>.cu-item .cu-avatar-group .cu-avatar {
+	border-color: #ffffff
+}
+
+.cu-list.menu>.cu-item .content>view:first-child {
+	display: flex;
+	align-items: center
+}
+
+.cu-list.menu>.cu-item .content>text[class*=cuIcon] {
+	display: inline-block;
+	margin-right: 10upx;
+	width: 1.6em;
+	text-align: center
+}
+
+.cu-list.menu>.cu-item .content>image {
+	display: inline-block;
+	margin-right: 10upx;
+	width: 1.6em;
+	height: 1.6em;
+	vertical-align: middle
+}
+
+.cu-list.menu>.cu-item .content {
+	font-size: 30upx;
+	line-height: 1.6em;
+	flex: 1
+}
+
+.cu-list.menu>.cu-item .content .cu-tag.sm {
+	display: inline-block;
+	margin-left: 10upx;
+	height: 28upx;
+	font-size: 16upx;
+	line-height: 32upx
+}
+
+.cu-list.menu>.cu-item .action .cu-tag:empty {
+	right: 10upx
+}
+
+.cu-list.menu {
+	display: block;
+	overflow: hidden
+}
+
+.cu-list.menu.sm-border>.cu-item:after {
+	left: 30upx;
+	width: calc(200% - 120upx)
+}
+
+.cu-list.grid>.cu-item {
+	position: relative;
+	display: flex;
+	padding: 20upx 0 30upx;
+	transition-duration: 0s;
+	flex-direction: column
+}
+
+.cu-list.grid>.cu-item:after {
+	position: absolute;
+	top: 0;
+	left: 0;
+	box-sizing: border-box;
+	width: 200%;
+	height: 200%;
+	border-right: 1px solid rgba(0, 0, 0, .1);
+	border-bottom: 1px solid rgba(0, 0, 0, .1);
+	border-radius: inherit;
+	content: " ";
+	transform: scale(.5);
+	transform-origin: 0 0;
+	pointer-events: none
+}
+
+.cu-list.grid>.cu-item text {
+	display: block;
+	margin-top: 10upx;
+	color: #888;
+	font-size: 26upx;
+	line-height: 40upx
+}
+
+.cu-list.grid>.cu-item [class*=cuIcon] {
+	position: relative;
+	display: block;
+	margin-top: 20upx;
+	width: 100%;
+	font-size: 48upx
+}
+
+.cu-list.grid>.cu-item .cu-tag {
+	right: auto;
+	left: 50%;
+	margin-left: 20upx
+}
+
+.cu-list.grid {
+	background-color: #ffffff;
+	text-align: center
+}
+
+.cu-list.grid.no-border>.cu-item {
+	padding-top: 10upx;
+	padding-bottom: 20upx
+}
+
+.cu-list.grid.no-border>.cu-item:after {
+	border: none
+}
+
+.cu-list.grid.no-border {
+	padding: 20upx 10upx
+}
+
+.cu-list.grid.col-3>.cu-item:nth-child(3n):after,
+.cu-list.grid.col-4>.cu-item:nth-child(4n):after,
+.cu-list.grid.col-5>.cu-item:nth-child(5n):after {
+	border-right-width: 0
+}
+
+.cu-list.card-menu {
+	overflow: hidden;
+	margin-right: 30upx;
+	margin-left: 30upx;
+	border-radius: 20upx
+}
+
+
+/* ==================
+          操作条
+ ==================== */
+
+.cu-bar {
+	display: flex;
+	position: relative;
+	align-items: center;
+	min-height: 100upx;
+	justify-content: space-between;
+}
+
+.cu-bar .action {
+	display: flex;
+	align-items: center;
+	height: 100%;
+	justify-content: center;
+	max-width: 100%;
+}
+
+.cu-bar .action.border-title {
+	position: relative;
+	top: -10upx;
+}
+
+.cu-bar .action.border-title text[class*="bg-"]:last-child {
+	position: absolute;
+	bottom: -0.5rem;
+	min-width: 2rem;
+	height: 6upx;
+	left: 0;
+}
+
+.cu-bar .action.sub-title {
+	position: relative;
+	top: -0.2rem;
+}
+
+.cu-bar .action.sub-title text {
+	position: relative;
+	z-index: 1;
+}
+
+.cu-bar .action.sub-title text[class*="bg-"]:last-child {
+	position: absolute;
+	display: inline-block;
+	bottom: -0.2rem;
+	border-radius: 6upx;
+	width: 100%;
+	height: 0.6rem;
+	left: 0.6rem;
+	opacity: 0.3;
+	z-index: 0;
+}
+
+.cu-bar .action.sub-title text[class*="text-"]:last-child {
+	position: absolute;
+	display: inline-block;
+	bottom: -0.7rem;
+	left: 0.5rem;
+	opacity: 0.2;
+	z-index: 0;
+	text-align: right;
+	font-weight: 900;
+	font-size: 36upx;
+}
+
+.cu-bar.justify-center .action.border-title text:last-child,
+.cu-bar.justify-center .action.sub-title text:last-child {
+	left: 0;
+	right: 0;
+	margin: auto;
+	text-align: center;
+}
+
+.cu-bar .action:first-child {
+	margin-left: 30upx;
+	font-size: 30upx;
+}
+
+.cu-bar .action text.text-cut {
+	text-align: left;
+	width: 100%;
+}
+
+.cu-bar .cu-avatar:first-child {
+	margin-left: 20upx;
+}
+
+.cu-bar .action:first-child>text[class*="cuIcon-"] {
+	margin-left: -0.3em;
+	margin-right: 0.3em;
+}
+
+.cu-bar .action:last-child {
+	margin-right: 30upx;
+}
+
+.cu-bar .action>text[class*="cuIcon-"],
+.cu-bar .action>view[class*="cuIcon-"] {
+	font-size: 36upx;
+}
+
+.cu-bar .action>text[class*="cuIcon-"]+text[class*="cuIcon-"] {
+	margin-left: 0.5em;
+}
+
+.cu-bar .content {
+	position: absolute;
+	text-align: center;
+	width: calc(100% - 340upx);
+	left: 0;
+	right: 0;
+	bottom: 0;
+	top: 0;
+	margin: auto;
+	height: 60upx;
+	font-size: 32upx;
+	line-height: 60upx;
+	cursor: none;
+	pointer-events: none;
+	text-overflow: ellipsis;
+	white-space: nowrap;
+	overflow: hidden;
+}
+
+.cu-bar.ios .content {
+	bottom: 7px;
+	height: 30px;
+	font-size: 32upx;
+	line-height: 30px;
+}
+
+.cu-bar.btn-group {
+	justify-content: space-around;
+}
+
+.cu-bar.btn-group button {
+	padding: 20upx 32upx;
+}
+
+.cu-bar.btn-group button {
+	flex: 1;
+	margin: 0 20upx;
+	max-width: 50%;
+}
+
+.cu-bar .search-form {
+	background-color: #f5f5f5;
+	line-height: 64upx;
+	height: 64upx;
+	font-size: 24upx;
+	color: #333333;
+	flex: 1;
+	display: flex;
+	align-items: center;
+	margin: 0 30upx;
+}
+
+.cu-bar .search-form+.action {
+	margin-right: 30upx;
+}
+
+.cu-bar .search-form input {
+	flex: 1;
+	padding-right: 30upx;
+	height: 64upx;
+	line-height: 64upx;
+	font-size: 26upx;
+	background-color: transparent;
+}
+
+.cu-bar .search-form [class*="cuIcon-"] {
+	margin: 0 0.5em 0 0.8em;
+}
+
+.cu-bar .search-form [class*="cuIcon-"]::before {
+	top: 0upx;
+}
+
+.cu-bar.fixed,
+.nav.fixed {
+	position: fixed;
+	width: 100%;
+	top: 0;
+	z-index: 1024;
+	box-shadow: 0 1upx 6upx rgba(0, 0, 0, 0.1);
+}
+
+.cu-bar.foot {
+	position: fixed;
+	width: 100%;
+	bottom: 0;
+	z-index: 1024;
+	box-shadow: 0 -1upx 6upx rgba(0, 0, 0, 0.1);
+}
+
+.cu-bar.tabbar {
+	padding: 0;
+	height: calc(100upx + env(safe-area-inset-bottom) / 2);
+	padding-bottom: calc(env(safe-area-inset-bottom) / 2);
+}
+
+.cu-tabbar-height {
+	min-height: 100upx;
+	height: calc(100upx + env(safe-area-inset-bottom) / 2);
+}
+
+.cu-bar.tabbar.shadow {
+	box-shadow: 0 -1upx 6upx rgba(0, 0, 0, 0.1);
+}
+
+.cu-bar.tabbar .action {
+	font-size: 22upx;
+	position: relative;
+	flex: 1;
+	text-align: center;
+	padding: 0;
+	display: block;
+	height: auto;
+	line-height: 1;
+	margin: 0;
+	background-color: inherit;
+	overflow: initial;
+}
+
+.cu-bar.tabbar.shop .action {
+	width: 140upx;
+	flex: initial;
+}
+
+.cu-bar.tabbar .action.add-action {
+	position: relative;
+	z-index: 2;
+	padding-top: 50upx;
+}
+
+.cu-bar.tabbar .action.add-action [class*="cuIcon-"] {
+	position: absolute;
+	width: 70upx;
+	z-index: 2;
+	height: 70upx;
+	border-radius: 50%;
+	line-height: 70upx;
+	font-size: 50upx;
+	top: -35upx;
+	left: 0;
+	right: 0;
+	margin: auto;
+	padding: 0;
+}
+
+.cu-bar.tabbar .action.add-action::after {
+	content: "";
+	position: absolute;
+	width: 100upx;
+	height: 100upx;
+	top: -50upx;
+	left: 0;
+	right: 0;
+	margin: auto;
+	box-shadow: 0 -3upx 8upx rgba(0, 0, 0, 0.08);
+	border-radius: 50upx;
+	background-color: inherit;
+	z-index: 0;
+}
+
+.cu-bar.tabbar .action.add-action::before {
+	content: "";
+	position: absolute;
+	width: 100upx;
+	height: 30upx;
+	bottom: 30upx;
+	left: 0;
+	right: 0;
+	margin: auto;
+	background-color: inherit;
+	z-index: 1;
+}
+
+.cu-bar.tabbar .btn-group {
+	flex: 1;
+	display: flex;
+	justify-content: space-around;
+	align-items: center;
+	padding: 0 10upx;
+}
+
+.cu-bar.tabbar button.action::after {
+	border: 0;
+}
+
+.cu-bar.tabbar .action [class*="cuIcon-"] {
+	width: 100upx;
+	position: relative;
+	display: block;
+	height: auto;
+	margin: 0 auto 10upx;
+	text-align: center;
+	font-size: 40upx;
+}
+
+.cu-bar.tabbar .action .cuIcon-cu-image {
+	margin: 0 auto;
+}
+
+.cu-bar.tabbar .action .cuIcon-cu-image image {
+	width: 50upx;
+	height: 50upx;
+	display: inline-block;
+}
+
+.cu-bar.tabbar .submit {
+	align-items: center;
+	display: flex;
+	justify-content: center;
+	text-align: center;
+	position: relative;
+	flex: 2;
+	align-self: stretch;
+}
+
+.cu-bar.tabbar .submit:last-child {
+	flex: 2.6;
+}
+
+.cu-bar.tabbar .submit+.submit {
+	flex: 2;
+}
+
+.cu-bar.tabbar.border .action::before {
+	content: " ";
+	width: 200%;
+	height: 200%;
+	position: absolute;
+	top: 0;
+	left: 0;
+	transform: scale(0.5);
+	transform-origin: 0 0;
+	border-right: 1upx solid rgba(0, 0, 0, 0.1);
+	z-index: 3;
+}
+
+.cu-bar.tabbar.border .action:last-child:before {
+	display: none;
+}
+
+.cu-bar.input {
+	padding-right: 20upx;
+	background-color: #ffffff;
+}
+
+.cu-bar.input input {
+	overflow: initial;
+	line-height: 64upx;
+	height: 64upx;
+	min-height: 64upx;
+	flex: 1;
+	font-size: 30upx;
+	margin: 0 20upx;
+}
+
+.cu-bar.input .action {
+	margin-left: 20upx;
+}
+
+.cu-bar.input .action [class*="cuIcon-"] {
+	font-size: 48upx;
+}
+
+.cu-bar.input input+.action {
+	margin-right: 20upx;
+	margin-left: 0upx;
+}
+
+.cu-bar.input .action:first-child [class*="cuIcon-"] {
+	margin-left: 0upx;
+}
+
+.cu-custom {
+	display: block;
+	position: relative;
+}
+
+.cu-custom .cu-bar .content {
+	width: calc(100% - 440upx);
+}
+
+/* #ifdef MP-ALIPAY */
+.cu-custom .cu-bar .action .cuIcon-back {
+	opacity: 0;
+}
+
+/* #endif */
+
+.cu-custom .cu-bar .content image {
+	height: 60upx;
+	width: 240upx;
+}
+
+.cu-custom .cu-bar {
+	min-height: 0px;
+	/* #ifdef MP-WEIXIN */
+	padding-right: 220upx;
+	/* #endif */
+	/* #ifdef MP-ALIPAY */
+	padding-right: 150upx;
+	/* #endif */
+	box-shadow: 0upx 0upx 0upx;
+	z-index: 9999;
+}
+
+.cu-custom .cu-bar .border-custom {
+	position: relative;
+	background: rgba(0, 0, 0, 0.15);
+	border-radius: 1000upx;
+	height: 30px;
+}
+
+.cu-custom .cu-bar .border-custom::after {
+	content: " ";
+	width: 200%;
+	height: 200%;
+	position: absolute;
+	top: 0;
+	left: 0;
+	border-radius: inherit;
+	transform: scale(0.5);
+	transform-origin: 0 0;
+	pointer-events: none;
+	box-sizing: border-box;
+	border: 1upx solid #ffffff;
+	opacity: 0.5;
+}
+
+.cu-custom .cu-bar .border-custom::before {
+	content: " ";
+	width: 1upx;
+	height: 110%;
+	position: absolute;
+	top: 22.5%;
+	left: 0;
+	right: 0;
+	margin: auto;
+	transform: scale(0.5);
+	transform-origin: 0 0;
+	pointer-events: none;
+	box-sizing: border-box;
+	opacity: 0.6;
+	background-color: #ffffff;
+}
+
+.cu-custom .cu-bar .border-custom text {
+	display: block;
+	flex: 1;
+	margin: auto !important;
+	text-align: center;
+	font-size: 34upx;
+}
+
+/* ==================
+         导航栏
+ ==================== */
+
+.nav {
+	white-space: nowrap;
+}
+
+::-webkit-scrollbar {
+	display: none;
+}
+
+.nav .cu-item {
+	height: 90upx;
+	display: inline-block;
+	line-height: 90upx;
+	margin: 0 10upx;
+	padding: 0 20upx;
+}
+
+.nav .cu-item.cur {
+	border-bottom: 4upx solid;
+}
+
+/* ==================
+         时间轴
+ ==================== */
+
+.cu-timeline {
+	display: block;
+	background-color: #ffffff;
+}
+
+.cu-timeline .cu-time {
+	width: 120upx;
+	text-align: center;
+	padding: 20upx 0;
+	font-size: 26upx;
+	color: #888;
+	display: block;
+}
+
+.cu-timeline>.cu-item {
+	padding: 30upx 30upx 30upx 120upx;
+	position: relative;
+	display: block;
+	z-index: 0;
+}
+
+.cu-timeline>.cu-item:not([class*="text-"]) {
+	color: #ccc;
+}
+
+.cu-timeline>.cu-item::after {
+	content: "";
+	display: block;
+	position: absolute;
+	width: 1upx;
+	background-color: #ddd;
+	left: 60upx;
+	height: 100%;
+	top: 0;
+	z-index: 8;
+}
+
+.cu-timeline>.cu-item::before {
+	font-family: "cuIcon";
+	display: block;
+	position: absolute;
+	top: 36upx;
+	z-index: 9;
+	background-color: #ffffff;
+	width: 50upx;
+	height: 50upx;
+	text-align: center;
+	border: none;
+	line-height: 50upx;
+	left: 36upx;
+}
+
+.cu-timeline>.cu-item:not([class*="cuIcon-"])::before {
+	content: "\e763";
+}
+
+.cu-timeline>.cu-item[class*="cuIcon-"]::before {
+	background-color: #ffffff;
+	width: 50upx;
+	height: 50upx;
+	text-align: center;
+	border: none;
+	line-height: 50upx;
+	left: 36upx;
+}
+
+.cu-timeline>.cu-item>.content {
+	padding: 30upx;
+	border-radius: 6upx;
+	display: block;
+	line-height: 1.6;
+}
+
+.cu-timeline>.cu-item>.content:not([class*="bg-"]) {
+	background-color: #f1f1f1;
+	color: #333333;
+}
+
+.cu-timeline>.cu-item>.content+.content {
+	margin-top: 20upx;
+}
+
+/* ==================
+         聊天
+ ==================== */
+
+.cu-chat {
+	display: flex;
+	flex-direction: column;
+}
+
+.cu-chat .cu-item {
+	display: flex;
+	padding: 30upx 30upx 70upx;
+	position: relative;
+}
+
+.cu-chat .cu-item>.cu-avatar {
+	width: 80upx;
+	height: 80upx;
+}
+
+.cu-chat .cu-item>.main {
+	max-width: calc(100% - 260upx);
+	margin: 0 40upx;
+	display: flex;
+	align-items: center;
+}
+
+.cu-chat .cu-item>image {
+	height: 320upx;
+}
+
+.cu-chat .cu-item>.main .content {
+	padding: 20upx;
+	border-radius: 6upx;
+	display: inline-flex;
+	max-width: 100%;
+	align-items: center;
+	font-size: 30upx;
+	position: relative;
+	min-height: 80upx;
+	line-height: 40upx;
+	text-align: left;
+}
+
+.cu-chat .cu-item>.main .content:not([class*="bg-"]) {
+	background-color: #ffffff;
+	color: #333333;
+}
+
+.cu-chat .cu-item .date {
+	position: absolute;
+	font-size: 24upx;
+	color: #8799a3;
+	width: calc(100% - 320upx);
+	bottom: 20upx;
+	left: 160upx;
+}
+
+.cu-chat .cu-item .action {
+	padding: 0 30upx;
+	display: flex;
+	align-items: center;
+}
+
+.cu-chat .cu-item>.main .content::after {
+	content: "";
+	top: 27upx;
+	transform: rotate(45deg);
+	position: absolute;
+	z-index: 100;
+	display: inline-block;
+	overflow: hidden;
+	width: 24upx;
+	height: 24upx;
+	left: -12upx;
+	right: initial;
+	background-color: inherit;
+}
+
+.cu-chat .cu-item.self>.main .content::after {
+	left: auto;
+	right: -12upx;
+}
+
+.cu-chat .cu-item>.main .content::before {
+	content: "";
+	top: 30upx;
+	transform: rotate(45deg);
+	position: absolute;
+	z-index: -1;
+	display: inline-block;
+	overflow: hidden;
+	width: 24upx;
+	height: 24upx;
+	left: -12upx;
+	right: initial;
+	background-color: inherit;
+	filter: blur(5upx);
+	opacity: 0.3;
+}
+
+.cu-chat .cu-item>.main .content:not([class*="bg-"])::before {
+	background-color: #333333;
+	opacity: 0.1;
+}
+
+.cu-chat .cu-item.self>.main .content::before {
+	left: auto;
+	right: -12upx;
+}
+
+.cu-chat .cu-item.self {
+	justify-content: flex-end;
+	text-align: right;
+}
+
+.cu-chat .cu-info {
+	display: inline-block;
+	margin: 20upx auto;
+	font-size: 24upx;
+	padding: 8upx 12upx;
+	background-color: rgba(0, 0, 0, 0.2);
+	border-radius: 6upx;
+	color: #ffffff;
+	max-width: 400upx;
+	line-height: 1.4;
+}
+
+/* ==================
+         卡片
+ ==================== */
+
+.cu-card {
+	display: block;
+	overflow: hidden;
+}
+
+.cu-card>.cu-item {
+	display: block;
+	background-color: #ffffff;
+	overflow: hidden;
+	border-radius: 10upx;
+	margin: 30upx;
+}
+
+.cu-card>.cu-item.shadow-blur {
+	overflow: initial;
+}
+
+.cu-card.no-card>.cu-item {
+	margin: 0upx;
+	border-radius: 0upx;
+}
+
+.cu-card .grid.grid-square {
+	margin-bottom: -20upx;
+}
+
+.cu-card.case .image {
+	position: relative;
+}
+
+.cu-card.case .image image {
+	width: 100%;
+}
+
+.cu-card.case .image .cu-tag {
+	position: absolute;
+	right: 0;
+	top: 0;
+}
+
+.cu-card.case .image .cu-bar {
+	position: absolute;
+	bottom: 0;
+	width: 100%;
+	background-color: transparent;
+	padding: 0upx 30upx;
+}
+
+.cu-card.case.no-card .image {
+	margin: 30upx 30upx 0;
+	overflow: hidden;
+	border-radius: 10upx;
+}
+
+.cu-card.dynamic {
+	display: block;
+}
+
+.cu-card.dynamic>.cu-item {
+	display: block;
+	background-color: #ffffff;
+	overflow: hidden;
+}
+
+.cu-card.dynamic>.cu-item>.text-content {
+	padding: 0 30upx 0;
+	max-height: 6.4em;
+	overflow: hidden;
+	font-size: 30upx;
+	margin-bottom: 20upx;
+}
+
+.cu-card.dynamic>.cu-item .square-img {
+	width: 100%;
+	height: 200upx;
+	border-radius: 6upx;
+}
+
+.cu-card.dynamic>.cu-item .only-img {
+	width: 100%;
+	height: 320upx;
+	border-radius: 6upx;
+}
+
+/* card.dynamic>.cu-item .comment {
+  padding: 20upx;
+  background-color: #f1f1f1;
+  margin: 0 30upx 30upx;
+  border-radius: 6upx;
+} */
+
+.cu-card.article {
+	display: block;
+}
+
+.cu-card.article>.cu-item {
+	padding-bottom: 30upx;
+}
+
+.cu-card.article>.cu-item .title {
+	font-size: 30upx;
+	font-weight: 900;
+	color: #333333;
+	line-height: 100upx;
+	padding: 0 30upx;
+}
+
+.cu-card.article>.cu-item .content {
+	display: flex;
+	padding: 0 30upx;
+}
+
+.cu-card.article>.cu-item .content>image {
+	width: 240upx;
+	height: 6.4em;
+	margin-right: 20upx;
+	border-radius: 6upx;
+}
+
+.cu-card.article>.cu-item .content .desc {
+	flex: 1;
+	display: flex;
+	flex-direction: column;
+	justify-content: space-between;
+}
+
+.cu-card.article>.cu-item .content .text-content {
+	font-size: 28upx;
+	color: #888;
+	height: 4.8em;
+	overflow: hidden;
+}
+
+/* ==================
+         表单
+ ==================== */
+
+.cu-form-group {
+	background-color: #ffffff;
+	padding: 1upx 30upx;
+	display: flex;
+	align-items: center;
+	min-height: 100upx;
+	justify-content: space-between;
+}
+
+.cu-form-group+.cu-form-group {
+	border-top: 1upx solid #eee;
+}
+
+.cu-form-group .title {
+	text-align: justify;
+	padding-right: 30upx;
+	font-size: 30upx;
+	position: relative;
+	height: 60upx;
+	line-height: 60upx;
+}
+
+.cu-form-group input {
+	flex: 1;
+	font-size: 30upx;
+	color: #555;
+	padding-right: 20upx;
+}
+
+.cu-form-group>text[class*="cuIcon-"] {
+	font-size: 36upx;
+	padding: 0;
+	box-sizing: border-box;
+}
+
+.cu-form-group textarea {
+	margin: 32upx 0 30upx;
+	height: 4.6em;
+	width: 100%;
+	line-height: 1.2em;
+	flex: 1;
+	font-size: 28upx;
+	padding: 0;
+}
+
+.cu-form-group.align-start .title {
+	height: 1em;
+	margin-top: 32upx;
+	line-height: 1em;
+}
+
+.cu-form-group picker {
+	flex: 1;
+	padding-right: 40upx;
+	overflow: hidden;
+	position: relative;
+}
+
+.cu-form-group picker .picker {
+	line-height: 100upx;
+	font-size: 28upx;
+	text-overflow: ellipsis;
+	white-space: nowrap;
+	overflow: hidden;
+	width: 100%;
+	text-align: right;
+}
+
+.cu-form-group picker::after {
+	font-family: cuIcon;
+	display: block;
+	content: "\e6a3";
+	position: absolute;
+	font-size: 34upx;
+	color: #8799a3;
+	line-height: 100upx;
+	width: 60upx;
+	text-align: center;
+	top: 0;
+	bottom: 0;
+	right: -20upx;
+	margin: auto;
+}
+
+.cu-form-group textarea[disabled],
+.cu-form-group textarea[disabled] .placeholder {
+	color: transparent;
+}
+
+/* ==================
+         模态窗口
+ ==================== */
+
+.cu-modal {
+	position: fixed;
+	top: 0;
+	right: 0;
+	bottom: 0;
+	left: 0;
+	z-index: 1110;
+	opacity: 0;
+	outline: 0;
+	text-align: center;
+	-ms-transform: scale(1.185);
+	transform: scale(1.185);
+	backface-visibility: hidden;
+	perspective: 2000upx;
+	background: rgba(0, 0, 0, 0.6);
+	transition: all 0.3s ease-in-out 0s;
+	pointer-events: none;
+}
+
+.cu-modal::before {
+	content: "\200B";
+	display: inline-block;
+	height: 100%;
+	vertical-align: middle;
+}
+
+.cu-modal.show {
+	opacity: 1;
+	transition-duration: 0.3s;
+	-ms-transform: scale(1);
+	transform: scale(1);
+	overflow-x: hidden;
+	overflow-y: auto;
+	pointer-events: auto;
+}
+
+.cu-dialog {
+	position: relative;
+	display: inline-block;
+	vertical-align: middle;
+	margin-left: auto;
+	margin-right: auto;
+	width: 680upx;
+	max-width: 100%;
+	background-color: #f8f8f8;
+	border-radius: 10upx;
+	overflow: hidden;
+}
+
+.cu-modal.bottom-modal::before {
+	vertical-align: bottom;
+}
+
+.cu-modal.bottom-modal .cu-dialog {
+	width: 100%;
+	border-radius: 0;
+}
+
+.cu-modal.bottom-modal {
+	margin-bottom: -1000upx;
+}
+
+.cu-modal.bottom-modal.show {
+	margin-bottom: 0;
+}
+
+.cu-modal.drawer-modal {
+	transform: scale(1);
+	display: flex;
+}
+
+.cu-modal.drawer-modal .cu-dialog {
+	height: 100%;
+	min-width: 200upx;
+	border-radius: 0;
+	margin: initial;
+	transition-duration: 0.3s;
+}
+
+.cu-modal.drawer-modal.justify-start .cu-dialog {
+	transform: translateX(-100%);
+}
+
+.cu-modal.drawer-modal.justify-end .cu-dialog {
+	transform: translateX(100%);
+}
+
+.cu-modal.drawer-modal.show .cu-dialog {
+	transform: translateX(0%);
+}
+.cu-modal .cu-dialog>.cu-bar:first-child .action{
+  min-width: 100rpx;
+  margin-right: 0;
+  min-height: 100rpx;
+}
+/* ==================
+         轮播
+ ==================== */
+swiper .a-swiper-dot {
+	display: inline-block;
+	width: 16upx;
+	height: 16upx;
+	background: rgba(0, 0, 0, .3);
+	border-radius: 50%;
+	vertical-align: middle;
+}
+
+swiper[class*="-dot"] .wx-swiper-dots,
+swiper[class*="-dot"] .a-swiper-dots,
+swiper[class*="-dot"] .uni-swiper-dots {
+	display: flex;
+	align-items: center;
+	width: 100%;
+	justify-content: center;
+}
+
+swiper.square-dot .wx-swiper-dot,
+swiper.square-dot .a-swiper-dot,
+swiper.square-dot .uni-swiper-dot {
+	background-color: #ffffff;
+	opacity: 0.4;
+	width: 10upx;
+	height: 10upx;
+	border-radius: 20upx;
+	margin: 0 8upx !important;
+}
+
+swiper.square-dot .wx-swiper-dot.wx-swiper-dot-active,
+swiper.square-dot .a-swiper-dot.a-swiper-dot-active,
+swiper.square-dot .uni-swiper-dot.uni-swiper-dot-active {
+	opacity: 1;
+	width: 30upx;
+}
+
+swiper.round-dot .wx-swiper-dot,
+swiper.round-dot .a-swiper-dot,
+swiper.round-dot .uni-swiper-dot {
+	width: 10upx;
+	height: 10upx;
+	position: relative;
+	margin: 4upx 8upx !important;
+}
+
+swiper.round-dot .wx-swiper-dot.wx-swiper-dot-active::after,
+swiper.round-dot .a-swiper-dot.a-swiper-dot-active::after,
+swiper.round-dot .uni-swiper-dot.uni-swiper-dot-active::after {
+	content: "";
+	position: absolute;
+	width: 10upx;
+	height: 10upx;
+	top: 0upx;
+	left: 0upx;
+	right: 0;
+	bottom: 0;
+	margin: auto;
+	background-color: #ffffff;
+	border-radius: 20upx;
+}
+
+swiper.round-dot .wx-swiper-dot.wx-swiper-dot-active,
+swiper.round-dot .a-swiper-dot.a-swiper-dot-active,
+swiper.round-dot .uni-swiper-dot.uni-swiper-dot-active {
+	width: 18upx;
+	height: 18upx;
+}
+
+.screen-swiper {
+	min-height: 375upx;
+}
+
+.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: 420upx !important;
+}
+
+.card-swiper swiper-item {
+	width: 610upx !important;
+	left: 70upx;
+	box-sizing: border-box;
+	padding: 40upx 0upx 70upx;
+	overflow: initial;
+}
+
+.card-swiper swiper-item .swiper-item {
+	width: 100%;
+	display: block;
+	height: 100%;
+	border-radius: 10upx;
+	transform: scale(0.9);
+	transition: all 0.2s ease-in 0s;
+	overflow: hidden;
+}
+
+.card-swiper swiper-item.cur .swiper-item {
+	transform: none;
+	transition: all 0.2s ease-in 0s;
+}
+
+
+.tower-swiper {
+	height: 420upx;
+	position: relative;
+	max-width: 750upx;
+	overflow: hidden;
+}
+
+.tower-swiper .tower-item {
+	position: absolute;
+	width: 300upx;
+	height: 380upx;
+	top: 0;
+	bottom: 0;
+	left: 50%;
+	margin: auto;
+	transition: all 0.2s ease-in 0s;
+	opacity: 1;
+}
+
+.tower-swiper .tower-item.none {
+	opacity: 0;
+}
+
+.tower-swiper .tower-item .swiper-item {
+	width: 100%;
+	height: 100%;
+	border-radius: 6upx;
+	overflow: hidden;
+}
+
+/* ==================
+          步骤条
+ ==================== */
+
+.cu-steps {
+	display: flex;
+}
+
+scroll-view.cu-steps {
+	display: block;
+	white-space: nowrap;
+}
+
+scroll-view.cu-steps .cu-item {
+	display: inline-block;
+}
+
+.cu-steps .cu-item {
+	flex: 1;
+	text-align: center;
+	position: relative;
+	min-width: 100upx;
+}
+
+.cu-steps .cu-item:not([class*="text-"]) {
+	color: #8799a3;
+}
+
+.cu-steps .cu-item [class*="cuIcon-"],
+.cu-steps .cu-item .num {
+	display: block;
+	font-size: 40upx;
+	line-height: 80upx;
+}
+
+.cu-steps .cu-item::before,
+.cu-steps .cu-item::after,
+.cu-steps.steps-arrow .cu-item::before,
+.cu-steps.steps-arrow .cu-item::after {
+	content: "";
+	display: block;
+	position: absolute;
+	height: 0px;
+	width: calc(100% - 80upx);
+	border-bottom: 1px solid #ccc;
+	left: calc(0px - (100% - 80upx) / 2);
+	top: 40upx;
+	z-index: 0;
+}
+
+.cu-steps.steps-arrow .cu-item::before,
+.cu-steps.steps-arrow .cu-item::after {
+	content: "\e6a3";
+	font-family: 'cuIcon';
+	height: 30upx;
+	border-bottom-width: 0px;
+	line-height: 30upx;
+	top: 0;
+	bottom: 0;
+	margin: auto;
+	color: #ccc;
+}
+
+.cu-steps.steps-bottom .cu-item::before,
+.cu-steps.steps-bottom .cu-item::after {
+	bottom: 40upx;
+	top: initial;
+}
+
+.cu-steps .cu-item::after {
+	border-bottom: 1px solid currentColor;
+	width: 0px;
+	transition: all 0.3s ease-in-out 0s;
+}
+
+.cu-steps .cu-item[class*="text-"]::after {
+	width: calc(100% - 80upx);
+	color: currentColor;
+}
+
+.cu-steps .cu-item:first-child::before,
+.cu-steps .cu-item:first-child::after {
+	display: none;
+}
+
+.cu-steps .cu-item .num {
+	width: 40upx;
+	height: 40upx;
+	border-radius: 50%;
+	line-height: 40upx;
+	margin: 20upx auto;
+	font-size: 24upx;
+	border: 1px solid currentColor;
+	position: relative;
+	overflow: hidden;
+}
+
+.cu-steps .cu-item[class*="text-"] .num {
+	background-color: currentColor;
+}
+
+.cu-steps .cu-item .num::before,
+.cu-steps .cu-item .num::after {
+	content: attr(data-index);
+	position: absolute;
+	left: 0;
+	right: 0;
+	top: 0;
+	bottom: 0;
+	margin: auto;
+	transition: all 0.3s ease-in-out 0s;
+	transform: translateY(0upx);
+}
+
+.cu-steps .cu-item[class*="text-"] .num::before {
+	transform: translateY(-40upx);
+	color: #ffffff;
+}
+
+.cu-steps .cu-item .num::after {
+	transform: translateY(40upx);
+	color: #ffffff;
+	transition: all 0.3s ease-in-out 0s;
+}
+
+.cu-steps .cu-item[class*="text-"] .num::after {
+	content: "\e645";
+	font-family: 'cuIcon';
+	color: #ffffff;
+	transform: translateY(0upx);
+}
+
+.cu-steps .cu-item[class*="text-"] .num.err::after {
+	content: "\e646";
+}
+
+/* ==================
+          布局
+ ==================== */
+
+/*  -- flex弹性布局 -- */
+
+.flex {
+	display: flex;
+}
+
+.basis-xs {
+	flex-basis: 20%;
+}
+
+.basis-sm {
+	flex-basis: 40%;
+}
+
+.basis-df {
+	flex-basis: 50%;
+}
+
+.basis-lg {
+	flex-basis: 60%;
+}
+
+.basis-xl {
+	flex-basis: 80%;
+}
+
+.flex-sub {
+	flex: 1;
+}
+
+.flex-twice {
+	flex: 2;
+}
+
+.flex-treble {
+	flex: 3;
+}
+
+.flex-direction {
+	flex-direction: column;
+}
+
+.flex-wrap {
+	flex-wrap: wrap;
+}
+
+.align-start {
+	align-items: flex-start;
+}
+
+.align-end {
+	align-items: flex-end;
+}
+
+.align-center {
+	align-items: center;
+}
+
+.align-stretch {
+	align-items: stretch;
+}
+
+.self-start {
+	align-self: flex-start;
+}
+
+.self-center {
+	align-self: flex-center;
+}
+
+.self-end {
+	align-self: flex-end;
+}
+
+.self-stretch {
+	align-self: stretch;
+}
+
+.align-stretch {
+	align-items: stretch;
+}
+
+.justify-start {
+	justify-content: flex-start;
+}
+
+.justify-end {
+	justify-content: flex-end;
+}
+
+.justify-center {
+	justify-content: center;
+}
+
+.justify-between {
+	justify-content: space-between;
+}
+
+.justify-around {
+	justify-content: space-around;
+}
+
+/* grid布局 */
+
+.grid {
+	display: flex;
+	flex-wrap: wrap;
+}
+
+.grid.grid-square {
+	overflow: hidden;
+}
+
+.grid.grid-square .cu-tag {
+	position: absolute;
+	right: 0;
+	top: 0;
+	border-bottom-left-radius: 6upx;
+	padding: 6upx 12upx;
+	height: auto;
+	background-color: rgba(0, 0, 0, 0.5);
+}
+
+.grid.grid-square>view>text[class*="cuIcon-"] {
+	font-size: 52upx;
+	position: absolute;
+	color: #8799a3;
+	margin: auto;
+	top: 0;
+	bottom: 0;
+	left: 0;
+	right: 0;
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	flex-direction: column;
+}
+
+.grid.grid-square>view {
+	margin-right: 20upx;
+	margin-bottom: 20upx;
+	border-radius: 6upx;
+	position: relative;
+	overflow: hidden;
+}
+.grid.grid-square>view.bg-img image {
+	width: 100%;
+	height: 100%;
+	position: absolute;
+}
+.grid.col-1.grid-square>view {
+	padding-bottom: 100%;
+	height: 0;
+	margin-right: 0;
+}
+
+.grid.col-2.grid-square>view {
+	padding-bottom: calc((100% - 20upx)/2);
+	height: 0;
+	width: calc((100% - 20upx)/2);
+}
+
+.grid.col-3.grid-square>view {
+	padding-bottom: calc((100% - 40upx)/3);
+	height: 0;
+	width: calc((100% - 40upx)/3);
+}
+
+.grid.col-4.grid-square>view {
+	padding-bottom: calc((100% - 60upx)/4);
+	height: 0;
+	width: calc((100% - 60upx)/4);
+}
+
+.grid.col-5.grid-square>view {
+	padding-bottom: calc((100% - 80upx)/5);
+	height: 0;
+	width: calc((100% - 80upx)/5);
+}
+
+.grid.col-2.grid-square>view:nth-child(2n),
+.grid.col-3.grid-square>view:nth-child(3n),
+.grid.col-4.grid-square>view:nth-child(4n),
+.grid.col-5.grid-square>view:nth-child(5n) {
+	margin-right: 0;
+}
+
+.grid.col-1>view {
+	width: 100%;
+}
+
+.grid.col-2>view {
+	width: 50%;
+}
+
+.grid.col-3>view {
+	width: 33.33%;
+}
+
+.grid.col-4>view {
+	width: 25%;
+}
+
+.grid.col-5>view {
+	width: 20%;
+}
+
+/*  -- 内外边距 -- */
+
+.margin-0 {
+	margin: 0;
+}
+
+.margin-xs {
+	margin: 10upx;
+}
+
+.margin-sm {
+	margin: 20upx;
+}
+
+.margin {
+	margin: 30upx;
+}
+
+.margin-lg {
+	margin: 40upx;
+}
+
+.margin-xl {
+	margin: 50upx;
+}
+
+.margin-top-xs {
+	margin-top: 10upx;
+}
+
+.margin-top-sm {
+	margin-top: 20upx;
+}
+
+.margin-top {
+	margin-top: 30upx;
+}
+
+.margin-top-lg {
+	margin-top: 40upx;
+}
+
+.margin-top-xl {
+	margin-top: 50upx;
+}
+
+.margin-right-xs {
+	margin-right: 10upx;
+}
+
+.margin-right-sm {
+	margin-right: 20upx;
+}
+
+.margin-right {
+	margin-right: 30upx;
+}
+
+.margin-right-lg {
+	margin-right: 40upx;
+}
+
+.margin-right-xl {
+	margin-right: 50upx;
+}
+
+.margin-bottom-xs {
+	margin-bottom: 10upx;
+}
+
+.margin-bottom-sm {
+	margin-bottom: 20upx;
+}
+
+.margin-bottom {
+	margin-bottom: 30upx;
+}
+
+.margin-bottom-lg {
+	margin-bottom: 40upx;
+}
+
+.margin-bottom-xl {
+	margin-bottom: 50upx;
+}
+
+.margin-left-xs {
+	margin-left: 10upx;
+}
+
+.margin-left-sm {
+	margin-left: 20upx;
+}
+
+.margin-left {
+	margin-left: 30upx;
+}
+
+.margin-left-lg {
+	margin-left: 40upx;
+}
+
+.margin-left-xl {
+	margin-left: 50upx;
+}
+
+.margin-lr-xs {
+	margin-left: 10upx;
+	margin-right: 10upx;
+}
+
+.margin-lr-sm {
+	margin-left: 20upx;
+	margin-right: 20upx;
+}
+
+.margin-lr {
+	margin-left: 30upx;
+	margin-right: 30upx;
+}
+
+.margin-lr-lg {
+	margin-left: 40upx;
+	margin-right: 40upx;
+}
+
+.margin-lr-xl {
+	margin-left: 50upx;
+	margin-right: 50upx;
+}
+
+.margin-tb-xs {
+	margin-top: 10upx;
+	margin-bottom: 10upx;
+}
+
+.margin-tb-sm {
+	margin-top: 20upx;
+	margin-bottom: 20upx;
+}
+
+.margin-tb {
+	margin-top: 30upx;
+	margin-bottom: 30upx;
+}
+
+.margin-tb-lg {
+	margin-top: 40upx;
+	margin-bottom: 40upx;
+}
+
+.margin-tb-xl {
+	margin-top: 50upx;
+	margin-bottom: 50upx;
+}
+
+.padding-0 {
+	padding: 0;
+}
+
+.padding-xs {
+	padding: 10upx;
+}
+
+.padding-sm {
+	padding: 20upx;
+}
+
+.padding {
+	padding: 30upx;
+}
+
+.padding-lg {
+	padding: 40upx;
+}
+
+.padding-xl {
+	padding: 50upx;
+}
+
+.padding-top-xs {
+	padding-top: 10upx;
+}
+
+.padding-top-sm {
+	padding-top: 20upx;
+}
+
+.padding-top {
+	padding-top: 30upx;
+}
+
+.padding-top-lg {
+	padding-top: 40upx;
+}
+
+.padding-top-xl {
+	padding-top: 50upx;
+}
+
+.padding-right-xs {
+	padding-right: 10upx;
+}
+
+.padding-right-sm {
+	padding-right: 20upx;
+}
+
+.padding-right {
+	padding-right: 30upx;
+}
+
+.padding-right-lg {
+	padding-right: 40upx;
+}
+
+.padding-right-xl {
+	padding-right: 50upx;
+}
+
+.padding-bottom-xs {
+	padding-bottom: 10upx;
+}
+
+.padding-bottom-sm {
+	padding-bottom: 20upx;
+}
+
+.padding-bottom {
+	padding-bottom: 30upx;
+}
+
+.padding-bottom-lg {
+	padding-bottom: 40upx;
+}
+
+.padding-bottom-xl {
+	padding-bottom: 50upx;
+}
+
+.padding-left-xs {
+	padding-left: 10upx;
+}
+
+.padding-left-sm {
+	padding-left: 20upx;
+}
+
+.padding-left {
+	padding-left: 30upx;
+}
+
+.padding-left-lg {
+	padding-left: 40upx;
+}
+
+.padding-left-xl {
+	padding-left: 50upx;
+}
+
+.padding-lr-xs {
+	padding-left: 10upx;
+	padding-right: 10upx;
+}
+
+.padding-lr-sm {
+	padding-left: 20upx;
+	padding-right: 20upx;
+}
+
+.padding-lr {
+	padding-left: 30upx;
+	padding-right: 30upx;
+}
+
+.padding-lr-lg {
+	padding-left: 40upx;
+	padding-right: 40upx;
+}
+
+.padding-lr-xl {
+	padding-left: 50upx;
+	padding-right: 50upx;
+}
+
+.padding-tb-xs {
+	padding-top: 10upx;
+	padding-bottom: 10upx;
+}
+
+.padding-tb-sm {
+	padding-top: 20upx;
+	padding-bottom: 20upx;
+}
+
+.padding-tb {
+	padding-top: 30upx;
+	padding-bottom: 30upx;
+}
+
+.padding-tb-lg {
+	padding-top: 40upx;
+	padding-bottom: 40upx;
+}
+
+.padding-tb-xl {
+	padding-top: 50upx;
+	padding-bottom: 50upx;
+}
+
+/* -- 浮动 --  */
+
+.cf::after,
+.cf::before {
+	content: " ";
+	display: table;
+}
+
+.cf::after {
+	clear: both;
+}
+
+.fl {
+	float: left;
+}
+
+.fr {
+	float: right;
+}
+
+/* ==================
+          背景
+ ==================== */
+
+.line-red::after,
+.lines-red::after {
+	border-color: #e54d42;
+}
+
+.line-orange::after,
+.lines-orange::after {
+	border-color: #f37b1d;
+}
+
+.line-yellow::after,
+.lines-yellow::after {
+	border-color: #fbbd08;
+}
+
+.line-olive::after,
+.lines-olive::after {
+	border-color: #8dc63f;
+}
+
+.line-green::after,
+.lines-green::after {
+	border-color: #39b54a;
+}
+
+.line-cyan::after,
+.lines-cyan::after {
+	border-color: #1cbbb4;
+}
+
+.line-blue::after,
+.lines-blue::after {
+	border-color: #0081ff;
+}
+
+.line-purple::after,
+.lines-purple::after {
+	border-color: #6739b6;
+}
+
+.line-mauve::after,
+.lines-mauve::after {
+	border-color: #9c26b0;
+}
+
+.line-pink::after,
+.lines-pink::after {
+	border-color: #e03997;
+}
+
+.line-brown::after,
+.lines-brown::after {
+	border-color: #a5673f;
+}
+
+.line-grey::after,
+.lines-grey::after {
+	border-color: #8799a3;
+}
+
+.line-gray::after,
+.lines-gray::after {
+	border-color: #aaaaaa;
+}
+
+.line-black::after,
+.lines-black::after {
+	border-color: #333333;
+}
+
+.line-white::after,
+.lines-white::after {
+	border-color: #ffffff;
+}
+
+.bg-red {
+	background-color: #e54d42;
+	color: #ffffff;
+}
+
+.bg-orange {
+	background-color: #f37b1d;
+	color: #ffffff;
+}
+
+.bg-yellow {
+	background-color: #fbbd08;
+	color: #333333;
+}
+
+.bg-olive {
+	background-color: #8dc63f;
+	color: #ffffff;
+}
+
+.bg-green {
+	background-color: #39b54a;
+	color: #ffffff;
+}
+
+.bg-cyan {
+	background-color: #1cbbb4;
+	color: #ffffff;
+}
+
+.bg-blue {
+	background-color: #0081ff;
+	color: #ffffff;
+}
+
+.bg-purple {
+	background-color: #6739b6;
+	color: #ffffff;
+}
+
+.bg-mauve {
+	background-color: #9c26b0;
+	color: #ffffff;
+}
+
+.bg-pink {
+	background-color: #e03997;
+	color: #ffffff;
+}
+
+.bg-brown {
+	background-color: #a5673f;
+	color: #ffffff;
+}
+
+.bg-grey {
+	background-color: #8799a3;
+	color: #ffffff;
+}
+
+.bg-gray {
+	background-color: #f0f0f0;
+	color: #333333;
+}
+
+.bg-black {
+	background-color: #333333;
+	color: #ffffff;
+}
+
+.bg-white {
+	background-color: #ffffff;
+	color: #666666;
+}
+
+.bg-shadeTop {
+	background-image: linear-gradient(rgba(0, 0, 0, 1), rgba(0, 0, 0, 0.01));
+	color: #ffffff;
+}
+
+.bg-shadeBottom {
+	background-image: linear-gradient(rgba(0, 0, 0, 0.01), rgba(0, 0, 0, 1));
+	color: #ffffff;
+}
+
+.bg-red.light {
+	color: #e54d42;
+	background-color: #fadbd9;
+}
+
+.bg-orange.light {
+	color: #f37b1d;
+	background-color: #fde6d2;
+}
+
+.bg-yellow.light {
+	color: #fbbd08;
+	background-color: #fef2ced2;
+}
+
+.bg-olive.light {
+	color: #8dc63f;
+	background-color: #e8f4d9;
+}
+
+.bg-green.light {
+	color: #39b54a;
+	background-color: #d7f0dbff;
+}
+
+.bg-cyan.light {
+	color: #1cbbb4;
+	background-color: #d2f1f0;
+}
+
+.bg-blue.light {
+	color: #0081ff;
+	background-color: #cce6ff;
+}
+
+.bg-purple.light {
+	color: #6739b6;
+	background-color: #e1d7f0;
+}
+
+.bg-mauve.light {
+	color: #9c26b0;
+	background-color: #ebd4ef;
+}
+
+.bg-pink.light {
+	color: #e03997;
+	background-color: #f9d7ea;
+}
+
+.bg-brown.light {
+	color: #a5673f;
+	background-color: #ede1d9;
+}
+
+.bg-grey.light {
+	color: #8799a3;
+	background-color: #e7ebed;
+}
+
+.bg-gradual-red {
+	background-image: linear-gradient(45deg, #f43f3b, #ec008c);
+	color: #ffffff;
+}
+
+.bg-gradual-orange {
+	background-image: linear-gradient(45deg, #ff9700, #ed1c24);
+	color: #ffffff;
+}
+
+.bg-gradual-green {
+	background-image: linear-gradient(45deg, #39b54a, #8dc63f);
+	color: #ffffff;
+}
+
+.bg-gradual-purple {
+	background-image: linear-gradient(45deg, #9000ff, #5e00ff);
+	color: #ffffff;
+}
+
+.bg-gradual-pink {
+	background-image: linear-gradient(45deg, #ec008c, #6739b6);
+	color: #ffffff;
+}
+
+.bg-gradual-blue {
+	background-image: linear-gradient(45deg, #0081ff, #1cbbb4);
+	color: #ffffff;
+}
+
+.shadow[class*="-red"] {
+	box-shadow: 6upx 6upx 8upx rgba(204, 69, 59, 0.2);
+}
+
+.shadow[class*="-orange"] {
+	box-shadow: 6upx 6upx 8upx rgba(217, 109, 26, 0.2);
+}
+
+.shadow[class*="-yellow"] {
+	box-shadow: 6upx 6upx 8upx rgba(224, 170, 7, 0.2);
+}
+
+.shadow[class*="-olive"] {
+	box-shadow: 6upx 6upx 8upx rgba(124, 173, 55, 0.2);
+}
+
+.shadow[class*="-green"] {
+	box-shadow: 6upx 6upx 8upx rgba(48, 156, 63, 0.2);
+}
+
+.shadow[class*="-cyan"] {
+	box-shadow: 6upx 6upx 8upx rgba(28, 187, 180, 0.2);
+}
+
+.shadow[class*="-blue"] {
+	box-shadow: 6upx 6upx 8upx rgba(0, 102, 204, 0.2);
+}
+
+.shadow[class*="-purple"] {
+	box-shadow: 6upx 6upx 8upx rgba(88, 48, 156, 0.2);
+}
+
+.shadow[class*="-mauve"] {
+	box-shadow: 6upx 6upx 8upx rgba(133, 33, 150, 0.2);
+}
+
+.shadow[class*="-pink"] {
+	box-shadow: 6upx 6upx 8upx rgba(199, 50, 134, 0.2);
+}
+
+.shadow[class*="-brown"] {
+	box-shadow: 6upx 6upx 8upx rgba(140, 88, 53, 0.2);
+}
+
+.shadow[class*="-grey"] {
+	box-shadow: 6upx 6upx 8upx rgba(114, 130, 138, 0.2);
+}
+
+.shadow[class*="-gray"] {
+	box-shadow: 6upx 6upx 8upx rgba(114, 130, 138, 0.2);
+}
+
+.shadow[class*="-black"] {
+	box-shadow: 6upx 6upx 8upx rgba(26, 26, 26, 0.2);
+}
+
+.shadow[class*="-white"] {
+	box-shadow: 6upx 6upx 8upx rgba(26, 26, 26, 0.2);
+}
+
+.text-shadow[class*="-red"] {
+	text-shadow: 6upx 6upx 8upx rgba(204, 69, 59, 0.2);
+}
+
+.text-shadow[class*="-orange"] {
+	text-shadow: 6upx 6upx 8upx rgba(217, 109, 26, 0.2);
+}
+
+.text-shadow[class*="-yellow"] {
+	text-shadow: 6upx 6upx 8upx rgba(224, 170, 7, 0.2);
+}
+
+.text-shadow[class*="-olive"] {
+	text-shadow: 6upx 6upx 8upx rgba(124, 173, 55, 0.2);
+}
+
+.text-shadow[class*="-green"] {
+	text-shadow: 6upx 6upx 8upx rgba(48, 156, 63, 0.2);
+}
+
+.text-shadow[class*="-cyan"] {
+	text-shadow: 6upx 6upx 8upx rgba(28, 187, 180, 0.2);
+}
+
+.text-shadow[class*="-blue"] {
+	text-shadow: 6upx 6upx 8upx rgba(0, 102, 204, 0.2);
+}
+
+.text-shadow[class*="-purple"] {
+	text-shadow: 6upx 6upx 8upx rgba(88, 48, 156, 0.2);
+}
+
+.text-shadow[class*="-mauve"] {
+	text-shadow: 6upx 6upx 8upx rgba(133, 33, 150, 0.2);
+}
+
+.text-shadow[class*="-pink"] {
+	text-shadow: 6upx 6upx 8upx rgba(199, 50, 134, 0.2);
+}
+
+.text-shadow[class*="-brown"] {
+	text-shadow: 6upx 6upx 8upx rgba(140, 88, 53, 0.2);
+}
+
+.text-shadow[class*="-grey"] {
+	text-shadow: 6upx 6upx 8upx rgba(114, 130, 138, 0.2);
+}
+
+.text-shadow[class*="-gray"] {
+	text-shadow: 6upx 6upx 8upx rgba(114, 130, 138, 0.2);
+}
+
+.text-shadow[class*="-black"] {
+	text-shadow: 6upx 6upx 8upx rgba(26, 26, 26, 0.2);
+}
+
+.bg-img {
+	background-size: cover;
+	background-position: center;
+	background-repeat: no-repeat;
+}
+
+.bg-mask {
+	background-color: #333333;
+	position: relative;
+}
+
+.bg-mask::after {
+	content: "";
+	border-radius: inherit;
+	width: 100%;
+	height: 100%;
+	display: block;
+	background-color: rgba(0, 0, 0, 0.4);
+	position: absolute;
+	left: 0;
+	right: 0;
+	bottom: 0;
+	top: 0;
+}
+
+.bg-mask view,
+.bg-mask cover-view {
+	z-index: 5;
+	position: relative;
+}
+
+.bg-video {
+	position: relative;
+}
+
+.bg-video video {
+	display: block;
+	height: 100%;
+	width: 100%;
+	-o-object-fit: cover;
+	object-fit: cover;
+	position: absolute;
+	top: 0;
+	z-index: 0;
+	pointer-events: none;
+}
+
+/* ==================
+          文本
+ ==================== */
+
+.text-xs {
+	font-size: 20upx;
+}
+
+.text-sm {
+	font-size: 24upx;
+}
+
+.text-df {
+	font-size: 28upx;
+}
+
+.text-lg {
+	font-size: 32upx;
+}
+
+.text-xl {
+	font-size: 36upx;
+}
+
+.text-xxl {
+	font-size: 44upx;
+}
+
+.text-sl {
+	font-size: 80upx;
+}
+
+.text-xsl {
+	font-size: 120upx;
+}
+
+.text-Abc {
+	text-transform: Capitalize;
+}
+
+.text-ABC {
+	text-transform: Uppercase;
+}
+
+.text-abc {
+	text-transform: Lowercase;
+}
+
+.text-price::before {
+	content: "¥";
+	font-size: 80%;
+	margin-right: 4upx;
+}
+
+.text-cut {
+	text-overflow: ellipsis;
+	white-space: nowrap;
+	overflow: hidden;
+}
+
+.text-bold {
+	font-weight: bold;
+}
+
+.text-center {
+	text-align: center;
+}
+
+.text-content {
+	line-height: 1.6;
+}
+
+.text-left {
+	text-align: left;
+}
+
+.text-right {
+	text-align: right;
+}
+
+.text-red,
+.line-red,
+.lines-red {
+	color: #e54d42;
+}
+
+.text-orange,
+.line-orange,
+.lines-orange {
+	color: #f37b1d;
+}
+
+.text-yellow,
+.line-yellow,
+.lines-yellow {
+	color: #fbbd08;
+}
+
+.text-olive,
+.line-olive,
+.lines-olive {
+	color: #8dc63f;
+}
+
+.text-green,
+.line-green,
+.lines-green {
+	color: #39b54a;
+}
+
+.text-cyan,
+.line-cyan,
+.lines-cyan {
+	color: #1cbbb4;
+}
+
+.text-blue,
+.line-blue,
+.lines-blue {
+	color: #0081ff;
+}
+
+.text-purple,
+.line-purple,
+.lines-purple {
+	color: #6739b6;
+}
+
+.text-mauve,
+.line-mauve,
+.lines-mauve {
+	color: #9c26b0;
+}
+
+.text-pink,
+.line-pink,
+.lines-pink {
+	color: #e03997;
+}
+
+.text-brown,
+.line-brown,
+.lines-brown {
+	color: #a5673f;
+}
+
+.text-grey,
+.line-grey,
+.lines-grey {
+	color: #8799a3;
+}
+
+.text-gray,
+.line-gray,
+.lines-gray {
+	color: #aaaaaa;
+}
+
+.text-black,
+.line-black,
+.lines-black {
+	color: #333333;
+}
+
+.text-white,
+.line-white,
+.lines-white {
+	color: #ffffff;
+}

+ 87 - 0
uni_merchants_enter/common/helper.js

@@ -0,0 +1,87 @@
+import * as config from '../config'
+const ossUploadUrl = 'https://taohaoliang.oss-cn-beijing.aliyuncs.com/';
+
+const contactCustomerService = (item) => {
+	console.log(item)
+	if (!item) {
+		item = '110'
+	}
+	console.log("联系客服")
+	uni.makePhoneCall({
+		phoneNumber: item,
+		success: (res) => {
+			console.log('调用成功!')
+		},
+		// 失败回调
+		fail: (res) => {
+			console.log('调用失败!')
+			contactCustomerService(item)
+		}
+	});
+}
+
+const logout = () => {
+	uni.removeStorage({
+		key: 'userInfo'
+	})
+}
+const formatLocation = (str) => {
+	let area = {}
+	let index11 = 0
+	let index1 = str.indexOf("省")
+	if (index1 == -1) {
+		index11 = str.indexOf("自治区")
+		if (index11 != -1) {
+			area.Province = str.substring(0, index11 + 3)
+		} else {
+			area.Province = str.substring(0, 0)
+		}
+	} else {
+		area.Province = str.substring(0, index1 + 1)
+	}
+
+	let index2 = str.indexOf("市")
+	if (index11 == -1) {
+		area.City = str.substring(index11 + 1, index2 + 1)
+	} else {
+		if (index11 == 0) {
+			area.City = str.substring(index1 + 1, index2 + 1)
+		} else {
+			area.City = str.substring(index11 + 3, index2 + 1)
+		}
+	}
+
+	let index3 = str.indexOf("区")
+	if (index3 == -1) {
+		index3 = str.indexOf("县")
+		if (index3 == -1) {
+			index3 = str.lastIndexOf("市")
+			if (index3 == -1) {
+				index3 = str.indexOf("镇")
+				if (index3 == -1) {
+
+				} else {
+					area.Country = str.substring(index2 + 1, index3 + 1)
+
+				}
+			} else {
+				area.Country = str.substring(index2 + 1, index3 + 1)
+			}
+		} else {
+			area.Country = str.substring(index2 + 1, index3 + 1)
+		}
+
+	} else {
+		area.Country = str.substring(index2 + 1, index3 + 1)
+	}
+	area.Village = str.substring(index3 + 1, str.length)
+	return area;
+}
+
+
+
+export default {
+logout,
+contactCustomerService,
+formatLocation
+}

+ 143 - 0
uni_merchants_enter/components/ossutil/base64.js

@@ -0,0 +1,143 @@
+
+var base64EncodeChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+var base64DecodeChars = new Array(
+    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+    -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
+    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
+    -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+    15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
+    -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
+    41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);
+function encode(str) {
+    var out, i, len;
+    var c1, c2, c3;
+    len = str.length;
+    i = 0;
+    out = "";
+    while (i < len) {
+        c1 = str.charCodeAt(i++) & 0xff;
+        if (i == len) {
+            out += base64EncodeChars.charAt(c1 >> 2);
+            out += base64EncodeChars.charAt((c1 & 0x3) << 4);
+            out += "==";
+            break;
+        }
+        c2 = str.charCodeAt(i++);
+        if (i == len) {
+            out += base64EncodeChars.charAt(c1 >> 2);
+            out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
+            out += base64EncodeChars.charAt((c2 & 0xF) << 2);
+            out += "=";
+            break;
+        }
+        c3 = str.charCodeAt(i++);
+        out += base64EncodeChars.charAt(c1 >> 2);
+        out += base64EncodeChars.charAt(((c1 & 0x3) << 4) | ((c2 & 0xF0) >> 4));
+        out += base64EncodeChars.charAt(((c2 & 0xF) << 2) | ((c3 & 0xC0) >> 6));
+        out += base64EncodeChars.charAt(c3 & 0x3F);
+    }
+    return out;
+}
+function decode(str) {
+    var c1, c2, c3, c4;
+    var i, len, out;
+    len = str.length;
+    i = 0;
+    out = "";
+    while (i < len) {
+        /* c1 */
+        do {
+            c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
+        } while (i < len && c1 == -1);
+        if (c1 == -1)
+            break;
+        /* c2 */
+        do {
+            c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
+        } while (i < len && c2 == -1);
+        if (c2 == -1)
+            break;
+        out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));
+        /* c3 */
+        do {
+            c3 = str.charCodeAt(i++) & 0xff;
+            if (c3 == 61)
+                return out;
+            c3 = base64DecodeChars[c3];
+        } while (i < len && c3 == -1);
+        if (c3 == -1)
+            break;
+        out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));
+        /* c4 */
+        do {
+            c4 = str.charCodeAt(i++) & 0xff;
+            if (c4 == 61)
+                return out;
+            c4 = base64DecodeChars[c4];
+        } while (i < len && c4 == -1);
+        if (c4 == -1)
+            break;
+        out += String.fromCharCode(((c3 & 0x03) << 6) | c4);
+    }
+    return out;
+}
+
+
+function utf16to8(str) {
+    var out, i, len, c;
+    out = "";
+    len = str.length;
+    for (i = 0; i < len; i++) {
+        c = str.charCodeAt(i);
+        if ((c >= 0x0001) && (c <= 0x007F)) {
+            out += str.charAt(i);
+        } else if (c > 0x07FF) {
+            out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
+            out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F));
+            out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
+        } else {
+            out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F));
+            out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
+        }
+    }
+    return out;
+}
+function utf8to16(str) {
+    var out, i, len, c;
+    var char2, char3;
+    out = "";
+    len = str.length;
+    i = 0;
+    while (i < len) {
+        c = str.charCodeAt(i++);
+        switch (c >> 4) {
+            case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
+                // 0xxxxxxx
+                out += str.charAt(i - 1);
+                break;
+            case 12: case 13:
+                // 110x xxxx 10xx xxxx
+                char2 = str.charCodeAt(i++);
+                out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
+                break;
+            case 14:
+                // 1110 xxxx 10xx xxxx 10xx xxxx
+                char2 = str.charCodeAt(i++);
+                char3 = str.charCodeAt(i++);
+                out += String.fromCharCode(((c & 0x0F) << 12) |
+                    ((char2 & 0x3F) << 6) |
+                    ((char3 & 0x3F) << 0));
+                break;
+        }
+    }
+    return out;
+}
+
+
+module.exports = {
+    encode: encode,
+    decode: decode,
+    utf16to8: utf16to8,
+    utf8to16: utf8to16
+}

+ 9 - 0
uni_merchants_enter/components/ossutil/config.js

@@ -0,0 +1,9 @@
+var fileHost = 'https://taohaoliang.oss-cn-beijing.aliyuncs.com';//你的阿里云地址最后面跟上一个/   在你当前小程序的后台的uploadFile 合法域名也要配上这个域名
+var config = {
+   //aliyun OSS config
+  uploadImageUrl: `${fileHost}`, // 默认存在根目录,可根据需求改
+  AccessKeySecret: 'FpClTp4OVrRRtHEfi3lBOWUoLxKieW',        // AccessKeySecret 去你的阿里云上控制台上找
+  OSSAccessKeyId: 'LTAI4G9c14PgKvM23WZ9zrpc',         // AccessKeyId 去你的阿里云上控制台上找
+   timeout: 87600 //这个是上传文件时Policy的失效时间
+};
+module.exports = config

+ 178 - 0
uni_merchants_enter/components/ossutil/crypto.js

@@ -0,0 +1,178 @@
+const Crypto = {};
+
+(function(){
+
+var base64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+
+// Crypto utilities
+var util = Crypto.util = {
+
+	// Bit-wise rotate left
+	rotl: function (n, b) {
+		return (n << b) | (n >>> (32 - b));
+	},
+
+	// Bit-wise rotate right
+	rotr: function (n, b) {
+		return (n << (32 - b)) | (n >>> b);
+	},
+
+	// Swap big-endian to little-endian and vice versa
+	endian: function (n) {
+
+		// If number given, swap endian
+		if (n.constructor == Number) {
+			return util.rotl(n,  8) & 0x00FF00FF |
+			       util.rotl(n, 24) & 0xFF00FF00;
+		}
+
+		// Else, assume array and swap all items
+		for (var i = 0; i < n.length; i++)
+			n[i] = util.endian(n[i]);
+		return n;
+
+	},
+
+	// Generate an array of any length of random bytes
+	randomBytes: function (n) {
+		for (var bytes = []; n > 0; n--)
+			bytes.push(Math.floor(Math.random() * 256));
+		return bytes;
+	},
+
+	// Convert a string to a byte array
+	stringToBytes: function (str) {
+		var bytes = [];
+		for (var i = 0; i < str.length; i++)
+			bytes.push(str.charCodeAt(i));
+		return bytes;
+	},
+
+	// Convert a byte array to a string
+	bytesToString: function (bytes) {
+		var str = [];
+		for (var i = 0; i < bytes.length; i++)
+			str.push(String.fromCharCode(bytes[i]));
+		return str.join("");
+	},
+
+	// Convert a string to big-endian 32-bit words
+	stringToWords: function (str) {
+		var words = [];
+		for (var c = 0, b = 0; c < str.length; c++, b += 8)
+			words[b >>> 5] |= str.charCodeAt(c) << (24 - b % 32);
+		return words;
+	},
+
+	// Convert a byte array to big-endian 32-bits words
+	bytesToWords: function (bytes) {
+		var words = [];
+		for (var i = 0, b = 0; i < bytes.length; i++, b += 8)
+			words[b >>> 5] |= bytes[i] << (24 - b % 32);
+		return words;
+	},
+
+	// Convert big-endian 32-bit words to a byte array
+	wordsToBytes: function (words) {
+		var bytes = [];
+		for (var b = 0; b < words.length * 32; b += 8)
+			bytes.push((words[b >>> 5] >>> (24 - b % 32)) & 0xFF);
+		return bytes;
+	},
+
+	// Convert a byte array to a hex string
+	bytesToHex: function (bytes) {
+		var hex = [];
+		for (var i = 0; i < bytes.length; i++) {
+			hex.push((bytes[i] >>> 4).toString(16));
+			hex.push((bytes[i] & 0xF).toString(16));
+		}
+		return hex.join("");
+	},
+
+	// Convert a hex string to a byte array
+	hexToBytes: function (hex) {
+		var bytes = [];
+		for (var c = 0; c < hex.length; c += 2)
+			bytes.push(parseInt(hex.substr(c, 2), 16));
+		return bytes;
+	},
+
+	// Convert a byte array to a base-64 string
+	bytesToBase64: function (bytes) {
+
+		// Use browser-native function if it exists
+		// if (typeof btoa == "function") return btoa(util.bytesToString(bytes));
+
+		var base64 = [],
+		    overflow;
+
+		for (var i = 0; i < bytes.length; i++) {
+			switch (i % 3) {
+				case 0:
+					base64.push(base64map.charAt(bytes[i] >>> 2));
+					overflow = (bytes[i] & 0x3) << 4;
+					break;
+				case 1:
+					base64.push(base64map.charAt(overflow | (bytes[i] >>> 4)));
+					overflow = (bytes[i] & 0xF) << 2;
+					break;
+				case 2:
+					base64.push(base64map.charAt(overflow | (bytes[i] >>> 6)));
+					base64.push(base64map.charAt(bytes[i] & 0x3F));
+					overflow = -1;
+			}
+		}
+
+		// Encode overflow bits, if there are any
+		if (overflow != undefined && overflow != -1)
+			base64.push(base64map.charAt(overflow));
+
+		// Add padding
+		while (base64.length % 4 != 0) base64.push("=");
+
+		return base64.join("");
+
+	},
+
+	// Convert a base-64 string to a byte array
+	base64ToBytes: function (base64) {
+
+		// Use browser-native function if it exists
+		if (typeof atob == "function") return util.stringToBytes(atob(base64));
+
+		// Remove non-base-64 characters
+		base64 = base64.replace(/[^A-Z0-9+\/]/ig, "");
+
+		var bytes = [];
+
+		for (var i = 0; i < base64.length; i++) {
+			switch (i % 4) {
+				case 1:
+					bytes.push((base64map.indexOf(base64.charAt(i - 1)) << 2) |
+					           (base64map.indexOf(base64.charAt(i)) >>> 4));
+					break;
+				case 2:
+					bytes.push(((base64map.indexOf(base64.charAt(i - 1)) & 0xF) << 4) |
+					           (base64map.indexOf(base64.charAt(i)) >>> 2));
+					break;
+				case 3:
+					bytes.push(((base64map.indexOf(base64.charAt(i - 1)) & 0x3) << 6) |
+					           (base64map.indexOf(base64.charAt(i))));
+					break;
+			}
+		}
+
+		return bytes;
+
+	}
+
+};
+
+// Crypto mode namespace
+Crypto.mode = {};
+
+})();
+
+module.exports = Crypto;

+ 34 - 0
uni_merchants_enter/components/ossutil/hmac.js

@@ -0,0 +1,34 @@
+const Crypto = require('./crypto.js');
+
+(function(){
+
+// Shortcut
+var util = Crypto.util;
+
+Crypto.HMAC = function (hasher, message, key, options) {
+
+	// Allow arbitrary length keys
+	key = key.length > hasher._blocksize * 4 ?
+	      hasher(key, { asBytes: true }) :
+	      util.stringToBytes(key);
+
+	// XOR keys with pad constants
+	var okey = key,
+	    ikey = key.slice(0);
+	for (var i = 0; i < hasher._blocksize * 4; i++) {
+		okey[i] ^= 0x5C;
+		ikey[i] ^= 0x36;
+	}
+
+	var hmacbytes = hasher(util.bytesToString(okey) +
+	                       hasher(util.bytesToString(ikey) + message, { asString: true }),
+	                       { asBytes: true });
+	return options && options.asBytes ? hmacbytes :
+	       options && options.asString ? util.bytesToString(hmacbytes) :
+	       util.bytesToHex(hmacbytes);
+
+};
+
+})();
+
+module.exports = Crypto;

+ 79 - 0
uni_merchants_enter/components/ossutil/sha1.js

@@ -0,0 +1,79 @@
+const Crypto = require('./crypto.js');
+
+(function(){
+
+// Shortcut
+var util = Crypto.util;
+
+// Public API
+var SHA1 = Crypto.SHA1 = function (message, options) {
+	var digestbytes = util.wordsToBytes(SHA1._sha1(message));
+	return options && options.asBytes ? digestbytes :
+	       options && options.asString ? util.bytesToString(digestbytes) :
+	       util.bytesToHex(digestbytes);
+};
+
+// The core
+SHA1._sha1 = function (message) {
+
+	var m  = util.stringToWords(message),
+	    l  = message.length * 8,
+	    w  =  [],
+	    H0 =  1732584193,
+	    H1 = -271733879,
+	    H2 = -1732584194,
+	    H3 =  271733878,
+	    H4 = -1009589776;
+
+	// Padding
+	m[l >> 5] |= 0x80 << (24 - l % 32);
+	m[((l + 64 >>> 9) << 4) + 15] = l;
+
+	for (var i = 0; i < m.length; i += 16) {
+
+		var a = H0,
+		    b = H1,
+		    c = H2,
+		    d = H3,
+		    e = H4;
+
+		for (var j = 0; j < 80; j++) {
+
+			if (j < 16) w[j] = m[i + j];
+			else {
+				var n = w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16];
+				w[j] = (n << 1) | (n >>> 31);
+			}
+
+			var t = ((H0 << 5) | (H0 >>> 27)) + H4 + (w[j] >>> 0) + (
+			         j < 20 ? (H1 & H2 | ~H1 & H3) + 1518500249 :
+			         j < 40 ? (H1 ^ H2 ^ H3) + 1859775393 :
+			         j < 60 ? (H1 & H2 | H1 & H3 | H2 & H3) - 1894007588 :
+			                  (H1 ^ H2 ^ H3) - 899497514);
+
+			H4 =  H3;
+			H3 =  H2;
+			H2 = (H1 << 30) | (H1 >>> 2);
+			H1 =  H0;
+			H0 =  t;
+
+		}
+
+		H0 += a;
+		H1 += b;
+		H2 += c;
+		H3 += d;
+		H4 += e;
+
+	}
+
+	return [H0, H1, H2, H3, H4];
+
+};
+
+// Package private blocksize
+SHA1._blocksize = 16;
+
+})();
+
+module.exports = Crypto;

+ 394 - 0
uni_merchants_enter/components/ossutil/signature.js

@@ -0,0 +1,394 @@
+class Handwriting {
+  // 内置数据
+  ctx = '';
+  canvasWidth = 300;
+  canvasHeight = 900;
+  linePrack = []; //划线轨迹 ; 生成线条的实际点
+  currentLine = [];
+  transparent = 1; // 透明度
+  pressure = 0.5; // 默认压力
+  smoothness = 100; //顺滑度,用60的距离来计算速度
+  lineSize = 1.5; // 笔记倍数
+  lineMin = 0.5; // 最小笔画半径
+  lineMax = 2; // 最大笔画半径
+  currentPoint = {};
+  firstTouch = true; // 第一次触发
+  radius = 1; //画圆的半径
+  cutArea = {
+    top: 0,
+    right: 0,
+    bottom: 0,
+    left: 0
+  }; //裁剪区域
+  lastPoint = 0;
+  chirography = []; //笔迹
+  startY = 0;
+  deltaY = 0;
+  startValue = 0;
+  constructor(opts) {
+    this.lineColor = opts.lineColor || '#1A1A1A' // 颜色
+    this.slideValue = opts.slideValue || 50
+		this.canvasName = opts.canvasName || 'handWriting'
+    this.init()
+  }
+  init() {
+    this.ctx = uni.createCanvasContext(this.canvasName)
+    var query = uni.createSelectorQuery();
+    query.select('.handCenter').boundingClientRect(rect => {
+      console.log(rect)
+	  if(rect){
+		 this.canvasWidth = rect.width;
+		 this.canvasHeight = rect.height; 
+	  }
+      
+    }).exec();
+    this.selectSlideValue(this.slideValue);
+  }
+
+  // 笔迹开始
+  uploadScaleStart(event) {
+		let e = event.mp
+    if (e.type != 'touchstart') return false;
+    this.ctx.setFillStyle(this.lineColor); // 初始线条设置颜色
+    this.ctx.setGlobalAlpha(this.transparent); // 设置半透明
+    this.currentPoint = {
+      x: e.touches[0].x,
+      y: e.touches[0].y
+    }
+    this.currentLine.unshift({
+      time: new Date().getTime(),
+      dis: 0,
+      x: this.currentPoint.x,
+      y: this.currentPoint.y
+    })
+    if (this.firstTouch) {
+      this.cutArea = {
+        top: this.currentPoint.y,
+        right: this.currentPoint.x,
+        bottom: this.currentPoint.y,
+        left: this.currentPoint.x
+      }
+      this.firstTouch = false
+    }
+    this.pointToLine(this.currentLine);
+  }
+  // 笔迹移动
+  uploadScaleMove(event) {
+		let e = event.mp
+    if (e.type != 'touchmove') return false;
+    if (e.cancelable) {
+      // 判断默认行为是否已经被禁用
+      if (!e.defaultPrevented) {
+        e.preventDefault();
+      }
+    }
+    let point = {
+      x: e.touches[0].x,
+      y: e.touches[0].y
+    }
+    //测试裁剪
+    if (point.y < this.cutArea.top) {
+      this.cutArea.top = point.y;
+    }
+    if (point.y < 0) this.cutArea.top = 0;
+
+    if (point.x > this.cutArea.right) {
+      this.cutArea.right = point.x;
+    }
+    if (this.canvasWidth - point.x <= 0) {
+      this.cutArea.right = this.canvasWidth;
+    }
+    if (point.y > this.cutArea.bottom) {
+      this.cutArea.bottom = point.y;
+    }
+    if (this.canvasHeight - point.y <= 0) {
+      this.cutArea.bottom = this.canvasHeight;
+    }
+    if (point.x < this.cutArea.left) {
+      this.cutArea.left = point.x;
+    }
+    if (point.x < 0) this.cutArea.left = 0;
+
+    this.lastPoint = this.currentPoint;
+    this.currentPoint = point
+    this.currentLine.unshift({
+      time: new Date().getTime(),
+      dis: this.distance(this.currentPoint, this.lastPoint, 'move'),
+      x: point.x,
+      y: point.y
+    })
+    this.pointToLine(this.currentLine);
+  }
+  // 笔迹结束
+  uploadScaleEnd(event) {
+		let e = event.mp
+    if (e.type != 'touchend') return 0;
+    let point = {
+      x: e.changedTouches[0].x,
+      y: e.changedTouches[0].y
+    }
+		
+    this.lastPoint = this.currentPoint;
+    this.currentPoint = point
+    this.currentLine.unshift({
+      time: new Date().getTime(),
+      dis: this.distance(this.currentPoint, this.lastPoint, 'end'),
+      x: point.x,
+      y: point.y
+    })
+    if (this.currentLine.length > 2) {
+      var info = (this.currentLine[0].time - this.currentLine[this.currentLine.length - 1].time) / this.currentLine.length;
+      //$("#info").text(info.toFixed(2));
+    }
+    //一笔结束,保存笔迹的坐标点,清空,当前笔迹
+    //增加判断是否在手写区域;
+    this.pointToLine(this.currentLine);
+    var currentChirography = {
+      lineSize: this.lineSize,
+      lineColor: this.lineColor
+    };
+    this.chirography.unshift(currentChirography);
+    this.linePrack.unshift(this.currentLine);
+    this.currentLine = []
+  }
+  retDraw() {
+    this.ctx.clearRect(0, 0, 700, 730)
+    this.ctx.draw()
+  }
+
+  //画两点之间的线条;参数为:line,会绘制最近的开始的两个点;
+  pointToLine(line) {
+    this.calcBethelLine(line);
+    // this.calcBethelLine1(line);
+    return;
+  }
+  //计算插值的方式;
+  calcBethelLine(line) {
+    if (line.length <= 1) {
+      line[0].r = this.radius;
+      return;
+    }
+    let x0, x1, x2, y0, y1, y2, r0, r1, r2, len, lastRadius, dis = 0,
+      time = 0,
+      curveValue = 0.5;
+    if (line.length <= 2) {
+      x0 = line[1].x
+      y0 = line[1].y
+      x2 = line[1].x + (line[0].x - line[1].x) * curveValue;
+      y2 = line[1].y + (line[0].y - line[1].y) * curveValue;
+      //x2 = line[1].x;
+      //y2 = line[1].y;
+      x1 = x0 + (x2 - x0) * curveValue;
+      y1 = y0 + (y2 - y0) * curveValue;;
+
+    } else {
+      x0 = line[2].x + (line[1].x - line[2].x) * curveValue;
+      y0 = line[2].y + (line[1].y - line[2].y) * curveValue;
+      x1 = line[1].x;
+      y1 = line[1].y;
+      x2 = x1 + (line[0].x - x1) * curveValue;
+      y2 = y1 + (line[0].y - y1) * curveValue;
+    }
+    //从计算公式看,三个点分别是(x0,y0),(x1,y1),(x2,y2) ;(x1,y1)这个是控制点,控制点不会落在曲线上;实际上,这个点还会手写获取的实际点,却落在曲线上
+    len = this.distance({
+      x: x2,
+      y: y2
+    }, {
+      x: x0,
+      y: y0
+    }, 'calc');
+    lastRadius = this.radius;
+    for (let n = 0; n < line.length - 1; n++) {
+      dis += line[n].dis;
+      time += line[n].time - line[n + 1].time;
+      if (dis > this.smoothness) break;
+    }
+    this.radius = Math.min(time / len * this.pressure + this.lineMin, this.lineMax) * this.lineSize
+    line[0].r = this.radius;
+    //计算笔迹半径;
+    if (line.length <= 2) {
+      r0 = (lastRadius + this.radius) / 2;
+      r1 = r0;
+      r2 = r1;
+      //return;
+    } else {
+      r0 = (line[2].r + line[1].r) / 2;
+      r1 = line[1].r;
+      r2 = (line[1].r + line[0].r) / 2;
+    }
+    let n = 5;
+    let point = [];
+    for (let i = 0; i < n; i++) {
+      let t = i / (n - 1);
+      let x = (1 - t) * (1 - t) * x0 + 2 * t * (1 - t) * x1 + t * t * x2;
+      let y = (1 - t) * (1 - t) * y0 + 2 * t * (1 - t) * y1 + t * t * y2;
+      let r = lastRadius + (this.radius - lastRadius) / n * i;
+      point.push({
+        x: x,
+        y: y,
+        r: r
+      });
+      if (point.length == 3) {
+        let a = this.ctaCalc(point[0].x, point[0].y, point[0].r, point[1].x, point[1].y, point[1].r, point[2].x, point[2].y, point[2].r);
+        a[0].color = this.lineColor;
+        this.bethelDraw(a, 1);
+        point = [{
+          x: x,
+          y: y,
+          r: r
+        }];
+      }
+    }
+  }
+  //求两点之间距离
+  distance(a, b, type) {
+    let x = b.x - a.x;
+    let y = b.y - a.y;
+    return Math.sqrt(x * x + y * y) * 5;
+  }
+  ctaCalc(x0, y0, r0, x1, y1, r1, x2, y2, r2) {
+    let a = [],
+      vx01, vy01, norm, n_x0, n_y0, vx21, vy21, n_x2, n_y2;
+    vx01 = x1 - x0;
+    vy01 = y1 - y0;
+    norm = Math.sqrt(vx01 * vx01 + vy01 * vy01 + 0.0001) * 2;
+    vx01 = vx01 / norm * r0;
+    vy01 = vy01 / norm * r0;
+    n_x0 = vy01;
+    n_y0 = -vx01;
+    vx21 = x1 - x2;
+    vy21 = y1 - y2;
+    norm = Math.sqrt(vx21 * vx21 + vy21 * vy21 + 0.0001) * 2;
+    vx21 = vx21 / norm * r2;
+    vy21 = vy21 / norm * r2;
+    n_x2 = -vy21;
+    n_y2 = vx21;
+    a.push({
+      mx: x0 + n_x0,
+      my: y0 + n_y0,
+      color: "#1A1A1A"
+    });
+    a.push({
+      c1x: x1 + n_x0,
+      c1y: y1 + n_y0,
+      c2x: x1 + n_x2,
+      c2y: y1 + n_y2,
+      ex: x2 + n_x2,
+      ey: y2 + n_y2
+    });
+    a.push({
+      c1x: x2 + n_x2 - vx21,
+      c1y: y2 + n_y2 - vy21,
+      c2x: x2 - n_x2 - vx21,
+      c2y: y2 - n_y2 - vy21,
+      ex: x2 - n_x2,
+      ey: y2 - n_y2
+    });
+    a.push({
+      c1x: x1 - n_x2,
+      c1y: y1 - n_y2,
+      c2x: x1 - n_x0,
+      c2y: y1 - n_y0,
+      ex: x0 - n_x0,
+      ey: y0 - n_y0
+    });
+    a.push({
+      c1x: x0 - n_x0 - vx01,
+      c1y: y0 - n_y0 - vy01,
+      c2x: x0 + n_x0 - vx01,
+      c2y: y0 + n_y0 - vy01,
+      ex: x0 + n_x0,
+      ey: y0 + n_y0
+    });
+    a[0].mx = a[0].mx.toFixed(1);
+    a[0].mx = parseFloat(a[0].mx);
+    a[0].my = a[0].my.toFixed(1);
+    a[0].my = parseFloat(a[0].my);
+    for (let i = 1; i < a.length; i++) {
+      a[i].c1x = a[i].c1x.toFixed(1);
+      a[i].c1x = parseFloat(a[i].c1x);
+      a[i].c1y = a[i].c1y.toFixed(1);
+      a[i].c1y = parseFloat(a[i].c1y);
+      a[i].c2x = a[i].c2x.toFixed(1);
+      a[i].c2x = parseFloat(a[i].c2x);
+      a[i].c2y = a[i].c2y.toFixed(1);
+      a[i].c2y = parseFloat(a[i].c2y);
+      a[i].ex = a[i].ex.toFixed(1);
+      a[i].ex = parseFloat(a[i].ex);
+      a[i].ey = a[i].ey.toFixed(1);
+      a[i].ey = parseFloat(a[i].ey);
+    }
+    return a;
+  }
+  bethelDraw(point, is_fill, color) {
+    this.ctx.beginPath();
+    this.ctx.moveTo(point[0].mx, point[0].my);
+    if (undefined != color) {
+      this.ctx.setFillStyle(color);
+      this.ctx.setStrokeStyle(color);
+    } else {
+      this.ctx.setFillStyle(point[0].color);
+      this.ctx.setStrokeStyle(point[0].color);
+    }
+    for (let i = 1; i < point.length; i++) {
+      this.ctx.bezierCurveTo(point[i].c1x, point[i].c1y, point[i].c2x, point[i].c2y, point[i].ex, point[i].ey);
+    }
+    this.ctx.stroke();
+    if (undefined != is_fill) {
+      this.ctx.fill(); //填充图形 ( 后绘制的图形会覆盖前面的图形, 绘制时注意先后顺序 )
+    }
+    this.ctx.draw(true)
+  }
+
+  selectColorEvent(lineColor) {
+    this.lineColor = lineColor;
+  }
+
+  selectSlideValue(slideValue) {
+    switch (slideValue) {
+      case 0:
+        this.lineSize = 0.1;
+        this.lineMin = 0.1;
+        this.lineMax = 0.1;
+        break;
+      case 25:
+        this.lineSize = 1;
+        this.lineMin = 0.5;
+        this.lineMax = 2;
+        break;
+      case 50:
+        this.lineSize = 1.5;
+        this.lineMin = 1;
+        this.lineMax = 3;
+        break;
+      case 75:
+        this.lineSize = 1.5;
+        this.lineMin = 2;
+        this.lineMax = 3.5;
+        break;
+      case 100:
+        this.lineSize = 3;
+        this.lineMin = 2;
+        this.lineMax = 3.5;
+        break;
+    }
+  }
+	
+	saveCanvas(){
+		 return new Promise((resolve,rej) => {
+			uni.canvasToTempFilePath({
+				canvasId: this.canvasName,
+				success: function(res) {
+					console.log(res.tempFilePath)
+					resolve(res.tempFilePath);
+				},
+				 fail:function(err){
+					 console.log('图片生成失败:'+err)
+					 rej(err);
+				 }
+			})
+		})	
+	}	
+}
+
+export default Handwriting;

+ 85 - 0
uni_merchants_enter/components/ossutil/uploadFile.js

@@ -0,0 +1,85 @@
+const env = require('./config.js'); //配置文件,在这文件里配置你的OSS keyId和KeySecret,timeout:87600;
+
+const base64 = require('./base64.js');//Base64,hmac,sha1,crypto相关算法
+require('./hmac.js');
+require('./sha1.js');
+const Crypto = require('./crypto.js');
+
+/*
+ *上传文件到阿里云oss
+ *@param - filePath :图片的本地资源路径
+ *@param - dir:表示要传到哪个目录下
+ *@param - successc:成功回调
+ *@param - failc:失败回调
+ */ 
+const uploadFile = function (filePath, dir, successc, failc) {
+  if (!filePath || filePath.length < 9) {
+    uni.showModal({
+      title: '图片错误',
+      content: '请重试',
+      showCancel: false,
+    })
+    return;
+  }
+  //图片名字 可以自行定义,     这里是采用当前的时间戳 + 150内的随机数来给图片命名的
+  const aliyunFileKey = dir + new Date().getTime() + Math.floor(Math.random() * 150) + '.png';
+  
+  const aliyunServerURL = env.uploadImageUrl;//OSS地址,需要https
+  const accessid = env.OSSAccessKeyId;
+  const policyBase64 = getPolicyBase64();
+  const signature = getSignature(policyBase64);//获取签名
+ 
+  uni.uploadFile({
+    url: aliyunServerURL,//开发者服务器 url
+    filePath: filePath,//要上传文件资源的路径
+    name: 'file',//必须填file
+    formData: {
+      'key': aliyunFileKey,
+      'policy': policyBase64,
+      'OSSAccessKeyId': accessid,
+      'signature': signature,
+      'success_action_status': '200',
+    },
+    success: function (res) {
+			console.log(res);
+      if (res.statusCode != 200) {
+        failc(new Error('上传错误:' + JSON.stringify(res)))
+        return;
+      }
+       successc(aliyunServerURL+"/"+aliyunFileKey);
+    },
+    fail: function (err) {
+      err.wxaddinfo = aliyunServerURL;
+      failc(err);
+    },
+  })
+}
+
+const getPolicyBase64 = function () {
+  let date = new Date();
+  date.setHours(date.getHours() + env.timeout);
+  let srcT = date.toISOString();
+  const policyText = {
+    "expiration": srcT, //设置该Policy的失效时间,超过这个失效时间之后,就没有办法通过这个policy上传文件了 
+    "conditions": [
+      ["content-length-range", 0, 5 * 1024 * 1024] // 设置上传文件的大小限制,5mb
+    ]
+  };
+
+  const policyBase64 = base64.encode(JSON.stringify(policyText));
+	console.log(policyBase64);
+  return policyBase64;
+}
+
+const getSignature = function (policyBase64) {
+  const accesskey = env.AccessKeySecret;
+
+  const bytes = Crypto.HMAC(Crypto.SHA1, policyBase64, accesskey, {
+    asBytes: true
+  });
+  const signature = Crypto.util.bytesToBase64(bytes);
+console.log(signature);
+  return signature;
+}
+
+module.exports = uploadFile;

+ 138 - 0
uni_merchants_enter/components/text-over-flow/text-over-flow.vue

@@ -0,0 +1,138 @@
+<template>
+  <view>
+    <view style="position: relative" v-if="isHide">
+      <view class="dt-content" :style="'-webkit-line-clamp:'+line">
+        <text class="content">
+          <slot>{{ dt ? dt : '' }}</slot>
+        </text>
+      </view>
+      <view class="button-show" @tap="isHide = false" v-if="enableButton&&lines>line">
+        <text style="color: #C82229">{{ expandText }}</text>
+      </view>
+    </view>
+    <view v-else>
+      <view>
+        <text class="content">
+          <slot>{{ dt ? dt : '' }}</slot>
+        </text>
+      </view>
+      <view class="fold-hint" v-if="foldHint">
+        <view @tap="isHide = true">
+          {{ foldHint }}
+        </view>
+      </view>
+    </view>
+    <view>
+      <text class="placeholder">
+        {{ placeholder }}
+      </text>
+    </view>
+  </view>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      // 是否隐藏多余行。初始状态不隐藏
+      isHide: true,
+      // 全量所占文本高度
+      textHeight: 0,
+      // 单行文本所占高度
+      lineHeight: 1,
+      // 占位文本
+      placeholder: '占位'
+    };
+  },
+  props: {
+    // 展示多少行
+    line: {
+      type: [Number, String],
+      default: 1
+    },
+    // 文本
+    dt: {
+      type: [String],
+      default: ''
+    },
+    enableButton: {
+      type: Boolean,
+      default: true
+    },
+    // 自定义展开提示
+    expandText: {
+      type: String,
+      default: "展开"
+    },
+    // 自定义收起提示
+    foldHint: {
+      type: String,
+      default: "收起"
+    }
+  },
+
+  watch:{
+    dt(){
+      let that = this
+      setTimeout(() => {
+        let query = uni.createSelectorQuery().in(that);
+        // 获取所有文本在html中的高度
+        query.select('.content').boundingClientRect(data => {
+          that.textHeight = data.height
+        }).exec();
+      }, 100)
+    }
+  },
+
+  mounted() {
+    if (this.enableButton) {
+      let query = uni.createSelectorQuery().in(this);
+      // 获取所有文本在html中的高度
+      query.select('.content').boundingClientRect(data => {
+        this.textHeight = data.height
+      }).exec();
+
+      // 通过占位元素获取单行文本的高度
+      query.select('.placeholder').boundingClientRect(data => {
+        this.lineHeight = data.height
+      }).exec();
+    }
+    // 获取单行文本高度后,置空占位元素,使其释放占位
+    this.placeholder = ''
+  },
+  computed: {
+    // 全文本所占总行数
+    lines() {
+      if (!this.enableButton) {
+        return this.line
+      }
+      return Math.floor(this.textHeight > 0 && this.lineHeight > 0 ? this.textHeight / this.lineHeight : 0)
+    }
+  }
+}
+</script>
+
+<style scoped>
+.dt-content {
+  overflow: hidden;
+  text-overflow: clip;
+  display: -webkit-box;
+  -webkit-box-orient: vertical;
+}
+
+.button-show {
+  width: 70rpx;
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  z-index: 0;
+  text-align: right;
+  background-image: linear-gradient(-180deg, rgba(233, 236, 239, 0) 50%, #FFF 80%);
+  padding-top: 2rem;
+}
+
+.fold-hint {
+  color: #C82229;
+  text-align: right
+}
+</style>

+ 13 - 0
uni_merchants_enter/config/index.js

@@ -0,0 +1,13 @@
+const dev = {
+	// baseUrlNew: 'http://192.168.110.72:8182',
+	baseUrlNew: 'http://192.168.110.138:8182',
+	baseUrlNew: 'http://192.168.110.138:8183',
+	// baseUrlNew: 'http://192.168.110.82:8182',
+	// baseUrlNew: 'https://cardapi.eliangeyun.com',
+	h5Appid: 'wxb66b599f7f61b46f',
+	debug: false
+}
+
+export function def() {
+	return dev
+}

+ 20 - 0
uni_merchants_enter/index.html

@@ -0,0 +1,20 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="UTF-8" />
+    <script>
+      var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
+        CSS.supports('top: constant(a)'))
+      document.write(
+        '<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
+        (coverSupport ? ', viewport-fit=cover' : '') + '" />')
+    </script>
+    <title></title>
+    <!--preload-links-->
+    <!--app-context-->
+  </head>
+  <body>
+    <div id="app"><!--app-html--></div>
+    <script type="module" src="/main.js"></script>
+  </body>
+</html>

+ 141 - 0
uni_merchants_enter/js_sdk/district.js

@@ -0,0 +1,141 @@
+import twData from './taiwan.json'
+import { formatCity } from './filterCity'
+export default {
+	/**
+	 * 按省的城市编码排序
+	 */
+	orderByCityCode(a, b) {
+	  return parseInt(a.value) - parseInt(b.value)
+	},
+	/**
+	 * 自定义app数据格式
+	 * @param {Array} addressList 高德地图api返回的城市数据
+	 * @param {boolean} noFilter 是否过滤省市区
+	 * @param {boolean} allProvice 是否显示全省
+	 * @param {boolean} allCity 是否显示全市
+	 * @param {boolean} allCountry 是否显示全国
+	 */
+	buildAppJSONData({
+		addressList, 
+		noFilter = false,
+		allProvince = false,
+		allCity = false,
+		allCountry = false,
+	}) {
+	  let array = []
+	  get(addressList, array, noFilter)
+		
+		array.forEach(item => {
+		  if (item.value === '710000') {
+		    if (item.children.length === 0) {
+		      item.children = twData
+		    }
+		  }
+		})
+		array.sort(this.orderByCityCode) // 加入台湾区域,并按省份城市代码排序
+		
+		const specialCitys = ['北京', '上海', '天津', '重庆', '香港', '澳门']
+		if (array.length > 0) {
+			array.forEach(item => {
+				if (allCity) {
+					item.children.forEach(city => {
+						city.children.unshift({
+							value: '0', label: '全市', children: []
+						})
+					})
+				}
+				if (allProvince) {
+		      if (specialCitys.indexOf(item.label) === -1) {
+		        item.children.unshift({
+		        	value: '0', label: '全省', children: [
+		        		{value: '0', label: '全省', children: []}
+		        	]
+		        })
+		      }
+				}
+			})
+			if (allCountry) {
+				array.unshift({
+					value: '0', label: '全国', children: [
+						{value: '0', label: '全国', children: [
+							{value: '0', label: '全国', children: []}
+						]}
+					]
+				})
+			}
+		}
+	  return array
+		
+	  function get(districts, children, noFilter) {
+	    districts.forEach((item, index) => {
+	      children.push({
+	        value: noFilter === true ? item.adcode : item.name,
+	        label: noFilter === true ? formatCity(item.name) : item.name
+	      })
+	      if (item.districts.length != 0) {
+	        children[children.length - 1].children = []
+	        if (item.adcode === item.districts[0].adcode) {
+	          children[children.length - 1].children = [
+	            {
+	              value: noFilter === true ? item.adcode : item.name,
+	              label: noFilter === true ? formatCity(item.name) : item.name
+	            }
+	          ]      
+	        } else {
+	          get(item.districts, children[children.length - 1].children, noFilter)
+	        }
+	      } else {
+	        // 特别处理香港,市区统一
+	        if (parseInt(item.adcode) > 810000 && parseInt(item.adcode) < 820000) {
+	          children[children.length - 1].children = [
+	            {
+	             value: noFilter === true ? item.adcode : item.name,
+	             label: noFilter === true ? formatCity(item.name) : item.name
+	            }
+	          ]
+	        }
+	        // 特别处理澳门,市区统一
+	        if (parseInt(item.adcode) > 820000 && parseInt(item.adcode) < 830000) {
+	          children[children.length - 1].children = [
+	            {
+	              value: noFilter === true ? item.adcode : item.name,
+	              label: noFilter === true ? formatCity(item.name) : item.name
+	            }
+	          ]
+	        }
+	        // 特别处理台湾
+	        if (parseInt(item.adcode) === 710000) {
+	          children[children.length - 1].children = []
+	        }
+	      }
+	    })
+	  }
+	},
+	getGaoDeData(key) {
+		if (key) {
+			return new Promise((resolve, reject) => {
+				uni.request({
+					method: 'get',
+					url: `https://restapi.amap.com/v3/config/district?subdistrict=3&key=${key}`,
+					success: res => {
+						if (res.statusCode === 200) {
+							// 构造匹配app,otms框架的城市JSON文件
+							// const data = this.buildAppJSONData(, false, false)
+							resolve(res.data.districts[0].districts)
+						} else {
+							reject(res)
+						}
+					},
+					fail: res => {
+						reject(res)
+					}
+				})
+			})
+		} else {
+			uni.showModal({
+				title: '提示',
+				content: '请输入高德key'
+			})
+		}
+	}
+}

+ 52 - 0
uni_merchants_enter/js_sdk/filterCity.js

@@ -0,0 +1,52 @@
+/**
+ * 过滤城市字段
+ * 去掉省市区自治区等文字,匹配tms的地址库,兼容老数据 
+ */
+
+const cityReg = /省|市|自治区|自治州|自治县|特别行政区|壮族|回族|维吾尔/g
+
+const areaReg = /回族自治县|满族自治县|满族蒙古族自治县|蒙古族自治县|蒙古自治州|朝鲜族自治州|朝鲜族自治县|畲族自治县|土家族自治县|土家族苗族自治州|侗族自治县|苗族侗族自治县|苗族侗族自治州|苗族自治县|瑶族自治县|壮族瑶族自治县|各族自治县|毛南族自治县|仫佬族自治县|黎族自治县|黎族苗族自治县|苗族土家族自治县|土家族苗族自治县|羌族自治县|彝族自治县|彝族自治州|藏族自治县|藏族羌族自治州|仡佬族苗族自治县|布依族苗族自治州|苗族布依族自治县|布依族苗族自治县|布依族苗族自治州|水族自治县|彝族回族苗族自治县|傈僳族自治州|独龙族怒族自治县|白族普米族自治县|哈尼族彝族自治州|苗族瑶族傣族自治县|傣族自治州|彝族傣族自治县|哈尼族彝族傣族自治县|白族自治州|彝族自治县|彝族回族自治县|彝族自治县|彝族自治州|藏族自治州|傈僳族自治县|纳西族自治县|壮族苗族自治州|彝族哈尼族拉祜族自治县|哈尼族彝族自治县|傣族彝族自治县|哈尼族彝族自治县|哈尼族自治县|拉祜族自治县|傣族拉祜族佤族自治县|佤族自治县|傣族佤族自治县|拉祜族佤族布朗族傣族自治县|回族彝族自治县|彝族苗族自治县|傣族景颇族自治州|哈萨克族自治县|裕固族自治县|保安族东乡族撒拉族自治县|回族土族自治县|撒拉族自治县|土族自治县|蒙古族藏族自治州|蒙古族藏族自治州直辖|哈萨克自治县|哈萨克自治州|锡伯自治县|塔吉克自治县|柯尔克孜自治州/g
+
+const countyReg = /区|县|经济开发区/g
+
+export const formatCity = (name) => {
+  var tempName = name
+  if (tempName.length > 3) {
+    if (tempName.indexOf('城区') > -1) {
+      tempName = tempName.replace('城区', '')
+    }
+    if (tempName.indexOf('地区') > -1) {
+      tempName = tempName.replace('地区', '')
+    }
+  }
+  if (tempName.length > 2) {
+    if (tempName.indexOf('和田') === -1) {
+      tempName = tempName.replace(areaReg, "")
+      if (tempName.indexOf('市') > -1 && tempName.indexOf('市') !== tempName.length - 1) { // 市不是出现在最后一位,不过滤
+        if (tempName.indexOf('市市') > -1) { // 如果出现两个市,如津市市,只去掉第一个市字
+          tempName = tempName.replace('市', "")
+        } else {
+          console.log('保留市字:' + tempName)
+        }
+      } else {
+        tempName = tempName.replace(cityReg, "")
+      }
+      // 过滤剩余的x族自治县
+      tempName = tempName.replace('族自治县', "")
+      // 过滤区县
+      if (tempName.length > 2) {
+        if (tempName.indexOf('县区') > -1) {
+          tempName = tempName.replace('区', "")
+        } else {
+          if (tempName.length > 3 && tempName.indexOf('新区') > -1) {
+            console.log('保留新区:' + tempName)
+          } else {
+            tempName = tempName.replace(countyReg, "")
+          }
+        }
+        // tempName = tempName.replace(countyReg, "")
+      }
+    }
+  }
+  return tempName
+}

+ 0 - 0
uni_merchants_enter/js_sdk/js-amap/__MACOSX/amap-wx.130.js


+ 31 - 0
uni_merchants_enter/js_sdk/js-amap/amap-wx.130.js

@@ -0,0 +1,31 @@
+function AMapWX(a){this.key=a.key;this.requestConfig={key:a.key,s:"rsx",platform:"WXJS",appname:a.key,sdkversion:"1.2.0",logversion:"2.0"};this.MeRequestConfig={key:a.key,serviceName:"https://restapi.amap.com/rest/me"}}
+AMapWX.prototype.getWxLocation=function(a,b){wx.getLocation({type:"gcj02",success:function(c){c=c.longitude+","+c.latitude;wx.setStorage({key:"userLocation",data:c});b(c)},fail:function(c){wx.getStorage({key:"userLocation",success:function(d){d.data&&b(d.data)}});a.fail({errCode:"0",errMsg:c.errMsg||""})}})};
+AMapWX.prototype.getMEKeywordsSearch=function(a){if(!a.options)return a.fail({errCode:"0",errMsg:"\u7f3a\u5c11\u5fc5\u8981\u53c2\u6570"});var b=a.options,c=this.MeRequestConfig,d={key:c.key,s:"rsx",platform:"WXJS",appname:a.key,sdkversion:"1.2.0",logversion:"2.0"};b.layerId&&(d.layerId=b.layerId);b.keywords&&(d.keywords=b.keywords);b.city&&(d.city=b.city);b.filter&&(d.filter=b.filter);b.sortrule&&(d.sortrule=b.sortrule);b.pageNum&&(d.pageNum=b.pageNum);b.pageSize&&(d.pageSize=b.pageSize);b.sig&&(d.sig=
+b.sig);wx.request({url:c.serviceName+"/cpoint/datasearch/local",data:d,method:"GET",header:{"content-type":"application/json"},success:function(e){(e=e.data)&&e.status&&"1"===e.status&&0===e.code?a.success(e.data):a.fail({errCode:"0",errMsg:e})},fail:function(e){a.fail({errCode:"0",errMsg:e.errMsg||""})}})};
+AMapWX.prototype.getMEIdSearch=function(a){if(!a.options)return a.fail({errCode:"0",errMsg:"\u7f3a\u5c11\u5fc5\u8981\u53c2\u6570"});var b=a.options,c=this.MeRequestConfig,d={key:c.key,s:"rsx",platform:"WXJS",appname:a.key,sdkversion:"1.2.0",logversion:"2.0"};b.layerId&&(d.layerId=b.layerId);b.id&&(d.id=b.id);b.sig&&(d.sig=b.sig);wx.request({url:c.serviceName+"/cpoint/datasearch/id",data:d,method:"GET",header:{"content-type":"application/json"},success:function(e){(e=e.data)&&e.status&&"1"===e.status&&
+0===e.code?a.success(e.data):a.fail({errCode:"0",errMsg:e})},fail:function(e){a.fail({errCode:"0",errMsg:e.errMsg||""})}})};
+AMapWX.prototype.getMEPolygonSearch=function(a){if(!a.options)return a.fail({errCode:"0",errMsg:"\u7f3a\u5c11\u5fc5\u8981\u53c2\u6570"});var b=a.options,c=this.MeRequestConfig,d={key:c.key,s:"rsx",platform:"WXJS",appname:a.key,sdkversion:"1.2.0",logversion:"2.0"};b.layerId&&(d.layerId=b.layerId);b.keywords&&(d.keywords=b.keywords);b.polygon&&(d.polygon=b.polygon);b.filter&&(d.filter=b.filter);b.sortrule&&(d.sortrule=b.sortrule);b.pageNum&&(d.pageNum=b.pageNum);b.pageSize&&(d.pageSize=b.pageSize);
+b.sig&&(d.sig=b.sig);wx.request({url:c.serviceName+"/cpoint/datasearch/polygon",data:d,method:"GET",header:{"content-type":"application/json"},success:function(e){(e=e.data)&&e.status&&"1"===e.status&&0===e.code?a.success(e.data):a.fail({errCode:"0",errMsg:e})},fail:function(e){a.fail({errCode:"0",errMsg:e.errMsg||""})}})};
+AMapWX.prototype.getMEaroundSearch=function(a){if(!a.options)return a.fail({errCode:"0",errMsg:"\u7f3a\u5c11\u5fc5\u8981\u53c2\u6570"});var b=a.options,c=this.MeRequestConfig,d={key:c.key,s:"rsx",platform:"WXJS",appname:a.key,sdkversion:"1.2.0",logversion:"2.0"};b.layerId&&(d.layerId=b.layerId);b.keywords&&(d.keywords=b.keywords);b.center&&(d.center=b.center);b.radius&&(d.radius=b.radius);b.filter&&(d.filter=b.filter);b.sortrule&&(d.sortrule=b.sortrule);b.pageNum&&(d.pageNum=b.pageNum);b.pageSize&&
+(d.pageSize=b.pageSize);b.sig&&(d.sig=b.sig);wx.request({url:c.serviceName+"/cpoint/datasearch/around",data:d,method:"GET",header:{"content-type":"application/json"},success:function(e){(e=e.data)&&e.status&&"1"===e.status&&0===e.code?a.success(e.data):a.fail({errCode:"0",errMsg:e})},fail:function(e){a.fail({errCode:"0",errMsg:e.errMsg||""})}})};
+AMapWX.prototype.getGeo=function(a){var b=this.requestConfig,c=a.options;b={key:this.key,extensions:"all",s:b.s,platform:b.platform,appname:this.key,sdkversion:b.sdkversion,logversion:b.logversion};c.address&&(b.address=c.address);c.city&&(b.city=c.city);c.batch&&(b.batch=c.batch);c.sig&&(b.sig=c.sig);wx.request({url:"https://restapi.amap.com/v3/geocode/geo",data:b,method:"GET",header:{"content-type":"application/json"},success:function(d){(d=d.data)&&d.status&&"1"===d.status?a.success(d):a.fail({errCode:"0",
+errMsg:d})},fail:function(d){a.fail({errCode:"0",errMsg:d.errMsg||""})}})};
+AMapWX.prototype.getRegeo=function(a){function b(d){var e=c.requestConfig;wx.request({url:"https://restapi.amap.com/v3/geocode/regeo",data:{key:c.key,location:d,extensions:"all",s:e.s,platform:e.platform,appname:c.key,sdkversion:e.sdkversion,logversion:e.logversion},method:"GET",header:{"content-type":"application/json"},success:function(g){if(g.data.status&&"1"==g.data.status){g=g.data.regeocode;var h=g.addressComponent,f=[],k=g.roads[0].name+"\u9644\u8fd1",m=d.split(",")[0],n=d.split(",")[1];if(g.pois&&
+g.pois[0]){k=g.pois[0].name+"\u9644\u8fd1";var l=g.pois[0].location;l&&(m=parseFloat(l.split(",")[0]),n=parseFloat(l.split(",")[1]))}h.provice&&f.push(h.provice);h.city&&f.push(h.city);h.district&&f.push(h.district);h.streetNumber&&h.streetNumber.street&&h.streetNumber.number?(f.push(h.streetNumber.street),f.push(h.streetNumber.number)):f.push(g.roads[0].name);f=f.join("");a.success([{iconPath:a.iconPath,width:a.iconWidth,height:a.iconHeight,name:f,desc:k,longitude:m,latitude:n,id:0,regeocodeData:g}])}else a.fail({errCode:g.data.infocode,
+errMsg:g.data.info})},fail:function(g){a.fail({errCode:"0",errMsg:g.errMsg||""})}})}var c=this;a.location?b(a.location):c.getWxLocation(a,function(d){b(d)})};
+AMapWX.prototype.getWeather=function(a){function b(g){var h="base";a.type&&"forecast"==a.type&&(h="all");wx.request({url:"https://restapi.amap.com/v3/weather/weatherInfo",data:{key:d.key,city:g,extensions:h,s:e.s,platform:e.platform,appname:d.key,sdkversion:e.sdkversion,logversion:e.logversion},method:"GET",header:{"content-type":"application/json"},success:function(f){if(f.data.status&&"1"==f.data.status)if(f.data.lives){if((f=f.data.lives)&&0<f.length){f=f[0];var k={city:{text:"\u57ce\u5e02",data:f.city},
+weather:{text:"\u5929\u6c14",data:f.weather},temperature:{text:"\u6e29\u5ea6",data:f.temperature},winddirection:{text:"\u98ce\u5411",data:f.winddirection+"\u98ce"},windpower:{text:"\u98ce\u529b",data:f.windpower+"\u7ea7"},humidity:{text:"\u6e7f\u5ea6",data:f.humidity+"%"}};k.liveData=f;a.success(k)}}else f.data.forecasts&&f.data.forecasts[0]&&a.success({forecast:f.data.forecasts[0]});else a.fail({errCode:f.data.infocode,errMsg:f.data.info})},fail:function(f){a.fail({errCode:"0",errMsg:f.errMsg||""})}})}
+function c(g){wx.request({url:"https://restapi.amap.com/v3/geocode/regeo",data:{key:d.key,location:g,extensions:"all",s:e.s,platform:e.platform,appname:d.key,sdkversion:e.sdkversion,logversion:e.logversion},method:"GET",header:{"content-type":"application/json"},success:function(h){if(h.data.status&&"1"==h.data.status){h=h.data.regeocode;if(h.addressComponent)var f=h.addressComponent.adcode;else h.aois&&0<h.aois.length&&(f=h.aois[0].adcode);b(f)}else a.fail({errCode:h.data.infocode,errMsg:h.data.info})},
+fail:function(h){a.fail({errCode:"0",errMsg:h.errMsg||""})}})}var d=this,e=d.requestConfig;a.city?b(a.city):d.getWxLocation(a,function(g){c(g)})};
+AMapWX.prototype.getPoiAround=function(a){function b(e){e={key:c.key,location:e,s:d.s,platform:d.platform,appname:c.key,sdkversion:d.sdkversion,logversion:d.logversion};a.querytypes&&(e.types=a.querytypes);a.querykeywords&&(e.keywords=a.querykeywords);wx.request({url:"https://restapi.amap.com/v3/place/around",data:e,method:"GET",header:{"content-type":"application/json"},success:function(g){if(g.data.status&&"1"==g.data.status){if((g=g.data)&&g.pois){for(var h=[],f=0;f<g.pois.length;f++){var k=0==
+f?a.iconPathSelected:a.iconPath;h.push({latitude:parseFloat(g.pois[f].location.split(",")[1]),longitude:parseFloat(g.pois[f].location.split(",")[0]),iconPath:k,width:22,height:32,id:f,name:g.pois[f].name,address:g.pois[f].address})}a.success({markers:h,poisData:g.pois})}}else a.fail({errCode:g.data.infocode,errMsg:g.data.info})},fail:function(g){a.fail({errCode:"0",errMsg:g.errMsg||""})}})}var c=this,d=c.requestConfig;a.location?b(a.location):c.getWxLocation(a,function(e){b(e)})};
+AMapWX.prototype.getStaticmap=function(a){function b(e){c.push("location="+e);a.zoom&&c.push("zoom="+a.zoom);a.size&&c.push("size="+a.size);a.scale&&c.push("scale="+a.scale);a.markers&&c.push("markers="+a.markers);a.labels&&c.push("labels="+a.labels);a.paths&&c.push("paths="+a.paths);a.traffic&&c.push("traffic="+a.traffic);e="https://restapi.amap.com/v3/staticmap?"+c.join("&");a.success({url:e})}var c=[];c.push("key="+this.key);var d=this.requestConfig;c.push("s="+d.s);c.push("platform="+d.platform);
+c.push("appname="+d.appname);c.push("sdkversion="+d.sdkversion);c.push("logversion="+d.logversion);a.location?b(a.location):this.getWxLocation(a,function(e){b(e)})};
+AMapWX.prototype.getInputtips=function(a){var b=Object.assign({},this.requestConfig);a.location&&(b.location=a.location);a.keywords&&(b.keywords=a.keywords);a.type&&(b.type=a.type);a.city&&(b.city=a.city);a.citylimit&&(b.citylimit=a.citylimit);wx.request({url:"https://restapi.amap.com/v3/assistant/inputtips",data:b,method:"GET",header:{"content-type":"application/json"},success:function(c){c&&c.data&&c.data.tips&&a.success({tips:c.data.tips})},fail:function(c){a.fail({errCode:"0",errMsg:c.errMsg||
+""})}})};
+AMapWX.prototype.getDrivingRoute=function(a){var b=Object.assign({},this.requestConfig);a.origin&&(b.origin=a.origin);a.destination&&(b.destination=a.destination);a.strategy&&(b.strategy=a.strategy);a.waypoints&&(b.waypoints=a.waypoints);a.avoidpolygons&&(b.avoidpolygons=a.avoidpolygons);a.avoidroad&&(b.avoidroad=a.avoidroad);wx.request({url:"https://restapi.amap.com/v3/direction/driving",data:b,method:"GET",header:{"content-type":"application/json"},success:function(c){c&&c.data&&c.data.route&&a.success({paths:c.data.route.paths,
+taxi_cost:c.data.route.taxi_cost||""})},fail:function(c){a.fail({errCode:"0",errMsg:c.errMsg||""})}})};
+AMapWX.prototype.getWalkingRoute=function(a){var b=Object.assign({},this.requestConfig);a.origin&&(b.origin=a.origin);a.destination&&(b.destination=a.destination);wx.request({url:"https://restapi.amap.com/v3/direction/walking",data:b,method:"GET",header:{"content-type":"application/json"},success:function(c){c&&c.data&&c.data.route&&a.success({paths:c.data.route.paths})},fail:function(c){a.fail({errCode:"0",errMsg:c.errMsg||""})}})};
+AMapWX.prototype.getTransitRoute=function(a){var b=Object.assign({},this.requestConfig);a.origin&&(b.origin=a.origin);a.destination&&(b.destination=a.destination);a.strategy&&(b.strategy=a.strategy);a.city&&(b.city=a.city);a.cityd&&(b.cityd=a.cityd);wx.request({url:"https://restapi.amap.com/v3/direction/transit/integrated",data:b,method:"GET",header:{"content-type":"application/json"},success:function(c){c&&c.data&&c.data.route&&(c=c.data.route,a.success({distance:c.distance||"",taxi_cost:c.taxi_cost||
+"",transits:c.transits}))},fail:function(c){a.fail({errCode:"0",errMsg:c.errMsg||""})}})};
+AMapWX.prototype.getRidingRoute=function(a){var b=Object.assign({},this.requestConfig);a.origin&&(b.origin=a.origin);a.destination&&(b.destination=a.destination);wx.request({url:"https://restapi.amap.com/v3/direction/riding",data:b,method:"GET",header:{"content-type":"application/json"},success:function(c){c&&c.data&&c.data.route&&a.success({paths:c.data.route.paths})},fail:function(c){a.fail({errCode:"0",errMsg:c.errMsg||""})}})};module.exports.AMapWX=AMapWX;

+ 1122 - 0
uni_merchants_enter/js_sdk/qqmap-wx-jssdk.js

@@ -0,0 +1,1122 @@
+/**
+ * 微信小程序JavaScriptSDK
+ * 
+ * @version 1.2
+ * @date 2019-03-06
+ */
+
+var ERROR_CONF = {
+    KEY_ERR: 311,
+    KEY_ERR_MSG: 'key格式错误',
+    PARAM_ERR: 310,
+    PARAM_ERR_MSG: '请求参数信息有误',
+    SYSTEM_ERR: 600,
+    SYSTEM_ERR_MSG: '系统错误',
+    WX_ERR_CODE: 1000,
+    WX_OK_CODE: 200
+};
+var BASE_URL = 'https://apis.map.qq.com/ws/';
+var URL_SEARCH = BASE_URL + 'place/v1/search';
+var URL_SUGGESTION = BASE_URL + 'place/v1/suggestion';
+var URL_GET_GEOCODER = BASE_URL + 'geocoder/v1/';
+var URL_CITY_LIST = BASE_URL + 'district/v1/list';
+var URL_AREA_LIST = BASE_URL + 'district/v1/getchildren';
+var URL_DISTANCE = BASE_URL + 'distance/v1/';
+var URL_DIRECTION = BASE_URL + 'direction/v1/';
+var MODE = {
+  driving: 'driving',
+  transit: 'transit'
+};
+var EARTH_RADIUS = 6378136.49;
+var Utils = {
+  /**
+  * md5加密方法
+  * 版权所有©2011 Sebastian Tschan,https://blueimp.net
+  */
+  safeAdd(x, y) {
+    var lsw = (x & 0xffff) + (y & 0xffff);
+    var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
+    return (msw << 16) | (lsw & 0xffff);
+  },
+  bitRotateLeft(num, cnt) {
+    return (num << cnt) | (num >>> (32 - cnt));
+  },
+  md5cmn(q, a, b, x, s, t) {
+    return this.safeAdd(this.bitRotateLeft(this.safeAdd(this.safeAdd(a, q), this.safeAdd(x, t)), s), b);
+  },
+  md5ff(a, b, c, d, x, s, t) {
+    return this.md5cmn((b & c) | (~b & d), a, b, x, s, t);
+  },
+  md5gg(a, b, c, d, x, s, t) {
+    return this.md5cmn((b & d) | (c & ~d), a, b, x, s, t);
+  },
+  md5hh(a, b, c, d, x, s, t) {
+    return this.md5cmn(b ^ c ^ d, a, b, x, s, t);
+  },
+  md5ii(a, b, c, d, x, s, t) {
+    return this.md5cmn(c ^ (b | ~d), a, b, x, s, t);
+  },
+  binlMD5(x, len) {
+    /* append padding */
+    x[len >> 5] |= 0x80 << (len % 32);
+    x[((len + 64) >>> 9 << 4) + 14] = len;
+
+    var i;
+    var olda;
+    var oldb;
+    var oldc;
+    var oldd;
+    var a = 1732584193;
+    var b = -271733879;
+    var c = -1732584194;
+    var d = 271733878;
+
+    for (i = 0; i < x.length; i += 16) {
+      olda = a;
+      oldb = b;
+      oldc = c;
+      oldd = d;
+
+      a = this.md5ff(a, b, c, d, x[i], 7, -680876936);
+      d = this.md5ff(d, a, b, c, x[i + 1], 12, -389564586);
+      c = this.md5ff(c, d, a, b, x[i + 2], 17, 606105819);
+      b = this.md5ff(b, c, d, a, x[i + 3], 22, -1044525330);
+      a = this.md5ff(a, b, c, d, x[i + 4], 7, -176418897);
+      d = this.md5ff(d, a, b, c, x[i + 5], 12, 1200080426);
+      c = this.md5ff(c, d, a, b, x[i + 6], 17, -1473231341);
+      b = this.md5ff(b, c, d, a, x[i + 7], 22, -45705983);
+      a = this.md5ff(a, b, c, d, x[i + 8], 7, 1770035416);
+      d = this.md5ff(d, a, b, c, x[i + 9], 12, -1958414417);
+      c = this.md5ff(c, d, a, b, x[i + 10], 17, -42063);
+      b = this.md5ff(b, c, d, a, x[i + 11], 22, -1990404162);
+      a = this.md5ff(a, b, c, d, x[i + 12], 7, 1804603682);
+      d = this.md5ff(d, a, b, c, x[i + 13], 12, -40341101);
+      c = this.md5ff(c, d, a, b, x[i + 14], 17, -1502002290);
+      b = this.md5ff(b, c, d, a, x[i + 15], 22, 1236535329);
+
+      a = this.md5gg(a, b, c, d, x[i + 1], 5, -165796510);
+      d = this.md5gg(d, a, b, c, x[i + 6], 9, -1069501632);
+      c = this.md5gg(c, d, a, b, x[i + 11], 14, 643717713);
+      b = this.md5gg(b, c, d, a, x[i], 20, -373897302);
+      a = this.md5gg(a, b, c, d, x[i + 5], 5, -701558691);
+      d = this.md5gg(d, a, b, c, x[i + 10], 9, 38016083);
+      c = this.md5gg(c, d, a, b, x[i + 15], 14, -660478335);
+      b = this.md5gg(b, c, d, a, x[i + 4], 20, -405537848);
+      a = this.md5gg(a, b, c, d, x[i + 9], 5, 568446438);
+      d = this.md5gg(d, a, b, c, x[i + 14], 9, -1019803690);
+      c = this.md5gg(c, d, a, b, x[i + 3], 14, -187363961);
+      b = this.md5gg(b, c, d, a, x[i + 8], 20, 1163531501);
+      a = this.md5gg(a, b, c, d, x[i + 13], 5, -1444681467);
+      d = this.md5gg(d, a, b, c, x[i + 2], 9, -51403784);
+      c = this.md5gg(c, d, a, b, x[i + 7], 14, 1735328473);
+      b = this.md5gg(b, c, d, a, x[i + 12], 20, -1926607734);
+
+      a = this.md5hh(a, b, c, d, x[i + 5], 4, -378558);
+      d = this.md5hh(d, a, b, c, x[i + 8], 11, -2022574463);
+      c = this.md5hh(c, d, a, b, x[i + 11], 16, 1839030562);
+      b = this.md5hh(b, c, d, a, x[i + 14], 23, -35309556);
+      a = this.md5hh(a, b, c, d, x[i + 1], 4, -1530992060);
+      d = this.md5hh(d, a, b, c, x[i + 4], 11, 1272893353);
+      c = this.md5hh(c, d, a, b, x[i + 7], 16, -155497632);
+      b = this.md5hh(b, c, d, a, x[i + 10], 23, -1094730640);
+      a = this.md5hh(a, b, c, d, x[i + 13], 4, 681279174);
+      d = this.md5hh(d, a, b, c, x[i], 11, -358537222);
+      c = this.md5hh(c, d, a, b, x[i + 3], 16, -722521979);
+      b = this.md5hh(b, c, d, a, x[i + 6], 23, 76029189);
+      a = this.md5hh(a, b, c, d, x[i + 9], 4, -640364487);
+      d = this.md5hh(d, a, b, c, x[i + 12], 11, -421815835);
+      c = this.md5hh(c, d, a, b, x[i + 15], 16, 530742520);
+      b = this.md5hh(b, c, d, a, x[i + 2], 23, -995338651);
+
+      a = this.md5ii(a, b, c, d, x[i], 6, -198630844);
+      d = this.md5ii(d, a, b, c, x[i + 7], 10, 1126891415);
+      c = this.md5ii(c, d, a, b, x[i + 14], 15, -1416354905);
+      b = this.md5ii(b, c, d, a, x[i + 5], 21, -57434055);
+      a = this.md5ii(a, b, c, d, x[i + 12], 6, 1700485571);
+      d = this.md5ii(d, a, b, c, x[i + 3], 10, -1894986606);
+      c = this.md5ii(c, d, a, b, x[i + 10], 15, -1051523);
+      b = this.md5ii(b, c, d, a, x[i + 1], 21, -2054922799);
+      a = this.md5ii(a, b, c, d, x[i + 8], 6, 1873313359);
+      d = this.md5ii(d, a, b, c, x[i + 15], 10, -30611744);
+      c = this.md5ii(c, d, a, b, x[i + 6], 15, -1560198380);
+      b = this.md5ii(b, c, d, a, x[i + 13], 21, 1309151649);
+      a = this.md5ii(a, b, c, d, x[i + 4], 6, -145523070);
+      d = this.md5ii(d, a, b, c, x[i + 11], 10, -1120210379);
+      c = this.md5ii(c, d, a, b, x[i + 2], 15, 718787259);
+      b = this.md5ii(b, c, d, a, x[i + 9], 21, -343485551);
+
+      a = this.safeAdd(a, olda);
+      b = this.safeAdd(b, oldb);
+      c = this.safeAdd(c, oldc);
+      d = this.safeAdd(d, oldd);
+    }
+    return [a, b, c, d];
+  },
+  binl2rstr(input) {
+    var i;
+    var output = '';
+    var length32 = input.length * 32;
+    for (i = 0; i < length32; i += 8) {
+      output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xff);
+    }
+    return output;
+  },
+  rstr2binl(input) {
+    var i;
+    var output = [];
+    output[(input.length >> 2) - 1] = undefined;
+    for (i = 0; i < output.length; i += 1) {
+      output[i] = 0;
+    }
+    var length8 = input.length * 8;
+    for (i = 0; i < length8; i += 8) {
+      output[i >> 5] |= (input.charCodeAt(i / 8) & 0xff) << (i % 32);
+    }
+    return output;
+  },
+  rstrMD5(s) {
+    return this.binl2rstr(this.binlMD5(this.rstr2binl(s), s.length * 8));
+  },
+  rstrHMACMD5(key, data) {
+    var i;
+    var bkey = this.rstr2binl(key);
+    var ipad = [];
+    var opad = [];
+    var hash;
+    ipad[15] = opad[15] = undefined;
+    if (bkey.length > 16) {
+      bkey = this.binlMD5(bkey, key.length * 8);
+    }
+    for (i = 0; i < 16; i += 1) {
+      ipad[i] = bkey[i] ^ 0x36363636;
+      opad[i] = bkey[i] ^ 0x5c5c5c5c;
+    }
+    hash = this.binlMD5(ipad.concat(this.rstr2binl(data)), 512 + data.length * 8);
+    return this.binl2rstr(this.binlMD5(opad.concat(hash), 512 + 128));
+  },
+  rstr2hex(input) {
+    var hexTab = '0123456789abcdef';
+    var output = '';
+    var x;
+    var i;
+    for (i = 0; i < input.length; i += 1) {
+      x = input.charCodeAt(i);
+      output += hexTab.charAt((x >>> 4) & 0x0f) + hexTab.charAt(x & 0x0f);
+    }
+    return output;
+  },
+  str2rstrUTF8(input) {
+    return unescape(encodeURIComponent(input));
+  },
+  rawMD5(s) {
+    return this.rstrMD5(this.str2rstrUTF8(s));
+  },
+  hexMD5(s) {
+    return this.rstr2hex(this.rawMD5(s));
+  },
+  rawHMACMD5(k, d) {
+    return this.rstrHMACMD5(this.str2rstrUTF8(k), str2rstrUTF8(d));
+  },
+  hexHMACMD5(k, d) {
+    return this.rstr2hex(this.rawHMACMD5(k, d));
+  },
+
+  md5(string, key, raw) {
+    if (!key) {
+      if (!raw) {
+        return this.hexMD5(string);
+      }
+      return this.rawMD5(string);
+    }
+    if (!raw) {
+      return this.hexHMACMD5(key, string);
+    }
+    return this.rawHMACMD5(key, string);
+  },
+  /**
+   * 得到md5加密后的sig参数
+   * @param {Object} requestParam 接口参数
+   * @param {String} sk签名字符串
+   * @param {String} featrue 方法名
+   * @return 返回加密后的sig参数
+   */
+  getSig(requestParam, sk, feature, mode) {
+    var sig = null;
+    var requestArr = [];
+    Object.keys(requestParam).sort().forEach(function(key){
+      requestArr.push(key + '=' + requestParam[key]);
+    });
+    if (feature == 'search') {
+      sig = '/ws/place/v1/search?' + requestArr.join('&') + sk;
+    }
+    if (feature == 'suggest') {
+      sig = '/ws/place/v1/suggestion?' + requestArr.join('&') + sk;
+    }
+    if (feature == 'reverseGeocoder') {
+      sig = '/ws/geocoder/v1/?' + requestArr.join('&') + sk;
+    }
+    if (feature == 'geocoder') {
+      sig = '/ws/geocoder/v1/?' + requestArr.join('&') + sk;
+    }
+    if (feature == 'getCityList') {
+      sig = '/ws/district/v1/list?' + requestArr.join('&') + sk;
+    }
+    if (feature == 'getDistrictByCityId') {
+      sig = '/ws/district/v1/getchildren?' + requestArr.join('&') + sk;
+    }
+    if (feature == 'calculateDistance') {
+      sig = '/ws/distance/v1/?' + requestArr.join('&') + sk;
+    }
+    if (feature == 'direction') {
+      sig = '/ws/direction/v1/' + mode + '?' + requestArr.join('&') + sk;
+    }
+    sig = this.md5(sig);
+    return sig;
+  },
+    /**
+     * 得到终点query字符串
+     * @param {Array|String} 检索数据
+     */
+    location2query(data) {
+        if (typeof data == 'string') {
+            return data;
+        }
+        var query = '';
+        for (var i = 0; i < data.length; i++) {
+            var d = data[i];
+            if (!!query) {
+                query += ';';
+            }
+            if (d.location) {
+                query = query + d.location.lat + ',' + d.location.lng;
+            }
+            if (d.latitude && d.longitude) {
+                query = query + d.latitude + ',' + d.longitude;
+            }
+        }
+        return query;
+    },
+
+    /**
+     * 计算角度
+     */
+    rad(d) {
+      return d * Math.PI / 180.0;
+    },  
+    /**
+     * 处理终点location数组
+     * @return 返回终点数组
+     */
+    getEndLocation(location){
+      var to = location.split(';');
+      var endLocation = [];
+      for (var i = 0; i < to.length; i++) {
+        endLocation.push({
+          lat: parseFloat(to[i].split(',')[0]),
+          lng: parseFloat(to[i].split(',')[1])
+        })
+      }
+      return endLocation;
+    },
+
+    /**
+     * 计算两点间直线距离
+     * @param a 表示纬度差
+     * @param b 表示经度差
+     * @return 返回的是距离,单位m
+     */
+    getDistance(latFrom, lngFrom, latTo, lngTo) {
+      var radLatFrom = this.rad(latFrom);
+      var radLatTo = this.rad(latTo);
+      var a = radLatFrom - radLatTo;
+      var b = this.rad(lngFrom) - this.rad(lngTo);
+      var distance = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLatFrom) * Math.cos(radLatTo) * Math.pow(Math.sin(b / 2), 2)));
+      distance = distance * EARTH_RADIUS;
+      distance = Math.round(distance * 10000) / 10000;
+      return parseFloat(distance.toFixed(0));
+    },
+    /**
+     * 使用微信接口进行定位
+     */
+    getWXLocation(success, fail, complete) {
+        wx.getLocation({
+            type: 'gcj02',
+            success: success,
+            fail: fail,
+            complete: complete
+        });
+    },
+
+    /**
+     * 获取location参数
+     */
+    getLocationParam(location) {
+        if (typeof location == 'string') {
+            var locationArr = location.split(',');
+            if (locationArr.length === 2) {
+                location = {
+                    latitude: location.split(',')[0],
+                    longitude: location.split(',')[1]
+                };
+            } else {
+                location = {};
+            }
+        }
+        return location;
+    },
+
+    /**
+     * 回调函数默认处理
+     */
+    polyfillParam(param) {
+        param.success = param.success || function () { };
+        param.fail = param.fail || function () { };
+        param.complete = param.complete || function () { };
+    },
+
+    /**
+     * 验证param对应的key值是否为空
+     * 
+     * @param {Object} param 接口参数
+     * @param {String} key 对应参数的key
+     */
+    checkParamKeyEmpty(param, key) {
+        if (!param[key]) {
+            var errconf = this.buildErrorConfig(ERROR_CONF.PARAM_ERR, ERROR_CONF.PARAM_ERR_MSG + key +'参数格式有误');
+            param.fail(errconf);
+            param.complete(errconf);
+            return true;
+        }
+        return false;
+    },
+
+    /**
+     * 验证参数中是否存在检索词keyword
+     * 
+     * @param {Object} param 接口参数
+     */
+    checkKeyword(param){
+        return !this.checkParamKeyEmpty(param, 'keyword');
+    },
+
+    /**
+     * 验证location值
+     * 
+     * @param {Object} param 接口参数
+     */
+    checkLocation(param) {
+        var location = this.getLocationParam(param.location);
+        if (!location || !location.latitude || !location.longitude) {
+            var errconf = this.buildErrorConfig(ERROR_CONF.PARAM_ERR, ERROR_CONF.PARAM_ERR_MSG + ' location参数格式有误');
+            param.fail(errconf);
+            param.complete(errconf);
+            return false;
+        }
+        return true;
+    },
+
+    /**
+     * 构造错误数据结构
+     * @param {Number} errCode 错误码
+     * @param {Number} errMsg 错误描述
+     */
+    buildErrorConfig(errCode, errMsg) {
+        return {
+            status: errCode,
+            message: errMsg
+        };
+    },
+
+    /**
+     * 
+     * 数据处理函数
+     * 根据传入参数不同处理不同数据
+     * @param {String} feature 功能名称
+     * search 地点搜索
+     * suggest关键词提示
+     * reverseGeocoder逆地址解析
+     * geocoder地址解析
+     * getCityList获取城市列表:父集
+     * getDistrictByCityId获取区县列表:子集
+     * calculateDistance距离计算
+     * @param {Object} param 接口参数
+     * @param {Object} data 数据
+     */
+    handleData(param,data,feature){
+      if (feature == 'search') {
+        var searchResult = data.data;
+        var searchSimplify = [];
+        for (var i = 0; i < searchResult.length; i++) {
+          searchSimplify.push({
+            id: searchResult[i].id || null,
+            title: searchResult[i].title || null,
+            latitude: searchResult[i].location && searchResult[i].location.lat || null,
+            longitude: searchResult[i].location && searchResult[i].location.lng || null,
+            address: searchResult[i].address || null,
+            category: searchResult[i].category || null,
+            tel: searchResult[i].tel || null,
+            adcode: searchResult[i].ad_info && searchResult[i].ad_info.adcode || null,
+            city: searchResult[i].ad_info && searchResult[i].ad_info.city || null,
+            district: searchResult[i].ad_info && searchResult[i].ad_info.district || null,
+            province: searchResult[i].ad_info && searchResult[i].ad_info.province || null
+          })
+        }
+        param.success(data, {
+          searchResult: searchResult,
+          searchSimplify: searchSimplify
+        })
+      } else if (feature == 'suggest') {
+        var suggestResult = data.data;
+        var suggestSimplify = [];
+        for (var i = 0; i < suggestResult.length; i++) {
+          suggestSimplify.push({
+            adcode: suggestResult[i].adcode || null,
+            address: suggestResult[i].address || null,
+            category: suggestResult[i].category || null,
+            city: suggestResult[i].city || null,
+            district: suggestResult[i].district || null,
+            id: suggestResult[i].id || null,
+            latitude: suggestResult[i].location && suggestResult[i].location.lat || null,
+            longitude: suggestResult[i].location && suggestResult[i].location.lng || null,
+            province: suggestResult[i].province || null,
+            title: suggestResult[i].title || null,
+            type: suggestResult[i].type || null
+          })
+        }
+        param.success(data, {
+          suggestResult: suggestResult,
+          suggestSimplify: suggestSimplify
+          })
+      } else if (feature == 'reverseGeocoder') {
+        var reverseGeocoderResult = data.result;
+        var reverseGeocoderSimplify = {
+          address: reverseGeocoderResult.address || null,
+          latitude: reverseGeocoderResult.location && reverseGeocoderResult.location.lat || null,
+          longitude: reverseGeocoderResult.location && reverseGeocoderResult.location.lng || null,
+          adcode: reverseGeocoderResult.ad_info && reverseGeocoderResult.ad_info.adcode || null,
+          city: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.city || null,
+          district: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.district || null,
+          nation: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.nation || null,
+          province: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.province || null,
+          street: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.street || null,
+          street_number: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.street_number || null,
+          recommend: reverseGeocoderResult.formatted_addresses && reverseGeocoderResult.formatted_addresses.recommend || null,
+          rough: reverseGeocoderResult.formatted_addresses && reverseGeocoderResult.formatted_addresses.rough || null
+        };
+        if (reverseGeocoderResult.pois) {//判断是否返回周边poi
+          var pois = reverseGeocoderResult.pois;
+          var poisSimplify = [];
+          for (var i = 0;i < pois.length;i++) {
+            poisSimplify.push({
+              id: pois[i].id || null,
+              title: pois[i].title || null,
+              latitude: pois[i].location && pois[i].location.lat || null,
+              longitude: pois[i].location && pois[i].location.lng || null,
+              address: pois[i].address || null,
+              category: pois[i].category || null,
+              adcode: pois[i].ad_info && pois[i].ad_info.adcode || null,
+              city: pois[i].ad_info && pois[i].ad_info.city || null,
+              district: pois[i].ad_info && pois[i].ad_info.district || null,
+              province: pois[i].ad_info && pois[i].ad_info.province || null
+            })
+          }
+          param.success(data,{
+            reverseGeocoderResult: reverseGeocoderResult,
+            reverseGeocoderSimplify: reverseGeocoderSimplify,
+            pois: pois,
+            poisSimplify: poisSimplify
+          })
+        } else {
+          param.success(data, {
+            reverseGeocoderResult: reverseGeocoderResult,
+            reverseGeocoderSimplify: reverseGeocoderSimplify
+          })
+        }
+      } else if (feature == 'geocoder') {
+        var geocoderResult = data.result;
+        var geocoderSimplify = {
+          title: geocoderResult.title || null,
+          latitude: geocoderResult.location && geocoderResult.location.lat || null,
+          longitude: geocoderResult.location && geocoderResult.location.lng || null,
+          adcode: geocoderResult.ad_info && geocoderResult.ad_info.adcode || null,
+          province: geocoderResult.address_components && geocoderResult.address_components.province || null,
+          city: geocoderResult.address_components && geocoderResult.address_components.city || null,
+          district: geocoderResult.address_components && geocoderResult.address_components.district || null,
+          street: geocoderResult.address_components && geocoderResult.address_components.street || null,
+          street_number: geocoderResult.address_components && geocoderResult.address_components.street_number || null,
+          level: geocoderResult.level || null
+        };
+        param.success(data,{
+          geocoderResult: geocoderResult,
+          geocoderSimplify: geocoderSimplify
+        });
+      } else if (feature == 'getCityList') {
+        var provinceResult = data.result[0];
+        var cityResult = data.result[1];
+        var districtResult = data.result[2];
+        param.success(data,{
+          provinceResult: provinceResult,
+          cityResult: cityResult,
+          districtResult: districtResult
+        });
+      } else if (feature == 'getDistrictByCityId') {
+        var districtByCity = data.result[0];
+        param.success(data, districtByCity);
+      } else if (feature == 'calculateDistance') {
+        var calculateDistanceResult = data.result.elements;  
+        var distance = [];
+        for (var i = 0; i < calculateDistanceResult.length; i++){
+          distance.push(calculateDistanceResult[i].distance);
+        }   
+        param.success(data, {
+          calculateDistanceResult: calculateDistanceResult,
+          distance: distance
+          });
+      } else if (feature == 'direction') {
+        var direction = data.result.routes;
+        param.success(data,direction);
+      } else {
+        param.success(data);
+      }
+    },
+
+    /**
+     * 构造微信请求参数,公共属性处理
+     * 
+     * @param {Object} param 接口参数
+     * @param {Object} param 配置项
+     * @param {String} feature 方法名
+     */
+    buildWxRequestConfig(param, options, feature) {
+        var that = this;
+        options.header = { "content-type": "application/json" };
+        options.method = 'GET';
+        options.success = function (res) {
+            var data = res.data;
+            if (data.status === 0) {
+              that.handleData(param, data, feature);
+            } else {
+                param.fail(data);
+            }
+        };
+        options.fail = function (res) {
+            res.statusCode = ERROR_CONF.WX_ERR_CODE;
+            param.fail(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg));
+        };
+        options.complete = function (res) {
+            var statusCode = +res.statusCode;
+            switch(statusCode) {
+                case ERROR_CONF.WX_ERR_CODE: {
+                    param.complete(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg));
+                    break;
+                }
+                case ERROR_CONF.WX_OK_CODE: {
+                    var data = res.data;
+                    if (data.status === 0) {
+                        param.complete(data);
+                    } else {
+                        param.complete(that.buildErrorConfig(data.status, data.message));
+                    }
+                    break;
+                }
+                default:{
+                    param.complete(that.buildErrorConfig(ERROR_CONF.SYSTEM_ERR, ERROR_CONF.SYSTEM_ERR_MSG));
+                }
+
+            }
+        };
+        return options;
+    },
+
+    /**
+     * 处理用户参数是否传入坐标进行不同的处理
+     */
+    locationProcess(param, locationsuccess, locationfail, locationcomplete) {
+        var that = this;
+        locationfail = locationfail || function (res) {
+            res.statusCode = ERROR_CONF.WX_ERR_CODE;
+            param.fail(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg));
+        };
+        locationcomplete = locationcomplete || function (res) {
+            if (res.statusCode == ERROR_CONF.WX_ERR_CODE) {
+                param.complete(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg));
+            }
+        };
+        if (!param.location) {
+            that.getWXLocation(locationsuccess, locationfail, locationcomplete);
+        } else if (that.checkLocation(param)) {
+            var location = Utils.getLocationParam(param.location);
+            locationsuccess(location);
+        }
+    }
+};
+
+
+class QQMapWX {
+
+    /**
+     * 构造函数
+     * 
+     * @param {Object} options 接口参数,key 为必选参数
+     */
+    constructor(options) {
+        if (!options.key) {
+            throw Error('key值不能为空');
+        }
+        this.key = options.key;
+    };
+
+    /**
+     * POI周边检索
+     *
+     * @param {Object} options 接口参数对象
+     * 
+     * 参数对象结构可以参考
+     * @see http://lbs.qq.com/webservice_v1/guide-search.html
+     */
+    search(options) {
+        var that = this;
+        options = options || {};
+
+        Utils.polyfillParam(options);
+
+        if (!Utils.checkKeyword(options)) {
+            return;
+        }
+
+        var requestParam = {
+            keyword: options.keyword,
+            orderby: options.orderby || '_distance',
+            page_size: options.page_size || 10,
+            page_index: options.page_index || 1,
+            output: 'json',
+            key: that.key
+        };
+
+        if (options.address_format) {
+            requestParam.address_format = options.address_format;
+        }
+
+        if (options.filter) {
+            requestParam.filter = options.filter;
+        }
+
+        var distance = options.distance || "1000";
+        var auto_extend = options.auto_extend || 1;
+        var region = null;
+        var rectangle = null;
+
+        //判断城市限定参数
+        if (options.region) {
+          region = options.region;
+        }
+
+        //矩形限定坐标(暂时只支持字符串格式)
+        if (options.rectangle) {
+          rectangle = options.rectangle;
+        }
+
+        var locationsuccess = function (result) {        
+          if (region && !rectangle) {
+            //城市限定参数拼接
+            requestParam.boundary = "region(" + region + "," + auto_extend + "," + result.latitude + "," + result.longitude + ")";
+            if (options.sig) {
+              requestParam.sig = Utils.getSig(requestParam, options.sig, 'search');
+            }
+          } else if (rectangle && !region) {
+            //矩形搜索
+            requestParam.boundary = "rectangle(" + rectangle + ")";
+            if (options.sig) {
+              requestParam.sig = Utils.getSig(requestParam, options.sig, 'search');
+            }
+            } else {
+              requestParam.boundary = "nearby(" + result.latitude + "," + result.longitude + "," + distance + "," + auto_extend + ")";
+            if (options.sig) {
+              requestParam.sig = Utils.getSig(requestParam, options.sig, 'search');
+            }
+            }            
+            wx.request(Utils.buildWxRequestConfig(options, {
+                url: URL_SEARCH,
+                data: requestParam
+            }, 'search'));
+        };
+        Utils.locationProcess(options, locationsuccess);
+    };
+
+    /**
+     * sug模糊检索
+     *
+     * @param {Object} options 接口参数对象
+     * 
+     * 参数对象结构可以参考
+     * http://lbs.qq.com/webservice_v1/guide-suggestion.html
+     */
+    getSuggestion(options) {
+        var that = this;
+        options = options || {};
+        Utils.polyfillParam(options);
+
+        if (!Utils.checkKeyword(options)) {
+            return;
+        }
+
+        var requestParam = {
+            keyword: options.keyword,
+            region: options.region || '全国',
+            region_fix: options.region_fix || 0,
+            policy: options.policy || 0,
+            page_size: options.page_size || 10,//控制显示条数
+            page_index: options.page_index || 1,//控制页数
+            get_subpois : options.get_subpois || 0,//返回子地点
+            output: 'json',
+            key: that.key
+        };
+        //长地址
+        if (options.address_format) {
+          requestParam.address_format = options.address_format;
+        }
+        //过滤
+        if (options.filter) {
+          requestParam.filter = options.filter;
+        }
+        //排序
+        if (options.location) {
+          var locationsuccess = function (result) {
+            requestParam.location = result.latitude + ',' + result.longitude;
+            if (options.sig) {
+              requestParam.sig = Utils.getSig(requestParam, options.sig, 'suggest');
+            }
+            wx.request(Utils.buildWxRequestConfig(options, {
+              url: URL_SUGGESTION,
+              data: requestParam
+            }, "suggest"));      
+          };
+          Utils.locationProcess(options, locationsuccess);
+        } else {
+          if (options.sig) {
+            requestParam.sig = Utils.getSig(requestParam, options.sig, 'suggest');
+          }
+          wx.request(Utils.buildWxRequestConfig(options, {
+            url: URL_SUGGESTION,
+            data: requestParam
+          }, "suggest"));      
+        }        
+    };
+
+    /**
+     * 逆地址解析
+     *
+     * @param {Object} options 接口参数对象
+     * 
+     * 请求参数结构可以参考
+     * http://lbs.qq.com/webservice_v1/guide-gcoder.html
+     */
+    reverseGeocoder(options) {
+        var that = this;
+        options = options || {};
+        Utils.polyfillParam(options);
+        var requestParam = {
+            coord_type: options.coord_type || 5,
+            get_poi: options.get_poi || 0,
+            output: 'json',
+            key: that.key
+        };
+        if (options.poi_options) {
+            requestParam.poi_options = options.poi_options
+        }
+
+        var locationsuccess = function (result) {
+            requestParam.location = result.latitude + ',' + result.longitude;
+          if (options.sig) {
+            requestParam.sig = Utils.getSig(requestParam, options.sig, 'reverseGeocoder');
+          }
+            wx.request(Utils.buildWxRequestConfig(options, {
+                url: URL_GET_GEOCODER,
+                data: requestParam
+            }, 'reverseGeocoder'));
+        };
+        Utils.locationProcess(options, locationsuccess);
+    };
+
+    /**
+     * 地址解析
+     *
+     * @param {Object} options 接口参数对象
+     * 
+     * 请求参数结构可以参考
+     * http://lbs.qq.com/webservice_v1/guide-geocoder.html
+     */
+    geocoder(options) {
+        var that = this;
+        options = options || {};
+        Utils.polyfillParam(options);
+
+        if (Utils.checkParamKeyEmpty(options, 'address')) {
+            return;
+        }
+
+        var requestParam = {
+            address: options.address,
+            output: 'json',
+            key: that.key
+        };
+
+        //城市限定
+        if (options.region) {
+          requestParam.region = options.region;
+        }
+
+        if (options.sig) {
+          requestParam.sig = Utils.getSig(requestParam, options.sig, 'geocoder');
+        }
+
+        wx.request(Utils.buildWxRequestConfig(options, {
+            url: URL_GET_GEOCODER,
+            data: requestParam
+        },'geocoder'));
+    };
+
+
+    /**
+     * 获取城市列表
+     *
+     * @param {Object} options 接口参数对象
+     * 
+     * 请求参数结构可以参考
+     * http://lbs.qq.com/webservice_v1/guide-region.html
+     */
+    getCityList(options) {
+        var that = this;
+        options = options || {};
+        Utils.polyfillParam(options);
+        var requestParam = {
+            output: 'json',
+            key: that.key
+        };
+
+        if (options.sig) {
+          requestParam.sig = Utils.getSig(requestParam, options.sig, 'getCityList');
+        }
+
+        wx.request(Utils.buildWxRequestConfig(options, {
+            url: URL_CITY_LIST,
+            data: requestParam
+        },'getCityList'));
+    };
+
+    /**
+     * 获取对应城市ID的区县列表
+     *
+     * @param {Object} options 接口参数对象
+     * 
+     * 请求参数结构可以参考
+     * http://lbs.qq.com/webservice_v1/guide-region.html
+     */
+    getDistrictByCityId(options) {
+        var that = this;
+        options = options || {};
+        Utils.polyfillParam(options);
+
+        if (Utils.checkParamKeyEmpty(options, 'id')) {
+            return;
+        }
+
+        var requestParam = {
+            id: options.id || '',
+            output: 'json',
+            key: that.key
+        };
+
+        if (options.sig) {
+          requestParam.sig = Utils.getSig(requestParam, options.sig, 'getDistrictByCityId');
+        }
+
+        wx.request(Utils.buildWxRequestConfig(options, {
+            url: URL_AREA_LIST,
+            data: requestParam
+        },'getDistrictByCityId'));
+    };
+
+    /**
+     * 用于单起点到多终点的路线距离(非直线距离)计算:
+     * 支持两种距离计算方式:步行和驾车。
+     * 起点到终点最大限制直线距离10公里。
+     *
+     * 新增直线距离计算。
+     * 
+     * @param {Object} options 接口参数对象
+     * 
+     * 请求参数结构可以参考
+     * http://lbs.qq.com/webservice_v1/guide-distance.html
+     */
+    calculateDistance(options) {
+        var that = this;
+        options = options || {};
+        Utils.polyfillParam(options);
+
+        if (Utils.checkParamKeyEmpty(options, 'to')) {
+            return;
+        }
+
+        var requestParam = {
+            mode: options.mode || 'walking',
+            to: Utils.location2query(options.to),
+            output: 'json',
+            key: that.key
+        };
+
+        if (options.from) {
+          options.location = options.from;
+        }
+
+        //计算直线距离
+        if(requestParam.mode == 'straight'){        
+          var locationsuccess = function (result) {
+            var locationTo = Utils.getEndLocation(requestParam.to);//处理终点坐标
+            var data = {
+              message:"query ok",
+              result:{
+                elements:[]
+              },
+              status:0
+            };
+            for (var i = 0; i < locationTo.length; i++) {
+              data.result.elements.push({//将坐标存入
+                distance: Utils.getDistance(result.latitude, result.longitude, locationTo[i].lat, locationTo[i].lng),
+                duration:0,
+                from:{
+                  lat: result.latitude,
+                  lng:result.longitude
+                },
+                to:{
+                  lat: locationTo[i].lat,
+                  lng: locationTo[i].lng
+                }
+              });            
+            }
+            var calculateResult = data.result.elements;
+            var distanceResult = [];
+            for (var i = 0; i < calculateResult.length; i++) {
+              distanceResult.push(calculateResult[i].distance);
+            }  
+            return options.success(data,{
+              calculateResult: calculateResult,
+              distanceResult: distanceResult
+            });
+          };
+          
+          Utils.locationProcess(options, locationsuccess);
+        } else {
+          var locationsuccess = function (result) {
+            requestParam.from = result.latitude + ',' + result.longitude;
+            if (options.sig) {
+              requestParam.sig = Utils.getSig(requestParam, options.sig, 'calculateDistance');
+            }
+            wx.request(Utils.buildWxRequestConfig(options, {
+              url: URL_DISTANCE,
+              data: requestParam
+            },'calculateDistance'));
+          };
+
+          Utils.locationProcess(options, locationsuccess);
+        }      
+    };
+
+  /**
+   * 路线规划:
+   * 
+   * @param {Object} options 接口参数对象
+   * 
+   * 请求参数结构可以参考
+   * https://lbs.qq.com/webservice_v1/guide-road.html
+   */
+  direction(options) {
+    var that = this;
+    options = options || {};
+    Utils.polyfillParam(options);
+
+    if (Utils.checkParamKeyEmpty(options, 'to')) {
+      return;
+    }
+
+    var requestParam = {
+      output: 'json',
+      key: that.key
+    };
+
+    //to格式处理
+    if (typeof options.to == 'string') {
+      requestParam.to = options.to;
+    } else {
+      requestParam.to = options.to.latitude + ',' + options.to.longitude;
+    }
+    //初始化局部请求域名
+    var SET_URL_DIRECTION = null;
+    //设置默认mode属性
+    options.mode = options.mode || MODE.driving;
+
+    //设置请求域名
+    SET_URL_DIRECTION = URL_DIRECTION + options.mode;
+
+    if (options.from) {
+      options.location = options.from;
+    }
+
+    if (options.mode == MODE.driving) {
+      if (options.from_poi) {
+        requestParam.from_poi = options.from_poi;
+      }
+      if (options.heading) {
+        requestParam.heading = options.heading;
+      }
+      if (options.speed) {
+        requestParam.speed = options.speed;
+      }
+      if (options.accuracy) {
+        requestParam.accuracy = options.accuracy;
+      }
+      if (options.road_type) {
+        requestParam.road_type = options.road_type;
+      }
+      if (options.to_poi) {
+        requestParam.to_poi = options.to_poi;
+      }
+      if (options.from_track) {
+        requestParam.from_track = options.from_track;
+      }
+      if (options.waypoints) {
+        requestParam.waypoints = options.waypoints;
+      }
+      if (options.policy) {
+        requestParam.policy = options.policy;
+      }
+      if (options.plate_number) {
+        requestParam.plate_number = options.plate_number;
+      }
+    }
+
+    if (options.mode == MODE.transit) {
+      if (options.departure_time) {
+        requestParam.departure_time = options.departure_time;
+      }
+      if (options.policy) {
+        requestParam.policy = options.policy;
+      }
+    } 
+
+    var locationsuccess = function (result) {
+      requestParam.from = result.latitude + ',' + result.longitude;
+      if (options.sig) {
+        requestParam.sig = Utils.getSig(requestParam, options.sig, 'direction',options.mode);
+      }
+      wx.request(Utils.buildWxRequestConfig(options, {
+        url: SET_URL_DIRECTION,
+        data: requestParam
+      }, 'direction'));
+    };
+
+    Utils.locationProcess(options, locationsuccess);
+  }
+};
+
+module.exports = QQMapWX;

Разница между файлами не показана из-за своего большого размера
+ 0 - 0
uni_merchants_enter/js_sdk/qqmap-wx-jssdk.min.js


+ 50 - 0
uni_merchants_enter/js_sdk/share.js

@@ -0,0 +1,50 @@
+export default {
+	data() {
+		return {
+
+		}
+	},
+	onLoad: function() {
+		wx.showShareMenu({
+			withShareTicket: true,
+			menus: ["shareAppMessage", "shareTimeline"]
+		})
+	},
+	onShareAppMessage(res) {
+		console.log(1111)
+		let that = this;
+		// let imageUrl = that.shareUrl || '';
+		let imageUrl = 'https://taohaoliang.oss-cn-beijing.aliyuncs.com/pcfiles/min1.png'
+		if (res.from === 'button') {
+			console.log(2222)
+		//这块需要传参,不然链接地址进去获取不到数据
+			// let path = `/` + that.$scope.route + `?item=` + that.$scope.options.item;
+			let path = `/pages/cardHolder/scanCodeAddCard`
+			return {
+				title: '商品分享~',
+				path: path,
+				imageUrl: imageUrl,
+				content:'这里是分享内容啊!',
+				desc:"这里是自定义描述啊!"
+			};
+		}
+		if (res.from === 'menu') {
+			return {
+				title: '商通线上商城',
+				path: '/pages/tabBarPro/index/index',
+				imageUrl: imageUrl
+			};
+		}
+	},
+	// 分享到朋友圈
+	onShareTimeline() {
+		return {
+			title: '名片box',
+			path: '/pages/cardHolder/cardHolder',
+			imageUrl: 'https://taohaoliang.oss-cn-beijing.aliyuncs.com/pcfiles/%E5%90%8D%E7%89%87box.png'
+		};
+	},
+	methods: {
+
+	}
+}

+ 272 - 0
uni_merchants_enter/js_sdk/wa-permission/permission.js

@@ -0,0 +1,272 @@
+/**
+ * 本模块封装了Android、iOS的应用权限判断、打开应用权限设置界面、以及位置系统服务是否开启
+ */
+
+var isIos
+// #ifdef APP-PLUS
+isIos = (plus.os.name == "iOS")
+// #endif
+
+// 判断推送权限是否开启
+function judgeIosPermissionPush() {
+	var result = false;
+	var UIApplication = plus.ios.import("UIApplication");
+	var app = UIApplication.sharedApplication();
+	var enabledTypes = 0;
+	if (app.currentUserNotificationSettings) {
+		var settings = app.currentUserNotificationSettings();
+		enabledTypes = settings.plusGetAttribute("types");
+		console.log("enabledTypes1:" + enabledTypes);
+		if (enabledTypes == 0) {
+			console.log("推送权限没有开启");
+		} else {
+			result = true;
+			console.log("已经开启推送功能!")
+		}
+		plus.ios.deleteObject(settings);
+	} else {
+		enabledTypes = app.enabledRemoteNotificationTypes();
+		if (enabledTypes == 0) {
+			console.log("推送权限没有开启!");
+		} else {
+			result = true;
+			console.log("已经开启推送功能!")
+		}
+		console.log("enabledTypes2:" + enabledTypes);
+	}
+	plus.ios.deleteObject(app);
+	plus.ios.deleteObject(UIApplication);
+	return result;
+}
+
+// 判断定位权限是否开启
+function judgeIosPermissionLocation() {
+	var result = false;
+	var cllocationManger = plus.ios.import("CLLocationManager");
+	var status = cllocationManger.authorizationStatus();
+	result = (status != 2)
+	console.log("定位权限开启:" + result);
+	// 以下代码判断了手机设备的定位是否关闭,推荐另行使用方法 checkSystemEnableLocation
+	/* var enable = cllocationManger.locationServicesEnabled();
+	var status = cllocationManger.authorizationStatus();
+	console.log("enable:" + enable);
+	console.log("status:" + status);
+	if (enable && status != 2) {
+		result = true;
+		console.log("手机定位服务已开启且已授予定位权限");
+	} else {
+		console.log("手机系统的定位没有打开或未给予定位权限");
+	} */
+	plus.ios.deleteObject(cllocationManger);
+	return result;
+}
+
+// 判断麦克风权限是否开启
+function judgeIosPermissionRecord() {
+	var result = false;
+	var avaudiosession = plus.ios.import("AVAudioSession");
+	var avaudio = avaudiosession.sharedInstance();
+	var permissionStatus = avaudio.recordPermission();
+	console.log("permissionStatus:" + permissionStatus);
+	if (permissionStatus == 1684369017 || permissionStatus == 1970168948) {
+		console.log("麦克风权限没有开启");
+	} else {
+		result = true;
+		console.log("麦克风权限已经开启");
+	}
+	plus.ios.deleteObject(avaudiosession);
+	return result;
+}
+
+// 判断相机权限是否开启
+function judgeIosPermissionCamera() {
+	var result = false;
+	var AVCaptureDevice = plus.ios.import("AVCaptureDevice");
+	var authStatus = AVCaptureDevice.authorizationStatusForMediaType('vide');
+	console.log("authStatus:" + authStatus);
+	if (authStatus == 3) {
+		result = true;
+		console.log("相机权限已经开启");
+	} else {
+		console.log("相机权限没有开启");
+	}
+	plus.ios.deleteObject(AVCaptureDevice);
+	return result;
+}
+
+// 判断相册权限是否开启
+function judgeIosPermissionPhotoLibrary() {
+	var result = false;
+	var PHPhotoLibrary = plus.ios.import("PHPhotoLibrary");
+	var authStatus = PHPhotoLibrary.authorizationStatus();
+	console.log("authStatus:" + authStatus);
+	if (authStatus == 3) {
+		result = true;
+		console.log("相册权限已经开启");
+	} else {
+		console.log("相册权限没有开启");
+	}
+	plus.ios.deleteObject(PHPhotoLibrary);
+	return result;
+}
+
+// 判断通讯录权限是否开启
+function judgeIosPermissionContact() {
+	var result = false;
+	var CNContactStore = plus.ios.import("CNContactStore");
+	var cnAuthStatus = CNContactStore.authorizationStatusForEntityType(0);
+	if (cnAuthStatus == 3) {
+		result = true;
+		console.log("通讯录权限已经开启");
+	} else {
+		console.log("通讯录权限没有开启");
+	}
+	plus.ios.deleteObject(CNContactStore);
+	return result;
+}
+
+// 判断日历权限是否开启
+function judgeIosPermissionCalendar() {
+	var result = false;
+	var EKEventStore = plus.ios.import("EKEventStore");
+	var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(0);
+	if (ekAuthStatus == 3) {
+		result = true;
+		console.log("日历权限已经开启");
+	} else {
+		console.log("日历权限没有开启");
+	}
+	plus.ios.deleteObject(EKEventStore);
+	return result;
+}
+
+// 判断备忘录权限是否开启
+function judgeIosPermissionMemo() {
+	var result = false;
+	var EKEventStore = plus.ios.import("EKEventStore");
+	var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(1);
+	if (ekAuthStatus == 3) {
+		result = true;
+		console.log("备忘录权限已经开启");
+	} else {
+		console.log("备忘录权限没有开启");
+	}
+	plus.ios.deleteObject(EKEventStore);
+	return result;
+}
+
+// Android权限查询
+function requestAndroidPermission(permissionID) {
+	return new Promise((resolve, reject) => {
+		plus.android.requestPermissions(
+			[permissionID], // 理论上支持多个权限同时查询,但实际上本函数封装只处理了一个权限的情况。有需要的可自行扩展封装
+			function(resultObj) {
+				var result = 0;
+				for (var i = 0; i < resultObj.granted.length; i++) {
+					var grantedPermission = resultObj.granted[i];
+					console.log('已获取的权限:' + grantedPermission);
+					result = 1
+				}
+				for (var i = 0; i < resultObj.deniedPresent.length; i++) {
+					var deniedPresentPermission = resultObj.deniedPresent[i];
+					console.log('拒绝本次申请的权限:' + deniedPresentPermission);
+					result = 0
+				}
+				for (var i = 0; i < resultObj.deniedAlways.length; i++) {
+					var deniedAlwaysPermission = resultObj.deniedAlways[i];
+					console.log('永久拒绝申请的权限:' + deniedAlwaysPermission);
+					result = -1
+				}
+				resolve(result);
+				// 若所需权限被拒绝,则打开APP设置界面,可以在APP设置界面打开相应权限
+				// if (result != 1) {
+				// gotoAppPermissionSetting()
+				// }
+			},
+			function(error) {
+				console.log('申请权限错误:' + error.code + " = " + error.message);
+				resolve({
+					code: error.code,
+					message: error.message
+				});
+			}
+		);
+	});
+}
+
+// 使用一个方法,根据参数判断权限
+function judgeIosPermission(permissionID) {
+	if (permissionID == "location") {
+		return judgeIosPermissionLocation()
+	} else if (permissionID == "camera") {
+		return judgeIosPermissionCamera()
+	} else if (permissionID == "photoLibrary") {
+		return judgeIosPermissionPhotoLibrary()
+	} else if (permissionID == "record") {
+		return judgeIosPermissionRecord()
+	} else if (permissionID == "push") {
+		return judgeIosPermissionPush()
+	} else if (permissionID == "contact") {
+		return judgeIosPermissionContact()
+	} else if (permissionID == "calendar") {
+		return judgeIosPermissionCalendar()
+	} else if (permissionID == "memo") {
+		return judgeIosPermissionMemo()
+	}
+	return false;
+}
+
+// 跳转到**应用**的权限页面
+function gotoAppPermissionSetting() {
+	if (isIos) {
+		var UIApplication = plus.ios.import("UIApplication");
+		var application2 = UIApplication.sharedApplication();
+		var NSURL2 = plus.ios.import("NSURL");
+		// var setting2 = NSURL2.URLWithString("prefs:root=LOCATION_SERVICES");		
+		var setting2 = NSURL2.URLWithString("app-settings:");
+		application2.openURL(setting2);
+
+		plus.ios.deleteObject(setting2);
+		plus.ios.deleteObject(NSURL2);
+		plus.ios.deleteObject(application2);
+	} else {
+		// console.log(plus.device.vendor);
+		var Intent = plus.android.importClass("android.content.Intent");
+		var Settings = plus.android.importClass("android.provider.Settings");
+		var Uri = plus.android.importClass("android.net.Uri");
+		var mainActivity = plus.android.runtimeMainActivity();
+		var intent = new Intent();
+		intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
+		var uri = Uri.fromParts("package", mainActivity.getPackageName(), null);
+		intent.setData(uri);
+		mainActivity.startActivity(intent);
+	}
+}
+
+// 检查系统的设备服务是否开启
+// var checkSystemEnableLocation = async function () {
+function checkSystemEnableLocation() {
+	if (isIos) {
+		var result = false;
+		var cllocationManger = plus.ios.import("CLLocationManager");
+		var result = cllocationManger.locationServicesEnabled();
+		console.log("系统定位开启:" + result);
+		plus.ios.deleteObject(cllocationManger);
+		return result;
+	} else {
+		var context = plus.android.importClass("android.content.Context");
+		var locationManager = plus.android.importClass("android.location.LocationManager");
+		var main = plus.android.runtimeMainActivity();
+		var mainSvr = main.getSystemService(context.LOCATION_SERVICE);
+		var result = mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER);
+		console.log("系统定位开启:" + result);
+		return result
+	}
+}
+
+module.exports = {
+	judgeIosPermission: judgeIosPermission,
+	requestAndroidPermission: requestAndroidPermission,
+	checkSystemEnableLocation: checkSystemEnableLocation,
+	gotoAppPermissionSetting: gotoAppPermissionSetting
+}

+ 594 - 0
uni_merchants_enter/js_sdk/xfl-DateFormat/DateFormat.js

@@ -0,0 +1,594 @@
+
+
+/**
+ * 日期格式转换模块,还可以从字符串中提取日期,同时提供了几个数字格式转换函数。 
+ * 2019.5.12  v1.0.0
+ * 
+## 背景
+当需要将日期转换为指定的格式时,或者需要从某个字符串中按照指定的格式提取日期,均可使用本模块。
+
+## 使用说明  
+格式标记的含意:   
+yyyy-四位阿拉伯数字的年份,如: 2018  
+YYYY-四位中文数字的年份,如: 二零一八  
+yy-两位阿拉伯数字的年份,如: 18  
+YY-两位中文数字的年份,如: 一八  
+mm-一位或两位阿拉伯数字的月数,如: 3 、 12   
+0m-两位阿拉伯数字的月数,如: 03 、 12  
+MM-一位或两位中文数字的月数,如:  三、 十二   
+dd-一位或两位阿拉伯数字的日数,如: 3 、 12   
+0d-两位阿拉伯数字的日数,如: 03 、 12、28   
+DD-中文数字的日数,如:  三、 十二、二十八   
+hh-一位或两位阿拉伯数字的小时数,如: 3 、 12   
+0h-两位阿拉伯数字的小时数,如: 03 、 12   
+HH-中文数字的小时数,如:  三、 十二、二十三   
+ff-一位或两位阿拉伯数字的分钟数,如: 3 、 12、56  
+0f-两位阿拉伯数字的分钟数,如: 03 、 12  
+0F-中文数字的分钟,如:  零三、 十二、二十三  
+FF-中文数字的分钟,如:  三、 十二、二十三   
+ss-一位或两位阿拉伯数字的秒数,如: 3 、 12   
+0s-两位阿拉伯数字的秒数,如: 03 、 12   
+0S-中文数字的秒数,如:  零三、 十二、二十三   
+SS-中文数字的秒数,如:  三、 十二、二十三   
+w-阿拉伯数字的星期数,如:  1、6、7  
+W-中文数字的星期数,如:  一、三、六、日   
+WT-中文数字的星期数,如:  一、三、六、天   
+  
+### 属性  
+这些属性是可读可写的,如果直接更改,则会自动计算其关联的其它值。  
+dataformat.year; //年 [1000, 3000]  
+dataformat.moth; //月 [1, 12]  
+dataformat.day; //日 [1, 31]  
+dataformat.hour; //时 [0, 23]  
+dataformat.minute; //分 [0, 59]  
+dataformat.second; //秒 [0, 59]  
+dataformat.mscond; //毫秒 [0, 999]  
+dataformat.week; //星期 [1, 7]  
+dataformat.timestamp; //时间戳  
+
+### 构造函数
+构造函数内部直接调用的 setTime(ms, formatStr);
+  
+### toString(formatStr)  
+  
+使用举例:   
+1. toString() //结果: '2014-11-7 03:08:01'  
+2. toString('yyyy-mm-dd hh:ff:ss') //结果: '2014-11-11 13:12:34'  
+3. toString('yyyy年mm月dd日') //结果: '2014年11月11日'  
+4. toString('yy年mm月dd日') //结果: '14年11月11日'  
+5. toString('YY年MM月DD日') //结果: '一四年十一月八日'  
+6. toString('星期W') //结果: '星期日'  或 '星期三'
+7. toString('星期WT')  //结果: '星期天'  或 '星期三'
+8. toString('星期w') //结果: '星期1'   或 '星期7'
+9. toString('hh:0f:ss') //结果: '3:04:5'  
+10. toString('date') //结果: '2014-11-7'  
+11. toString('time') //结果: '03:08:01'  
+  
+### setTime(ms, formtStr)  
+设置时间。如果存在 formatStr, 则表示从字符串 ms 中按 formatStr中的规则提取时间。  
+  
+使用举例:  
+1. setTime( new Date() ); //传入一个时间对象  
+2. setTime( new Date().getTime() ); //传入一个毫秒数  
+3. setTime( new Date().getTime() ); //传入一个毫秒数  
+4. setTime( new Date().getTime() + '' ); //传入一个毫秒数的字符串  
+5. setTime(); //传入其它的值或不传入,则创建当前时间  
+6. setTime(str, formatStr); //传入两个参数,第一个为字符串,第二个为格式规则,表示按照规则从字符串中提取时间  
+7. setTime('今天是2014年8月9号,天气特别好,但明天是2014年8月10号,....', '明天是yyyy年mm月dd号');  // 得到  2014.8.10 0:0:0
+  
+### fillChar(num, len, char)  
+字符填充  
+  
+使用举例:   
+1. fillChar(44, 5, '*'); //结果: '***44'   
+2. fillChar(44, 5); //结果: '00044'   
+3. fillChar('44', 5); //结果: '   44'   
+4. fillChar('aaa', 5); //结果: '   aa'   
+5. fillChar('aaa', 5, '$'); //结果: '$$aaa'   
+5. fillChar('aaa', 1, '$'); //结果: 'aaa'  //指定的长度太小,不做任何操作。  
+  
+### perNumToChinese(num)  
+将阿拉伯数字每一位对应转换为中文的格式。  
+  
+使用举例:   
+1. perNumToChinese(34); //结果: '三四'  
+2. perNumToChinese(3874); //结果: '三八七四'  
+3. perNumToChinese('3874'); //结果: '三八七四'  
+4. perNumToChinese('404'); //结果: '四零四'    
+5. perNumToChinese('0  04   '); //结果: '零零四'  
+6. perNumToChinese('  '); //结果: ''  
+  
+### perChineseToNum(numStr)
+将中文的格式的数字每一位对应转换为阿拉伯数字。 是perNumToChinese(num)的逆操作。  
+  
+使用举例:   
+1. perChineseToNum('三四'); //结果: 34  
+2. perChineseToNum('三八七四'); //结果: 3874  
+3. perChineseToNum('四零四'); //结果: 404  
+4. perChineseToNum('零零四'); //结果: 4  
+5. perChineseToNum('  '); //结果: NaN  
+  
+### numToChinese(num)  
+将阿拉伯数字转换为中文的格式 , 最多只能处理13位数(万亿)  
+  
+使用举例:   
+1. numToChinese(0); //结果: '零'  
+2. numToChinese(5); //结果: '五'  
+3. numToChinese(16); //结果: '十六'  
+4. numToChinese(34); //结果: '三十四'  
+5. numToChinese(106); //结果: '一百零六'  
+6. numToChinese(886); //结果: '八百八十六'  
+7. numToChinese(1004); //结果: '一千零四'  
+8. numToChinese(1000); //结果: '一千'  
+9. numToChinese(9904); //结果: '九千九百零四'  
+10. numToChinese(19904); //结果: '一万九千九百零四'  
+11. numToChinese(10004); //结果: '一万零四'  
+12. numToChinese(10000); //结果: '一万'  
+13. numToChinese(100404); //结果: '十万零四百零四'  
+14. numToChinese(9000000); //结果: '九百万'  
+15. numToChinese(90000000); //结果: '九千万'  
+16. numToChinese(900000000); //结果: '九亿'  
+17. numToChinese(9000000000); //结果: '九十亿'  
+18. numToChinese(9020030401); //结果: '九十亿零二千零三万零四百零一'  
+19. numToChinese(90000000000); //结果: '九百亿'  
+20. numToChinese(900000000000); //结果: '九千亿'  
+21. numToChinese(9000000000000); //结果: '九万亿'  
+22. numToChinese(90000000000000); //结果: undefined  
+  
+  
+### chineseToNum (numStr)
+将中文的格式的数字转换为阿拉伯数字, 最多只能处理13位数(万亿)。 是 numToChinese(num) 函数的逆操作。  
+  
+使用举例:   
+1. chineseToNum('十六'); //结果: 16  
+2. chineseToNum('一万九千九百零四'); //结果: 19904  
+3. chineseToNum('十万零四百零四'); //结果: 100404   
+4. chineseToNum('九十亿零二千零三万零四百零一'); //结果: 9020030401  
+ */
+export default class DateFormat{
+    constructor(ms, formatStr){
+        this.setTime(ms, formatStr);
+    }
+
+    set year(y){ if(this.y !== y){ this.__date.setFullYear(y); this.setTime(this.__date); }  }
+    get year(){ return this.y; }
+
+    set month(y){ if(this.m !== y){ this.__date.setMonth(y-1); this.setTime(this.__date); }  }
+    get month(){ return this.m; }
+
+    set day(y){ if(this.d !== y){ this.__date.setDate(y); this.setTime(this.__date); }  }
+    get day(){ return this.d; }
+
+    set hour(y){ if(this.h !== y){ this.__date.setHours(y); this.setTime(this.__date); }  }
+    get hour(){ return this.h; }
+
+    set minute(y){ if(this.f !== y){ this.__date.setMinutes(y); this.setTime(this.__date); }  }
+    get minute(){ return this.f; }
+
+    set second(y){ if(this.s !== y){ this.__date.setSeconds(y); this.setTime(this.__date); }  }
+    get second(){ return this.s; }
+
+    set msecond(y){ if(this.ms !== y){ this.__date.setMilliseconds(y); this.setTime(this.__date); }  }
+    get msecond(){ return this.ms; }
+
+    get week(){ return this.w; }
+
+     setTime(ms, formatStr){  //切换时间
+        if(formatStr && typeof ms === 'string'){
+            let result;
+            if(this.__analysis){
+                result = this.__analysis(ms, formatStr);
+            }
+            if(!result){
+                console.log('匹配时间失败,默认设置为当前时间');
+                ms = '';
+            }else{
+                ms = result;
+            }
+        }
+        let date;
+        if(ms instanceof Date){
+            date = ms;
+        }else if(typeof ms === 'number'){
+            date = new Date(ms);
+        }else if( parseInt(ms) > 0 ){
+            date = new Date(parseInt(ms));
+        }else{
+            if(typeof ms === 'object' && ms.y && ms.m && ms.d){
+                date = new Date(ms.y, ms.m-1, ms.d, ms.h || 0, ms.f || 0, ms.s || 0, ms.ms || 0);
+            }else{
+                date = new Date();
+            }
+        }
+
+        this.y = date.getFullYear(), //年 [1000, 3000]
+        this.m = date.getMonth() + 1, //月 [1, 12]
+        this.d = date.getDate(), //日 [1, 31]
+        this.h = date.getHours(), //时 [0, 23]
+        this.f = date.getMinutes(), //分 [0, 59]
+        this.s = date.getSeconds(), //秒 [0, 59]
+        this.ms = date.getMilliseconds(), //秒 [0, 9999]
+        this.w = date.getDay(); //星期 [1, 7]
+        if(this.w === 0){  //0表示星期天
+            this.w = 7;
+        }
+        this.timestamp = date.getTime(); //时间戳
+
+        this.__date = date;
+        
+        return this;
+     }
+
+/***************************************************** 时间格式化 *********************************************** */
+     toString(formatStr){  //将时间转换为格式的字符串
+         if(formatStr){
+            if(formatStr === 'time'){
+                //03:00:01
+                return this.fillChar(this.h, 2) + ':' + this.fillChar(this.f, 2) + ':' + this.fillChar(this.s, 2);
+            }else if(formatStr === 'date'){
+                //2014-11-7
+                return this.y + '-' + this.m + '-' + this.d;
+            }else{
+               return this.__replaceTime(formatStr);
+            }
+            
+        }else{
+            //2014-11-7 03:00:01
+            return this.y + '-' + this.m + '-' + this.d + ' ' + this.fillChar(this.h, 2) + ':' + this.fillChar(this.f, 2) + ':' + this.fillChar(this.s, 2);
+        }
+     }
+
+     valueOf(){
+         return this.toString();
+     }
+ 
+     __replaceTime(format){
+        var str = 
+        'y{4}|Y{4}|y{2}|Y{2}|mm|MM|0m|dd|DD|0d|hh|HH|0h|ff|FF|0F|0f|ss|SS|0S|0s|w|WT|W';
+        var reg = new RegExp(str, 'g');
+
+
+        format = format.replace(reg, (mstr)=>{
+           switch(mstr){
+              case 'yyyy': return this.y;                        // [0000, 9999]
+              case 'YYYY': return this.perNumToChinese(this.y);  // [零零零零-九九九九]   
+              case 'yy': return ('' + this.y).slice(-2);         // [00, 99]
+              case 'YY': return this.perNumToChinese( +('' + this.y).slice(-2) ); // [零零-九九]    
+              case 'mm': return this.m;                          // [1, 12]
+              case 'MM': return this.numToChinese(this.m);       // [一-十二]    
+              case '0m': return this.m < 10 ? '0'+ this.m : this.m; // [01, 12]
+              case 'dd': return this.d;                          // [1, 31]
+              case 'DD': return this.numToChinese(this.d);       // [一-三十一]  
+              case '0d': return this.d < 10 ? '0' + this.d : this.d; // [01, 31]
+              case 'hh': return this.h;                          // [0, 24]
+              case 'HH': return this.numToChinese(this.h);       // [零-二十四]  
+              case '0h': return this.h < 10 ? '0' + this.h : this.h; // [00, 24]
+              case 'ff': return this.f;                          // [0, 60]
+              case 'FF': return this.numToChinese(this.f);       // [零-六十]
+              case '0F': return this.f<10&&this.f>0 ? ('零' + this.numToChinese(this.f) ):this.numToChinese(this.f); // [零零-六十]   
+              case '0f': return this.f < 10 ? '0' + this.f : this.f; // [00, 60]
+              case 'ss': return this.s;                          // [0, 60]
+              case 'SS': return this.numToChinese(this.s);       // [零-六十]
+              case '0S': return this.s<10&&this.s>0 ? ('零' + this.numToChinese(this.s) ):this.numToChinese(this.s); // [零零-六十]    
+              case '0s': return this.s < 10 ? '0' + this.s : this.s;  // [00, 60]
+              case 'w': return this.w;                           // [7]
+              case 'W': return this.w == 7 ? '日' : this.numToChinese(this.w);  // [天|日]
+              case 'WT': return this.w == 7 ? '天' : this.numToChinese(this.w);  // [天|日]
+           }
+        });
+         return format;
+     }
+
+/***************************************************** 时间提取 *********************************************** */
+     __analysis(str, rule){  //从指定的字符串中根据规则提取日期和时间。
+         let resultObj;
+        if(typeof rule === 'function'){
+            resultObj = rule(str);
+            if(!resultObj){
+                return null;
+            }
+        }else{
+            resultObj = {};
+            var str11 = 
+            'y{4}|Y{4}|y{2}|Y{2}|mm|MM|0m|dd|DD|0d|hh|HH|0h|ff|FF|0F|0f|ss|SS|0S|0s|w|WT|W';
+            var reg = new RegExp(str11, 'g');
+
+            // rule = 'yyyy年mm月'
+            var namesArr = [null];   // [null, 'yyyy', 'mm']
+            rule = rule.replace(reg, (mstr)=>{
+                var result = this.__ANALYREGSTR[mstr];
+                if(result){
+                    namesArr.push(mstr);
+                    return `(${result})`;
+                }
+             });
+            //  rule = '(\\d{4})年([1-9]|1[012])月'
+
+            var resultArr = str.match( new RegExp(rule) );
+             if(resultArr){
+                for(let i=1,val; i<namesArr.length; i++){
+                    val = resultArr[i];
+                    if(val == null){
+                        continue;
+                    }
+                    switch(namesArr[i]){
+                        case 'yyyy': resultObj.y = +val; break;                        // [0000, 9999]
+                        case 'YYYY': resultObj.y = this.perChineseToNum(val); break;   // [零零零零-九九九九]   
+                        case 'yy': resultObj.y = +val + 2000; break;          // [00, 99]
+                        case 'YY': resultObj.y = this.perChineseToNum(val) + 2000; break;  // [零零-九九]    
+                        case 'mm': resultObj.m = +val;    break;                        // [1, 12]
+                        case 'MM': resultObj.m = this.chineseToNum(val);  break;       // [一-十二]    
+                        case '0m': resultObj.m = +val;  break; // [01, 12]
+                        case 'dd': resultObj.d = +val; break;                           // [1, 31]
+                        case 'DD': resultObj.d = this.chineseToNum(val); break;        // [一-三十一]  
+                        case '0d': resultObj.d = +val; break;  // [01, 31]
+                        case 'hh': resultObj.h = +val;  break;                           // [0, 24]
+                        case 'HH': resultObj.h = this.chineseToNum(val); break;        // [零-二十四]  
+                        case '0h': resultObj.h = +val; break;  // [00, 24]
+                        case 'ff': resultObj.f = +val;   break;                         // [0, 60]
+                        case 'FF': resultObj.f = this.chineseToNum(val); break;        // [零-六十]
+                        case '0F': resultObj.f = this.chineseToNum(val); break;  // [零零-六十]   
+                        case '0f': resultObj.f = +val; break;   // [00, 60]
+                        case 'ss': resultObj.s = +val;   break;                         // [0, 60]
+                        case 'SS': resultObj.s = this.chineseToNum(val);  break;       // [零-六十]
+                        case '0S': resultObj.s = this.chineseToNum(val); break;  // [零零-六十]    
+                        case '0s': resultObj.s = +val; break;    // [00, 60]
+                        case 'w': resultObj.w = 7; break;                             // [7]
+                        case 'W': resultObj.w = 7; break;      // [天|日]
+                        case 'WT': resultObj.w = 7; break;      // [天|日]
+                    }
+                }
+             }else{
+                return null;
+             }
+             
+        }
+        //   'yyyy年mm月'  '(\\d{4})年([1-9]|1[012])月'
+        return resultObj;
+     }
+
+     __ANALYREGSTR = {
+         'yyyy': '\\d{4}',                   // [0000, 9999]
+         'YYYY': '[零一二三四五六七八九]{4}',              // [零零零零-九九九九]    
+         'yy': '\\d{2}',                     // [00, 99]
+         'YY': '[零一二三四五六七八九]{2}',                // [零零-九九]    
+         'mm': '[1-9]|1[012]',               // [1, 12]
+         'MM': '十[一二]?|[一二三四五六七八九]',// [一-十二]    
+         '0m': '[0][1-9]|1[012]',             // [01, 12]
+         'dd': '3[01]|[12]0|[12]?[1-9]',            //  [1, 31]
+         'DD': '三十[一]?|二?十[一二三四五六七八九]|[零一二三四五六七八九十]',     // [一-三十一]  
+         '0d': '[012][0-9]|3[01]',            //  [01, 31]
+         'hh': '2[0-4]|[1]?[0-9]',            //  [0, 24]
+         'HH': '二十[一二三]?|十[一二三四五六七八九]|[零一二三四五六七八九十]',   // [零-二十四]  
+         '0h': '[01][0-9]|2[0-4]',             // [00, 24]
+         'ff': '60|[1-5]?[0-9]',               // [0, 60]
+         'FF': '[二三四五]十[一二三四五六七八九]|十[一二三四五六七八九]|[二三四五六]十|[零一二三四五六七八九十]',    // [零-六十]
+         '0F': '零[零一二三四五六七八九]|十[一二三四五六七八九]|[二三四五]十[一二三四五六七八九]|[二三四五六]十|十', // [零零-六十]     
+         '0f': '[0-5][0-9]|60',               // [00, 60]
+         'ss': '60|[1-5]?[0-9]',              // [0, 60]
+         'SS': '[二三四五]十[一二三四五六七八九]|十[一二三四五六七八九]|[二三四五六]十|[零一二三四五六七八九十]',    // [零-六十] 
+         '0S': '零[零一二三四五六七八九]|十[一二三四五六七八九]|[二三四五]十[一二三四五六七八九]|[二三四五六]十|十', // [零零-六十]    
+         '0s': '[0-5][0-9]|60',               // [00, 60]
+         'w': '7',                            // [7]
+         'W': '日',                        //[天|日]
+         'WT': '天',                        //[天|日]
+     }
+
+/***************************************************** 字符填充部分 *********************************************** */
+      /**
+     * 在一个字符前面补充指定个数的字符。
+     * <br><font color="red">ref: null</font> <br>
+     * @public
+     * @param {string|number} num -  要操作的数字或字符串。
+     * @param {number} len -  要保留的最大长度。如果指定的长度不比传入的参数的本身的长度大,则不做任何操作。
+     * @param {string} [char=' '|'0'] -  当长度不足时,要在最前面补足的字符。第一个参数为数字时,默认为0,否则默认为' '。
+     * @example
+       1. fillChar(44, 5, '*'); //结果: '***44' 
+       2. fillChar(44, 5); //结果: '00044' 
+       3. fillChar('44', 5); //结果: '   44' 
+       4. fillChar('aaa', 5); //结果: '   aa' 
+       5. fillChar('aaa', 5, '$'); //结果: '$$aaa' 
+       5. fillChar('aaa', 1, '$'); //结果: 'aaa'  //指定的长度太小,不做任何操作。
+     */
+    fillChar(num, len, char){
+        if(typeof num === 'number'){
+            char = char || '0';
+        }else{
+            char = char || ' ';
+        }
+        let str = '' + num, charStr = '';
+
+        if(str.length < len){
+            for(let i=0, len1=len-str.length; i<len1; i++){
+                charStr += char;
+            }
+            return charStr + str;
+        }
+
+        return str;
+    }
+
+/***************************************************** 数字转换部分 *********************************************** */
+
+    __SIZEPOW = {'十': 1, '百': 2, '千': 3, '万': 4, '亿': 8};
+    /** 
+     * 将中文的格式的数字转换为阿拉伯数字, 最多只能处理13位数(万亿)。 是 numToChinese(num) 函数的逆操作。 
+     *  @example
+        1. chineseToNum('十六'); //结果: 16  
+        2. chineseToNum('一万九千九百零四'); //结果: 19904  
+        3. chineseToNum('十万零四百零四'); //结果: 100404   
+        4. chineseToNum('九十亿零二千零三万零四百零一'); //结果: 9020030401  
+     */
+    chineseToNum (numStr){   //目前只能处理万亿以下的数据
+        if(numStr.length === 1){
+            return this.perChineseToNum(numStr);
+        }
+        if(numStr.length === 2 && numStr[0] === '十'){
+            return this.perChineseToNum(numStr[1]) + 10;
+        }
+
+        let arr;
+        if(!numStr.match(/[亿万]/)){
+            arr = numStr.split('零'); 
+            let num = 0, val = 0;
+            for(let i=0, str=''; i<arr.length; i++){
+                str = arr[i];
+                for(let j=0; j<str.length; j++){
+                    if(str[j].match(/[一二三四五六七八九]/)){
+                        num += val;
+                        val = 1;
+                        val *= this.perChineseToNum(str[j]);
+                    }else{
+                        val *= Math.pow(10, this.__SIZEPOW[str[j]] )
+                    }
+                }
+            }
+            num += val;
+            return num;
+        }else{
+            arr = numStr.split('亿');
+            if(arr.length > 1){
+                var arr1 = arr[1].split('万');
+                return this.chineseToNum(arr[0])*Math.pow(10, 8) + this.chineseToNum(arr1[0])*10000 + this.chineseToNum(arr1[1]);
+            }else{
+                return this.chineseToNum(arr[0])*Math.pow(10, 8) + this.chineseToNum(arr[1]);
+            }
+        }
+    }
+
+     /** 
+     * 将中文的格式的数字每一位对应转换为阿拉伯数字。 是perNumToChinese(num)的逆操作。  
+     *  @example
+    1. perChineseToNum('三四'); //结果: 34  
+    2. perChineseToNum('三八七四'); //结果: 3874  
+    3. perChineseToNum('四零四'); //结果: 404  
+    4. perChineseToNum('零零四'); //结果: 4  
+    5. perChineseToNum('  '); //结果: NaN  
+     */
+    perChineseToNum(numStr){
+        return +numStr.replace(/[零一二三四五六七八九十\s]/g, (str)=>{
+            var index =  this.__CHINANUM.indexOf(str);
+            return index == null ? '' : index;
+        });
+    }
+
+    /**
+    * 将阿拉伯数字转换为对应的汉字, 最多只能处理13位数(万亿)。
+    * <br><font color="red">ref: this.numToChina()、 this.weiNum() </font> <br>
+    * @public
+    * @param {number} num - 要转换的数字
+    * @example
+        1. numToChinese(0); //结果: '零'  
+        2. numToChinese(5); //结果: '五'  
+        3. numToChinese(16); //结果: '十六'  
+        4. numToChinese(34); //结果: '三十四'  
+        5. numToChinese(106); //结果: '一百零六'  
+        6. numToChinese(886); //结果: '八百八十六'  
+        7. numToChinese(1004); //结果: '一千零四'  
+        8. numToChinese(1000); //结果: '一千'  
+        9. numToChinese(9904); //结果: '九千九百零四'  
+        10. numToChinese(19904); //结果: '一万九千九百零四'  
+        11. numToChinese(10004); //结果: '一万零四'  
+        12. numToChinese(10000); //结果: '一万'  
+        13. numToChinese(100404); //结果: '十万零四百零四'  
+        14. numToChinese(9000000); //结果: '九百万'  
+        15. numToChinese(90000000); //结果: '九千万'  
+        16. numToChinese(900000000); //结果: '九亿'  
+        17. numToChinese(9000000000); //结果: '九十亿'  
+        18. numToChinese(9020030401); //结果: '九十亿零二千零三万零四百零一'  
+        19. numToChinese(90000000000); //结果: '九百亿'  
+        20. numToChinese(900000000000); //结果: '九千亿'  
+        21. numToChinese(9000000000000); //结果: '九万亿'  
+        22. numToChinese(90000000000000); //结果: undefined  
+    */
+    numToChinese (num){
+        let numStr = '' + num;
+        let len = numStr.length, result;
+        if(num <= 10){ //处理0~9
+            return this.__CHINANUM[num]; 
+        }else if(num < 20){ //处理10~20
+            return '十' + this.__CHINANUM[numStr[1]]; 
+        }else if(len < 6){ //处理5位数(万)及以下
+            if(!this.__WEIARR){
+                this.__WEIARR = this.__WEISTR.split(', ');
+            }
+            let lastStr, resultStr = '', index;
+            for(let i=0; i<len; i++){
+                lastStr = this.__CHINANUM[numStr[i]];
+                if(numStr[i] === '0'){
+                    index = null;
+                    for(let j=i+1; j<len; j++){
+                        if( numStr[j] !== '0' ){
+                            index = j - 1;
+                            break;
+                        }
+                    }
+                    if(index === null){
+                        break;
+                    }else{
+                        i = index;
+                        resultStr += '零';
+                    }
+                }else{
+                    resultStr += ( lastStr + this.__WEIARR[len - i - 1] );
+                }
+            }
+            return resultStr;
+        }else if(len < 9){ //处理8位数(千万)及以下
+            let low4Str = numStr.slice(-4), heigh4Str = numStr.slice(0, -4), isZero = '';
+            isZero = heigh4Str.slice(-1) === '0' ? '零' : ''; //必须用这个,如504000,应该是 五十万零四千 而不是 五十万四千
+            if(isZero){
+                low4Str = +low4Str;
+                if(low4Str === 0){
+                    isZero = '';
+                }
+            }
+            if(+heigh4Str !== 0){
+                isZero = '万' + isZero;
+            }
+            result = this.numToChinese( +heigh4Str ) + isZero  + this.numToChinese( +low4Str );
+            return result.slice(-1) === '零' ? result.slice(0, -1) : result;
+
+        }else if(len < 14){ //处理13位数(万亿)及以下
+            let low8Str = numStr.slice(-8), heigh4Str = numStr.slice(0, -8),  isZero = '';
+            isZero = heigh4Str.slice(-1) === '0' ? '零' : ''; //必须用这个
+            if(isZero){
+                low8Str = +low8Str;
+                if(low8Str === 0){
+                    isZero = '';
+                }
+            }
+            if(+heigh4Str !== 0){
+                isZero = '亿' + isZero;
+            }
+            result = this.numToChinese( +heigh4Str ) + isZero  + this.numToChinese( +low8Str );
+            return result.slice(-1) === '零' ? result.slice(0, -1) : result;
+        }
+    }
+
+    /**
+     * 按数字的位数将每一位数字转换为中文(注意,可以转换多位数字)
+     * <br><font color="red">ref: this.numToChina() </font> <br>
+     * @public
+     * @param {number|string} num - 要转换的数字
+     * @example
+    1. perNumToChinese(34); //结果: '三四'
+    2. perNumToChinese(3874); //结果: '三八七四'
+    3. perNumToChinese('3874'); //结果: '三八七四'
+    4. perNumToChinese('404'); //结果: '四零四'
+    5. perNumToChinese('0  04   '); //结果: '零零四'
+    6. perNumToChinese('  '); //结果: ''
+    */
+    perNumToChinese(num){
+        return ('' + num).replace(/[\d\s]/g, (index)=>{
+            var result = this.__CHINANUM[index];
+            return result ? result : '';
+        });
+    }
+    __CHINANUM =  '零一二三四五六七八九十'; 
+    __WEISTR =', 十, 百, 千, 万, 十万, 百万, 千万, 亿, 十亿, 百亿, 千亿, 万亿, 十万亿, 百万亿, 千万亿, 亿亿, 十亿亿, 百亿亿, 千亿亿, 万亿亿';
+    __WEIARR = null;
+ 
+ }
+
+

+ 38 - 0
uni_merchants_enter/main.js

@@ -0,0 +1,38 @@
+
+// #ifndef VUE3
+import Vue from 'vue'
+import App from './App'
+
+Vue.config.productionTip = false
+import request from '@/util/request.js'
+import helper from '@/common/helper.js'
+import WXBizDataCrypt from '@/util/WXBizDataCrypt.js'
+import uView from '@/uni_modules/uview-ui'
+import store from './store'
+import share from '@/js_sdk/share.js'
+Vue.mixin(share)
+Vue.use(uView)
+import {parseTime} from '@/util/util'
+Vue.prototype.$request = request
+Vue.prototype.$helper = helper
+Vue.prototype.$store = store
+Vue.prototype.parseTime = parseTime
+Vue.prototype.$WXBizDataCrypt = WXBizDataCrypt
+App.mpType = 'app'
+
+const app = new Vue({
+    ...App
+})
+app.$mount()
+// #endif
+
+// #ifdef VUE3
+import { createSSRApp } from 'vue'
+import App from './App.vue'
+export function createApp() {
+  const app = createSSRApp(App)
+  return {
+    app
+  }
+}
+// #endif

+ 78 - 0
uni_merchants_enter/manifest.json

@@ -0,0 +1,78 @@
+{
+    "name" : "uni_merchants_enter",
+    "appid" : "__UNI__3F4556A",
+    "description" : "",
+    "versionName" : "1.0.0",
+    "versionCode" : "100",
+    "transformPx" : false,
+    /* 5+App特有相关 */
+    "app-plus" : {
+        "usingComponents" : true,
+        "nvueStyleCompiler" : "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.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.ACCESS_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+                    "<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.FLASHLIGHT\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
+                ]
+            },
+            /* ios打包配置 */
+            "ios" : {},
+            /* SDK配置 */
+            "sdkConfigs" : {}
+        }
+    },
+    /* 快应用特有相关 */
+    "quickapp" : {},
+    /* 小程序特有相关 */
+    "mp-weixin" : {
+        "appid" : "wx5d8906c2208c899f",
+        "setting" : {
+            "urlCheck" : false
+        },
+        "usingComponents" : true,
+        "permission" : {
+            "scope.userLocation" : {
+                "desc" : "为用户提供给接送服务,需要定位信息"
+            }
+        },
+		"requiredPrivateInfos" : [ "getLocation", "chooseLocation", "chooseAddress" ]
+    },
+    "mp-alipay" : {
+        "usingComponents" : true
+    },
+    "mp-baidu" : {
+        "usingComponents" : true
+    },
+    "mp-toutiao" : {
+        "usingComponents" : true
+    },
+    "uniStatistics" : {
+        "enable" : false
+    },
+    "vueVersion" : "2"
+}

+ 373 - 0
uni_merchants_enter/pageA/enter/cateringindustry.vue

@@ -0,0 +1,373 @@
+<template>
+	<view class='content'>
+		<view class='wrap'>
+			<u--form  ref="uForm">
+				<u-form-item labelWidth='80' labelPosition='top' label="营业执照">
+					<u-upload height='208' width='320' :fileList="fileList2" @afterRead="afterRead($event,1)" @delete="deletePic" name="2" multiple
+						:maxCount="1">
+						<image style='width:680rpx;height:417rpx;' src="../../static/image/enter/yingyezhizhao.png" mode=""></image>
+					</u-upload>
+				</u-form-item>
+				<u-form-item labelWidth='80' labelPosition='top' label="经营许可证">
+					<u-upload height='208' width='320' :fileList="fileList3" @afterRead="afterRead($event,2)" @delete="deletePic" name="3" multiple
+						:maxCount="1">
+						<image style='width:680rpx;height:417rpx;' src="../../static/image/enter/jingyingxukezheng.png" mode=""></image>
+					</u-upload>
+				</u-form-item>
+				<u-form-item  labelWidth='150' labelPosition='left' label="经营许可证有效期">
+					<view style='text-align:right;' @click='openjyxkz'>{{form.operateCertificateDate?form.operateCertificateDate:'选择日期'}}<image src="@/static/image/yjt.png" mode=""
+								style="margin-left:10rpx;width:12rpx;height: 21rpx;"></image></view>
+				</u-form-item>
+				<uni-calendar
+				   :insert="false"
+				   :lunar="true" 
+					ref="calendar"
+				   :start-date="startDate"
+				   @confirm="confirm"
+				    />
+					<u-form-item  labelWidth='150' labelPosition='left' label="店铺名称">
+						<u-input inputAlign='right' border='none' placeholder='输入店铺名称' v-model="form.shopNames" />
+					</u-form-item>
+					<u-form-item  labelWidth='150' labelPosition='left' label="经营者">
+						<u-input inputAlign='right' border='none' placeholder='输入经营者姓名' v-model="form.operater" />
+					</u-form-item>
+					<u-form-item  labelWidth='150' labelPosition='left' label="经营者手机号">
+						<u-input inputAlign='right' maxlength="15" border='none' placeholder='输入经营者手机号' v-model="form.operaterPhone" />
+					</u-form-item>
+					<u-form-item  labelWidth='150' labelPosition='left' label="验证码">
+						<u-input inputAlign='right' border='none' placeholder='输入验证码' v-model="form.verifyCode" >
+							<template slot="suffix">
+								<u-code ref="uCode"
+									@change="codeChange"
+									seconds="60"
+									changeText="X秒重新获取"
+								></u-code>
+
+								<view class='get_code' @click='getCode'>{{tips}}</view>
+							</template>
+						</u-input>
+					</u-form-item>
+					<u-form-item  labelWidth='150' labelPosition='left' label="业务联系人(选填)">
+						<u-input inputAlign='right' border='none' placeholder='输入联系人姓名' v-model="form.contacts" />
+					</u-form-item>
+					<u-form-item  labelWidth='150' labelPosition='left' label="业务联系电话(选填)">
+						<u-input inputAlign='right' maxlength="15" border='none' placeholder='输入联系电话' v-model="form.contactsPhone" />
+					</u-form-item>
+					<u-form-item labelWidth='80' labelPosition='left' @click='placeSelect(),hideKeyboard()' label="店铺位置">
+						<view style='text-align:right;' v-if="form.province">{{ form.province }}{{ form.city }}{{ form.area }}</view>
+						<view style='text-align:right;' v-else>
+							<text style='text-align:right;'>选择位置 </text>
+							<image src="@/static/image/yjt.png" mode=""
+								style="margin-left:10rpx;width:12rpx;height: 21rpx;"></image>
+						</view>
+					</u-form-item>
+					<u-form-item labelWidth='80' labelPosition='left' label="详细地址">
+						<u-input inputAlign='right' maxlength="15" border='none' placeholder='输入详细地址,不超过15个字' v-model="form.detailedAddress" />
+					</u-form-item>
+					<u-form-item  labelWidth='150' labelPosition='left' label="营业时间">
+						<view style='text-align:right;' @click='selectTime'>{{form.timesection}}<image src="@/static/image/yjt.png" mode=""
+								style="margin-left:10rpx;width:12rpx;height: 21rpx;"></image></view>
+					</u-form-item>
+					<smh-time-range :is-under='show' :time="['18','0','42']" @confrim="confrim" @cancel="cancel"></smh-time-range>
+					<!-- label -->
+					<view class='flex justify-space-between align-item-center'>
+						<view>标签(2-4个,最多5个字)</view> 
+						<view class='add_label' @click='addLabel'>新增</view>
+					</view>
+					<view style='flex-wrap: wrap;' class='flex'>
+						<view style='margin:10rpx;width:47%;' class='flex align-item-center' v-for='item in labelList'>
+							<u-input inputAlign='right' placeholder='输入标签文字' v-model="item.value" />
+							<view class="iconfont_no icon_merchants_enterjianshao"></view>
+						</view>
+					</view>
+					
+				<u-form-item labelWidth='240' labelPosition='top' label="门面及门头照片(1张,店名文字清晰)">
+					<u-upload :fileList="fileList4" @afterRead="afterRead($event,3)" @delete="deletePic" name="4" multiple
+						:maxCount="1">
+						
+					</u-upload>
+				</u-form-item>
+				<u-form-item labelWidth='120' labelPosition='top' label="室内照片(1-6张)">
+					<u-upload :fileList="fileList5" @afterRead="afterRead($event,4)" @delete="deletePic" name="5" multiple
+						:maxCount="6">
+						
+					</u-upload>
+				</u-form-item>
+			</u--form>
+			<view class="footer">
+				<button @click='submit' class="submit">提交</button>
+			</view>
+		</view>
+		<u-modal :show="isSubmit" :content='content' @confirm="$u.debounce(confirmSubmit, 500)" showCancelButton
+			@cancel="isSubmit=false" @close="isSubmit=false" closeOnClickOverlay></u-modal>
+	</view>
+</template>
+
+<script>
+	var that
+	import uploadImage from '@/components/ossutil/uploadFile.js';
+	export default {
+		data() {
+			return {
+				content:'确定提交入驻信息',
+				isSubmit:false,
+				form:{
+					commonId:uni.getStorageSync("userInfo").id,
+					mainBody:'商铺',
+					lookFlag:0,
+					startDate:'',
+					city: '',
+					area: '',
+					province: '',
+					location: '',
+					detailedAddress: '',
+					businessLicense:'',
+					operateCertificate:'',
+					coverImage:'',
+					indoorImage:'',
+					timesection:'09:00~21:00',
+					startDate:'09:00',
+					endDate:'21:00',
+					operateCertificateDate:'',
+				},
+				
+				tips:'发送验证码',
+				startDate:'',
+				show:false,
+				labelList:[{value:''},{value:''}],
+				fileList2:[],
+				fileList3:[],
+				fileList4:[],
+				fileList5:[],
+				
+			}
+		},
+		onLoad() {
+			that = this
+		},
+		onShow(){
+			var date = new Date().toISOString().slice(0, 10)
+			this.startDate=date
+			console.log(date)
+			
+		},
+		methods: {
+			submit(){
+				this.isSubmit = true
+			},
+			confirmSubmit() {
+				if(this.labelList.length>0){
+					var arr=[]
+					for(var i=0;i<this.labelList.length;i++){
+						if(!this.labelList[i].value){
+							uni.showToast({
+								icon: "none",
+								title: '标签请输入内容!',
+								duration: 3000
+							});
+							return
+						}
+						if(this.labelList[i].value.length>5){
+							uni.showToast({
+								icon: "none",
+								title: '标签最多5个字!',
+								duration: 3000
+							});
+							return
+						}
+						arr.push(this.labelList[i].value)
+					}
+					this.form.label=arr.toString()
+				}
+				
+				uni.showLoading({
+					title: '加载中',
+					mask: true
+				})
+				this.$request.baseRequest('admin.tourism.foodInfo', 'add', {
+					foodInfo: JSON.stringify(this.form)
+				}, failres => {
+					uni.showToast({
+						icon: "none",
+						title: failres.errmsg,
+						duration: 3000
+					});
+			
+					uni.hideLoading()
+				}).then(res => {
+					this.isSubmit = false
+					uni.showToast({
+						icon: "success",
+						title: '提交成功,请等待平台审核',
+						duration: 2000
+					});
+					uni.navigateBack()
+			
+				})
+			},
+			concel(e){
+				this.show=false
+				console.log(e)
+			},
+			confrim(e){
+				console.log(e)
+				this.show=false
+				this.form.timesection=e.time
+				this.form.startDate=e.start
+				this.form.endDate=e.end
+			},
+			selectTime(){
+				this.show=true
+			},
+			addLabel(){
+				if(this.labelList.length>=4){
+					uni.showToast({
+						icon: "success",
+						title: '最多4个标签!',
+						duration: 2000
+					});
+					return
+				}
+				this.labelList.push({value:''})
+			},
+			codeChange(text) {
+			    this.tips = text;
+			},
+			getCode() {
+				if(!this.form.operaterPhone){
+					uni.showToast({
+						icon: "none",
+						title: '请输入手机号再获取验证码!',
+						duration: 2000
+					});
+					return
+				}
+			    if (this.$refs.uCode.canGetCode) {
+			         // 模拟向后端请求验证码
+			        uni.showLoading({
+			        title: '正在获取验证码'
+			        })
+					this.$request.baseRequest('user', 'sendVerifyCode', {
+						phone: this.form.operaterPhone
+					}, failres => {
+						uni.showToast({
+							icon: "none",
+							title: failres.errmsg,
+							duration: 3000
+						});
+						uni.hideLoading()
+					}).then(res => {
+						
+								
+					})
+			        setTimeout(() => {
+			            uni.hideLoading();
+			            // 这里此提示会被this.start()方法中的提示覆盖
+			         
+			            // 通知验证码组件内部开始倒计时
+			            this.$refs.uCode.start();
+			        }, 2000);
+			    } else {
+			        uni.showToast({
+			        	icon: "success",
+			        	title: '提交成功!',
+			        	duration: 2000
+			        });
+			    }
+			},
+			confirm(e){
+				this.form.operateCertificateDate = e.fulldate
+				this.$forceUpdate()
+				console.log(e)
+			},
+			openjyxkz(){
+				  this.$refs.calendar.open();
+			},
+			placeSelect() {
+				uni.chooseLocation({
+					success: function(res) {
+						console.log(res);
+						that.form.location = res.latitude + ',' + res.longitude
+						let _address = that.$helper.formatLocation(res.address)
+						console.log(_address)
+						that.form.province = _address.Province
+						that.form.city = _address.City
+						that.form.area = _address.Country
+						that.form.detailedAddress = _address.Village
+						that.$forceUpdate()
+					}
+				});
+			},
+			hideKeyboard() {
+				uni.hideKeyboard()
+			},
+			// 删除图片
+			deletePic(event,status) {
+				this[`fileList${event.name}`].splice(event.index, 1)
+			},
+			// 新增图片
+			async afterRead(event,status) {
+				// 当设置 multiple 为 true 时, file 为数组格式,否则为对象格式
+				let lists = [].concat(event.file)
+				let fileListLen = this[`fileList${event.name}`].length
+				lists.map((item) => {
+					this[`fileList${event.name}`].push({
+						...item,
+						status: 'uploading',
+						message: '上传中'
+					})
+				})
+				for (let i = 0; i < lists.length; i++) {
+					const result = await this.uploadFilePromise(lists[i].url,status)
+					
+					let item = this[`fileList${event.name}`][fileListLen]
+					this[`fileList${event.name}`].splice(fileListLen, 1, Object.assign(item, {
+						status: 'success',
+						message: '',
+						url: result
+					}))
+					fileListLen++
+					console.log(that.form, this[`fileList${event.name}`])
+					
+				}
+			},
+			uploadFilePromise(res,status) {
+				return new Promise((resolve, reject) => {
+					uploadImage(res, 'cardImages/',
+						result => {
+							if(status==0){
+								that.form.businessLicense = result
+							}else if(status==1){
+								that.form.operateCertificate = result
+							}else if(status==2){
+								that.form.coverImage = result
+							}else if(status==3){
+								that.form.indoorImage = result
+							}
+							resolve(res)
+						}
+					)
+				})
+			},
+		}
+	}
+</script>
+
+<style lang='scss' scoped>
+ .wrap{
+	 padding:20rpx;
+ }
+ .icon_merchants_enterjianshao{
+	 margin-left:10rpx;
+	 font-size:50rpx;
+	 color:#666;
+ }
+ .add_label,.get_code{
+
+	background: #5F7DE9;
+	color: #fff;
+	padding: 10rpx 20rpx;
+	border-radius: 10rpx;
+	font-size: 26rpx;
+ }
+</style>

+ 283 - 0
uni_merchants_enter/pageA/enter/homestay.vue

@@ -0,0 +1,283 @@
+<template>
+	<view class='content'>
+		<view class='wrap'>
+			<u--form  ref="uForm">
+				<u-form-item   labelWidth='120' labelPosition='top' label="身份证头像面">
+					<u-upload height='208' width='320' :fileList="fileList4" @afterRead="afterRead($event,1)" @delete="deletePic" name="4" multiple
+						:maxCount="1">
+						<view class="bgc">
+							<image class='circle' style='width:123rpx;height:123rpx;' src="../../static/image/enter/camera.png"  mode=""></image>
+							<view>请上传头像面</view>
+						</view>
+						</u-upload>
+				</u-form-item>
+				<u-form-item   labelWidth='120' labelPosition='top' label="身份证国徽面">
+					<u-upload  height='208' width='320' :fileList="fileList6" @afterRead="afterRead($event,2)" @delete="deletePic" name="6" multiple
+						:maxCount="1">
+						<view class="bgc1">
+							<image class='circle' style='width:123rpx;height:123rpx;' src="../../static/image/enter/camera.png" mode=""></image>
+							<view>请上传国徽面</view>
+						</view>
+					</u-upload>
+				</u-form-item>
+				<u-form-item  labelWidth='120' labelPosition='left' label="身份证号码">
+					<u-input inputAlign='right' border='none' placeholder='请输入身份证号码' v-model="form.personNo" />
+				</u-form-item>
+				<uni-calendar
+				   :insert="false"
+				   :lunar="true" 
+					ref="calendar"
+				   :start-date="startDate"
+				   @confirm="confirm"
+				    />
+					<u-form-item  labelWidth='150' labelPosition='left' label="姓名">
+						<u-input inputAlign='right' border='none' placeholder='输入姓名' v-model="form.realname" />
+					</u-form-item>
+					<u-form-item  labelWidth='150' labelPosition='left' label="手机号">
+						<u-input inputAlign='right' border='none' placeholder='输入手机号' v-model="form.phone" />
+					</u-form-item>
+					<u-form-item  labelWidth='150' labelPosition='left' label="验证码">
+						<u-input inputAlign='right' border='none' placeholder='输入验证码' v-model="form.verifyCode" >
+							<template slot="suffix">
+								<u-code ref="uCode"
+									@change="codeChange"
+									seconds="60"
+									changeText="X秒重新获取"
+								></u-code>
+
+								<view class='get_code' @click='getCode'>{{tips}}</view>
+							</template>
+						</u-input>
+					</u-form-item>
+				</u-form-item>
+				<u-form-item>
+					<view class="flex service align-center">
+						<view @click='' :class='consentStatus?"icon_merchants_entergouxuan":"icon_merchants_enterweigouxuan"' class="iconfont_no"></view>
+						我已阅读并同意
+						<navigator
+							url="/pageA/webview?can_share=false&url=https://liangxin.zthymaoyi.com/userAgreement.html"
+							class="path" hover-class="navigator-hover">《民宿入驻协议》</navigator>的相关规定
+					</view>
+				</u-form-item>
+			</u--form>
+			<view class="footer">
+				<button @click='submit' class="submit">提交</button>
+			</view>
+			<u-modal :show="isSubmit" :content='content' @confirm="$u.debounce(confirmSubmit, 500)" showCancelButton
+				@cancel="isSubmit=false" @close="isSubmit=false" closeOnClickOverlay></u-modal>
+		</view>
+	</view>
+</template>
+
+<script>
+	var that
+	import uploadImage from '@/components/ossutil/uploadFile.js';
+	export default {
+		data() {
+			return {
+				form:{
+					commonId:uni.getStorageSync("userInfo").id,
+					type:"1",
+				},
+				consentStatus:false,
+				tips:'发送验证码',
+				startDate:'',
+				isSubmit:false,
+				fileList4:[],
+				fileList6:[],
+				content:'确定提交入驻信息',
+			}
+		},
+		onLoad() {
+			that = this
+		},
+		onShow(){
+			var date = new Date().toISOString().slice(0, 10)
+			this.startDate=date
+		},
+		methods: {
+			codeChange(text) {
+			    this.tips = text;
+			},
+			getCode() {
+				if(!this.form.phone){
+					uni.showToast({
+						icon: "none",
+						title: '请输入手机号再获取验证码!',
+						duration: 2000
+					});
+					return
+				}
+			    if (this.$refs.uCode.canGetCode) {
+			         // 模拟向后端请求验证码
+			        uni.showLoading({
+			        title: '正在获取验证码'
+			        })
+					this.$request.baseRequest('user', 'sendVerifyCode', {
+						phone: this.form.phone
+					}, failres => {
+						uni.showToast({
+							icon: "none",
+							title: failres.errmsg,
+							duration: 3000
+						});
+						uni.hideLoading()
+					}).then(res => {
+						
+								
+					})
+			        setTimeout(() => {
+			            uni.hideLoading();
+			            // 这里此提示会被this.start()方法中的提示覆盖
+			         
+			            // 通知验证码组件内部开始倒计时
+			            this.$refs.uCode.start();
+			        }, 2000);
+			    } else {
+			        uni.showToast({
+			        	icon: "success",
+			        	title: '提交成功!',
+			        	duration: 2000
+			        });
+			    }
+			},
+			submit(){
+				this.isSubmit = true
+			},
+			confirmSubmit(){
+				uni.showLoading({
+					title: '加载中',
+					mask: true
+				})
+				this.$request.baseRequest('admin.tourism.homestayInfo', 'add', {
+					homestayInfo: JSON.stringify(this.form)
+				}, failres => {
+					uni.showToast({
+						icon: "none",
+						title: failres.errmsg,
+						duration: 3000
+					});
+							
+					uni.hideLoading()
+				}).then(res => {
+					this.isSubmit = false
+					uni.showToast({
+						icon: "success",
+						title: '提交成功,请等待平台审核',
+						duration: 2000
+					});
+					uni.navigateBack()
+							
+				})
+			},
+			// 删除图片
+			deletePic(event,status) {
+				this[`fileList${event.name}`].splice(event.index, 1)
+			},
+			// 新增图片
+			async afterRead(event,status) {
+				// 当设置 multiple 为 true 时, file 为数组格式,否则为对象格式
+				let lists = [].concat(event.file)
+				let fileListLen = this[`fileList${event.name}`].length
+				lists.map((item) => {
+					this[`fileList${event.name}`].push({
+						...item,
+						status: 'uploading',
+						message: '上传中'
+					})
+				})
+				for (let i = 0; i < lists.length; i++) {
+					const result = await this.uploadFilePromise(lists[i].url,status)
+					
+					let item = this[`fileList${event.name}`][fileListLen]
+					this[`fileList${event.name}`].splice(fileListLen, 1, Object.assign(item, {
+						status: 'success',
+						message: '',
+						url: result
+					}))
+					fileListLen++
+					console.log(that.form, this[`fileList${event.name}`])
+					
+				}
+			},
+			uploadFilePromise(res,status) {
+				return new Promise((resolve, reject) => {
+					uploadImage(res, 'cardImages/',
+						result => {
+							if(status==1){
+								that.form.personImageFront = result
+									uni.showLoading({
+										title: '加载中',
+										mask: true
+									})
+									that.$request.baseRequest('admin.tourism.productManagement', 'personShibie', {
+										personImageFront: that.form.personImageFront
+									}, failres => {
+										uni.showToast({
+											icon: "none",
+											title: failres.errmsg,
+											duration: 3000
+										});	
+										uni.hideLoading()
+									}).then(res => {
+										console.log(res)
+										uni.hideLoading()
+										that.form.personNo=res.data.recPersonNo
+										console.log(that.form)
+										that.$forceUpdate()	
+									})
+							}else if(status==2){
+								that.form.personImageBack = result
+							}
+							resolve(res)
+						}
+					)
+				})
+			},
+		}
+	}
+</script>
+
+<style lang='scss' scoped>
+ .wrap{
+	 padding:20rpx;
+ }
+ .icon_merchants_enterjian1{
+	 margin-left:10rpx;
+	 font-size:50rpx;
+ }
+ .add_label,.get_code{
+
+	background: #5F7DE9;
+	color: #fff;
+	padding: 10rpx 20rpx;
+	border-radius: 10rpx;
+	font-size: 26rpx;
+ }
+ .circle{
+ 	margin:110rpx 0 20rpx 0;
+ }
+ // 人像
+ .bgc,.bgc1{
+ 	 width:672rpx;
+ 	 height:417rpx;
+ 	 background:url('https://taohaoliang.oss-cn-beijing.aliyuncs.com/pcfiles/card2.png') no-repeat center;
+ 	 background-size: 100%;
+ 	 text-align:center;
+ }
+ // 国徽
+ .bgc1{
+ 	 background:url('https://taohaoliang.oss-cn-beijing.aliyuncs.com/pcfiles/card.png') no-repeat center;
+ 	 background-size: 100%;
+ }
+ .path {
+ 	color: #2772FB;
+ 
+ }
+ .icon_merchants_enterweigouxuan{
+	 color:#999;
+ }
+ .icon_merchants_entergouxuan{
+	 color:#5F7DE9;
+ }
+</style>

+ 270 - 0
uni_merchants_enter/pageA/enter/hotel.vue

@@ -0,0 +1,270 @@
+<template>
+	<view class='content'>
+		<view class='wrap'>
+			<u--form  ref="uForm">
+				<u-form-item labelWidth='80' labelPosition='top' label="营业执照">
+					<u-upload height='208' width='320' :fileList="fileList2" @afterRead="afterRead($event,1)" @delete="deletePic" name="2" multiple
+						:maxCount="1">
+						<image style='width:680rpx;height:417rpx;' src="../../static/image/enter/yingyezhizhao.png" mode=""></image>
+					</u-upload>
+				</u-form-item>
+				<uni-calendar
+				   :insert="false"
+				   :lunar="true" 
+					ref="calendar"
+				   :start-date="startDate"
+				   @confirm="confirm"
+				    />
+					<u-form-item  labelWidth='150' labelPosition='left' label="酒店名称">
+						<u-input inputAlign='right' border='none' placeholder='输入酒店名称' v-model="form.hotelName" />
+					</u-form-item>
+					<u-form-item labelWidth='80' labelPosition='left' @click='placeSelect(),hideKeyboard()' label="店铺位置">
+						<view style='text-align:right;' v-if="form.province">{{ form.province }}{{ form.city }}{{ form.area }}</view>
+						<view style='text-align:right;' v-else>
+							<text style='text-align:right;'>选择位置 </text>
+							<image src="@/static/image/yjt.png" mode=""
+								style="margin-left:10rpx;width:12rpx;height: 21rpx;"></image>
+						</view>
+					</u-form-item>
+					<u-form-item labelWidth='80' labelPosition='left' label="详细地址">
+						<u-input inputAlign='right' maxlength="15" border='none' placeholder='输入详细地址,不超过15个字' v-model="form.detailedAddress" />
+					</u-form-item>
+					<u-form-item  labelWidth='150' labelPosition='left' label="法人姓名">
+						<u-input inputAlign='right' border='none' placeholder='输入法人姓名' v-model="form.legalName" />
+					</u-form-item>
+					<u-form-item  labelWidth='150' labelPosition='left' label="联系人">
+						<u-input inputAlign='right' border='none' placeholder='输入联系人姓名' v-model="form.realname" />
+					</u-form-item>
+					<u-form-item  labelWidth='150' labelPosition='left' label="手机号">
+						<u-input inputAlign='right' border='none' placeholder='输入手机号' v-model="form.phone" />
+					</u-form-item>
+					<u-form-item  labelWidth='150' labelPosition='left' label="验证码">
+						<u-input inputAlign='right' border='none' placeholder='输入验证码' v-model="form.verifyCode" >
+							<template slot="suffix">
+								<u-code ref="uCode"
+									@change="codeChange"
+									seconds="60"
+									changeText="X秒重新获取"
+								></u-code>
+
+								<view class='get_code' @click='getCode'>{{tips}}</view>
+							</template>
+						</u-input>
+					</u-form-item>
+				</u-form-item>
+				<u-form-item  labelWidth='150' labelPosition='left' label="酒店座机(选填)">
+					<u-input inputAlign='right' border='none' placeholder='输入座机号' v-model="form.landlinePhone" />
+				</u-form-item>
+				<u-form-item>
+					<view class="flex service align-center">
+						<view @click='' :class='consentStatus?"icon_merchants_entergouxuan":"icon_merchants_enterweigouxuan"' class="iconfont_no"></view>
+						我已阅读并同意
+						<navigator
+							url="/pageA/webview?can_share=false&url=https://liangxin.zthymaoyi.com/userAgreement.html"
+							class="path" hover-class="navigator-hover">《酒店入驻协议》</navigator>的相关规定
+					</view>
+				</u-form-item>
+			</u--form>
+			<view class="footer">
+				<button @click='submit' class="submit">提交</button>
+			</view>
+			<u-modal :show="isSubmit" :content='content' @confirm="$u.debounce(confirmSubmit, 500)" showCancelButton
+				@cancel="isSubmit=false" @close="isSubmit=false" closeOnClickOverlay></u-modal>
+		</view>
+	</view>
+</template>
+
+<script>
+	var that
+	import uploadImage from '@/components/ossutil/uploadFile.js';
+	export default {
+		data() {
+			return {
+				form:{
+					commonId:uni.getStorageSync("userInfo").id,
+					type:"2",
+				},
+				consentStatus:false,
+				tips:'发送验证码',
+				startDate:'',
+				isSubmit:false,
+				fileList2:[],
+				content:'确定提交入驻信息',
+			}
+		},
+		onLoad() {
+			that = this
+		},
+		onShow(){
+			var date = new Date().toISOString().slice(0, 10)
+			this.startDate=date
+		},
+		methods: {
+			codeChange(text) {
+			    this.tips = text;
+			},
+			getCode() {
+				if(!this.form.phone){
+					uni.showToast({
+						icon: "none",
+						title: '请输入手机号再获取验证码!',
+						duration: 2000
+					});
+					return
+				}
+			    if (this.$refs.uCode.canGetCode) {
+			         // 模拟向后端请求验证码
+			        uni.showLoading({
+			        title: '正在获取验证码'
+			        })
+					this.$request.baseRequest('user', 'sendVerifyCode', {
+						phone: this.form.phone
+					}, failres => {
+						uni.showToast({
+							icon: "none",
+							title: failres.errmsg,
+							duration: 3000
+						});
+						uni.hideLoading()
+					}).then(res => {
+						
+								
+					})
+			        setTimeout(() => {
+			            uni.hideLoading();
+			            // 这里此提示会被this.start()方法中的提示覆盖
+			         
+			            // 通知验证码组件内部开始倒计时
+			            this.$refs.uCode.start();
+			        }, 2000);
+			    } else {
+			        uni.showToast({
+			        	icon: "success",
+			        	title: '提交成功!',
+			        	duration: 2000
+			        });
+			    }
+			},
+			submit(){
+				this.isSubmit = true
+			},
+			placeSelect() {
+				uni.chooseLocation({
+					success: function(res) {
+						console.log(res);
+						that.form.location = res.latitude + ',' + res.longitude
+						let _address = that.$helper.formatLocation(res.address)
+						console.log(_address)
+						that.form.province = _address.Province
+						that.form.city = _address.City
+						that.form.area = _address.Country
+						that.form.detailedAddress = _address.Village
+						that.$forceUpdate()
+					}
+				});
+			},
+			hideKeyboard() {
+				uni.hideKeyboard()
+			},
+			confirmSubmit(){
+				uni.showLoading({
+					title: '加载中',
+					mask: true
+				})
+				this.$request.baseRequest('admin.tourism.homestayInfo', 'add', {
+					homestayInfo: JSON.stringify(this.form)
+				}, failres => {
+					uni.showToast({
+						icon: "none",
+						title: failres.errmsg,
+						duration: 3000
+					});
+							
+					uni.hideLoading()
+				}).then(res => {
+					this.isSubmit = false
+					uni.showToast({
+						icon: "success",
+						title: '提交成功,请等待平台审核',
+						duration: 2000
+					});
+					uni.navigateBack()
+							
+				})
+			},
+			// 删除图片
+			deletePic(event,status) {
+				this[`fileList${event.name}`].splice(event.index, 1)
+			},
+			// 新增图片
+			async afterRead(event,status) {
+				// 当设置 multiple 为 true 时, file 为数组格式,否则为对象格式
+				let lists = [].concat(event.file)
+				let fileListLen = this[`fileList${event.name}`].length
+				lists.map((item) => {
+					this[`fileList${event.name}`].push({
+						...item,
+						status: 'uploading',
+						message: '上传中'
+					})
+				})
+				for (let i = 0; i < lists.length; i++) {
+					const result = await this.uploadFilePromise(lists[i].url,status)
+					
+					let item = this[`fileList${event.name}`][fileListLen]
+					this[`fileList${event.name}`].splice(fileListLen, 1, Object.assign(item, {
+						status: 'success',
+						message: '',
+						url: result
+					}))
+					fileListLen++
+					console.log(that.form, this[`fileList${event.name}`])
+					
+				}
+			},
+			uploadFilePromise(res,status) {
+				return new Promise((resolve, reject) => {
+					uploadImage(res, 'cardImages/',
+						result => {
+							if(status==1){
+								that.form.businessLicense = result
+							}
+							resolve(res)
+						}
+					)
+				})
+			},
+		}
+	}
+</script>
+
+<style lang='scss' scoped>
+ .wrap{
+	 padding:20rpx;
+ }
+ .icon_merchants_enterjian1{
+	 margin-left:10rpx;
+	 font-size:50rpx;
+ }
+ .add_label,.get_code{
+
+	background: #5F7DE9;
+	color: #fff;
+	padding: 10rpx 20rpx;
+	border-radius: 10rpx;
+	font-size: 26rpx;
+ }
+ .circle{
+ 	margin:110rpx 0 20rpx 0;
+ }
+ .path {
+ 	color: #2772FB;
+ 
+ }
+ .icon_merchants_enterweigouxuan{
+	 color:#999;
+ }
+ .icon_merchants_entergouxuan{
+	 color:#5F7DE9;
+ }
+</style>

+ 22 - 0
uni_merchants_enter/pageA/enter/myCateringdustry/addGroupBuying.vue

@@ -0,0 +1,22 @@
+<template>
+	<view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 22 - 0
uni_merchants_enter/pageA/enter/myCateringdustry/addGroupBuyingNext.vue

@@ -0,0 +1,22 @@
+<template>
+	<view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 22 - 0
uni_merchants_enter/pageA/enter/myCateringdustry/addfood.vue

@@ -0,0 +1,22 @@
+<template>
+	<view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 22 - 0
uni_merchants_enter/pageA/enter/myCateringdustry/index.vue

@@ -0,0 +1,22 @@
+<template>
+	<view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 22 - 0
uni_merchants_enter/pageA/enter/myCateringdustry/shopSetting/editCertificate.vue

@@ -0,0 +1,22 @@
+<template>
+	<view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 22 - 0
uni_merchants_enter/pageA/enter/myCateringdustry/shopSetting/editFoodClassify.vue

@@ -0,0 +1,22 @@
+<template>
+	<view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 22 - 0
uni_merchants_enter/pageA/enter/myCateringdustry/shopSetting/editShopImage.vue

@@ -0,0 +1,22 @@
+<template>
+	<view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 22 - 0
uni_merchants_enter/pageA/enter/myCateringdustry/shopSetting/editShopInformation.vue

@@ -0,0 +1,22 @@
+<template>
+	<view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 22 - 0
uni_merchants_enter/pageA/enter/myCateringdustry/shopSetting/foodInfomation.vue

@@ -0,0 +1,22 @@
+<template>
+	<view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 22 - 0
uni_merchants_enter/pageA/enter/myCateringdustry/shopSetting/groupBuying.vue

@@ -0,0 +1,22 @@
+<template>
+	<view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 22 - 0
uni_merchants_enter/pageA/enter/myCateringdustry/shopSetting/index.vue

@@ -0,0 +1,22 @@
+<template>
+	<view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 22 - 0
uni_merchants_enter/pageA/enter/myCateringdustry/shopSetting/lookGroupBuying.vue

@@ -0,0 +1,22 @@
+<template>
+	<view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 22 - 0
uni_merchants_enter/pageA/enter/myCateringdustry/shopSetting/saleroom.vue

@@ -0,0 +1,22 @@
+<template>
+	<view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 22 - 0
uni_merchants_enter/pageA/enter/myHomestay/add.vue

@@ -0,0 +1,22 @@
+<template>
+	<view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 22 - 0
uni_merchants_enter/pageA/enter/myHomestay/edit.vue

@@ -0,0 +1,22 @@
+<template>
+	<view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 22 - 0
uni_merchants_enter/pageA/enter/myHomestay/index.vue

@@ -0,0 +1,22 @@
+<template>
+	<view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 22 - 0
uni_merchants_enter/pageA/enter/myHomestay/search.vue

@@ -0,0 +1,22 @@
+<template>
+	<view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 22 - 0
uni_merchants_enter/pageA/my/bill.vue

@@ -0,0 +1,22 @@
+<template>
+	<view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 22 - 0
uni_merchants_enter/pageA/notice/noticedetail.vue

@@ -0,0 +1,22 @@
+<template>
+	<view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 24 - 0
uni_merchants_enter/pageA/webview.vue

@@ -0,0 +1,24 @@
+<template>
+    <web-view :src="url"></web-view>
+</template>
+
+<script>
+	export default {
+        data() {
+            return {
+                url:""
+            }
+        },
+        onLoad(option) {
+            this.url = option.url;
+        },
+        methods: {
+        }
+    }
+</script>
+    
+
+
+<style>
+
+</style>

+ 284 - 0
uni_merchants_enter/pages.json

@@ -0,0 +1,284 @@
+{
+	"easycom": {
+		"^u-(.*)": "@/uni_modules/uview-ui/components/u-$1/u-$1.vue"
+	},
+	"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
+		{
+            "path" : "pages/enter/enter",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "入驻",
+                "enablePullDownRefresh": false
+            }
+            
+        } ,{
+			"path": "pages/notice/index",
+			"style": {
+				"navigationBarTitleText": "通知",
+				"enablePullDownRefresh": false
+			}
+		},{
+            "path" : "pages/my/my",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "我的",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+        
+    ],
+	"globalStyle": {
+		"navigationBarTextStyle": "white",
+		"navigationBarTitleText": "uni-app",
+		"navigationBarBackgroundColor": "#5F7DE9",
+		"backgroundColor": "#F8F8F8"
+	},
+	"tabBar": {
+		"custom": false,
+		"color": "#000",
+		"selectedColor": "#5F7DE9",
+		"borderStyle": "white",
+		"backgroundColor": "#ffffff",
+		"list": [{
+				"pagePath": "pages/enter/enter",
+				"iconPath": "static/image/nav-icon/antOutline-team.png",
+				"selectedIconPath": "static/image/nav-icon/antOutline-team Copy.png",
+				"text": "入驻"
+			},
+			{
+				"pagePath": "pages/notice/index",
+				"iconPath": "static/image/nav-icon/antOutline-user.png",
+				"selectedIconPath": "static/image/nav-icon/antOutline-user Copy.png",
+				"text": "通知"
+			},
+			{
+				"pagePath": "pages/my/my",
+				"iconPath": "static/image/nav-icon/md-notifications_none.png",
+				"selectedIconPath": "static/image/nav-icon/md-notifications_none Copy.png",
+				"text": "我的"
+			}
+		]
+	},
+	"uniIdRouter": {},
+	"subPackages": [
+		{
+			"root":"pageA",
+			"pages": [
+				{
+				    "path" : "enter/cateringindustry",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "餐饮",
+				        "enablePullDownRefresh": false
+				    }
+				    
+				}
+				,{
+				    "path" : "enter/hotel",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "酒店",
+				        "enablePullDownRefresh": false
+				    }
+				    
+				}
+				,{
+				    "path" : "enter/homestay",
+				    "style" :                                                                                    
+				    {
+				        "navigationBarTitleText": "民宿",
+				        "enablePullDownRefresh": false
+				    }
+				    
+				}
+	            ,{
+                    "path" : "webview",
+                    "style" :                                                                                    
+					{
+						"navigationBarTitleText": "",
+						"enablePullDownRefresh": false
+					}
+                
+                }
+                ,{
+                    "path" : "enter/myCateringdustry/index",
+                    "style" :                                                                                    
+					{
+						"navigationBarTitleText": "餐饮",
+						"enablePullDownRefresh": false
+					}
+                
+                }
+                ,{
+                    "path" : "enter/myCateringdustry/addfood",
+                    "style" :                                                                                    
+					{
+						"navigationBarTitleText": "添加菜品",
+						"enablePullDownRefresh": false
+					}
+                
+                }
+                ,{
+                    "path" : "enter/myCateringdustry/addGroupBuying",
+                    "style" :                                                                                    
+					{
+						"navigationBarTitleText": "添加团购",
+						"enablePullDownRefresh": false
+					}
+                
+                },
+				{
+                    "path" : "enter/myCateringdustry/addGroupBuyingNext",
+                    "style" :                                                                                    
+					{
+						"navigationBarTitleText": "添加团购",
+						"enablePullDownRefresh": false
+					}
+                
+                }
+                ,{
+                    "path" : "enter/myCateringdustry/shopSetting/index",
+                    "style" :                                                                                    
+					{
+						"navigationBarTitleText": "设置",
+						"enablePullDownRefresh": false
+					}
+                
+                }
+                ,{
+                    "path" : "enter/myCateringdustry/shopSetting/editShopInformation",
+                    "style" :                                                                                    
+					{
+						"navigationBarTitleText": "店铺信息",
+						"enablePullDownRefresh": false
+					}
+                
+                }
+                ,{
+                    "path" : "enter/myCateringdustry/shopSetting/editShopImage",
+                    "style" :                                                                                    
+					{
+						"navigationBarTitleText": "店铺图片",
+						"enablePullDownRefresh": false
+					}
+                
+                }
+                ,{
+                    "path" : "enter/myCateringdustry/shopSetting/editCertificate",
+                    "style" :                                                                                    
+					{
+						"navigationBarTitleText": "证照",
+						"enablePullDownRefresh": false
+					}
+                
+                }
+                ,{
+                    "path" : "enter/myCateringdustry/shopSetting/editFoodClassify",
+                    "style" :                                                                                    
+					{
+						"navigationBarTitleText": "菜品分类",
+						"enablePullDownRefresh": false
+					}
+                
+                }
+                ,{
+                    "path" : "enter/myCateringdustry/shopSetting/foodInfomation",
+                    "style" :                                                                                    
+					{
+						"navigationBarTitleText": "菜品",
+						"enablePullDownRefresh": false
+					}
+                
+                }
+                ,{
+                    "path" : "enter/myCateringdustry/shopSetting/groupBuying",
+                    "style" :                                                                                    
+                {
+                    "navigationBarTitleText": "团购",
+                    "enablePullDownRefresh": false
+                }
+                
+                }
+                ,{
+                    "path" : "enter/myCateringdustry/shopSetting/lookGroupBuying",
+                    "style" :                                                                                    
+					{
+						"navigationBarTitleText": "团购详情",
+						"enablePullDownRefresh": false
+					}
+                
+                }
+                ,{
+                    "path" : "enter/myCateringdustry/shopSetting/saleroom",
+                    "style" :                                                                                    
+					{
+						"navigationBarTitleText": "销售记录",
+						"enablePullDownRefresh": false
+					}
+                
+                }
+                ,{
+                    "path" : "enter/myHomestay/index",
+                    "style" :                                                                                    
+					{
+						"navigationBarTitleText": "民宿",
+						"enablePullDownRefresh": false
+					}
+                
+                }
+                ,{
+                    "path" : "enter/myHomestay/add",
+                    "style" :                                                                                    
+					{
+						"navigationBarTitleText": "民宿",
+						"enablePullDownRefresh": false
+					}
+                
+                }
+                ,{
+                    "path" : "enter/myHomestay/edit",
+                    "style" :                                                                                    
+					{
+						"navigationBarTitleText": "民宿",
+						"enablePullDownRefresh": false
+					}
+                
+                }
+                ,{
+                    "path" : "enter/myHomestay/search",
+                    "style" :                                                                                    
+					{
+						"navigationBarTitleText": "搜索",
+						"enablePullDownRefresh": false
+					}
+                
+                }
+                ,{
+                    "path" : "notice/noticedetail",
+                    "style" :                                                                                    
+					{
+						"navigationBarTitleText": "通知详情",
+						"enablePullDownRefresh": false
+					}
+                
+                }
+                ,{
+                    "path" : "my/bill",
+                    "style" :                                                                                    
+					{
+						"navigationBarTitleText": "账单",
+						"enablePullDownRefresh": false
+					}
+                
+                }
+            ]
+		}
+	],
+	"preloadRule": {
+			"pages/enter/enter": {
+				"network": "all",
+				"packages": ["pageA"]
+			}
+	}
+}

+ 329 - 0
uni_merchants_enter/pages/enter/enter.vue

@@ -0,0 +1,329 @@
+<template>
+	<view>
+		<view>
+			<u-swiper :list="fileList"
+			autoplay
+			imgMode='aspectFit'
+			height='200'
+			radius='0'
+			:circular="true"
+			@change="e => current = e.current" @click="click">
+				<view slot="indicator" class="indicator">
+					<view
+			            class="indicator__dot"
+			            v-for="(item, index) in fileList"
+			            :key="index"
+			            :class="[index === current && 'indicator__dot--active']">
+			        </view>
+				</view>
+			</u-swiper>
+		</view>
+		<view>
+			 <luyj-grid-link :list="list" @gridExc="clickGrid"></luyj-grid-link>
+			 <u-modal :show="showAuthorizePhone" :showConfirmButton="false">
+			 	<view class="slot-content">
+			 		<view class="auth-card">
+			 			<view class="img">
+			 				<img class="avatar-img" src="@/static/image/logo.png" mode="widthFix">
+			 			</view>
+			 			<view class="content">手机登录后才能查看名片哦~</view>
+			 		</view>
+			 		<view class="auth-btncard">
+			 			<view class="btn-unok">
+			 				<u-button :customStyle="customStyleUnOk" @click="showAuthorizePhone=false" :plain="true">
+			 					拒绝</u-button>
+			 			</view>
+			 			<view class="btn-ok">
+			 				<u-button :customStyle="customStyleOk" open-type="getPhoneNumber"
+			 					@getphonenumber="getPhoneNumber"> 立即登录</u-button>
+			 			</view>
+			 		</view>
+			 	</view>
+			 </u-modal>
+			<u-modal :show="showAuthorizeUser" :showConfirmButton="false">
+				<view class="slot-content">
+					<view class="auth-card">
+						<view class="img">
+							<img class="avatar-img" src="/static/image/logo.png" mode="widthFix">
+						</view>
+						<view class="content">邀请您补全个人信息<br></br>(昵称、头像)</view>
+						<view style="margin-left: 100rpx;margin-right: 100rpx">
+							<u-form :model="userInfo" ref="uForm">
+								<u-form-item label="头像">
+									<button class="avatar-wrapper" open-type="chooseAvatar" @chooseavatar="onChooseAvatar"
+										slot="right">
+										<image class="avatar"
+											:src="userInfo.head?userInfo.head:'https://mmbiz.qpic.cn/mmbiz/icTdbqWNOwNRna42FI242Lcia07jQodd2FJGIYQfG0LAJGFxM4FbnQP6yfMxBgJ0F3YRqJCJ1aPAK2dQagdusBZg/0'">
+										</image>
+									</button>
+								</u-form-item>
+								<u-form-item label="昵称">
+									<u-input inputAlign='right' v-model="userInfo.nickname" class="weui-input"
+										@blur="userNameInput" placeholder="请输入昵称" border="false" />
+									<!-- <input type="nickname" :value="userInfo.nickname" class="weui-input" @blur="userNameInput" placeholder="请输入昵称"/> -->
+								</u-form-item>
+							</u-form>
+						</view>
+					</view>
+					<view class="auth-btncard">
+						<view class="btn-unok"><u-button :customStyle="customStyleUnOk" @click="authUser(0)">
+								拒绝</u-button>
+						</view>
+						<view class="btn-ok">
+							<u-button :customStyle="customStyleOk" @click="authUser(1)"> 允许</u-button>
+						</view>
+					</view>
+				</view>
+			</u-modal>
+		</view>
+	</view>
+</template>
+
+<script>
+	var that
+	import luyjGridLink from '@/uni_modules/lxm-fold-link/luyj-grid-link/components/luyj-grid-link/luyj-grid-link.vue'
+	export default {
+		components: {
+			"luyjGridLink": luyjGridLink
+		},
+		data() {
+			return {
+				fileList:[],
+				showAuthorizePhone:false,
+				showAuthorizeUser:false,
+				userInfo: {
+					head: '',
+					nickname: '',
+					phone: '',
+				},
+				customStyleUnOk: {
+					marginTop: '20rpx',
+					color: '#5F7DE9',
+					border: '2px solid #5F7DE9',
+					"border-radius": "10px",
+					fontSize: "32rpx"
+				},
+				customStyleOk: {
+					marginTop: '20rpx',
+					color: '#fff',
+					border: '2px solid #5F7DE9',
+					"border-radius": "10px",
+					fontSize: "32rpx",
+					background: "#5F7DE9"
+				},
+				list: [
+					{
+				        title: '全部分类',
+				        // cur: 'basic',
+				        bgColor: '', // 背景颜色
+				        color: 'blue',
+				        title_show: true,
+				        showAll: false,
+				        colNumber: 4, // 显示的列数
+				        iconsList: [
+							{
+								cuIcon: '1_canyin-35',
+								color: 'blue',
+								name: '餐饮',
+								url: '/pageA/enter/cateringindustry'
+							},
+							{
+								cuIcon: 'zufang',
+								color: 'blue',
+								name: '民宿',
+								url: '/pageA/enter/homestay'
+							},
+							{
+				                cuIcon: 'jiudian-38',
+				                color: 'blue',
+				                name: '酒店',
+				                 url: '/pageA/enter/hotel'
+				            }
+				        ]
+				    },
+					{
+						title: '我的入驻',
+						// cur: 'basic',
+						bgColor: '', // 背景颜色
+						color: 'blue',
+						title_show: true,
+						showAll: false,
+						colNumber: 4, // 显示的列数
+						iconsList: [
+							{
+								cuIcon: '1_canyin-35',
+								color: 'blue',
+								name: '餐饮',
+								url: '/pageA/enter/cateringindustry'
+							},
+							{
+								cuIcon: 'zufang',
+								color: 'blue',
+								name: '民宿',
+								url: '/pageA/enter/homestay'
+							},
+							{
+						        cuIcon: 'jiudian-38',
+						        color: 'blue',
+						        name: '酒店',
+						         url: '/pageA/enter/hotel'
+						    }
+						]
+						},
+				    ], 
+			}
+		},
+		onLoad(){
+			that = this
+			this.getList()
+		},
+		onShow: function() {
+			let _isLoad = uni.getStorageSync("scanAddCardToIndex")
+			if (uni.getStorageSync("userInfo").phone) {
+				// that.$request.baseRequest('admin.unimall.cardNewsInfo', 'list', {
+				// 	receiveId: uni.getStorageSync("userInfo").id,
+				// }, failres => {
+				// 	console.log('res+++++', failres.errmsg)
+				// 	that.$refs.uToast.show({
+				// 		type: 'error',
+				// 		message: failres.errmsg,
+				// 	})
+				// }).then(res => {
+				// 	that.noticeList = res.data.items
+				// 	if (that.noticeList.length > 0) {
+				// 		var data = that.noticeList.filter((item) => {
+				// 			return item.newsFlag == 0
+				// 		})
+				// 		that.unread = data ? data.length : 0
+				// 	}
+				// 	console.log(that.unread)
+				// })
+			} else {
+				this.showAuthorizePhone = true
+			}
+		
+		},
+		methods: {
+			getList(){
+				 this.$request.baseRequest('admin.tourism.carouselManagement', 'list', {
+					page: 1,
+					limit: 9999,
+					classify:'商家版首页'
+				 }, failres => {
+					uni.showToast({
+						icon: "none",
+						title: failres.errmsg,
+						duration: 3000
+					});	
+				 }).then(res => {
+					this.fileList=res.data.items
+				 })
+			},
+			toDetail(url){
+				uni.navigateTo({
+					url:url
+				})
+			},
+			async getPhoneNumber(e) {
+				that.userInfo = await this.$request.wxlogin()
+				that.userInfo.phone = await this.$request.getPhone(e, that.userInfo)
+				this.showAuthorizePhone = false
+				this.showAuthorizeUser = true
+			
+			},
+			async authUser(type) {
+				//同步信息,没有头像和昵称自动生成
+				this.userInfo = await this.$request.syncInfo(this.userInfo)
+				if (this.userInfo.openId) {
+					uni.setStorageSync("userInfo", that.userInfo)
+					that.showAuthorizeUser = false
+					// that.mescroll.resetUpScroll()
+				}
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+.slot-content {
+		width: 100%;
+	}
+
+
+
+	/deep/.u-checkbox-group {
+
+		position: absolute;
+		right: 20px;
+		z-index: 99;
+		top: 30px;
+	}
+
+	/deep/.u-checkbox__icon-wrap.u-checkbox__icon-wrap--square {
+		border-color: #D7DEEB !important;
+	}
+
+
+
+	/deep/.mescroll-body {
+		min-height: 558px !important;
+		height: 558px !important;
+		background-color: green;
+		overflow: scroll !important;
+	}
+
+	.auth-btncard {
+		display: flex !important;
+		justify-content: space-between !important;
+
+		.btn-unok {
+			width: 40%;
+		}
+
+		.btn-ok {
+			width: 40%;
+		}
+	}
+
+	.auth-card {
+		text-align: center;
+
+		.avatar-img {
+			width: 250rpx;
+		}
+
+		.title {
+			font-size: 20rpx;
+		}
+
+		.content {
+			font-size: 32rpx;
+			font-weight: bold;
+			color: #1A1A1A;
+			margin-bottom: 30rpx;
+		}
+	}
+
+	.avatar-wrapper {
+		color: #333 !important;
+		border: none !important;
+		border-radius: 0 !important;
+		background-color: transparent !important;
+		padding: 0;
+	}
+
+	.avatar-wrapper::after {
+		border: none !important;
+	}
+
+	.avatar {
+		width: 100rpx;
+		height: 100rpx;
+		overflow: hidden;
+		border-radius: 100%;
+	}
+
+	/deep/.u-popup__content {
+		border-radius: 20rpx !important;
+	}
+</style>

+ 22 - 0
uni_merchants_enter/pages/my/my.vue

@@ -0,0 +1,22 @@
+<template>
+	<view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style>
+
+</style>

+ 98 - 0
uni_merchants_enter/pages/notice/index.vue

@@ -0,0 +1,98 @@
+<template>
+	<view>
+			<view class='notice-wrap' v-for='item in noticeList'>
+				<view class="flex justify-space-between">
+					<view style='width:100px;margin:10rpx 0;' class='flex justify-space-between'>
+						<u--image :showLoading="true" src="/static/image/enter/news.png" width="52rpx" height="52rpx"></u--image>
+						<view>{{item.newsTitle}}</view>
+					</view>
+					
+					<view class='date'>{{parseTime(item.gmtCreate)}}</view>
+				</view>
+				<view class='content'>{{item.newsContent}}</view>
+			</view>
+		<!-- </mescroll-body> -->
+		<u-toast ref="uToast"></u-toast>
+	</view>
+</template>
+
+<script>
+	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
+	export default {
+		mixins: [MescrollMixin],
+		data() {
+			return {
+				noticeList:[],
+				unreadList:[]
+			};
+		},
+		onShow() {
+			this.getList()
+		},
+		
+		methods:{
+			getList(){
+				var that = this
+				uni.showLoading({
+						title: '数据加载中'
+					})
+				this.$request.baseRequest('admin.tourism.noticeMessageInfo', 'list',{
+					receiveId:uni.getStorageSync("userInfo").id,
+				}, failres => {
+					uni.showToast({
+						icon:"none",
+						title: failres.errmsg,
+						duration: 3000
+					});
+					uni.hideLoading()
+				}).then(res => {
+					let curPageLen = res.data.items.length;
+					let totalPage = res.data.total;
+					this.noticeList=res.data.items
+					if(this.noticeList.length>0){
+						var data=this.noticeList.filter((item)=>{return item.newsFlag==0})
+						this.unreadList=data
+						if(this.unreadList.length>0){
+							for(var i=0;i<this.unreadList.length;i++){
+								if(this.unreadList[i].newsFlag==0){
+									this.unreadList[i].newsFlag=1
+									this.$request.baseRequest('admin.tourism.noticeMessageInfo', 'update',{
+										noticeMessageInfo:JSON.stringify(this.unreadList[i]),
+									}, failres => {
+										uni.showToast({
+											icon:"none",
+											title: failres.errmsg,
+											duration: 3000
+										});
+										uni.hideLoading()
+									}).then(res => {})
+								}
+								
+							}
+							
+						}
+					}
+					
+					uni.hideLoading()
+				})
+			},
+		}
+		
+	}
+</script>
+
+<style lang="scss" scoped>
+.notice-wrap{
+	background:#fff;
+	padding:20rpx;
+	margin:10rpx;
+	border-radius:20rpx;
+}
+.date{
+	color:#CCCCCC;
+}
+.content{
+	font-size:26rpx;
+	color:#666;
+}
+</style>

BIN
uni_merchants_enter/static/image/enter/camera.png


BIN
uni_merchants_enter/static/image/enter/jingyingxukezheng.png


BIN
uni_merchants_enter/static/image/enter/news.png


BIN
uni_merchants_enter/static/image/enter/yingyezhizhao.png


BIN
uni_merchants_enter/static/image/logo.png


BIN
uni_merchants_enter/static/image/nav-icon/antOutline-team Copy.png


BIN
uni_merchants_enter/static/image/nav-icon/antOutline-team.png


BIN
uni_merchants_enter/static/image/nav-icon/antOutline-user Copy.png


BIN
uni_merchants_enter/static/image/nav-icon/antOutline-user.png


BIN
uni_merchants_enter/static/image/nav-icon/md-notifications_none Copy.png


BIN
uni_merchants_enter/static/image/nav-icon/md-notifications_none.png


BIN
uni_merchants_enter/static/image/yjt.png


Некоторые файлы не были показаны из-за большого количества измененных файлов