Browse Source

气瓶1.0

qianduan 11 months ago
parent
commit
e5c4407e47
100 changed files with 4693 additions and 535 deletions
  1. 92 0
      components/firmTree.vue
  2. 44 35
      components/orderManagement.vue
  3. 70 10
      components/x-form.vue
  4. 0 94
      components/x-modal.vue
  5. 7 1
      pages.json
  6. 5 5
      pages/codeLogin.vue
  7. 63 47
      pages/home/company.vue
  8. 72 41
      pages/home/index.vue
  9. 119 0
      pages/home/locationArea.vue
  10. 49 56
      pages/index/codeTracing.vue
  11. 26 5
      pages/indexRouter.vue
  12. 17 13
      pages/login.vue
  13. 45 7
      pages/mine/addAddress.vue
  14. 7 3
      pages/mine/address.vue
  15. 7 20
      pages/mine/index.vue
  16. 59 8
      pages/mine/password.vue
  17. 73 71
      pages/mine/personal.vue
  18. 4 14
      pages/mine/system.vue
  19. 205 20
      pages/order/booking.vue
  20. 17 8
      pages/order/index.vue
  21. 10 7
      pages/order/orderDetails.vue
  22. 29 15
      pages/register.vue
  23. 0 0
      unpackage/dist/build/.automator/h5/.automator.json
  24. BIN
      unpackage/dist/build/h5.zip
  25. 2 0
      unpackage/dist/build/h5/index.html
  26. 539 0
      unpackage/dist/build/h5/static/fonts/demo.css
  27. 372 0
      unpackage/dist/build/h5/static/fonts/demo_index.html
  28. 47 0
      unpackage/dist/build/h5/static/fonts/iconfont.css
  29. 0 0
      unpackage/dist/build/h5/static/fonts/iconfont.js
  30. 65 0
      unpackage/dist/build/h5/static/fonts/iconfont.json
  31. BIN
      unpackage/dist/build/h5/static/fonts/iconfont.ttf
  32. BIN
      unpackage/dist/build/h5/static/fonts/iconfont.woff
  33. BIN
      unpackage/dist/build/h5/static/fonts/iconfont.woff2
  34. BIN
      unpackage/dist/build/h5/static/image/bottle.png
  35. BIN
      unpackage/dist/build/h5/static/img/bottle.763282cd.png
  36. BIN
      unpackage/dist/build/h5/static/img/logo.b5ab4a74.png
  37. BIN
      unpackage/dist/build/h5/static/img/portrait.2071eb3d.png
  38. 0 0
      unpackage/dist/build/h5/static/index.2da1efab.css
  39. 91 0
      unpackage/dist/build/h5/static/js/announcements.js
  40. 176 0
      unpackage/dist/build/h5/static/js/blockSort.js
  41. 0 0
      unpackage/dist/build/h5/static/js/chunk-vendors.d7b63a81.js
  42. 370 0
      unpackage/dist/build/h5/static/js/districtCode.js
  43. 0 0
      unpackage/dist/build/h5/static/js/index.3d82c1fb.js
  44. 0 0
      unpackage/dist/build/h5/static/js/pages-codeLogin.772840e4.js
  45. 0 0
      unpackage/dist/build/h5/static/js/pages-codeLogin~pages-home-company~pages-home-locationArea~pages-indexRouter~pages-login~pages-mine-~1a74a0f9.bb773396.js
  46. 0 0
      unpackage/dist/build/h5/static/js/pages-codeLogin~pages-home-company~pages-indexRouter~pages-login~pages-mine-addAddress~pages-mine-pa~e8dd54d0.d664e738.js
  47. 0 0
      unpackage/dist/build/h5/static/js/pages-codeLogin~pages-login~pages-mine-addAddress~pages-mine-password~pages-mine-personal~pages-orde~4e410aa3.5a2ebf40.js
  48. 0 0
      unpackage/dist/build/h5/static/js/pages-codeLogin~pages-login~pages-mine-addAddress~pages-mine-personal~pages-order-booking~pages-orde~e0ed96cf.d4f80046.js
  49. 0 0
      unpackage/dist/build/h5/static/js/pages-home-company.b3c8a28a.js
  50. 0 0
      unpackage/dist/build/h5/static/js/pages-home-index.1aaa7433.js
  51. 0 0
      unpackage/dist/build/h5/static/js/pages-home-locationArea.056f433a.js
  52. 0 0
      unpackage/dist/build/h5/static/js/pages-index-codeTracing.71dec87d.js
  53. 0 0
      unpackage/dist/build/h5/static/js/pages-indexRouter.124af528.js
  54. 0 0
      unpackage/dist/build/h5/static/js/pages-indexRouter~pages-information-index~pages-order-index.3d853214.js
  55. 0 0
      unpackage/dist/build/h5/static/js/pages-indexRouter~pages-mine-system~pages-order-index.5232c76f.js
  56. 0 0
      unpackage/dist/build/h5/static/js/pages-information-index.0988a4ff.js
  57. 0 0
      unpackage/dist/build/h5/static/js/pages-login.3e16aada.js
  58. 0 0
      unpackage/dist/build/h5/static/js/pages-mine-addAddress.cc2c8e01.js
  59. 0 0
      unpackage/dist/build/h5/static/js/pages-mine-address.9cc3107a.js
  60. 0 0
      unpackage/dist/build/h5/static/js/pages-mine-index.bce674b2.js
  61. 0 0
      unpackage/dist/build/h5/static/js/pages-mine-password.06669abe.js
  62. 0 0
      unpackage/dist/build/h5/static/js/pages-mine-personal.edd8cdff.js
  63. 0 0
      unpackage/dist/build/h5/static/js/pages-mine-system.f65e70ef.js
  64. 0 0
      unpackage/dist/build/h5/static/js/pages-order-booking.a095fa88.js
  65. 0 0
      unpackage/dist/build/h5/static/js/pages-order-completionTasks.f14c59c1.js
  66. 0 0
      unpackage/dist/build/h5/static/js/pages-order-delivery.78bd3e3e.js
  67. 0 0
      unpackage/dist/build/h5/static/js/pages-order-delivery~pages-order-securityCheck.be734f40.js
  68. 0 0
      unpackage/dist/build/h5/static/js/pages-order-index.477c3322.js
  69. 0 0
      unpackage/dist/build/h5/static/js/pages-order-orderDetails.75906ab6.js
  70. 0 0
      unpackage/dist/build/h5/static/js/pages-order-securityCheck.aa8b57cc.js
  71. 0 0
      unpackage/dist/build/h5/static/js/pages-order-signatureBoard.48754c2f.js
  72. 0 0
      unpackage/dist/build/h5/static/js/pages-register.0dc6c19a.js
  73. BIN
      unpackage/dist/build/h5/static/logo.png
  74. BIN
      unpackage/dist/build/h5/static/portrait.png
  75. BIN
      unpackage/dist/build/h5/static/tab/dd.png
  76. BIN
      unpackage/dist/build/h5/static/tab/dd_s.png
  77. BIN
      unpackage/dist/build/h5/static/tab/sy.png
  78. BIN
      unpackage/dist/build/h5/static/tab/sy_s.png
  79. BIN
      unpackage/dist/build/h5/static/tab/wd.png
  80. BIN
      unpackage/dist/build/h5/static/tab/wd_s.png
  81. BIN
      unpackage/dist/build/h5/static/tab/xx.png
  82. BIN
      unpackage/dist/build/h5/static/tab/xx_s.png
  83. 1 2
      unpackage/dist/dev/app-plus/app-config-service.js
  84. 0 0
      unpackage/dist/dev/app-plus/app-service.js
  85. 249 53
      unpackage/dist/dev/app-plus/app-view.js
  86. 85 0
      utils/distance.js
  87. 21 0
      uview-ui/LICENSE
  88. 66 0
      uview-ui/README.md
  89. 362 0
      uview-ui/changelog.md
  90. 78 0
      uview-ui/components/u--form/u--form.vue
  91. 47 0
      uview-ui/components/u--image/u--image.vue
  92. 73 0
      uview-ui/components/u--input/u--input.vue
  93. 44 0
      uview-ui/components/u--text/u--text.vue
  94. 48 0
      uview-ui/components/u--textarea/u--textarea.vue
  95. 54 0
      uview-ui/components/u-action-sheet/props.js
  96. 278 0
      uview-ui/components/u-action-sheet/u-action-sheet.vue
  97. 59 0
      uview-ui/components/u-album/props.js
  98. 259 0
      uview-ui/components/u-album/u-album.vue
  99. 44 0
      uview-ui/components/u-alert/props.js
  100. 243 0
      uview-ui/components/u-alert/u-alert.vue

+ 92 - 0
components/firmTree.vue

@@ -0,0 +1,92 @@
+<!-- firmTree.vue -->
+<template>
+	<view>
+		<view class="item_tree" @click="toggleNode">
+			<view class="tree_title" :style="{paddingLeft:item.children.length > 0 ? '20rpx' : '0rpx'}">
+				<view class="card_icon_arrow" v-if="item.children.length > 0">
+					<u-icon name="arrow-right" v-if="!expanded"></u-icon>
+					<u-icon name="arrow-down" v-else></u-icon>
+				</view>
+				<view class="left_title">
+					<view class="name_tree_item">{{ item.name }}</view>
+					<view class="distance_title" v-if="getDistance(item.provStore.lat,item.provStore.lng)">
+						距您{{getDistance(item.provStore.lat,item.provStore.lng)}}</view>
+				</view>
+			</view>
+			<view>
+				<u-button type="primary" size="small" text="确定" @click.native="choice(item)"></u-button>
+			</view>
+		</view>
+		<view v-if="item.children && item.children.length && expanded">
+			<firm-tree @confirm="confirm" v-for="child in item.children" :key="child.id" :item="child"></firm-tree>
+		</view>
+	</view>
+</template>
+
+<script>
+	import calculateDistance from '@/utils/distance.js'
+	export default {
+		name: 'firmTree',
+		props: ['item'],
+		data() {
+			return {
+				expanded: false // 初始状态为折叠
+			};
+		},
+		methods: {
+			getDistance(value, value1) {
+				const arr = value + ',' + value1
+				const arr1 = calculateDistance(arr)
+				return arr1
+			},
+			toggleNode() {
+				this.expanded = !this.expanded; // 切换展开和折叠状态
+			},
+			choice(value) {
+				this.$emit('confirm', value.id)
+			},
+			confirm(cmpCode) {
+				this.$emit('confirm', cmpCode)
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.item_tree {
+		display: flex;
+		align-items: center;
+		justify-content: space-between;
+		padding: 20rpx;
+		border-bottom: 2rpx solid transparent;
+		border-image: linear-gradient(to bottom, transparent 50%, #e7e6e4 50%) 0 0 100% 0;
+	}
+
+	.tree_title {
+		position: relative;
+		display: flex;
+		align-items: center;
+		// padding-left: 20rpx;
+	}
+
+	.card_icon_arrow {
+		position: absolute;
+		left: 0rpx;
+	}
+
+	.left_title {
+		margin-left: 20rpx;
+	}
+
+	.name_tree_item {
+		color: #303133;
+		font-size: 30rpx;
+		font-weight: 600;
+	}
+
+	.distance_title {
+		margin-top: 10rpx;
+		font-size: 24rpx;
+		color: #909399;
+	}
+</style>

+ 44 - 35
components/orderManagement.vue

@@ -1,18 +1,10 @@
 <template>
 	<view class="card_order_management">
-		<view class="card_order" v-for="(item,index) in datalist" :key="index" v-if="datalist.length > 0">
+		<view class="card_order frame" v-for="(item,index) in datalist" :key="index" v-if="datalist.length > 0">
 			<view @click="goDetails(item)">
 				<view class="space_between">
 					<view class="item_headline" v-if="item.goods && item.spec">{{item.goods.name}}{{item.spec.name}}
 					</view>
-					<view v-if="item.state == 5">
-						<view class="item_tag" v-if="item.customer.isSyncProv">
-							<u-tag text="已完善" plain size="mini" type="success"></u-tag>
-						</view>
-						<view class="item_tag" v-else>
-							<u-tag text="补全客户信息" plain size="mini" @click="goCompletionTasks(item)"></u-tag>
-						</view>
-					</view>
 					<view v-if="item.state == 3 || item.state == 4">
 						<view class="details_title" style="color: #5ac725;" v-if="item.state == 3">已送达</view>
 						<view class="details_title" style="color: #f56c6c;" v-else-if="item.state == 4">已取消</view>
@@ -20,16 +12,14 @@
 				</view>
 				<view class="item_num">×{{item.quantity}}</view>
 				<view class="item_address">配送地址:{{item.address}}</view>
-				<view class="item_address" v-if="item.state == 5">联系电话:{{item.phone}}
-					<u-icon color="#70B603" size="26" name="phone-fill" @click.native.stop="phone(item.phone)"></u-icon>
+				<view class="item_address" v-if="item.state == 5">送气员电话:{{item.user.phone}}
+					<u-icon color="#70B603" size="26" name="phone-fill"
+						@click.native.stop="phone(item.user.phone)"></u-icon>
 				</view>
 				<view class="item_address">下单时间:{{item.orderTime}}</view>
 				<view class="item_address" v-if="item.state == 3">送达时间:{{item.arriveTime}}</view>
 			</view>
-			<view v-if="item.state == 2">
-				<u-button type="primary" @click="toDeliver(item)">去配送</u-button>
-			</view>
-			<view class="card_delivery" v-if="item.state == 5">
+			<view class="card_delivery" v-if="item.state == 1 || item.state == 2">
 				<view style="margin-right: 10rpx;flex: 1;">
 					<u-button type="primary" @click="goSecurityCheck(item)">修改订单</u-button>
 				</view>
@@ -50,7 +40,9 @@
 			}
 		},
 		data() {
-			return {}
+			return {
+				orderId: null,
+			}
 		},
 		methods: {
 			goDetails(value) {
@@ -59,21 +51,17 @@
 					url: '/pages/order/orderDetails'
 				});
 			},
-			// 入户安全检查
+			//修改订单
 			goSecurityCheck(row) {
+				this.$cache.setCache('orderList', row)
 				uni.navigateTo({
-					url: '/pages/order/securityCheck?orderId=' + row.orderId + '&customerId=' + row.customerId
+					url: '/pages/order/booking?companyId=' + row.storeId + '&revamp=' + true
 				});
 			},
-			// 确认送达
+			// 取消订单
 			confirmedDelivery(row) {
-				if (row.customer.isSyncProv) {
-					uni.navigateTo({
-						url: '/pages/order/delivery?id=' + '99' + '&title=' + '确定送达' + '&orderId=' + row.id
-					});
-				} else {
-					uni.$u.toast('请先完善客户信息')
-				}
+				this.orderId = row.id
+				this.$emit('confirmedDelivery', this.orderId)
 			},
 			// 补全用户信息
 			goCompletionTasks(row) {
@@ -81,10 +69,6 @@
 					url: '/pages/order/completionTasks?customerId=' + row.customerId
 				});
 			},
-			// 去配送
-			toDeliver(row) {
-				this.$emit('toDeliver', row)
-			},
 			phone(phone) {
 				console.log(phone, 66)
 			}
@@ -93,6 +77,10 @@
 </script>
 
 <style lang="scss" scoped>
+	::v-deep .u-modal__content__text {
+		text-align: center;
+	}
+
 	.card_order_management {
 		margin: 0rpx 20rpx;
 		display: flex;
@@ -103,13 +91,32 @@
 	.card_order {
 		width: calc(100% - 40rpx);
 		margin-top: 20rpx;
-		border: 1rpx solid rgba(215, 215, 215, 1);
+		// border: 1rpx solid rgba(215, 215, 215, 1);
 		border-radius: 8rpx;
-		padding: 30rpx 20rpx;
+		padding: 30rpx 20rpx 10rpx 20rpx;
+	}
+
+	// 伪元素1rpx边框
+	.frame {
+		position: relative; //重要
+	}
+
+	.frame::after {
+		position: absolute;
+		content: '';
+		border: 2rpx solid #e7e6e4;
+		border-radius: 16rpx;
+		width: 200%;
+		height: 200%;
+		top: 0;
+		left: 0;
+		transform: scale(0.5);
+		transform-origin: 0 0;
+		pointer-events: none; /* 使伪元素不会阻止鼠标事件 */
 	}
 
 	.item_headline {
-		font-size: 40rpx;
+		font-size: 36rpx;
 		font-weight: 800;
 	}
 
@@ -119,13 +126,14 @@
 	}
 
 	.details_title {
-		font-size: 30rpx;
+		font-size: 26rpx;
 		font-weight: 500;
 	}
+
 	.item_address {
 		display: flex;
 		align-items: center;
-		font-size: 30rpx;
+		font-size: 26rpx;
 		color: #7f7f7f;
 		margin-bottom: 20rpx;
 	}
@@ -134,5 +142,6 @@
 		display: flex;
 		align-items: center;
 		justify-content: center;
+		margin-bottom: 20rpx;
 	}
 </style>

+ 70 - 10
components/x-form.vue

@@ -1,12 +1,12 @@
 <template>
 	<view>
-		<u--form labelPosition="top" labelWidth="auto" :model="model" :rules="rules" ref="uForm">
+		<u-form labelPosition="top" labelWidth="auto" :model="model" :rules="rules" ref="uForm">
 			<view v-for="(item,index) in list" :key="index">
 				<u-form-item :required="item.required ? true : false" :label="item.label" :prop="item.field"
 					v-if="item.type == 'input' && !item.visible">
 					<view class="card_form_item">
-						<u--input v-model="model[`${item.field}`]" :disabled="item.disabled ? true : false"
-							:placeholder="item.placeholder"></u--input>
+						<u-input v-model="model[`${item.field}`]" :disabled="item.disabled ? true : false"
+							:type="item.genre || 'text'" :placeholder="item.placeholder"></u-input>
 					</view>
 				</u-form-item>
 				<u-form-item :required="item.required ? true : false" :label="item.label" :prop="item.field"
@@ -21,9 +21,10 @@
 				</u-form-item>
 				<u-form-item :required="item.required ? true : false" :label="item.label" :prop="item.field"
 					v-else-if="item.type == 'cascader' || item.type == 'select' && !item.visible">
-					<view class="card_form_item">
-						<u--input :placeholder="item.placeholder" suffixIcon="arrow-down"
-							v-model="model[`${item.field}`]" @focus="change(item)"></u--input>
+					<view class="card_selector frame" @click="change(item)">
+						<span style="color: #303133;" v-if="model[`${item.field}`]">{{model[`${item.field}`]}}</span>
+						<span v-else>{{item.placeholder}}</span>
+						<u-icon name="arrow-down"></u-icon>
 					</view>
 				</u-form-item>
 				<u-form-item :required="item.required ? true : false" :label="item.label" :prop="item.field"
@@ -54,14 +55,15 @@
 					</view>
 				</u-form-item>
 			</view>
-		</u--form>
-		<u-picker :show="singleShow" :columns="columns"  keyName="label" @cancel="singleShow = false"></u-picker>
+		</u-form>
+		<u-picker :show="singleShow" :columns="columns" :defaultIndex="downIndex" keyName="label"
+			@cancel="singleShow = false" @confirm="confirmEnsure"></u-picker>
 		<u-picker :show="show" ref="uPicker" :columns="addressColumns" :defaultIndex="areaDetault" keyName="label"
 			@confirm="confirm" @change="changeHandler" @cancel="cancel"></u-picker>
 		<view style="width: 100%;height: 170rpx;"></view>
 		<view class="check_btn">
 			<view class="btn_submit">
-				<u-button type="primary" :text="btnTitle" @click="clientele"></u-button>
+				<u-button type="primary" :loading="loading" :text="btnTitle" @click="clientele"></u-button>
 			</view>
 		</view>
 	</view>
@@ -104,6 +106,12 @@
 				default () {
 					return '提交'
 				}
+			},
+			loading: {
+				type: Boolean,
+				default () {
+					return false
+				}
 			}
 		},
 		data() {
@@ -115,12 +123,14 @@
 				areaDetault: [], //默认选中数据
 				fileList1: [],
 				columns: [],
+				fieldType: '',
+				downIndex: [],
 			}
 		},
 		mounted() {},
 		methods: {
 			change(value) {
-				console.log(value,25)
+				this.fieldType = value.field
 				if (value.type == 'cascader') {
 					this.show = true
 					this.addressColumns = [
@@ -133,10 +143,31 @@
 						}
 					})
 				} else {
+					this.downIndex = []
+					let orderId = null
+					if (value.field == 'commodity') {
+						orderId = this.model.goodsId
+					} else if (value.field == 'specification') {
+						orderId = this.model.specId
+					}
+					value.options[0].forEach((item, index) => {
+						if (item.value == orderId) {
+							this.downIndex.push(index)
+						}
+					})
 					this.columns = value.options
 					this.singleShow = true
 				}
 			},
+			confirmEnsure(value) {
+				const param = {
+					id: value.value[0].value,
+					type: this.fieldType,
+				}
+				this.model[this.fieldType] = value.value[0].label
+				this.singleShow = false
+				this.$emit('confirmEnsure', param)
+			},
 			confirm(value) {
 				let arr = value.value
 				let arr1 = []
@@ -295,4 +326,33 @@
 		padding-bottom: 20rpx;
 		width: calc(100% - 80rpx);
 	}
+
+	.card_selector {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		width: 100%;
+		padding: 6px 9px;
+		border-radius: 8rpx;
+		color: rgb(192, 196, 204);
+		font-size: 28rpx;
+		line-height: 42rpx;
+	}
+	
+	// 伪元素1rpx边框
+	.frame {
+		position: relative; //重要
+	}
+	.frame::after {
+		position: absolute;
+		content: '';
+		border: 2rpx solid #e7e6e4;
+		border-radius: 16rpx;
+		width: 200%;
+		height: 200%;
+		top: 0;
+		left: 0;
+		transform: scale(0.5);
+		transform-origin: 0 0;
+	}
 </style>

+ 0 - 94
components/x-modal.vue

@@ -1,94 +0,0 @@
-<template>
-	<!-- 模态框 -->
-	<view class="card_modal center_in" v-if="showModal">
-		<view class="card_lk">
-			<view class="modal_title">{{title}}</view>
-			<view class="btn_modal">
-				<view class="item_btn center_in" @click="close">取消</view>
-				<view class="item_btn center_in" style="color: #f1a532;">删除</view>
-			</view>
-		</view>
-	</view>
-</template>
-
-<script>
-	export default {
-		name: 'x-modal',
-		props: {
-			show: {
-				type: Boolean,
-				default () {
-					return false
-				}
-			},
-			title: {
-				type: String,
-				default () {
-					return ''
-				}
-			},
-		},
-		watch: {
-			show: {
-				handler(newVal) {
-					if (newVal) {
-						this.showModal = true
-					} else {
-						this.showModal = false
-					}
-				},
-				deep: true // 开启深度监听
-			}
-		},
-		data() {
-			return {
-				showModal: false,
-			}
-		},
-		methods:{
-			close(){
-				this.$emit('close')
-			}
-		}
-	}
-</script>
-
-<style lang="scss" scoped>
-	.card_modal {
-		position: fixed;
-		z-index: 10070;
-		inset: 0px;
-		background-color: rgba(0, 0, 0, 0.5);
-	}
-
-	.card_lk {
-		width: 60%;
-		display: flex;
-		flex-direction: column;
-		background-color: #fff;
-		border-radius: 30rpx;
-	}
-
-	.modal_title {
-		text-align: center;
-		font-size: 30rpx;
-		font-weight: 600;
-		padding: 30rpx 50rpx;
-	}
-
-	.btn_modal {
-		display: flex;
-		border-top: 1rpx solid #e7e6e4;
-	}
-
-	.item_btn {
-		flex: 1;
-		padding: 20rpx;
-		font-size: 30rpx;
-		font-weight: 600;
-	}
-
-	.item_btn:nth-child(1) {
-		border-right: 1rpx solid #e7e6e4;
-	}
-</style>

+ 7 - 1
pages.json

@@ -3,7 +3,7 @@
 		"autoscan": true, //是否自动扫描组件
 		"custom": {
 			"^x-(.*)": "@/components/x-$1.vue", // 匹配components目录内的vue文件
-			"^u-(.*)": "uview-ui/components/u-$1/u-$1.vue"
+			"^u-(.*)": "@/uview-ui/components/u-$1/u-$1.vue"
 		}
 	},
 	"pages": [{
@@ -44,6 +44,12 @@
 			}
 		},
 		{
+			"path": "pages/home/locationArea",
+			"style": {
+				"navigationStyle": "custom"
+			}
+		},
+		{
 			"path": "pages/index/codeTracing",
 			"style": {
 				"navigationStyle": "custom"

+ 5 - 5
pages/codeLogin.vue

@@ -7,16 +7,16 @@
 				<image class="mine_image" src="../static/logo.png" mode=""></image>
 				<view class="welcome_title">欢迎登录宝智达气瓶</view>
 			</view>
-			<u--form labelPosition="left" :model="formList" :rules="rules" ref="uForm">
+			<u-form labelPosition="left" :model="formList" :rules="rules" ref="uForm">
 				<u-form-item label="手机号" prop="phone" labelWidth="80" borderBottom ref="item1">
-					<u--input v-model="formList.phone" border="none" placeholder="请填写手机号"></u--input>
+					<u-input v-model="formList.phone" border="none" placeholder="请填写手机号"></u-input>
 				</u-form-item>
 				<u-form-item label="验证码" prop="verifyCode" labelWidth="80" borderBottom>
-					<u--input v-model="formList.verifyCode" border="none" placeholder="请填写验证码"></u--input>
+					<u-input v-model="formList.verifyCode" border="none" placeholder="请填写验证码"></u-input>
 					<u-button slot="right" @tap="getCode" :text="tips" type="success" size="mini"
 						:disabled="disabled1"></u-button>
 				</u-form-item>
-			</u--form>
+			</u-form>
 			<u-code ref="uCode" @change="codeChange" seconds="90" @start="disabled1 = true"
 				@end="disabled1 = false"></u-code>
 			<view class="btn_login">
@@ -152,10 +152,10 @@
 							phone: this.formList.phone,
 						}).then(res => {
 							if (res.code == 200) {
-								uni.hideLoading();
 								// 这里此提示会被this.start()方法中的提示覆盖
 								uni.$u.toast('验证码已发送');
 							}
+							uni.hideLoading();
 						})
 					} else {
 						uni.$u.toast('请先输入手机号');

+ 63 - 47
pages/home/company.vue

@@ -2,15 +2,9 @@
 	<!-- 选择公司 -->
 	<view>
 		<u-navbar title="选择公司" autoBack placeholder></u-navbar>
-		<view class="card_company" v-if="list.length > 0">
+		<view class="card_company" v-if="treeList.length > 0">
 			<view class="hint_title">请选择燃气公司</view>
-			<view class="item_company" v-for="(item,index) in list" :key="index" @click="goBooking">
-				<u--image :showLoading="true" :src="src" width="80px" height="80px" @click="click"></u--image>
-				<view class="wordage">
-					<view class="title_company">{{item.title}}</view>
-					<view class="distance_title">距您{{item.num}}</view>
-				</view>
-			</view>
+			<firm-tree v-for="item in treeList" :key="item.id" :item="item" @confirm="confirm"></firm-tree>
 		</view>
 		<view style="margin-top: 30%;" v-else>
 			<u-empty mode="list" text="该区/县暂无商家入驻"></u-empty>
@@ -19,26 +13,71 @@
 </template>
 
 <script>
+	import firmTree from '@/components/firmTree.vue';
+	import {
+		urbanArea
+	} from '@/static/js/districtCode.js'
 	export default {
+		components: {
+			firmTree
+		},
 		data() {
 			return {
 				src: 'https://cdn.uviewui.com/uview/album/1.jpg',
-				list: [{
-					title: '宝智达燃气有限公司',
-					num: '10.12km',
-				}, {
-					title: '宝智达燃气有限公司',
-					num: '10.12km',
-				}, ]
+				treeList: [],
+				areaData: urbanArea(), //原始数据
 			}
 		},
+		mounted() {
+			this.getList()
+		},
 		methods: {
-			// 去订气
-			goBooking() {
+			getList() {
+				var city1 = this.$cache.getCache('city')
+				var district2 = this.$cache.getCache('district')
+				let params = {
+					city: '',
+					district: ''
+				}
+				if (city1) {
+					params.city = this.cityScreening(city1, this.areaData)
+				} else if (district2) {
+					params.district = this.cityScreening(district2, this.areaData)
+				}
+				this.$api.get('/api/applet/store', params).then(res => {
+					if (res.code == 200) {
+						this.treeList = res.data
+					}
+				})
+			},
+			// 城市筛选
+			cityScreening(value, list) {
+				function getChildById(parentArray, id) {
+					for (let i = 0; i < parentArray.length; i++) {
+						if (parentArray[i].label === id) { // 如果当前元素的ID与目标ID相等,则返回该元素
+							return parentArray[i];
+						} else if (parentArray[i].children && Array.isArray(parentArray[i]
+								.children)) { // 判断当前元素是否有子节点且类型为数组
+							const result = getChildById(parentArray[i].children, id); // 对子节点进行递归调用
+							if (result !== null) { // 若子节点存在结果,则返回该结果
+								return result;
+							}
+						}
+					}
+					return null; // 没有找到符合条件的元素时返回null
+				}
+				var name = getChildById(list, value)
+				if (name != null) {
+					return name.value
+				}
+			},
+			// 选择门店\去订气
+			confirm(cmpCode) {
+				this.$cache.setCache('orderList', {})
 				uni.navigateTo({
-					url: '/pages/order/booking'
+					url: '/pages/order/booking?companyId=' + cmpCode
 				});
-			}
+			},
 		}
 	}
 </script>
@@ -50,35 +89,12 @@
 	}
 
 	.hint_title {
-		margin-left: 30rpx;
-		margin-top: 30rpx;
+		padding-left: 30rpx;
+		margin-top: 20rpx;
+		padding-bottom: 20rpx;
+		border-bottom: 2rpx solid transparent;
+		border-image: linear-gradient(to bottom, transparent 50%, #e7e6e4 50%) 0 0 100% 0;
 		font-size: 26rpx;
 		color: #909399;
 	}
-
-	.item_company {
-		display: flex;
-		margin: 30rpx 30rpx 0rpx 30rpx;
-		border: 1rpx solid #e7e6e4;
-		border-radius: 10rpx;
-	}
-
-	.wordage {
-		display: flex;
-		flex-direction: column;
-		justify-content: space-evenly;
-		margin-left: 20rpx;
-		padding: auto 0px;
-	}
-
-	.title_company {
-		color: #303133;
-		font-size: 30rpx;
-		font-weight: 600;
-	}
-
-	.distance_title {
-		font-size: 24rpx;
-		color: #909399;
-	}
 </style>

+ 72 - 41
pages/home/index.vue

@@ -1,6 +1,11 @@
 <template>
 	<!-- 首页 -->
 	<view>
+		<view class="head_address" :style="{paddingTop:topHight + 40 + 'rpx'}" @click="goSelectAddress">
+			<u-icon name="map" size="23"></u-icon>
+			<view class="add_title">{{address || '定位中...'}}</view>
+			<u-icon name="arrow-right" size="16"></u-icon>
+		</view>
 		<view class="card_gas_cylinder">气瓶安全追溯管理系统</view>
 		<!-- <view class="card_port center_in">{{genreTitle}}</view> -->
 		<view class="card_cylinder">
@@ -32,64 +37,78 @@
 					icon: 'icon-lpg',
 					color: '#f4b237',
 				}],
-				city:'',
-				latitude:'',
-				longitude:'',
+				city: '',
+				latitude: '',
+				longitude: '',
+				address: '',
+				addressList: {},
+				topHight: '',
+				token: ''
 			}
 		},
-		onShow() {
-			this.getLocation()
+		created() {
+			var city1 = this.$cache.getCache('city')
+			var district2 = this.$cache.getCache('district')
+			if (!city1 && !district2) {
+				this.getLocation()
+			} else {
+				if (city1) {
+					this.address = city1
+				} else if (district2) {
+					this.address = district2
+				}
+			}
+			this.topHight = uni.getSystemInfoSync().statusBarHeight
+			uni.$on('selectArea', () => {
+				this.$nextTick(() => {
+					var city1 = this.$cache.getCache('city')
+					var district2 = this.$cache.getCache('district')
+					if (district2) {
+						this.address = district2
+					} else if (city1) {
+						this.address = city1
+					}
+				})
+			})
 		},
 		mounted() {
-			this.getLocation()
-			var userInfo = this.$cache.getCache('userInfo')
-			// console.log(userInfo, 25)
+			var token = this.$cache.getToken()
+			this.token = token
 		},
 		methods: {
 			//获取经纬度
 			getLocation() {
-				console.log(24)
 				uni.getLocation({
 					type: 'gcj02', //返回可以用于uni.openLocation的经纬度
 					geocode: true,
 					success: (res) => {
-						console.log(res,9998)
-						// #ifdef APP-PLUS
-						this.city = res.address.city;
-						// #endif
-						this.latitude = res.latitude;
-						this.longitude = res.longitude;
-						// #ifdef H5
-						uni.request({
-							url: 'https://restapi.amap.com/v3/geocode/regeo', //逆地理编码接口地址。
-							data: {
-								key: '2eba463a7c621e888e478eee3f3209c9',
-								//location:经纬度  lng :经度  lat:纬度  
-								location: this.longitude + ',' + this.latitude,
-								radius: 1000,
-								extensions: 'all',
-								batch: false,
-								roadlevel: 0
-							},
-							success: (res) => {
-								console.log(res.data,326326);
-								//详细地址信息
-								if (res.statusCode == 200 && res.data.info == 'OK') {
-									this.city = res.data.regeocode.addressComponent.city
-								}
-							}
-						});
-						// #endif
+						this.addressList = res
+						this.$cache.setCache('longitude', res)
+						if (!this.address) {
+							this.address = res.address.district
+							this.$cache.setCache('city', res.address.city)
+							this.$cache.setCache('district', res.address.district)
+						}
 					},
 				});
 			},
 			scanCodes(value) {
-				if (value.id == 'Booking') {
-					uni.navigateTo({
-						url: '/pages/home/company'
-					});
+				if (this.token) {
+					if (value.id == 'Booking') {
+						uni.navigateTo({
+							url: '/pages/home/company'
+						});
+					}
+				} else {
+					uni.$u.toast('请先登录')
 				}
 			},
+			// 选择地区
+			goSelectAddress() {
+				uni.navigateTo({
+					url: '/pages/home/locationArea'
+				});
+			},
 			// 扫码溯源
 			scanning() {
 				uni.navigateTo({
@@ -101,6 +120,18 @@
 </script>
 
 <style lang="scss">
+	.head_address {
+		padding: 20rpx;
+		display: flex;
+		align-items: center;
+	}
+
+	.add_title {
+		font-size: 30rpx;
+		font-weight: 600;
+		margin: 0rpx 5rpx;
+	}
+
 	.card_gas_cylinder {
 		display: flex;
 		justify-content: center;
@@ -108,7 +139,7 @@
 		font-size: 46rpx;
 		font-weight: bold;
 		color: #027DB4;
-		padding: 50rpx 20rpx 0rpx 20rpx;
+		padding: 10rpx 20rpx 0rpx 20rpx;
 	}
 
 	.card_port {

+ 119 - 0
pages/home/locationArea.vue

@@ -0,0 +1,119 @@
+<template>
+	<!-- 地区定位 -->
+	<view>
+		<u-navbar title="选择地区" autoBack placeholder></u-navbar>
+		<view class="card_address">
+			<view class="add_title">{{address || '定位中...'}}</view>
+			<view class="anew_title" @click="reposition"><u-icon name="map" size="24" color="#f9ae3d"></u-icon>重新定位
+			</view>
+		</view>
+		<view style="margin-top: 20rpx;">
+			<view class="item_city" v-for="(item,index) in areaData" @click="selectArea(item,'area')">
+				<view class="city_title">{{item.label}}</view>
+				<view class="item_district" v-for="(item1,index1) in item.children"
+					@click.stop="selectArea(item1,'district')">
+					{{item1.label}}
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		urbanArea
+	} from '@/static/js/districtCode.js'
+	export default {
+		data() {
+			return {
+				address: '',
+				areaData: urbanArea(), //原始数据
+			}
+		},
+		mounted() {
+			var city1 = this.$cache.getCache('city')
+			var district2 = this.$cache.getCache('district')
+			if (city1) {
+				this.address = city1
+			} else {
+				this.address = district2
+			}
+		},
+		methods: {
+			selectArea(value, type) {
+				this.$cache.setCache('city', '')
+				this.$cache.setCache('district', '')
+				if (type == 'area') {
+					this.$cache.setCache('city', value.label)
+				} else if (type == 'district') {
+					this.$cache.setCache('district', value.label)
+				}
+				uni.$emit('selectArea');
+				uni.redirectTo({
+					url: '/pages/indexRouter'
+				})
+			},
+			// 重新定位
+			reposition() {
+				uni.getLocation({
+					type: 'gcj02', //返回可以用于uni.openLocation的经纬度
+					geocode: true,
+					success: (res) => {
+						this.$cache.setCache('longitude', res)
+						this.$cache.setCache('district', res.address.district)
+						this.address = res.address.district
+						uni.$emit('selectArea');
+						uni.redirectTo({
+							url: '/pages/indexRouter'
+						})
+					},
+				});
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.card_address {
+		padding: 30rpx 20rpx;
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		border-bottom: 2rpx solid transparent;
+		border-image: linear-gradient(to bottom, transparent 50%, #e7e6e4 50%) 0 0 100% 0;
+		background-color: #fff;
+	}
+
+	.add_title {
+		font-size: 30rpx;
+		font-weight: 600;
+	}
+
+	.anew_title {
+		display: flex;
+		align-items: center;
+		font-size: 30rpx;
+		color: #f9ae3d;
+	}
+
+	.item_city {
+		margin: 0rpx 20rpx;
+	}
+
+	.city_title {
+		font-size: 30rpx;
+		font-weight: 600;
+		padding-top: 30rpx;
+		padding-bottom: 30rpx;
+		border-bottom: 2rpx solid transparent;
+		border-image: linear-gradient(to bottom, transparent 50%, #e7e6e4 50%) 0 0 100% 0;
+	}
+
+	.item_district {
+		font-size: 30rpx;
+		font-weight: 600;
+		padding: 30rpx 20rpx;
+		border-bottom: 2rpx solid transparent;
+		border-image: linear-gradient(to bottom, transparent 50%, #e7e6e4 50%) 0 0 100% 0;
+	}
+</style>

+ 49 - 56
pages/index/codeTracing.vue

@@ -1,20 +1,12 @@
 <template>
 	<view class="card_code_tracing">
-		<u-navbar border title="二维码溯源" autoBack placeholder></u-navbar>
-		<view class="card_order_details">
-			<view class="details_title">高频编码 <span class="line_title">*</span></view>
-			<view class="card_search">
-				<view class="card_sweep" @click="sweep">
-					<u-icon name="scan" size="36"></u-icon>
-					<view class="scan_title">扫一扫</view>
-				</view>
-				<view class="card_input">
-					<u-input border="surround" v-model="frequencyCoding">
-						<template slot="suffix">
-							<u-icon name="search" size="26" @click="traceSource"></u-icon>
-						</template>
-					</u-input>
-				</view>
+		<view class="details_title">二维码溯源</view>
+		<view class="details_title1">高频编码 <span class="line_title">*</span></view>
+		<view class="card_search">
+			<view class="card_input">
+				<u-search :showAction="true" v-model="frequencyCoding" actionText="搜索" :animation="true"
+					@custom="traceSource(frequencyCoding)"></u-search>
+				<!-- <u-input border="surround" v-model="frequencyCoding"></u-input> -->
 			</view>
 		</view>
 		<view class="card_basic_information" v-if="gasCylinderList.pro_name">
@@ -37,9 +29,10 @@
 			</view>
 		</view>
 		<view style="margin-top: 50rpx;" v-if="!gasCylinderList.pro_name && operationLogList.length === 0">
-			<u-empty mode="search" text="没有搜索结果"></u-empty>
+			<u-empty mode="search" text="当前气瓶没有溯源信息"></u-empty>
 		</view>
-		<view style="width: 100%; height: 50rpx;"></view>
+		<view style="width: 100%; height: 200rpx;"></view>
+		<view class="card_Booking center_in" @click="goBooking">订气</view>
 	</view>
 </template>
 
@@ -56,7 +49,7 @@
 		},
 		data() {
 			return {
-				frequencyCoding: '377825938847',
+				frequencyCoding: '',
 				gasCylinderList: {},
 				operationLogList: [],
 				basicsList: [{
@@ -108,35 +101,16 @@
 			}
 		},
 		onLoad(option) {
-			console.log(option,265)
+			if (option.code) {
+				this.frequencyCoding = option.code
+				this.traceSource(option.code)
+			}
 		},
 		methods: {
-			// 扫一扫
-			sweep() {
-				// 允许从相机和相册扫码
-				uni.scanCode({
-					scanType: ["qrCode"],
-					success: (res) => {
-						// console.log(res);
-						if (res.result) {
-							let url = res.result;
-							this.frequencyCoding = url
-							this.traceSource()
-						} else {
-							console.log('请重新扫描');
-							return false;
-						}
-					},
-					fail: (res) => {
-						console.log('未识别到二维码');
-					}
-				})
-			},
 			// 扫码溯源
-			traceSource() {
-				if (this.frequencyCoding) {
-					this.$api.get('/api/gas-cylinder/uid/' + this.frequencyCoding).then(res => {
-						console.log(res, 24)
+			traceSource(code) {
+				if (code) {
+					this.$api.get('/api/gas-cylinder/uid/' + code).then(res => {
 						if (res.code == 200) {
 							this.gasCylinderList = res.data.gasCylinder
 							this.operationLogList = res.data.operationLog
@@ -158,6 +132,12 @@
 				}
 				return name
 			},
+			// 去订气
+			goBooking() {
+				uni.redirectTo({
+					url: '/pages/indexRouter'
+				})
+			}
 		}
 	}
 </script>
@@ -169,32 +149,33 @@
 	}
 
 	.details_title {
+		display: flex;
+		justify-content: center;
+		padding: 20rpx;
 		color: #333;
 		font-size: 34rpx;
 		font-weight: 500;
 		margin-bottom: 10rpx;
 	}
 
-	.card_search {
-		display: flex;
-		align-items: center;
-		margin: 20rpx 0rpx;
-	}
-
-	.scan_title {
-		font-size: 20rpx;
+	.details_title1 {
+		color: #333;
+		font-size: 34rpx;
+		font-weight: 500;
+		margin-bottom: 10rpx;
+		margin-left: 30rpx;
 	}
 
-	.card_sweep {
+	.card_search {
 		display: flex;
-		flex-direction: column;
 		align-items: center;
-		flex: none;
+		margin: 20rpx 0rpx;
 	}
 
 	.card_input {
 		width: 100%;
 		margin-left: 30rpx;
+		margin-right: 30rpx;
 	}
 
 	.line_title {
@@ -202,7 +183,7 @@
 	}
 
 	.card_basic_information {
-		border-top: 10px solid #f5f5f5;
+		border-top: 6px solid #f5f5f5;
 		padding: 20rpx;
 	}
 
@@ -242,4 +223,16 @@
 		padding-left: 20rpx;
 		font-size: 28rpx;
 	}
+
+	.card_Booking {
+		position: fixed;
+		bottom: 50rpx;
+		right: 20rpx;
+		width: 100rpx;
+		height: 100rpx;
+		border-radius: 50%;
+		color: #fff;
+		background-color: #5ac725;
+		box-shadow: 0 2px 12px 0 rgba(90, 199, 37, 0.5)
+	}
 </style>

+ 26 - 5
pages/indexRouter.vue

@@ -2,7 +2,7 @@
 	<!-- 底部tab导航 -->
 	<view>
 		<Home v-if="nowchos === 0"></Home>
-		<Order v-else-if="nowchos === 1"></Order>
+		<Order ref="order" v-else-if="nowchos === 1"></Order>
 		<Mine ref="mine" v-else-if="nowchos === 2"></Mine>
 		<!-- <Information v-else-if="nowchos === 2"></Information>
 		<Mine ref="mine" v-else-if="nowchos === 3"></Mine> -->
@@ -30,12 +30,25 @@
 				userInfo: {},
 				isorders: 0,
 				userType: 3,
+				token: '',
 			}
 		},
 		onShow() {
-			if (this.nowchos == 3) {
-				this.$nextTick(() => {
-					this.$refs.mine.refreshTokenil()
+			const that = this
+			uni.$on('booking', () => {
+				that.nowchos = 1
+				that.$forceUpdate()
+				that.$nextTick(() => {
+					setTimeout(function() {
+						that.$refs.order.getOrderList()
+					}, 100);
+				})
+			})
+			if (that.nowchos == 2) {
+				that.$nextTick(() => {
+					setTimeout(function() {
+						that.$refs.mine.refreshTokenil()
+					}, 100);
 				})
 			}
 		},
@@ -50,8 +63,16 @@
 		methods: {
 			// tab
 			botomchos(e) {
+				const that = this
+				if (e == 2) {
+					that.$nextTick(() => {
+						setTimeout(function() {
+							that.$refs.mine.refreshTokenil()
+						}, 100);
+					})
+				}
 				uni.setStorageSync('nowchos', e);
-				this.nowchos = e
+				that.nowchos = e
 			},
 		}
 	}

+ 17 - 13
pages/login.vue

@@ -9,10 +9,21 @@
 			</view>
 			<u--form labelPosition="left" :model="formList" :rules="rules" ref="uForm">
 				<u-form-item label="手机号" prop="phone" labelWidth="80" borderBottom ref="item1">
-					<u--input v-model="formList.phone" border="none" placeholder="请填写手机号"></u--input>
+					<u-input v-model="formList.phone" border="none" placeholder="请填写手机号"></u-input>
 				</u-form-item>
 				<u-form-item label="密码" prop="password" labelWidth="80" borderBottom ref="item1">
-					<u--input v-model="formList.password" type="password" border="none" placeholder="请填写密码"></u--input>
+					<u-input v-show="isText === true" placeholder="请填写密码" border="none" v-model="formList.password"
+						class="input_class_pwd" :password="true">
+						<template slot="suffix" v-if="formList.password">
+							<u-icon name="eye-off" @click="isText = false" size="20"></u-icon>
+						</template>
+					</u-input>
+					<u-input v-show="isText === false" placeholder="请填写密码" border="none" v-model="formList.password"
+						class="input_class_pwd" :password="false">
+						<template slot="suffix" v-if="formList.password">
+							<u-icon name="eye-fill" @click="isText = true" size="20"></u-icon>
+						</template>
+					</u-input>
 				</u-form-item>
 			</u--form>
 			<view class="btn_login">
@@ -65,6 +76,7 @@
 				checked: false,
 				hintShow: false,
 				userInfo: {},
+				isText: true,
 			}
 		},
 		computed: {
@@ -74,16 +86,8 @@
 				} else {
 					return false;
 				}
-			}
+			},
 		},
-		// beforeCreate() {
-		// 	var token = this.$cache.getToken()
-		// 	if (token) {
-		// 		uni.redirectTo({
-		// 			url: '/pages/indexRouter'
-		// 		})
-		// 	}
-		// },
 		methods: {
 			checkboxChange() {
 				if (this.checked) {
@@ -107,7 +111,7 @@
 						if (res.code == 200) {
 							this.$cache.setToken(res.data.token)
 							this.getUserInfo()
-							
+
 							// uni.redirectTo({
 							// 	url: '/pages/indexRouter'
 							// })
@@ -124,7 +128,6 @@
 			getUserInfo() {
 				this.$api.get('/api/applet/profile').then(res => {
 					if (res.code == 200) {
-						console.log(res,24)
 						this.userInfo = res.data
 						this.$cache.setCache('userInfo', this.userInfo)
 						uni.redirectTo({
@@ -146,6 +149,7 @@
 			},
 			// 注册
 			goRegister() {
+				this.$refs.uForm.resetFields()
 				uni.navigateTo({
 					url: '/pages/register'
 				})

+ 45 - 7
pages/mine/addAddress.vue

@@ -6,7 +6,8 @@
 			<x-form ref="personage" :list="list" :model="model" :rules="rules" btnTitle="保存地址" @confirm="confirm"
 				@clientele="clientele"></x-form>
 		</view>
-		<x-modal :show="show" :title="title" @close="show = false"></x-modal>
+		<u-modal width="450rpx" :show="show" showCancelButton :content='title' @cancel="show = false"
+			@confirm="expurgate"></u-modal>
 	</view>
 </template>
 
@@ -33,6 +34,7 @@
 					placeholder: '请输入手机号码',
 					type: 'input',
 					required: true,
+					genre: 'number',
 				}, {
 					field: 'region',
 					label: '所在城市/地区',
@@ -111,7 +113,7 @@
 				this.model.hr = arr1.join('/')
 				this.model.region = arr2.join('/')
 			},
-			clientele() {
+			async clientele() {
 				// console.log(this.model, 234)
 				if (!this.deleteState) {
 					// 添加
@@ -119,6 +121,10 @@
 						...this.model
 					}
 					delete param.region
+					let arr = await this.longitudeLatitude(param)
+					var propertyName = arr.location.split(",")
+					param.lng = Number(propertyName[0])
+					param.lat = Number(propertyName[1])
 					this.$api.post('/api/applet/address', param).then(res => {
 						if (res.code == 200) {
 							uni.navigateBack({
@@ -129,11 +135,15 @@
 				} else {
 					// 修改
 					const param = {
+						id: Number(this.addressId),
 						...this.model
 					}
 					delete param.region
 					delete param.hr
-					console.log(param, 25)
+					let arr = await this.longitudeLatitude(param)
+					var propertyName = arr.location.split(",")
+					param.lng = Number(propertyName[0])
+					param.lat = Number(propertyName[1])
 					this.$api.put('/api/applet/address', param).then(res => {
 						if (res.code == 200) {
 							uni.navigateBack({
@@ -143,12 +153,14 @@
 					})
 				}
 			},
-			// 删除
+			// modal删除弹窗
 			rightClick() {
 				this.show = true
-				return
+			},
+			// 删除
+			expurgate() {
 				this.$api.delete('/api/applet/address', {
-					id: this.addressId,
+					id: Number(this.addressId),
 				}).then(res => {
 					if (res.code == 200) {
 						uni.navigateBack({
@@ -159,7 +171,6 @@
 			},
 			getListDetails(id) {
 				const arr = this.$cache.getCache('addressInfo')
-				console.log(arr, 25)
 				this.model.name = arr.name
 				this.model.phone = arr.phone
 				this.model.address = arr.address
@@ -170,6 +181,29 @@
 				var area = this.cityScreening(arr.area, this.areaData)
 				this.model.region = city + '/' + area
 			},
+			// 获取经纬度
+			longitudeLatitude(value) {
+				var cityArr = urbanArea()
+				var city = this.cityScreening(value.city, cityArr)
+				var area = this.cityScreening(value.area, cityArr)
+				return new Promise((resolve, inject) => {
+					uni.request({
+						url: 'https://restapi.amap.com/v3/geocode/geo', // 你的API接口地址
+						method: 'GET', // 请求方法,可选'GET','POST'等
+						data: {
+							key: 'fcddcc366fd5bd355e35f01b7cce82ef',
+							address: city + area + value.address,
+						},
+						success: (res) => {
+							resolve(res.data.geocodes[0])
+						},
+						fail: (err) => {
+							this.confirmLoading = false
+							// console.log('请求失败:', err); // 请求失败的回调函数
+						}
+					});
+				})
+			},
 			// 城市筛选
 			cityScreening(value, list) {
 				function getChildById(parentArray, id) {
@@ -196,6 +230,10 @@
 </script>
 
 <style lang="scss" scoped>
+	::v-deep .u-modal__content__text {
+		text-align: center;
+	}
+
 	.card_form {
 		margin: 10rpx 40rpx;
 	}

+ 7 - 3
pages/mine/address.vue

@@ -1,7 +1,7 @@
 <template>
 	<view>
 		<u-navbar title="地址管理" rightText="新增地址" autoBack placeholder @rightClick="rightClick"></u-navbar>
-		<view>
+		<view v-if="list.length > 0">
 			<view class="card_address" v-for="(item,index) in list" :key="index">
 				<view class="center_item">
 					<view class="title_item">{{item.name}}</view>
@@ -14,10 +14,13 @@
 					<view class="title_address">
 						{{cityScreening(item.city, areaData)}}{{cityScreening(item.area, areaData)}}{{item.address}}
 					</view>
-					<view @click.native.stop="goAmend(item)"><u-icon name="edit-pen" size="30"></u-icon></view>
+					<view @click="goAmend(item)"><u-icon name="edit-pen" size="30"></u-icon></view>
 				</view>
 			</view>
 		</view>
+		<view style="margin-top: 30%;" v-else>
+			<u-empty mode="address"></u-empty>
+		</view>
 	</view>
 </template>
 
@@ -96,7 +99,8 @@
 	.card_address {
 		margin: 30rpx 20rpx 20rpx 20rpx;
 		padding: 10rpx;
-		border-bottom: 1rpx solid #e7e6e4;
+		border-bottom: 2rpx solid transparent;
+		border-image: linear-gradient(to bottom, transparent 50%, #e7e6e4 50%) 0 0 100% 0;
 	}
 
 	.center_item {

+ 7 - 20
pages/mine/index.vue

@@ -12,10 +12,10 @@
 			<image class="mine_image" src="../../static/portrait.png" mode=""></image>
 			<view class="mine_title">登录/注册</view>
 		</view>
-		<view class="space_between card_mine_option" @click="goPersonal">
+		<!-- <view class="space_between card_mine_option" @click="goPersonal">
 			<view class="option_title">个人资料</view>
 			<u-icon name="arrow-right" size="20"></u-icon>
-		</view>
+		</view> -->
 		<view class="space_between card_mine_option" @click="changePassword">
 			<view class="option_title">修改密码</view>
 			<u-icon name="arrow-right" size="20"></u-icon>
@@ -43,12 +43,13 @@
 				userInfo: {},
 			}
 		},
-		mounted() {
+		created() {
 			var token = this.$cache.getToken()
 			this.token = token
 			var userInfo = this.$cache.getCache('userInfo')
 			this.userInfo = userInfo
 		},
+		mounted() {},
 		methods: {
 			// 刷新token
 			refreshTokenil() {
@@ -56,22 +57,7 @@
 				this.token = token
 				var userInfo = this.$cache.getCache('userInfo')
 				this.userInfo = userInfo
-			},
-			//微信授权
-			set_is_login(val) {
-				let _this = this;
-				uni.getUserProfile({
-					'desc': '获取用户基本信息',
-					'lang': 'zh_CN',
-					success: function(infoRes) {
-						console.log(infoRes, 8)
-						uni.login({
-							success: function(loginRes) {
-								console.log(loginRes, 23)
-							}
-						});
-					},
-				});
+				this.$forceUpdate()
 			},
 			// 登录注册
 			login() {
@@ -162,7 +148,8 @@
 	.card_mine_option {
 		margin: 40rpx 0rpx;
 		padding-bottom: 30rpx;
-		border-bottom: 2rpx solid #E4E7ED;
+		border-bottom: 2rpx solid transparent;
+		border-image: linear-gradient(to bottom, transparent 50%, #e7e6e4 50%) 0 0 100% 0;
 	}
 
 	.option_title {

+ 59 - 8
pages/mine/password.vue

@@ -4,16 +4,48 @@
 		<view class="card_password">
 			<view class="item_pass">
 				<view class="pass_title">旧密码<span style="color: red;">*</span></view>
-				<u--input placeholder="请输入内容" type="password" border="surround" v-model="userInfo.oldCode"></u--input>
+				<u-input v-show="isText1 === true" placeholder="请填写密码" border="surround" v-model="userInfo.oldCode"
+					class="input_class_pwd" :password="true">
+					<template slot="suffix" v-if="userInfo.oldCode">
+						<u-icon name="eye-off" @click="isText1 = false" size="20"></u-icon>
+					</template>
+				</u-input>
+				<u-input v-show="isText1 === false" placeholder="请填写密码" border="surround" v-model="userInfo.oldCode"
+					class="input_class_pwd" :password="false">
+					<template slot="suffix" v-if="userInfo.oldCode">
+						<u-icon name="eye-fill" @click="isText1 = true" size="20"></u-icon>
+					</template>
+				</u-input>
 			</view>
 			<view class="item_pass">
 				<view class="pass_title">新密码<span style="color: red;">*</span></view>
-				<u--input placeholder="请输入内容" type="password" border="surround"
-					v-model="userInfo.sedNewCode"></u--input>
+				<u-input v-show="isText2 === true" placeholder="请填写新密码" border="surround" v-model="userInfo.sedNewCode"
+					class="input_class_pwd" :password="true">
+					<template slot="suffix" v-if="userInfo.sedNewCode">
+						<u-icon name="eye-off" @click="isText2 = false" size="20"></u-icon>
+					</template>
+				</u-input>
+				<u-input v-show="isText2 === false" placeholder="请填写新密码" border="surround" v-model="userInfo.sedNewCode"
+					class="input_class_pwd" :password="false">
+					<template slot="suffix" v-if="userInfo.sedNewCode">
+						<u-icon name="eye-fill" @click="isText2 = true" size="20"></u-icon>
+					</template>
+				</u-input>
 			</view>
 			<view class="item_pass">
 				<view class="pass_title">再次输入新密码<span style="color: red;">*</span></view>
-				<u--input placeholder="请输入内容" type="password" border="surround" v-model="userInfo.newCode"></u--input>
+				<u-input v-show="isText3 === true" placeholder="请再次填写新密码" border="surround" v-model="userInfo.newCode"
+					class="input_class_pwd" :password="true">
+					<template slot="suffix" v-if="userInfo.newCode">
+						<u-icon name="eye-off" @click="isText3 = false" size="20"></u-icon>
+					</template>
+				</u-input>
+				<u-input v-show="isText3 === false" placeholder="请再次填写新密码" border="surround" v-model="userInfo.newCode"
+					class="input_class_pwd" :password="false">
+					<template slot="suffix" v-if="userInfo.newCode">
+						<u-icon name="eye-fill" @click="isText3 = true" size="20"></u-icon>
+					</template>
+				</u-input>
 			</view>
 		</view>
 		<view class="card_btn">
@@ -31,6 +63,9 @@
 					sedNewCode: '',
 					newCode: ''
 				},
+				isText1: true,
+				isText2: true,
+				isText3: true,
 			}
 		},
 		computed: {
@@ -40,19 +75,35 @@
 				} else {
 					return false;
 				}
-			}
+			},
 		},
 		methods: {
 			amend() {
-				if (this.userInfo.sedNewCode == this.userInfo.newCode) {
-					console.log(23)
+				if (this.userInfo.sedNewCode === this.userInfo.newCode) {
+					this.$api.put('/api/applet/pwd', {
+						oldPassword: this.userInfo.oldCode,
+						newPassword: this.userInfo.newCode,
+					}).then(res => {
+						if (res.code == 200) {
+							this.$cache.removeToken()
+							this.$cache.removeCache('userInfo')
+							uni.redirectTo({
+								url: '/pages/login'
+							})
+						} else {
+							uni.showToast({
+								title: res.data.msg,
+								icon: 'none'
+							});
+						}
+					})
 				} else {
 					uni.showToast({
 						title: '输入两次密码不一样',
 						icon: 'none'
 					});
 				}
-			}
+			},
 		}
 	}
 </script>

+ 73 - 71
pages/mine/personal.vue

@@ -14,56 +14,58 @@
 		data() {
 			return {
 				list: [{
-					field: 'name',
-					label: '姓名',
-					placeholder: '请输入姓名',
-					type: 'input',
-					required: true,
-				}, {
-					field: 'principalPhone',
-					label: '手机号码',
-					placeholder: '请输入手机号码',
-					type: 'input',
-					required: true,
-				}, {
-					field: 'type',
-					label: '类型',
-					placeholder: '请选择类型',
-					type: 'radio',
-					required: true,
-					options: [{
-							label: '商户',
-							value: 0,
-						},
-						{
-							label: '私人',
-							value: 1,
-						}
-					],
-				}, {
-					field: 'region',
-					label: '所在城市/地区',
-					placeholder: '请选择所在城市/地区',
-					type: 'cascader',
-					required: true,
-				}, {
-					field: 'address',
-					label: '地址',
-					placeholder: '请输入详细地址',
-					type: 'input',
-					required: true,
-				}, {
-					field: 'addressImg',
-					label: '现场图片',
-					placeholder: '请上传现场图片',
-					type: 'upload',
-					required: true,
-				}, {
-					field: 'remark',
-					label: '备注',
-					placeholder: '请输入备注',
-					type: 'textarea',
-				}],
+						field: 'type',
+						label: '类型',
+						placeholder: '请选择类型',
+						type: 'radio',
+						required: true,
+						options: [{
+								label: '商户',
+								value: 0,
+							},
+							{
+								label: '私人',
+								value: 1,
+							}
+						],
+					}, {
+						field: 'name',
+						label: '姓名',
+						placeholder: '请输入姓名',
+						type: 'input',
+						required: true,
+					}, {
+						field: 'principalPhone',
+						label: '手机号码',
+						placeholder: '请输入手机号码',
+						type: 'input',
+						required: true,
+					},
+					// {
+					// 	field: 'region',
+					// 	label: '所在城市/地区',
+					// 	placeholder: '请选择所在城市/地区',
+					// 	type: 'cascader',
+					// 	required: true,
+					// }, {
+					// 	field: 'address',
+					// 	label: '地址',
+					// 	placeholder: '请输入详细地址',
+					// 	type: 'input',
+					// 	required: true,
+					// }, {
+					// 	field: 'addressImg',
+					// 	label: '现场图片',
+					// 	placeholder: '请上传现场图片',
+					// 	type: 'upload',
+					// 	required: true,
+					// }, {
+					// 	field: 'remark',
+					// 	label: '备注',
+					// 	placeholder: '请输入备注',
+					// 	type: 'textarea',
+					// },
+				],
 				model: {
 					name: '',
 					principalPhone: '',
@@ -74,41 +76,41 @@
 					remark: '',
 				},
 				rules: {
-					'name': {
-						type: 'string',
-						required: true,
-						message: '请输入姓名',
-						trigger: ['blur', 'change']
-					},
-					'principalPhone': {
-						type: 'string',
-						required: true,
-						message: '请输入手机号码',
-						trigger: ['blur', 'change']
-					},
 					'type': {
 						type: 'number',
 						required: true,
 						message: '请选择客户类型',
 						trigger: ['blur', 'change']
 					},
-					'region': {
+					'name': {
 						type: 'string',
 						required: true,
-						message: '请选择所在城市/地区',
+						message: '请输入姓名',
 						trigger: ['blur', 'change']
 					},
-					'address': {
+					'principalPhone': {
 						type: 'string',
 						required: true,
-						message: '请输入详细地址',
-						trigger: ['blur', 'change']
-					},
-					'addressImg': {
-						required: true,
-						message: '请上传现场图片',
+						message: '请输入手机号码',
 						trigger: ['blur', 'change']
 					},
+					// 'region': {
+					// 	type: 'string',
+					// 	required: true,
+					// 	message: '请选择所在城市/地区',
+					// 	trigger: ['blur', 'change']
+					// },
+					// 'address': {
+					// 	type: 'string',
+					// 	required: true,
+					// 	message: '请输入详细地址',
+					// 	trigger: ['blur', 'change']
+					// },
+					// 'addressImg': {
+					// 	required: true,
+					// 	message: '请上传现场图片',
+					// 	trigger: ['blur', 'change']
+					// },
 				},
 				userInfo: {},
 				userType: 5,

+ 4 - 14
pages/mine/system.vue

@@ -29,20 +29,10 @@
 			},
 			// 确定退出登录
 			confirm() {
-				this.$api.post('/api/logout').then(res => {
-					if (res.code == 200) {
-						this.logoutShow = false
-						this.$cache.removeToken()
-						this.$cache.removeCache('userInfo')
-						uni.redirectTo({
-							url: '/pages/login'
-						})
-					} else if (res.code == 401) {
-						console.log(13)
-						this.logoutShow = false
-						this.$cache.removeToken()
-						this.$cache.removeCache('userInfo')
-					}
+				this.$cache.removeToken()
+				this.$cache.removeCache('userInfo')
+				uni.redirectTo({
+					url: '/pages/login'
 				})
 			},
 			// 取消

+ 205 - 20
pages/order/booking.vue

@@ -2,7 +2,7 @@
 	<view>
 		<u-navbar title="订气" autoBack placeholder></u-navbar>
 		<view class="card_shipping">
-			<view class="space_between shipping_select" @click="selectShipping">
+			<view class="space_between shipping_select frame" @click="selectShipping">
 				<view class="shipping_title" v-if="!addInfo.id">选择收货地址</view>
 				<view v-else>
 					<view class="center_item">
@@ -19,13 +19,13 @@
 			</view>
 		</view>
 		<view class="card_form">
-			<x-form ref="personage" :list="list" :model="model" :rules="rules" @confirm="confirm"
-				@clientele="clientele"></x-form>
+			<x-form ref="personage" :loading="loading" :list="list" :model="model" :rules="rules" @clientele="clientele"
+				@confirmEnsure="confirmEnsure"></x-form>
 		</view>
 		<u-popup :show="receivingShow" closeable :round="10" mode="bottom" @close="close">
 			<view class="card_addres">
 				<view class="title_address">选择收货地址</view>
-				<view class="card_add_booking">
+				<view class="card_add_booking" v-if="addressList.length > 0">
 					<view class="card_address" v-for="(item,index) in addressList" :key="index"
 						@click="selectBooking(item)">
 						<view class="card_group"
@@ -44,12 +44,15 @@
 								<view class="title_address1">
 									{{cityScreening(item.city, areaData)}}{{cityScreening(item.area, areaData)}}{{item.address}}
 								</view>
-								<view @click.native.stop="goAmend(item)"><u-icon name="edit-pen" size="30"></u-icon>
+								<view @click.stop="goAmend(item)"><u-icon name="edit-pen" size="30"></u-icon>
 								</view>
 							</view>
 						</view>
 					</view>
 				</view>
+				<view style="margin-top: 30%;" v-else>
+					<u-empty mode="address"></u-empty>
+				</view>
 				<view class="btn_add">
 					<u-button type="primary" size="normal" text="新增收货地址" @click="rightClick"></u-button>
 				</view>
@@ -72,29 +75,21 @@
 					placeholder: '请选择商品',
 					type: 'select',
 					required: true,
-					options: [
-						[{
-								label: '液化石油气',
-								value: 0,
-							},
-							{
-								label: '二甲醚',
-								value: 1,
-							},
-						]
-					],
+					options: [],
 				}, {
 					field: 'specification',
 					label: '规格',
 					placeholder: '请选择规格',
 					type: 'select',
 					required: true,
+					options: [],
 				}, {
 					field: 'amount',
 					label: '数量',
 					placeholder: '请输入数量',
 					type: 'input',
 					required: true,
+					genre: 'number',
 				}, {
 					field: 'remark',
 					label: '备注',
@@ -106,6 +101,8 @@
 					specification: '',
 					amount: '',
 					remark: '',
+					goodsId: null,
+					specId: null,
 				},
 				rules: {
 					'commodity': {
@@ -131,11 +128,27 @@
 				addressList: [],
 				value: '',
 				addInfo: {},
+				companyId: null,
+				loading: false,
+				revamp: '',
+				operated: '',
+				orderData: {},
 			}
 		},
-		mounted() {
+		onLoad(value) {
+			this.companyId = value.companyId
+			this.revamp = value.revamp
+			this.operated = value.revamp
+			if (value.revamp == 'true') {
+				this.getDataEcho()
+			}
+		},
+		onShow() {
 			this.getList()
 		},
+		mounted() {
+			this.getGoodsList()
+		},
 		methods: {
 			selectShipping() {
 				this.receivingShow = true
@@ -143,12 +156,164 @@
 			close() {
 				this.receivingShow = false
 			},
+			// 获取收货地址列表
 			getList() {
+				this.addInfo = {}
 				this.$api.get('/api/applet/address').then(res => {
 					if (res.code == 200) {
 						this.addressList = res.data.list
-						this.addressList.forEach(item => {
-							item.flag = false
+						if (this.addressList.length > 0 && !this.revamp) {
+							this.addressList.forEach(item => {
+								if (item.isDefault) {
+									item.flag = true
+									this.addInfo = item
+								} else {
+									item.flag = false
+									return
+									this.addressList[0].flag = true
+									this.addInfo = this.addressList[0]
+								}
+							})
+						} else {
+							this.operated = false
+							this.addressList.forEach(item => {
+								if (this.orderData.phone == item.phone) {
+									item.flag = true
+									this.addInfo = item
+								} else {
+									item.flag = false
+								}
+							})
+						}
+					}
+				})
+			},
+			// 选择商品/规格
+			confirmEnsure(value) {
+				// console.log(value, 24)
+				if (value.type == 'commodity') {
+					this.model.goodsId = value.id
+				} else if (value.type == 'specification') {
+					this.model.specId = value.id
+				}
+			},
+			// 订单数据回显
+			getDataEcho() {
+				const arr = this.$cache.getCache('orderList')
+				this.orderData = arr
+				// console.log(arr, 22)
+				this.model.goodsId = arr.goodsId
+				this.model.specId = arr.specId
+				this.model.commodity = arr.goods.name
+				this.model.specification = arr.spec.name
+				this.model.amount = arr.quantity
+				this.model.remark = arr.remark
+			},
+			// 订气
+			clientele() {
+				const params = {
+					address: '',
+					phone: this.addInfo.phone,
+					storeId: Number(this.companyId),
+					goodsId: this.model.goodsId,
+					quantity: Number(this.model.amount),
+					specId: this.model.specId,
+					remark: this.model.remark,
+					lng: this.addInfo.lng,
+					lat: this.addInfo.lat,
+					city: this.addInfo.city,
+					area: this.addInfo.area,
+					addressImg: this.addInfo.addressImg,
+				}
+				const cityty = this.cityScreening(this.addInfo.city, this.areaData)
+				const areaty = this.cityScreening(this.addInfo.area, this.areaData)
+				const addressty = cityty + areaty + this.addInfo.address
+				params.address = addressty
+				this.loading = true
+				if (!this.revamp) {
+					this.$api.post('/api/applet/order', params).then(res => {
+						if (res.code == 200) {
+							uni.navigateTo({
+								url: '/pages/indexRouter'
+							})
+							uni.$emit('booking');
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none',
+								duration: 2000
+							});
+						}
+						this.loading = false
+					})
+				} else {
+					params.id = this.orderData.id
+					this.$api.put('/api/applet/order', params).then(res => {
+						if (res.code == 200) {
+							uni.navigateTo({
+								url: '/pages/indexRouter'
+							})
+							uni.$emit('booking');
+						} else {
+							uni.showToast({
+								title: res.msg,
+								icon: 'none',
+								duration: 2000
+							});
+						}
+						this.loading = false
+					})
+				}
+			},
+			// 获取商品列表
+			getGoodsList() {
+				this.$api.get('/api/applet/goods', {
+					storeId: this.companyId,
+				}).then(res => {
+					if (res.code == 200) {
+						const arrList = res.data.list
+						const dataList = [
+							[]
+						]
+						arrList.forEach(item1 => {
+							let arr = {
+								label: item1.name,
+								value: item1.id,
+							}
+							dataList[0].push(arr)
+						})
+						this.list.forEach(item => {
+							if (item.field == 'commodity') {
+								item.options = []
+								item.options = dataList
+							}
+						})
+						this.getCylinderSpec()
+					}
+				})
+			},
+			// 获取规格列表
+			getCylinderSpec() {
+				this.$api.get('/api/applet/gas-cylinder-spec', {
+					storeId: this.companyId,
+				}).then(res => {
+					if (res.code == 200) {
+						const arrList = res.data.list
+						const dataList = [
+							[]
+						]
+						arrList.forEach(item1 => {
+							let arr = {
+								label: item1.name,
+								value: item1.id,
+							}
+							dataList[0].push(arr)
+						})
+						this.list.forEach(item => {
+							if (item.field == 'specification') {
+								item.options = []
+								item.options = dataList
+							}
 						})
 					}
 				})
@@ -168,12 +333,14 @@
 			},
 			// 新增地址
 			rightClick() {
+				this.receivingShow = false
 				uni.navigateTo({
 					url: '/pages/mine/addAddress'
 				});
 			},
 			// 修改地址
 			goAmend(value) {
+				this.receivingShow = false
 				this.$cache.setCache('addressInfo', value)
 				uni.navigateTo({
 					url: '/pages/mine/addAddress?revamp=' + true + '&id=' + value.id
@@ -227,7 +394,25 @@
 		width: 100%;
 		height: 120rpx;
 		border-radius: 6rpx;
-		border: 1rpx solid #e7e6e4;
+		// border: 1rpx solid #e7e6e4;
+	}
+
+	// 伪元素1rpx边框
+	.frame {
+		position: relative; //重要
+	}
+
+	.frame::after {
+		position: absolute;
+		content: '';
+		border: 2rpx solid #e7e6e4;
+		border-radius: 16rpx;
+		width: 200%;
+		height: 200%;
+		top: 0;
+		left: 0;
+		transform: scale(0.5);
+		transform-origin: 0 0;
 	}
 
 	.shipping_title {

+ 17 - 8
pages/order/index.vue

@@ -7,11 +7,11 @@
 		</view>
 		<view class="cardOrder_tab"></view>
 		<view class="card_order_manag" v-if="current == 0">
-			<orderManagement :datalist="datalist" @toDeliver="toDeliver"></orderManagement>
+			<orderManagement :datalist="datalist" @confirmedDelivery="confirmedDelivery"></orderManagement>
 		</view>
 		<!-- 待配送 -->
 		<view class="card_order_manag" v-if="current == 1">
-			<orderManagement :datalist="datalist" @toDeliver="toDeliver"></orderManagement>
+			<orderManagement :datalist="datalist" @confirmedDelivery="confirmedDelivery"></orderManagement>
 		</view>
 		<!-- 配送中 -->
 		<view class="card_order_manag" v-if="current == 2">
@@ -28,6 +28,8 @@
 		<view class="card_empty" v-if="datalist.length === 0">
 			<u-empty mode="order"></u-empty>
 		</view>
+		<u-modal width="450rpx" :show="show" showCancelButton :content='title' @cancel="show = false"
+			@confirm="expurgate"></u-modal>
 	</view>
 </template>
 
@@ -53,6 +55,9 @@
 					name: '已取消'
 				}],
 				datalist: [],
+				show: false,
+				title: '订单删除后无法恢复是否删除订单?',
+				orderId: null,
 			}
 		},
 		onTabItemTap() {
@@ -80,13 +85,17 @@
 					}
 				})
 			},
-			// 去配送
-			toDeliver(row) {
-				this.$api.put('/api/order/state', {
-					id: row.id,
-					state: 5,
+			confirmedDelivery(orderId) {
+				this.show = true
+				this.orderId = orderId
+			},
+			// 取消订单
+			expurgate() {
+				this.$api.post('/api/applet/order/cancel', {
+					id: this.orderId,
 				}).then(res => {
 					if (res.code == 200) {
+						this.show = false
 						this.getOrderList(this.current)
 					}
 				})
@@ -94,7 +103,7 @@
 			tabClick(row) {
 				// console.log(row, 26)
 				if (row.index == 1) {
-					this.getOrderList(2)
+					this.getOrderList(1)
 				} else if (row.index == 2) {
 					this.getOrderList(5)
 				} else if (row.index == 3) {

+ 10 - 7
pages/order/orderDetails.vue

@@ -16,13 +16,16 @@
 					<view class="title_gas_num">×{{orderData.quantity}}</view>
 				</view>
 			</view>
-			<view class="details_title1">订单编号: <span>{{orderData.orderId}}</span></view>
+			<view class="details_title1" style="margin-top: 40rpx;">订单编号: <span>{{orderData.orderId}}</span></view>
 			<view class="details_title1">配送地址: <span>{{orderData.address}}</span></view>
-			<view class="details_title1" v-if="orderData.state == 5 || orderData.state == 4">联系电话: <span>{{orderData.phone}}</span></view>
+			<view class="details_title1" v-if="orderData.state == 5 || orderData.state == 4 && orderData.phone">联系电话:
+				<span>{{orderData.phone}}</span></view>
 			<view class="details_title1">下单时间: <span>{{orderData.orderTime}}</span></view>
-			<view class="details_title1" v-if="orderData.state == 5 || orderData.state == 4">配送时间: <span>{{orderData.deliveryTime}}</span>
+			<view class="details_title1" v-if="orderData.state == 5 || orderData.state == 4 && orderData.deliveryTime">
+				配送时间: <span>{{orderData.deliveryTime}}</span>
 			</view>
-			<view class="details_title1" v-if="orderData.state == 3 || orderData.state == 4">送达时间: <span>{{orderData.arriveTime}}</span></view>
+			<view class="details_title1" v-if="orderData.state == 3 || orderData.state == 4 && orderData.arriveTime">
+				送达时间: <span>{{orderData.arriveTime}}</span></view>
 		</view>
 		<view class="btn_cancel" v-if="orderData.state == 3">
 			<u-button text="取消订单" color="#d7d7d7" @click="cancel"></u-button>
@@ -66,7 +69,7 @@
 	.details_title {
 		margin-left: 20rpx;
 		color: #333;
-		font-size: 40rpx;
+		font-size: 30rpx;
 		font-weight: 500;
 	}
 
@@ -86,7 +89,7 @@
 	}
 
 	.title_gas {
-		font-size: 60rpx;
+		font-size: 34rpx;
 		font-weight: 700;
 	}
 
@@ -103,7 +106,7 @@
 
 		span {
 			margin-left: 10rpx;
-			font-size: 30rpx;
+			font-size: 26rpx;
 			color: #000;
 		}
 	}

+ 29 - 15
pages/register.vue

@@ -6,7 +6,7 @@
 				<image class="mine_image" src="../static/logo.png" mode=""></image>
 				<view class="welcome_title">欢迎注册宝智达气瓶</view>
 			</view>
-			<u--form labelPosition="left" :model="formList" :rules="rules" ref="uForm">
+			<u-form labelPosition="left" :model="formList" :rules="rules" ref="uForm">
 				<u-form-item label="类型" prop="type" labelWidth="80" borderBottom ref="item1">
 					<u-radio-group v-model="formList.type" placement="row">
 						<u-radio shape="circle" :customStyle="{marginRight: '20px'}" v-for="(item, index) in radiolist"
@@ -14,17 +14,28 @@
 					</u-radio-group>
 				</u-form-item>
 				<u-form-item label="手机号" prop="phone" labelWidth="80" borderBottom ref="item1">
-					<u--input v-model="formList.phone" border="none" placeholder="请填写手机号"></u--input>
+					<u-input v-model="formList.phone" border="none" placeholder="请填写手机号"></u-input>
 				</u-form-item>
 				<u-form-item label="验证码" prop="verifyCode" labelWidth="80" borderBottom>
-					<u--input v-model="formList.verifyCode" border="none" placeholder="请填写验证码"></u--input>
+					<u-input v-model="formList.verifyCode" border="none" placeholder="请填写验证码"></u-input>
 					<u-button slot="right" @tap="getCode" :text="tips" type="success" size="mini"
 						:disabled="disabled1"></u-button>
 				</u-form-item>
 				<u-form-item label="密码" prop="password" labelWidth="80" borderBottom ref="item1">
-					<u--input v-model="formList.password" border="none" placeholder="请填写密码"></u--input>
+					<u-input v-show="isText === true" placeholder="请填写密码" border="none" v-model="formList.password"
+						class="input_class_pwd" :password="true">
+						<template slot="suffix" v-if="formList.password">
+							<u-icon name="eye-off" @click="isText = false" size="20"></u-icon>
+						</template>
+					</u-input>
+					<u-input v-show="isText === false" placeholder="请填写密码" border="none" v-model="formList.password"
+						class="input_class_pwd" :password="false">
+						<template slot="suffix" v-if="formList.password">
+							<u-icon name="eye-fill" @click="isText = true" size="20"></u-icon>
+						</template>
+					</u-input>
 				</u-form-item>
-			</u--form>
+			</u-form>
 			<u-code ref="uCode" @change="codeChange" seconds="90" @start="disabled1 = true"
 				@end="disabled1 = false"></u-code>
 			<view class="title_register" @click="goLogin">去登录</view>
@@ -55,12 +66,6 @@
 				tips: '',
 				disabled1: false,
 				rules: {
-					type: {
-						type: 'string',
-						required: true,
-						message: '请选择用户类型',
-						trigger: ['blur']
-					},
 					phone: {
 						type: 'string',
 						required: true,
@@ -80,6 +85,7 @@
 						trigger: ['blur']
 					},
 				},
+				isText: true,
 			}
 		},
 		computed: {
@@ -89,7 +95,7 @@
 				} else {
 					return false;
 				}
-			}
+			},
 		},
 		methods: {
 			// 注册
@@ -104,12 +110,20 @@
 						if (res.code == 200) {
 							uni.showToast({
 								title: res.msg,
-								icon: 'none'
+								icon: 'none',
+								duration: 2000
 							});
+							this.formList.phone = ''
+							this.formList.password = ''
+							this.formList.verifyCode = ''
 						} else {
+							this.formList.phone = ''
+							this.formList.password = ''
+							this.formList.verifyCode = ''
 							uni.showToast({
 								title: res.data.msg,
-								icon: 'none'
+								icon: 'none',
+								duration: 2000
 							});
 						}
 						uni.hideLoading();
@@ -131,10 +145,10 @@
 							phone: this.formList.phone,
 						}).then(res => {
 							if (res.code == 200) {
-								uni.hideLoading();
 								// 这里此提示会被this.start()方法中的提示覆盖
 								uni.$u.toast('验证码已发送');
 							}
+							uni.hideLoading();
 						})
 					} else {
 						uni.$u.toast('请先输入手机号');

+ 0 - 0
unpackage/dist/build/.automator/h5/.automator.json


BIN
unpackage/dist/build/h5.zip


+ 2 - 0
unpackage/dist/build/h5/index.html

@@ -0,0 +1,2 @@
+<!DOCTYPE html><html lang=zh-CN><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><title>gas-cylinder-h5</title><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><link rel=stylesheet href=/static/index.2da1efab.css></head><body><noscript><strong>Please enable JavaScript to continue.</strong></noscript><div id=app></div><script src=/static/js/chunk-vendors.d7b63a81.js></script><script src=/static/js/index.3d82c1fb.js></script></body></html>

+ 539 - 0
unpackage/dist/build/h5/static/fonts/demo.css

@@ -0,0 +1,539 @@
+/* Logo 字体 */
+@font-face {
+  font-family: "iconfont logo";
+  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
+  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
+}
+
+.logo {
+  font-family: "iconfont logo";
+  font-size: 160px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+/* tabs */
+.nav-tabs {
+  position: relative;
+}
+
+.nav-tabs .nav-more {
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  height: 42px;
+  line-height: 42px;
+  color: #666;
+}
+
+#tabs {
+  border-bottom: 1px solid #eee;
+}
+
+#tabs li {
+  cursor: pointer;
+  width: 100px;
+  height: 40px;
+  line-height: 40px;
+  text-align: center;
+  font-size: 16px;
+  border-bottom: 2px solid transparent;
+  position: relative;
+  z-index: 1;
+  margin-bottom: -1px;
+  color: #666;
+}
+
+
+#tabs .active {
+  border-bottom-color: #f00;
+  color: #222;
+}
+
+.tab-container .content {
+  display: none;
+}
+
+/* 页面布局 */
+.main {
+  padding: 30px 100px;
+  width: 960px;
+  margin: 0 auto;
+}
+
+.main .logo {
+  color: #333;
+  text-align: left;
+  margin-bottom: 30px;
+  line-height: 1;
+  height: 110px;
+  margin-top: -50px;
+  overflow: hidden;
+  *zoom: 1;
+}
+
+.main .logo a {
+  font-size: 160px;
+  color: #333;
+}
+
+.helps {
+  margin-top: 40px;
+}
+
+.helps pre {
+  padding: 20px;
+  margin: 10px 0;
+  border: solid 1px #e7e1cd;
+  background-color: #fffdef;
+  overflow: auto;
+}
+
+.icon_lists {
+  width: 100% !important;
+  overflow: hidden;
+  *zoom: 1;
+}
+
+.icon_lists li {
+  width: 100px;
+  margin-bottom: 10px;
+  margin-right: 20px;
+  text-align: center;
+  list-style: none !important;
+  cursor: default;
+}
+
+.icon_lists li .code-name {
+  line-height: 1.2;
+}
+
+.icon_lists .icon {
+  display: block;
+  height: 100px;
+  line-height: 100px;
+  font-size: 42px;
+  margin: 10px auto;
+  color: #333;
+  -webkit-transition: font-size 0.25s linear, width 0.25s linear;
+  -moz-transition: font-size 0.25s linear, width 0.25s linear;
+  transition: font-size 0.25s linear, width 0.25s linear;
+}
+
+.icon_lists .icon:hover {
+  font-size: 100px;
+}
+
+.icon_lists .svg-icon {
+  /* 通过设置 font-size 来改变图标大小 */
+  width: 1em;
+  /* 图标和文字相邻时,垂直对齐 */
+  vertical-align: -0.15em;
+  /* 通过设置 color 来改变 SVG 的颜色/fill */
+  fill: currentColor;
+  /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
+      normalize.css 中也包含这行 */
+  overflow: hidden;
+}
+
+.icon_lists li .name,
+.icon_lists li .code-name {
+  color: #666;
+}
+
+/* markdown 样式 */
+.markdown {
+  color: #666;
+  font-size: 14px;
+  line-height: 1.8;
+}
+
+.highlight {
+  line-height: 1.5;
+}
+
+.markdown img {
+  vertical-align: middle;
+  max-width: 100%;
+}
+
+.markdown h1 {
+  color: #404040;
+  font-weight: 500;
+  line-height: 40px;
+  margin-bottom: 24px;
+}
+
+.markdown h2,
+.markdown h3,
+.markdown h4,
+.markdown h5,
+.markdown h6 {
+  color: #404040;
+  margin: 1.6em 0 0.6em 0;
+  font-weight: 500;
+  clear: both;
+}
+
+.markdown h1 {
+  font-size: 28px;
+}
+
+.markdown h2 {
+  font-size: 22px;
+}
+
+.markdown h3 {
+  font-size: 16px;
+}
+
+.markdown h4 {
+  font-size: 14px;
+}
+
+.markdown h5 {
+  font-size: 12px;
+}
+
+.markdown h6 {
+  font-size: 12px;
+}
+
+.markdown hr {
+  height: 1px;
+  border: 0;
+  background: #e9e9e9;
+  margin: 16px 0;
+  clear: both;
+}
+
+.markdown p {
+  margin: 1em 0;
+}
+
+.markdown>p,
+.markdown>blockquote,
+.markdown>.highlight,
+.markdown>ol,
+.markdown>ul {
+  width: 80%;
+}
+
+.markdown ul>li {
+  list-style: circle;
+}
+
+.markdown>ul li,
+.markdown blockquote ul>li {
+  margin-left: 20px;
+  padding-left: 4px;
+}
+
+.markdown>ul li p,
+.markdown>ol li p {
+  margin: 0.6em 0;
+}
+
+.markdown ol>li {
+  list-style: decimal;
+}
+
+.markdown>ol li,
+.markdown blockquote ol>li {
+  margin-left: 20px;
+  padding-left: 4px;
+}
+
+.markdown code {
+  margin: 0 3px;
+  padding: 0 5px;
+  background: #eee;
+  border-radius: 3px;
+}
+
+.markdown strong,
+.markdown b {
+  font-weight: 600;
+}
+
+.markdown>table {
+  border-collapse: collapse;
+  border-spacing: 0px;
+  empty-cells: show;
+  border: 1px solid #e9e9e9;
+  width: 95%;
+  margin-bottom: 24px;
+}
+
+.markdown>table th {
+  white-space: nowrap;
+  color: #333;
+  font-weight: 600;
+}
+
+.markdown>table th,
+.markdown>table td {
+  border: 1px solid #e9e9e9;
+  padding: 8px 16px;
+  text-align: left;
+}
+
+.markdown>table th {
+  background: #F7F7F7;
+}
+
+.markdown blockquote {
+  font-size: 90%;
+  color: #999;
+  border-left: 4px solid #e9e9e9;
+  padding-left: 0.8em;
+  margin: 1em 0;
+}
+
+.markdown blockquote p {
+  margin: 0;
+}
+
+.markdown .anchor {
+  opacity: 0;
+  transition: opacity 0.3s ease;
+  margin-left: 8px;
+}
+
+.markdown .waiting {
+  color: #ccc;
+}
+
+.markdown h1:hover .anchor,
+.markdown h2:hover .anchor,
+.markdown h3:hover .anchor,
+.markdown h4:hover .anchor,
+.markdown h5:hover .anchor,
+.markdown h6:hover .anchor {
+  opacity: 1;
+  display: inline-block;
+}
+
+.markdown>br,
+.markdown>p>br {
+  clear: both;
+}
+
+
+.hljs {
+  display: block;
+  background: white;
+  padding: 0.5em;
+  color: #333333;
+  overflow-x: auto;
+}
+
+.hljs-comment,
+.hljs-meta {
+  color: #969896;
+}
+
+.hljs-string,
+.hljs-variable,
+.hljs-template-variable,
+.hljs-strong,
+.hljs-emphasis,
+.hljs-quote {
+  color: #df5000;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-type {
+  color: #a71d5d;
+}
+
+.hljs-literal,
+.hljs-symbol,
+.hljs-bullet,
+.hljs-attribute {
+  color: #0086b3;
+}
+
+.hljs-section,
+.hljs-name {
+  color: #63a35c;
+}
+
+.hljs-tag {
+  color: #333333;
+}
+
+.hljs-title,
+.hljs-attr,
+.hljs-selector-id,
+.hljs-selector-class,
+.hljs-selector-attr,
+.hljs-selector-pseudo {
+  color: #795da3;
+}
+
+.hljs-addition {
+  color: #55a532;
+  background-color: #eaffea;
+}
+
+.hljs-deletion {
+  color: #bd2c00;
+  background-color: #ffecec;
+}
+
+.hljs-link {
+  text-decoration: underline;
+}
+
+/* 代码高亮 */
+/* PrismJS 1.15.0
+https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
+/**
+ * prism.js default theme for JavaScript, CSS and HTML
+ * Based on dabblet (http://dabblet.com)
+ * @author Lea Verou
+ */
+code[class*="language-"],
+pre[class*="language-"] {
+  color: black;
+  background: none;
+  text-shadow: 0 1px white;
+  font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+  text-align: left;
+  white-space: pre;
+  word-spacing: normal;
+  word-break: normal;
+  word-wrap: normal;
+  line-height: 1.5;
+
+  -moz-tab-size: 4;
+  -o-tab-size: 4;
+  tab-size: 4;
+
+  -webkit-hyphens: none;
+  -moz-hyphens: none;
+  -ms-hyphens: none;
+  hyphens: none;
+}
+
+pre[class*="language-"]::-moz-selection,
+pre[class*="language-"] ::-moz-selection,
+code[class*="language-"]::-moz-selection,
+code[class*="language-"] ::-moz-selection {
+  text-shadow: none;
+  background: #b3d4fc;
+}
+
+pre[class*="language-"]::selection,
+pre[class*="language-"] ::selection,
+code[class*="language-"]::selection,
+code[class*="language-"] ::selection {
+  text-shadow: none;
+  background: #b3d4fc;
+}
+
+@media print {
+
+  code[class*="language-"],
+  pre[class*="language-"] {
+    text-shadow: none;
+  }
+}
+
+/* Code blocks */
+pre[class*="language-"] {
+  padding: 1em;
+  margin: .5em 0;
+  overflow: auto;
+}
+
+:not(pre)>code[class*="language-"],
+pre[class*="language-"] {
+  background: #f5f2f0;
+}
+
+/* Inline code */
+:not(pre)>code[class*="language-"] {
+  padding: .1em;
+  border-radius: .3em;
+  white-space: normal;
+}
+
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+  color: slategray;
+}
+
+.token.punctuation {
+  color: #999;
+}
+
+.namespace {
+  opacity: .7;
+}
+
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol,
+.token.deleted {
+  color: #905;
+}
+
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+  color: #690;
+}
+
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+  color: #9a6e3a;
+  background: hsla(0, 0%, 100%, .5);
+}
+
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+  color: #07a;
+}
+
+.token.function,
+.token.class-name {
+  color: #DD4A68;
+}
+
+.token.regex,
+.token.important,
+.token.variable {
+  color: #e90;
+}
+
+.token.important,
+.token.bold {
+  font-weight: bold;
+}
+
+.token.italic {
+  font-style: italic;
+}
+
+.token.entity {
+  cursor: help;
+}

+ 372 - 0
unpackage/dist/build/h5/static/fonts/demo_index.html

@@ -0,0 +1,372 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8"/>
+  <title>iconfont Demo</title>
+  <link rel="shortcut icon" href="//img.alicdn.com/imgextra/i4/O1CN01Z5paLz1O0zuCC7osS_!!6000000001644-55-tps-83-82.svg" type="image/x-icon"/>
+  <link rel="icon" type="image/svg+xml" href="//img.alicdn.com/imgextra/i4/O1CN01Z5paLz1O0zuCC7osS_!!6000000001644-55-tps-83-82.svg"/>
+  <link rel="stylesheet" href="https://g.alicdn.com/thx/cube/1.3.2/cube.min.css">
+  <link rel="stylesheet" href="demo.css">
+  <link rel="stylesheet" href="iconfont.css">
+  <script src="iconfont.js"></script>
+  <!-- jQuery -->
+  <script src="https://a1.alicdn.com/oss/uploads/2018/12/26/7bfddb60-08e8-11e9-9b04-53e73bb6408b.js"></script>
+  <!-- 代码高亮 -->
+  <script src="https://a1.alicdn.com/oss/uploads/2018/12/26/a3f714d0-08e6-11e9-8a15-ebf944d7534c.js"></script>
+  <style>
+    .main .logo {
+      margin-top: 0;
+      height: auto;
+    }
+
+    .main .logo a {
+      display: flex;
+      align-items: center;
+    }
+
+    .main .logo .sub-title {
+      margin-left: 0.5em;
+      font-size: 22px;
+      color: #fff;
+      background: linear-gradient(-45deg, #3967FF, #B500FE);
+      -webkit-background-clip: text;
+      -webkit-text-fill-color: transparent;
+    }
+  </style>
+</head>
+<body>
+  <div class="main">
+    <h1 class="logo"><a href="https://www.iconfont.cn/" title="iconfont 首页" target="_blank">
+      <img width="200" src="https://img.alicdn.com/imgextra/i3/O1CN01Mn65HV1FfSEzR6DKv_!!6000000000514-55-tps-228-59.svg">
+      
+    </a></h1>
+    <div class="nav-tabs">
+      <ul id="tabs" class="dib-box">
+        <li class="dib active"><span>Unicode</span></li>
+        <li class="dib"><span>Font class</span></li>
+        <li class="dib"><span>Symbol</span></li>
+      </ul>
+      
+      <a href="https://www.iconfont.cn/manage/index?manage_type=myprojects&projectId=4468098" target="_blank" class="nav-more">查看项目</a>
+      
+    </div>
+    <div class="tab-container">
+      <div class="content unicode" style="display: block;">
+          <ul class="icon_lists dib-box">
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe822;</span>
+                <div class="name">默认头像</div>
+                <div class="code-name">&amp;#xe822;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe609;</span>
+                <div class="name">首页</div>
+                <div class="code-name">&amp;#xe609;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe8ae;</span>
+                <div class="name">订单</div>
+                <div class="code-name">&amp;#xe8ae;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe66f;</span>
+                <div class="name">扫一扫</div>
+                <div class="code-name">&amp;#xe66f;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe60e;</span>
+                <div class="name">我的</div>
+                <div class="code-name">&amp;#xe60e;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xeb3f;</span>
+                <div class="name">消息 (3)</div>
+                <div class="code-name">&amp;#xeb3f;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe6e6;</span>
+                <div class="name">扫码查询</div>
+                <div class="code-name">&amp;#xe6e6;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe60c;</span>
+                <div class="name">液化气钢瓶</div>
+                <div class="code-name">&amp;#xe60c;</div>
+              </li>
+          
+          </ul>
+          <div class="article markdown">
+          <h2 id="unicode-">Unicode 引用</h2>
+          <hr>
+
+          <p>Unicode 是字体在网页端最原始的应用方式,特点是:</p>
+          <ul>
+            <li>支持按字体的方式去动态调整图标大小,颜色等等。</li>
+            <li>默认情况下不支持多色,直接添加多色图标会自动去色。</li>
+          </ul>
+          <blockquote>
+            <p>注意:新版 iconfont 支持两种方式引用多色图标:SVG symbol 引用方式和彩色字体图标模式。(使用彩色字体图标需要在「编辑项目」中开启「彩色」选项后并重新生成。)</p>
+          </blockquote>
+          <p>Unicode 使用步骤如下:</p>
+          <h3 id="-font-face">第一步:拷贝项目下面生成的 <code>@font-face</code></h3>
+<pre><code class="language-css"
+>@font-face {
+  font-family: 'iconfont';
+  src: url('iconfont.woff2?t=1710482534145') format('woff2'),
+       url('iconfont.woff?t=1710482534145') format('woff'),
+       url('iconfont.ttf?t=1710482534145') format('truetype');
+}
+</code></pre>
+          <h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
+<pre><code class="language-css"
+>.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+</code></pre>
+          <h3 id="-">第三步:挑选相应图标并获取字体编码,应用于页面</h3>
+<pre>
+<code class="language-html"
+>&lt;span class="iconfont"&gt;&amp;#x33;&lt;/span&gt;
+</code></pre>
+          <blockquote>
+            <p>"iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
+          </blockquote>
+          </div>
+      </div>
+      <div class="content font-class">
+        <ul class="icon_lists dib-box">
+          
+          <li class="dib">
+            <span class="icon iconfont icon-morentouxiang"></span>
+            <div class="name">
+              默认头像
+            </div>
+            <div class="code-name">.icon-morentouxiang
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-shouye"></span>
+            <div class="name">
+              首页
+            </div>
+            <div class="code-name">.icon-shouye
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-dingdan"></span>
+            <div class="name">
+              订单
+            </div>
+            <div class="code-name">.icon-dingdan
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-saoyisao"></span>
+            <div class="name">
+              扫一扫
+            </div>
+            <div class="code-name">.icon-saoyisao
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-wode"></span>
+            <div class="name">
+              我的
+            </div>
+            <div class="code-name">.icon-wode
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-a-xiaoxi"></span>
+            <div class="name">
+              消息 (3)
+            </div>
+            <div class="code-name">.icon-a-xiaoxi
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-saomachaxun"></span>
+            <div class="name">
+              扫码查询
+            </div>
+            <div class="code-name">.icon-saomachaxun
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-lpg"></span>
+            <div class="name">
+              液化气钢瓶
+            </div>
+            <div class="code-name">.icon-lpg
+            </div>
+          </li>
+          
+        </ul>
+        <div class="article markdown">
+        <h2 id="font-class-">font-class 引用</h2>
+        <hr>
+
+        <p>font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。</p>
+        <p>与 Unicode 使用方式相比,具有如下特点:</p>
+        <ul>
+          <li>相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。</li>
+          <li>因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。</li>
+        </ul>
+        <p>使用步骤如下:</p>
+        <h3 id="-fontclass-">第一步:引入项目下面生成的 fontclass 代码:</h3>
+<pre><code class="language-html">&lt;link rel="stylesheet" href="./iconfont.css"&gt;
+</code></pre>
+        <h3 id="-">第二步:挑选相应图标并获取类名,应用于页面:</h3>
+<pre><code class="language-html">&lt;span class="iconfont icon-xxx"&gt;&lt;/span&gt;
+</code></pre>
+        <blockquote>
+          <p>"
+            iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
+        </blockquote>
+      </div>
+      </div>
+      <div class="content symbol">
+          <ul class="icon_lists dib-box">
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-morentouxiang"></use>
+                </svg>
+                <div class="name">默认头像</div>
+                <div class="code-name">#icon-morentouxiang</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-shouye"></use>
+                </svg>
+                <div class="name">首页</div>
+                <div class="code-name">#icon-shouye</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-dingdan"></use>
+                </svg>
+                <div class="name">订单</div>
+                <div class="code-name">#icon-dingdan</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-saoyisao"></use>
+                </svg>
+                <div class="name">扫一扫</div>
+                <div class="code-name">#icon-saoyisao</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-wode"></use>
+                </svg>
+                <div class="name">我的</div>
+                <div class="code-name">#icon-wode</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-a-xiaoxi"></use>
+                </svg>
+                <div class="name">消息 (3)</div>
+                <div class="code-name">#icon-a-xiaoxi</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-saomachaxun"></use>
+                </svg>
+                <div class="name">扫码查询</div>
+                <div class="code-name">#icon-saomachaxun</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-lpg"></use>
+                </svg>
+                <div class="name">液化气钢瓶</div>
+                <div class="code-name">#icon-lpg</div>
+            </li>
+          
+          </ul>
+          <div class="article markdown">
+          <h2 id="symbol-">Symbol 引用</h2>
+          <hr>
+
+          <p>这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇<a href="">文章</a>
+            这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:</p>
+          <ul>
+            <li>支持多色图标了,不再受单色限制。</li>
+            <li>通过一些技巧,支持像字体那样,通过 <code>font-size</code>, <code>color</code> 来调整样式。</li>
+            <li>兼容性较差,支持 IE9+,及现代浏览器。</li>
+            <li>浏览器渲染 SVG 的性能一般,还不如 png。</li>
+          </ul>
+          <p>使用步骤如下:</p>
+          <h3 id="-symbol-">第一步:引入项目下面生成的 symbol 代码:</h3>
+<pre><code class="language-html">&lt;script src="./iconfont.js"&gt;&lt;/script&gt;
+</code></pre>
+          <h3 id="-css-">第二步:加入通用 CSS 代码(引入一次就行):</h3>
+<pre><code class="language-html">&lt;style&gt;
+.icon {
+  width: 1em;
+  height: 1em;
+  vertical-align: -0.15em;
+  fill: currentColor;
+  overflow: hidden;
+}
+&lt;/style&gt;
+</code></pre>
+          <h3 id="-">第三步:挑选相应图标并获取类名,应用于页面:</h3>
+<pre><code class="language-html">&lt;svg class="icon" aria-hidden="true"&gt;
+  &lt;use xlink:href="#icon-xxx"&gt;&lt;/use&gt;
+&lt;/svg&gt;
+</code></pre>
+          </div>
+      </div>
+
+    </div>
+  </div>
+  <script>
+  $(document).ready(function () {
+      $('.tab-container .content:first').show()
+
+      $('#tabs li').click(function (e) {
+        var tabContent = $('.tab-container .content')
+        var index = $(this).index()
+
+        if ($(this).hasClass('active')) {
+          return
+        } else {
+          $('#tabs li').removeClass('active')
+          $(this).addClass('active')
+
+          tabContent.hide().eq(index).fadeIn()
+        }
+      })
+    })
+  </script>
+</body>
+</html>

+ 47 - 0
unpackage/dist/build/h5/static/fonts/iconfont.css

@@ -0,0 +1,47 @@
+@font-face {
+  font-family: "iconfont"; /* Project id 4468098 */
+  src: url('@/static/fonts/iconfont.woff2?t=1710482534145') format('woff2'),
+       url('@/static/fonts/iconfont.woff?t=1710482534145') format('woff'),
+       url('@/static/fonts/iconfont.ttf?t=1710482534145') format('truetype');
+}
+
+.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-morentouxiang:before {
+  content: "\e822";
+}
+
+.icon-shouye:before {
+  content: "\e609";
+}
+
+.icon-dingdan:before {
+  content: "\e8ae";
+}
+
+.icon-saoyisao:before {
+  content: "\e66f";
+}
+
+.icon-wode:before {
+  content: "\e60e";
+}
+
+.icon-a-xiaoxi:before {
+  content: "\eb3f";
+}
+
+.icon-saomachaxun:before {
+  content: "\e6e6";
+}
+
+.icon-lpg:before {
+  content: "\e60c";
+}
+

File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/h5/static/fonts/iconfont.js


+ 65 - 0
unpackage/dist/build/h5/static/fonts/iconfont.json

@@ -0,0 +1,65 @@
+{
+  "id": "4468098",
+  "name": "燃气瓶-h5",
+  "font_family": "iconfont",
+  "css_prefix_text": "icon-",
+  "description": "",
+  "glyphs": [
+    {
+      "icon_id": "1585356",
+      "name": "默认头像",
+      "font_class": "morentouxiang",
+      "unicode": "e822",
+      "unicode_decimal": 59426
+    },
+    {
+      "icon_id": "7352948",
+      "name": "首页",
+      "font_class": "shouye",
+      "unicode": "e609",
+      "unicode_decimal": 58889
+    },
+    {
+      "icon_id": "11372658",
+      "name": "订单",
+      "font_class": "dingdan",
+      "unicode": "e8ae",
+      "unicode_decimal": 59566
+    },
+    {
+      "icon_id": "12097604",
+      "name": "扫一扫",
+      "font_class": "saoyisao",
+      "unicode": "e66f",
+      "unicode_decimal": 58991
+    },
+    {
+      "icon_id": "25214248",
+      "name": "我的",
+      "font_class": "wode",
+      "unicode": "e60e",
+      "unicode_decimal": 58894
+    },
+    {
+      "icon_id": "35567583",
+      "name": "消息 (3)",
+      "font_class": "a-xiaoxi",
+      "unicode": "eb3f",
+      "unicode_decimal": 60223
+    },
+    {
+      "icon_id": "38825662",
+      "name": "扫码查询",
+      "font_class": "saomachaxun",
+      "unicode": "e6e6",
+      "unicode_decimal": 59110
+    },
+    {
+      "icon_id": "13181370",
+      "name": "液化气钢瓶",
+      "font_class": "lpg",
+      "unicode": "e60c",
+      "unicode_decimal": 58892
+    }
+  ]
+}

BIN
unpackage/dist/build/h5/static/fonts/iconfont.ttf


BIN
unpackage/dist/build/h5/static/fonts/iconfont.woff


BIN
unpackage/dist/build/h5/static/fonts/iconfont.woff2


BIN
unpackage/dist/build/h5/static/image/bottle.png


BIN
unpackage/dist/build/h5/static/img/bottle.763282cd.png


BIN
unpackage/dist/build/h5/static/img/logo.b5ab4a74.png


BIN
unpackage/dist/build/h5/static/img/portrait.2071eb3d.png


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/h5/static/index.2da1efab.css


+ 91 - 0
unpackage/dist/build/h5/static/js/announcements.js

@@ -0,0 +1,91 @@
+export const check = () => {
+  return [{
+    id: 'ITEM_1',
+    label: '是否违规在地下室、卫生间或密闭的房间内存放使用瓶装液化气。',
+    value: '0',
+  },{
+    id: 'ITEM_2',
+    label: '液化气瓶、炉具使用或气瓶存放的房间内是否违反规定安床住人。',
+    value: '0',
+  },{
+    id: 'ITEM_3',
+    label: '液化气瓶、炉具使用或存放的房间上方是否搭建阁楼。',
+    value: '0',
+  },{
+    id: 'ITEM_4',
+    label: '液化气瓶、炉具使用或存放的房间内通风是否良好及加装换气装置。',
+    value: '0',
+  },{
+    id: 'ITEM_5',
+    label: '液化气瓶、炉具使用或存放的场所是否配备灭火器。',
+    value: '0',
+  },{
+    id: 'ITEM_6',
+    label: '液化气瓶存放间内是否按照国家规范安装燃气浓度报警仪装置。',
+    value: '0',
+  },{
+    id: 'ITEM_7',
+    label: '液化气瓶、炉具使用或存放处是否堆放易燃物及其它杂物。',
+    value: '0',
+  },{
+    id: 'ITEM_8',
+    label: '液化气瓶、炉具、软管是否放在不易碰撞且易操作检查的地方。',
+    value: '0',
+  },{
+    id: 'ITEM_9',
+    label: '液化气瓶是否摆放在密闭狭小的橱柜内使用。',
+    value: '0',
+  },{
+    id: 'ITEM_10',
+    label: '液化气炉具下方是否密闭及不具备通风条件。',
+    value: '0',
+  },{
+    id: 'ITEM_11',
+    label: '液化气瓶是否完好有效、开关是否正常无泄漏。',
+    value: '0',
+  },{
+    id: 'ITEM_12',
+    label: '燃气炉具工作性能正常,无破损、无泄漏,且开关完好正常。',
+    value: '0',
+  },{
+    id: 'ITEM_13',
+    label: '减压阀是否功能完好无破损,且安装到位无松动、无异常、无泄漏。',
+    value: '0',
+  },{
+    id: 'ITEM_14',
+    label: '连接软管是否完好无老化、龟裂、鼓包、破损、泄漏等现象。',
+    value: '0',
+  },{
+    id: 'ITEM_15',
+    label: '软管与炉具、减压阀连接处是否安装到位且卡子紧固无松动、无泄漏。',
+    value: '0',
+  },{
+    id: 'ITEM_16',
+    label: '连接软管有无加装三通、套管、穿墙或铺设顶棚、埋地等不易检查处。',
+    value: '0',
+  },{
+    id: 'ITEM_17',
+    label: '连接软管是否放置炉具底部靠近明火、高温或电源线路及电器处。',
+    value: '0',
+  },{
+    id: 'ITEM_18',
+    label: '气瓶护罩及气瓶周围是否堆放或悬挂杂物。',
+    value: '0',
+  },{
+    id: 'ITEM_19',
+    label: '气瓶是否与炉具、高温物体保持一定的安全间距。',
+    value: '0',
+  },{
+    id: 'ITEM_20',
+    label: '燃气热水器是否放置在卫生间或其它密闭不通风的房间内使用。',
+    value: '0',
+  },{
+    id: 'ITEM_21',
+    label: '燃气热水器或汤锅桶是否安装排烟管将废气引出室外。',
+    value: '0',
+  },{
+    id: 'ITEM_22',
+    label: '是否明确专人负责具体操作及日常安全巡查管理。',
+    value: '0',
+  },]
+}

+ 176 - 0
unpackage/dist/build/h5/static/js/blockSort.js

@@ -0,0 +1,176 @@
+export const statisticalState = () => {
+  return [{
+      label: '已提交待审批',
+      value: 'inform',
+    },
+    {
+      label: '在用',
+      value: 'using',
+    },
+    {
+      label: '报废',
+      value: 'scrapped',
+    },
+  ]
+}
+export const neurogen = () => {
+  return [{
+      label: '液化石油气',
+      value: 0,
+    },
+    {
+      label: '二甲醚',
+      value: 1,
+    },
+    {
+      label: '氧气',
+      value: 2,
+    },
+    {
+      label: '二氧化碳',
+      value: 3,
+    },
+    {
+      label: '溶解乙炔',
+      value: 4,
+    }
+  ]
+}
+export const attribution = () => {
+  return [{
+      label: '门店',
+      value: '0001',
+    },
+    {
+      label: '气站',
+      value: '0002',
+    },
+    {
+      label: '企业',
+      value: '0003',
+    },
+    {
+      label: '检验机构',
+      value: '0004',
+    },
+    {
+      label: '移动库',
+      value: '005',
+    },
+    {
+      label: '门店',
+      value: '006',
+    }
+  ]
+}
+export const cylinderCondition = () => {
+  return [{
+      label: '新瓶提交',
+      value: 'submit',
+    },
+    {
+      label: '在用(以检验)',
+      value: 'using',
+    },
+    {
+      label: '停用(待检验)',
+      value: 'stop',
+    },
+    {
+      label: '报废',
+      value: 'scrapped',
+    }
+  ]
+}
+
+export const process = () => {
+  return [{
+      label: '商家入库',
+      value: '6',
+    },
+    {
+      label: '门店空瓶出库',
+      value: '10',
+    },
+    {
+      label: '司机确认空瓶装车',
+      value: '11',
+    },
+    {
+      label: '司机运输空瓶到达气站',
+      value: '12',
+    },
+    {
+      label: '气站确认空瓶到达气站',
+      value: '13',
+    },
+    {
+      label: '气站充装空瓶',
+      value: '14',
+    },
+    {
+      label: '气站重瓶出库',
+      value: '15',
+    },
+    {
+      label: '司机将订单退回气站',
+      value: '16',
+    },
+    {
+      label: '司机确认重瓶从气站出库',
+      value: '17',
+    },
+    {
+      label: '司机交付门店',
+      value: '19',
+    },
+    {
+      label: '门店回收空瓶',
+      value: '21',
+    },
+    {
+      label: '气瓶检验',
+      value: '23',
+    },
+    {
+      label: '送气员领重瓶出库',
+      value: '25',
+    },
+    {
+      label: '送气员送达重瓶',
+      value: '26',
+    },
+    {
+      label: '送气员回收空瓶',
+      value: '27',
+    },
+    {
+      label: '门店确认重瓶卸货入库',
+      value: '31',
+    },
+    {
+      label: '门店将重瓶退回司机',
+      value: '33',
+    },
+    {
+      label: '门店取消订单',
+      value: '34',
+    },
+    {
+      label: '门店确认未配送重瓶返库',
+      value: '35',
+    },
+    {
+      label: '送气订单取消',
+      value: '36',
+    },
+    {
+      label: '门店重瓶出库',
+      value: '37',
+    },
+    {
+      label: '上报流程异常信息',
+      value: '1000',
+    }
+  ]
+}

File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/h5/static/js/chunk-vendors.d7b63a81.js


+ 370 - 0
unpackage/dist/build/h5/static/js/districtCode.js

@@ -0,0 +1,370 @@
+export const urbanArea = () => {
+	return [{
+		value: '520100',
+		label: '贵阳市',
+		children: [{
+			value: '520101',
+			label: '高新区',
+		}, {
+			value: '520102',
+			label: '南明区',
+		}, {
+			value: '520103',
+			label: '云岩区',
+		}, {
+			value: '520111',
+			label: '花溪区',
+		}, {
+			value: '520112',
+			label: '乌当区',
+		}, {
+			value: '520113',
+			label: '白云区',
+		}, {
+			value: '520114',
+			label: '国家经济技术开发区',
+		}, {
+			value: '520115',
+			label: '观山湖区',
+		}, {
+			value: '520121',
+			label: '开阳县',
+		}, {
+			value: '520122',
+			label: '息烽县',
+		}, {
+			value: '520123',
+			label: '修文县',
+		}, {
+			value: '520181',
+			label: '清镇市',
+		}, ]
+	}, {
+		value: '520200',
+		label: '六盘水市',
+		children: [{
+			value: '520201',
+			label: '钟山区',
+		}, {
+			value: '520203',
+			label: '六枝特区',
+		}, {
+			value: '520221',
+			label: '水城区',
+		}, {
+			value: '520222',
+			label: '盘县',
+		}, {
+			value: '520223',
+			label: '钟山经济开发区',
+		}, {
+			value: '520224',
+			label: '红果经济开发区',
+		}]
+	}, {
+		value: '520300',
+		label: '遵义市',
+		children: [{
+			value: '520301',
+			label: '汇川区',
+		}, {
+			value: '520302',
+			label: '红花岗区',
+		}, {
+			value: '520321',
+			label: '播州区',
+		}, {
+			value: '520322',
+			label: '桐梓县',
+		}, {
+			value: '520323',
+			label: '绥阳县',
+		}, {
+			value: '520324',
+			label: '正安县',
+		}, {
+			value: '520325',
+			label: '道真县',
+		}, {
+			value: '520326',
+			label: '务川县',
+		}, {
+			value: '520327',
+			label: '凤冈县',
+		}, {
+			value: '520328',
+			label: '湄潭县',
+		}, {
+			value: '520329',
+			label: '余庆县',
+		}, {
+			value: '520330',
+			label: '习水县',
+		}, {
+			value: '520331',
+			label: '遵义国家经济技术开发区',
+		}, {
+			value: '520332',
+			label: '新蒲新区',
+		}, {
+			value: '520333',
+			label: '南部新区',
+		}, {
+			value: '520381',
+			label: '赤水市',
+		}, {
+			value: '520382',
+			label: '仁怀市',
+		}]
+	}, {
+		value: '520400',
+		label: '安顺市',
+		children: [{
+			value: '520201',
+			label: '安顺经济开发区',
+		}, {
+			value: '520402',
+			label: '西秀区',
+		}, {
+			value: '520421',
+			label: '平坝区',
+		}, {
+			value: '520422',
+			label: '普定县',
+		}, {
+			value: '520423',
+			label: '镇宁县',
+		}, {
+			value: '520424',
+			label: '关岭县',
+		}, {
+			value: '520425',
+			label: '紫云县',
+		}, {
+			value: '520427',
+			label: '黄果树风景名胜区',
+		}, {
+			value: '520428',
+			label: '龙宫风景区',
+		}]
+	}, {
+		value: '522200',
+		label: '铜仁市',
+		children: [{
+			value: '520626',
+			label: '德江县',
+		}, {
+			value: '522201',
+			label: '碧江区',
+		}, {
+			value: '522222',
+			label: '江口县',
+		}, {
+			value: '522223',
+			label: '玉屏县',
+		}, {
+			value: '522224',
+			label: '石阡县',
+		}, {
+			value: '522225',
+			label: '思南县',
+		}, {
+			value: '522226',
+			label: '印江县',
+		}, {
+			value: '522228',
+			label: '沿河县',
+		}, {
+			value: '522229',
+			label: '松桃县',
+		}, {
+			value: '522230',
+			label: '万山区',
+		}, {
+			value: '522231',
+			label: '大龙开发区',
+		}, {
+			value: '522232',
+			label: '铜仁高新区',
+		}]
+	}, {
+		value: '522300',
+		label: '黔西南州',
+		children: [{
+			value: '522301',
+			label: '兴义市',
+		}, {
+			value: '522322',
+			label: '兴仁市',
+		}, {
+			value: '522323',
+			label: '普安县',
+		}, {
+			value: '522324',
+			label: '晴隆县',
+		}, {
+			value: '522325',
+			label: '贞丰县',
+		}, {
+			value: '522326',
+			label: '望谟县',
+		}, {
+			value: '522327',
+			label: '册亨县',
+		}, {
+			value: '522328',
+			label: '安龙县',
+		}, {
+			value: '522329',
+			label: '顶效经济开发区',
+		}]
+	}, {
+		value: '522400',
+		label: '毕节市',
+		children: [{
+			value: '522401',
+			label: '七星关区',
+		}, {
+			value: '522422',
+			label: '大方县',
+		}, {
+			value: '522423',
+			label: '黔西县',
+		}, {
+			value: '522424',
+			label: '金沙县',
+		}, {
+			value: '522425',
+			label: '织金县',
+		}, {
+			value: '522426',
+			label: '纳雍县',
+		}, {
+			value: '522428',
+			label: '赫章县',
+		}, {
+			value: '522429',
+			label: '百里杜鹃风景名胜区',
+		}, {
+			value: '522431',
+			label: '金海湖新区',
+		}, {
+			value: '524027',
+			label: '威宁彝族回族苗族自治县',
+		}]
+	}, {
+		value: '522400',
+		label: '黔东南州',
+		children: [{
+			value: '522601',
+			label: '凯里市',
+		}, {
+			value: '522622',
+			label: '黄平县',
+		}, {
+			value: '522623',
+			label: '施秉县',
+		}, {
+			value: '522624',
+			label: '三穗县',
+		}, {
+			value: '522625',
+			label: '镇远县',
+		}, {
+			value: '522626',
+			label: '岑巩县',
+		}, {
+			value: '522627',
+			label: '天柱县',
+		}, {
+			value: '522628',
+			label: '锦屏县',
+		}, {
+			value: '522629',
+			label: '剑河县',
+		}, {
+			value: '522630',
+			label: '台江县',
+		}, {
+			value: '522631',
+			label: '黎平县',
+		}, {
+			value: '522632',
+			label: '榕江县',
+		}, {
+			value: '522633',
+			label: '从江县',
+		}, {
+			value: '522634',
+			label: '雷山县',
+		}, {
+			value: '522635',
+			label: '麻江县',
+		}, {
+			value: '522636',
+			label: '丹寨县',
+		}, {
+			value: '522637',
+			label: '凯里经济开发区',
+		}]
+	}, {
+		value: '522700',
+		label: '黔南州',
+		children: [{
+			value: '522701',
+			label: '都匀市',
+		}, {
+			value: '522702',
+			label: '福泉市',
+		}, {
+			value: '522722',
+			label: '荔波县',
+		}, {
+			value: '522723',
+			label: '贵定县',
+		}, {
+			value: '522725',
+			label: '瓮安县',
+		}, {
+			value: '522726',
+			label: '独山县',
+		}, {
+			value: '522727',
+			label: '平塘县',
+		}, {
+			value: '522728',
+			label: '罗甸县',
+		}, {
+			value: '522729',
+			label: '长顺县',
+		}, {
+			value: '522730',
+			label: '龙里县',
+		}, {
+			value: '522731',
+			label: '惠水县',
+		}, {
+			value: '522732',
+			label: '三都县',
+		}, {
+			value: '522733',
+			label: '都匀经济开发区',
+		}]
+	}, {
+		value: '522800',
+		label: '贵安新区',
+		children: [{
+			value: '522801',
+			label: '党武',
+		}, {
+			value: '522802',
+			label: '湖潮',
+		}, {
+			value: '522803',
+			label: '马场',
+		}, {
+			value: '522804',
+			label: '高峰',
+		}]
+	}]
+}

File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/h5/static/js/index.3d82c1fb.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/h5/static/js/pages-codeLogin.772840e4.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/h5/static/js/pages-codeLogin~pages-home-company~pages-home-locationArea~pages-indexRouter~pages-login~pages-mine-~1a74a0f9.bb773396.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/h5/static/js/pages-codeLogin~pages-home-company~pages-indexRouter~pages-login~pages-mine-addAddress~pages-mine-pa~e8dd54d0.d664e738.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/h5/static/js/pages-codeLogin~pages-login~pages-mine-addAddress~pages-mine-password~pages-mine-personal~pages-orde~4e410aa3.5a2ebf40.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/h5/static/js/pages-codeLogin~pages-login~pages-mine-addAddress~pages-mine-personal~pages-order-booking~pages-orde~e0ed96cf.d4f80046.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/h5/static/js/pages-home-company.b3c8a28a.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/h5/static/js/pages-home-index.1aaa7433.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/h5/static/js/pages-home-locationArea.056f433a.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/h5/static/js/pages-index-codeTracing.71dec87d.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/h5/static/js/pages-indexRouter.124af528.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/h5/static/js/pages-indexRouter~pages-information-index~pages-order-index.3d853214.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/h5/static/js/pages-indexRouter~pages-mine-system~pages-order-index.5232c76f.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/h5/static/js/pages-information-index.0988a4ff.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/h5/static/js/pages-login.3e16aada.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/h5/static/js/pages-mine-addAddress.cc2c8e01.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/h5/static/js/pages-mine-address.9cc3107a.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/h5/static/js/pages-mine-index.bce674b2.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/h5/static/js/pages-mine-password.06669abe.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/h5/static/js/pages-mine-personal.edd8cdff.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/h5/static/js/pages-mine-system.f65e70ef.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/h5/static/js/pages-order-booking.a095fa88.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/h5/static/js/pages-order-completionTasks.f14c59c1.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/h5/static/js/pages-order-delivery.78bd3e3e.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/h5/static/js/pages-order-delivery~pages-order-securityCheck.be734f40.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/h5/static/js/pages-order-index.477c3322.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/h5/static/js/pages-order-orderDetails.75906ab6.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/h5/static/js/pages-order-securityCheck.aa8b57cc.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/h5/static/js/pages-order-signatureBoard.48754c2f.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/build/h5/static/js/pages-register.0dc6c19a.js


BIN
unpackage/dist/build/h5/static/logo.png


BIN
unpackage/dist/build/h5/static/portrait.png


BIN
unpackage/dist/build/h5/static/tab/dd.png


BIN
unpackage/dist/build/h5/static/tab/dd_s.png


BIN
unpackage/dist/build/h5/static/tab/sy.png


BIN
unpackage/dist/build/h5/static/tab/sy_s.png


BIN
unpackage/dist/build/h5/static/tab/wd.png


BIN
unpackage/dist/build/h5/static/tab/wd_s.png


BIN
unpackage/dist/build/h5/static/tab/xx.png


BIN
unpackage/dist/build/h5/static/tab/xx_s.png


File diff suppressed because it is too large
+ 1 - 2
unpackage/dist/dev/app-plus/app-config-service.js


File diff suppressed because it is too large
+ 0 - 0
unpackage/dist/dev/app-plus/app-service.js


File diff suppressed because it is too large
+ 249 - 53
unpackage/dist/dev/app-plus/app-view.js


+ 85 - 0
utils/distance.js

@@ -0,0 +1,85 @@
+import Storage from './../store/storage.js';
+// 获取弧度
+// 根据两点的经纬度计算距离
+function getRad(d) {
+
+	return (d * Math.PI) / 180.0;
+
+};
+
+// 计算距离  lat1,lng1 第一个坐标 lat2,lng2 目标坐标
+
+function getFlatternDistance(lat1, lng1, lat2, lng2) {
+	var f = getRad((lat1 + lat2) / 2);
+
+	var g = getRad((lat1 - lat2) / 2);
+
+	var l = getRad((lng1 - lng2) / 2);
+
+	var sg = Math.sin(g);
+
+	var sl = Math.sin(l);
+
+	var sf = Math.sin(f);
+
+
+
+	var s, c, w, r, d, h1, h2;
+
+	var a = 6378137.0;
+
+	var fl = 1 / 298.257;
+
+
+
+	sg = sg * sg;
+
+	sl = sl * sl;
+
+	sf = sf * sf;
+
+
+
+	s = sg * (1 - sl) + (1 - sf) * sl;
+
+	c = (1 - sg) * (1 - sl) + sf * sl;
+
+
+
+	w = Math.atan(Math.sqrt(s / c));
+
+	r = Math.sqrt(s * c) / w;
+
+	d = 2 * w * a;
+
+	h1 = (3 * r - 1) / 2 / c;
+
+	h2 = (3 * r + 1) / 2 / s;
+
+
+
+	return d * (1 + fl * (h1 * sf * (1 - sg) - h2 * (1 - sf) * sg));
+
+}
+let latitude = '';
+let longitude = '';
+// 计算距离
+function calculateDistance(shopPosition) {
+	var arr = Storage.getCache('longitude')
+	latitude = arr.latitude
+	longitude = arr.longitude
+	if (latitude && longitude) {
+		const [lat, lon] = shopPosition.split(",")
+		const cal = getFlatternDistance(latitude, longitude, Number(lat), Number(lon))
+		const number = Math.round(cal)
+		if (cal > 999) {
+			return (number / 1000).toFixed(1) + 'km'
+		} else {
+			return number + '米'
+		}
+	} else {
+		return ''
+	}
+}
+
+export default calculateDistance;

+ 21 - 0
uview-ui/LICENSE

@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2023 www.uviewui.com
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

+ 66 - 0
uview-ui/README.md

@@ -0,0 +1,66 @@
+<p align="center">
+    <img alt="logo" src="https://uviewui.com/common/logo.png" width="120" height="120" style="margin-bottom: 10px;">
+</p>
+<h3 align="center" style="margin: 30px 0 30px;font-weight: bold;font-size:40px;">uView 2.0</h3>
+<h3 align="center">多平台快速开发的UI框架</h3>
+
+[![stars](https://img.shields.io/github/stars/umicro/uView2.0?style=flat-square&logo=GitHub)](https://github.com/umicro/uView2.0)
+[![forks](https://img.shields.io/github/forks/umicro/uView2.0?style=flat-square&logo=GitHub)](https://github.com/umicro/uView2.0)
+[![issues](https://img.shields.io/github/issues/umicro/uView2.0?style=flat-square&logo=GitHub)](https://github.com/umicro/uView2.0/issues)
+[![Website](https://img.shields.io/badge/uView-up-blue?style=flat-square)](https://uviewui.com)
+[![release](https://img.shields.io/github/v/release/umicro/uView2.0?style=flat-square)](https://gitee.com/umicro/uView2.0/releases)
+[![license](https://img.shields.io/github/license/umicro/uView2.0?style=flat-square)](https://en.wikipedia.org/wiki/MIT_License)
+
+## 说明
+
+uView UI,是[uni-app](https://uniapp.dcloud.io/)全面兼容nvue的uni-app生态框架,全面的组件和便捷的工具会让您信手拈来,如鱼得水
+
+## [官方文档:https://uviewui.com](https://uviewui.com)
+
+
+## 预览
+
+您可以通过**微信**扫码,查看最佳的演示效果。
+<br>
+<br>
+<img src="https://uviewui.com/common/weixin_mini_qrcode.png" width="220" height="220" >
+
+
+## 链接
+
+- [官方文档](https://www.uviewui.com/)
+- [更新日志](https://www.uviewui.com/components/changelog.html)
+- [升级指南](https://www.uviewui.com/components/changeGuide.html)
+- [关于我们](https://www.uviewui.com/cooperation/about.html)
+
+## 交流反馈
+
+欢迎加入我们的QQ群交流反馈:[点此跳转](https://www.uviewui.com/components/addQQGroup.html)
+
+## 关于PR
+
+> 我们非常乐意接受各位的优质PR,但在此之前我希望您了解uView2.0是一个需要兼容多个平台的(小程序、h5、ios app、android app)包括nvue页面、vue页面。
+> 所以希望在您修复bug并提交之前尽可能的去这些平台测试一下兼容性。最好能携带测试截图以方便审核。非常感谢!
+
+## 安装
+
+#### **uni-app插件市场链接** —— [https://ext.dcloud.net.cn/plugin?id=1593](https://ext.dcloud.net.cn/plugin?id=1593)
+
+请通过[官网安装文档](https://www.uviewui.com/components/install.html)了解更详细的内容
+
+## 快速上手
+
+请通过[快速上手](https://uviewui.com/components/quickstart.html)了解更详细的内容
+
+## 使用方法
+配置easycom规则后,自动按需引入,无需`import`组件,直接引用即可。
+
+```html
+<template>
+	<u-button text="按钮"></u-button>
+</template>
+```
+
+## 版权信息
+uView遵循[MIT](https://en.wikipedia.org/wiki/MIT_License)开源协议,意味着您无需支付任何费用,也无需授权,即可将uView应用到您的产品中。
+

+ 362 - 0
uview-ui/changelog.md

@@ -0,0 +1,362 @@
+## 2.0.36(2023-03-27)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 重构`deepClone` & `deepMerge`方法
+2. 其他优化
+## 2.0.34(2022-09-24)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. `u-input`、`u-textarea`增加`ignoreCompositionEvent`属性
+2. 修复`route`方法调用可能报错的问题
+3. 修复`u-no-network`组件`z-index`无效的问题
+4. 修复`textarea`组件在h5上confirmType=""报错的问题
+5. `u-rate`适配`nvue`
+6. 优化验证手机号码的正则表达式(根据工信部发布的《电信网编号计划(2017年版)》进行修改。)
+7. `form-item`添加`labelPosition`属性
+8. `u-calendar`修复`maxDate`设置为当前日期,并且当前时间大于08:00时无法显示日期列表的问题 (#724)
+9. `u-radio`增加一个默认插槽用于自定义修改label内容 (#680)
+10. 修复`timeFormat`函数在safari重的兼容性问题 (#664)
+## 2.0.33(2022-06-17)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复`loadmore`组件`lineColor`类型错误问题
+2. 修复`u-parse`组件`imgtap`、`linktap`不生效问题
+## 2.0.32(2022-06-16)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+1. `u-loadmore`新增自定义颜色、虚/实线
+2. 修复`u-swiper-action`组件部分平台不能上下滑动的问题
+3. 修复`u-list`回弹问题
+4. 修复`notice-bar`组件动画在低端安卓机可能会抖动的问题
+5. `u-loading-page`添加控制图标大小的属性`iconSize`
+6. 修复`u-tooltip`组件`color`参数不生效的问题
+7. 修复`u--input`组件使用`blur`事件输出为`undefined`的bug
+8. `u-code-input`组件新增键盘弹起时,是否自动上推页面参数`adjustPosition`
+9. 修复`image`组件`load`事件无回调对象问题
+10. 修复`button`组件`loadingSize`设置无效问题
+10. 其他修复
+## 2.0.31(2022-04-19)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复`upload`在`vue`页面上传成功后没有成功标志的问题
+2. 解决演示项目中微信小程序模拟上传图片一直出于上传中问题
+3. 修复`u-code-input`组件在`nvue`页面编译到`app`平台上光标异常问题(`app`去除此功能)
+4. 修复`actionSheet`组件标题关闭按钮点击事件名称错误的问题
+5. 其他修复
+## 2.0.30(2022-04-04)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. `u-rate`增加`readonly`属性
+2. `tabs`滑块支持设置背景图片
+3. 修复`u-subsection` `mode`为`subsection`时,滑块样式不正确的问题
+4. `u-code-input`添加光标效果动画
+5. 修复`popup`的`open`事件不触发
+6. 修复`u-flex-column`无效的问题
+7. 修复`u-datetime-picker`索引在特定场合异常问题
+8. 修复`u-datetime-picker`最小时间字符串模板错误问题
+9. `u-swiper`添加`m3u8`验证
+10. `u-swiper`修改判断image和video逻辑
+11. 修复`swiper`无法使用本地图片问题,增加`type`参数
+12. 修复`u-row-notice`格式错误问题
+13. 修复`u-switch`组件当`unit`为`rpx`时,`nodeStyle`消失的问题
+14. 修复`datetime-picker`组件`showToolbar`与`visibleItemCount`属性无效的问题
+15. 修复`upload`组件条件编译位置判断错误,导致`previewImage`属性设置为`false`时,整个组件都会被隐藏的问题
+16. 修复`u-checkbox-group`设置`shape`属性无效的问题
+17. 修复`u-upload`的`capture`传入字符串的时候不生效的问题
+18. 修复`u-action-sheet`组件,关闭事件逻辑错误的问题
+19. 修复`u-list`触顶事件的触发错误的问题
+20. 修复`u-text`只有手机号可拨打的问题
+21. 修复`u-textarea`不能换行的问题
+22. 其他修复
+## 2.0.29(2022-03-13)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复`u--text`组件设置`decoration`属性未生效的问题
+2. 修复`u-datetime-picker`使用`formatter`后返回值不正确
+3. 修复`u-datetime-picker` `intercept` 可能为undefined
+4. 修复已设置单位 uni..config.unit = 'rpx'时,线型指示器 `transform` 的位置翻倍,导致指示器超出宽度
+5. 修复mixin中bem方法生成的类名在支付宝和字节小程序中失效
+6. 修复默认值传值为空的时候,打开`u-datetime-picker`报错,不能选中第一列时间的bug
+7. 修复`u-datetime-picker`使用`formatter`后返回值不正确
+8. 修复`u-image`组件`loading`无效果的问题
+9. 修复`config.unit`属性设为`rpx`时,导航栏占用高度不足导致塌陷的问题
+10. 修复`u-datetime-picker`组件`itemHeight`无效问题
+11. 其他修复
+## 2.0.28(2022-02-22)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. search组件新增searchIconSize属性
+2. 兼容Safari/Webkit中传入时间格式如2022-02-17 12:00:56
+3. 修复text value.js 判断日期出format错误问题
+4. priceFormat格式化金额出现精度错误
+5. priceFormat在部分情况下出现精度损失问题
+6. 优化表单rules提示
+7. 修复avatar组件src为空时,展示状态不对
+8. 其他修复
+## 2.0.27(2022-01-28)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1.样式修复
+## 2.0.26(2022-01-28)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1.样式修复
+## 2.0.25(2022-01-27)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复text组件mode=price时,可能会导致精度错误的问题
+2. 添加$u.setConfig()方法,可设置uView内置的config, props, zIndex, color属性,详见:[修改uView内置配置方案](https://uviewui.com/components/setting.html#%E9%BB%98%E8%AE%A4%E5%8D%95%E4%BD%8D%E9%85%8D%E7%BD%AE)
+3. 优化form组件在errorType=toast时,如果输入错误页面会有抖动的问题
+4. 修复$u.addUnit()对配置默认单位可能无效的问题
+## 2.0.24(2022-01-25)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复swiper在current指定非0时缩放有误
+2. 修复u-icon添加stop属性的时候报错
+3. 优化遗留的通过正则判断rpx单位的问题
+4. 优化Layout布局 vue使用gutter时,会超出固定区域
+5. 优化search组件高度单位问题(rpx -> px)
+6. 修复u-image slot 加载和错误的图片失去了高度
+7. 修复u-index-list中footer插槽与header插槽存在性判断错误
+8. 修复部分机型下u-popup关闭时会闪烁
+9. 修复u-image在nvue-app下失去宽高
+10. 修复u-popup运行报错
+11. 修复u-tooltip报错
+12. 修复box-sizing在app下的警告
+13. 修复u-navbar在小程序中报运行时错误
+14. 其他修复
+## 2.0.23(2022-01-24)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复image组件在hx3.3.9的nvue下可能会显示异常的问题
+2. 修复col组件gutter参数带rpx单位处理不正确的问题
+3. 修复text组件单行时无法显示省略号的问题
+4. navbar添加titleStyle参数
+5. 升级到hx3.3.9可消除nvue下控制台样式警告的问题
+## 2.0.22(2022-01-19)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. $u.page()方法优化,避免在特殊场景可能报错的问题
+2. picker组件添加immediateChange参数
+3. 新增$u.pages()方法
+## 2.0.21(2022-01-19)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 优化:form组件在用户设置rules的时候提示用户model必传
+2. 优化遗留的通过正则判断rpx单位的问题
+3. 修复微信小程序环境中tabbar组件开启safeAreaInsetBottom属性后,placeholder高度填充不正确
+4. 修复swiper在current指定非0时缩放有误
+5. 修复u-icon添加stop属性的时候报错
+6. 修复upload组件在accept=all的时候没有作用
+7. 修复在text组件mode为phone时call属性无效的问题
+8. 处理u-form clearValidate方法
+9. 其他修复
+## 2.0.20(2022-01-14)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复calendar默认会选择一个日期,如果直接点确定的话,无法取到值的问题
+2. 修复Slider缺少disabled props 还有注释
+3. 修复u-notice-bar点击事件无法拿到index索引值的问题
+4. 修复u-collapse-item在vue文件下,app端自定义插槽不生效的问题
+5. 优化头像为空时显示默认头像 
+6. 修复图片地址赋值后判断加载状态为完成问题
+7. 修复日历滚动到默认日期月份区域
+8. search组件暴露点击左边icon事件
+9. 修复u-form clearValidate方法不生效
+10. upload h5端增加返回文件参数(文件的name参数)
+11. 处理upload选择文件后url为blob类型无法预览的问题
+12. u-code-input 修复输入框没有往左移出一半屏幕
+13. 修复Upload上传 disabled为true时,控制台报hoverClass类型错误
+14. 临时处理ios app下grid点击坍塌问题
+15. 其他修复
+## 2.0.19(2021-12-29)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 优化微信小程序包体积可在微信中预览,请升级HbuilderX3.3.4,同时在“运行->运行到小程序模拟器”中勾选“运行时是否压缩代码”
+2. 优化微信小程序setData性能,处理某些方法如$u.route()无法在模板中使用的问题
+3. navbar添加autoBack参数
+4. 允许avatar组件的事件冒泡
+5. 修复cell组件报错问题
+6. 其他修复
+## 2.0.18(2021-12-28)
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复app端编译报错问题
+2. 重新处理微信小程序端setData过大的性能问题
+3. 修复边框问题
+4. 修复最大最小月份不大于0则没有数据出现的问题
+5. 修复SwipeAction微信小程序端无法上下滑动问题
+6. 修复input的placeholder在小程序端默认显示为true问题
+7. 修复divider组件click事件无效问题
+8. 修复u-code-input maxlength 属性值为 String 类型时显示异常
+9. 修复当 grid只有 1到2时 在小程序端algin设置无效的问题
+10. 处理form-item的label为top时,取消错误提示的左边距
+11. 其他修复
+## 2.0.17(2021-12-26)
+## uView正在参与开源中国的“年度最佳项目”评选,之前投过票的现在也可以投票,恳请同学们投一票,[点此帮助uView](https://www.oschina.net/project/top_cn_2021/?id=583)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 解决HBuilderX3.3.3.20211225版本导致的样式问题
+2. calendar日历添加monthNum参数
+3. navbar添加center slot
+## 2.0.16(2021-12-25)
+## uView正在参与开源中国的“年度最佳项目”评选,之前投过票的现在也可以投票,恳请同学们投一票,[点此帮助uView](https://www.oschina.net/project/top_cn_2021/?id=583)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 解决微信小程序setData性能问题
+2. 修复count-down组件change事件不触发问题
+## 2.0.15(2021-12-21)
+## uView正在参与开源中国的“年度最佳项目”评选,之前投过票的现在也可以投票,恳请同学们投一票,[点此帮助uView](https://www.oschina.net/project/top_cn_2021/?id=583)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复Cell单元格titleWidth无效
+2. 修复cheakbox组件ischecked不更新
+3. 修复keyboard是否显示"."按键默认值问题
+4. 修复number-keyboard是否显示键盘的"."符号问题
+5. 修复Input输入框 readonly无效
+6. 修复u-avatar 导致打包app、H5时候报错问题
+7. 修复Upload上传deletable无效
+8. 修复upload当设置maxSize时无效的问题
+9. 修复tabs lineWidth传入带单位的字符串的时候偏移量计算错误问题
+10. 修复rate组件在有padding的view内,显示的星星位置和可触摸区域不匹配,无法正常选中星星
+## 2.0.13(2021-12-14)
+## [点击加群交流反馈:364463526](https://jq.qq.com/?_chanwv=1027&k=mCxS3TGY)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复配置默认单位为rpx可能会导致自定义导航栏高度异常的问题
+## 2.0.12(2021-12-14)
+## [点击加群交流反馈:364463526](https://jq.qq.com/?_chanwv=1027&k=mCxS3TGY)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复tabs组件在vue环境下划线消失的问题
+2. 修复upload组件在安卓小程序无法选择视频的问题
+3. 添加uni.$u.config.unit配置,用于配置参数默认单位,详见:[默认单位配置](https://www.uviewui.com/components/setting.html#%E9%BB%98%E8%AE%A4%E5%8D%95%E4%BD%8D%E9%85%8D%E7%BD%AE)
+4. 修复textarea组件在没绑定v-model时,字符统计不生效问题
+5. 修复nvue下控制是否出现滚动条失效问题
+## 2.0.11(2021-12-13)
+## [点击加群交流反馈:364463526](https://jq.qq.com/?_chanwv=1027&k=mCxS3TGY)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. text组件align参数无效的问题
+2. subsection组件添加keyName参数
+3. upload组件无法判断[Object file]类型的问题
+4. 处理notify层级过低问题
+5. codeInput组件添加disabledDot参数
+6. 处理actionSheet组件round参数无效的问题
+7. calendar组件添加round参数用于控制圆角值
+8. 处理swipeAction组件在vue环境下默认被打开的问题
+9. button组件的throttleTime节流参数无效的问题
+10. 解决u-notify手动关闭方法close()无效的问题
+11. input组件readonly不生效问题
+12. tag组件type参数为info不生效问题
+## 2.0.10(2021-12-08)
+## [点击加群交流反馈:364463526](https://jq.qq.com/?_chanwv=1027&k=mCxS3TGY)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复button sendMessagePath属性不生效
+2. 修复DatetimePicker选择器title无效
+3. 修复u-toast设置loading=true不生效
+4. 修复u-text金额模式传0报错
+5. 修复u-toast组件的icon属性配置不生效
+6. button的icon在特殊场景下的颜色优化
+7. IndexList优化,增加#
+## 2.0.9(2021-12-01)
+## [点击加群交流反馈:232041042](https://jq.qq.com/?_wv=1027&k=KnbeceDU)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 优化swiper的height支持100%值(仅vue有效),修复嵌入视频时click事件无法触发的问题
+2. 优化tabs组件对list值为空的判断,或者动态变化list时重新计算相关尺寸的问题
+3. 优化datetime-picker组件逻辑,让其后续打开的默认值为上一次的选中值,需要通过v-model绑定值才有效
+4. 修复upload内嵌在其他组件中,选择图片可能不会换行的问题
+## 2.0.8(2021-12-01)
+## [点击加群交流反馈:232041042](https://jq.qq.com/?_wv=1027&k=KnbeceDU)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复toast的position参数无效问题
+2. 处理input在ios nvue上无法获得焦点的问题
+3. avatar-group组件添加extraValue参数,让剩余展示数量可手动控制
+4. tabs组件添加keyName参数用于配置从对象中读取的键名
+5. 处理text组件名字脱敏默认配置无效的问题
+6. 处理picker组件item文本太长换行问题
+## 2.0.7(2021-11-30)
+## [点击加群交流反馈:232041042](https://jq.qq.com/?_wv=1027&k=KnbeceDU)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 修复radio和checkbox动态改变v-model无效的问题。
+2. 优化form规则validator在微信小程序用法
+3. 修复backtop组件mode参数在微信小程序无效的问题
+4. 处理Album的previewFullImage属性无效的问题
+5. 处理u-datetime-picker组件mode='time'在选择改变时间时,控制台报错的问题
+## 2.0.6(2021-11-27)
+## [点击加群交流反馈:232041042](https://jq.qq.com/?_wv=1027&k=KnbeceDU)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. 处理tag组件在vue下边框无效的问题。
+2. 处理popup组件圆角参数可能无效的问题。
+3. 处理tabs组件lineColor参数可能无效的问题。
+4. propgress组件在值很小时,显示异常的问题。
+## 2.0.5(2021-11-25)
+## [点击加群交流反馈:232041042](https://jq.qq.com/?_wv=1027&k=KnbeceDU)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. calendar在vue下显示异常问题。 
+2. form组件labelPosition和errorType参数无效的问题
+3. input组件inputAlign无效的问题
+4. 其他一些修复
+## 2.0.4(2021-11-23)
+## [点击加群交流反馈:232041042](https://jq.qq.com/?_wv=1027&k=KnbeceDU)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+0. input组件缺失@confirm事件,以及subfix和prefix无效问题
+1. component.scss文件样式在vue下干扰全局布局问题
+2. 修复subsection在vue环境下表现异常的问题
+3. tag组件的bgColor等参数无效的问题
+4. upload组件不换行的问题
+5. 其他的一些修复处理
+## 2.0.3(2021-11-16)
+## [点击加群交流反馈:1129077272](https://jq.qq.com/?_wv=1027&k=KnbeceDU)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. uView2.0已实现全面兼容nvue
+2. uView2.0对1.x进行了架构重构,细节和性能都有极大提升
+3. 目前uView2.0为公测阶段,相关细节可能会有变动
+4. 我们写了一份与1.x的对比指南,详见[对比1.x](https://www.uviewui.com/components/diff1.x.html)
+5. 处理modal的confirm回调事件拼写错误问题
+6. 处理input组件@input事件参数错误问题
+7. 其他一些修复
+## 2.0.2(2021-11-16)
+## [点击加群交流反馈:1129077272](https://jq.qq.com/?_wv=1027&k=KnbeceDU)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. uView2.0已实现全面兼容nvue
+2. uView2.0对1.x进行了架构重构,细节和性能都有极大提升
+3. 目前uView2.0为公测阶段,相关细节可能会有变动
+4. 我们写了一份与1.x的对比指南,详见[对比1.x](https://www.uviewui.com/components/diff1.x.html)
+5. 修复input组件formatter参数缺失问题
+6. 优化loading-icon组件的scss写法问题,防止不兼容新版本scss
+## 2.0.0(2020-11-15)
+## [点击加群交流反馈:1129077272](https://jq.qq.com/?_wv=1027&k=KnbeceDU)
+
+# uView2.0重磅发布,利剑出鞘,一统江湖
+
+1. uView2.0已实现全面兼容nvue
+2. uView2.0对1.x进行了架构重构,细节和性能都有极大提升
+3. 目前uView2.0为公测阶段,相关细节可能会有变动
+4. 我们写了一份与1.x的对比指南,详见[对比1.x](https://www.uviewui.com/components/diff1.x.html)
+5. 修复input组件formatter参数缺失问题
+
+

+ 78 - 0
uview-ui/components/u--form/u--form.vue

@@ -0,0 +1,78 @@
+<template>
+	<uvForm
+		ref="uForm"
+		:model="model"
+		:rules="rules"
+		:errorType="errorType"
+		:borderBottom="borderBottom"
+		:labelPosition="labelPosition"
+		:labelWidth="labelWidth"
+		:labelAlign="labelAlign"
+		:labelStyle="labelStyle"
+		:customStyle="customStyle"
+	>
+		<slot />
+	</uvForm>
+</template>
+
+<script>
+	/**
+	 * 此组件存在的理由是,在nvue下,u-form被uni-app官方占用了,u-form在nvue中相当于form组件
+	 * 所以在nvue下,取名为u--form,内部其实还是u-form.vue,只不过做一层中转
+	 */
+	import uvForm from '../u-form/u-form.vue';
+	import props from '../u-form/props.js'
+	export default {
+		// #ifdef MP-WEIXIN
+		name: 'u-form',
+		// #endif
+		// #ifndef MP-WEIXIN
+		name: 'u--form',
+		// #endif
+		mixins: [uni.$u.mpMixin, props, uni.$u.mixin],
+		components: {
+			uvForm
+		},
+		created() {
+			this.children = []
+		},
+		methods: {
+			// 手动设置校验的规则,如果规则中有函数的话,微信小程序中会过滤掉,所以只能手动调用设置规则
+			setRules(rules) {
+				this.$refs.uForm.setRules(rules)
+			},
+			validate() {
+				/**
+				 * 在微信小程序中,通过this.$parent拿到的父组件是u--form,而不是其内嵌的u-form
+				 * 导致在u-form组件中,拿不到对应的children数组,从而校验无效,所以这里每次调用u-form组件中的
+				 * 对应方法的时候,在小程序中都先将u--form的children赋值给u-form中的children
+				 */
+				// #ifdef MP-WEIXIN
+				this.setMpData()
+				// #endif
+				return this.$refs.uForm.validate()
+			},
+			validateField(value, callback, event) {
+				// #ifdef MP-WEIXIN
+				this.setMpData()
+				// #endif
+				return this.$refs.uForm.validateField(value, callback, event)
+			},
+			resetFields() {
+				// #ifdef MP-WEIXIN
+				this.setMpData()
+				// #endif
+				return this.$refs.uForm.resetFields()
+			},
+			clearValidate(props) {
+				// #ifdef MP-WEIXIN
+				this.setMpData()
+				// #endif
+				return this.$refs.uForm.clearValidate(props)
+			},
+			setMpData() {
+				this.$refs.uForm.children = this.children
+			}
+		},
+	}
+</script>

+ 47 - 0
uview-ui/components/u--image/u--image.vue

@@ -0,0 +1,47 @@
+<template>
+	<uvImage 
+		:src="src"
+		:mode="mode"
+		:width="width"
+		:height="height"
+		:shape="shape"
+		:radius="radius"
+		:lazyLoad="lazyLoad"
+		:showMenuByLongpress="showMenuByLongpress"
+		:loadingIcon="loadingIcon"
+		:errorIcon="errorIcon"
+		:showLoading="showLoading"
+		:showError="showError"
+		:fade="fade"
+		:webp="webp"
+		:duration="duration"
+		:bgColor="bgColor"
+		:customStyle="customStyle"
+		@click="$emit('click')"
+		@error="$emit('error')"
+		@load="$emit('load')"
+	>
+		<template v-slot:loading>
+			<slot name="loading"></slot>
+		</template>
+		<template v-slot:error>
+			<slot name="error"></slot>
+		</template>
+	</uvImage>
+</template>
+
+<script>
+	/**
+	 * 此组件存在的理由是,在nvue下,u-image被uni-app官方占用了,u-image在nvue中相当于image组件
+	 * 所以在nvue下,取名为u--image,内部其实还是u-iamge.vue,只不过做一层中转
+	 */
+	import uvImage from '../u-image/u-image.vue';
+	import props from '../u-image/props.js';
+	export default {
+		name: 'u--image',
+		mixins: [uni.$u.mpMixin, props, uni.$u.mixin],
+		components: {
+			uvImage
+		},
+	}
+</script>

+ 73 - 0
uview-ui/components/u--input/u--input.vue

@@ -0,0 +1,73 @@
+<template>
+	<uvInput 
+		:value="value"
+		:type="type"
+		:fixed="fixed"
+		:disabled="disabled"
+		:disabledColor="disabledColor"
+		:clearable="clearable"
+		:password="password"
+		:maxlength="maxlength"
+		:placeholder="placeholder"
+		:placeholderClass="placeholderClass"
+		:placeholderStyle="placeholderStyle"
+		:showWordLimit="showWordLimit"
+		:confirmType="confirmType"
+		:confirmHold="confirmHold"
+		:holdKeyboard="holdKeyboard"
+		:focus="focus"
+		:autoBlur="autoBlur"
+		:disableDefaultPadding="disableDefaultPadding"
+		:cursor="cursor"
+		:cursorSpacing="cursorSpacing"
+		:selectionStart="selectionStart"
+		:selectionEnd="selectionEnd"
+		:adjustPosition="adjustPosition"
+		:inputAlign="inputAlign"
+		:fontSize="fontSize"
+		:color="color"
+		:prefixIcon="prefixIcon"
+		:suffixIcon="suffixIcon"
+		:suffixIconStyle="suffixIconStyle"
+		:prefixIconStyle="prefixIconStyle"
+		:border="border"
+		:readonly="readonly"
+		:shape="shape"
+		:customStyle="customStyle"
+		:formatter="formatter"
+		:ignoreCompositionEvent="ignoreCompositionEvent"
+		@focus="$emit('focus')"
+		@blur="e => $emit('blur', e)"
+		@keyboardheightchange="$emit('keyboardheightchange')"
+		@change="e => $emit('change', e)"
+		@input="e => $emit('input', e)"
+		@confirm="e => $emit('confirm', e)"
+		@clear="$emit('clear')"
+		@click="$emit('click')"
+	>
+		<!-- #ifdef MP -->
+		<slot name="prefix"></slot>
+		<slot name="suffix"></slot>
+		<!-- #endif -->
+		<!-- #ifndef MP -->
+		<slot name="prefix" slot="prefix"></slot>
+		<slot name="suffix" slot="suffix"></slot>
+		<!-- #endif -->
+	</uvInput>
+</template>
+
+<script>
+	/**
+	 * 此组件存在的理由是,在nvue下,u-input被uni-app官方占用了,u-input在nvue中相当于input组件
+	 * 所以在nvue下,取名为u--input,内部其实还是u-input.vue,只不过做一层中转
+	 */
+	import uvInput from '../u-input/u-input.vue';
+	import props from '../u-input/props.js'
+	export default {
+		name: 'u--input',
+		mixins: [uni.$u.mpMixin, props, uni.$u.mixin],
+		components: {
+			uvInput
+		},
+	}
+</script>

+ 44 - 0
uview-ui/components/u--text/u--text.vue

@@ -0,0 +1,44 @@
+<template>
+    <uvText
+        :type="type"
+        :show="show"
+        :text="text"
+        :prefixIcon="prefixIcon"
+        :suffixIcon="suffixIcon"
+        :mode="mode"
+        :href="href"
+        :format="format"
+        :call="call"
+        :openType="openType"
+        :bold="bold"
+        :block="block"
+        :lines="lines"
+        :color="color"
+		:decoration="decoration"
+        :size="size"
+        :iconStyle="iconStyle"
+        :margin="margin"
+        :lineHeight="lineHeight"
+        :align="align"
+        :wordWrap="wordWrap"
+        :customStyle="customStyle"
+        @click="$emit('click')"
+    ></uvText>
+</template>
+
+<script>
+/**
+ * 此组件存在的理由是,在nvue下,u-text被uni-app官方占用了,u-text在nvue中相当于input组件
+ * 所以在nvue下,取名为u--input,内部其实还是u-text.vue,只不过做一层中转
+ * 不使用v-bind="$attrs",而是分开独立写传参,是因为微信小程序不支持此写法
+ */
+import uvText from "../u-text/u-text.vue";
+import props from "../u-text/props.js";
+export default {
+    name: "u--text",
+    mixins: [uni.$u.mpMixin, props, uni.$u.mixin],
+    components: {
+        uvText,
+    },
+};
+</script>

+ 48 - 0
uview-ui/components/u--textarea/u--textarea.vue

@@ -0,0 +1,48 @@
+<template>
+	<uvTextarea
+		:value="value"
+		:placeholder="placeholder"
+		:height="height"
+		:confirmType="confirmType"
+		:disabled="disabled"
+		:count="count"
+		:focus="focus"
+		:autoHeight="autoHeight"
+		:fixed="fixed"
+		:cursorSpacing="cursorSpacing"
+		:cursor="cursor"
+		:showConfirmBar="showConfirmBar"
+		:selectionStart="selectionStart"
+		:selectionEnd="selectionEnd"
+		:adjustPosition="adjustPosition"
+		:disableDefaultPadding="disableDefaultPadding"
+		:holdKeyboard="holdKeyboard"
+		:maxlength="maxlength"
+		:border="border"
+		:customStyle="customStyle"
+		:formatter="formatter"
+		:ignoreCompositionEvent="ignoreCompositionEvent"
+		@focus="e => $emit('focus')"
+		@blur="e => $emit('blur')"
+		@linechange="e => $emit('linechange', e)"
+		@confirm="e => $emit('confirm')"
+		@input="e => $emit('input', e)"
+		@keyboardheightchange="e => $emit('keyboardheightchange')"
+	></uvTextarea>
+</template>
+
+<script>
+	/**
+	 * 此组件存在的理由是,在nvue下,u--textarea被uni-app官方占用了,u-textarea在nvue中相当于textarea组件
+	 * 所以在nvue下,取名为u--textarea,内部其实还是u-textarea.vue,只不过做一层中转
+	 */
+	import uvTextarea from '../u-textarea/u-textarea.vue';
+	import props from '../u-textarea/props.js'
+	export default {
+		name: 'u--textarea',
+		mixins: [uni.$u.mpMixin, props, uni.$u.mixin],
+		components: {
+			uvTextarea
+		},
+	}
+</script>

+ 54 - 0
uview-ui/components/u-action-sheet/props.js

@@ -0,0 +1,54 @@
+export default {
+    props: {
+        // 操作菜单是否展示 (默认false)
+        show: {
+            type: Boolean,
+            default: uni.$u.props.actionSheet.show
+        },
+        // 标题
+        title: {
+            type: String,
+            default: uni.$u.props.actionSheet.title
+        },
+        // 选项上方的描述信息
+        description: {
+            type: String,
+            default: uni.$u.props.actionSheet.description
+        },
+        // 数据
+        actions: {
+            type: Array,
+            default: uni.$u.props.actionSheet.actions
+        },
+        // 取消按钮的文字,不为空时显示按钮
+        cancelText: {
+            type: String,
+            default: uni.$u.props.actionSheet.cancelText
+        },
+        // 点击某个菜单项时是否关闭弹窗
+        closeOnClickAction: {
+            type: Boolean,
+            default: uni.$u.props.actionSheet.closeOnClickAction
+        },
+        // 处理底部安全区(默认true)
+        safeAreaInsetBottom: {
+            type: Boolean,
+            default: uni.$u.props.actionSheet.safeAreaInsetBottom
+        },
+        // 小程序的打开方式
+        openType: {
+            type: String,
+            default: uni.$u.props.actionSheet.openType
+        },
+        // 点击遮罩是否允许关闭 (默认true)
+        closeOnClickOverlay: {
+            type: Boolean,
+            default: uni.$u.props.actionSheet.closeOnClickOverlay
+        },
+        // 圆角值
+        round: {
+            type: [Boolean, String, Number],
+            default: uni.$u.props.actionSheet.round
+        }
+    }
+}

+ 278 - 0
uview-ui/components/u-action-sheet/u-action-sheet.vue

@@ -0,0 +1,278 @@
+
+<template>
+	<u-popup
+	    :show="show"
+	    mode="bottom"
+	    @close="closeHandler"
+	    :safeAreaInsetBottom="safeAreaInsetBottom"
+	    :round="round"
+	>
+		<view class="u-action-sheet">
+			<view
+			    class="u-action-sheet__header"
+			    v-if="title"
+			>
+				<text class="u-action-sheet__header__title u-line-1">{{title}}</text>
+				<view
+				    class="u-action-sheet__header__icon-wrap"
+				    @tap.stop="cancel"
+				>
+					<u-icon
+					    name="close"
+					    size="17"
+					    color="#c8c9cc"
+					    bold
+					></u-icon>
+				</view>
+			</view>
+			<text
+			    class="u-action-sheet__description"
+				:style="[{
+					marginTop: `${title && description ? 0 : '18px'}`
+				}]"
+			    v-if="description"
+			>{{description}}</text>
+			<slot>
+				<u-line v-if="description"></u-line>
+				<view class="u-action-sheet__item-wrap">
+					<template v-for="(item, index) in actions">
+						<!-- #ifdef MP -->
+						<button
+						    :key="index"
+						    class="u-reset-button"
+						    :openType="item.openType"
+						    @getuserinfo="onGetUserInfo"
+						    @contact="onContact"
+						    @getphonenumber="onGetPhoneNumber"
+						    @error="onError"
+						    @launchapp="onLaunchApp"
+						    @opensetting="onOpenSetting"
+						    :lang="lang"
+						    :session-from="sessionFrom"
+						    :send-message-title="sendMessageTitle"
+						    :send-message-path="sendMessagePath"
+						    :send-message-img="sendMessageImg"
+						    :show-message-card="showMessageCard"
+						    :app-parameter="appParameter"
+						    @tap="selectHandler(index)"
+						    :hover-class="!item.disabled && !item.loading ? 'u-action-sheet--hover' : ''"
+						>
+							<!-- #endif -->
+							<view
+							    class="u-action-sheet__item-wrap__item"
+							    @tap.stop="selectHandler(index)"
+							    :hover-class="!item.disabled && !item.loading ? 'u-action-sheet--hover' : ''"
+							    :hover-stay-time="150"
+							>
+								<template v-if="!item.loading">
+									<text
+									    class="u-action-sheet__item-wrap__item__name"
+									    :style="[itemStyle(index)]"
+									>{{ item.name }}</text>
+									<text
+									    v-if="item.subname"
+									    class="u-action-sheet__item-wrap__item__subname"
+									>{{ item.subname }}</text>
+								</template>
+								<u-loading-icon
+								    v-else
+								    custom-class="van-action-sheet__loading"
+								    size="18"
+								    mode="circle"
+								/>
+							</view>
+							<!-- #ifdef MP -->
+						</button>
+						<!-- #endif -->
+						<u-line v-if="index !== actions.length - 1"></u-line>
+					</template>
+				</view>
+			</slot>
+			<u-gap
+			    bgColor="#eaeaec"
+			    height="6"
+			    v-if="cancelText"
+			></u-gap>
+			<view hover-class="u-action-sheet--hover">
+				<text
+				    @touchmove.stop.prevent
+				    :hover-stay-time="150"
+				    v-if="cancelText"
+				    class="u-action-sheet__cancel-text"
+				    @tap="cancel"
+				>{{cancelText}}</text>
+			</view>
+		</view>
+	</u-popup>
+</template>
+
+<script>
+	import openType from '../../libs/mixin/openType'
+	import button from '../../libs/mixin/button'
+	import props from './props.js';
+	/**
+	 * ActionSheet 操作菜单
+	 * @description 本组件用于从底部弹出一个操作菜单,供用户选择并返回结果。本组件功能类似于uni的uni.showActionSheetAPI,配置更加灵活,所有平台都表现一致。
+	 * @tutorial https://www.uviewui.com/components/actionSheet.html
+	 * 
+	 * @property {Boolean}			show				操作菜单是否展示 (默认 false )
+	 * @property {String}			title				操作菜单标题
+	 * @property {String}			description			选项上方的描述信息
+	 * @property {Array<Object>}	actions				按钮的文字数组,见官方文档示例
+	 * @property {String}			cancelText			取消按钮的提示文字,不为空时显示按钮
+	 * @property {Boolean}			closeOnClickAction	点击某个菜单项时是否关闭弹窗 (默认 true )
+	 * @property {Boolean}			safeAreaInsetBottom	处理底部安全区 (默认 true )
+	 * @property {String}			openType			小程序的打开方式 (contact | launchApp | getUserInfo | openSetting |getPhoneNumber |error )
+	 * @property {Boolean}			closeOnClickOverlay	点击遮罩是否允许关闭  (默认 true )
+	 * @property {Number|String}	round				圆角值,默认无圆角  (默认 0 )
+	 * @property {String}			lang				指定返回用户信息的语言,zh_CN 简体中文,zh_TW 繁体中文,en 英文
+	 * @property {String}			sessionFrom			会话来源,openType="contact"时有效
+	 * @property {String}			sendMessageTitle	会话内消息卡片标题,openType="contact"时有效
+	 * @property {String}			sendMessagePath		会话内消息卡片点击跳转小程序路径,openType="contact"时有效
+	 * @property {String}			sendMessageImg		会话内消息卡片图片,openType="contact"时有效
+	 * @property {Boolean}			showMessageCard		是否显示会话内消息卡片,设置此参数为 true,用户进入客服会话会在右下角显示"可能要发送的小程序"提示,用户点击后可以快速发送小程序消息,openType="contact"时有效 (默认 false )
+	 * @property {String}			appParameter		打开 APP 时,向 APP 传递的参数,openType=launchApp 时有效
+	 * 
+	 * @event {Function} select			点击ActionSheet列表项时触发 
+	 * @event {Function} close			点击取消按钮时触发
+	 * @event {Function} getuserinfo	用户点击该按钮时,会返回获取到的用户信息,回调的 detail 数据与 wx.getUserInfo 返回的一致,openType="getUserInfo"时有效
+	 * @event {Function} contact		客服消息回调,openType="contact"时有效
+	 * @event {Function} getphonenumber	获取用户手机号回调,openType="getPhoneNumber"时有效
+	 * @event {Function} error			当使用开放能力时,发生错误的回调,openType="error"时有效
+	 * @event {Function} launchapp		打开 APP 成功的回调,openType="launchApp"时有效
+	 * @event {Function} opensetting	在打开授权设置页后回调,openType="openSetting"时有效
+	 * @example <u-action-sheet :actions="list" :title="title" :show="show"></u-action-sheet>
+	 */
+	export default {
+		name: "u-action-sheet",
+		// 一些props参数和methods方法,通过mixin混入,因为其他文件也会用到
+		mixins: [openType, button, uni.$u.mixin, props],
+		data() {
+			return {
+
+			}
+		},
+		computed: {
+			// 操作项目的样式
+			itemStyle() {
+				return (index) => {
+					let style = {};
+					if (this.actions[index].color) style.color = this.actions[index].color
+					if (this.actions[index].fontSize) style.fontSize = uni.$u.addUnit(this.actions[index].fontSize)
+					// 选项被禁用的样式
+					if (this.actions[index].disabled) style.color = '#c0c4cc'
+					return style;
+				}
+			},
+		},
+		methods: {
+			closeHandler() {
+				// 允许点击遮罩关闭时,才发出close事件
+				if(this.closeOnClickOverlay) {
+					this.$emit('close')
+				}
+			},
+			// 点击取消按钮
+			cancel() {
+				this.$emit('close')
+			},
+			selectHandler(index) {
+				const item = this.actions[index]
+				if (item && !item.disabled && !item.loading) {
+					this.$emit('select', item)
+					if (this.closeOnClickAction) {
+						this.$emit('close')
+					}
+				}
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+	$u-action-sheet-reset-button-width:100% !default;
+	$u-action-sheet-title-font-size: 16px !default;
+	$u-action-sheet-title-padding: 12px 30px !default;
+	$u-action-sheet-title-color: $u-main-color !default;
+	$u-action-sheet-header-icon-wrap-right:15px !default;
+	$u-action-sheet-header-icon-wrap-top:15px !default;
+	$u-action-sheet-description-font-size:13px !default;
+	$u-action-sheet-description-color:14px !default;
+	$u-action-sheet-description-margin: 18px 15px !default;
+	$u-action-sheet-item-wrap-item-padding:15px !default;
+	$u-action-sheet-item-wrap-name-font-size:16px !default;
+	$u-action-sheet-item-wrap-subname-font-size:13px !default;
+	$u-action-sheet-item-wrap-subname-color: #c0c4cc !default;
+	$u-action-sheet-item-wrap-subname-margin-top:10px !default;
+	$u-action-sheet-cancel-text-font-size:16px !default;
+	$u-action-sheet-cancel-text-color:$u-content-color !default;
+	$u-action-sheet-cancel-text-font-size:15px !default;
+	$u-action-sheet-cancel-text-hover-background-color:rgb(242, 243, 245) !default;
+
+	.u-reset-button {
+		width: $u-action-sheet-reset-button-width;
+	}
+
+	.u-action-sheet {
+		text-align: center;
+		&__header {
+			position: relative;
+			padding: $u-action-sheet-title-padding;
+			&__title {
+				font-size: $u-action-sheet-title-font-size;
+				color: $u-action-sheet-title-color;
+				font-weight: bold;
+				text-align: center;
+			}
+
+			&__icon-wrap {
+				position: absolute;
+				right: $u-action-sheet-header-icon-wrap-right;
+				top: $u-action-sheet-header-icon-wrap-top;
+			}
+		}
+
+		&__description {
+			font-size: $u-action-sheet-description-font-size;
+			color: $u-tips-color;
+			margin: $u-action-sheet-description-margin;
+			text-align: center;
+		}
+
+		&__item-wrap {
+
+			&__item {
+				padding: $u-action-sheet-item-wrap-item-padding;
+				@include flex;
+				align-items: center;
+				justify-content: center;
+				flex-direction: column;
+
+				&__name {
+					font-size: $u-action-sheet-item-wrap-name-font-size;
+					color: $u-main-color;
+					text-align: center;
+				}
+
+				&__subname {
+					font-size: $u-action-sheet-item-wrap-subname-font-size;
+					color: $u-action-sheet-item-wrap-subname-color;
+					margin-top: $u-action-sheet-item-wrap-subname-margin-top;
+					text-align: center;
+				}
+			}
+		}
+
+		&__cancel-text {
+			font-size: $u-action-sheet-cancel-text-font-size;
+			color: $u-action-sheet-cancel-text-color;
+			text-align: center;
+			padding: $u-action-sheet-cancel-text-font-size;
+		}
+
+		&--hover {
+			background-color: $u-action-sheet-cancel-text-hover-background-color;
+		}
+	}
+</style>

+ 59 - 0
uview-ui/components/u-album/props.js

@@ -0,0 +1,59 @@
+export default {
+    props: {
+        // 图片地址,Array<String>|Array<Object>形式
+        urls: {
+            type: Array,
+            default: uni.$u.props.album.urls
+        },
+        // 指定从数组的对象元素中读取哪个属性作为图片地址
+        keyName: {
+            type: String,
+            default: uni.$u.props.album.keyName
+        },
+        // 单图时,图片长边的长度
+        singleSize: {
+            type: [String, Number],
+            default: uni.$u.props.album.singleSize
+        },
+        // 多图时,图片边长
+        multipleSize: {
+            type: [String, Number],
+            default: uni.$u.props.album.multipleSize
+        },
+        // 多图时,图片水平和垂直之间的间隔
+        space: {
+            type: [String, Number],
+            default: uni.$u.props.album.space
+        },
+        // 单图时,图片缩放裁剪的模式
+        singleMode: {
+            type: String,
+            default: uni.$u.props.album.singleMode
+        },
+        // 多图时,图片缩放裁剪的模式
+        multipleMode: {
+            type: String,
+            default: uni.$u.props.album.multipleMode
+        },
+        // 最多展示的图片数量,超出时最后一个位置将会显示剩余图片数量
+        maxCount: {
+            type: [String, Number],
+            default: uni.$u.props.album.maxCount
+        },
+        // 是否可以预览图片
+        previewFullImage: {
+            type: Boolean,
+            default: uni.$u.props.album.previewFullImage
+        },
+        // 每行展示图片数量,如设置,singleSize和multipleSize将会无效
+        rowCount: {
+            type: [String, Number],
+            default: uni.$u.props.album.rowCount
+        },
+        // 超出maxCount时是否显示查看更多的提示
+        showMore: {
+            type: Boolean,
+            default: uni.$u.props.album.showMore
+        }
+    }
+}

+ 259 - 0
uview-ui/components/u-album/u-album.vue

@@ -0,0 +1,259 @@
+<template>
+    <view class="u-album">
+        <view
+            class="u-album__row"
+            ref="u-album__row"
+            v-for="(arr, index) in showUrls"
+            :forComputedUse="albumWidth"
+            :key="index"
+        >
+            <view
+                class="u-album__row__wrapper"
+                v-for="(item, index1) in arr"
+                :key="index1"
+                :style="[imageStyle(index + 1, index1 + 1)]"
+                @tap="previewFullImage ? onPreviewTap(getSrc(item)) : ''"
+            >
+                <image
+                    :src="getSrc(item)"
+                    :mode="
+                        urls.length === 1
+                            ? imageHeight > 0
+                                ? singleMode
+                                : 'widthFix'
+                            : multipleMode
+                    "
+                    :style="[
+                        {
+                            width: imageWidth,
+                            height: imageHeight
+                        }
+                    ]"
+                ></image>
+                <view
+                    v-if="
+                        showMore &&
+                        urls.length > rowCount * showUrls.length &&
+                        index === showUrls.length - 1 &&
+                        index1 === showUrls[showUrls.length - 1].length - 1
+                    "
+                    class="u-album__row__wrapper__text"
+                >
+                    <u--text
+                        :text="`+${urls.length - maxCount}`"
+                        color="#fff"
+                        :size="multipleSize * 0.3"
+                        align="center"
+                        customStyle="justify-content: center"
+                    ></u--text>
+                </view>
+            </view>
+        </view>
+    </view>
+</template>
+
+<script>
+import props from './props.js'
+// #ifdef APP-NVUE
+// 由于weex为阿里的KPI业绩考核的产物,所以不支持百分比单位,这里需要通过dom查询组件的宽度
+const dom = uni.requireNativePlugin('dom')
+// #endif
+
+/**
+ * Album 相册
+ * @description 本组件提供一个类似相册的功能,让开发者开发起来更加得心应手。减少重复的模板代码
+ * @tutorial https://www.uviewui.com/components/album.html
+ *
+ * @property {Array}           urls             图片地址列表 Array<String>|Array<Object>形式
+ * @property {String}          keyName          指定从数组的对象元素中读取哪个属性作为图片地址
+ * @property {String | Number} singleSize       单图时,图片长边的长度  (默认 180 )
+ * @property {String | Number} multipleSize     多图时,图片边长 (默认 70 )
+ * @property {String | Number} space            多图时,图片水平和垂直之间的间隔 (默认 6 )
+ * @property {String}          singleMode       单图时,图片缩放裁剪的模式 (默认 'scaleToFill' )
+ * @property {String}          multipleMode     多图时,图片缩放裁剪的模式 (默认 'aspectFill' )
+ * @property {String | Number} maxCount         取消按钮的提示文字 (默认 9 )
+ * @property {Boolean}         previewFullImage 是否可以预览图片 (默认 true )
+ * @property {String | Number} rowCount         每行展示图片数量,如设置,singleSize和multipleSize将会无效	(默认 3 )
+ * @property {Boolean}         showMore         超出maxCount时是否显示查看更多的提示 (默认 true )
+ *
+ * @event    {Function}        albumWidth       某些特殊的情况下,需要让文字与相册的宽度相等,这里事件的形式对外发送  (回调参数 width )
+ * @example <u-album :urls="urls2" @albumWidth="width => albumWidth = width" multipleSize="68" ></u-album>
+ */
+export default {
+    name: 'u-album',
+    mixins: [uni.$u.mpMixin, uni.$u.mixin, props],
+    data() {
+        return {
+            // 单图的宽度
+            singleWidth: 0,
+            // 单图的高度
+            singleHeight: 0,
+            // 单图时,如果无法获取图片的尺寸信息,让图片宽度默认为容器的一定百分比
+            singlePercent: 0.6
+        }
+    },
+    watch: {
+        urls: {
+            immediate: true,
+            handler(newVal) {
+                if (newVal.length === 1) {
+                    this.getImageRect()
+                }
+            }
+        }
+    },
+    computed: {
+        imageStyle() {
+            return (index1, index2) => {
+                const { space, rowCount, multipleSize, urls } = this,
+                    { addUnit, addStyle } = uni.$u,
+                    rowLen = this.showUrls.length,
+                    allLen = this.urls.length
+                const style = {
+                    marginRight: addUnit(space),
+                    marginBottom: addUnit(space)
+                }
+                // 如果为最后一行,则每个图片都无需下边框
+                if (index1 === rowLen) style.marginBottom = 0
+                // 每行的最右边一张和总长度的最后一张无需右边框
+                if (
+                    index2 === rowCount ||
+                    (index1 === rowLen &&
+                        index2 === this.showUrls[index1 - 1].length)
+                )
+                    style.marginRight = 0
+                return style
+            }
+        },
+        // 将数组划分为二维数组
+        showUrls() {
+            const arr = []
+            this.urls.map((item, index) => {
+                // 限制最大展示数量
+                if (index + 1 <= this.maxCount) {
+                    // 计算该元素为第几个素组内
+                    const itemIndex = Math.floor(index / this.rowCount)
+                    // 判断对应的索引是否存在
+                    if (!arr[itemIndex]) {
+                        arr[itemIndex] = []
+                    }
+                    arr[itemIndex].push(item)
+                }
+            })
+            return arr
+        },
+        imageWidth() {
+            return uni.$u.addUnit(
+                this.urls.length === 1 ? this.singleWidth : this.multipleSize
+            )
+        },
+        imageHeight() {
+            return uni.$u.addUnit(
+                this.urls.length === 1 ? this.singleHeight : this.multipleSize
+            )
+        },
+        // 此变量无实际用途,仅仅是为了利用computed特性,让其在urls长度等变化时,重新计算图片的宽度
+        // 因为用户在某些特殊的情况下,需要让文字与相册的宽度相等,所以这里事件的形式对外发送
+        albumWidth() {
+            let width = 0
+            if (this.urls.length === 1) {
+                width = this.singleWidth
+            } else {
+                width =
+                    this.showUrls[0].length * this.multipleSize +
+                    this.space * (this.showUrls[0].length - 1)
+            }
+            this.$emit('albumWidth', width)
+            return width
+        }
+    },
+    methods: {
+        // 预览图片
+        onPreviewTap(url) {
+            const urls = this.urls.map((item) => {
+                return this.getSrc(item)
+            })
+            uni.previewImage({
+                current: url,
+                urls
+            })
+        },
+        // 获取图片的路径
+        getSrc(item) {
+            return uni.$u.test.object(item)
+                ? (this.keyName && item[this.keyName]) || item.src
+                : item
+        },
+        // 单图时,获取图片的尺寸
+        // 在小程序中,需要将网络图片的的域名添加到小程序的download域名才可能获取尺寸
+        // 在没有添加的情况下,让单图宽度默认为盒子的一定宽度(singlePercent)
+        getImageRect() {
+            const src = this.getSrc(this.urls[0])
+            uni.getImageInfo({
+                src,
+                success: (res) => {
+                    // 判断图片横向还是竖向展示方式
+                    const isHorizotal = res.width >= res.height
+                    this.singleWidth = isHorizotal
+                        ? this.singleSize
+                        : (res.width / res.height) * this.singleSize
+                    this.singleHeight = !isHorizotal
+                        ? this.singleSize
+                        : (res.height / res.width) * this.singleWidth
+                },
+                fail: () => {
+                    this.getComponentWidth()
+                }
+            })
+        },
+        // 获取组件的宽度
+        async getComponentWidth() {
+            // 延时一定时间,以获取dom尺寸
+            await uni.$u.sleep(30)
+            // #ifndef APP-NVUE
+            this.$uGetRect('.u-album__row').then((size) => {
+                this.singleWidth = size.width * this.singlePercent
+            })
+            // #endif
+
+            // #ifdef APP-NVUE
+            // 这里ref="u-album__row"所在的标签为通过for循环出来,导致this.$refs['u-album__row']是一个数组
+            const ref = this.$refs['u-album__row'][0]
+            ref &&
+                dom.getComponentRect(ref, (res) => {
+                    this.singleWidth = res.size.width * this.singlePercent
+                })
+            // #endif
+        }
+    }
+}
+</script>
+
+<style lang="scss" scoped>
+@import '../../libs/css/components.scss';
+
+.u-album {
+    @include flex(column);
+
+    &__row {
+        @include flex(row);
+        flex-wrap: wrap;
+
+        &__wrapper {
+            position: relative;
+
+            &__text {
+                position: absolute;
+                top: 0;
+                left: 0;
+                right: 0;
+                bottom: 0;
+                background-color: rgba(0, 0, 0, 0.3);
+                @include flex(row);
+                justify-content: center;
+                align-items: center;
+            }
+        }
+    }
+}
+</style>

+ 44 - 0
uview-ui/components/u-alert/props.js

@@ -0,0 +1,44 @@
+export default {
+    props: {
+        // 显示文字
+        title: {
+            type: String,
+            default: uni.$u.props.alert.title
+        },
+        // 主题,success/warning/info/error
+        type: {
+            type: String,
+            default: uni.$u.props.alert.type
+        },
+        // 辅助性文字
+        description: {
+            type: String,
+            default: uni.$u.props.alert.description
+        },
+        // 是否可关闭
+        closable: {
+            type: Boolean,
+            default: uni.$u.props.alert.closable
+        },
+        // 是否显示图标
+        showIcon: {
+            type: Boolean,
+            default: uni.$u.props.alert.showIcon
+        },
+        // 浅或深色调,light-浅色,dark-深色
+        effect: {
+            type: String,
+            default: uni.$u.props.alert.effect
+        },
+        // 文字是否居中
+        center: {
+            type: Boolean,
+            default: uni.$u.props.alert.center
+        },
+        // 字体大小
+        fontSize: {
+            type: [String, Number],
+            default: uni.$u.props.alert.fontSize
+        }
+    }
+}

+ 243 - 0
uview-ui/components/u-alert/u-alert.vue

@@ -0,0 +1,243 @@
+<template>
+	<u-transition
+	    mode="fade"
+	    :show="show"
+	>
+		<view
+		    class="u-alert"
+		    :class="[`u-alert--${type}--${effect}`]"
+		    @tap.stop="clickHandler"
+		    :style="[$u.addStyle(customStyle)]"
+		>
+			<view
+			    class="u-alert__icon"
+			    v-if="showIcon"
+			>
+				<u-icon
+				    :name="iconName"
+				    size="18"
+				    :color="iconColor"
+				></u-icon>
+			</view>
+			<view
+			    class="u-alert__content"
+			    :style="[{
+					paddingRight: closable ? '20px' : 0
+				}]"
+			>
+				<text
+				    class="u-alert__content__title"
+				    v-if="title"
+					:style="[{
+						fontSize: $u.addUnit(fontSize),
+						textAlign: center ? 'center' : 'left'
+					}]"
+				    :class="[effect === 'dark' ? 'u-alert__text--dark' : `u-alert__text--${type}--light`]"
+				>{{ title }}</text>
+				<text
+				    class="u-alert__content__desc"
+					v-if="description"
+					:style="[{
+						fontSize: $u.addUnit(fontSize),
+						textAlign: center ? 'center' : 'left'
+					}]"
+				    :class="[effect === 'dark' ? 'u-alert__text--dark' : `u-alert__text--${type}--light`]"
+				>{{ description }}</text>
+			</view>
+			<view
+			    class="u-alert__close"
+			    v-if="closable"
+			    @tap.stop="closeHandler"
+			>
+				<u-icon
+				    name="close"
+				    :color="iconColor"
+				    size="15"
+				></u-icon>
+			</view>
+		</view>
+	</u-transition>
+</template>
+
+<script>
+	import props from './props.js';
+	/**
+	 * Alert  警告提示
+	 * @description 警告提示,展现需要关注的信息。
+	 * @tutorial https://www.uviewui.com/components/alertTips.html
+	 * 
+	 * @property {String}			title       显示的文字 
+	 * @property {String}			type        使用预设的颜色  (默认 'warning' )
+	 * @property {String}			description 辅助性文字,颜色比title浅一点,字号也小一点,可选  
+	 * @property {Boolean}			closable    关闭按钮(默认为叉号icon图标)  (默认 false )
+	 * @property {Boolean}			showIcon    是否显示左边的辅助图标   ( 默认 false )
+	 * @property {String}			effect      多图时,图片缩放裁剪的模式  (默认 'light' )
+	 * @property {Boolean}			center		文字是否居中  (默认 false )
+	 * @property {String | Number}	fontSize    字体大小  (默认 14 )
+	 * @property {Object}			customStyle	定义需要用到的外部样式
+	 * @event    {Function}        click       点击组件时触发
+	 * @example  <u-alert :title="title"  type = "warning" :closable="closable" :description = "description"></u-alert>
+	 */
+	export default {
+		name: 'u-alert',
+		mixins: [uni.$u.mpMixin, uni.$u.mixin, props],
+		data() {
+			return {
+				show: true
+			}
+		},
+		computed: {
+			iconColor() {
+				return this.effect === 'light' ? this.type : '#fff'
+			},
+			// 不同主题对应不同的图标
+			iconName() {
+				switch (this.type) {
+					case 'success':
+						return 'checkmark-circle-fill';
+						break;
+					case 'error':
+						return 'close-circle-fill';
+						break;
+					case 'warning':
+						return 'error-circle-fill';
+						break;
+					case 'info':
+						return 'info-circle-fill';
+						break;
+					case 'primary':
+						return 'more-circle-fill';
+						break;
+					default: 
+						return 'error-circle-fill';
+				}
+			}
+		},
+		methods: {
+			// 点击内容
+			clickHandler() {
+				this.$emit('click')
+			},
+			// 点击关闭按钮
+			closeHandler() {
+				this.show = false
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import "../../libs/css/components.scss";
+
+	.u-alert {
+		position: relative;
+		background-color: $u-primary;
+		padding: 8px 10px;
+		@include flex(row);
+		align-items: center;
+		border-top-left-radius: 4px;
+		border-top-right-radius: 4px;
+		border-bottom-left-radius: 4px;
+		border-bottom-right-radius: 4px;
+
+		&--primary--dark {
+			background-color: $u-primary;
+		}
+
+		&--primary--light {
+			background-color: #ecf5ff;
+		}
+
+		&--error--dark {
+			background-color: $u-error;
+		}
+
+		&--error--light {
+			background-color: #FEF0F0;
+		}
+
+		&--success--dark {
+			background-color: $u-success;
+		}
+
+		&--success--light {
+			background-color: #f5fff0;
+		}
+
+		&--warning--dark {
+			background-color: $u-warning;
+		}
+
+		&--warning--light {
+			background-color: #FDF6EC;
+		}
+
+		&--info--dark {
+			background-color: $u-info;
+		}
+
+		&--info--light {
+			background-color: #f4f4f5;
+		}
+
+		&__icon {
+			margin-right: 5px;
+		}
+
+		&__content {
+			@include flex(column);
+			flex: 1;
+
+			&__title {
+				color: $u-main-color;
+				font-size: 14px;
+				font-weight: bold;
+				color: #fff;
+				margin-bottom: 2px;
+			}
+
+			&__desc {
+				color: $u-main-color;
+				font-size: 14px;
+				flex-wrap: wrap;
+				color: #fff;
+			}
+		}
+
+		&__title--dark,
+		&__desc--dark {
+			color: #FFFFFF;
+		}
+
+		&__text--primary--light,
+		&__text--primary--light {
+			color: $u-primary;
+		}
+
+		&__text--success--light,
+		&__text--success--light {
+			color: $u-success;
+		}
+
+		&__text--warning--light,
+		&__text--warning--light {
+			color: $u-warning;
+		}
+
+		&__text--error--light,
+		&__text--error--light {
+			color: $u-error;
+		}
+
+		&__text--info--light,
+		&__text--info--light {
+			color: $u-info;
+		}
+
+		&__close {
+			position: absolute;
+			top: 11px;
+			right: 10px;
+		}
+	}
+</style>

Some files were not shown because too many files changed in this diff