liukang vor 2 Jahren
Ursprung
Commit
71f676b032
100 geänderte Dateien mit 14161 neuen und 71 gelöschten Zeilen
  1. 2 2
      App.vue
  2. 229 0
      components/my-order/my-order.vue
  3. 86 0
      components/news-module/news-module.vue
  4. 103 0
      components/pur-order/pur-order.vue
  5. 2 2
      main.js
  6. 9 1
      manifest.json
  7. 159 0
      page_index/pages/index/changeCity.vue
  8. 2895 0
      page_index/pages/index/cityList.json
  9. 45 0
      page_index/pages/index/noticeDetail.vue
  10. 106 0
      page_index/pages/index/noticeList.vue
  11. 116 0
      page_mine/pages/collect/collect.vue
  12. 219 0
      page_mine/pages/member/index.vue
  13. 58 0
      page_mine/pages/message/detail.vue
  14. 119 0
      page_mine/pages/message/message.vue
  15. 126 0
      page_mine/pages/order/oceanShipping.vue
  16. 126 0
      page_mine/pages/order/outsourcing.vue
  17. 126 0
      page_mine/pages/order/production.vue
  18. 130 0
      page_mine/pages/order/purchase.vue
  19. 144 0
      page_mine/pages/order/repair.vue
  20. 8 7
      page_mine/pages/service/applyMaintenance.vue
  21. 330 0
      page_mine/pages/service/joinPerson.vue
  22. 61 0
      page_mine/pages/setting/about.vue
  23. 106 0
      page_mine/pages/setting/account_info.vue
  24. 47 0
      page_mine/pages/setting/bind_eMail.vue
  25. 56 0
      page_mine/pages/setting/edit_pwd.vue
  26. 108 0
      page_mine/pages/setting/personal.vue
  27. 161 0
      page_mine/pages/setting/real_name.vue
  28. 34 0
      page_mine/pages/setting/rules.vue
  29. 92 0
      page_mine/pages/setting/setting.vue
  30. 122 0
      page_mine/pages/wallet/wallet.vue
  31. 136 0
      page_mine/pages/wallet/withdrawal.vue
  32. 221 18
      pages.json
  33. 176 0
      pages/login/code_login.vue
  34. 115 0
      pages/login/forgot_pwd.vue
  35. 174 0
      pages/login/password_login.vue
  36. 123 0
      pages/login/register.vue
  37. 218 30
      pages/tabbar/index/index.vue
  38. 405 1
      pages/tabbar/mine/mine.vue
  39. 0 8
      pages/tabbar/release/release.vue
  40. 210 1
      pages/tabbar/shipyard/shipyard.vue
  41. BIN
      static/images/comment/bg.png
  42. BIN
      static/images/comment/error.png
  43. BIN
      static/images/comment/person.png
  44. BIN
      static/images/comment/right.png
  45. BIN
      static/images/comment/upload.png
  46. BIN
      static/images/comment/wait.png
  47. BIN
      static/images/index/bg.png
  48. BIN
      static/images/index/class_img1.png
  49. BIN
      static/images/index/class_img2.png
  50. BIN
      static/images/index/class_img3.png
  51. BIN
      static/images/index/logo.png
  52. BIN
      static/images/login/biyanjing.png
  53. BIN
      static/images/login/yanjing.png
  54. BIN
      static/images/mine/avatar1.jpg
  55. BIN
      static/images/mine/avatar2.jpg
  56. BIN
      static/images/mine/balance.png
  57. BIN
      static/images/mine/bg.png
  58. BIN
      static/images/mine/btn_right.png
  59. BIN
      static/images/mine/collect.png
  60. BIN
      static/images/mine/huiyuan.png
  61. BIN
      static/images/mine/member_bg.png
  62. BIN
      static/images/mine/member_icon.png
  63. BIN
      static/images/mine/message.png
  64. BIN
      static/images/mine/order1.png
  65. BIN
      static/images/mine/order2.png
  66. BIN
      static/images/mine/order3.png
  67. BIN
      static/images/mine/order4.png
  68. BIN
      static/images/mine/order5.png
  69. BIN
      static/images/mine/real-bg.png
  70. BIN
      static/images/mine/service1.png
  71. BIN
      static/images/mine/service2.png
  72. BIN
      static/images/mine/service3.png
  73. BIN
      static/images/mine/service4.png
  74. BIN
      static/images/mine/service5.png
  75. BIN
      static/images/mine/service6.png
  76. BIN
      static/images/mine/service7.png
  77. BIN
      static/images/mine/service8.png
  78. 1991 0
      static/js/api.js
  79. 102 0
      static/js/cache.js
  80. 618 0
      static/js/calendar.js
  81. 1211 0
      static/js/city.js
  82. 259 0
      static/js/encrypt.js
  83. 110 0
      static/js/math.js
  84. 742 0
      static/js/qqmap-wx-jssdk.js
  85. 6 0
      static/js/weapp.qrcode.min.js
  86. 26 0
      static/kongbai_moban.vue
  87. 1 1
      uni.scss
  88. 0 0
      uni_modules/uview-ui/LICENSE
  89. 66 0
      uni_modules/uview-ui/README.md
  90. 344 0
      uni_modules/uview-ui/changelog.md
  91. 78 0
      uni_modules/uview-ui/components/u--form/u--form.vue
  92. 47 0
      uni_modules/uview-ui/components/u--image/u--image.vue
  93. 72 0
      uni_modules/uview-ui/components/u--input/u--input.vue
  94. 44 0
      uni_modules/uview-ui/components/u--text/u--text.vue
  95. 47 0
      uni_modules/uview-ui/components/u--textarea/u--textarea.vue
  96. 54 0
      uni_modules/uview-ui/components/u-action-sheet/props.js
  97. 278 0
      uni_modules/uview-ui/components/u-action-sheet/u-action-sheet.vue
  98. 59 0
      uni_modules/uview-ui/components/u-album/props.js
  99. 259 0
      uni_modules/uview-ui/components/u-album/u-album.vue
  100. 44 0
      uni_modules/uview-ui/components/u-alert/props.js

+ 2 - 2
App.vue

@@ -14,9 +14,9 @@
 
 <style lang="scss">
 	/*每个页面公共css */
-	@import "uview-ui/index.scss";
+	@import "@/uni_modules/uview-ui/index.scss";
 	
-	.web_box {
+	.content {
 		background-color: #ffffff;
 		width: 100%;
 		min-height: 100vh;

+ 229 - 0
components/my-order/my-order.vue

@@ -0,0 +1,229 @@
+<template>
+	<view class="my-order">
+		<view class="top hflex acenter jbetween">
+			<view class="order_no">订单号:{{order_no}}</view>
+			<view class="type" v-if="type == 0">未报价</view>
+			<view class="type1" v-if="type == 1">已报价</view>
+			<view class="type1" v-if="type == 2">已匹配</view>
+		</view>
+		<block v-if="order_type !== '5'">
+			<block v-for="(item,index) in good" :key="index">
+				<view class="box">
+					<view class="text_style1">{{item.name}}</view>
+					<view class="box_norm hflex acenter" >
+						<view class="text_style2">规格:{{item.norm}}kg/桶</view>
+						<view class="text_style2">采购数量:{{item.num}}吨</view>
+					</view>
+					<view class="text" v-if="item.text">{{item.text}}</view>
+				</view>
+			</block>
+			<view class="bottom hflex acenter jbetween">
+				<view class="offer">订单报价:<span style="font-size: 32rpx;color: #222;">{{offer}}</span></view>
+				<view class="btn">查看详情</view>
+			</view>
+		</block>
+		<block v-else>
+			<view class="box">
+				<view class="" >
+					<view class="urgent1" v-if="is_urgent == '1'">快修</view>
+					<view class="urgent" v-else>普修</view>
+					<view class="text_style1">{{name}}</view>
+				</view>
+				<view class="box_cell text_style2">维修时间:{{repair_date}}</view>
+				<view class="box_cell text_style2">维修地点:{{address}}</view>
+			</view>
+			<view class="bottom1 hflex jend">
+				<view class="btn1" v-if="active1 == '1'">编辑</view>
+				<view class="btn1">查看详情</view>
+			</view>
+		</block>
+	</view>
+</template>
+
+<script>
+	export default {
+		name:"my-order",
+		props: {
+			order_no: {
+				type: String,
+				value: '' 
+			},
+			type: {
+				type: String,
+				value: ''
+			},
+			good: {
+				type: Array,
+				value: []
+			},
+			offer: {
+				type: String,
+				value: ''
+			},
+			order_type: {
+				type: String,
+				value: ''
+			},
+			is_urgent: {
+				type: String,
+				value: ''
+			},
+			name: {
+				type: String,
+				value: ''
+			},
+			repair_date: {
+				type: String,
+				value: ''
+			},
+			address: {
+				type: String,
+				value: ''
+			},
+			active1: {
+				type: String,
+				value: ''
+			}
+		},
+		data() {
+			return {
+				
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.my-order {
+		width: 100%;
+		box-sizing: border-box;
+		padding: 26rpx 20rpx;
+		margin-top: 20rpx;
+		border-radius: 20rpx;
+		background-color: #fff;
+		.top {
+			padding-bottom: 24rpx;
+			width: 100%;
+			.order_no {
+				font-size: 24rpx;
+				color: #444;
+			}
+			.type {
+				width: 96rpx;
+				height: 40rpx;
+				background-color: #fff4e8;
+				border-radius: 4rpx;
+				font-size: 22rpx;
+				color: #fba94e;
+				text-align: center;
+				line-height: 40rpx;
+			}
+			.type1 {
+				width: 96rpx;
+				height: 40rpx;
+				background-color: #e7ebf7;
+				border-radius: 4rpx;
+				font-size: 22rpx;
+				color: #506dff;
+				text-align: center;
+				line-height: 40rpx;
+			}
+		}
+		.box {
+			width: 100%;
+			padding-top: 14rpx;
+			border-top: 1rpx solid #f4f4f4;
+			.text_style1 {
+				font-size: 28rpx;
+				color: #222;
+				line-height: 40rpx;
+				display: inline-block;
+			}
+			.urgent1 {
+				width: 72rpx;
+				height: 32rpx;
+				background-color: #ff762C;
+				border-radius: 4rpx;
+				color: #fff;
+				font-size: 24rpx;
+				text-align: center;
+				line-height: 32rpx;
+				display: inline-block;
+			}
+			.urgent {
+				width: 72rpx;
+				height: 32rpx;
+				background-color: #5571ff;
+				border-radius: 4rpx;
+				color: #fff;
+				font-size: 24rpx;
+				text-align: center;
+				line-height: 32rpx;
+			}
+			.box_norm {
+				width: auto;
+				background-color: #f4f4f4;
+				border-radius: 8rpx;
+				box-sizing: border-box;
+				padding: 6rpx 20rpx;
+				margin: 16rpx 0 24rpx;
+			}
+			.box_cell {
+				margin: 16rpx 0 24rpx;
+			}
+			.text_style2 {
+				font-size: 24rpx;
+				color: #888;
+				padding-right: 20rpx;
+			}
+			.text {
+				width: 100%;
+				padding-bottom: 20rpx;
+				font-size: 26rpx;
+				color: #888;
+				line-height: 36rpx;
+			}
+		}
+		.bottom {
+			width: 100%;
+			box-sizing: border-box;
+			padding: 14rpx 20rpx;
+			background-color: #eaf4ff;
+			border-radius: 16rpx;
+			.offer {
+				font-size: 24rpx;
+				color: #506dff;
+				
+			}
+			.btn {
+				width: 152rpx;
+				height: 52rpx;
+				background-color: #eaf4ff;
+				border-radius: 28rpx;
+				border: 1rpx solid #506dff;
+				font-size: 26rpx;
+				color: #506dff;
+				text-align: center;
+				line-height: 52rpx;
+			}
+			
+		}
+		.bottom1 {
+			width: 100%;
+			padding-top: 20rpx;
+			border-top: 1rpx solid #f4f4f4;
+		}
+		.btn1 {
+			width: 152rpx;
+			height: 52rpx;
+			// background-color: #eaf4ff;
+			border-radius: 28rpx;
+			border: 1rpx solid #e5e5e5;
+			font-size: 26rpx;
+			color: #2f2f2f;
+			text-align: center;
+			line-height: 52rpx;
+			margin-left: 24rpx;
+		}
+	}
+</style>

+ 86 - 0
components/news-module/news-module.vue

@@ -0,0 +1,86 @@
+<template>
+	<view class="news_module vflex">
+		<view class="news_title">
+			{{title}}
+		</view>
+		<view v-if="imgs.length > 0" class="imgList hflex acenter jbetween">
+			<block v-for="(item,index) in imgs" :key="index">
+				<image :src="item" mode="widthFix" style="width: 230rpx"></image>
+			</block>
+			
+		</view>
+		<view v-if="video !== ''" class="imgList">
+			<video :src="video" controls></video>o
+		</view>
+		<view class="hflex acenter bottom">
+			<view class="bottom_text">{{type}}</view>
+			<view class="bottom_text2">{{client}}</view>
+			<view class="bottom_text2">{{comment}}评论</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name:"news-module",
+		props: {
+			title: {
+				type: String,
+				value: '' 
+			},
+			imgs: {
+				type: Array,
+				value: [] 
+			},
+			video: {
+				type: String,
+				value: '' 
+			},
+			type: {
+				type: String,
+				value: '' 
+			},
+			client: {
+				type: String,
+				value: '' 
+			},
+			comment: {
+				type: Number,
+				value: 0
+			}
+		},
+		data() {
+			return {
+			};
+		}
+	}
+</script>
+
+<style lang="scss">
+.news_module {
+	width: 100%;
+	padding-bottom: 20rpx;
+	border-bottom: 1rpx solid #f3f3f3;
+	
+	.news_title {
+		font-size: 36rpx;
+		color: #333;
+		line-height: 50rpx;
+	}
+	.imgList {
+		margin: 16rpx 0;
+	}
+	.bottom {
+		
+		.bottom_text {
+			font-size: 24rpx;
+			color: #3261FF;
+		}
+		.bottom_text2 {
+			color: #999999;
+			font-size: 24rpx;
+			margin-left: 20rpx;
+		}
+	}
+}
+</style>

+ 103 - 0
components/pur-order/pur-order.vue

@@ -0,0 +1,103 @@
+<template>
+	<view class="pur_order vflex">
+		<view class="top hflex acenter jbetween">
+			<view class="order_no">订单号:{{order_no}}</view>
+			<view class="type">{{type}}</view>
+		</view>
+		<view class="name">{{name}}</view>
+		<view class="box hflex acenter">
+			<view class="text">联系人:</view>
+			<view class="text1">{{contacts}}</view>
+		</view>
+		<view class="box hflex acenter">
+			<view class="text">手机号:</view>
+			<view class="text1">{{phone}}</view>
+		</view>
+		<view class="box hflex acenter">
+			<view class="text">交货日期:</view>
+			<view class="text1">{{delivery_date}}</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name:"pur-order",
+		props: {
+			order_no: {
+				type: String,
+				value: '' 
+			},
+			type: {
+				type: String,
+				value: '' 
+			},
+			name: {
+				type: String,
+				value: '' 
+			},
+			contacts: {
+				type: String,
+				value: '' 
+			},
+			phone: {
+				type: String,
+				value: '' 
+			},
+			delivery_date: {
+				type: String,
+				value: '' 
+			}
+		},
+		data() {
+			return {
+			};
+		}
+	}
+</script>
+
+<style lang="scss">
+.pur_order {
+	width: 100%;
+	background-color: #f5f5f5;
+	box-sizing: border-box;
+	border-radius: 24rpx;
+	padding: 26rpx 20rpx;
+	.top {
+		width: 100%;
+		padding-bottom: 20rpx;
+		border-bottom: 1rpx solid #dfdfdf;
+		.order_no {
+			font-size: 24rpx;
+			color: #444;
+		}
+		.type {
+			background-color: #54d2c5;
+			border-radius: 12rpx 4rpx 12rpx 4rpx;
+			box-sizing: border-box;
+			padding: 4rpx 8rpx;
+			color: #fff;
+			font-size: 20rpx;
+		}
+		
+	}
+	.name {
+		margin-top: 20rpx;
+		font-size: 32rpx;
+		color: #222;
+		font-weight: 500;
+	}
+	.box {
+		margin: 10rpx 0 0;
+		.text {
+			font-size: 24rpx;
+			color: #888;
+			margin-right: 26rpx;
+		}
+		.text1 {
+			font-size: 24rpx;
+			color: #222;
+		}
+	}
+}
+</style>

+ 2 - 2
main.js

@@ -7,8 +7,8 @@ App.mpType = 'app'
 const app = new Vue({
     ...App
 })
-import uView from "uview-ui";
-Vue.use(uView);
+import uView from '@/uni_modules/uview-ui'
+Vue.use(uView)
 app.$mount()
 // #endif
 

+ 9 - 1
manifest.json

@@ -54,7 +54,15 @@
         "setting" : {
             "urlCheck" : false
         },
-        "usingComponents" : true
+        "usingComponents" : true,
+        "optimization" : {
+            "subPackage" : true
+        },
+        "permission" : {
+            "scope.userLocation" : {
+                "desc" : "提供更好的服务"
+            }
+        }
     },
     "mp-alipay" : {
         "usingComponents" : true

+ 159 - 0
page_index/pages/index/changeCity.vue

@@ -0,0 +1,159 @@
+<template>
+	<view class="content">
+		<u-index-list :index-list="indexList" @select="select" >
+			<view class="top">
+				<u-input v-model="searchCity" type="text" :border="true" placeholder="请输入城市名" shape="circle"
+					prefixIcon="search" prefixIconStyle="font-size: 22px;color: #909399">
+				</u-input>
+			</view>
+			<view class="title">
+				<view class="title_text">定位城市</view>
+				<view class="hflex acenter jcenter city_box active">
+					<u-icon name="map-fill" color="#fff" size="14"></u-icon>
+					<view style="margin-left: 8rpx;">{{city}}</view>
+				</view>
+			</view>
+			<view class="title vflex fwrap" v-if="history.length > 0">
+				<view class="title_text">历史</view>
+				<view class="hflex acenter fwrap city_box">
+					<block v-for="(item,index) in history" :key="index">
+						<view @click="selectCity(item)">{{item}}</view>
+					</block>
+				</view>
+			</view>
+			<view class="title vflex fwrap">
+				<view class="title_text">
+					热门
+				</view>
+				<view class="hflex acenter fwrap jbetween">
+					<block v-for="(item2,index) in hotList">
+						<view class="city_box hflex acenter jcenter"@click="selectCity(item2)">{{item2}}</view>
+					</block>
+				</view>
+			</view>
+		
+			<template v-for="(item, index) in itemArr">
+				<u-index-item>
+					<view class="list-cell" v-for="(cell, index) in item">
+						<view @tap="selectCity(cell)">{{cell.city}}</view>
+					</view>
+				</u-index-item>
+			</template>
+		</u-index-list>
+	</view>
+</template>
+
+<script>
+	import cityList from './cityList.json'
+	export default {
+		data() {
+			return {
+				city: '',
+				searchCity: '',
+				history: [],
+				hotList: [
+					"北京市",
+					"南京市",
+					"重庆市",
+					"成都市",
+					"西安市",
+					"广州市",
+					"苏州市",
+					"杭州市",
+					"武汉市",
+				],
+				indexList: ["A", "B", "C","D","E","F","G","H","J","K","L","M","N","P",'Q','R','S','T','W','X','Y','Z'],
+				itemArr: []
+
+			}
+		},
+		onLoad(options) {
+			this.city = options.city
+			this.itemArr = cityList.city_list;
+			console.log(this.itemArr);
+		},
+		methods: {
+			// 选择索引
+			select(e) {
+				console.log(e);
+			},
+			// 选择城市
+			selectCity(city) {
+				console.log(city);
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content::v-deep {
+		// padding: 0 30rpx;
+		background-color: #f5f5f5;
+		.top {
+			width: 100%;
+			background: #fff;
+			padding: 36rpx 30rpx 36rpx;
+			box-sizing: border-box;
+			// margin-top: ;
+		}
+		.title {
+			width: 100%;
+			background: #fff;
+			padding: 32rpx 30rpx 32rpx;
+			box-sizing: border-box;
+			margin-top: 20rpx;
+			font-size: 28rpx;
+			color: #222;
+			
+			.title_text {
+				
+			}
+			.city_box {
+				margin-top:20rpx ;
+				width: 212rpx;
+				height: 72rpx;
+				background: #f5f5f5;
+				border-radius: 5rpx;
+				font-size: 28rpx;
+				color: #555
+			}
+			.active {
+				background: #506DFF;
+				font-size: 28rpx;
+				color: #fff
+			}
+		}
+		.u-index-list {
+			width: 100%;
+			box-sizing: border-box;
+			padding: 32rpx 0;
+			// background-color: #fff;
+		}
+		.u-input {
+			background: #f5f5f5 !important;
+		}
+		.u-index-item {
+			width: 100%;
+			background: #fff;
+			margin: 10rpx 0;
+			padding: 32rpx 30rpx 0;
+		}
+		// .list-cell {
+		// 	font-size: 30rpx;
+		// 	color: #222;
+		// 	padding-bottom: 32rpx;
+		// }
+		.list-cell {
+			display: flex;
+			box-sizing: border-box;
+			width: 100%;
+			padding: 10px 24rpx;
+			overflow: hidden;
+			color: #222;
+			font-size: 30rpx;
+			line-height: 24px;
+			background-color: #fff;
+		}
+
+	}
+</style>

+ 2895 - 0
page_index/pages/index/cityList.json

@@ -0,0 +1,2895 @@
+{
+	"city_list": [
+
+        [
+
+            {
+				"title": "A", 
+
+                "code": "152900",
+
+                "city": "阿拉善盟"
+
+            },
+
+            {
+
+                "code": "210300",
+
+                "city": "鞍山"
+
+            },
+
+            {
+
+                "code": "340800",
+
+                "city": "安庆"
+
+            },
+
+            {
+
+                "code": "410500",
+
+                "city": "安阳"
+
+            },
+
+            {
+
+                "code": "513200",
+
+                "city": "阿坝藏族羌族自治州"
+
+            },
+
+            {
+
+                "code": "520400",
+
+                "city": "安顺"
+
+            },
+
+            {
+
+                "code": "542500",
+
+                "city": "阿里地区"
+
+            },
+
+            {
+
+                "code": "610900",
+
+                "city": "安康"
+
+            },
+
+            {
+
+                "code": "652900",
+
+                "city": "阿克苏地区"
+
+            },
+
+            {
+
+                "code": "654300",
+
+                "city": "阿勒泰地区"
+
+            },
+
+            {
+
+                "code": "820100",
+
+                "city": "澳门半岛"
+
+            }
+
+        ],
+
+        [
+
+            {
+
+                "code": "110100",
+
+                "city": "北京"
+
+            },
+
+            {
+
+                "code": "130600",
+
+                "city": "保定"
+
+            },
+
+            {
+
+                "code": "150200",
+
+                "city": "包头"
+
+            },
+
+            {
+
+                "code": "150800",
+
+                "city": "巴彦淖尔"
+
+            },
+
+            {
+
+                "code": "210500",
+
+                "city": "本溪"
+
+            },
+
+            {
+
+                "code": "220600",
+
+                "city": "白山"
+
+            },
+
+            {
+
+                "code": "220800",
+
+                "city": "白城"
+
+            },
+
+            {
+
+                "code": "340300",
+
+                "city": "蚌埠"
+
+            },
+
+            {
+
+                "code": "371600",
+
+                "city": "滨州"
+
+            },
+
+            {
+
+                "code": "450500",
+
+                "city": "北海"
+
+            },
+
+            {
+
+                "code": "451000",
+
+                "city": "百色"
+
+            },
+
+            {
+
+                "code": "511900",
+
+                "city": "巴中"
+
+            },
+
+            {
+
+                "code": "522400",
+
+                "city": "毕节地区"
+
+            },
+
+            {
+
+                "code": "530500",
+
+                "city": "保山"
+
+            },
+
+            {
+
+                "code": "610300",
+
+                "city": "宝鸡"
+
+            },
+
+            {
+
+                "code": "620400",
+
+                "city": "白银"
+
+            },
+
+            {
+
+                "code": "652700",
+
+                "city": "博尔塔拉蒙古自治州"
+
+            },
+
+            {
+
+                "code": "652800",
+
+                "city": "巴音郭楞蒙古自治州"
+
+            }
+
+        ],
+
+        [
+
+            {
+
+                "code": "130800",
+
+                "city": "承德"
+
+            },
+
+            {
+
+                "code": "130900",
+
+                "city": "沧州"
+
+            },
+
+            {
+
+                "code": "140400",
+
+                "city": "长治"
+
+            },
+
+            {
+
+                "code": "150400",
+
+                "city": "赤峰"
+
+            },
+
+            {
+
+                "code": "211300",
+
+                "city": "朝阳"
+
+            },
+
+            {
+
+                "code": "220100",
+
+                "city": "长春"
+
+            },
+
+            {
+
+                "code": "320400",
+
+                "city": "常州"
+
+            },
+
+            {
+
+                "code": "341100",
+
+                "city": "滁州"
+
+            },
+
+            {
+
+                "code": "341700",
+
+                "city": "池州"
+
+            },
+
+            {
+
+                "code": "430100",
+
+                "city": "长沙"
+
+            },
+
+            {
+
+                "code": "430700",
+
+                "city": "常德"
+
+            },
+
+            {
+
+                "code": "431000",
+
+                "city": "郴州"
+
+            },
+
+            {
+
+                "code": "445100",
+
+                "city": "潮州"
+
+            },
+
+            {
+
+                "code": "451400",
+
+                "city": "崇左"
+
+            },
+
+            {
+
+                "code": "510100",
+
+                "city": "成都"
+
+            },
+
+            {
+
+                "code": "500100",
+
+                "city": "重庆"
+
+            },
+
+            {
+
+                "code": "532300",
+
+                "city": "楚雄彝族自治州"
+
+            },
+
+            {
+
+                "code": "542100",
+
+                "city": "昌都地区"
+
+            },
+
+            {
+
+                "code": "652300",
+
+                "city": "昌吉回族自治州"
+
+            }
+
+        ],
+
+        [
+
+            {
+
+                "code": "140200",
+
+                "city": "大同"
+
+            },
+
+            {
+
+                "code": "210200",
+
+                "city": "大连"
+
+            },
+
+            {
+
+                "code": "210600",
+
+                "city": "丹东"
+
+            },
+
+            {
+
+                "code": "230600",
+
+                "city": "大庆"
+
+            },
+
+            {
+
+                "code": "232700",
+
+                "city": "大兴安岭地区"
+
+            },
+
+            {
+
+                "code": "370500",
+
+                "city": "东营"
+
+            },
+
+            {
+
+                "code": "371400",
+
+                "city": "德州"
+
+            },
+
+            {
+
+                "code": "441900",
+
+                "city": "东莞"
+
+            },
+
+            {
+
+                "code": "510600",
+
+                "city": "德阳"
+
+            },
+
+            {
+
+                "code": "511700",
+
+                "city": "达州"
+
+            },
+
+            {
+
+                "code": "532900",
+
+                "city": "大理白族自治州"
+
+            },
+
+            {
+
+                "code": "533100",
+
+                "city": "德宏傣族景颇族自治州"
+
+            },
+
+            {
+
+                "code": "533400",
+
+                "city": "迪庆藏族自治州"
+
+            },
+
+            {
+
+                "code": "621100",
+
+                "city": "定西"
+
+            }
+
+        ],
+
+        [
+
+            {
+
+                "code": "150600",
+
+                "city": "鄂尔多斯"
+
+            },
+
+            {
+
+                "code": "420700",
+
+                "city": "鄂州"
+
+            },
+
+            {
+
+                "code": "422800",
+
+                "city": "恩施土家族苗族自治州"
+
+            }
+
+        ],
+
+        [
+
+            {
+
+                "code": "210400",
+
+                "city": "抚顺"
+
+            },
+
+            {
+
+                "code": "210900",
+
+                "city": "阜新"
+
+            },
+
+            {
+
+                "code": "341200",
+
+                "city": "阜阳"
+
+            },
+
+            {
+
+                "code": "350100",
+
+                "city": "福州"
+
+            },
+
+            {
+
+                "code": "361000",
+
+                "city": "抚州"
+
+            },
+
+            {
+
+                "code": "440600",
+
+                "city": "佛山"
+
+            },
+
+            {
+
+                "code": "450600",
+
+                "city": "防城港"
+
+            }
+
+        ],
+
+        [
+
+            {
+
+                "code": "360700",
+
+                "city": "赣州"
+
+            },
+
+            {
+
+                "code": "440100",
+
+                "city": "广州"
+
+            },
+
+            {
+
+                "code": "450300",
+
+                "city": "桂林"
+
+            },
+
+            {
+
+                "code": "450800",
+
+                "city": "贵港"
+
+            },
+
+            {
+
+                "code": "510800",
+
+                "city": "广元"
+
+            },
+
+            {
+
+                "code": "511600",
+
+                "city": "广安"
+
+            },
+
+            {
+
+                "code": "513300",
+
+                "city": "甘孜藏族自治州"
+
+            },
+
+            {
+
+                "code": "520100",
+
+                "city": "贵阳"
+
+            },
+
+            {
+
+                "code": "623000",
+
+                "city": "甘南藏族自治州"
+
+            },
+
+            {
+
+                "code": "632600",
+
+                "city": "果洛藏族自治州"
+
+            },
+
+            {
+
+                "code": "640400",
+
+                "city": "固原"
+
+            },
+
+            {
+
+                "code": "710200",
+
+                "city": "高雄"
+
+            }
+
+        ],
+
+        [
+
+            {
+
+                "code": "130400",
+
+                "city": "邯郸"
+
+            },
+
+            {
+
+                "code": "131100",
+
+                "city": "衡水"
+
+            },
+
+            {
+
+                "code": "150100",
+
+                "city": "呼和浩特"
+
+            },
+
+            {
+
+                "code": "150700",
+
+                "city": "呼伦贝尔"
+
+            },
+
+            {
+
+                "code": "211400",
+
+                "city": "葫芦岛"
+
+            },
+
+            {
+
+                "code": "230100",
+
+                "city": "哈尔滨"
+
+            },
+
+            {
+
+                "code": "230400",
+
+                "city": "鹤岗"
+
+            },
+
+            {
+
+                "code": "231100",
+
+                "city": "黑河"
+
+            },
+
+            {
+
+                "code": "320800",
+
+                "city": "淮安"
+
+            },
+
+            {
+
+                "code": "330100",
+
+                "city": "杭州"
+
+            },
+
+            {
+
+                "code": "330500",
+
+                "city": "湖州"
+
+            },
+
+            {
+
+                "code": "340100",
+
+                "city": "合肥"
+
+            },
+
+            {
+
+                "code": "340400",
+
+                "city": "淮南"
+
+            },
+
+            {
+
+                "code": "340600",
+
+                "city": "淮北"
+
+            },
+
+            {
+
+                "code": "341000",
+
+                "city": "黄山"
+
+            },
+
+            {
+
+                "code": "371700",
+
+                "city": "菏泽"
+
+            },
+
+            {
+
+                "code": "410600",
+
+                "city": "鹤壁"
+
+            },
+
+            {
+
+                "code": "420200",
+
+                "city": "黄石"
+
+            },
+
+            {
+
+                "code": "421100",
+
+                "city": "黄冈"
+
+            },
+
+            {
+
+                "code": "430400",
+
+                "city": "衡阳"
+
+            },
+
+            {
+
+                "code": "431200",
+
+                "city": "怀化"
+
+            },
+
+            {
+
+                "code": "441300",
+
+                "city": "惠州"
+
+            },
+
+            {
+
+                "code": "441600",
+
+                "city": "河源"
+
+            },
+
+            {
+
+                "code": "451100",
+
+                "city": "贺州"
+
+            },
+
+            {
+
+                "code": "451200",
+
+                "city": "河池"
+
+            },
+
+            {
+
+                "code": "460100",
+
+                "city": "海口"
+
+            },
+
+            {
+
+                "code": "532500",
+
+                "city": "红河哈尼族彝族自治州"
+
+            },
+
+            {
+
+                "code": "610700",
+
+                "city": "汉中"
+
+            },
+
+            {
+
+                "code": "632100",
+
+                "city": "海东地区"
+
+            },
+
+            {
+
+                "code": "632200",
+
+                "city": "海北藏族自治州"
+
+            },
+
+            {
+
+                "code": "632300",
+
+                "city": "黄南藏族自治州"
+
+            },
+
+            {
+
+                "code": "632500",
+
+                "city": "海南藏族自治州"
+
+            },
+
+            {
+
+                "code": "632800",
+
+                "city": "海西蒙古族藏族自治州"
+
+            },
+
+            {
+
+                "code": "652200",
+
+                "city": "哈密地区"
+
+            },
+
+            {
+
+                "code": "653200",
+
+                "city": "和田地区"
+
+            }
+
+        ],
+	
+        [
+
+            {
+
+                "code": "140500",
+
+                "city": "晋城"
+
+            },
+
+            {
+
+                "code": "140700",
+
+                "city": "晋中"
+
+            },
+
+            {
+
+                "code": "210700",
+
+                "city": "锦州"
+
+            },
+
+            {
+
+                "code": "220200",
+
+                "city": "吉林"
+
+            },
+
+            {
+
+                "code": "230300",
+
+                "city": "鸡西"
+
+            },
+
+            {
+
+                "code": "230800",
+
+                "city": "佳木斯"
+
+            },
+
+            {
+
+                "code": "330400",
+
+                "city": "嘉兴"
+
+            },
+
+            {
+
+                "code": "330700",
+
+                "city": "金华"
+
+            },
+
+            {
+
+                "code": "360200",
+
+                "city": "景德镇"
+
+            },
+
+            {
+
+                "code": "360400",
+
+                "city": "九江"
+
+            },
+
+            {
+
+                "code": "360800",
+
+                "city": "吉安"
+
+            },
+
+            {
+
+                "code": "370100",
+
+                "city": "济南"
+
+            },
+
+            {
+
+                "code": "370800",
+
+                "city": "济宁"
+
+            },
+
+            {
+
+                "code": "410800",
+
+                "city": "焦作"
+
+            },
+
+            {
+
+                "code": "420800",
+
+                "city": "荆门"
+
+            },
+
+            {
+
+                "code": "421000",
+
+                "city": "荆州"
+
+            },
+
+            {
+
+                "code": "440700",
+
+                "city": "江门"
+
+            },
+
+            {
+
+                "code": "445200",
+
+                "city": "揭阳"
+
+            },
+
+            {
+
+                "code": "620200",
+
+                "city": "嘉峪关"
+
+            },
+
+            {
+
+                "code": "620300",
+
+                "city": "金昌"
+
+            },
+
+            {
+
+                "code": "620900",
+
+                "city": "酒泉"
+
+            },
+
+            {
+
+                "code": "710500",
+
+                "city": "金门县"
+
+            },
+
+            {
+
+                "code": "710700",
+
+                "city": "基隆"
+
+            },
+
+            {
+
+                "code": "710900",
+
+                "city": "嘉义"
+
+            },
+
+            {
+
+                "code": "810200",
+
+                "city": "九龙"
+
+            }
+
+        ],
+
+        [
+
+            {
+
+                "code": "410200",
+
+                "city": "开封"
+
+            },
+
+            {
+
+                "code": "530100",
+
+                "city": "昆明"
+
+            },
+
+            {
+
+                "code": "650200",
+
+                "city": "克拉玛依"
+
+            },
+
+            {
+
+                "code": "653000",
+
+                "city": "克孜勒苏柯尔克孜自治州"
+
+            },
+
+            {
+
+                "code": "653100",
+
+                "city": "喀什地区"
+
+            }
+
+        ],
+
+        [
+
+            {
+
+                "code": "131000",
+
+                "city": "廊坊"
+
+            },
+
+            {
+
+                "code": "411100",
+
+                "city": "漯河"
+
+            },
+
+            {
+
+                "code": "141000",
+
+                "city": "临汾"
+
+            },
+
+            {
+
+                "code": "141100",
+
+                "city": "吕梁"
+
+            },
+
+            {
+
+                "code": "211000",
+
+                "city": "辽阳"
+
+            },
+
+            {
+
+                "code": "220400",
+
+                "city": "辽源"
+
+            },
+
+            {
+
+                "code": "320700",
+
+                "city": "连云港"
+
+            },
+
+            {
+
+                "code": "331100",
+
+                "city": "丽水"
+
+            },
+
+            {
+
+                "code": "341500",
+
+                "city": "六安"
+
+            },
+
+            {
+
+                "code": "350800",
+
+                "city": "龙岩"
+
+            },
+
+            {
+
+                "code": "371200",
+
+                "city": "莱芜"
+
+            },
+
+            {
+
+                "code": "371300",
+
+                "city": "临沂"
+
+            },
+
+            {
+
+                "code": "371500",
+
+                "city": "聊城"
+
+            },
+
+            {
+
+                "code": "410300",
+
+                "city": "洛阳"
+
+            },
+
+            {
+
+                "code": "510500",
+
+                "city": "泸州"
+
+            },
+
+            {
+
+                "code": "431300",
+
+                "city": "娄底"
+
+            },
+
+            {
+
+                "code": "450200",
+
+                "city": "柳州"
+
+            },
+
+            {
+
+                "code": "451300",
+
+                "city": "来宾"
+
+            },
+
+            {
+
+                "code": "511100",
+
+                "city": "乐山"
+
+            },
+
+            {
+
+                "code": "513400",
+
+                "city": "凉山彝族自治州"
+
+            },
+
+            {
+
+                "code": "520200",
+
+                "city": "六盘水"
+
+            },
+
+            {
+
+                "code": "530700",
+
+                "city": "丽江"
+
+            },
+
+            {
+
+                "code": "530900",
+
+                "city": "临沧"
+
+            },
+
+            {
+
+                "code": "540100",
+
+                "city": "拉萨"
+
+            },
+
+            {
+
+                "code": "542600",
+
+                "city": "林芝地区"
+
+            },
+
+            {
+
+                "code": "620100",
+
+                "city": "兰州"
+
+            },
+
+            {
+
+                "code": "621200",
+
+                "city": "陇南"
+
+            },
+
+            {
+
+                "code": "622900",
+
+                "city": "临夏回族自治州"
+
+            },
+
+            {
+
+                "code": "820200",
+
+                "city": "离岛"
+
+            }
+
+        ],
+
+        [
+
+            {
+
+                "code": "231000",
+
+                "city": "牡丹江"
+
+            },
+
+            {
+
+                "code": "340500",
+
+                "city": "马鞍山"
+
+            },
+
+            {
+
+                "code": "440900",
+
+                "city": "茂名"
+
+            },
+
+            {
+
+                "code": "441400",
+
+                "city": "梅州"
+
+            },
+
+            {
+
+                "code": "510700",
+
+                "city": "绵阳"
+
+            },
+
+            {
+
+                "code": "511400",
+
+                "city": "眉山"
+
+            }
+
+        ],
+
+        [
+
+            {
+
+                "code": "320100",
+
+                "city": "南京"
+
+            },
+
+            {
+
+                "code": "320600",
+
+                "city": "南通"
+
+            },
+
+            {
+
+                "code": "330200",
+
+                "city": "宁波"
+
+            },
+
+            {
+
+                "code": "350700",
+
+                "city": "南平"
+
+            },
+
+            {
+
+                "code": "350900",
+
+                "city": "宁德"
+
+            },
+
+            {
+
+                "code": "360100",
+
+                "city": "南昌"
+
+            },
+
+            {
+
+                "code": "411300",
+
+                "city": "南阳"
+
+            },
+
+            {
+
+                "code": "450100",
+
+                "city": "南宁"
+
+            },
+
+            {
+
+                "code": "511000",
+
+                "city": "内江"
+
+            },
+
+            {
+
+                "code": "511300",
+
+                "city": "南充"
+
+            },
+
+            {
+
+                "code": "533300",
+
+                "city": "怒江傈僳族自治州"
+
+            },
+
+            {
+
+                "code": "542400",
+
+                "city": "那曲地区"
+
+            },
+
+            {
+
+                "code": "710600",
+
+                "city": "南投县"
+
+            }
+
+        ],
+
+        [
+
+            {
+
+                "code": "211100",
+
+                "city": "盘锦"
+
+            },
+
+            {
+
+                "code": "350300",
+
+                "city": "莆田"
+
+            },
+
+            {
+
+                "code": "410900",
+
+                "city": "濮阳"
+
+            },
+
+            {
+
+                "code": "360300",
+
+                "city": "萍乡"
+
+            },
+
+            {
+
+                "code": "410400",
+
+                "city": "平顶山"
+
+            },
+
+            {
+
+                "code": "510400",
+
+                "city": "攀枝花"
+
+            },
+
+            {
+
+                "code": "530800",
+
+                "city": "普洱"
+
+            },
+
+            {
+
+                "code": "620800",
+
+                "city": "平凉"
+
+            }
+
+        ],
+
+        [
+
+            {
+
+                "code": "130300",
+
+                "city": "秦皇岛"
+
+            },
+
+            {
+
+                "code": "230200",
+
+                "city": "齐齐哈尔"
+
+            },
+
+            {
+
+                "code": "230900",
+
+                "city": "七台河"
+
+            },
+
+            {
+
+                "code": "350500",
+
+                "city": "泉州"
+
+            },
+
+            {
+
+                "code": "370200",
+
+                "city": "青岛"
+
+            },
+
+            {
+
+                "code": "441800",
+
+                "city": "清远"
+
+            },
+
+            {
+
+                "code": "450700",
+
+                "city": "钦州"
+
+            },
+
+            {
+
+                "code": "522300",
+
+                "city": "黔西南布依族苗族自治州"
+
+            },
+
+            {
+
+                "code": "522600",
+
+                "city": "黔东南苗族侗族自治州"
+
+            },
+
+            {
+
+                "code": "522700",
+
+                "city": "黔南布依族苗族自治州"
+
+            },
+
+            {
+
+                "code": "530300",
+
+                "city": "曲靖"
+
+            },
+
+            {
+
+                "code": "621000",
+
+                "city": "庆阳"
+
+            }
+
+        ],
+
+        [
+
+            {
+
+                "code": "371100",
+
+                "city": "日照"
+
+            },
+
+            {
+
+                "code": "542300",
+
+                "city": "日喀则地区"
+
+            }
+
+        ],
+
+        [
+
+            {
+
+                "code": "130100",
+
+                "city": "石家庄"
+
+            },
+
+            {
+
+                "code": "140600",
+
+                "city": "朔州"
+
+            },
+
+            {
+
+                "code": "210100",
+
+                "city": "沈阳"
+
+            },
+
+            {
+
+                "code": "220300",
+
+                "city": "四平"
+
+            },
+
+            {
+
+                "code": "220700",
+
+                "city": "松原"
+
+            },
+
+            {
+
+                "code": "230500",
+
+                "city": "双鸭山"
+
+            },
+
+            {
+
+                "code": "231200",
+
+                "city": "绥化"
+
+            },
+
+            {
+
+                "code": "310100",
+
+                "city": "上海"
+
+            },
+
+            {
+
+                "code": "320500",
+
+                "city": "苏州"
+
+            },
+
+            {
+
+                "code": "321300",
+
+                "city": "宿迁"
+
+            },
+
+            {
+
+                "code": "330600",
+
+                "city": "绍兴"
+
+            },
+
+            {
+
+                "code": "341300",
+
+                "city": "宿州"
+
+            },
+
+            {
+
+                "code": "350400",
+
+                "city": "三明"
+
+            },
+
+            {
+
+                "code": "361100",
+
+                "city": "上饶"
+
+            },
+
+            {
+
+                "code": "411200",
+
+                "city": "三门峡"
+
+            },
+
+            {
+
+                "code": "411400",
+
+                "city": "商丘"
+
+            },
+
+            {
+
+                "code": "420300",
+
+                "city": "十堰"
+
+            },
+
+            {
+
+                "code": "421300",
+
+                "city": "随州"
+
+            },
+
+            {
+
+                "code": "430500",
+
+                "city": "邵阳"
+
+            },
+
+            {
+
+                "code": "440200",
+
+                "city": "韶关"
+
+            },
+
+            {
+
+                "code": "440300",
+
+                "city": "深圳"
+
+            },
+
+            {
+
+                "code": "440500",
+
+                "city": "汕头"
+
+            },
+
+            {
+
+                "code": "441500",
+
+                "city": "汕尾"
+
+            },
+
+            {
+
+                "code": "460200",
+
+                "city": "三亚"
+
+            },
+
+            {
+
+                "code": "510900",
+
+                "city": "遂宁"
+
+            },
+
+            {
+
+                "code": "542200",
+
+                "city": "山南地区"
+
+            },
+
+            {
+
+                "code": "611000",
+
+                "city": "商洛"
+
+            },
+
+            {
+
+                "code": "640200",
+
+                "city": "石嘴山"
+
+            }
+
+        ],
+
+        [
+
+            {
+
+                "code": "120100",
+
+                "city": "天津"
+
+            },
+
+            {
+
+                "code": "130200",
+
+                "city": "唐山"
+
+            },
+
+            {
+
+                "code": "140100",
+
+                "city": "太原"
+
+            },
+
+            {
+
+                "code": "150500",
+
+                "city": "通辽"
+
+            },
+
+            {
+
+                "code": "211200",
+
+                "city": "铁岭"
+
+            },
+
+            {
+
+                "code": "220500",
+
+                "city": "通化"
+
+            },
+
+            {
+
+                "code": "321200",
+
+                "city": "泰州"
+
+            },
+
+            {
+
+                "code": "331000",
+
+                "city": "台州"
+
+            },
+
+            {
+
+                "code": "340700",
+
+                "city": "铜陵"
+
+            },
+
+            {
+
+                "code": "370900",
+
+                "city": "泰安"
+
+            },
+
+            {
+
+                "code": "522200",
+
+                "city": "铜仁地区"
+
+            },
+
+            {
+
+                "code": "610200",
+
+                "city": "铜川"
+
+            },
+
+            {
+
+                "code": "620500",
+
+                "city": "天水"
+
+            },
+
+            {
+
+                "code": "652100",
+
+                "city": "吐鲁番地区"
+
+            },
+
+            {
+
+                "code": "654200",
+
+                "city": "塔城地区"
+
+            },
+
+            {
+
+                "code": "710100",
+
+                "city": "台北"
+
+            },
+
+            {
+
+                "code": "710300",
+
+                "city": "台南"
+
+            },
+
+            {
+
+                "code": "710400",
+
+                "city": "台中"
+
+            }
+
+        ],
+
+        [
+
+            {
+
+                "code": "150300",
+
+                "city": "乌海"
+
+            },
+
+            {
+
+                "code": "150900",
+
+                "city": "乌兰察布"
+
+            },
+
+            {
+
+                "code": "320200",
+
+                "city": "无锡"
+
+            },
+
+            {
+
+                "code": "330300",
+
+                "city": "温州"
+
+            },
+
+            {
+
+                "code": "340200",
+
+                "city": "芜湖"
+
+            },
+
+            {
+
+                "code": "370700",
+
+                "city": "潍坊"
+
+            },
+
+            {
+
+                "code": "371000",
+
+                "city": "威海"
+
+            },
+
+            {
+
+                "code": "420100",
+
+                "city": "武汉"
+
+            },
+
+            {
+
+                "code": "450400",
+
+                "city": "梧州"
+
+            },
+
+            {
+
+                "code": "532600",
+
+                "city": "文山壮族苗族自治州"
+
+            },
+
+            {
+
+                "code": "610500",
+
+                "city": "渭南"
+
+            },
+
+            {
+
+                "code": "620600",
+
+                "city": "武威"
+
+            },
+
+            {
+
+                "code": "640300",
+
+                "city": "吴忠"
+
+            },
+
+            {
+
+                "code": "650100",
+
+                "city": "乌鲁木齐"
+
+            }
+
+        ],
+
+        [
+
+            {
+
+                "code": "130500",
+
+                "city": "邢台"
+
+            },
+
+            {
+
+                "code": "140900",
+
+                "city": "忻州"
+
+            },
+
+            {
+
+                "code": "152200",
+
+                "city": "兴安盟"
+
+            },
+
+            {
+
+                "code": "152500",
+
+                "city": "锡林郭勒盟"
+
+            },
+
+            {
+
+                "code": "320300",
+
+                "city": "徐州"
+
+            },
+
+            {
+
+                "code": "341800",
+
+                "city": "宣城"
+
+            },
+
+            {
+
+                "code": "350200",
+
+                "city": "厦门"
+
+            },
+
+            {
+
+                "code": "360500",
+
+                "city": "新余"
+
+            },
+
+            {
+
+                "code": "410700",
+
+                "city": "新乡"
+
+            },
+
+            {
+
+                "code": "411000",
+
+                "city": "许昌"
+
+            },
+
+            {
+
+                "code": "411500",
+
+                "city": "信阳"
+
+            },
+
+            {
+
+                "code": "420600",
+
+                "city": "襄阳"
+
+            },
+
+            {
+
+                "code": "420900",
+
+                "city": "孝感"
+
+            },
+
+            {
+
+                "code": "421200",
+
+                "city": "咸宁"
+
+            },
+
+            {
+
+                "code": "430300",
+
+                "city": "湘潭"
+
+            },
+
+            {
+
+                "code": "433100",
+
+                "city": "湘西土家族苗族自治州"
+
+            },
+
+            {
+
+                "code": "532800",
+
+                "city": "西双版纳"
+
+            },
+
+            {
+
+                "code": "610100",
+
+                "city": "西安"
+
+            },
+
+            {
+
+                "code": "610400",
+
+                "city": "咸阳"
+
+            },
+
+            {
+
+                "code": "630100",
+
+                "city": "西宁"
+
+            },
+
+            {
+
+                "code": "710800",
+
+                "city": "新竹"
+
+            },
+
+            {
+
+                "code": "810100",
+
+                "city": "香港岛"
+
+            },
+
+            {
+
+                "code": "810300",
+
+                "city": "新界"
+
+            }
+
+        ],
+
+        [
+
+            {
+
+                "code": "140300",
+
+                "city": "阳泉"
+
+            },
+
+            {
+
+                "code": "140800",
+
+                "city": "运城"
+
+            },
+
+            {
+
+                "code": "210800",
+
+                "city": "营口"
+
+            },
+
+            {
+
+                "code": "222400",
+
+                "city": "延边朝鲜族自治州"
+
+            },
+
+            {
+
+                "code": "230700",
+
+                "city": "伊春"
+
+            },
+
+            {
+
+                "code": "320900",
+
+                "city": "盐城"
+
+            },
+
+            {
+
+                "code": "321000",
+
+                "city": "扬州"
+
+            },
+
+            {
+
+                "code": "360600",
+
+                "city": "鹰潭"
+
+            },
+
+            {
+
+                "code": "360900",
+
+                "city": "宜春"
+
+            },
+
+            {
+
+                "code": "370600",
+
+                "city": "烟台"
+
+            },
+
+            {
+
+                "code": "420500",
+
+                "city": "宜昌"
+
+            },
+
+            {
+
+                "code": "430600",
+
+                "city": "岳阳"
+
+            },
+
+            {
+
+                "code": "430900",
+
+                "city": "益阳"
+
+            },
+
+            {
+
+                "code": "431100",
+
+                "city": "永州"
+
+            },
+
+            {
+
+                "code": "441700",
+
+                "city": "阳江"
+
+            },
+
+            {
+
+                "code": "445300",
+
+                "city": "云浮"
+
+            },
+
+            {
+
+                "code": "450900",
+
+                "city": "玉林"
+
+            },
+
+            {
+
+                "code": "511500",
+
+                "city": "宜宾"
+
+            },
+
+            {
+
+                "code": "511800",
+
+                "city": "雅安"
+
+            },
+
+            {
+
+                "code": "530400",
+
+                "city": "玉溪"
+
+            },
+
+            {
+
+                "code": "610600",
+
+                "city": "延安"
+
+            },
+
+            {
+
+                "code": "610800",
+
+                "city": "榆林"
+
+            },
+
+            {
+
+                "code": "632700",
+
+                "city": "玉树藏族自治州"
+
+            },
+
+            {
+
+                "code": "640100",
+
+                "city": "银川"
+
+            },
+
+            {
+
+                "code": "654000",
+
+                "city": "伊犁哈萨克自治州"
+
+            }
+
+        ],
+
+        [
+
+            {
+
+                "code": "130700",
+
+                "city": "张家口"
+
+            },
+
+            {
+
+                "code": "321100",
+
+                "city": "镇江"
+
+            },
+
+            {
+
+                "code": "330800",
+
+                "city": "衢州"
+
+            },
+
+            {
+
+                "code": "330900",
+
+                "city": "舟山"
+
+            },
+
+            {
+
+                "code": "341600",
+
+                "city": "亳州"
+
+            },
+
+            {
+
+                "code": "350600",
+
+                "city": "漳州"
+
+            },
+
+            {
+
+                "code": "370300",
+
+                "city": "淄博"
+
+            },
+
+            {
+
+                "code": "370400",
+
+                "city": "枣庄"
+
+            },
+
+            {
+
+                "code": "410100",
+
+                "city": "郑州"
+
+            },
+
+            {
+
+                "code": "411600",
+
+                "city": "周口"
+
+            },
+
+            {
+
+                "code": "411700",
+
+                "city": "驻马店"
+
+            },
+
+            {
+
+                "code": "430200",
+
+                "city": "株洲"
+
+            },
+
+            {
+
+                "code": "430800",
+
+                "city": "张家界"
+
+            },
+
+            {
+
+                "code": "440400",
+
+                "city": "珠海"
+
+            },
+
+            {
+
+                "code": "440800",
+
+                "city": "湛江"
+
+            },
+
+            {
+
+                "code": "441200",
+
+                "city": "肇庆"
+
+            },
+
+            {
+
+                "code": "442000",
+
+                "city": "中山"
+
+            },
+
+            {
+
+                "code": "510300",
+
+                "city": "自贡"
+
+            },
+
+            {
+
+                "code": "512000",
+
+                "city": "资阳"
+
+            },
+
+            {
+
+                "code": "520300",
+
+                "city": "遵义"
+
+            },
+
+            {
+
+                "code": "530600",
+
+                "city": "昭通"
+
+            },
+
+            {
+
+                "code": "620700",
+
+                "city": "张掖"
+
+            },
+
+            {
+
+                "code": "640500",
+
+                "city": "中卫"
+
+            }
+
+        ]
+
+        
+	]
+}

+ 45 - 0
page_index/pages/index/noticeDetail.vue

@@ -0,0 +1,45 @@
+<template>
+	<view class="content">
+		<view class="title">{{pageData.title}}</view>
+		<view class="container">{{pageData.container}}</view>
+	</view>
+</template>
+
+<script>
+	import $api from '@/static/js/api.js'
+	export default {
+		data() {
+			return{
+				pageData: {
+					title: '扫码就能取款,真的是太方便了',
+					container: '根据《中华人民共和国价格法》《中华人民共和国商业银行法》'
+				}
+			}
+		},
+		onLoad() {
+			
+		},
+		methods: {
+			
+		}
+	}
+</script>
+
+<style scoped lang="scss"> 
+	.content {
+		background-color: #fff;
+		padding: 0 30rpx;
+		.title {
+			width: 100%;
+			margin: 40rpx 0 24rpx;
+			font-size: 40rpx;
+			line-height: 56rpx;
+			color: #222;
+		}
+		.container {
+			font-size: 36rpx;
+			color: #444;
+			line-height: 50rpx;
+		}
+	}
+</style>

+ 106 - 0
page_index/pages/index/noticeList.vue

@@ -0,0 +1,106 @@
+<template>
+	<view class="content">
+		<view class="list">
+			<block v-for="(item,index) in pageList" :key="index">
+				<view class="item vflex">
+					<view class="hflex acenter">
+						<view class="read" v-if="item.is_read"></view>
+						<view class="name">{{item.title}}</view>
+					</view>
+					<view class="container">{{item.content}}</view>
+					<view class="hflex acenter jbetween">
+						<view class="text_style1">{{item.create_time}}</view>
+						<view class="hflex acenter" @click="toDetail(item.id)">
+							<view class="text_style2">查看详情</view>
+							<image src="/static/images/comment/right.png" mode="widthFix" style="width: 28rpx;"></image>
+						</view>
+					</view>
+				</view>
+			</block>
+		</view>
+	</view>
+</template>
+
+<script>
+	import $api from '@/static/js/api.js'
+	export default {
+		data() {
+			return {
+				pageList: [
+					{
+						id: 0,
+						is_read: false,
+						title: '您有新的积分待领取',
+						content: '一周悄悄过去留下小秘密,来瞧瞧上周的消费了多少吧,你的钱都花在哪里了呢',
+						create_time: '2022-10-28 16:58',
+					},
+					{
+						id: 1,
+						is_read: true,
+						title: '您有新的积分待领取',
+						content: '一周悄悄过去留下小秘密,来瞧瞧上周的消费了多少吧,你的钱都花在哪里了呢',
+						create_time: '2022-10-28 16:58',
+					}
+				]
+			}
+		},
+		onLoad() {
+			
+		},
+		methods: {
+			// 打开详情
+			toDetail(id) {
+				$api.jump('/page_index/pages/index/noticeDetail?id=' + id)
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content {
+		background-color: #f4f4f4;
+		padding: 20rpx 30rpx 0;
+		
+		.list {
+			
+			.item {
+				margin-bottom: 20rpx;
+				width: 100%;
+				background: #fff;
+				border-radius: 20rpx;
+				box-sizing: border-box;
+				padding: 32rpx 20rpx 26rpx;
+				
+				.read {
+					width: 12rpx;
+					height: 12rpx;
+					background-color: #ff4040;
+					border-radius: 50%;
+					margin-right: 16rpx;
+				}
+				.name {
+					font-size: 32rpx;
+					color: #222;
+				}
+				.container {
+					width: 100%;
+					padding: 24rpx 0;
+					border-bottom: 1rpx solid #f4f4f4;
+					font-size: 28rpx;
+					color: #878787;
+					line-height: 40rpx;
+					margin-bottom: 30rpx;
+				}
+				.text_style1 {
+					font-size: 28rpx;
+					color: #888;
+				}
+				.text_style2 {
+					font-size: 28rpx;
+					color: #222;
+					margin-right: 5rpx;
+				}
+			}
+		}
+	}
+</style>

+ 116 - 0
page_mine/pages/collect/collect.vue

@@ -0,0 +1,116 @@
+<template>
+	<view class="content">
+		<view class="tabs hflex acenter jbetween">
+			<block v-for="(item,index) in tabs" :key="index">
+				<view class="tabs_item" :class="active == item.id? 'active': ''" @click="changeTabs(item.id)">{{item.text}}</view>
+			</block>
+		</view>		
+		<view class="tabs">
+			<view v-if="active == 1">
+				<block v-for="(item,index) in pageList" :key="index">
+					<news-module :title="item.title" :imgs="item.imgs" :type="item.type" :client="item.client" :comment="item.comment"></news-module>
+				</block>
+			</view>
+			<view v-if="active == 3">
+				<block v-for="(item,index) in pageList1" :key="index">
+					<pur-order :order_no="item.order_no" :type="item.type" :name="item.name" :contacts="item.contacts" :phone="item.phone" :delivery_date="item.delivery_date"></pur-order>
+				</block>
+			</view>
+		</view>		
+	</view>
+</template>
+
+<script>
+	import $api from '@/static/js/api.js'
+	var that = ''
+	export default {
+		data() {
+			return {
+				tabs: [
+					{
+						id: 1,
+						text: '知识教学'
+					},
+					{
+						id: 2,
+						text: '百知文库'
+					},
+					{
+						id: 3,
+						text: '采购订单'
+					},
+					{
+						id: 4,
+						text: '船厂'
+					}
+				],
+				active: 1,
+				pageList: [
+					{
+						id: 1,
+						title: '2022年上半年十部好剧,《开端》第7名,《人世间》第4名,值得观看',
+						imgs: [
+							"/static/images/index/class_img1.png",
+							"/static/images/index/class_img1.png",
+							"/static/images/index/class_img1.png"
+						],
+						type: '资讯',
+						client: '澎湃新闻客户端',
+						commnet: 77
+					}
+				],
+				pageList1: [
+					{
+						id: 1,
+						order_no: 'cbz1234567',
+						type: '采购订单',
+						name: '福建船舶有限公司',
+						contacts: '张宇书',
+						phone: '19823021433',
+						delivery_date: '2022-11-03',
+					}
+				]
+			}
+		},
+		onLoad() {
+			that = this
+		},
+		methods: {
+			// 切换tabs
+			changeTabs(id) {
+				that.active = id
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content {
+		padding: 0 30rpx;
+		.tabs {
+			width: 100%;
+			margin: 14rpx 0 46rpx;
+			.tabs_item {
+				width: 25%;
+				text-align: center;
+				font-size: 32rpx;
+				color: #222;
+				font-weight: 400;
+			}
+			.active {
+				font-weight: 500;
+				position: relative;
+			}
+			.active::after {
+				position: absolute;
+				content: "";
+				width: 48rpx;
+				height: 8rpx;
+				background-color: #506Dff;
+				border-radius: 4rpx;
+				bottom: -14rpx;
+				left: 35%;
+			}
+		}
+	}
+</style>

+ 219 - 0
page_mine/pages/member/index.vue

@@ -0,0 +1,219 @@
+<template>
+	<view class="content">
+		<view class="top">
+			<view class="text" v-if="is_member">会员已与{{member_date}}过期</view>
+			<view class="text" v-else>开通会员,立享多种特权</view>
+		</view>
+		<view class="box">
+			<view class="title">全年VIP</view>
+			<view class="price">¥{{price}}<span style="font-size: 40rpx;">/年</span></view>
+			<view class="title" style="margin: 36rpx 0 20rpx;">会员权益</view>
+			<u-parse :content="text"></u-parse>
+
+		</view>
+		<view class="bottom">
+			<view class="hflex acenter">
+				<u-checkbox-group @change="checkboxChange">
+					<u-checkbox v-model="agree" shape="circle"></u-checkbox>
+				</u-checkbox-group>
+				<view class="text">已阅读并同意<span class="read" @click="open(0)">《会员服务协议》</span></view>
+			</view>
+			<view class="button hflex acenter jcenter" @click="openMember">
+				<view>确定协议并开通</view>
+			</view>
+		</view>
+		<u-popup :show="pay_show" @close="close" mode="bottom" :round="20" :closeable="true">
+			<view class="popup">
+				<view class="title">立即支付</view>
+				<view class="price">¥{{price}}</view>
+				<view class="text1">支付方式</view>
+				<view class="box1 hflex acenter jbetween">
+					<view class="hflex acenter">
+						<u-icon name="weixin-circle-fill" color="#506dff" size="24"></u-icon>
+						<view class="box_right">微信支付</view>
+					</view>
+					<u-checkbox-group @change="checkboxChange1">
+						<u-checkbox v-model="agree1" :checked="true" shape="circle"></u-checkbox>
+					</u-checkbox-group>
+				</view>
+				<view class="btn" @click="pay">立即支付</view>
+			</view>
+		</u-popup>
+	</view>
+</template>
+
+<script>
+	import $api from '@/static/js/api.js'
+	var that = ''
+	export default {
+		data() {
+			return {
+				text: `
+					<p>权益说明:</p>
+					<p>1.纯净去广告,优质外刊原著精读,导师领读;</p>
+					<p>2.纯净去广告,优质外刊原著精读,导师领读;</p>
+					<p>3.纯净去广告,优质外刊原著精读,导师领读;</p>
+					<p>4.纯净去广告,优质外刊原著精读,导师领读,纯净去广告,优质外刊原著精读,导师领读;</p>
+				`,
+				agree: false,
+				agree1: true,
+				pay_show: false,
+				price: 588,
+				is_member: 1,
+				member_date: '2022-12-01'
+			}
+		},
+		onLoad() {
+			that = this
+		},
+		methods: {
+			// 阅读并同意
+			checkboxChange(n) {
+				this.agree = !this.agree
+			},
+			// 选择支付方式
+			checkboxChange1(n) {
+				this.agree1 = !this.agree1
+			},
+			// 确定协议并开通
+			openMember() {
+				if(that.agree) {
+					that.pay_show = true
+				} else {
+					$api.info('请先阅读并同意《会员服务协议》')
+				}
+				
+			},
+			// 关闭弹窗
+			close() {
+				that.pay_show = false
+			},
+			// 立即支付
+			pay() {
+				if(that.agree1) {
+					that.pay_show = true
+				} else {
+					$api.info('请先选择支付方式')
+				}
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content {
+		background-color: #e4e8f4;
+		.top {
+			background: url('/static//images/mine/member_bg.png') no-repeat;
+			background-size: 100%;
+			width: 100%;
+			height: 480rpx;
+			.text {
+				font-size: 26rpx;
+				color: #fff;
+				padding: 332rpx 0 0 84rpx;
+			}
+		}
+		.box {
+			width: 100%;
+			height: calc(100vh - 480rpx);
+			background-color: #fff;
+			border-radius: 40rpx 40rpx 0 0;
+			box-sizing: border-box;
+			padding: 36rpx 30rpx;
+			margin-bottom: 246rpx;
+			.title {
+				font-size: 40rpx;
+				color: #444;
+			}
+			.price {
+				font-size: 60rpx;
+				color: #ff2626;
+				padding:34rpx 0 52rpx;
+				border-bottom: 1rpx solid #f2f2f2;
+			}
+		}
+		.bottom {
+			width: 100%;
+			height: 246rpx;
+			background-color: #fff;
+			box-shadow: 0 -2rpx 16rpx 0 rgba(215,215,215,0.5);
+			position: fixed;
+			bottom: 0;
+			box-sizing: border-box;
+			padding: 36rpx 30rpx;
+			.text {
+				font-size: 24rpx;
+				color: #9c9c9c;
+			}
+			.read {
+				color: #2a63f3;
+			}
+			.button {
+				width: 690rpx;
+				height: 96rpx;
+				background-color: #506dff;
+				border-radius: 50rpx;
+				box-shadow: 0 4rpx 28rpx 0 rgba(132,123,255,0.4);
+				font-size: 40rpx;
+				color: #fff;
+				margin: 40rpx 0 36rpx;
+			}
+		}
+		.popup {
+			width: 100%;
+			box-sizing: border-box;
+			padding: 48rpx 30rpx;
+			background-color: #fff;
+			.title {
+				width: 100%;
+				text-align: center;
+				font-size: 36rpx;
+				color: #222;
+				margin-bottom: 50rpx;
+			}
+			.price {
+				width: 100%;
+				text-align: center;
+				font-size: 60rpx;
+				color: #ff2626;
+				margin-bottom: 36rpx;
+			}
+			.text1 {
+				font-size: 30rpx;
+				color: #222;
+				margin-bottom: 28rpx;
+			}
+			.box1 {
+				width: 100%;
+				box-sizing: border-box;
+				padding: 36rpx 20rpx;
+				background-color: #f6f6f6;
+				border-radius: 20rpx;
+				.box_img {
+					width: 48rpx;
+					height: 48rpx;
+				}
+				.box_right {
+					margin-left: 20rpx;
+					font-size: 26rpx;
+					color: #555;
+				}
+				
+			}
+			.btn {
+				margin-top: 166rpx;
+				width: 670rpx;
+				height: 96rpx;
+				background-color: #506dff;
+				border-radius: 50rpx;
+				box-shadow: 0 4rpx 28rpx 0 rgba(132,123,255,0.4);
+				font-size: 40rpx;
+				color: #fff;
+				text-align: center;
+				line-height: 96rpx;
+				// margin: 40rpx 0 36rpx;
+			}
+		}
+	}
+</style>

+ 58 - 0
page_mine/pages/message/detail.vue

@@ -0,0 +1,58 @@
+<template>
+	<view class="content">
+		<view class="box">
+			<view class="hflex acenter">
+				<view class="dian" v-if="is_read"></view>
+				<view class="title">{{title}}</view>
+			</view>
+			<u-parse :content="text"></u-parse>
+		</view>
+	</view>
+</template>
+
+<script>
+	import $api from '@/static/js/api.js'
+	var that = ''
+	export default {
+		data() {
+			return {
+				id: '',
+				title: '',
+				text: '',
+				is_read: 0
+			}
+		},
+		onLoad(options) {
+			that = this
+			that.id = options.id
+		},
+		methods: {
+			
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content {
+		background-color: #F4f4f4;
+		padding: 20rpx 30rpx 0;
+		.box {
+			width: 100%;
+			box-sizing: border-box;
+			padding: 48rpx 20rpx;
+			background-color: #fff;
+			border-radius: 24rpx;
+			.dian {
+				width: 12rpx;
+				height: 12rpx;
+				border-radius: 50%;
+				background-color: #ff4646;
+				margin-right: 8rpx;
+			}
+			.title {
+				font-size: 32rpx;
+				color: #222;
+			}
+		}
+	}
+</style>

+ 119 - 0
page_mine/pages/message/message.vue

@@ -0,0 +1,119 @@
+<template>
+	<view class="content">
+		<view class="list">
+			<block v-for="(item,index) in pageList" :key="index">
+				<view class="list_item hflex acenter" @click="toDetail(item.id)">
+					<image class="item_img" :src="item.img"></image>
+					<view class="number" v-if="item.read_num > 0">{{item.read_num}}</view>
+					<view class="item_right">
+						<view class="hflex acenter jbetween">
+							<view class="hflex acenter">
+								<view class="name">{{item.name}}</view>
+								<view class="text_style2" v-if="item.is_guanfang">官方</view>
+							</view>
+							<view class="text_style1">{{item.date}}</view>
+						</view>
+						<view class="text_style1">{{item.content}}</view>
+					</view>
+				</view>
+			</block>
+		</view>
+	</view>
+</template>
+
+<script>
+	import $api from '@/static/js/api.js'
+	var that = ''
+	export default {
+		data() {
+			return {
+				pageList: [
+					{
+						id: 1,
+						img: '/static/images/mine/avatar1.jpg',
+						name: '系统通知',
+						date: '11-01',
+						content: '【有奖调研】程序员求职意向度调查',
+						read_num: 6,
+						is_guanfang: 0
+					},
+					{
+						id: 2,
+						img: '/static/images/mine/avatar2.jpg',
+						name: '系统通知',
+						date: '11-01',
+						content: '【有奖调研】程序员求职意向度调查',
+						is_guanfang: 1
+					}
+				]
+			}
+		},
+		onLoad() {
+			that = this
+		},
+		methods: {
+			// 查看详情
+			toDetail(id) {
+				$api.jump('/page_mine/pages/message/detail?id=' + id)
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content {
+		padding: 0 30rpx;
+		background-color: #fff;
+		.list {
+			width: 100%;
+			.list_item {
+				width: 100%;
+				margin: 48rpx 0 36rpx;
+				position: relative;
+				.item_img {
+					width: 88rpx;
+					height: 88rpx;
+					border-radius: 50%;
+					
+				}
+				.number {
+					position: absolute;
+					top: 5rpx;
+					left: 70rpx;
+					width: 32rpx;
+					height: 32rpx;
+					background-color: #ff4b4b;
+					border: 1rpx solid #fff;
+					border-radius: 50%;
+					font-size: 24rpx;
+					color: #fff;
+					text-align: center;
+					line-height: 32rpx;
+				}
+				.item_right {
+					width: calc(100% - 108rpx);
+					padding-left: 20rpx;
+					.name {
+						font-size: 28rpx;
+						color: #222;
+					}
+					.text_style1 {
+						font-size: 24rpx;
+						color: #999;
+					}
+					.text_style2 {
+						margin-left: 10rpx;
+						width: 56rpx;
+						height: 28rpx;
+						border-radius: 8rpx;
+						border: 1rpx solid #506dff;
+						font-size: 20rpx;
+						color: #506dff;
+						text-align: center;
+						line-height: 28rpx;
+					}
+				}
+			}
+		}
+	}
+</style>

+ 126 - 0
page_mine/pages/order/oceanShipping.vue

@@ -0,0 +1,126 @@
+<template>
+	<view class="content">
+		<view class="tabs hflex acenter jbetween">
+			<block v-for="(item,index) in tabs" :key="index">
+				<view class="tabs_item" :class="active == item.id? 'active': ''" @click="changeTabs(item.id)">{{item.text}}</view>
+			</block>
+		</view>
+		<view class="box">
+			<block v-for="(item,index) in pageList" :key="index">
+				<my-order :order_no="item.order_no" :type="item.type" :good="item.goods" :offer="item.offer" order_type="4"></my-order>
+			</block>
+		</view>
+	</view>
+	
+</template>
+
+<script>
+	import $api from '@/static/js/api.js'
+	var that = ''
+	export default {
+		data() {
+			return {
+				tabs: [
+					{
+						id: 1,
+						text: '未报价'
+					},
+					{
+						id: 2,
+						text: '已报价'
+					},
+					{
+						id: 3,
+						text: '已匹配'
+					}
+				],
+				active: 1,
+				pageList: [
+					{
+						id: 1,
+						order_no: 'cbz1234567',
+						type: '0',
+						goods: [
+							{
+								id: 1,
+								name: '非离子表面活性剂',
+								num: 3,
+								norm: 15
+							},
+							{
+								id: 2,
+								name: '非离子表面活性剂',
+								num: 3,
+								norm: 15
+							}
+						],
+						offer: '1999.89'
+					},
+					{
+						id: 2,
+						order_no: 'cbz1234567',
+						type: '1',
+						goods: [
+							{
+								id: 1,
+								name: '非离子表面活性剂',
+								num: 3,
+								norm: 15
+							},
+							{
+								id: 2,
+								name: '非离子表面活性剂',
+								num: 3,
+								norm: 15
+							}
+						],
+						offer: '1999.89'
+					}
+				]
+			}
+		},
+		onLoad() {
+			that = this
+		},
+		methods: {
+			// 切换tabs
+			changeTabs(id) {
+				that.active = id
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content {
+		background: #f4f4f4;
+		.tabs {
+			width: 100%;
+			background-color: #fff;
+			box-sizing: border-box;
+			padding: 20rpx 40rpx;
+			.tabs_item {
+				font-size: 32rpx;
+				color: #242424;
+			}
+			.active {
+				color: #222;
+				position: relative;
+			}
+			.active::after {
+				content: "";
+				position: absolute;
+				width: 48rpx;
+				height: 8rpx;
+				background-color: #506dff;
+				border-radius: 4rpx;
+				bottom: -14rpx;
+				left: 24rpx;
+			}
+			
+		}
+		.box {
+			padding: 0 30rpx;
+		}
+	}
+</style>

+ 126 - 0
page_mine/pages/order/outsourcing.vue

@@ -0,0 +1,126 @@
+<template>
+	<view class="content">
+		<view class="tabs hflex acenter jbetween">
+			<block v-for="(item,index) in tabs" :key="index">
+				<view class="tabs_item" :class="active == item.id? 'active': ''" @click="changeTabs(item.id)">{{item.text}}</view>
+			</block>
+		</view>
+		<view class="box">
+			<block v-for="(item,index) in pageList" :key="index">
+				<my-order :order_no="item.order_no" :type="item.type" :good="item.goods" :offer="item.offer" order_type="2"></my-order>
+			</block>
+		</view>
+	</view>
+	
+</template>
+
+<script>
+	import $api from '@/static/js/api.js'
+	var that = ''
+	export default {
+		data() {
+			return {
+				tabs: [
+					{
+						id: 1,
+						text: '未报价'
+					},
+					{
+						id: 2,
+						text: '已报价'
+					},
+					{
+						id: 3,
+						text: '已匹配'
+					}
+				],
+				active: 1,
+				pageList: [
+					{
+						id: 1,
+						order_no: 'cbz1234567',
+						type: '0',
+						goods: [
+							{
+								id: 1,
+								name: '日常采购CZ-318',
+								num: 3,
+								norm: 15
+							},
+							{
+								id: 2,
+								name: '日常采购CZ-318',
+								num: 3,
+								norm: 15
+							}
+						],
+						offer: '1999.89'
+					},
+					{
+						id: 2,
+						order_no: 'cbz1234567',
+						type: '1',
+						goods: [
+							{
+								id: 1,
+								name: '日常采购CZ-318',
+								num: 3,
+								norm: 15
+							},
+							{
+								id: 2,
+								name: '日常采购CZ-318',
+								num: 3,
+								norm: 15
+							}
+						],
+						offer: '1999.89'
+					}
+				]
+			}
+		},
+		onLoad() {
+			that = this
+		},
+		methods: {
+			// 切换tabs
+			changeTabs(id) {
+				that.active = id
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content {
+		background: #f4f4f4;
+		.tabs {
+			width: 100%;
+			background-color: #fff;
+			box-sizing: border-box;
+			padding: 20rpx 40rpx;
+			.tabs_item {
+				font-size: 32rpx;
+				color: #242424;
+			}
+			.active {
+				color: #222;
+				position: relative;
+			}
+			.active::after {
+				content: "";
+				position: absolute;
+				width: 48rpx;
+				height: 8rpx;
+				background-color: #506dff;
+				border-radius: 4rpx;
+				bottom: -14rpx;
+				left: 24rpx;
+			}
+			
+		}
+		.box {
+			padding: 0 30rpx;
+		}
+	}
+</style>

+ 126 - 0
page_mine/pages/order/production.vue

@@ -0,0 +1,126 @@
+<template>
+	<view class="content">
+		<view class="tabs hflex acenter jbetween">
+			<block v-for="(item,index) in tabs" :key="index">
+				<view class="tabs_item" :class="active == item.id? 'active': ''" @click="changeTabs(item.id)">{{item.text}}</view>
+			</block>
+		</view>
+		<view class="box">
+			<block v-for="(item,index) in pageList" :key="index">
+				<my-order :order_no="item.order_no" :type="item.type" :good="item.goods" :offer="item.offer" order_type="1"></my-order>
+			</block>
+		</view>
+	</view>
+	
+</template>
+
+<script>
+	import $api from '@/static/js/api.js'
+	var that = ''
+	export default {
+		data() {
+			return {
+				tabs: [
+					{
+						id: 1,
+						text: '未报价'
+					},
+					{
+						id: 2,
+						text: '已报价'
+					},
+					{
+						id: 3,
+						text: '已匹配'
+					}
+				],
+				active: 1,
+				pageList: [
+					{
+						id: 1,
+						order_no: 'cbz1234567',
+						type: '0',
+						goods: [
+							{
+								id: 1,
+								name: '非离子表面活性剂',
+								num: 3,
+								norm: 15
+							},
+							{
+								id: 2,
+								name: '非离子表面活性剂',
+								num: 3,
+								norm: 15
+							}
+						],
+						offer: '1999.89'
+					},
+					{
+						id: 2,
+						order_no: 'cbz1234567',
+						type: '1',
+						goods: [
+							{
+								id: 1,
+								name: '非离子表面活性剂',
+								num: 3,
+								norm: 15
+							},
+							{
+								id: 2,
+								name: '非离子表面活性剂',
+								num: 3,
+								norm: 15
+							}
+						],
+						offer: '1999.89'
+					}
+				]
+			}
+		},
+		onLoad() {
+			that = this
+		},
+		methods: {
+			// 切换tabs
+			changeTabs(id) {
+				that.active = id
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content {
+		background: #f4f4f4;
+		.tabs {
+			width: 100%;
+			background-color: #fff;
+			box-sizing: border-box;
+			padding: 20rpx 40rpx;
+			.tabs_item {
+				font-size: 32rpx;
+				color: #242424;
+			}
+			.active {
+				color: #222;
+				position: relative;
+			}
+			.active::after {
+				content: "";
+				position: absolute;
+				width: 48rpx;
+				height: 8rpx;
+				background-color: #506dff;
+				border-radius: 4rpx;
+				bottom: -14rpx;
+				left: 24rpx;
+			}
+			
+		}
+		.box {
+			padding: 0 30rpx;
+		}
+	}
+</style>

+ 130 - 0
page_mine/pages/order/purchase.vue

@@ -0,0 +1,130 @@
+<template>
+	<view class="content">
+		<view class="tabs hflex acenter jbetween">
+			<block v-for="(item,index) in tabs" :key="index">
+				<view class="tabs_item" :class="active == item.id? 'active': ''" @click="changeTabs(item.id)">{{item.text}}</view>
+			</block>
+		</view>
+		<view class="box">
+			<block v-for="(item,index) in pageList" :key="index">
+				<my-order :order_no="item.order_no" :type="item.type" :good="item.goods" :offer="item.offer" order_type="3"></my-order>
+			</block>
+		</view>
+	</view>
+	
+</template>
+
+<script>
+	import $api from '@/static/js/api.js'
+	var that = ''
+	export default {
+		data() {
+			return {
+				tabs: [
+					{
+						id: 1,
+						text: '未报价'
+					},
+					{
+						id: 2,
+						text: '已报价'
+					},
+					{
+						id: 3,
+						text: '已匹配'
+					}
+				],
+				active: 1,
+				pageList: [
+					{
+						id: 1,
+						order_no: 'cbz1234567',
+						type: '0',
+						goods: [
+							{
+								id: 1,
+								name: '非离子表面活性剂',
+								num: 3,
+								norm: 15,
+								text: '质量标准:按照国家三级标准规定,按照国家三级标准规定,按照国家三级标准规定'
+							},
+							{
+								id: 2,
+								name: '非离子表面活性剂',
+								num: 3,
+								norm: 15,
+								text: '质量标准:按照国家三级标准规定,按照国家三级标准规定,按照国家三级标准规定'
+							}
+						],
+						offer: '1999.89'
+					},
+					{
+						id: 2,
+						order_no: 'cbz1234567',
+						type: '1',
+						goods: [
+							{
+								id: 1,
+								name: '非离子表面活性剂',
+								num: 3,
+								norm: 15,
+								text: '质量标准:按照国家三级标准规定,按照国家三级标准规定,按照国家三级标准规定'
+							},
+							{
+								id: 2,
+								name: '非离子表面活性剂',
+								num: 3,
+								norm: 15,
+								text: '质量标准:按照国家三级标准规定,按照国家三级标准规定,按照国家三级标准规定'
+							}
+						],
+						offer: '1999.89'
+					}
+				]
+			}
+		},
+		onLoad() {
+			that = this
+		},
+		methods: {
+			// 切换tabs
+			changeTabs(id) {
+				that.active = id
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content {
+		background: #f4f4f4;
+		.tabs {
+			width: 100%;
+			background-color: #fff;
+			box-sizing: border-box;
+			padding: 20rpx 40rpx;
+			.tabs_item {
+				font-size: 32rpx;
+				color: #242424;
+			}
+			.active {
+				color: #222;
+				position: relative;
+			}
+			.active::after {
+				content: "";
+				position: absolute;
+				width: 48rpx;
+				height: 8rpx;
+				background-color: #506dff;
+				border-radius: 4rpx;
+				bottom: -14rpx;
+				left: 24rpx;
+			}
+			
+		}
+		.box {
+			padding: 0 30rpx;
+		}
+	}
+</style>

+ 144 - 0
page_mine/pages/order/repair.vue

@@ -0,0 +1,144 @@
+<template>
+	<view class="content">
+		<view class="top hflex acenter jbetween">
+			<view class="top_item" :class="active1 == 1 ? 'active1':''" @click="changeType(1)">我是船老板</view>
+			<view class="top_item" :class="active1 == 2 ? 'active1':''" @click="changeType(2)">我是维修工</view>
+		</view>
+		<view class="order">
+			<view class="tabs hflex acenter jbetween">
+				<block v-for="(item,index) in tabs" :key="index">
+					<view class="tabs_item" :class="active == item.id? 'active': ''" @click="changeTabs(item.id)">{{item.text}}</view>
+				</block>
+			</view>
+			<view class="box">
+				<block v-for="(item,index) in pageList" :key="index">
+					<my-order :active1="active1" :order_no="item.order_no" :type="item.type" :name="item.name" :repair_date="item.repair_date" :address="item.address" :is_urgent="item.is_urgent" order_type="5"></my-order>
+				</block>
+			</view>
+		</view>
+	</view>
+	
+</template>
+
+<script>
+	import $api from '@/static/js/api.js'
+	var that = ''
+	export default {
+		data() {
+			return {
+				tabs: [
+					{
+						id: 1,
+						text: '未报价'
+					},
+					{
+						id: 2,
+						text: '已报价'
+					},
+					{
+						id: 3,
+						text: '已匹配'
+					}
+				],
+				active: 1,
+				active1: 1,
+				pageList: [
+					{
+						id: 1,
+						order_no: 'cbz1234567',
+						type: '0',
+						name: '昨天晚上开始船舱一直往里面漏水,早上忽冷忽热,不知道什么原因,请速来维修',
+						repair_date: '2022-11-04~12-04',
+						address: '浦东区 滨河路 江东造船厂',
+						is_urgent: 1,
+						offer: '1999.89'
+					},
+					{
+						id: 1,
+						order_no: 'cbz1234567',
+						type: '0',
+						name: '昨天晚上开始船舱一直往里面漏水,早上忽冷忽热,不知道什么原因,请速来维修',
+						repair_date: '2022-11-04~12-04',
+						address: '浦东区 滨河路 江东造船厂',
+						is_urgent: 0,
+						offer: '1999.89'
+					}
+				]
+			}
+		},
+		onLoad() {
+			that = this
+		},
+		methods: {
+			// 切换tabs
+			changeTabs(id) {
+				that.active = id
+			},
+			// 切换身份
+			changeType(id) {
+				that.active1 = id
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content {
+		background: #f4f4f4;
+		.top {
+			width: 650rpx;
+			height: 80rpx;
+			margin: 20rpx auto;
+			background-color: #fff;
+			border-radius: 40rpx;
+			.top_item {
+				width: 50%;
+				height: 68rpx;
+				text-align: center;
+				font-size: 30rpx;
+				color: #222;
+				line-height: 68rpx;
+			}
+			.active1 {
+				width: 320rpx;
+				height: 68rpx;
+				border-radius: 34rpx;
+				background-color: #506dff;
+				color: #fff;
+			}
+		}
+		.order {
+			width: 100%;
+			background-color: linear-gradient(180deg, #fff 0%, rgba(255,255,255,0) 100%);
+			border-radius: 40rpx 40rpx 0 0;
+		}
+		.tabs {
+			width: 100%;
+			// background-color: linear-gradient(180deg, #fff 0%, rgba(255,255,255,0) 100%);
+			box-sizing: border-box;
+			padding: 20rpx 40rpx;
+			.tabs_item {
+				font-size: 32rpx;
+				color: #242424;
+			}
+			.active {
+				color: #222;
+				position: relative;
+			}
+			.active::after {
+				content: "";
+				position: absolute;
+				width: 48rpx;
+				height: 8rpx;
+				background-color: #506dff;
+				border-radius: 4rpx;
+				bottom: -14rpx;
+				left: 24rpx;
+			}
+			
+		}
+		.box {
+			padding: 0 30rpx;
+		}
+	}
+</style>

+ 8 - 7
uview-ui/components/u-loading-page/u-loading-page.vue → page_mine/pages/service/applyMaintenance.vue

@@ -1,25 +1,26 @@
 <template>
-	<view class="u-loading-page">
+	<view class="content">
 		
 	</view>
 </template>
 
 <script>
+	import $api from '@/static/js/api.js'
+	var that = ''
 	export default {
-		props: {
-			
-		},
 		data() {
 			return {
 				
 			}
 		},
+		onLoad() {
+			that = this
+		},
 		methods: {
 			
-		}
+		},
 	}
 </script>
 
 <style lang="scss" scoped>
-	
-</style>
+</style>

+ 330 - 0
page_mine/pages/service/joinPerson.vue

@@ -0,0 +1,330 @@
+<template>
+	<view class="content">
+		<view class="" v-if="state == 0 || state == 1">
+			<view class="top hflex acenter" v-if="state == 1">
+				<image src="/static/images/comment/person.png" class="top_img"></image>
+				<view class="top_text">你已成功加入人才库</view>
+			</view>
+			<view class="box" style="margin-top: 20rpx;">
+				<view class="box_title">基本信息</view>
+				<view class="hflex acenter jbetween cell">
+					<view class="left">姓名</view>
+					<u-input v-model="userInfo.name" placeholder="请输入您的姓名" inputAlign="right" border="none"></u-input>
+				</view>
+				<picker @change="bindSexChange" :value="index" :range="sexList">
+					<view class="hflex acenter jbetween cell">
+						<view class="left">性别</view>
+						<u-input border="none" v-model="sexList[userInfo.sex]" placeholder="请选择您的性别" suffixIcon="arrow-right" suffixIconStyle="color: #b7b7b7" inputAlign="right"></u-input>
+					</view>
+				</picker>
+				<picker @change="bindAgeChange" :value="index" :range="ageList">
+					<view class="hflex acenter jbetween cell">
+						<view class="left">年龄</view>
+						<u-input border="none" v-model="ageList[userInfo.age]" placeholder="请选择您的年龄" suffixIcon="arrow-right" suffixIconStyle="color: #b7b7b7" inputAlign="right"></u-input>
+					</view>
+				</picker>
+				<view class="hflex acenter jbetween cell">
+					<view class="left">籍贯</view>
+					<u-input v-model="userInfo.place" placeholder="请输入您的籍贯" inputAlign="right" border="none"></u-input>
+				</view>
+				<view class="hflex acenter jbetween cell">
+					<view class="left">电话</view>
+					<u-input v-model="userInfo.phone" placeholder="请输入您的电话" inputAlign="right" border="none"></u-input>
+				</view>
+				<view class="hflex acenter jbetween cell">
+					<view class="left">邮箱</view>
+					<u-input v-model="userInfo.email" placeholder="请输入您的邮箱" inputAlign="right" border="none"></u-input>
+				</view>
+				<picker mode="region" @change="changeAddress" :value="index" >
+					<view class="hflex acenter jbetween cell">
+						<view class="left">所在地区</view>
+						<u-input border="none" inputAlign="right" v-model="userInfo.region" placeholder="请选择省市区" suffixIcon="arrow-right" suffixIconStyle="color: #b7b7b7"></u-input>
+					</view>
+				</picker>
+				<view class="hflex acenter jbetween cell">
+					<view class="left">详细地址</view>
+					<u-input v-model="address" placeholder="街道,楼牌号等" inputAlign="right" border="none"></u-input>
+				</view>
+				<picker @change="bindEduChange" :value="index" :range="educationList">
+					<view class="hflex acenter jbetween cell">
+						<view class="left">学历</view>
+						<u-input border="none" v-model="educationList[userInfo.education]" placeholder="请选择您的学历" suffixIcon="arrow-right" suffixIconStyle="color: #b7b7b7" inputAlign="right"></u-input>
+					</view>
+				</picker>
+				<view class="hflex acenter jbetween cell">
+					<view class="left">个人特长</view>
+					<u-input v-model="userInfo.specialty" placeholder="请输入您的特长" inputAlign="right" border="none"></u-input>
+				</view>
+				<view class="hflex acenter jbetween cell">
+					<view class="left">技能</view>
+					<u-input v-model="userInfo.skill" placeholder="请输入您的技能描述" inputAlign="right" border="none"></u-input>
+				</view>
+				<picker @change="bindTitleChange" :value="index" :range="titleList">
+					<view class="hflex acenter jbetween cell">
+						<view class="left">职称选择</view>
+						<u-input border="none" v-model="titleList[userInfo.title]" placeholder="请选择您的职称" suffixIcon="arrow-right" suffixIconStyle="color: #b7b7b7" inputAlign="right"></u-input>
+					</view>
+				</picker>
+			</view>
+			<view class="box">
+				<view class="box_title">简历及相关信息</view>
+				<view class="box_title">工作履历</view>
+				<view class="box_subTitle">请填写您近年来的工作经历</view>
+				<u-input v-model="userInfo.work" border="bottom"></u-input>
+				<view class="box_title">资质证书</view>
+				<view class="box_subTitle">至少上传一张专业证书(包含毕业证书),证书请完整展示姓名,证书名称,证书日期及有效期</view>
+				<view class="upload">
+					<u-upload :fileList="userInfo.imgList" @afterRead="afterRead" @delete="deletePic" :maxCount="10" name="1" multiple :previewFullImage="true" width="110" height="110">
+						<image src="/static/images/comment/upload.png" style="width: 220rpx;height: 220rpx;"></image>
+					</u-upload>
+				</view>
+				<view class="box_title">培训经历</view>
+				<view class="box_subTitle">请详细描述您的培训经历</view>
+				<u-input v-model="userInfo.train" border="bottom"></u-input>
+				<view class="bottom" v-if="state == 0">
+					<view class="btn" @click="submit">提交</view>
+				</view>
+			</view>
+		</view>
+		<view class="box1 vflex acenter" v-if="state == 2">
+			<image src="/static/images/comment/wait.png" class="box1_img"></image>
+			<view class="box1_title">审核中</view>
+			<view class="box1_subTitle">预计审核时间3个工作日</view>
+			<view class="box1_subTitle">请留意当前页面变动</view>
+			<view class="btn" @click="result">返回</view>
+		</view>
+		<view class="box1 vflex acenter" v-if="state == 3">
+			<image src="/static/images/comment/error.png" class="box1_img"></image>
+			<view class="box1_title">审核失败</view>
+			<view class="box1_subTitle">驳回原因</view>
+			<view class="box1_subTitle">{{reason}}<span style="color: #506dff;margin-left: 8rpx;" @click="edit">立即修改></span></view>
+			<view class="btn" @click="result">返回</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import $api from '@/static/js/api.js'
+	var that = ''
+	export default {
+		data() {
+			return {
+				userInfo: {
+					name: '',	//姓名
+					sex: '',	//性别
+					age: '',	//年龄
+					place: '',	//籍贯
+					phone: '',	//电话
+					email: '',	//邮箱
+					region: '',	//所在地区
+					address: '',	//详细地址
+					education: '',	//学历
+					specialty: '',	//特长
+					skill: '',	//技能
+					title: '',	//职称
+					work: '',	//工作经历
+					imgList: [],	//资质证明
+					train: '',	//培训经历
+				},
+				sexList: ['男','女'],
+				ageList: ['18','19','20','21','22','23','24','25','26','27','28','29','30','31','32','33','34','35','36','37','38','39','40','41','42','43','44','45','46','47','48','49','50'],
+				educationList: ['初中','高中','专科','本科','研究生','博士'],
+				titleList: ['初级','中级','高级','特级'],
+				state: 3,	//0 未加入,1 已加入,2 审核中, 3审核失败
+				reason: '资料填写不完整',	//驳回原因
+			}
+		},
+		onLoad() {
+			that = this
+		},
+		methods: {
+			// 选择性别
+			bindSexChange(e) {
+				that.userInfo.sex = e.detail.value
+			},
+			// 选择年龄
+			bindAgeChange(e) {
+				that.userInfo.age = e.detail.value
+			},
+			// 选择所在地区
+			changeAddress(e) {
+				console.log(e);
+				that.userInfo.region = e.detail.value[0] + '-' + e.detail[1] + '-' + e.detail[2]
+			},
+			// 选择学历
+			bindEduChange(e) {
+				that.userInfo.education = e.detail.value
+			},
+			// 选择职称
+			bindTitleChange(e) {
+				that.userInfo.title = e.detail.value
+			},
+			// 删除图片
+			deletePic(event) {
+				that.userInfo.imgList.splice(event.index, 1)
+			},
+			// 新增图片
+			async afterRead(event) {
+				// 当设置 multiple 为 true 时, file 为数组格式,否则为对象格式
+				let lists = [].concat(event.file)
+				let imgListLen = this.userInfo.imgList.length
+				lists.map((item) => {
+					this.userInfo.imgList.push({
+						...item,
+						status: 'uploading',
+						message: '上传中'
+					})
+				})
+				for (let i = 0; i < lists.length; i++) {
+					const result = await this.uploadFilePromise(lists[i].url)
+					let item = this.userInfo.imgList[imgListLen]
+					this.userInfo.imgList.splice(imgListLen, 1, Object.assign(item, {
+						status: 'success',
+						message: '',
+						url: result
+					}))
+					imgListLen++
+				}
+			},
+			// 上传图片
+			uploadFilePromise(url) {
+				return new Promise((resolve, reject) => {
+					let a = uni.uploadFile({
+						url: 'http://192.168.2.21:7001/upload', // 仅为示例,非真实的接口地址
+						filePath: url,
+						name: 'file',
+						formData: {
+							user: 'test'
+						},
+						success: (res) => {
+							setTimeout(() => {
+								resolve(res.data.data)
+							}, 1000)
+						}
+					});
+				})
+			},
+			// 立即修改
+			edit() {
+				that.state = 0
+			},
+			// 返回
+			result() {
+				$api.jump(-1)
+			},
+			// 提交
+			submit() {
+				var u = that.userInfo
+				if ($api.formCheck(u.name,'truename') && $api.formCheck(u.sex,'required') && $api.formCheck(u.age,'required') && $api.formCheck(u.phone,'mobile') && $api.formCheck(u.email,'email')) {
+					$api.jump('/pages/tabbar/mine/mine',3)
+				} 
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content::v-deep {
+		background-color: #f4f4f4;
+		// padding-top: 20rpx;
+		.top {
+			width: 100%;
+			height: 60rpx;
+			background-color: #f8efe2;
+			padding: 20rpx 32rpx;
+			box-sizing: border-box;
+			.top_img {
+				width: 36rpx;
+				height: 36rpx;
+			}
+			.top_text {
+				font-size: 26rpx;
+				margin-left: 6rpx;
+				color: #330e00;
+			}
+		}
+		.box {
+			width: 100%;
+			background-color: #fff;
+			margin-bottom: 20rpx;
+			box-sizing: border-box;
+			padding: 28rpx 30rpx;
+			.box_title {
+				font-size: 30rpx;
+				color: #222;
+				margin: 20rpx 0 32rpx;
+			}
+			.box_subTitle {
+				font-size: 26rpx;
+				color: #b7b7b7;
+				// margin: ;
+			}
+			.upload {
+				margin-top: 20rpx;
+				width: 100%;
+				padding-bottom: 20rpx;
+				border-bottom: 1rpx solid #f4f4f4;
+			}
+			.u-input {
+				width: 100%;
+				margin-top: 30rpx;
+			}
+			.cell {
+				width: 100%;
+				padding: 20rpx 0;
+				.left {
+					font-size: 28rpx;
+					color: #222;
+				}
+				.u-input {
+					font-size: 28rpx;
+					color: #222;
+				}
+			}
+			.bottom {
+				margin: 80rpx 0 50rpx;
+				.btn {
+					width: 100%;
+					height: 88rpx;
+					border-radius: 44rpx;
+					text-align: center;
+					line-height: 88rpx;
+					background-color: #506dff;
+					font-size: 36rpx;
+					color: #fff;
+				}
+			}
+		}
+		.box1 {
+			width: 100%;
+			height: 100vh;
+			background-color: #fff;
+			.box1_img {
+				width: 124rpx;
+				height: 124rpx;
+				margin: 108rpx 0 40rpx;
+			}
+			.box1_title {
+				font-size: 32rpx;
+				color: #222;
+				margin-bottom: 24rpx;
+			}
+			.box1_subTitle {
+				margin: 12rpx 0;
+				font-size: 26rpx;
+				color: #595959;
+			}
+			.btn {
+				width: 530rpx;
+				height: 88rpx;
+				background-color: #506dff;
+				color: #fff;
+				text-align: center;
+				line-height: 88rpx;
+				border-radius: 44rpx;
+				font-size: 36rpx;
+				margin-top: 122rpx;
+			}
+		}
+	}
+</style>

+ 61 - 0
page_mine/pages/setting/about.vue

@@ -0,0 +1,61 @@
+<template>
+	<view class="content">
+		<view class="box vflex acenter jcenter">
+			<view class="logo hflex acenter jcenter">
+				<image src="/static/images/index/logo.png" class="logo_image"></image>
+			</view>
+			<view class="text_style1">船百知</view>
+			<view class="text_style2">1.0.0</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import $api from '@/static/js/api.js'
+	var that = ''
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		onLoad() {
+			that = this
+		},
+		methods: {
+			
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content {
+		background-color: #f4f4f4;
+		padding: 24rpx 30rpx 0;
+		.box {
+			width: 100%;
+			height: 416rpx;
+			background: #fff;
+			border-radius: 24rpx;
+			.logo {
+				width: 156rpx;
+				height: 156rpx;
+				background-color: #eef1ff;
+				border-radius: 40rpx;
+				.logo_image {
+					width: 136rpx;
+					height: 52rpx;
+				}
+			}
+			.text_style1 {
+				font-size: 32rpx;
+				color: #222;
+				margin: 28rpx 0 10rpx;
+			}
+			.text_style2 {
+				font-size: 32rpx;
+				color: #b2b2b2;
+			}
+		}
+	}
+</style>

+ 106 - 0
page_mine/pages/setting/account_info.vue

@@ -0,0 +1,106 @@
+<template>
+	<view class="content">
+		<view class="cell-group">
+			<view class="hflex acenter jbetween cell">
+				<view class="left">手机号码</view>
+				<view class="hflex acenter">
+					<view class="right">{{user.phone}}</view>
+					<u-icon name="arrow-right" color="#000" size="10"></u-icon>
+				</view>
+			</view>
+			<view class="hflex acenter jbetween cell" @click="bindEmail">
+				<view class="left">邮箱</view>
+				<view class="hflex acenter">
+					<view class="right">{{user.e_mail}}</view>
+					<u-icon name="arrow-right" color="#000" size="10"></u-icon>
+				</view>
+			</view>
+		</view>
+		<view class="cell-group">
+			<view class="hflex acenter jbetween cell" @click="editPwd">
+				<view class="left">密码</view>
+				<view class="hflex acenter">
+					<view class="right">修改密码</view>
+					<u-icon name="arrow-right" color="#000" size="10"></u-icon>
+				</view>
+			</view>
+			<view class="hflex acenter jbetween cell">
+				<view class="left">账号注销</view>
+				<view class="hflex acenter">
+					<u-icon name="arrow-right" color="#000" size="10"></u-icon>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import $api from '@/static/js/api.js'
+	var that = ''
+	export default {
+		data() {
+			return {
+				user: {
+					phone: '13412341234',
+					e_mail: '1377642262@qq.com',
+				}
+			}
+		},
+		onLoad() {
+			that = this
+		},
+		methods: {
+			// 绑定邮箱
+			bindEmail() {
+				$api.jump('/page_mine/pages/setting/bind_eMail')
+			},
+			// 修改密码
+			editPwd() {
+				$api.jump('/page_mine/pages/setting/edit_pwd')
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content {
+		background-color: #f5f5f5;
+		.cell-group {
+			width: 100%;
+			background-color: #fff;
+			margin-top: 20rpx;
+			padding: 0 30rpx;
+			box-sizing: border-box;
+			.cell {
+				box-sizing: border-box;
+				padding: 36rpx 0;
+				border-bottom: 1rpx solid #f5f5f5;
+				.left {
+					font-size: 30rpx;
+					color: #222;
+				}
+				.right {
+					padding: 0 5rpx;
+					font-size: 30rpx;
+					color: #444;
+				}
+				.red {
+					width: 12rpx;
+					height: 12rpx;
+					border-radius: 50%;
+					background-color: #fb3e32;
+				}
+				.avatar {
+					width: 88rpx;
+					height: 88rpx;
+					border-radius: 50%;
+				}
+			}
+			.button {
+				font-size: 36rpx;
+				color: #506dff;
+				padding: 20rpx 0;
+			}
+		}
+	}
+</style>

+ 47 - 0
page_mine/pages/setting/bind_eMail.vue

@@ -0,0 +1,47 @@
+<template>
+	<view class="content">
+		<view class="">
+			<u-input v-model="email" border="bottom" placeholder="请输入邮箱账号"></u-input>
+			<view class="btn">确定</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import $api from '@/static/js/api.js'
+	var that = ''
+	export default {
+		data() {
+			return {
+				email: '',
+			}
+		},
+		onLoad() {
+			that = this
+		},
+		methods: {
+			
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content::v-deep {
+		background-color: #fff;
+		padding: 32rpx 30rpx 0;
+		.u-input {
+			padding: 28rpx 0 !important;
+		}
+		.btn {
+			margin: 112rpx auto 0;
+			width: 630rpx;
+			height: 92rpx;
+			border-radius: 50rpx;
+			background-color: #506dff;
+			color: #fff;
+			font-size: 36rpx;
+			text-align: center;
+			line-height: 92rpx;
+		}
+	}
+</style>

+ 56 - 0
page_mine/pages/setting/edit_pwd.vue

@@ -0,0 +1,56 @@
+<template>
+	<view class="content">
+		<view class="">
+			<u-input v-model="oldPwd" border="bottom" placeholder="请输入原密码"></u-input>
+			<u-input v-model="newPwd" border="bottom" placeholder="请输入新密码"></u-input>
+			<view class="text_style1">密码格式为6-16位数字,字母或符号</view>
+		</view>
+		<view class="btn">完成</view>
+	</view>
+</template>
+
+<script>
+	import $api from '@/static/js/api.js'
+	var that = ''
+	export default {
+		data() {
+			return {
+				oldPwd: '',
+				newPwd: '',
+			}
+		},
+		onLoad() {
+			that = this
+		},
+		methods: {
+			
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content::v-deep {
+		background-color: #fff;
+		padding: 0 30rpx 0;
+		.u-input {
+			padding: 28rpx 0 !important;
+			margin-top: 32rpx;
+		}
+		.btn {
+			margin: 112rpx auto 0;
+			width: 630rpx;
+			height: 92rpx;
+			border-radius: 50rpx;
+			background-color: #506dff;
+			color: #fff;
+			font-size: 36rpx;
+			text-align: center;
+			line-height: 92rpx;
+		}
+		.text_style1 {
+			font-size: 24rpx;
+			color: #999;
+			margin-top: 32rpx;
+		}
+	}
+</style>

+ 108 - 0
page_mine/pages/setting/personal.vue

@@ -0,0 +1,108 @@
+<template>
+	<view class="content">
+		<view class="cell-group">
+			<view class="hflex acenter jbetween cell">
+				<view class="left">头像</view>
+				<view class="hflex acenter">
+					<image :src="user.imgs" class="avatar"></image>
+					<u-icon name="arrow-right" color="#000" size="10"></u-icon>
+				</view>
+			</view>
+			<view class="hflex acenter jbetween cell">
+				<view class="left">昵称</view>
+				<view class="hflex acenter">
+					<view class="right">{{user.name}}</view>
+					<u-icon name="arrow-right" color="#000" size="10"></u-icon>
+				</view>
+			</view>
+			<view class="hflex acenter jbetween cell">
+				<view class="left">性别</view>
+				<view class="hflex acenter">
+					<view class="right">{{user.sex}}</view>
+					<u-icon name="arrow-right" color="#000" size="10"></u-icon>
+				</view>
+			</view>
+		</view>
+		<view class="cell-group">
+			<view class="hflex acenter jbetween cell" @click="toReal">
+				<view class="left">实名认证</view>
+				<view class="hflex acenter">
+					<view class="red"></view>
+					<view class="right">{{user.real}}</view>
+					<u-icon name="arrow-right" color="#000" size="10"></u-icon>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import $api from '@/static/js/api.js'
+	var that = ''
+	export default {
+		data() {
+			return {
+				user: {
+					imgs: '/static/images/mine/avatar2.jpg',
+					name: '放风筝的人',
+					sex: '男',
+					real: '待实名认证',
+					realState: false
+				}
+			}
+		},
+		onLoad() {
+			that = this
+		},
+		methods: {
+			// 去实名认证
+			toReal() {
+				console.log(that.user.realState);
+				$api.jump('/page_mine/pages/setting/real_name?state=' + that.user.realState)
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content {
+		background-color: #f5f5f5;
+		.cell-group {
+			width: 100%;
+			background-color: #fff;
+			margin-top: 20rpx;
+			padding: 0 30rpx;
+			box-sizing: border-box;
+			.cell {
+				box-sizing: border-box;
+				padding: 36rpx 0;
+				border-bottom: 1rpx solid #f5f5f5;
+				.left {
+					font-size: 30rpx;
+					color: #222;
+				}
+				.right {
+					padding: 0 5rpx;
+					font-size: 30rpx;
+					color: #444;
+				}
+				.red {
+					width: 12rpx;
+					height: 12rpx;
+					border-radius: 50%;
+					background-color: #fb3e32;
+				}
+				.avatar {
+					width: 88rpx;
+					height: 88rpx;
+					border-radius: 50%;
+				}
+			}
+			.button {
+				font-size: 36rpx;
+				color: #506dff;
+				padding: 20rpx 0;
+			}
+		}
+	}
+</style>

+ 161 - 0
page_mine/pages/setting/real_name.vue

@@ -0,0 +1,161 @@
+<template>
+	<view class="content">
+		<view class="" v-if="state">
+			<view class="box">
+				<view class="vflex jcenter box_top">
+					<view class="text_style1">{{name}}</view>
+					<view class="text_style1">{{idNumber}}</view>
+				</view>
+				<view class="text_style2">个人隐私信息安全保障中</view>
+			</view>
+		</view>
+		<view class="" v-else>
+			<view class="title">
+				<view>实名认证</view>
+				<view class="subTitle">为保障您的资金安全、提升您的账号信用、请您如实填写您的身份信息</view>
+			</view>
+			<view class="form">
+				<view class="form_item">
+					<view class="title">真实姓名</view>
+					<u-input v-model="name" border="bottom" placeholder="请填写您本人的真实姓名"></u-input>
+				</view>
+				<view class="form_item">
+					<view class="title">身份证号</view>
+					<u-input v-model="idNumber" border="bottom" placeholder="请填写您的身份证号"></u-input>
+				</view>
+			</view>	
+			<view class="hflex acenter">
+				<u-checkbox-group @change="checkboxChange">
+					<u-checkbox v-model="agree" shape="circle"></u-checkbox>
+				</u-checkbox-group>
+				<view class="text">阅读并同意<span class="read" @click="open(0)">《实名认证授权》</span>、<span class="read" @click="open(1)">《船百知隐私政策》</span></view>
+			</view>
+			<view class="button hflex acenter jcenter" @click="login">
+				<view>人脸认证</view>
+			</view>
+		</view>
+		
+	</view>
+</template>
+
+<script>
+	import $api from '@/static/js/api.js'
+	var that = ''
+	export default {
+		data() {
+			return {
+				name: '',
+				idNumber: '',
+				agree: false,
+				showProtocol: false,
+				protocolTitle: '',
+				protocolContent: '',
+				state: false,
+			}
+		},
+		onLoad(options) {
+			that = this
+			that.state = options.state
+			console.log(options);
+		},
+		methods: {
+			// 阅读并同意
+			checkboxChange(n) {
+				this.agree = !this.agree
+			},
+			// 打开弹出层
+			open(index) {
+				const that = this
+				// if(index == 0) {
+				// 	$api.req({
+				// 		url: '/api/Publics/config_info'
+				// 	}, function(res) {
+				// 		if (res.code == 1) {
+				// 			that.protocolTitle = '用户协议'
+				// 			that.protocolContent = res.data.xieyi
+				// 		}
+				// 	})
+					
+				// } else {
+				// 	that.protocolTitle = '隐私政策'
+				// 	that.protocolContent = ''
+				// }
+				// that.showProtocol = true
+			},
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content::v-deep {
+		padding: 0 30rpx;
+		background-color: #fff;
+		.title {
+			margin-top: 40rpx;
+			width: 100%;
+			font-size: 48rpx;
+			color: #222;
+		}
+		.subTitle {
+			padding-top: 12rpx;
+			font-size: 26rpx;
+			color: #888;
+			line-height: 36rpx;
+		}
+		.form {
+			width: 100%;
+			margin: 30rpx 0;
+			.form_item {
+				
+				.title {
+					font-size: 28rpx;
+					color: #444;
+				}
+				.u-input {
+					padding: 28rpx 0 !important;
+				}
+			}
+		}
+		.text {
+			font-size: 24rpx;
+			color: #9c9c9c;
+		}
+		.read {
+			color: #2a63f3;
+		}
+		.button {
+			width: 100%;
+			height: 96rpx;
+			background-color: #506dff;
+			border-radius: 50rpx;
+			box-shadow: 0 4rpx 28rpx 0 rgba(132,123,255,0.4);
+			font-size: 40rpx;
+			color: #fff;
+			margin: 106rpx 0 36rpx;
+		}
+		.box {
+			margin-top: 40rpx;
+			background: url('/static/images/mine/real-bg.png') no-repeat;
+			background-size: 100%;
+			width: 100%;
+			height: 268rpx;
+			.box_top {
+				width: 100%;
+				box-sizing: border-box;
+				padding: 42rpx 0 42rpx 244rpx;
+			}
+			.text_style1 {
+				font-size: 36rpx;
+				color: #fff;
+				margin-top: 18rpx;
+			}
+			.text_style2 {
+				width: 100%;
+				box-sizing: border-box;
+				padding: 0 0 0 60rpx;
+				font-size: 20rpx;
+				color: #fff;
+			}
+		}
+	}
+</style>

+ 34 - 0
page_mine/pages/setting/rules.vue

@@ -0,0 +1,34 @@
+<template>
+	<view class="content">
+		<view class="box">
+			<u-parse :content="text"></u-parse>
+		</view>
+	</view>
+</template>
+
+<script>
+	import $api from '@/static/js/api.js'
+	var that = ''
+	export default {
+		data() {
+			return {
+				text: ''
+			}
+		},
+		onLoad() {
+			that = this
+		},
+		methods: {
+			
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content {
+		padding: 30rpx;
+		.box {
+			width: 100%;
+		}
+	}
+</style>

+ 92 - 0
page_mine/pages/setting/setting.vue

@@ -0,0 +1,92 @@
+<template>
+	<view class="content">
+		<view class="cell-group">
+			<view class="hflex acenter jbetween cell" @click="toPersonal">
+				<view class="left">个人设置</view>
+				<u-icon name="arrow-right" color="#000" size="10"></u-icon>
+			</view>
+			<view class="hflex acenter jbetween cell" @click="toAccount">
+				<view class="left">账号信息</view>
+				<u-icon name="arrow-right" color="#000" size="10"></u-icon>
+			</view>
+		</view>
+		<view class="cell-group">
+			<view class="hflex acenter jbetween cell" @click="about">
+				<view class="left">关于我们</view>
+				<u-icon name="arrow-right" color="#000" size="10"></u-icon>
+			</view>
+			<view class="hflex acenter jbetween cell" @click="rules">
+				<view class="left">平台规则</view>
+				<u-icon name="arrow-right" color="#000" size="10"></u-icon>
+			</view>
+		</view>
+		<view class="cell-group hflex acenter jcenter">
+			<view class="button" @click="quit">退出登录</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import $api from '@/static/js/api.js'
+	var that = ''
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		onLoad() {
+			that = this
+		},
+		methods: {
+			// 个人信息
+			toPersonal() {
+				$api.jump('/page_mine/pages/setting/personal')
+			},
+			// 账号信息
+			toAccount() {
+				$api.jump('/page_mine/pages/setting/account_info')
+			},
+			// 关于我们
+			about() {
+				$api.jump('/page_mine/pages/setting/about')
+			},
+			// 平台规则
+			rules() {
+				$api.jump('/page_mine/pages/setting/rules')
+			},
+			// 退出登录
+			quit() {
+				uni.removeStorageSync("token")
+				$api.jump('/pages/tabbar/mine/mine',3)
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content {
+		background-color: #f5f5f5;
+		.cell-group {
+			width: 100%;
+			background-color: #fff;
+			margin-top: 20rpx;
+			padding: 0 30rpx;
+			box-sizing: border-box;
+			.cell {
+				box-sizing: border-box;
+				padding: 36rpx 0;
+				border-bottom: 1rpx solid #f5f5f5;
+				.left {
+					font-size: 30rpx;
+					color: #222;
+				}
+			}
+			.button {
+				font-size: 36rpx;
+				color: #506dff;
+				padding: 20rpx 0;
+			}
+		}
+	}
+</style>

+ 122 - 0
page_mine/pages/wallet/wallet.vue

@@ -0,0 +1,122 @@
+<template>
+	<view class="content">
+		<view class="top">
+			<view class="text1">我的余额(元)</view>
+			<view class="hflex acenter ">
+				<view class="money">{{money}}</view>
+				<view class="money_btn" @click="toWithdraw">提现</view>
+			</view>
+		</view>
+		<view class="list">
+			<view class="list_title">收支明细</view>
+			<block v-for="(item,index) in pageList" :key="index">
+				<view class="list_item hflex acenter jbetween">
+					<view class="vflex">
+						<view class="text_style1">{{item.name}}</view>
+						<view class="text_style2">{{item.date}}</view>
+					</view>
+					<view class="text_style3">-{{item.money}}</view>
+				</view>
+			</block>
+		</view>
+	</view>
+</template>
+
+<script>
+	import $api from '@/static/js/api.js'
+	var that = ''
+	export default {
+		data() {
+			return {
+				money: '348.98',
+				pageList: [
+					{
+						id: 1,
+						name: '银行卡提现',
+						date: '2022-11-01 16:58:00',
+						money: '79.34'
+					},
+					{
+						id: 2,
+						name: '银行卡提现',
+						date: '2022-11-01 16:58:00',
+						money: '79.34'
+					}
+				]
+			}
+		},
+		onLoad() {
+			that = this
+		},
+		methods: {
+			// 去提现
+			toWithdraw() {
+				$api.jump('/page_mine/pages/wallet/withdrawal')
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content {
+		padding: 20rpx 30rpx 0;
+		.top {
+			width: 100%;
+			height: 244rpx;
+			box-sizing: border-box;
+			padding: 56rpx 40rpx 0;
+			background: url('/static/images/comment/bg.png') no-repeat;
+			background-size: 100%;
+			.text1 {
+				font-size: 24rpx;
+				color: #fff;
+				margin-bottom: 24rpx;
+			}
+			.money {
+				font-size: 64rpx;
+				color: #fff;
+				margin-right: 36rpx;
+			}
+			.money_btn {
+				width: 132rpx;
+				height: 48rpx;
+				border-radius: 34rpx;
+				border: 1rpx solid #fff;
+				text-align: center;
+				line-height: 48rpx;
+				font-size: 26rpx;
+				color: #fff;
+			}
+		}
+		.list {
+			width: 100%;
+			margin-top: 36rpx;
+			.list_title {
+				font-size: 30rpx;
+				color: #333;
+			}
+			.list_item {
+				width: 100%;
+				box-sizing: border-box;
+				padding: 28rpx 0;
+				border-bottom: 1rpx solid #f4f4f4;
+				.text_style1 {
+					font-size: 26rpx;
+					color: #666;
+					margin-bottom: 8rpx;
+				} 
+				.text_style2 {
+					font-size: 22rpx;
+					color: #bfbfbf;
+				}
+				.text_style3 {
+					color: #ff2626;
+					font-size: 30rpx;
+				}
+			}
+			.list_item:nth-last-child(1) {
+				border-bottom: none;
+			}
+		}
+	}
+</style>

+ 136 - 0
page_mine/pages/wallet/withdrawal.vue

@@ -0,0 +1,136 @@
+<template>
+	<view class="content">
+		<view class="box">
+			<view class="text_style1">可以提现金额</view>
+			<view class="money">{{money}}</view>
+			<view class="hflex acenter jbetween cell">
+				<view class="text_style2">提现至</view>
+				<view class="hflex acenter">
+					<view class="text_style3">中国招商银行</view>
+					<u-icon name="arrow-right" color="#000" size="10"></u-icon>
+				</view>
+			</view>
+			<view class="cell1">
+				<view class="text_style2">提现金额</view>
+				<u-input v-model="value" placeholder="请输入提现金额" border="bottom" fontSize="20" @change="change">
+					<view slot="prefix" class="text_style2">¥</view>
+					<template slot="suffix">
+						<view class="text1" @click="all">全部提现</view>
+					</template>
+				</u-input>
+			</view>
+			<view class="cell1 hflex acenter jbetween">
+				<view class="text_style1">提现手续费</view>
+				<view class="text_style2">¥{{service_money}}</view>
+			</view>
+			<view class="cell1 hflex acenter jbetween">
+				<view class="text_style1">实际到账金额</view>
+				<view class="text_style2">¥{{amount}}</view>
+			</view>
+			<view class="bottom">
+				<view class="btn" @click="withdraw">立即提现</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import $api from '@/static/js/api.js'
+	var that = ''
+	export default {
+		data() {
+			return {
+				money: '1008.06',
+				value: '',
+				service: 0.01,
+				service_money: 0,
+				amount: 0,
+			}
+		},
+		onLoad() {
+			that = this
+		},
+		methods: {
+			// 全部体系那
+			all() {
+				that.value = that.money
+				that.service_money = (Number(that.value) * that.service).toFixed(2)
+				that.amount = (that.value - that.service_money).toFixed(2)
+			},
+			// 输入框发生改变
+			change(e) {
+				console.log(typeof(e));
+				that.value = e
+				that.service_money = (Number(that.value) * that.service).toFixed(2)
+				that.amount = (that.value - that.service_money).toFixed(2)
+			},
+			// 立即提现
+			withdraw() {
+				if(that.value > 0) {
+					
+				} else {
+					$api.info("请输入提现金额")
+				}
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content::v-deep {
+		padding: 0 30rpx;
+		.box {
+			margin: 32rpx 0 20rpx;
+			.text_style1 {
+				font-size: 30rpx;
+				color: #666;
+			}
+			.money {
+				font-size: 60rpx;
+				color: #222;
+				margin: 20rpx 0;
+			}
+			.text_style2 {
+				font-size: 28rpx;
+				color: #222;
+			}
+			.cell {
+				padding: 32rpx 0;
+				border-bottom: 1rpx solid #f3f3f3;
+				
+				.text_style3 {
+					font-size: 24rpx;
+					color: #222;
+				}
+			}
+			.cell1 {
+				margin: 32rpx 0;
+				.u-input {
+					width: 100% !important;
+					height: 104rpx !important;
+					font-size: 60rpx !important;
+					box-sizing: border-box;
+					// padding: 30rpx 48rpx !important;
+					margin: 26rpx 0;
+				}
+				.text1 {
+					font-size: 26rpx;
+					color: #506dff;
+				}
+			}
+			.bottom {
+				margin-top: 100rpx;
+				.btn {
+					width: 100%;
+					height: 84rpx;
+					border-radius: 48rpx;
+					background-color: #506dff;
+					text-align: center;
+					line-height: 84rpx;
+					font-size: 36rpx;
+					color: #fff;
+				}
+			}
+		}
+	}
+</style>

+ 221 - 18
pages.json

@@ -1,41 +1,244 @@
 {
+	"easycom": {
+		"^u-(.*)": "@/uni_modules/uview-ui/components/u-$1/u-$1.vue"
+	},
 	"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
 		{
 			"path": "pages/tabbar/index/index",
 			"style": {
-				"navigationBarTitleText": "uni-app"
+				"navigationBarTitleText": "首页",
+				"navigationStyle": "custom"
 			}
 		},
 		{
 			"path": "pages/tabbar/shipyard/shipyard",
 			"style": {
-				"navigationBarTitleText": "uni-app"
+				"navigationBarTitleText": "",
+				"navigationBarBackgroundColor": "#fff"
 			}
 		},
 		{
-			"path": "pages/tabbar/release/release",
+			"path": "pages/tabbar/shop/shop",
 			"style": {
-				"navigationBarTitleText": "uni-app"
+				"navigationBarTitleText": "商城"
 			}
 		},
 		{
-			"path": "pages/tabbar/shop/shop",
+			"path": "pages/tabbar/mine/mine",
 			"style": {
-				"navigationBarTitleText": "uni-app"
+				"navigationBarTitleText": ""
 			}
 		},
 		{
-			"path": "pages/tabbar/mine/mine",
+			"path": "pages/login/register",
+			"style": {
+				"navigationBarTitleText": "注册账号"
+			}
+		},
+		{
+			"path": "pages/login/forgot_pwd",
+			"style": {
+				"navigationBarTitleText": "找回密码",
+				"navigationBarBackgroundColor": "#fff"
+			}
+		},
+		{
+			"path": "pages/login/password_login",
+			"style": {
+				"navigationBarTitleText": "",
+				"navigationBarBackgroundColor": "#fff"
+			}
+		},
+		{
+			"path": "pages/login/code_login",
 			"style": {
-				"navigationBarTitleText": "uni-app"
+				"navigationBarTitleText": "验证码登录",
+				"navigationBarBackgroundColor": "#fff"
 			}
 		}
 	],
+	"subPackages": [
+		{
+			"root": "page_index",
+			"pages": [
+				{
+					"path": "pages/index/changeCity",
+					"style": {
+						"navigationBarTitleText": "选择城市"
+					}
+				},
+				{
+					"path": "pages/index/noticeList",
+					"style": {
+						"navigationBarTitleText": "公告列表"
+					}
+				},
+				{
+					"path": "pages/index/noticeDetail",
+					"style": {
+						"navigationBarTitleText": "文章详情"
+					}
+				}
+			]
+		},
+		{
+			"root": "page_mine",
+			"pages": [
+				{
+					"path": "pages/setting/setting",
+					"style": {
+						"navigationBarTitleText": "设置",
+						"navigationBarBackgroundColor": "#fff"
+					}
+				},
+				{
+					"path": "pages/setting/personal",
+					"style": {
+						"navigationBarTitleText": "个人信息",
+						"navigationBarBackgroundColor": "#fff"
+					}
+				},
+				{
+					"path": "pages/setting/real_name",
+					"style": {
+						"navigationBarTitleText": "",
+						"navigationBarBackgroundColor": "#fff"
+					}
+				},
+				{
+					"path": "pages/setting/account_info",
+					"style": {
+						"navigationBarTitleText": "账号信息",
+						"navigationBarBackgroundColor": "#fff"
+					}
+				},
+				{
+					"path": "pages/setting/bind_eMail",
+					"style": {
+						"navigationBarTitleText": "邮箱绑定",
+						"navigationBarBackgroundColor": "#fff"
+					}
+				},
+				{
+					"path": "pages/setting/edit_pwd",
+					"style": {
+						"navigationBarTitleText": "修改密码",
+						"navigationBarBackgroundColor": "#fff"
+					}
+				},
+				{
+					"path": "pages/setting/about",
+					"style": {
+						"navigationBarTitleText": "关于我们",
+						"navigationBarBackgroundColor": "#fff"
+					}
+				},
+				{
+					"path": "pages/setting/rules",
+					"style": {
+						"navigationBarTitleText": "平台规则",
+						"navigationBarBackgroundColor": "#fff"
+					}
+				},
+				{
+					"path": "pages/message/message",
+					"style": {
+						"navigationBarTitleText": "消息中心",
+						"navigationBarBackgroundColor": "#fff"
+					}
+				},
+				{
+					"path": "pages/message/detail",
+					"style": {
+						"navigationBarTitleText": "消息详情",
+						"navigationBarBackgroundColor": "#fff"
+					}
+				},
+				{
+					"path": "pages/member/index",
+					"style": {
+						"navigationBarTitleText": "会员中心",
+						"navigationBarBackgroundColor": "#fff"
+					}
+				},
+				{
+					"path": "pages/wallet/wallet",
+					"style": {
+						"navigationBarTitleText": "我的余额",
+						"navigationBarBackgroundColor": "#fff"
+					}
+				},
+				{
+					"path": "pages/wallet/withdrawal",
+					"style": {
+						"navigationBarTitleText": "提现",
+						"navigationBarBackgroundColor": "#fff"
+					}
+				},
+				{
+					"path": "pages/collect/collect",
+					"style": {
+						"navigationBarTitleText": "我的收藏",
+						"navigationBarBackgroundColor": "#fff"
+					}
+				},
+				{
+					"path": "pages/order/production",
+					"style": {
+						"navigationBarTitleText": "生产订单",
+						"navigationBarBackgroundColor": "#fff"
+					}
+				},
+				{
+					"path": "pages/order/outsourcing",
+					"style": {
+						"navigationBarTitleText": "外协订单",
+						"navigationBarBackgroundColor": "#fff"
+					}
+				},
+				{
+					"path": "pages/order/purchase",
+					"style": {
+						"navigationBarTitleText": "采购订单",
+						"navigationBarBackgroundColor": "#fff"
+					}
+				},
+				{
+					"path": "pages/order/oceanShipping",
+					"style": {
+						"navigationBarTitleText": "海运订单",
+						"navigationBarBackgroundColor": "#fff"
+					}
+				},
+				{
+					"path": "pages/order/repair",
+					"style": {
+						"navigationBarTitleText": "维修订单",
+						"navigationBarBackgroundColor": "#fff"
+					}
+				},
+				{
+					"path": "pages/service/joinPerson",
+					"style": {
+						"navigationBarTitleText": "船用人才注册",
+						"navigationBarBackgroundColor": "#fff"
+					}
+				},
+				{
+					"path": "pages/service/applyMaintenance",
+					"style": {
+						"navigationBarTitleText": "申请维修工",
+						"navigationBarBackgroundColor": "#fff"
+					}
+				}
+			]
+		}
+	],
 	"tabBar": {
 		"borderStyle": "black",
-		"backgroundColor": "#333",
-		"color": "#8F8F94",
-		"selectedColor": "#f33e54",
+		"backgroundColor": "#ffffff",
+		"color": "#000",
+		"selectedColor": "#4766ff",
 		"list": [{
 				"pagePath": "pages/tabbar/index/index",
 				"iconPath": "static/images/tabbar/home-1.png",
@@ -49,12 +252,6 @@
 				"text": "船厂"
 			},
 			{
-				"pagePath": "pages/tabbar/release/release",
-				"iconPath": "static/images/tabbar/release.png",
-				"selectedIconPath": "static/images/tabbar/release.png",
-				"text": "发布"
-			},
-			{
 				"pagePath": "pages/tabbar/shop/shop",
 				"iconPath": "static/images/tabbar/shop-1.png",
 				"selectedIconPath": "static/images/tabbar/shop-1.png",
@@ -74,5 +271,11 @@
 		"navigationBarBackgroundColor": "#F8F8F8",
 		"backgroundColor": "#F8F8F8"
 	},
-	"uniIdRouter": {}
+	"uniIdRouter": {},
+	"requiredPrivateInfos": [
+		"getLocation",
+		"onLocationChange",
+		"startLocationUpdateBackground",
+		"chooseAddress"
+	]
 }

+ 176 - 0
pages/login/code_login.vue

@@ -0,0 +1,176 @@
+<template>
+	<view class="content">
+		<view class="title">验证码登录</view>
+		<view class="form vflex">
+			<u-input v-model="userInfo.name" placeholder="用户名/手机号"></u-input>
+			<u-input v-model="code" placeholder="请输入验证码">
+				<template slot="suffix">
+					<u-code ref="uCode" @change="codeChange" seconds="60" changeText="X秒重新获取"></u-code>
+					<view class="code" @tap="getCode" :text="tips"></view>
+				</template>
+			</u-input>
+		</view>
+		<view class="hflex acenter">
+			<u-checkbox-group @change="checkboxChange">
+				<u-checkbox v-model="agree" shape="circle"></u-checkbox>
+			</u-checkbox-group>
+			<view class="text">阅读并同意<span class="read" @click="open(0)">《用户服务协议》</span>、<span class="read" @click="open(1)">《个人信息保护政策》</span></view>
+		</view>
+		<view class="button hflex acenter jcenter" @click="login">
+			<view>登录</view>
+		</view>
+		<view class="hflex acenter jcenter bottom">
+			<view class="text_style1" @click="pwdLogin">账号密码登录</view>
+			<view style="margin: 0 10rpx;">|</view>
+			<view class="text_style2" @click="register">注册</view>
+		</view>
+		<!-- 弹出层 -->
+		<u-modal :show="showProtocol" :title="protocolTitle" confirmColor="#2988FE" @confirm="isRead" confirmText="我已阅读">
+			<view class="slot-content">
+				<rich-text :nodes="protocolContent"></rich-text>
+			</view>
+		</u-modal>
+	</view>
+</template>
+
+<script>
+	import $api from '@/static/js/api.js'
+	var that = ''
+	export default {
+		data() {
+			return {
+				userInfo: {
+					name: '',
+				},
+				code: '',
+				tips: '获取验证码',
+				agree: false,
+				showProtocol: false,
+				protocolTitle: '',
+				protocolContent: '',
+			}
+		},
+		onLoad() {
+			that = this
+		},
+		methods: {
+			// 验证码文字
+			codeChange(text) {
+				that.tips = text
+			},
+			// 获取验证码
+			getCode() {
+				if(that.$refs.uCode.canGetCode) {
+					uni.showLoading({
+						title: '正在获取验证码'
+					})
+					setTimeout(()=> {
+						uni.hideLoading();
+						uni.$u.toast('验证码已发送')
+						this.$refs.uCode.start()
+					},2000)
+				} else {
+					uni.$u.toast('倒计时结束后再发送')
+				}
+			},
+			// 阅读并同意
+			checkboxChange(n) {
+				this.agree = !this.agree
+			},
+			// 打开弹出层
+			open(index) {
+				const that = this
+				// if(index == 0) {
+				// 	$api.req({
+				// 		url: '/api/Publics/config_info'
+				// 	}, function(res) {
+				// 		if (res.code == 1) {
+				// 			that.protocolTitle = '用户协议'
+				// 			that.protocolContent = res.data.xieyi
+				// 		}
+				// 	})
+					
+				// } else {
+				// 	that.protocolTitle = '隐私政策'
+				// 	that.protocolContent = ''
+				// }
+				// that.showProtocol = true
+			},
+			// 登录
+			login() {
+				if ($api.formCheck(that.userInfo.name,"phone") && $api.formCheck(that.code, "code6")) {
+					if (!that.agree) {
+						$api.info('请先阅读并同意用户协议和隐私协议')
+					} else {
+						wx.setStorageSync("token",true)
+						$api.jump('/pages/tabbar/mine/mine',3)
+					}
+				}
+			},
+			// 账号密码登录
+			pwdLogin() {
+				$api.jump('/pages/login/password_login')
+			},
+			// 注册
+			register() {
+				$api.jump('/pages/login/register')
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content::v-deep {
+		padding: 0 60rpx;
+		.title {
+			margin: 64rpx 0;
+			font-size: 52rpx;
+			color: #222;
+		}
+		.form {
+			margin-bottom: 100rpx;
+			.u-input {
+				width: 630rpx !important;
+				height: 104rpx !important;
+				background-color: #f4f4f4;
+				border-radius: 52rpx;
+				font-size: 30rpx !important;
+				box-sizing: border-box;
+				padding: 30rpx 48rpx !important;
+				margin: 26rpx 0;
+			}
+			.pwd_icon {
+				width: 40rpx;
+				height: 40rpx;
+			}
+		}
+		.text {
+			font-size: 24rpx;
+			color: #9c9c9c;
+		}
+		.read {
+			color: #2a63f3;
+		}
+		.button {
+			width: 100%;
+			height: 96rpx;
+			background-color: #506dff;
+			border-radius: 50rpx;
+			box-shadow: 0 4rpx 28rpx 0 rgba(132,123,255,0.4);
+			font-size: 40rpx;
+			color: #fff;
+			margin: 40rpx 0 36rpx;
+		}
+		.bottom {
+			width: 100%;
+			.text_style1 {
+				font-size: 24rpx;
+				color: #555;
+			}
+			.text_style2 {
+				font-size: 24rpx;
+				color: #506dff;
+			}
+		}
+	}
+</style>

+ 115 - 0
pages/login/forgot_pwd.vue

@@ -0,0 +1,115 @@
+<template>
+	<view class="content">
+		<view class="form vflex">
+			<u-input v-model="userInfo.name" placeholder="用户名/手机号"></u-input>
+			<u-input v-model="code" placeholder="请输入验证码">
+				<template slot="suffix">
+					<u-code ref="uCode" @change="codeChange" seconds="60" changeText="X秒重新获取"></u-code>
+					<view class="code" @tap="getCode" :text="tips"></view>
+				</template>
+			</u-input>
+			<u-input :type="pwd_type" v-model="userInfo.password" placeholder="请输入密码">
+				<template slot="suffix">
+					<view @click="show_pwd" v-if="pwd_type == 'password'">
+						<image src="/static/images/login/biyanjing.png" class="pwd_icon"></image>
+					</view>
+					<view @click="show_pwd" v-if="pwd_type == 'text'">
+						<image src="/static/images/login/yanjing.png" class="pwd_icon"></image>
+					</view>
+				</template>
+			</u-input>
+		</view>
+		<view class="button hflex acenter jcenter" @click="submit">
+			<view>提交</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import $api from '@/static/js/api.js'
+	var that = ''
+	export default {
+		data() {
+			return {
+				userInfo: {
+					name: '',
+					password: ''
+				},
+				code: '',
+				tips: '获取验证码',
+				pwd_type: 'password',
+			}
+		},
+		onLoad() {
+			that = this
+		},
+		watch: {
+			value(newValue,oldValue) {
+				
+			}
+		},
+		methods: {
+			// 验证码文字
+			codeChange(text) {
+				that.tips = text
+			},
+			// 获取验证码
+			getCode() {
+				if(that.$refs.uCode.canGetCode) {
+					uni.showLoading({
+						title: '正在获取验证码'
+					})
+					setTimeout(()=> {
+						uni.hideLoading();
+						uni.$u.toast('验证码已发送')
+						this.$refs.uCode.start()
+					},2000)
+				} else {
+					uni.$u.toast('倒计时结束后再发送')
+				}
+			},
+			// 提交
+			submit() {
+				$api.jump(1,-1)
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content::v-deep {
+		padding: 0 60rpx;
+		.form {
+			width: 100%;
+			padding-top: 64rpx;
+			.u-input {
+				width: 630rpx !important;
+				height: 104rpx !important;
+				background-color: #f4f4f4;
+				border-radius: 52rpx;
+				font-size: 30rpx !important;
+				box-sizing: border-box;
+				padding: 30rpx 48rpx !important;
+				margin: 26rpx 0;
+			}
+			.pwd_icon {
+				width: 40rpx;
+				height: 40rpx;
+			}
+			.code {
+				font-size: 30rpx;
+				color: #506dff;
+			}
+		}
+		.button {
+			width: 100%;
+			height: 96rpx;
+			background-color: #506dff;
+			border-radius: 50rpx;
+			box-shadow: 0 4rpx 28rpx 0 rgba(132,123,255,0.4);
+			font-size: 40rpx;
+			color: #fff;
+			margin: 40rpx 0 36rpx;
+		}
+	}
+</style>

+ 174 - 0
pages/login/password_login.vue

@@ -0,0 +1,174 @@
+<template>
+	<view class="content">
+		<view class="title">密码登录</view>
+		<view class="form vflex">
+			<u-input v-model="userInfo.name" placeholder="用户名/手机号"></u-input>
+			<u-input :type="pwd_type" v-model="userInfo.password" placeholder="请输入密码">
+				<template slot="suffix">
+					<view @click="show_pwd" v-if="pwd_type == 'password'">
+						<image src="/static/images/login/biyanjing.png" class="pwd_icon"></image>
+					</view>
+					<view @click="show_pwd" v-if="pwd_type == 'text'">
+						<image src="/static/images/login/yanjing.png" class="pwd_icon"></image>
+					</view>
+				</template>
+			</u-input>
+		</view>
+		<view class="hflex acenter">
+			<u-checkbox-group @change="checkboxChange">
+				<u-checkbox v-model="agree" shape="circle"></u-checkbox>
+			</u-checkbox-group>
+			<view class="text">阅读并同意<span class="read" @click="open(0)">《用户服务协议》</span>、<span class="read" @click="open(1)">《个人信息保护政策》</span></view>
+		</view>
+		<view class="button hflex acenter jcenter" @click="login">
+			<view>登录</view>
+		</view>
+		<view class="hflex acenter jcenter bottom">
+			<view class="text_style1" @click="codeLogin">验证码登录</view>
+			<view style="margin: 0 10rpx;">|</view>
+			<view class="text_style2" @click="forgotPwd">忘记密码</view>
+		</view>
+		<!-- 弹出层 -->
+		<u-modal :show="showProtocol" :title="protocolTitle" confirmColor="#2988FE" @confirm="isRead" confirmText="我已阅读">
+			<view class="slot-content">
+				<rich-text :nodes="protocolContent"></rich-text>
+			</view>
+		</u-modal>
+	</view>
+</template>
+
+<script>
+	import $api from '@/static/js/api.js'
+	var that = ''
+	export default {
+		data() {
+			return {
+				userInfo: {
+					name: '',
+					password: ''
+				},
+				pwd_type: 'password',
+				agree: false,
+				showProtocol: false,
+				protocolTitle: '',
+				protocolContent: '',
+			}
+		},
+		onLoad() {
+			that = this
+		},
+		methods: {
+			// 查看密码
+			show_pwd() {
+				if(that.pwd_type == 'text') {
+					that.pwd_type = 'password'
+				} else {
+					that.pwd_type = 'text'
+				}
+			},
+			// 阅读并同意
+			checkboxChange(n) {
+				this.agree = !this.agree
+			},
+			// 打开弹出层
+			open(index) {
+				const that = this
+				// if(index == 0) {
+				// 	$api.req({
+				// 		url: '/api/Publics/config_info'
+				// 	}, function(res) {
+				// 		if (res.code == 1) {
+				// 			that.protocolTitle = '用户协议'
+				// 			that.protocolContent = res.data.xieyi
+				// 		}
+				// 	})
+					
+				// } else {
+				// 	that.protocolTitle = '隐私政策'
+				// 	that.protocolContent = ''
+				// }
+				// that.showProtocol = true
+			},
+			// 登录
+			login() {
+				if ($api.formCheck(that.userInfo.name,"phone") && $api.formCheck(that.userInfo.password, "password")) {
+					if (!that.agree) {
+						$api.info('请先阅读并同意用户协议和隐私协议')
+					} else {
+						wx.setStorageSync("token",true)
+						$api.jump('/pages/tabbar/mine/mine',3)
+					}
+				}
+			},
+			// 已阅读
+			isRead() {
+				that.showProtocol = false
+				that.agree = true
+			},
+			// 去验证码登录
+			codeLogin() {
+				$api.jump('/pages/login/code_login')
+			},
+			// 忘记密码
+			forgotPwd() {
+				$api.jump('/pages/login/forgot_pwd')
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content::v-deep {
+		padding: 0 60rpx;
+		.title {
+			margin: 64rpx 0;
+			font-size: 52rpx;
+			color: #222;
+		}
+		.form {
+			margin-bottom: 100rpx;
+			.u-input {
+				width: 630rpx !important;
+				height: 104rpx !important;
+				background-color: #f4f4f4;
+				border-radius: 52rpx;
+				font-size: 30rpx !important;
+				box-sizing: border-box;
+				padding: 30rpx 48rpx !important;
+				margin: 26rpx 0;
+			}
+			.pwd_icon {
+				width: 40rpx;
+				height: 40rpx;
+			}
+		}
+		.text {
+			font-size: 24rpx;
+			color: #9c9c9c;
+		}
+		.read {
+			color: #2a63f3;
+		}
+		.button {
+			width: 100%;
+			height: 96rpx;
+			background-color: #506dff;
+			border-radius: 50rpx;
+			box-shadow: 0 4rpx 28rpx 0 rgba(132,123,255,0.4);
+			font-size: 40rpx;
+			color: #fff;
+			margin: 40rpx 0 36rpx;
+		}
+		.bottom {
+			width: 100%;
+			.text_style1 {
+				font-size: 24rpx;
+				color: #555;
+			}
+			.text_style2 {
+				font-size: 24rpx;
+				color: #506dff;
+			}
+		}
+	}
+</style>

+ 123 - 0
pages/login/register.vue

@@ -0,0 +1,123 @@
+<template>
+	<view class="content">
+		<view class="form vflex">
+			<u-input v-model="userInfo.userName" placeholder="请输入昵称"></u-input>
+			<u-input v-model="userInfo.name" placeholder="请输入手机号码"></u-input>
+			<u-input v-model="code" placeholder="请输入验证码">
+				<template slot="suffix">
+					<u-code ref="uCode" @change="codeChange" seconds="60" changeText="X秒重新获取"></u-code>
+					<view class="code" @tap="getCode" :text="tips"></view>
+				</template>
+			</u-input>
+			<u-input :type="pwd_type" v-model="userInfo.password" placeholder="请输入密码">
+				<template slot="suffix">
+					<view @click="show_pwd" v-if="pwd_type == 'password'">
+						<image src="/static/images/login/biyanjing.png" class="pwd_icon"></image>
+					</view>
+					<view @click="show_pwd" v-if="pwd_type == 'text'">
+						<image src="/static/images/login/yanjing.png" class="pwd_icon"></image>
+					</view>
+				</template>
+			</u-input>
+		</view>
+		<view class="button hflex acenter jcenter" @click="submit">
+			<view>提交</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import $api from '@/static/js/api.js'
+	var that = ''
+	export default {
+		data() {
+			return {
+				userInfo: {
+					name: '',
+					password: ''
+				},
+				code: '',
+				tips: '获取验证码',
+				pwd_type: 'password',
+			}
+		},
+		onLoad() {
+			that = this
+		},
+		watch: {
+			value(newValue,oldValue) {
+				
+			}
+		},
+		methods: {
+			// 验证码文字
+			codeChange(text) {
+				that.tips = text
+			},
+			// 获取验证码
+			getCode() {
+				if(that.$refs.uCode.canGetCode) {
+					uni.showLoading({
+						title: '正在获取验证码'
+					})
+					setTimeout(()=> {
+						uni.hideLoading();
+						uni.$u.toast('验证码已发送')
+						this.$refs.uCode.start()
+					},2000)
+				} else {
+					uni.$u.toast('倒计时结束后再发送')
+				}
+			},
+			// 提交
+			submit() {
+				if ($api.formCheck(that.userInfo.name,"phone") && $api.formCheck(that.code, "code6") && $api.formCheck(that.userInfo.password,"password")) {
+					if (!that.agree) {
+						$api.info('请先阅读并同意用户协议和隐私协议')
+					} else {
+						wx.setStorageSync("token",true)
+						$api.jump('/pages/tabbar/mine/mine',3)
+					}
+				}
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content::v-deep {
+		padding: 0 60rpx;
+		.form {
+			width: 100%;
+			padding-top: 64rpx;
+			.u-input {
+				width: 630rpx !important;
+				height: 104rpx !important;
+				background-color: #f4f4f4;
+				border-radius: 52rpx;
+				font-size: 30rpx !important;
+				box-sizing: border-box;
+				padding: 30rpx 48rpx !important;
+				margin: 26rpx 0;
+			}
+			.pwd_icon {
+				width: 40rpx;
+				height: 40rpx;
+			}
+			.code {
+				font-size: 30rpx;
+				color: #506dff;
+			}
+		}
+		.button {
+			width: 100%;
+			height: 96rpx;
+			background-color: #506dff;
+			border-radius: 50rpx;
+			box-shadow: 0 4rpx 28rpx 0 rgba(132,123,255,0.4);
+			font-size: 40rpx;
+			color: #fff;
+			margin: 40rpx 0 36rpx;
+		}
+	}
+</style>

+ 218 - 30
pages/tabbar/index/index.vue

@@ -1,52 +1,240 @@
 <template>
 	<view class="content">
-		<image class="logo" src="/static/logo.png"></image>
-		<view class="text-area">
-			<text class="title">{{title}}</text>
+		<view class="content_top">
+			<u-navbar leftText="" height="44px" bgColor="rgb(255,255,255,0)" :placeholder="true">
+				<view class="navbar_left hflex acenter" slot="left">
+					<image src="../../../static/images/index/logo.png" style="width: 160rpx;height: 60rpx;"></image>
+					<view class="dian"></view>
+					<view class="text_style1">{{weather}}</view>
+				</view>
+			</u-navbar>
+			<view class="search hflex acenter">
+				<view class="hflex acenter" @click="changeCity">
+					<view class="city">{{city}}</view>
+					<u-icon name="arrow-down-fill" color="#000" size="10"></u-icon>
+				</view>
+				<u-input v-model="serach_value" type="text" :border="true" placeholder="搜索关键词" shape="circle"
+					prefixIcon="search" prefixIconStyle="font-size: 22px;color: #909399">
+				</u-input>
+			</view>
+		</view>
+		
+		<view class="swiper">
+			<u-swiper :list="bannerList" radius="20rpx" @click="toBanner"></u-swiper>
+		</view>
+		<view class="notice hflex acenter jbetween">	
+			<!-- <view class="notice_left">公告</view> -->
+			<u-notice-bar :text="notice_text" direction="column" icon="公告" color="#7a7b7c" bgColor="#f3f7ff"></u-notice-bar>
+			<view class="hflex acenter" @click="toNotice">
+				<view class="text1">更多</view>
+				<u-icon name="arrow-right" color="#bebebf" size="14"></u-icon>
+			</view>
+		</view>
+		<view class="boxs hflex acenter jbetween">
+			<image :src="class_img1" mode="widthFix" style="width: 336rpx;"></image>
+			<image :src="class_img2" mode="widthFix" style="width: 336rpx;"></image>
+		</view>
+		<view class="boxs hflex acenter jbetween">
+			<image :src="class_img3" mode="widthFix" style="width: 220rpx;"></image>
+			<image :src="class_img4" mode="widthFix" style="width: 220rpx;"></image>
+			<image :src="class_img5" mode="widthFix" style="width: 220rpx;"></image>
+		</view>
+		<view class="boxs">
+			<u-tabs :list="tabs" @click="changeTaaba"
+				:activeStyle="{
+					color: '#000',
+				}" :inactiveStyle="{
+					color: '#888888'
+				}"></u-tabs>
+		</view>
+		<view class="boxs">
+			<block v-for="(item,index) in pageList" :key="index">
+				<news-module :title="item.title" :imgs="item.imgs" :type="item.type" :client="item.client" :comment="item.comment"></news-module>
+			</block>
 		</view>
 	</view>
 </template>
 
 <script>
+	import $api from '@/static/js/api.js'
+	var that = ''
 	export default {
 		data() {
 			return {
-				title: 'Hello'
+				title: 'Hello',
+				weather: '',
+				city: '北京',
+				serach_value: '',
+				bannerList: [
+					"/static/images/index/class_img1.png",
+					"/static/images/index/class_img1.png"
+				],
+				notice_text: [
+					'找工作有妙招,这里看过来~',
+					'浔阳江头夜送客'
+				],
+				class_img1: '/static/images/index/class_img1.png',
+				class_img2: '/static/images/index/class_img2.png',
+				class_img3: '/static/images/index/class_img3.png',
+				class_img4: '/static/images/index/class_img3.png',
+				class_img5: '/static/images/index/class_img3.png',
+				tabs: [
+					{
+						name: '推荐',
+					},
+					{
+						name: '发现',
+					},
+					{
+						name: '资讯',
+					},
+					{
+						name: '实时',
+					},
+					{
+						name: '娱乐',
+					},
+					{
+						name: '美食',
+					}
+				],
+				pageList: [
+					{
+						title: '2022年上半年十部好剧,《开端》第7名,《人世间》第4名,值得观看',
+						imgs: [
+							"/static/images/index/class_img1.png",
+							"/static/images/index/class_img1.png",
+							"/static/images/index/class_img1.png"
+						],
+						type: '资讯',
+						client: '澎湃新闻客户端',
+						commnet: 77
+					}
+				]
 			}
 		},
 		onLoad() {
-
+			that = this
+			this.getCity()
 		},
 		methods: {
-
+			// 获取当前位置
+			getCity() {
+				console.log("当前接口需要申请")
+				uni.authorize({
+				    scope: 'scope.userLocation',
+				    success() {
+				        uni.getLocation({
+				        	type: "wgs84",
+				        	success:function(res){
+				        		console.log("当前位置:",res);
+				        	}
+				        })
+				    }
+				})
+				
+			},
+			changeCity() {
+				// console.log("城市");
+				$api.jump('/page_index/pages/index/changeCity?city=' + this.city)
+			},
+			// 轮播图跳转
+			toBanner(e) {
+				console.log("点击轮播",e);
+			},
+			// 公告列表
+			toNotice() {
+				$api.jump('/page_index/pages/index/noticeList')
+			},
 		}
 	}
 </script>
 
-<style>
-	.content {
-		display: flex;
-		flex-direction: column;
-		align-items: center;
-		justify-content: center;
-	}
-
-	.logo {
-		height: 200rpx;
-		width: 200rpx;
-		margin-top: 200rpx;
-		margin-left: auto;
-		margin-right: auto;
-		margin-bottom: 50rpx;
-	}
-
-	.text-area {
-		display: flex;
-		justify-content: center;
+<style lang="scss" scoped>
+	.content::v-deep {
+		// padding: 0 30rpx;
+		background: #fff;
+		.content_top {
+			background: url('../../../static/images/index/bg.png') no-repeat;
+			background-size: 100%;
+			box-sizing: border-box;
+			padding: 0 30rpx;
+			.navbar_left {
+				
+				.dian {
+					width: 8rpx;
+					height: 8rpx;
+					background: #232323;
+					border-radius: 50%;
+					margin: 0 6rpx 0 12rpx;
+				}
+			}
+			.search {
+				width: 100%;
+				box-sizing: border-box;
+				padding: 20rpx;
+				margin-top: 36rpx;
+				.city {
+					color: #222222;
+					font-size: 32rpx;
+					margin-right: 16rpx;
+				}
+				.u-input {
+					border: solid 1rpx #526eff;
+					background: #fff;
+					height: 76rpx;
+					margin-left: 16rpx;
+				}
+			}
+		}
+		.swiper {
+			width: 690rpx;
+			// box-sizing: border-box;
+			// padding: 0 30rpx;
+			// height: 340rpx;
+			margin: 24rpx 30rpx 20rpx;
+			border-radius: 20rpx;
+		}
+		.notice {
+			width: 690rpx;
+			box-sizing: border-box;
+			padding: 15rpx 30rpx 15rpx 0;
+			background-color: #f3f7ff;
+			margin: 0 20rpx 0;
+			border-radius: 20rpx;
+			
+			.u-notice-bar {
+				// background-color: #f3f7ff !important;
+				// 
+				.u-icon__icon {
+					font-size: 32rpx;
+					// padding-left: 24rpx;
+					color: #506dff !important;
+					padding-right: 20rpx;
+					border-right: 3rpx solid #f1f1f1;
+				}
+			}
+			
+			.notice_left {
+				
+			}
+		}
+		// .class_img {
+		// 	width: 100%;
+		// 	box-sizing: border-box;
+		// 	padding: 0 30rpx;
+			
+		// }
+		.boxs {
+			width: 100%;
+			box-sizing: border-box;
+			padding: 0 30rpx;
+			margin: 24rpx 0 0;
+		}
+		.text1 {
+			font-size: 25rpx;
+			color: #8f8f90;
+		}
 	}
 
-	.title {
-		font-size: 36rpx;
-		color: #8f8f94;
-	}
 </style>

+ 405 - 1
pages/tabbar/mine/mine.vue

@@ -1,8 +1,412 @@
 <template>
+	<view class="content">
+		<view class="hflex acenter jbetween user">
+			<view class="hflex acenter" v-if="!login">
+				<image src="/static/images/mine/avatar1.jpg" mode="widthFix" class="avatar"></image>
+				<view class="hflex acenter" @click="toLogin">
+					<view class="text_style1">立即登录</view>
+					<u-icon name="arrow-right" color="#000" size="10"></u-icon>
+				</view>
+			</view>
+			<view class="hflex acenter" v-else>
+				<image :src="user.img" mode="widthFix" class="avatar"></image>
+				<view class="vflex">
+					<view class="hflex acenter">
+						<view class="text_style1">{{user.name}}</view>
+						<view class="setting" @click="toSetting">设置</view>
+					</view>
+					<view class="member_icon">
+						<image src="/static/images/mine/member_icon.png" style="width: 136rpx;height: 48rpx;"></image>
+					</view>
+				</view>
+			</view>
+			<view class="user_right" @click="toMessage">
+				<image src="/static/images/mine/message.png" mode="widthFix" class="message_icon"></image>
+				<view class="message" v-if="user.message_num > 0">{{user.message_num}}</view>
+			</view>
+		</view>
+		<view class="member hflex acenter jbetween"  @click="toMember">
+			<view class="vflex">
+				<view class="hflex acenter">
+					<image src="/static//images/mine/huiyuan.png" mode="widthFix" style="width: 40rpx;"></image>
+					<view class="member_name">船百知会员</view>
+				</view>
+				<view class="member_detail" v-if="user.is_member">{{user.member_date}}到期</view>
+				<view class="member_detail" v-else>开通会员立享优惠</view>
+			</view>
+			<view class="hflex acenter jbetween member_btn">
+				<view v-if="user.is_member">立即续费</view>
+				<view v-else>去开通</view>
+				<image src="/static/images/mine/btn_right.png" mode="widthFix" style="width: 32rpx;margin-left: 14rpx;"></image>
+			</view>
+		</view>
+		<view class="box hflex acenter jbetween">
+			<view class="box_left vflex" @click="toWallet">
+				<view class="left_title">我的余额</view>
+				<view class="left_num" v-if="login">{{user.balance_num ? user.balance_num : 0}}</view>
+				<view class="left_num" v-else>**</view>
+				<view class="left_bottom">看看你的账户余额吧~</view>
+			</view>
+			<view class="box_right vflex" @click="toCollect">
+				<view class="left_title">我的收藏</view>
+				<view class="left_num" v-if="login">{{user.collect_num ? user.collect_num : 0}}</view>
+				<view class="left_num" v-else>**</view>
+				<view class="right_bottom">你收藏的宝藏都在这里</view>
+			</view>
+		</view>
+		<view class="list">
+			<view class="list_title">我的订单</view>
+			<view class=" hflex acenter jbetween">
+				<block v-for="(item,index) in order" :key="index">
+					<view class="list_item vflex acenter" @click="toOrder(item.url)">
+						<image :src="item.img" mode="widthFix" style="width: 56rpx;margin-bottom: 20rpx;"></image>
+						<view>{{item.text}}</view>
+					</view>
+				</block>
+			</view>
+		</view>
+		<view class="list">
+			<view class="list_title">我的服务</view>
+			<view class="hflex acenter  fwrap">
+				<block v-for="(item,index) in serviceList" :key="index">
+					<view class="list_item1 vflex acenter" @click="toService(item.url)">
+						<image :src="item.img" mode="widthFix" style="width: 60rpx;margin-bottom: 14rpx;"></image>
+						<view>{{item.text}}</view>
+					</view>
+				</block>
+			</view>
+		</view>
+	</view>
 </template>
 
 <script>
+	import $api from '@/static/js/api.js'
+	var that = ''
+	export default {
+		data() {
+			return {
+				login: false,
+				user: {
+					img: '/static/images/mine/avatar2.jpg',
+					name: '放风筝的人',
+					message_num: 0,
+					is_member: 1,
+					member_date: '2022-11-10',
+					balance_num: 348.95,
+					collect_num: 12,
+				},
+				order: [
+					{
+						id: 1,
+						img: '/static/images/mine/order1.png',
+						text: '生产订单',
+						url: '/page_mine/pages/order/production'
+					},
+					{
+						id: 2,
+						img: '/static/images/mine/order2.png',
+						text: '外协订单',
+						url: '/page_mine/pages/order/outsourcing'
+					},
+					{
+						id: 3,
+						img: '/static/images/mine/order3.png',
+						text: '采购订单',
+						url: '/page_mine/pages/order/purchase'
+					},
+					{
+						id: 4,
+						img: '/static/images/mine/order4.png',
+						text: '海运订单',
+						url: '/page_mine/pages/order/oceanShipping'
+					},
+					{
+						id: 5,
+						img: '/static/images/mine/order5.png',
+						text: '维修订单',
+						url: '/page_mine/pages/order/repair'
+					},
+				],
+				serviceList: [
+					{
+						url: '',
+						img: '/static/images/mine/service1.png',
+						text: '加入人才库',
+						url: '/page_mine/pages/service/joinPerson'
+					},
+					{
+						url: '',
+						img: '/static/images/mine/service2.png',
+						text: '成为维修工',
+						url: '/page_mine/pages/service/applyMaintenance'
+					},
+					{
+						url: '',
+						img: '/static/images/mine/service3.png',
+						text: '入驻船厂',
+					},
+					{
+						url: '',
+						img: '/static/images/mine/service4.png',
+						text: '入驻商家',
+					},
+					{
+						url: '',
+						img: '/static/images/mine/service5.png',
+						text: '实名认证',
+					},
+					{
+						url: '',
+						img: '/static/images/mine/service6.png',
+						text: '我的发布',
+					},
+					{
+						url: '',
+						img: '/static/images/mine/service7.png',
+						text: '我的需求',
+					},
+					{
+						url: '',
+						img: '/static/images/mine/service8.png',
+						text: '意见反馈',
+					},
+				]
+			}
+		},
+		onLoad() {
+			that = this
+			
+		},
+		onShow() {
+			that.isLogin()
+		},
+		methods: {
+			// 判断登录
+			isLogin() {
+				var token = uni.getStorageSync("token")
+				if (token) {
+					that.login = true
+				}
+			},
+			// 去登陆
+			toLogin() {
+				$api.jump('/pages/login/password_login')
+			},
+			// 去设置
+			toSetting() {
+				$api.jump('/page_mine/pages/setting/setting')
+			},
+			// 去通知中心
+			toMessage() {
+				if(that.login) {
+					$api.jump('/page_mine/pages/message/message')
+				} else {
+					$api.info('请先登录')
+				}
+			},
+			// 去会员中心
+			toMember() {
+				if(that.login) {
+					$api.jump('/page_mine/pages/member/index')
+				} else {
+					$api.info('请先登录')
+				}
+				
+			},
+			// 我的余额
+			toWallet() {
+				if(that.login) {
+					$api.jump('/page_mine/pages/wallet/wallet')
+				} else {
+					$api.info('请先登录')
+				}
+				
+			},
+			// 我的收藏
+			toCollect() {
+				if(that.login) {
+					$api.jump('/page_mine/pages/collect/collect')
+				} else {
+					$api.info('请先登录')
+				}
+			},
+			// 我的订单
+			toOrder(url) {
+				if(that.login) {
+					$api.jump(url)
+				} else {
+					$api.info('请先登录')
+				}
+			},
+			// 我的服务
+			toService(url) {
+				if(that.login) {
+					$api.jump(url)
+				} else {
+					$api.info('请先登录')
+				}
+			}
+		},
+	}
 </script>
 
-<style>
+<style lang="scss" scoped>
+	.content {
+		background:url('/static/images/mine/bg.png') no-repeat;
+		background-size: 100%;
+		padding: 0 30rpx;
+		.user {
+			width: 100%;
+			margin: 24rpx 0;
+			.avatar {
+				box-shadow: 0 8rpx 20rpx 0 #c4d8df;
+				border: 4rpx solid #fff;
+				width: 120rpx;
+				height: 120rpx;
+				border-radius: 50%;
+			}
+			.text_style1 {
+				color: #131415;
+				font-size: 40rpx;
+				margin: 0 6rpx 0 16rpx;
+			}
+			.member_icon {
+				margin: 10rpx 0 0 16rpx;
+			}
+			.setting {
+				margin-left: 12rpx;
+				width: 64rpx;
+				height: 32rpx;
+				border-radius: 20rpx;
+				border: 1rpx solid #526fff;
+				text-align: center;
+				line-height: 32rpx;
+				font-size: 20rpx;
+				color: #526fff;
+			}
+			.user_right {
+				position: relative;
+				.message_icon {
+					width: 48rpx;
+					height: 48rpx;
+					
+				}
+				.message {
+					position: absolute;
+					right: -10rpx;
+					top: 0;
+					width: 36rpx;
+					height: 24rpx;
+					background-color: #fb3e32;
+					border-radius: 12rpx 12rpx 12rpx 4rpx;
+					font-size: 20rpx;
+					color: #fff;
+					text-align: center;
+				}
+			}
+		}
+		.member {
+			width: 100%;
+			height: 132rpx;
+			background-color: #2b2b2b;
+			border-radius: 16rpx;
+			border: 1rpx solid ;
+			box-sizing: border-box;
+			padding: 20rpx;
+			margin: 20rpx 0;
+			.member_name {
+				color: #fff;
+				font-size: 32rpx;
+				margin-left: 6rpx;
+			}
+			.member_detail {
+				color: #fff;
+				font-size: 22rpx;
+				margin-top: 16rpx;
+			}
+			.member_btn {
+				width: auto;
+				height: 64rpx;
+				background: linear-gradient(270deg,#feebc8 0%, #ffe3a4 100%);
+				border-radius: 32rpx;
+				box-sizing: border-box;
+				padding:  28rpx;
+				font-size: 24rpx;
+				color: #572915;
+			}
+		}
+		.box {
+			width: 100%;
+			margin-bottom: 20rpx;
+			.box_left {
+				background: url('/static/images/mine/balance.png') no-repeat;
+				background-size: 100%;
+				box-sizing: border-box;
+				padding: 16rpx 24rpx;
+				width: 336rpx;
+				height: 180rpx;
+				.left_bottom {
+					width: 264rpx;
+					height: 32rpx;
+					background: linear-gradient(270deg, rgba(234,245,255,0) 0%, #e3eeff 100%);
+					padding: 0 12rpx;
+					line-height: 32rpx;
+					font-size: 20rpx;
+					color: #4f64af;
+				}
+			}
+			.box_right {
+				background: url('/static/images/mine//collect.png') no-repeat;
+				background-size: 100%;
+				box-sizing: border-box;
+				padding: 16rpx 24rpx;
+				width: 336rpx;
+				height: 180rpx;
+				.right_bottom {
+					width: 264rpx;
+					height: 32rpx;
+					background: linear-gradient(270deg, rgba(227,255,255,0) 0%, #d4f1ff 100%);
+					padding: 0 12rpx;
+					line-height: 32rpx;
+					font-size: 20rpx;
+					color: #26b0ff;
+				}
+			}
+			.left_title {
+				font-size: 24rpx;
+				color: #444;
+			}
+			.left_num {
+				font-size: 48rpx;
+				color: #444;	
+				margin: 6rpx 0 6rpx;
+			}
+		}
+		.list {
+			width: 100%;
+			height: auto;
+			background: #fff;
+			border-radius: 20rpx;
+			box-sizing: border-box;
+			padding: 20rpx;
+			margin-bottom: 20rpx;
+			.list_title {
+				font-size: 26rpx;
+				color: #222;
+				margin-bottom: 24rpx;
+				font-weight: 600;
+			}
+			.list_item {
+				width: 20%;
+				font-size: 22rpx;
+				color: #333;
+			}
+			.list_item1 {
+				width: 25%;
+				margin-bottom: 40rpx;
+				font-size: 24rpx;
+				color: #444;
+			}
+		}
+	}
 </style>

+ 0 - 8
pages/tabbar/release/release.vue

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

+ 210 - 1
pages/tabbar/shipyard/shipyard.vue

@@ -1,8 +1,217 @@
 <template>
+	<view class="content">
+		<view class="search">
+			<u-input v-model="serach_value" type="text" :border="true" placeholder="搜索关键词" shape="circle"
+				prefixIcon="search" prefixIconStyle="font-size: 22px;color: #909399">
+				<template slot="suffix">
+					<view>搜索</view>
+				</template>
+			</u-input>
+		</view>
+		<view class="swiper">
+			<u-swiper :list="bannerList" radius="20rpx" @click="toBanner"></u-swiper>
+		</view>
+		<view class="box">
+			<view class="tabs hflex acenter jbetween">
+				<block v-for="(item,index) in tabs" :key="index">
+					<view class="tabs_item" :class="active == item.id ? 'active' : ''" @click="changeTabs(item.id)">{{item.name}}</view>
+				</block>
+			</view>
+			<view class="list">
+				<block v-for="(item,index) in pageList" :key="index">
+					<view class="list_item hflex acenter jbetween">
+						<image :src="item.img" class="item_img" mode="widthFix"></image>
+						<view class="item_right vflex jbetween">
+							<view class="hflex acenter jbetween">
+								<view class="name">{{item.name}}</view>
+								<view class="shipyard">{{item.shipyard}}</view>
+							</view>
+							<view class="address">{{item.address}}</view>
+						</view>
+					</view>
+				</block>
+			</view>
+		</view>
+	</view>
 </template>
 
 <script>
+	import $api from '@/static/js/api.js'
+	var that = ''
+	export default {
+		data() {
+			return {
+				bannerList: [
+					"/static/images/index/class_img1.png",
+					"/static/images/index/class_img1.png"
+				],
+				tabs: [
+					{
+						id: 1,
+						name: '综合推荐'
+					},
+					{
+						id: 2,
+						name: '距离'
+					}
+				],
+				active: 1,
+				pageList: [
+					{
+						id: 1,
+						img: '/static/images/index/class_img3.png',
+						name: '上海黄浦区造船厂上海黄浦区造船厂上海黄浦区造船厂',
+						shipyard: '江南船厂',
+						address: '智城路与中晟大街交汇处'
+					},
+					{
+						id: 2,
+						img: '/static/images/index/class_img3.png',
+						name: '上海黄浦区造船厂',
+						shipyard: '江南船厂',
+						address: '智城路与中晟大街交汇处'
+					},
+					{
+						id: 3,
+						img: '/static/images/index/class_img3.png',
+						name: '上海黄浦区造船厂',
+						shipyard: '江南船厂',
+						address: '智城路与中晟大街交汇处'
+					},
+					{
+						id: 4,
+						img: '/static/images/index/class_img3.png',
+						name: '上海黄浦区造船厂',
+						shipyard: '江南船厂',
+						address: '智城路与中晟大街交汇处'
+					}
+				]
+			}
+		},
+		onLoad() {
+			that = this
+		},
+		methods: {
+			// banner图跳转
+			toBanner() {
+				
+			},
+			// 切换tabs
+			changeTabs(id) {
+				that.active = id
+			}
+		}
+	}
 </script>
 
-<style>
+<style lang="scss" scoped>
+	.content::v-deep {
+		background-color: #f6f6f6;
+		
+		.search {
+			background: #fff;
+			width: 100%;
+			height: 88rpx;
+			box-sizing: border-box;
+			padding: 12rpx 30rpx;
+			.u-input {
+				// background-color: ;
+				height: 64rpx;
+				padding: 0 0 0 18rpx !important;
+				border: 1rpx solid #506Dff;
+				margin-bottom: 12rpx;
+			}
+			.u-input__content__subfix-icon {
+				width: 128rpx;
+				height: 64rpx;
+				background-color: #506Dff;
+				border-radius: 32rpx;
+				color: #fff;
+				font-size: 28rpx;
+				text-align: center;
+				line-height: 64rpx;
+			}
+		}
+		.swiper {
+			width: 100%;
+			margin-top: 20rpx;
+			box-sizing: border-box;
+			padding: 0 30rpx;
+		}
+		.box {
+			width: 690rpx;
+			margin: 20rpx 30rpx 0;
+			background: #fff;
+			border-radius: 20rpx;
+			box-sizing: border-box;
+			padding: 24rpx 20rpx;
+			
+			.tabs {
+				width: 100%;
+				.tabs_item {
+					width: 312rpx;
+					height: 56rpx;
+					background-color: #f6f6f6;
+					border-radius: 8rpx;
+					font-size: 28rpx;
+					color: #444;
+					text-align: center;
+					line-height: 56rpx;
+				}
+				.active {
+					background-color: #f1f3ff;
+					color: #506dff;
+				}
+			}
+			.list {
+				
+				.list_item {
+					width: 100%;
+					height: 152rpx;
+					box-sizing: border-box;
+					padding: 24rpx 0;
+					border-bottom: 1rpx solid #f6f6f6;
+					.item_img {
+						width: 104rpx;
+						border-radius: 16rpx;
+						padding-right: 20rpx;
+					}
+					.item_right {
+						width: calc(100% - 124rpx);
+						height: 100%;
+						.name {
+							width: 80%;
+							color: #333;
+							font-size: 28rpx;
+							overflow: hidden;
+							white-space: nowrap;
+							text-overflow: ellipsis;
+						}
+						.shipyard{
+							width: auto;
+							height: 28rpx;
+							background-color: #506dff;
+							border-radius: 5rpx;
+							font-size: 16rpx;
+							color: #fff;
+							text-align: center;
+							line-height: 28rpx;
+							padding: 0 8rpx;
+							box-sizing: border-box;
+						}
+					}
+					.address {
+						font-size: 20rpx;
+						color: #666;
+						padding-bottom: 20rpx;
+					}
+				}
+				.list_item:nth-last-child(1) {
+					padding-bottom: 0;
+					border: none;
+				}
+			}
+		}
+		
+	}
 </style>

BIN
static/images/comment/bg.png


BIN
static/images/comment/error.png


BIN
static/images/comment/person.png


BIN
static/images/comment/right.png


BIN
static/images/comment/upload.png


BIN
static/images/comment/wait.png


BIN
static/images/index/bg.png


BIN
static/images/index/class_img1.png


BIN
static/images/index/class_img2.png


BIN
static/images/index/class_img3.png


BIN
static/images/index/logo.png


BIN
static/images/login/biyanjing.png


BIN
static/images/login/yanjing.png


BIN
static/images/mine/avatar1.jpg


BIN
static/images/mine/avatar2.jpg


BIN
static/images/mine/balance.png


BIN
static/images/mine/bg.png


BIN
static/images/mine/btn_right.png


BIN
static/images/mine/collect.png


BIN
static/images/mine/huiyuan.png


BIN
static/images/mine/member_bg.png


BIN
static/images/mine/member_icon.png


BIN
static/images/mine/message.png


BIN
static/images/mine/order1.png


BIN
static/images/mine/order2.png


BIN
static/images/mine/order3.png


BIN
static/images/mine/order4.png


BIN
static/images/mine/order5.png


BIN
static/images/mine/real-bg.png


BIN
static/images/mine/service1.png


BIN
static/images/mine/service2.png


BIN
static/images/mine/service3.png


BIN
static/images/mine/service4.png


BIN
static/images/mine/service5.png


BIN
static/images/mine/service6.png


BIN
static/images/mine/service7.png


BIN
static/images/mine/service8.png


+ 1991 - 0
static/js/api.js

@@ -0,0 +1,1991 @@
+// 加密 sha1 md5
+var encrypt = require('./encrypt.js');
+// 缓存
+var cache = require('./cache.js');
+// 数学精确计算
+var math = require('./math.js');
+// 腾讯位置服务
+var qqMap = require("./qqmap-wx-jssdk");
+// 二维码
+var qrCode = require("./weapp.qrcode.min");
+
+module.exports = {
+
+	/**
+	 * 小程序基本配置
+	 */
+	config: {
+		name: '船百知',
+		debug: false, //开发模式true,生产环境改为false;
+		version: 'xcx',
+		baseUrl: 'https://jxtx.zhousi.hdlkeji.com',
+		qqMap: false,
+		loading: false
+	},
+
+	/**
+	 * sha1加密
+	 * @param str
+	 * @param raw 加密方式 1str_sha1 0hex_sha1
+	 */
+	sha1: function(str, raw) {
+		return encrypt.sha1(str, raw);
+	},
+
+	/**
+	 * md5加密
+	 * @param str
+	 */
+	md5: function(str) {
+		return encrypt.md5(str);
+	},
+
+	/**
+	 * 缓存
+	 */
+	cache: cache,
+
+	/**
+	 * 数字精确计算
+	 */
+	math: math,
+
+	/**
+	 * 腾讯地图
+	 */
+	qqMap: qqMap,
+
+	/**
+	 * 消息提示
+	 * @param title
+	 * @param icon:success,error,loading,none 
+	 * @param success
+	 * @param time
+	 * @param mask
+	 */
+	info: function(title, icon, success, time, mask) {
+		if (typeof icon == 'function') {
+			success = icon;
+			icon = "none";
+		}
+		title = title == undefined ? "系统繁忙" : title;
+		icon = icon == undefined ? "none" : icon;
+		time = time == undefined ? 800 : time;
+		mask = mask == undefined ? true : mask;
+		uni.showToast({
+			title: title,
+			icon: icon,
+			mask: mask,
+			duration: time,
+			success: setTimeout(function() {
+				success && success()
+			}, time)
+		});
+	},
+
+	/**
+	 * 确认提示框
+	 * @param {Object} content
+	 * @param {Object} success
+	 * @param {Object} cancel
+	 * @param {Object} confirmText
+	 * @param {Object} cancelText
+	 */
+	modal: function(content, success, cancel, confirmText, cancelText) {
+		let opt = {};
+		opt.title = this.config.name;
+		opt.content = content;
+		// 默认不显示取消
+		opt.showCancel = false;
+		if (typeof cancel == 'function' || (typeof cancel == 'boolean' && cancel)) {
+			opt.showCancel = true;
+		} else if (typeof cancel == 'string') {
+			cancelText = confirmText;
+			confirmText = cancel;
+		}
+		if (!this.isEmpty(confirmText)) {
+			opt.confirmText = confirmText;
+		}
+		if (!this.isEmpty(cancelText)) {
+			opt.cancelText = cancelText;
+			opt.showCancel = true;
+		}
+		opt.success = function(res) {
+			if (res.confirm) {
+				success && success();
+			} else if (res.cancel) {
+				typeof cancel == 'function' && cancel();
+			}
+		};
+		uni.showModal(opt);
+	},
+
+	/**
+	 * loading 提示框
+	 * @param title
+	 */
+	loading: function(title) {
+		var that = this;
+		title = typeof title == 'string' ? title : "加载中...";
+		!that.config.loading && uni.showLoading({
+			title: title,
+			mask: true,
+			success: function() {
+				that.config.loading = true;
+			}
+		});
+	},
+
+	/**
+	 * 关闭loading 提示框
+	 */
+	closeLoading: function() {
+		var that = this;
+		that.config.loading && uni.hideLoading({
+			noConflict: true,
+			success: function() {
+				that.config.loading = false;
+			}
+		});
+	},
+
+	/**
+	 * 判断登录
+	 * @param {Object} type 0不跳转登录 1跳转登录
+	 * @param {Object} success
+	 */
+	login: function(type, success) {
+		if (typeof type == 'function') {
+			success = type;
+			type = 1;
+		} else if (typeof type == 'undefined') {
+			type = 1;
+		}
+		var that = this;
+		/* var userInfo = this.getUserInfo();
+		if (this.isEmpty(userInfo)) {
+			if (type == 1) {
+				that.info('请先登录', function() {
+					var pages = getCurrentPages();
+					var route = pages[pages.length - 1].route;
+					// if (route != 'pages/login/choose') {
+					// 	that.jump('/pages/login/choose');
+					// }
+				});
+			}
+			return false;
+		} */
+		// return success && success(userInfo) || userInfo;
+		return success
+	},
+
+	/**
+	 * 页面跳转
+	 * @param url
+	 * @param type
+	 */
+	jump: function(url, type, params) {
+		var that = this;
+		if (that.isEmpty(url) && type !== -1) return false;
+		if (url === -1) {
+			var delta = type || 1;
+			type = url;
+		} else if (type === -1) {
+			var delta = 1;
+			if (params && params.delta) {
+				delta = params.delta;
+			}
+		}
+		type = type || 0, //默认0
+			params = params || {};
+		if (that.isEmpty(params)) {
+			cache.remove('jump_data');
+		} else {
+			cache.set('jump_data', params);
+		}
+		switch (type) {
+			case -1:
+				//关闭当前页面,返回上一页面或多级页面 delta:1 返回层数
+				setTimeout(function() {
+					uni.navigateBack({
+						delta: delta
+					});
+				}, 800);
+				return;
+			case 0:
+				//保留当前页面,跳转到应用内的某个页面,使用uni.navigateBack可以返回到原页面
+				uni.navigateTo({
+					url: url
+				});
+				return;
+			case 1:
+				//关闭当前页面,跳转到应用内的某个页面
+				uni.redirectTo({
+					url: url
+				});
+				return;
+			case 2:
+				//关闭所有页面,打开到应用内的某个页面
+				uni.reLaunch({
+					url: url
+				});
+				return;
+			case 3:
+				//跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面
+				uni.switchTab({
+					url: url
+				});
+				return;
+			default:
+				return false;
+		}
+	},
+
+	/**
+	 * 数据请求
+	 */
+	req: function(option, onsuccess, onerror, oncomplete) {
+		if (option == 'undefined') return false;
+		var that = this,
+			config = {
+				sign: false, //是否签名数据
+				load: false, //是否显示loading提示
+				login: false, //是否需要登录
+				url: false,
+				data: option.data,
+				header: {
+					'content-type': 'application/x-www-form-urlencoded',
+					'Authorization': uni.getStorageSync('token').token
+				},
+				method: 'post',
+				dataType: 'json',
+				success: function(res) { //通讯成功
+
+					that.jslog('请求:' + option.url);
+					that.jslog(res.data);
+
+					//获取返回数据
+					res = res.data;
+
+					//如果存在回调,优先执行回调函数
+					if (onsuccess) {
+						if (onsuccess(res) === false) {
+							return;
+						}
+					}
+
+					if (typeof(res) == 'object') {
+						(res.info && res.info != 'success') && that.info(res.info);
+						if (res.status == 98) { //未登录或账号不存在
+							cache.remove('user_info');
+							that.login();
+						} else if (res.status == 99) { //token验证失败
+							cache.remove('token');
+						}
+					} else {
+						// that.modal('接口异常');
+					}
+				},
+				fail: function(res) { //通讯失败
+					that.jslog('请求:' + option.url);
+					that.jslog(res);
+					onerror && onerror();
+				},
+				complete: function(res) { //通讯完成
+					option.load && that.closeLoading();
+					oncomplete && oncomplete();
+				}
+			};
+
+		option.data && (option.data = option.data);
+		if (option.url) {
+			option.url = that.config.baseUrl + option.url;
+		} else {
+			return false;
+		}
+
+		option = that.extend({}, config, option);
+		if (option.login && !that.login()) {
+			return false;
+		}
+		// if (!option.data.submit) {
+		// 	option.data.submit = 'yes';
+		// }
+		if (option.sign) {
+			that.getsign(option.data, function(res) {
+				option.data = res;
+				option.load && that.loading(option.load);
+				uni.request(option);
+			})
+		} else {
+			option.load && that.loading(option.load);
+			uni.request(option);
+		}
+	},
+
+	
+	/**
+	 * 获取一个Token,登录成功请清空
+	 * @param {function}  callback :回调函数
+	 */
+	gettoken: function(callback) {
+		var that = this,
+			token = cache.get('token'),
+			timestamp = Date.parse(new Date()) / 1000;
+		// 10分钟缓冲
+		if (token && token.date_expire > (timestamp + 600)) return callback({
+			status: 1,
+			data: token
+		});
+		var uuid = that.uuid(),
+			//clientid=that.getClientId(),
+			uid = that.getUserInfo('id', 0);
+		uni.request({
+			url: that.config.baseUrl + 'token',
+			data: {
+				uuid: uuid,
+				uid: uid,
+				timestamp: timestamp
+			}, //clientid:clientid
+			timeout: 10000, //超时时间设置为10秒
+			success: function(res) {
+				var res = res.data;
+				if (res.status == 1) {
+					cache.set('token', res.data);
+				}
+				return callback(res);
+			},
+			complete: function(res) {
+				that.jslog('获取token:' + res);
+			}
+		});
+	},
+
+	/**
+	 * 数据签名
+	 * @param {string}     data:要签名的数据
+	 * @param {function}   onsuccess:成功回调函数
+	 * @param {function}   onerror:失败回调函数
+	 */
+	getsign: function(param, onsuccess, onerror) {
+		var that = this,
+			arr = [];
+		param._sign_uuid = that.uuid();
+		param._sign_uid = that.getUserInfo('id', 0);
+		param._timestamp = Date.parse(new Date()) / 1000;
+		param._version = that.config.version;
+		that.gettoken(function(res) {
+			if (res.status == 1) {
+				param._sign_token = res.data.token;
+				for (var i in param) {
+					if (!that.isEmpty(param[i], true)) {
+						arr.push(i + '=' + param[i]);
+					}
+				}
+				arr.sort();
+				param._sign = encrypt.sha1(arr.join('&') + res.data.token).toUpperCase();
+				return onsuccess(param);
+			} else {
+				return onerror && onerror(res.info) || that.info(res.info);
+			}
+		});
+	},
+
+	/**
+	 * 格式化参数(password加密)
+	 * @param {string}     query:参数
+	 */
+	formatparam: function(query) {
+		var json = {};
+		if (typeof(query) == 'object') {
+			for (var i in query) {
+				if (i.indexOf('password') > -1) {
+					query[i] = encrypt.md5(encrypt.sha1(query[i]));
+				}
+			}
+			return query;
+		} else {
+			var vars = query.split('&');
+			for (var i = 0; i < vars.length; i++) {
+				var pair = vars[i].split('=');
+				if (pair[0].indexOf('password') != -1) {
+					pair[1] = encrypt.md5(encrypt.sha1(pair[1]));
+				} else {
+					pair[1] = pair[1];
+				}
+				if (typeof json[pair[0]] === 'undefined') {
+					json[pair[0]] = pair[1];
+				} else if (typeof json[pair[0]] === 'string') {
+					var arr = [json[pair[0]], pair[1]];
+					json[pair[0]] = arr;
+				} else {
+					json[pair[0]].push(pair[1]);
+				}
+			}
+			return json;
+		}
+	},
+
+	/**
+	 * 判断是否数组
+	 * 
+	 * 1. 通过object类型的副属性class判断,
+	 * 	其中函数的class是Function,结果是[object Function]
+	 * 	普通的对象是Object,结果是[object Object]
+	 * 	Object.prototype.toString.call(arr) === '[object Array]'	
+	 * 2. 通过原型去判断
+	 * 	arr.constructor === Array	
+	 * 	Array.prototype.isPrototypeOf(arr)
+	 * 	arr.__proto__ === Array.prototype	
+	 * 	Object.getPrototypeOf(arr) === Array.prototype
+	 * 	arr instanceof Array
+	 * 3. es6新增方法
+	 * 	Array.isArray(arr)	
+	 */
+	isArray: function(arr) {
+		return arr && typeof(arr) == 'object' && Object.prototype.toString.call(arr) === '[object Array]';
+	},
+
+	/**
+	 * 否判断指定参数是否是一个纯粹的对象
+	 * 所谓"纯粹的对象",就是通过"{}"或"new Object"创建的,不包括数组等对象
+	 * 
+	 * 1. 通过object类型的副属性class判断
+	 * 	Object.prototype.toString.call(obj) === '[object Object]'
+	 * 2. 通过原型去判断
+	 * 	obj.constructor === Object
+	 * 	obj instanceof Object(数组也是对象,所以 arr instanceof Object 也为true)
+	 * 3. typeof
+	 * 	typeof obj(除了{},null和[]也是'object')
+	 */
+	isPlainObject: function(obj) {
+		if (Object.getPrototypeOf) {
+			return obj && typeof(obj) == 'object' && Object.getPrototypeOf(obj) == Object.prototype;
+		} else {
+			return obj && typeof(obj) == 'object' && Object.prototype.toString.call(obj) == "[object Object]" &&
+				!obj.length;
+		}
+	},
+
+	/**
+	 * 获取对象大小
+	 * @param object
+	 */
+	getLength: function(object) {
+		return Object.keys(object).length
+	},
+
+	/**
+	 * 判断两个Json(纯粹)对象是否一样
+	 * @param objA
+	 * @param objB
+	 */
+	compareJsonObj: function(objA, objB) {
+		if (!this.isPlainObject(objA) || !this.isPlainObject(objB)) return false; //判断类型是否正确
+		return this.compareObj(objA, objB); //默认为true
+	},
+
+	/**
+	 * 判断两个对象是否一样
+	 * @param objA
+	 * @param objB
+	 * @param flag
+	 */
+	compareObj: function(objA, objB, flag) {
+		if (this.getLength(objA) != this.getLength(objB)) return false;
+		flag = flag || true;
+		for (var key in objA) {
+			if (!flag) //flag为false,则跳出整个循环
+				break;
+			if (!objB.hasOwnProperty(key)) { //是否有自身属性,而不是继承的属性
+				flag = false;
+				break;
+			}
+			if (!this.isArray(objA[key])) { //子级不是数组时,比较属性值        	
+				if (this.isPlainObject(objA[key])) {
+					if (this.isPlainObject(objB[key])) {
+						if (!flag) //这里跳出循环是为了不让递归继续
+							break;
+						flag = this.compareObj(objA[key], objB[key], flag);
+					} else {
+						flag = false;
+						break;
+					}
+				} else {
+					if (String(objB[key]) != String(objA[key])) { //排除数字比较的类型差异
+						flag = false;
+						break;
+					}
+				}
+			} else {
+				if (!this.isArray(objB[key])) {
+					flag = false;
+					break;
+				}
+				var oA = objA[key],
+					oB = objB[key];
+				if (oA.length != oB.length) {
+					flag = false;
+					break;
+				}
+				for (var k in oA) {
+					if (!flag) //这里跳出循环是为了不让递归继续
+						break;
+					flag = this.compareObj(oA[k], oB[k], flag);
+				}
+			}
+		}
+		return flag;
+	},
+
+	/**
+	 * 将一个或多个对象的内容合并到目标对象
+	 * @param  Object target 目标对象,其他对象的成员属性将被附加到该对象上
+	 * @param  Object target 目标对象,第一个被合并的对象
+	 * @param  Object target 目标对象,第二个被合并的对象
+	 */
+	extend: Object.assign || function(target, source, deep) {
+		for (key in source) {
+			if (deep && (this.isPlainObject(source[key]) || this.isArray(source[key]))) {
+				if (this.isPlainObject(source[key]) && !this.isPlainObject(target[key])) {
+					target[key] = {};
+				}
+				if (this.isArray(source[key]) && !this.isArray(target[key])) {
+					target[key] = [];
+				}
+				this.extend(target[key], source[key], deep);
+			} else if (source[key] !== undefined) {
+				target[key] = source[key];
+			}
+		}
+		return target;
+	},
+
+	/**
+	 * 判断一个对象是否为空
+	 * @param {string}     string:要判断的参数
+	 * @param {string}     is_zero:是否要判断'0'
+	 */
+	isEmpty: function(string, is_zero = false) {
+		if (is_zero && string === '0') {
+			return true;
+		}
+		// 0 == '',false == '',[] == ''
+		if (string == '' || string == null || typeof(string) == 'undefined' || string == 'undefined') {
+			return true;
+		}
+		// 对象 和 数组
+		if (typeof(string) == 'object') {
+			return this.getLength(string) ? false : true;
+		}
+		return false;
+	},
+
+	/**
+	 * 为客户端生成一个唯一的uuid
+	 */
+	uuid: function() {
+		var uuid,
+			random = function() {
+				return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
+			};
+		uuid = cache.get('uuid');
+		if (!uuid) {
+			uuid = encrypt.sha1(random() + random() + '-' + random() + '-' + random() + '-' + random() + '-' +
+				random() + random() + random());
+			cache.set('uuid', uuid);
+		}
+		return uuid;
+	},
+
+	/**
+	 * 获取设备唯一标识
+	 */
+	getClientId: function() {
+		//获取客户端ID
+		var clientid = cache.get('client_id');
+		if (clientid) return clientid;
+		//TODO::
+	},
+
+	/**
+	 * 获取用户登录信息
+	 * @param k 键值
+	 * @param d 入没有返回的默认值
+	 */
+	getUserInfo: function(k, d) {
+		if (d == 'undefined') {
+			d = 0;
+		}
+		var userInfo = cache.get('user_info');
+		if (this.isEmpty(userInfo)) {
+			return d;
+		} else {
+			if (typeof k == 'undefined') {
+				return userInfo;
+			} else {
+				if (typeof userInfo[k] == 'undefined') {
+					return d;
+				} else {
+					return userInfo[k];
+				}
+			}
+		}
+	},
+
+	/**
+	 * 查找指定值的元素在数组中第一次出现的位置
+	 * 查找指定键的值的元素在二维数组中第一次出现的位置
+	 * @param arr  数组
+	 * @param val  要查找的值
+	 * @param key  二维数组元素的值对应的键
+	 */
+	indexOf: function(arr, val, key) {
+		if (this.isEmpty(arr) || this.isEmpty(val)) return -1;
+		if (typeof key == 'undefined') {
+			for (let i = 0; i < arr.length; i++) {
+				if (arr[i] == val) {
+					return i;
+				}
+			}
+		} else {
+			for (let i = 0; i < arr.length; i++) {
+				if (arr[i][key] == val) {
+					return i;
+				}
+			}
+		}
+		return -1;
+	},
+
+	/**
+	 * (批量)删除数组中指定值的元素
+	 * (批量)删除二维数组中指定键的值的元素
+	 * @param {Object} arr  (二维)数组
+	 * @param {Object} vals 值(数组)
+	 * @param {Object} key	值(数组)组对应的键
+	 */
+	removeItemByVals: function(arr, vals, key) {
+		var that = this;
+		if (this.isEmpty(arr) || this.isEmpty(vals)) return arr;
+		if (this.isArray(vals)) {
+			//!倒序删除
+			if (typeof key == 'undefined') {
+				for (let i = arr.length - 1; i >= 0; i--) {
+					let index = that.indexOf(vals, arr[i]);
+					if (index > -1) {
+						arr.splice(i, 1);
+					}
+				}
+			} else {
+				for (let i = arr.length - 1; i >= 0; i--) {
+					let index = that.indexOf(vals, arr[i][key]);
+					if (index > -1) {
+						arr.splice(i, 1);
+					}
+				}
+			}
+		} else {
+			let index = this.indexOf(arr, vals, key);
+			if (index > -1) {
+				arr.splice(index, 1);
+			}
+		}
+		return arr;
+	},
+
+	/**
+	 * 批量删除数组中指定键的元素
+	 * @param {Object} arr   数组
+	 * @param {Object} indexs 序号(数组)
+	 */
+	removeItemByIndex: function(arr, indexs) {
+		var that = this;
+		if (this.isEmpty(arr) || this.isEmpty(indexs)) return arr;
+		if (this.isArray(indexs)) {
+			//!倒序删除
+			for (let i = arr.length - 1; i >= 0; i--) {
+				let index = that.indexOf(indexs, i);
+				if (index > -1) {
+					arr.splice(i, 1);
+				}
+			}
+		} else {
+			arr.splice(indexs, 1);
+		}
+		return arr;
+	},
+
+	/**
+	 * 返回数组中某个单一列的值
+	 */
+	array_column: function(arr, key) {
+		if (this.isEmpty(arr)) return arr;
+		if (this.isEmpty(key)) return [];
+		var vals = [];
+		arr.forEach(item => {
+			vals.push(item[key]);
+		});
+		return vals;
+	},
+
+	/**
+	 * 对象按照key排序
+	 * @param {Object} arr
+	 */
+	array_ksort: function(arr) {
+		let sorted = {},
+			keys = Object.keys(arr);
+		keys.sort();
+		keys.forEach((key) => {
+			sorted[key] = arr[key];
+		})
+		return sorted;
+	},
+
+	/**
+	 * 数组按元素(指定键值)排序
+	 * @param {Object} arr
+	 * @param {Object} key
+	 * @param {Object} sort asc desc
+	 */
+	array_vsort: function(arr, key, sort) {
+		if (this.isEmpty(arr)) return arr;
+		key = key || '';
+		sort = sort || 'asc';
+		if (key == '') {
+			return arr.sort();
+		} else {
+			if (sort == 'asc') {
+				return arr.sort(function(a, b) {
+					return a[key] - b[key];
+				});
+			} else {
+				return arr.sort(function(a, b) {
+					return b[key] - a[key];
+				});
+			}
+		}
+	},
+
+	/**
+	 * 日期时间格式化
+	 * @param {Object} date 日期对象
+	 * @param {Object} type 增加加的时间间隔:y年 q季度(3个月) m月 d天
+	 * @param {Object} number 增加的时间间隔的个数
+	 * @param {Object} format 格式化样式
+	 */
+	formatDate: function({
+		date = '',
+		type = 'y',
+		number = 0,
+		format = 'Y-m-d H:i:s'
+	}) {
+		var that = this;
+		if (that.isEmpty(date, true)) {
+			date = new Date();
+		} else {
+			if (typeof date == 'number') {
+				date = new Date(parseInt(date) * 1000);
+			} else if (typeof date == 'string') {
+				date = new Date(date);
+			}
+		}
+		date = that.addDate(type, number, date);
+		var zero = function(value) {
+				if (value < 10) {
+					return '0' + value;
+				}
+				return value;
+			},
+			year = date.getFullYear(),
+			month = zero(date.getMonth() + 1),
+			day = zero(date.getDate()),
+			hour = zero(date.getHours()),
+			minite = zero(date.getMinutes()),
+			second = zero(date.getSeconds());
+		return format.replace(/Y|m|d|H|i|s/ig, function(matches) {
+			return ({
+				Y: year,
+				m: month,
+				d: day,
+				H: hour,
+				i: minite,
+				s: second,
+			})[matches];
+		});
+	},
+
+	/**
+	 * 日期时间计算
+	 * addDate(type,number,date)
+	 * @param {Object} type 增加的时间间隔:y年 q季度(3个月) m月 d天
+	 * @param {Object} number 增加的时间间隔的个数
+	 * @param {Object} date 开始日期对象
+	 * @return {type} 新的日期对象
+	 * var now = new Date();
+	 * var newDate = addDate( "d", 5, now);
+	 */
+	addDate: function(type, number, date) {
+		switch (type) {
+			case "y": {
+				date.setFullYear(date.getFullYear() + number);
+				return date;
+				break;
+			}
+			case "q": {
+				date.setMonth(date.getMonth() + number * 3);
+				return date;
+				break;
+			}
+			case "m": {
+				date.setMonth(date.getMonth() + number);
+				return date;
+				break;
+			}
+			case "w": {
+				date.setDate(date.getDate() + number * 7);
+				return date;
+				break;
+			}
+			case "d": {
+				date.setDate(date.getDate() + number);
+				return date;
+				break;
+			}
+			case "h": {
+				date.setHours(date.getHours() + number);
+				return date;
+				break;
+			}
+			case "m": {
+				date.setMinutes(date.getMinutes() + number);
+				return date;
+				break;
+			}
+			case "s": {
+				date.setSeconds(date.getSeconds() + number);
+				return date;
+				break;
+			}
+			default: {
+				date.setDate(date.getDate() + number);
+				return date;
+				break;
+			}
+		}
+	},
+
+	/**
+	 * 二维码操作
+	 * @param {Object} canvas		图片路径
+	 * @param {Object} action 	操作类型 
+	 * 	qrcode:绘制二维码(根据内容data)
+	 * 	scan:扫描二维码
+	 * @param {Object} canvas 	绘制二维码canvasID
+	 * @param {Object} data 	绘制二维码内容
+	 * @param {Object} camera 扫描二维码是否只使用相机
+	 * @param {Object} success 	成功回调
+	 * @param {Object} error 	失败回调
+	 */
+	qrCodeOperat({
+		action = 'qrcode',
+		canvas,
+		data,
+		camera = false,
+		success,
+		error
+	}) {
+		var that = this;
+		switch (action) {
+			case 'qrcode':
+				qrCode({
+					width: 180,
+					height: 180,
+					x: 20,
+					y: 20,
+					canvasId: canvas,
+					text: data,
+				});
+				break;
+			case 'scan':
+				uni.scanCode({
+					onlyFromCamera: camera,
+					success(res) {
+						if (res.errMsg == 'scanCode:ok') {
+							// 二维码内容 res.result
+							success && success(res.result);
+						} else {
+							error && error(res);
+						}
+					},
+					fail(res) {
+						if (res.errMsg != 'scanCode:fail cancel') {
+							error && error(res);
+						}
+					}
+				});
+				break;
+			default:
+				that.modal('请明确二维码操作类型');
+		}
+	},
+
+	/**
+	 * 图片操作
+	 * @param {Object} path		图片路径
+	 * @param {Object} action 	操作类型 
+	 *  choose:选择图片
+	 *  upload:图片上传
+	 * 	info:图片信息 
+	 * 	read:读取图片(base64)
+	 *  write:保存图片(base64)
+	 * 	down:下载图片
+	 *  save:保存图片(临时路径)
+	 *  preview:图片预览
+	 * @param {Object} data 	保存图片:图片base64内容(不带 data:image/png;base64,),
+	 * 							图片预览:图片数组
+	 * @param {Object} fileName 保存图片的名称
+	 * @param {Object} menu 	图片预览:是否显示长按菜单
+	 * @param {Object} count 	图片选择:默认图片选择数量
+	 * @param {Object} success 	成功回调
+	 * @param {Object} error 	失败回调
+	 */
+	imageOperat({
+		action = 'choose',
+		path,
+		fileName = 'write',
+		data,
+		count = 1,
+		menu = true,
+		success,
+		error
+	}) {
+		var that = this;
+		if (action == 'choose') {
+			uni.chooseImage({
+				count: count,
+				sizeType: ['original', 'compressed'], //可以指定是原图还是压缩图,默认二者都有
+				sourceType: ['camera', 'album'], //相册选择、使用相机
+				success: (e) => {
+					e.tempFilePaths.forEach((item) => {
+						success && success(item);
+					});
+				},
+				fail(e) {
+					error && error(e);
+				}
+			});
+		} else if (action == 'upload') {
+			uni.uploadFile({
+				url: that.config.baseUrl + '/api/Publics/uploadLocality',
+				filePath: path,
+				name: 'upfile',
+				/* header: {
+					'content-type': 'multipart/form-data'
+				}, */
+				formData: {
+					// uid: that.getUserInfo('id', 0)
+					file: path
+				},
+				success(e) {
+					console.log(e)
+					let res = JSON.parse(e.data);
+					if (res.status == 1) {
+						success && success(res);
+					} else {
+						error && error({
+							errMsg: res.info
+						});
+					}
+				},
+				fail(e) {
+					error && error(e);
+				}
+			});
+		} else if (action == 'info') {
+			uni.getImageInfo({
+				src: path,
+				success(e) {
+					if (e.errMsg == 'getImageInfo:ok') {
+						//e.height e.width e.type
+						success && success(e);
+					} else {
+						error && error(e);
+					}
+				},
+				fail(e) {
+					error && error(e);
+				}
+			});
+		} else if (action == 'read') {
+			uni.getFileSystemManager().readFile({
+				filePath: path,
+				encoding: 'base64',
+				position: 0,
+				success(e) {
+					if (e.errMsg == 'readFile:ok') {
+						//let img = 'data:image/png;base64,' + e.data.replace(/[\r\n]/g, "");
+						success && success(e);
+					} else {
+						error && error(e);
+					}
+				},
+				fail(e_t) {
+					error && error(e);
+				}
+			});
+		} else if (action == 'write') {
+			let filePath = `${uni.env.USER_DATA_PATH}/${fileName}.png`;
+			uni.getFileSystemManager().writeFile({
+				filePath: filePath,
+				data: data,
+				encoding: 'base64',
+				success(e) {
+					if (e.errMsg == 'writeFile:ok') {
+						success && success(filePath);
+					} else {
+						error && error(e);
+					}
+				},
+				fail(e) {
+					console.log(e);
+					error && error(e);
+				}
+			});
+		} else if (action == 'down') {
+			uni.downloadFile({
+				url: path,
+				success(e) {
+					if (e.errMsg === 'downloadFile:ok') {
+						//e.tempFilePath
+						success && success(e);
+					} else {
+						error && error(e);
+					}
+				},
+				fail(e) {
+					error && error(e);
+				}
+			})
+		} else if (action == 'save') {
+			let filePath = `${uni.env.USER_DATA_PATH}/${fileName}.png`;
+			uni.getFileSystemManager().saveFile({
+				tempFilePath: path,
+				filePath: filePath,
+				success(e) {
+					if (e.errMsg == 'saveFile:ok') {
+						success && success(filePath);
+					} else {
+						error && error(e);
+					}
+				},
+				fail(e) {
+					console.log(e);
+					error && error(e);
+				}
+			});
+		} else if (action == 'preview') {
+			uni.previewImage({
+				currnet: path,
+				urls: data,
+				showmenu: menu
+			});
+		}
+	},
+	/**
+	 * 视频操作
+	 */
+	viedoOperat({
+		action = 'choose',
+		count = 1, //上传视频的个数
+		mediaType = ['video'], //限制上传的类型为video
+		sourceType = ['album', 'camera'], //视频选择来源
+		maxDuration = 58, //拍摄限制时间
+		camera = 'back', //采用后置摄像头
+		filePath,
+		path,
+		size = 20,
+		success,
+		error
+	}) {
+		var that = this
+		if (action == 'choose') {
+			uni.chooseMedia({
+				count: count,
+				mediaType: mediaType,
+				sourceType: sourceType,
+				maxDuration: maxDuration,
+				camera: camera,
+				success(e) {
+					console.log(e)
+					if (e.errMsg == 'chooseMedia:ok') {
+						e.tempFiles.forEach((item) => {
+							let sel_size = parseFloat(item.size / 1024 / 1024).toFixed(1)
+							if (sel_size > size) {
+								let beyongSize = sel_size - size //获取视频超出限制大小的数量
+								that.info("上传的视频大小超限,超出" + beyongSize + "MB,请重新上传!")
+								error && error();
+							} else {
+								success && success(item);
+							}
+						});
+					} else {
+						error && error(e);
+					}
+				},
+				fail(e) {
+					console.log(e);
+					error && error(e);
+				}
+			})
+		}
+		//压缩视频
+		if (action == 'compress') {
+			uni.compressVideo({
+				quality: 'high',
+				src: filePath,
+				success(e) {
+					console.log(e)
+					if (e.errMsg == 'compressVideo:ok') {
+						// e.tempFiles.forEach((item) => {
+						success && success(e);
+						// });
+					} else {
+						error && error(e);
+					}
+				},
+				fail(e) {
+					console.log(e);
+					error && error(e);
+				}
+			})
+		}
+	},
+	/**
+	 * 位置服务
+	 * @param {Object} action 	操作类型 
+	 * 	getLocation: 获取当前的地理位置、速度
+	 *  openLocation: 使用微信内置地图查看位置
+	 *  chooseLocation: 打开地图选择位置
+	 *  choosePoi: 打开 POI 列表选择位置
+	 * 	getLatLng: 获取指定地址经纬度
+	 *  getAreaCode: 根据经纬度获取区划信息
+	 *  getDistance: 计算2个经纬度之间的距离
+	 * @param {Object} type 	返回坐标类型: wgs84返回gps坐标,gcj02 返回可用于 uni.openLocation 的坐标
+	 * @param {Object} address 	查询地址: '北京市海淀区彩和坊路海淀西大街74号'
+	 * @param {Object} from 	计算距离起点坐标,默认当前位置
+	 * {latitude: 0, longitude: 0}
+	 * @param {Object} to 		计算距离终点坐标
+	 * [{latitude: 0, longitude: 0}]
+	 * @param {Object} success 	成功回调
+	 * @param {Object} error 	失败回调
+	 */
+	locationOperat({
+		action = 'getLocation',
+		type = 'gcj02',
+		address,
+		from = '',
+		to,
+		success,
+		error
+	}) {
+		var that = this;
+		if (action == 'getLocation') {
+			uni.getLocation({
+				type: type,
+				success(e) {
+					if (e.errMsg == 'getLocation:ok') {
+						success && success(e);
+					} else {
+						error && error(e);
+					}
+				},
+				fail(e) {
+					error && error(e);
+				}
+			});
+		} else if (action == 'openLocation') {
+			var {
+				latitude,
+				longitude
+			} = from;
+			uni.openLocation({
+				latitude: latitude,
+				longitude: longitude,
+				success(e) {
+					if (e.errMsg == 'openLocation:ok') {
+						success && success(e);
+					} else {
+						error && error(e);
+					}
+				},
+				fail(e) {
+					error && error(e);
+				}
+			});
+		} else if (action == 'chooseLocation') {
+			var {
+				latitude = '',
+					longitude = ''
+			} = from;
+			uni.chooseLocation({
+				latitude: latitude,
+				longitude: longitude,
+				success(e) {
+					if (e.errMsg == 'chooseLocation:ok') {
+						success && success(e);
+					} else {
+						error && error(e);
+					}
+				},
+				fail(e) {
+					error && error(e);
+				}
+			});
+		} else if (action == 'choosePoi') {
+			var {
+				latitude = '',
+					longitude = ''
+			} = from;
+			uni.choosePoi({
+				success(e) {
+					if (e.errMsg == 'choosePoi:ok') {
+						success && success(e);
+					} else {
+						error && error(e);
+					}
+				},
+				fail(e) {
+					error && error(e);
+				}
+			});
+		} else if (action == 'getLatLng') {
+			new qqMap({
+				key: that.config.qqMapKey
+			}).geocoder({
+				address: address,
+				success(e) {
+					if (e.status == 0 && e.message == 'query ok') {
+						success && success(e.result);
+					} else {
+						error && error(e);
+					}
+				},
+				fail(e) {
+					error && error(e);
+				}
+			});
+		} else if (action == 'getAreaCode') {
+			new qqMap({
+				key: that.config.qqMapKey
+			}).reverseGeocoder({
+				success(e) {
+					if (e.status == 0 && e.message == 'query ok') {
+						success && success(e.result);
+					} else {
+						error && error(e);
+					}
+				},
+				fail(e) {
+					error && error(e);
+				}
+			});
+		} else if (action == 'getDistanceApi') {
+			new qqMap({
+				key: that.config.qqMapKey
+			}).calculateDistance({
+				from: from, //若起点有数据则采用起点坐标,若为空默认当前地址
+				to: to,
+				success(e) {
+					if (e.status == 0 && e.message == 'query ok') {
+						success && success(e.result.elements);
+					} else {
+						error && error(e);
+					}
+				},
+				fail(e) {
+					error && error(e);
+				}
+			});
+		} else if (action == 'getDistanceMath') { // 返回KM
+			var {
+				latitude: lat1 = '',
+				longitude: lng1 = ''
+			} = from;
+			if (lat1 == '' && lng1 == '') {
+				return 0;
+			}
+			var {
+				latitude: lat2 = '',
+				longitude: lng2 = ''
+			} = to;
+			var toRad = function(d) {
+				return d * Math.PI / 180;
+			};
+			var dis = 0;
+			var deltaLng = toRad(lng1) - toRad(lng2);
+			var radLat1 = toRad(lat1);
+			var radLat2 = toRad(lat2);
+			var deltaLat = radLat1 - radLat2;
+			var dis = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(deltaLat / 2), 2) + Math.cos(radLat1) * Math.cos(
+				radLat2) * Math.pow(Math.sin(deltaLng / 2), 2)));
+			return that.math.toFixed(dis * 6378.137, 2); // km
+		}
+	},
+
+	/**
+	 * 过滤emoji
+	 * @param {Object} str
+	 */
+	filterEmoji: function(str) {
+		return str.replace(/\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDE4F]/g, '');
+	},
+
+	/**
+	 * 打印对象
+	 * @param obj
+	 */
+	jslog: function(obj) {
+		this.config.debug && console.log(JSON.stringify(obj));
+	},
+
+	/**
+	 * form表单数据校验
+	 * @param value
+	 * @param rule
+	 */
+	formCheck: function(value, rule, error) {
+		var that = this;
+		var regs = {
+			required: [
+				/[\s\S]+/,
+				'必填项不能为空',
+			],
+			english: [
+				/^[a-zA-Z]+$/,
+				'必填项只能由大小写字母组成',
+			],
+			mobile: [
+				/^1[3|4|5|7|8|9][0-9]\d{4,8}$/,
+				'请输入正确的手机号',
+			],
+			phone: [
+				/^(\d{3,4}-?)?\d{7,9}$/g,
+				'请输入正确的电话号码',
+			],
+			email: [
+				/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,
+				'请输入正确的电子邮箱'
+			],
+			url: [
+				/(^#)|(^http(s*):\/\/[^\s]+\.[^\s]+)/,
+				'请输入正确的链接'
+			],
+			number: [
+				/^\d+$/,
+				'必填项只能填数字'
+			],
+			code4: [
+				/^\d{4}$/,
+				'请输入正确的手机验证码'
+			],
+			code6: [
+				/^\d{6}$/,
+				'请输入正确的手机验证码'
+			],
+			captcha4: [
+				/^[0-9a-zA-Z]{4}$/,
+				'请输入正确的图片验证码'
+			],
+			date: [
+				/^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/,
+				'请输入正确的日期格式'
+			],
+			identity: [
+				/(^\d{15}$)|(^\d{17}(x|X|\d)$)/,
+				'请输入正确的身份证号'
+			],
+			username: [
+				/^[a-zA-Z0-9\u4e00-\u9fa5-_\.]{2,12}$/,
+				'请输入正确的帐号(只能包含中文、英文、数字、下划线等字符)'
+			],
+			password: [
+				/^\w{6,16}$/,
+				'请输入正确的密码(6-16位数字,字母或符号)'
+			],
+			passwords: [
+				/^[a-zA-Z]+\w{5,12}$/,
+				'请输入正确的密码(以字母开头,长度在6-12之间)'
+			],
+			pwd: [
+				/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9a-zA-Z]{6,12}$/,
+				'请输入正确的密码(6-12位数字+字母组合)'
+			],
+			invite: [
+				/^[0-9a-zA-Z]{10}$/,
+				'邀请码为8位数字或字母组合'
+			],
+			truename: [
+				/^[\u4e00-\u9fa5]{2,4}$/,
+				'请输入正确的真实姓名(2-4个汉字)'
+			],
+			money: [
+				/((^[1-9]\d*)|^0)(\.\d{0,2}){0,1}$/,
+				'请输入正确的金额'
+			]
+		};
+		var reg = regs[rule];
+		if (that.isEmpty(reg)) {
+			return true;
+		} else {
+			if (value == '' || !RegExp(reg[0]).test(value)) {
+				that.info(error || reg[1]);
+				return false;
+			}
+			return true;
+		}
+	},
+
+	/****************************************************/
+
+	/**
+	 *获取系统信息
+	 * @param label 获取系统的某一项信息
+	 * screenWidth		屏幕宽度,
+	 * screenHeight 	屏幕高度,单位px
+	 * windowWidth		单位px可使用窗口宽度,单位px
+	 * windowHeight		可使用窗口高度,单位px
+	 * statusBarHeight	状态栏的高度,单位px
+	 * menuButton:右上角胶囊按钮的布局位置信息,坐标信息以屏幕左上角为原点
+	 * width			宽度,单位:px
+	 * height			高度,单位:px
+	 * top				上边界坐标,单位:px
+	 * right			右边界坐标,单位:px
+	 * bottom			下边界坐标,单位:px
+	 * left				左边界坐标,单位:px
+	 */
+	getSystemInfo(success) {
+		// 获取系统状态栏信息
+		uni.getSystemInfo({
+			success: (res) => {
+				if (res.errMsg == 'getSystemInfo:ok') {
+					res.menuButton = uni.getMenuButtonBoundingClientRect();
+					success && success(res);
+				} else {
+					that.modal('获取系统信息失败:' + res.errMsg);
+				}
+			},
+			fail: (res) => {
+				that.modal('获取系统信息失败:' + res.errMsg);
+			}
+		});
+	},
+
+	/**
+	 * 检查登录
+	 */
+	getSessionKey: function(success) {
+		let that = this;
+		let data = {};
+		data.openid = cache.get('open_id');
+		data.session_key = cache.get('session_key');
+		// 都存在
+		if (!that.isEmpty(data.session_key) && !that.isEmpty(data.openid)) {
+			uni.checkSession({
+				success() {
+					success && success(data);
+				},
+				fail() {
+					cache.remove('open_id');
+					cache.remove('session_key');
+					that.getOpenId(success);
+				}
+			});
+		} else {
+			cache.remove('open_id');
+			cache.remove('session_key');
+			that.getOpenId(success);
+		}
+	},
+
+	/**
+	 * 获取openid
+	 * @param success
+	 */
+	getOpenId: function(success, error) {
+		var that = this;
+		that.loading();
+		uni.login({
+			success: (e) => {
+				that.req({
+					url: 'public/getOpenid',
+					data: {
+						code: e.code
+					},
+					login: false,
+					load: false
+				}, function(res) {
+					if (res.status == 1) {
+						cache.set('open_id', res.data.openid);
+						cache.set('session_key', res.data.session_key);
+						success && success(res.data);
+					} else {
+						that.modal('微信登录失败:' + res.info, function() {
+							error && error();
+						});
+						return false;
+					}
+				}, function() {}, function() {
+					that.closeLoading();
+				});
+			},
+			fail: (e) => {
+				that.closeLoading();
+				that.modal('微信登录失败:' + e.errMsg, function() {
+					error && error();
+				});
+			}
+		});
+	},
+
+	/**
+	 * 登录
+	 * @param {Object} data
+	 * @param {Object} success
+	 * @param {Object} error
+	 */
+	doLogin: function(data, success, error) {
+		var that = this;
+		data.loginsubmit = 'yes';
+		this.req({
+			url: 'account/login',
+			data: data,
+			login: false
+		}, function(res) {
+			if (res.status == 1) {
+				cache.set('user_info', res.data);
+				success && success(res.data);
+			} else {
+				error && error(res);
+			}
+		});
+	},
+
+	/**
+	 * 注册
+	 * @param {Object} data
+	 * @param {Object} success
+	 * @param {Object} error
+	 */
+	doRegist: function(data, success, error) {
+		var that = this;
+		data.registsubmit = 'yes';
+		this.req({
+			url: 'account/register',
+			data: data,
+			login: false
+		}, function(res) {
+			if (res.status == 1) {
+				cache.set('user_info', res.data);
+				success && success(res.data);
+			} else {
+				error && error(res);
+			}
+		});
+	},
+
+	/**
+	 * 查询是否注册
+	 * @param {Object} success
+	 * @param {Object} error
+	 */
+	checkRegist: function(success, error) {
+		var that = this;
+		that.getSessionKey(function(data) {
+			that.req({
+				url: 'account/checkRegist',
+				data: {
+					open_id: data.openid,
+					registsubmit: 'yes'
+				},
+				login: false,
+				load: false
+			}, function(res) {
+				if (res.status == 1) {
+					success && success();
+				} else {
+					error && error();
+				}
+			});
+		});
+	},
+
+	/**
+	 * 获取会员信息
+	 * @param {Object} success
+	 * @param {Object} error
+	 */
+	getMemberInfo: function(success, error) {
+		var that = this;
+		this.req({
+			url: 'center/getMemberInfo',
+			load: false
+		}, function(res) {
+			if (res.status == 1) {
+				cache.set('user_info', res.data);
+				success && success(res.data);
+			} else {
+				error && error(res);
+			}
+		});
+	},
+
+	/**
+	 * 获取用户微信资料
+	 * @param success
+	 */
+	getUserProfile: function(success, error) {
+		var that = this;
+		that.loading('获取微信信息中...');
+		uni.getUserProfile({
+			lang: 'zh_CN',
+			desc: '用于完善会员资料',
+			success: (res) => {
+				if (res.errMsg == 'getUserProfile:ok') {
+					// 过滤掉emoji
+					res.userInfo.nickName = that.filterEmoji(res.userInfo.nickName);
+					success(res.userInfo);
+				} else {
+					that.modal('获取微信信息失败:' + res.errMsg, function() {
+						error && error(res);
+					});
+				}
+			},
+			fail: (res) => {
+				that.modal('获取微信信息失败:' + res.errMsg, function() {
+					console.log(res)
+					error && error(res);
+				});
+			},
+			complete: () => {
+				that.closeLoading();
+			}
+		});
+	},
+
+	/**
+	 * 获取配置信息
+	 * @param success
+	 */
+	getConfigInfo: function({
+		source = 'system',
+		label = '',
+		success
+	}) {
+		this.req({
+			url: 'public/configInfo',
+			data: {
+				source: source,
+				label: label
+			},
+			login: false,
+			load: false
+		}, function(res) {
+			success(res.data);
+		});
+	},
+
+	/**
+	 * 获取微信手机号
+	 * @param e
+	 * @param success
+	 */
+	getMobile: function(e, success) {
+		var that = this;
+		that.getSessionKey(function(data) {
+			if (e.detail.errMsg == 'getPhoneNumber:ok') {
+				that.req({
+					url: 'public/getMobile',
+					data: {
+						encryptedData: e.detail.encryptedData,
+						iv: e.detail.iv,
+						sessionKey: data.session_key
+					},
+					login: false
+				}, function(res) {
+					if (res.status == 1) {
+						success(res.data);
+					} else {
+						that.modal('获取手机号失败' + res.info);
+						return false;
+					}
+				});
+			} else {
+				that.modal('获取手机号失败' + e.detail.errMsg);
+			}
+		});
+	},
+
+	/**
+	 * 拨打电话
+	 * @param mobile
+	 */
+	makeCall: function(mobile) {
+		this.modal('确定拨打' + mobile, function() {
+			uni.makePhoneCall({
+				phoneNumber: mobile
+			});
+		}, true);
+	},
+
+	/**
+	 * 修改页面标题
+	 * @param title
+	 */
+	changeNavBarTitle: function(title) {
+		uni.setNavigationBarTitle({
+			title: title
+		});
+	},
+
+	/**
+	 * 检查版本更新
+	 */
+	checkUpdate: function() {
+		if (uni.canIUse('getUpdateManager')) {
+			const updateManager = uni.getUpdateManager()
+			updateManager.onCheckForUpdate(function(res) {
+				if (res.hasUpdate) {
+					updateManager.onUpdateReady(function() {
+						uni.showModal({
+							title: '更新提示',
+							content: '新版本已经准备好,是否重启应用?',
+							success: function(res) {
+								if (res.confirm) {
+									updateManager.applyUpdate()
+								}
+							}
+						})
+					})
+					updateManager.onUpdateFailed(function() {
+						uni.showModal({
+							title: '已经有新版本了~',
+							content: '新版本已经上线啦~,请您删除当前小程序,重新搜索打开~'
+						})
+					})
+				}
+			})
+		} else {
+			uni.showModal({
+				title: '提示',
+				content: '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。'
+			})
+		}
+	},
+	/**
+	 * html转义
+	 * @param {object} str    //需要转义内容
+	 * @param {object} success  
+	 */
+	escape2Html(str, success) {
+		var arrEntities = {
+			'lt': '<',
+			'gt': '>',
+			'nbsp': ' ',
+			'amp': '&',
+			'quot': '"'
+		};
+		return str.replace(/&(lt|gt|nbsp|amp|quot);/ig, function(all, t) {
+			return arrEntities[t];
+		}).replace(/<section/g, '<div').replace(/<u>/g, '').replace(/<u style="">/g, '').replace(/<\/u>/g, '');
+	},
+	/**
+	 * 分享信息
+	 */
+	shareInfo: function() {
+		var that = this;
+		var userInfo = cache.get('user_info');
+		if (!that.isEmpty(userInfo) && !that.isEmpty(userInfo.serial)) {
+			var path = `/pages/index/index?invite_code=${userInfo.serial}`;
+		} else {
+			var path = '/pages/index/index';
+		}
+		return {
+			title: that.config.name,
+			path: path,
+			// imageUrl: '/image/iconimg/login.png'
+		};
+	},
+	/**
+	 * 检测是否收藏
+	 * @param {object} id    //检测是否收藏的商品id
+	 * @param {object} success  
+	 */
+	checkStore(id, key, success) {
+		var that = this
+		var shopStore = cache.get(key);
+		if (that.isEmpty(shopStore)) {
+			success && success(false)
+		} else {
+			var have = 0
+			for (let i in shopStore) {
+				var d = shopStore[i];
+				if (d.id == id) {
+					// 有收藏
+					have = 1
+					success && success(true)
+					break;
+				}
+				if (have == 0) {
+					// 无收藏
+					success && success(false)
+				}
+			}
+		}
+	},
+	/**
+	 * 收藏缓存
+	 * @param {object} id    //需要收藏或取消的商品id
+	 * @param {object} success  
+	 */
+	changeStore(data, key, success) {
+		var shopStore = cache.get(key);
+		var that = this
+		var p = {}
+		p = data
+		if (that.isEmpty(shopStore)) {
+			var shopStore = []
+			shopStore.push(p);
+			cache.set(key, shopStore);
+			success && success('收藏成功')
+		} else {
+			var have = 0
+			for (let i in shopStore) {
+				var d = shopStore[i];
+				console.log(d, data)
+				if (d.id == data.id && d.table == data.table) {
+					// 有的话取消收藏
+					have = 1
+					shopStore.splice(i, 1);
+					cache.set(key, shopStore);
+					success && success('取消成功')
+					break;
+				}
+			}
+			if (have == 0) {
+				// 没有的话收藏
+				shopStore.push(p);
+				cache.set(key, shopStore);
+				success && success('收藏成功')
+			}
+		}
+	},
+
+	/****************************************************/
+
+	/**
+	 * 获取购物车信息,设置导航红点信息
+	 * @param index 设置信息 tabBar 序号
+	 */
+	getshopcar: function(success) {
+		var shopCar_list = cache.get('shop_car');
+		if (this.isEmpty(shopCar_list)) {
+			uni.hideTabBarRedDot({ //隐藏 tabBar 某一项的右上角文本
+				index: 2, //第几个 tabBar,从左边 0 算起
+				success: function() {
+					success && success(0);
+				}
+			});
+		} else {
+			var len = this.getLength(shopCar_list);
+			uni.setTabBarBadge({ //为 tabBar 某一项的右上角添加文本
+				index: 2, //第几个 tabBar,从左边 0 算起
+				text: String(len), //右上角添加的文本
+				success: function() {
+					success && success(len);
+				}
+			});
+		}
+	},
+	/**
+	 * 上拉刷新加载数据
+	 * @param {object} type
+	 * @param {object} page
+	 * @param {object} succes
+	 */
+	onReachFoot: function(url, data, succes) {
+		//type=1时请求找工作
+		if (url) {
+			this.req({
+				url: url,
+				data: data
+			}, function(res) {
+				if (res.status == 1) {
+					succes && succes(res.data);
+				}
+			})
+		} else {
+			succes && success(false)
+		}
+	},
+	/**
+	 * 电话聊天控制
+	 * @param price 价格
+	 * @param mobile 手机号
+	 * @param work_id 工作或求职id
+	 * @param {String} type 类型,work招工,worker求职
+	 * @param {String} buy_type 购买类型 pirce电话,chat_price聊天
+	 * @param send_id 被购买的用户id
+	 * @param send_name 被购买的名字
+	 */
+	makeCall(price, mobile, work_id, type, buy_type, send_id, send_name = '') {
+		var that = this
+		that.modal('将自动使用会员次数或东豆进行抵扣', function(params) {
+			that.req({
+				url: 'center/MobileOrMessage',
+				data: {
+					price: price,
+					mobile: mobile,
+					work_id: work_id,
+					type: type,
+					buy_type: buy_type,
+					send_id: send_id,
+					send_name: send_name
+				}
+			}, function(params) {
+				if (params.status == 1) {
+					if (buy_type == 'price') {
+						uni.makePhoneCall({
+							phoneNumber: mobile,
+						})
+					} else {
+						that.jump('/pages/chat/chat?id=' + send_id + '&nickname=' + send_name)
+					}
+				}
+				if (params.status == 2) {
+
+				}
+			})
+		}, true)
+	},
+	/**
+	 * 微信小程序防抖
+	 * @param func 防抖事件
+	 * @param wait 阻止时间
+	 */
+	debounce: function(func, wait) {
+		let timeout;
+		return function() {
+			console.log('防抖事件:' + func, '防抖时间:' + wait)
+			let context = this
+			let args = arguments
+			let later = () => {
+				timeout = null
+				func.apply(context, args)
+			}
+			clearTimeout(timeout)
+			timeout = setTimeout(later, wait)
+		}
+	}
+}

+ 102 - 0
static/js/cache.js

@@ -0,0 +1,102 @@
+/**
+ * 缓存数据优化
+ * var cache = require('utils/cache.js');
+ * import cache from '../cache'
+ * 使用方法 【
+ *     一、设置缓存
+ *         string    cache.put('k', 'string你好啊');
+ *         json      cache.put('k', { "b": "3" }, 2);
+ *         array     cache.put('k', [1, 2, 3]);
+ *         boolean   cache.put('k', true);
+ *     二、读取缓存
+ *         默认值    cache.get('k')
+ *         string    cache.get('k', '你好')
+ *         json      cache.get('k', { "a": "1" })
+ *     三、移除/清理  
+ *         移除: cache.remove('k');
+ *         清理:cache.clear(); 
+ * 】
+ * @type {String}
+ */
+module.exports = {
+	/*
+	 * 缓存前缀 
+	 */
+	postfix:'twinkly_',
+	/**
+	 * 设置缓存 
+	 * @param  {[type]} k [键名]
+	 * @param  {[type]} v [键值]
+	 * @param  {[type]} e [过期时间:单位秒]
+	 * @param  {[type]} s 异步回调
+	 */
+    set:function(k, v, e, s){
+		var that=this;
+		var e=e || 0;
+		if(e>0) e=Date.parse(new Date()) + e*1000;
+		if(v){
+			
+			if(typeof s == 'function'){
+				wx.setStorage({
+					key: k,
+					data: v,
+					success() {
+						wx.setStorageSync(that.postfix + k, e)
+						s();
+					}
+				});
+			}else{
+				wx.setStorageSync(that.postfix + k, e)
+				wx.setStorageSync(k, v)
+			}
+		}else{
+			that.remove(k);
+		}
+	},
+	/**
+	 * 获取缓存 
+	 * @param  {[type]} k   [键名]
+	 */
+    get:function(k){
+		var that=this,
+		deadtime=wx.getStorageSync(that.postfix + k),
+		data=wx.getStorageSync(k);
+		if(deadtime>0){
+			var now=Date.parse(new Date());
+			if(deadtime<now){
+				return data;
+			}else{
+				return false;
+			}
+		}else{
+			return data;
+		}
+	},
+	/**
+	 * 清理指定缓存
+	 * @return {[type]} [description]
+	 */
+    remove:function(k){
+		var that=this;
+		wx.removeStorageSync(that.postfix + k);
+		wx.removeStorageSync(k);
+	},
+	/**
+	 * 获取缓存并销毁
+	 * @param  {[type]} k   [键名]
+	 * @param  {[type]} def [获取为空时默认]
+	 */
+	getonce:function(k){
+		var that=this;
+		var data=that.get(k);
+		that.remove(k);
+		return data;
+	},
+	/**
+	 * 清理所有缓存
+	 * @return {[type]} [description]
+	 */
+    clear:function(){
+		wx.clearStorageSync();
+	}
+}

+ 618 - 0
static/js/calendar.js

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

+ 1211 - 0
static/js/city.js

@@ -0,0 +1,1211 @@
+
+
+        cityList: [
+            {
+                title: "A",
+                name: [{
+                    "ID": 1,
+                    "TopID": 0,
+                    "AddName": "安徽省",
+                    "hasCity": [{
+                        title: "A",
+                        name: [{ "ID": 32, "TopID": 1, "AddName": "安庆市" }],
+                    },
+                    {
+                        title: "B",
+                        name: [{ "ID": 33, "TopID": 1, "AddName": "蚌埠市" },
+                        { "ID": 34, "TopID": 1, "AddName": "亳州市" }]
+                    },
+                    {
+                        title: "C",
+                        name: [{ "ID": 35, "TopID": 1, "AddName": "池州市" },
+                        { "ID": 36, "TopID": 1, "AddName": "滁州市" }]
+                    },
+                    {
+                        title: "F",
+                        name: [{ "ID": 37, "TopID": 1, "AddName": "阜阳市" }]
+                    },
+                    {
+                        title: "H",
+                        name: [{ "ID": 38, "TopID": 1, "AddName": "合肥市" },
+                        { "ID": 39, "TopID": 1, "AddName": "淮北市" },
+                        { "ID": 40, "TopID": 1, "AddName": "淮南市" },
+                        { "ID": 41, "TopID": 1, "AddName": "黄山市" }]
+                    },
+                    {
+                        title: "L",
+                        name: [{ "ID": 42, "TopID": 1, "AddName": "六安市" }]
+                    },
+                    {
+                        title: "M",
+                        name: [{ "ID": 43, "TopID": 1, "AddName": "马鞍山市" }]
+                    },
+                    {
+                        title: "S",
+                        name: [{ "ID": 44, "TopID": 1, "AddName": "宿州市" }]
+                    },
+                    {
+                        title: "T",
+                        name: [{ "ID": 45, "TopID": 1, "AddName": "铜陵市" }]
+                    },
+                    {
+                        title: "W",
+                        name: [{ "ID": 46, "TopID": 1, "AddName": "芜湖市" }]
+                    }, {
+                        title: "X",
+                        name: [{ "ID": 47, "TopID": 1, "AddName": "宣城市" }]
+                    }]
+                }],
+
+            },
+            {
+                title: "B",
+                name: [{
+                    "ID": 48,
+                    "TopID": 2,
+                    "AddName": "北京",
+                    "hasCity": [
+                        {
+                            title: "C",
+                            name: [{ "ID": 502, "TopID": 48, "AddName": "昌平区" }, { "ID": 497, "TopID": 48, "AddName": "朝阳区" },]
+                        },
+                        {
+                            title: "D",
+                            name: [{ "ID": 501, "TopID": 48, "AddName": "大兴区" }, { "ID": 508, "TopID": 48, "AddName": "东城区" }]
+                        },
+                        {
+                            title: "F",
+                            name: [{ "ID": 500, "TopID": 48, "AddName": "房山区" }, { "ID": 499, "TopID": 48, "AddName": "丰台区" }]
+                        },
+                        {
+                            title: "H",
+                            name: [{ "ID": 496, "TopID": 48, "AddName": "海淀区" },
+                            { "ID": 495, "TopID": 48, "AddName": "怀柔区" }]
+                        },
+                        {
+                            title: "M",
+                            name: [{ "ID": 505, "TopID": 48, "AddName": "门头沟区" }, { "ID": 505, "TopID": 48, "AddName": "密云区" }]
+                        },
+                        {
+                            title: "P",
+                            name: [{ "ID": 503, "TopID": 48, "AddName": "平谷区" }]
+                        },
+                        {
+                            title: "S",
+                            name: [{ "ID": 504, "TopID": 48, "AddName": "石景山区" }, { "ID": 506, "TopID": 48, "AddName": "顺义区" }]
+                        },
+                        {
+                            title: "T",
+                            name: [{ "ID": 498, "TopID": 48, "AddName": "通州区" }]
+                        },
+                        {
+                            title: "X",
+                            name: [{ "ID": 507, "TopID": 48, "AddName": "西城区" }]
+                        },
+                        {
+                            title: "X",
+                            name: [{ "ID": 507, "TopID": 48, "AddName": "延庆区" }]
+                        }]
+                }],
+
+            }, {
+                title: "C",
+                name: [{
+                    "ID": 31,
+                    "TopID": 0,
+                    "AddName": "重庆",
+                    "hasCity": [{
+                        title: "B",
+                        name: [{ "ID": 3496, "TopID": 31, "AddName": "巴南区" }, { "ID": 3495, "TopID": 31, "AddName": "北碚区" }, { "ID": 3488, "TopID": 31, "AddName": "璧山区" }],
+                    },
+                    {
+                        title: "C",
+                        name: [{ "ID": 3496, "TopID": 31, "AddName": "长寿区" }, { "ID": 3496, "TopID": 31, "AddName": "城口县" }]
+                    },
+                    {
+                        title: "D",
+                        name: [{ "ID": 3496, "TopID": 31, "AddName": "大渡口区" }, { "ID": 3496, "TopID": 31, "AddName": "大足区" }, { "ID": 3496, "TopID": 31, "AddName": "垫江县" }]
+                    },
+                    {
+                        title: "F",
+                        name: [{ "ID": 3496, "TopID": 31, "AddName": "丰都县" }, { "ID": 3496, "TopID": 31, "AddName": "奉节县" }, { "ID": 3496, "TopID": 31, "AddName": "涪陵区" }]
+                    },
+                    {
+                        title: "H",
+                        name: [{ "ID": 3496, "TopID": 31, "AddName": "合川区" },]
+                    },
+                    {
+                        title: "J",
+                        name: [{ "ID": 3496, "TopID": 31, "AddName": "江北区" }, { "ID": 3496, "TopID": 31, "AddName": "江津区" }, { "ID": 3496, "TopID": 31, "AddName": "九龙坡区" }]
+                    },
+                    {
+                        title: "K",
+                        name: [{ "ID": 3496, "TopID": 31, "AddName": "开州区" }]
+                    },
+                    {
+                        title: "L",
+                        name: [{ "ID": 3496, "TopID": 31, "AddName": "梁平区" }]
+                    },
+                    {
+                        title: "N",
+                        name: [{ "ID": 3496, "TopID": 31, "AddName": "南岸区" }, { "ID": 3496, "TopID": 31, "AddName": "南川区" }]
+                    },
+                    {
+                        title: "P",
+                        name: [{ "ID": 3496, "TopID": 31, "AddName": "彭水苗族土家族自治县" }]
+                    }, {
+                        title: "Q",
+                        name: [{ "ID": 3496, "TopID": 31, "AddName": "綦江区" }, { "ID": 3496, "TopID": 31, "AddName": "黔江区" }]
+                    }, {
+                        title: "R",
+                        name: [{ "ID": 3496, "TopID": 31, "AddName": "荣昌区" }]
+                    }, {
+                        title: "S",
+                        name: [{ "ID": 3496, "TopID": 31, "AddName": "沙坪坝区" }, { "ID": 3496, "TopID": 31, "AddName": "石柱土家族自治县" }]
+                    }, {
+                        title: "T",
+                        name: [{ "ID": 3496, "TopID": 31, "AddName": "铜梁区" }, { "ID": 3496, "TopID": 31, "AddName": "潼南区" }]
+                    }, {
+                        title: "W",
+                        name: [{ "ID": 3496, "TopID": 31, "AddName": "万州区" }, { "ID": 3496, "TopID": 31, "AddName": "武隆区" }, { "ID": 3496, "TopID": 31, "AddName": "巫山县" }, { "ID": 3496, "TopID": 31, "AddName": "巫溪县" }]
+                    }, {
+                        title: "X",
+                        name: [{ "ID": 3496, "TopID": 31, "AddName": "秀山土家族苗族自治县" }]
+                    }, {
+                        title: "Y",
+                        name: [{ "ID": 3496, "TopID": 31, "AddName": "永川区" }, { "ID": 3496, "TopID": 31, "AddName": "酉阳土家族苗族自治县" },
+                        { "ID": 3496, "TopID": 31, "AddName": "渝北区" }, { "ID": 3496, "TopID": 31, "AddName": "渝中区" },
+                        { "ID": 3496, "TopID": 31, "AddName": "云阳县" }]
+                    }, {
+                        title: "Z",
+                        name: [{ "ID": 3496, "TopID": 31, "AddName": "忠县" }]
+                    }]
+                }],
+
+            }, {
+                title: "F",
+                name: [{
+                    "ID": 3,
+                    "TopID": 0,
+                    "AddName": "福建省",
+                    "hasCity": [{
+                        title: "F",
+                        name: [{ "ID": 50, "TopID": 3, "AddName": "福州市" }]
+                    },
+                    {
+                        title: "L",
+                        name: [{ "ID": 51, "TopID": 3, "AddName": "龙岩市" }]
+                    },
+                    {
+                        title: "N",
+                        name: [{ "ID": 52, "TopID": 3, "AddName": "南平市" }, { "ID": 53, "TopID": 3, "AddName": "宁德市" }]
+                    },
+                    {
+                        title: "P",
+                        name: [{ "ID": 54, "TopID": 3, "AddName": "莆田市" }]
+                    }, {
+                        title: "Q",
+                        name: [{ "ID": 55, "TopID": 3, "AddName": "泉州市" }]
+                    }, {
+                        title: "S",
+                        name: [{ "ID": 56, "TopID": 3, "AddName": "三明市" }]
+                    }, {
+                        title: "X",
+                        name: [{ "ID": 57, "TopID": 3, "AddName": "厦门市" }]
+                    }, {
+                        title: "Z",
+                        name: [{ "ID": 58, "TopID": 3, "AddName": "漳州市" }]
+                    }]
+                }],
+
+            }, {
+                title: "G",
+                name: [{
+                    "ID": 4, "TopID": 0, "AddName": "甘肃省", "hasCity": [{
+                        title: "B",
+                        name: [{ "ID": 59, "TopID": 4, "AddName": "白银市" }],
+                    },
+
+                    {
+                        title: "D",
+                        name: [{ "ID": 60, "TopID": 4, "AddName": "定西市" }]
+                    },
+                    {
+                        title: "G",
+                        name: [{ "ID": 61, "TopID": 4, "AddName": "甘南藏族自治州" }]
+                    },
+
+                    {
+                        title: "J",
+                        name: [{ "ID": 62, "TopID": 4, "AddName": "嘉峪关市" }, { "ID": 63, "TopID": 4, "AddName": "金昌市" }, { "ID": 64, "TopID": 4, "AddName": "酒泉市" }]
+                    },
+
+                    {
+                        title: "L",
+                        name: [{ "ID": 65, "TopID": 4, "AddName": "兰州市" }, { "ID": 66, "TopID": 4, "AddName": "临夏回族自治州" }, { "ID": 67, "TopID": 4, "AddName": "陇南市" }]
+                    },
+
+                    {
+                        title: "P",
+                        name: [{ "ID": 68, "TopID": 4, "AddName": "平凉市" }]
+                    }, {
+                        title: "Q",
+                        name: [{ "ID": 69, "TopID": 4, "AddName": "庆阳市" }]
+                    }, {
+                        title: "T",
+                        name: [{ "ID": 70, "TopID": 4, "AddName": "天水市" }]
+                    }, {
+                        title: "W",
+                        name: [{ "ID": 71, "TopID": 4, "AddName": "武威市" }]
+                    }, {
+                        title: "Z",
+                        name: [{ "ID": 72, "TopID": 4, "AddName": "张掖市" }]
+                    }]
+                },
+                {
+                    "ID": 5, "TopID": 0, "AddName": "广东省", "hasCity": [
+                        {
+                            title: "C",
+                            name: [{ "ID": 73, "TopID": 5, "AddName": "潮州市" }],
+                        },
+
+                        {
+                            title: "D",
+                            name: [{ "ID": 74, "TopID": 5, "AddName": "东莞市" }, { "ID": 74, "TopID": 5, "AddName": "东沙群岛" }]
+                        },
+                        {
+                            title: "F",
+                            name: [{ "ID": 75, "TopID": 5, "AddName": "佛山市" }],
+                        },
+                        {
+                            title: "G",
+                            name: [{ "ID": 76, "TopID": 5, "AddName": "广州市" }]
+                        },
+
+                        {
+                            title: "H",
+                            name: [{ "ID": 77, "TopID": 5, "AddName": "河源市" }, { "ID": 78, "TopID": 5, "AddName": "惠州市" }]
+                        },
+
+                        {
+                            title: "J",
+                            name: [{ "ID": 79, "TopID": 5, "AddName": "江门市" }, { "ID": 80, "TopID": 5, "AddName": "揭阳市" }]
+                        },
+
+                        {
+                            title: "M",
+                            name: [{ "ID": 81, "TopID": 5, "AddName": "茂名市" }, { "ID": 82, "TopID": 5, "AddName": "梅州市" }]
+                        }, {
+                            title: "Q",
+                            name: [{ "ID": 83, "TopID": 5, "AddName": "清远市" }]
+                        }, {
+                            title: "S",
+                            name: [{ "ID": 84, "TopID": 5, "AddName": "汕头市" }, { "ID": 85, "TopID": 5, "AddName": "汕尾市" }, { "ID": 86, "TopID": 5, "AddName": "韶关市" }, { "ID": 87, "TopID": 5, "AddName": "深圳市" }]
+                        },
+                        {
+                            title: "Y",
+                            name: [{ "ID": 88, "TopID": 5, "AddName": "阳江市" }, { "ID": 89, "TopID": 5, "AddName": "云浮市" }]
+                        }, {
+                            title: "Z",
+                            name: [{ "ID": 90, "TopID": 5, "AddName": "湛江市" }, { "ID": 91, "TopID": 5, "AddName": "肇庆市" }, { "ID": 92, "TopID": 5, "AddName": "中山市" }, { "ID": 93, "TopID": 5, "AddName": "珠海市" }]
+                        }
+                    ]
+                }, {
+                    "ID": 6,
+                    "TopID": 0,
+                    "AddName": "广西壮族自治区",
+                    "hasCity": [
+                        {
+                            title: "B",
+                            name: [{ "ID": 94, "TopID": 6, "AddName": "百色市" }, { "ID": 95, "TopID": 6, "AddName": "北海市" }],
+                        },
+
+                        {
+                            title: "C",
+                            name: [{ "ID": 96, "TopID": 6, "AddName": "崇左市" }]
+                        },
+                        {
+                            title: "F",
+                            name: [{ "ID": 97, "TopID": 6, "AddName": "防城港市" }],
+                        },
+                        {
+                            title: "G",
+                            name: [{ "ID": 98, "TopID": 6, "AddName": "贵港市" }, { "ID": 99, "TopID": 6, "AddName": "桂林市" }]
+                        },
+
+                        {
+                            title: "H",
+                            name: [{ "ID": 100, "TopID": 6, "AddName": "河池市" }, { "ID": 101, "TopID": 6, "AddName": "贺州市" }]
+                        },
+
+                        {
+                            title: "L",
+                            name: [{ "ID": 102, "TopID": 6, "AddName": "来宾市" }, { "ID": 103, "TopID": 6, "AddName": "柳州市" }]
+                        },
+
+                        {
+                            title: "N",
+                            name: [{ "ID": 104, "TopID": 6, "AddName": "南宁市" }]
+                        }, {
+                            title: "Q",
+                            name: [{ "ID": 105, "TopID": 6, "AddName": "钦州市" }]
+                        }, {
+                            title: "w",
+                            name: [{ "ID": 106, "TopID": 6, "AddName": "梧州市" }]
+                        },
+                        {
+                            title: "Y",
+                            name: [{ "ID": 107, "TopID": 6, "AddName": "玉林市" }]
+                        }
+                    ]
+                },
+                {
+                    "ID": 7, "TopID": 0, "AddName": "贵州省", "hasCity": [
+                        {
+                            title: "A",
+                            name: [{ "ID": 108, "TopID": 7, "AddName": "安顺市" }],
+                        },
+                        {
+                            title: "B",
+                            name: [{ "ID": 109, "TopID": 7, "AddName": "毕节市" }]
+                        },
+                        {
+                            title: "G",
+                            name: [{ "ID": 110, "TopID": 7, "AddName": "贵阳市" }],
+                        },
+                        {
+                            title: "L",
+                            name: [{ "ID": 111, "TopID": 7, "AddName": "六盘水市" }]
+                        },
+                        {
+                            title: "Q",
+                            name: [{ "ID": 112, "TopID": 7, "AddName": "黔东南苗族侗族自治州" }, { "ID": 113, "TopID": 7, "AddName": "黔南布依族苗族自治州" }, { "ID": 114, "TopID": 7, "AddName": "黔西南布依族苗族自治州" }]
+                        },
+                        {
+                            title: "T",
+                            name: [{ "ID": 115, "TopID": 7, "AddName": "铜仁市" }]
+                        },
+                        {
+                            title: "Z",
+                            name: [{ "ID": 116, "TopID": 7, "AddName": "遵义市" }]
+                        }
+                    ]
+                }]
+            }, {
+                title: "H",
+                name: [{
+                    "ID": 8, "TopID": 0, "AddName": "海南省", "hasCity": [{
+                        title: "B",
+                        name: [{ "ID": 1080, "TopID": 120, "AddName": "白沙黎族自治县" }, { "ID": 1079, "TopID": 120, "AddName": "保亭黎族苗族自治县" }]
+                    },
+                    {
+                        title: "C",
+                        name: [{ "ID": 1091, "TopID": 120, "AddName": "昌江黎族自治县" }, { "ID": 1088, "TopID": 120, "AddName": "澄迈县" }]
+                    },
+                    {
+                        title: "D",
+                        name: [{ "ID": 1083, "TopID": 120, "AddName": "儋州市" }, { "ID": 1087, "TopID": 120, "AddName": "东方市" }]
+                    },
+                    {
+                        title: "H",
+                        name: [{ "ID": 117, "TopID": 8, "AddName": "海口市" }]
+                    }, {
+                        title: "L",
+                        name: [{ "ID": 1085, "TopID": 120, "AddName": "乐东黎族自治县" }, { "ID": 1082, "TopID": 120, "AddName": "临高县" }, { "ID": 1090, "TopID": 120, "AddName": "陵水黎族自治县" }]
+                    }, {
+                        title: "Q",
+                        name: [{ "ID": 56, "TopID": 3, "AddName": "三明市" }]
+                    }, {
+                        title: "S",
+                        name: [{ "ID": 57, "TopID": 3, "AddName": "厦门市" }]
+                    }, {
+                        title: "T",
+                        name: [{ "ID": 58, "TopID": 3, "AddName": "漳州市" }]
+                    }, {
+                        title: "W",
+                        name: [{ "ID": 58, "TopID": 3, "AddName": "漳州市" }]
+                    }]
+                },
+                {
+                    "ID": 9, "TopID": 0, "AddName": "河北省", "hasCity": [{
+                        title: "B",
+                        name: [{ "ID": 121, "TopID": 9, "AddName": "保定市" }]
+                    },
+                    {
+                        title: "C",
+                        name: [{ "ID": 122, "TopID": 9, "AddName": "沧州市" }, { "ID": 123, "TopID": 9, "AddName": "承德市" }]
+                    },
+                    {
+                        title: "H",
+                        name: [{ "ID": 124, "TopID": 9, "AddName": "邯郸市" }, { "ID": 125, "TopID": 9, "AddName": "衡水市" }]
+                    },
+                    {
+                        title: "L",
+                        name: [{ "ID": 126, "TopID": 9, "AddName": "廊坊市" }]
+                    }, {
+                        title: "Q",
+                        name: [{ "ID": 127, "TopID": 9, "AddName": "秦皇岛市" }]
+                    }, {
+                        title: "S",
+                        name: [{ "ID": 128, "TopID": 9, "AddName": "石家庄市" }]
+                    }, {
+                        title: "T",
+                        name: [{ "ID": 129, "TopID": 9, "AddName": "唐山市" }]
+                    }, {
+                        title: "X",
+                        name: [{ "ID": 130, "TopID": 9, "AddName": "邢台市" }]
+                    }, {
+                        title: "Z",
+                        name: [{ "ID": 131, "TopID": 9, "AddName": "张家口市" }]
+                    }]
+                },
+                {
+                    "ID": 10, "TopID": 0, "AddName": "河南省", "hasCity": [{
+                        title: "A",
+                        name: [{ "ID": 132, "TopID": 10, "AddName": "安阳市" }]
+                    }, {
+                        title: "H",
+                        name: [{ "ID": 133, "TopID": 10, "AddName": "鹤壁市" }]
+                    },
+                    {
+                        title: "J",
+                        name: [{ "ID": 134, "TopID": 10, "AddName": "焦作市" }, { "ID": 134, "TopID": 10, "AddName": "济源市" }]
+                    },
+                    {
+                        title: "K",
+                        name: [{ "ID": 135, "TopID": 10, "AddName": "开封市" }]
+                    },
+                    {
+                        title: "L",
+                        name: [{ "ID": 136, "TopID": 10, "AddName": "洛阳市" }, { "ID": 137, "TopID": 10, "AddName": "漯河市" }]
+                    }, {
+                        title: "N",
+                        name: [{ "ID": 138, "TopID": 10, "AddName": "南阳市" }]
+                    }, {
+                        title: "P",
+                        name: [{ "ID": 139, "TopID": 10, "AddName": "平顶山市" }, { "ID": 140, "TopID": 10, "AddName": "濮阳市" }]
+                    }, {
+                        title: "S",
+                        name: [{ "ID": 141, "TopID": 10, "AddName": "三门峡市" }, { "ID": 142, "TopID": 10, "AddName": "商丘市" }]
+                    }, {
+                        title: "X",
+                        name: [{ "ID": 144, "TopID": 10, "AddName": "新乡市" }, { "ID": 145, "TopID": 10, "AddName": "信阳市" }, { "ID": 146, "TopID": 10, "AddName": "许昌市" }]
+                    }, {
+                        title: "Z",
+                        name: [{ "ID": 147, "TopID": 10, "AddName": "郑州市" }, { "ID": 148, "TopID": 10, "AddName": "周口市" }, { "ID": 149, "TopID": 10, "AddName": "驻马店市" }]
+                    }]
+                },
+                {
+                    "ID": 11, "TopID": 0, "AddName": "黑龙江省", "hasCity": [{
+                        title: "D",
+                        name: [{ "ID": 150, "TopID": 11, "AddName": "大庆市" }, { "ID": 151, "TopID": 11, "AddName": "大兴安岭地区" }]
+                    },
+                    {
+                        title: "H",
+                        name: [{ "ID": 152, "TopID": 11, "AddName": "哈尔滨市" }, { "ID": 153, "TopID": 11, "AddName": "鹤岗市" }, { "ID": 154, "TopID": 11, "AddName": "黑河市" }]
+                    },
+                    {
+                        title: "J",
+                        name: [{ "ID": 155, "TopID": 11, "AddName": "鸡西市" }, { "ID": 156, "TopID": 11, "AddName": "佳木斯市" }]
+                    },
+                    {
+                        title: "M",
+                        name: [{ "ID": 157, "TopID": 11, "AddName": "牡丹江市" }]
+                    }, {
+                        title: "Q",
+                        name: [{ "ID": 158, "TopID": 11, "AddName": "七台河市" }, { "ID": 159, "TopID": 11, "AddName": "齐齐哈尔市" }]
+                    }, {
+                        title: "S",
+                        name: [{ "ID": 160, "TopID": 11, "AddName": "双鸭山市" }, { "ID": 161, "TopID": 11, "AddName": "绥化市" }]
+                    }, {
+                        title: "Y",
+                        name: [{ "ID": 162, "TopID": 11, "AddName": "伊春市" }]
+                    }]
+                },
+                {
+                    "ID": 12, "TopID": 0, "AddName": "湖北省", "hasCity": [{
+                        title: "E",
+                        name: [{ "ID": 163, "TopID": 12, "AddName": "鄂州市" }, { "ID": 164, "TopID": 12, "AddName": "恩施土家族苗族自治州" }]
+                    },
+                    {
+                        title: "H",
+                        name: [{ "ID": 165, "TopID": 12, "AddName": "黄冈市" }, { "ID": 166, "TopID": 12, "AddName": "黄石市" }]
+                    },
+                    {
+                        title: "J",
+                        name: [{ "ID": 167, "TopID": 12, "AddName": "荆门市" }, { "ID": 168, "TopID": 12, "AddName": "荆州市" }]
+                    },
+                    {
+                        title: "Q",
+                        name: [{ "ID": 169, "TopID": 12, "AddName": "潜江市" }]
+                    }, {
+                        title: "S",
+                        name: [{ "ID": 170, "TopID": 12, "AddName": "神农架林区" }, { "ID": 170, "TopID": 12, "AddName": "十堰市" }, { "ID": 171, "TopID": 12, "AddName": "随州市" },]
+                    }, {
+                        title: "T",
+                        name: [{ "ID": 172, "TopID": 12, "AddName": "天门市" }]
+                    }, {
+                        title: "W",
+                        name: [{ "ID": 172, "TopID": 12, "AddName": "武汉市" }]
+                    }, {
+                        title: "X",
+                        name: [{ "ID": 173, "TopID": 12, "AddName": "咸宁市" }, { "ID": 173, "TopID": 12, "AddName": "仙桃市" }, { "ID": 174, "TopID": 12, "AddName": "襄阳市" }, { "ID": 175, "TopID": 12, "AddName": "孝感市" }]
+                    }, {
+                        title: "Y",
+                        name: [{ "ID": 176, "TopID": 12, "AddName": "宜昌市" }]
+                    }]
+                },
+                {
+                    "ID": 13, "TopID": 0, "AddName": "湖南省",
+                    "hasCity": [{
+                        title: "C",
+                        name: [{ "ID": 178, "TopID": 13, "AddName": "常德市" }, { "ID": 177, "TopID": 13, "AddName": "长沙市" }, { "ID": 179, "TopID": 13, "AddName": "郴州市" }]
+                    },
+                    {
+                        title: "H",
+                        name: [{ "ID": 180, "TopID": 13, "AddName": "衡阳市" }, { "ID": 181, "TopID": 13, "AddName": "怀化市" }]
+                    },
+                    {
+                        title: "L",
+                        name: [{ "ID": 182, "TopID": 13, "AddName": "娄底市" }]
+                    },
+                    {
+                        title: "S",
+                        name: [{ "ID": 183, "TopID": 13, "AddName": "邵阳市" }]
+                    }, {
+                        title: "X",
+                        name: [{ "ID": 184, "TopID": 13, "AddName": "湘潭市" }, { "ID": 185, "TopID": 13, "AddName": "湘西土家族苗族自治州" }]
+                    }, {
+                        title: "Y",
+                        name: [{ "ID": 186, "TopID": 13, "AddName": "益阳市" }, { "ID": 187, "TopID": 13, "AddName": "永州市" }, { "ID": 188, "TopID": 13, "AddName": "岳阳市" }]
+                    }, {
+                        title: "Z",
+                        name: [{ "ID": 189, "TopID": 13, "AddName": "张家界市" }, { "ID": 190, "TopID": 13, "AddName": "株洲市" }]
+                    }]
+                }]
+            },
+            {
+                title: "J",
+                name: [{
+                    "ID": 14, "TopID": 0, "AddName": "吉林省", "hasCity": [{
+                        title: "B",
+                        name: [{ "ID": 191, "TopID": 14, "AddName": "白城市" }, { "ID": 192, "TopID": 14, "AddName": "白山市" }]
+                    },
+                    {
+                        title: "C",
+                        name: [{ "ID": 193, "TopID": 14, "AddName": "长春市" }]
+                    },
+                    {
+                        title: "J",
+                        name: [{ "ID": 194, "TopID": 14, "AddName": "吉林市" }]
+                    },
+                    {
+                        title: "L",
+                        name: [{ "ID": 195, "TopID": 14, "AddName": "辽源市" }]
+                    }, {
+                        title: "S",
+                        name: [{ "ID": 196, "TopID": 14, "AddName": "四平市" }, { "ID": 197, "TopID": 14, "AddName": "松原市" }]
+                    }, {
+                        title: "T",
+                        name: [{ "ID": 198, "TopID": 14, "AddName": "通化市" }]
+                    }, {
+                        title: "Y",
+                        name: [{ "ID": 199, "TopID": 14, "AddName": "延边朝鲜族自治州" }]
+                    }]
+                },
+                {
+                    "ID": 15, "TopID": 0, "AddName": "江苏省", "hasCity": [{
+                        title: "C",
+                        name: [{ "ID": 200, "TopID": 15, "AddName": "常州市" }]
+                    },
+                    {
+                        title: "H",
+                        name: [{ "ID": 201, "TopID": 15, "AddName": "淮安市" }]
+                    },
+                    {
+                        title: "L",
+                        name: [{ "ID": 202, "TopID": 15, "AddName": "连云港市" }]
+                    },
+                    {
+                        title: "N",
+                        name: [{ "ID": 203, "TopID": 15, "AddName": "南京市" }, { "ID": 204, "TopID": 15, "AddName": "南通市" }]
+                    }, {
+                        title: "S",
+                        name: [{ "ID": 206, "TopID": 15, "AddName": "宿迁市" }, { "ID": 205, "TopID": 15, "AddName": "苏州市" }]
+                    }, {
+                        title: "T",
+                        name: [{ "ID": 207, "TopID": 15, "AddName": "泰州市" }]
+                    }, {
+                        title: "W",
+                        name: [{ "ID": 208, "TopID": 15, "AddName": "无锡市" }]
+                    }, {
+                        title: "X",
+                        name: [{ "ID": 209, "TopID": 15, "AddName": "徐州市" }]
+                    }, {
+                        title: "Y",
+                        name: [{ "ID": 210, "TopID": 15, "AddName": "盐城市" }, { "ID": 211, "TopID": 15, "AddName": "扬州市" }]
+                    }, {
+                        title: "Z",
+                        name: [{ "ID": 212, "TopID": 15, "AddName": "镇江市" }]
+                    }]
+                },
+                {
+                    "ID": 16, "TopID": 0, "AddName": "江西省", "hasCity": [{
+                        title: "F",
+                        name: [{ "ID": 213, "TopID": 16, "AddName": "抚州市" }]
+                    },
+                    {
+                        title: "H",
+                        name: [{ "ID": 201, "TopID": 15, "AddName": "淮安市" }]
+                    },
+                    {
+                        title: "G",
+                        name: [{ "ID": 214, "TopID": 16, "AddName": "赣州市" }]
+                    },
+                    {
+                        title: "J",
+                        name: [{ "ID": 215, "TopID": 16, "AddName": "吉安市" }, { "ID": 216, "TopID": 16, "AddName": "景德镇市" }, { "ID": 217, "TopID": 16, "AddName": "九江市" }]
+                    }, {
+                        title: "N",
+                        name: [{ "ID": 218, "TopID": 16, "AddName": "南昌市" }]
+                    }, {
+                        title: "P",
+                        name: [{ "ID": 219, "TopID": 16, "AddName": "萍乡市" }]
+                    }, {
+                        title: "S",
+                        name: [{ "ID": 220, "TopID": 16, "AddName": "上饶市" }]
+                    }, {
+                        title: "X",
+                        name: [{ "ID": 221, "TopID": 16, "AddName": "新余市" }]
+                    }, {
+                        title: "Y",
+                        name: [{ "ID": 222, "TopID": 16, "AddName": "宜春市" }, { "ID": 223, "TopID": 16, "AddName": "鹰潭市" }]
+                    }]
+                }]
+
+            },
+            {
+                title: "L",
+                name: [{
+                    "ID": 17,
+                    "TopID": 0,
+                    "AddName": "辽宁省",
+                    "hasCity": [{
+                        title: "A",
+                        name: [{ "ID": 224, "TopID": 17, "AddName": "鞍山市" }],
+                    },
+                    {
+                        title: "B",
+                        name: [{ "ID": 225, "TopID": 17, "AddName": "本溪市" }]
+                    },
+                    {
+                        title: "C",
+                        name: [{ "ID": 226, "TopID": 17, "AddName": "朝阳市" }]
+                    },
+                    {
+                        title: "D",
+                        name: [{ "ID": 227, "TopID": 17, "AddName": "大连市" }, { "ID": 228, "TopID": 17, "AddName": "丹东市" }]
+                    },
+                    {
+                        title: "F",
+                        name: [{ "ID": 229, "TopID": 17, "AddName": "抚顺市" }, { "ID": 230, "TopID": 17, "AddName": "阜新市" }]
+                    },
+                    {
+                        title: "H",
+                        name: [{ "ID": 231, "TopID": 17, "AddName": "葫芦岛市" }]
+                    },
+                    {
+                        title: "J",
+                        name: [{ "ID": 232, "TopID": 17, "AddName": "锦州市" }]
+                    },
+                    {
+                        title: "L",
+                        name: [{ "ID": 233, "TopID": 17, "AddName": "辽阳市" }]
+                    },
+                    {
+                        title: "P",
+                        name: [{ "ID": 234, "TopID": 17, "AddName": "盘锦市" }]
+                    },
+                    {
+                        title: "S",
+                        name: [{ "ID": 235, "TopID": 17, "AddName": "沈阳市" }]
+                    }, {
+                        title: "T",
+                        name: [{ "ID": 236, "TopID": 17, "AddName": "铁岭市" }]
+                    }, {
+                        title: "Y",
+                        name: [{ "ID": 237, "TopID": 17, "AddName": "营口市" }]
+                    }]
+                }]
+
+            },
+            {
+                title: "N",
+                name: [{
+                    "ID": 18, "TopID": 0, "AddName": "内蒙古自治区", "hasCity": [{
+                        title: "A",
+                        name: [{ "ID": 238, "TopID": 18, "AddName": "阿拉善盟" }],
+                    },
+                    {
+                        title: "B",
+                        name: [{ "ID": 239, "TopID": 18, "AddName": "巴彦淖尔市" }, { "ID": 240, "TopID": 18, "AddName": "包头市" }]
+                    },
+                    {
+                        title: "C",
+                        name: [{ "ID": 241, "TopID": 18, "AddName": "赤峰市" }]
+                    },
+                    {
+                        title: "E",
+                        name: [{ "ID": 242, "TopID": 18, "AddName": "鄂尔多斯市" }]
+                    },
+                    {
+                        title: "H",
+                        name: [{ "ID": 243, "TopID": 18, "AddName": "呼和浩特市" }, { "ID": 244, "TopID": 18, "AddName": "呼伦贝尔市" }]
+                    },
+                    {
+                        title: "T",
+                        name: [{ "ID": 245, "TopID": 18, "AddName": "通辽市" }]
+                    },
+                    {
+                        title: "W",
+                        name: [{ "ID": 246, "TopID": 18, "AddName": "乌海市" }, { "ID": 247, "TopID": 18, "AddName": "乌兰察布市" }]
+                    },
+                    {
+                        title: "X",
+                        name: [{ "ID": 248, "TopID": 18, "AddName": "锡林郭勒盟" }, { "ID": 249, "TopID": 18, "AddName": "兴安盟" }]
+                    }]
+                },
+                {
+                    "ID": 19, "TopID": 0, "AddName": "宁夏回族自治区", "hasCity": [{
+                        title: "G",
+                        name: [{ "ID": 250, "TopID": 19, "AddName": "固原市" }]
+                    },
+                    {
+                        title: "S",
+                        name: [{ "ID": 251, "TopID": 19, "AddName": "石嘴山市" }]
+                    },
+                    {
+                        title: "W",
+                        name: [{ "ID": 252, "TopID": 19, "AddName": "吴忠市" }]
+                    },
+                    {
+                        title: "Y",
+                        name: [{ "ID": 253, "TopID": 19, "AddName": "银川市" }]
+                    },
+                    {
+                        title: "Z",
+                        name: [{ "ID": 254, "TopID": 19, "AddName": "中卫市" }]
+                    }]
+                }]
+            },
+            {
+                title: "Q",
+                name: [{
+                    "ID": 20,
+                    "TopID": 0,
+                    "AddName": "青海省",
+                    "hasCity": [{
+                        title: "G",
+                        name: [{ "ID": 255, "TopID": 20, "AddName": "果洛藏族自治州" }],
+                    },
+                    {
+                        title: "H",
+                        name: [{ "ID": 256, "TopID": 20, "AddName": "海北藏族自治州" }, { "ID": 257, "TopID": 20, "AddName": "海东地区" }, { "ID": 258, "TopID": 20, "AddName": "海南藏族自治州" }, { "ID": 259, "TopID": 20, "AddName": "海西蒙古族藏族自治州" }, { "ID": 260, "TopID": 20, "AddName": "黄南藏族自治州" }]
+                    },
+                    {
+                        title: "X",
+                        name: [{ "ID": 261, "TopID": 20, "AddName": "西宁市" }]
+                    },
+                    {
+                        title: "Y",
+                        name: [{ "ID": 262, "TopID": 20, "AddName": "玉树藏族自治州" }]
+                    }]
+                }]
+            },
+            {
+                title: "S",
+                name: [{
+                    "ID": 21, "TopID": 0, "AddName": "山东省", "hasCity": [{
+                        title: "B",
+                        name: [{ "ID": 263, "TopID": 21, "AddName": "滨州市" }]
+                    },
+                    {
+                        title: "D",
+                        name: [{ "ID": 264, "TopID": 21, "AddName": "德州市" }, { "ID": 265, "TopID": 21, "AddName": "东营市" }]
+                    },
+                    {
+                        title: "H",
+                        name: [{ "ID": 266, "TopID": 21, "AddName": "菏泽市" }]
+                    },
+                    {
+                        title: "J",
+                        name: [{ "ID": 267, "TopID": 21, "AddName": "济南市" }, { "ID": 268, "TopID": 21, "AddName": "济宁市" }]
+                    }, {
+                        title: "L",
+                        name: [{ "ID": 270, "TopID": 21, "AddName": "聊城市" }, { "ID": 271, "TopID": 21, "AddName": "临沂市" }]
+                    }, {
+                        title: "Q",
+                        name: [{ "ID": 272, "TopID": 21, "AddName": "青岛市" }]
+                    }, {
+                        title: "R",
+                        name: [{ "ID": 273, "TopID": 21, "AddName": "日照市" }]
+                    }, {
+                        title: "T",
+                        name: [{ "ID": 274, "TopID": 21, "AddName": "泰安市" }]
+                    }, {
+                        title: "W",
+                        name: [{ "ID": 275, "TopID": 21, "AddName": "威海市" }, { "ID": 276, "TopID": 21, "AddName": "潍坊市" }]
+                    }, {
+                        title: "Y",
+                        name: [{ "ID": 277, "TopID": 21, "AddName": "烟台市" }]
+                    }, {
+                        title: "Z",
+                        name: [{ "ID": 278, "TopID": 21, "AddName": "枣庄市" }, { "ID": 279, "TopID": 21, "AddName": "淄博市" }]
+                    }]
+                },
+                {
+                    "ID": 22, "TopID": 0, "AddName": "山西省", "hasCity": [{
+                        title: "C",
+                        name: [{ "ID": 280, "TopID": 22, "AddName": "长治市" }]
+                    },
+                    {
+                        title: "D",
+                        name: [{ "ID": 281, "TopID": 22, "AddName": "大同市" }]
+                    },
+                    {
+                        title: "J",
+                        name: [{ "ID": 282, "TopID": 22, "AddName": "晋城市" }, { "ID": 283, "TopID": 22, "AddName": "晋中市" }]
+                    }, {
+                        title: "L",
+                        name: [{ "ID": 284, "TopID": 22, "AddName": "临汾市" }, { "ID": 285, "TopID": 22, "AddName": "吕梁市" }]
+                    }, {
+                        title: "S",
+                        name: [{ "ID": 286, "TopID": 22, "AddName": "朔州市" }]
+                    }, {
+                        title: "T",
+                        name: [{ "ID": 287, "TopID": 22, "AddName": "太原市" }]
+                    }, {
+                        title: "X",
+                        name: [{ "ID": 288, "TopID": 22, "AddName": "忻州市" }]
+                    }, {
+                        title: "Y",
+                        name: [{ "ID": 289, "TopID": 22, "AddName": "阳泉市" }, { "ID": 290, "TopID": 22, "AddName": "运城市" }]
+                    }]
+                },
+                {
+                    "ID": 23, "TopID": 0, "AddName": "陕西省", "hasCity": [{
+                        title: "A",
+                        name: [{ "ID": 291, "TopID": 23, "AddName": "安康市" }]
+                    },
+                    {
+                        title: "B",
+                        name: [{ "ID": 292, "TopID": 23, "AddName": "宝鸡市" }]
+                    },
+                    {
+                        title: "H",
+                        name: [{ "ID": 293, "TopID": 23, "AddName": "汉中市" }]
+                    }, {
+                        title: "S",
+                        name: [{ "ID": 294, "TopID": 23, "AddName": "商洛市" }]
+                    }, {
+                        title: "T",
+                        name: [{ "ID": 295, "TopID": 23, "AddName": "铜川市" }]
+                    }, {
+                        title: "W",
+                        name: [{ "ID": 296, "TopID": 23, "AddName": "渭南市" }]
+                    }, {
+                        title: "X",
+                        name: [{ "ID": 297, "TopID": 23, "AddName": "西安市" }, { "ID": 298, "TopID": 23, "AddName": "咸阳市" }]
+                    }, {
+                        title: "Y",
+                        name: [{ "ID": 299, "TopID": 23, "AddName": "延安市" }, { "ID": 300, "TopID": 23, "AddName": "榆林市" }]
+                    }]
+                },
+                {
+                    "ID": 24, "TopID": 0, "AddName": "上海", "hasCity": [{
+                        title: "B",
+                        name: [{ "ID": 2839, "TopID": 301, "AddName": "宝山区" }]
+                    },
+                    {
+                        title: "C",
+                        name: [{ "ID": 2834, "TopID": 301, "AddName": "长宁区" }, { "ID": 2836, "TopID": 301, "AddName": "崇明区" }]
+                    },
+                    {
+                        title: "F",
+                        name: [{ "ID": 2838, "TopID": 301, "AddName": "奉贤区" }]
+                    }, {
+                        title: "H",
+                        name: [{ "ID": 2840, "TopID": 301, "AddName": "虹口区" }, { "ID": 2848, "TopID": 301, "AddName": "黄浦区" }]
+                    }, {
+                        title: "J",
+                        name: [{ "ID": 2847, "TopID": 301, "AddName": "嘉定区" }, { "ID": 2845, "TopID": 301, "AddName": "金山区" }, { "ID": 2841, "TopID": 301, "AddName": "静安区" }]
+                    }, {
+                        title: "M",
+                        name: [{ "ID": 2846, "TopID": 301, "AddName": "闵行区" }]
+                    }, {
+                        title: "P",
+                        name: [{ "ID": 2835, "TopID": 301, "AddName": "浦东新区" }, { "ID": 2849, "TopID": 301, "AddName": "普陀区" }]
+                    }, {
+                        title: "Q",
+                        name: [{ "ID": 2844, "TopID": 301, "AddName": "青浦区" }]
+                    }, {
+                        title: "S",
+                        name: [{ "ID": 2850, "TopID": 301, "AddName": "松江区" }]
+                    }, {
+                        title: "X",
+                        name: [{ "ID": 2842, "TopID": 301, "AddName": "徐汇区" }]
+                    }, {
+                        title: "Y",
+                        name: [{ "ID": 2843, "TopID": 301, "AddName": "杨浦区" }]
+                    }]
+                },
+                {
+                    "ID": 25, "TopID": 0, "AddName": "四川省", "hasCity": [{
+                        title: "A",
+                        name: [{ "ID": 302, "TopID": 25, "AddName": "阿坝藏族羌族自治州" }]
+                    }, {
+                        title: "B",
+                        name: [{ "ID": 303, "TopID": 25, "AddName": "巴中市" }]
+                    },
+                    {
+                        title: "C",
+                        name: [{ "ID": 304, "TopID": 25, "AddName": "成都市" }]
+                    },
+                    {
+                        title: "D",
+                        name: [{ "ID": 305, "TopID": 25, "AddName": "达州市" }, { "ID": 306, "TopID": 25, "AddName": "德阳市" }]
+                    }, {
+                        title: "G",
+                        name: [{ "ID": 307, "TopID": 25, "AddName": "甘孜藏族自治州" }, { "ID": 308, "TopID": 25, "AddName": "广安市" }, { "ID": 309, "TopID": 25, "AddName": "广元市" }]
+                    }, {
+                        title: "L",
+                        name: [{ "ID": 310, "TopID": 25, "AddName": "乐山市" }, { "ID": 311, "TopID": 25, "AddName": "凉山彝族自治州" }, { "ID": 312, "TopID": 25, "AddName": "泸州市" }]
+                    }, {
+                        title: "M",
+                        name: [{ "ID": 313, "TopID": 25, "AddName": "眉山市" }, { "ID": 314, "TopID": 25, "AddName": "绵阳市" }]
+                    }, {
+                        title: "N",
+                        name: [{ "ID": 315, "TopID": 25, "AddName": "内江市" }, { "ID": 316, "TopID": 25, "AddName": "南充市" }]
+                    }, {
+                        title: "P",
+                        name: [{ "ID": 317, "TopID": 25, "AddName": "攀枝花市" }]
+                    }, {
+                        title: "S",
+                        name: [{ "ID": 318, "TopID": 25, "AddName": "遂宁市" }]
+                    }, {
+                        title: "Y",
+                        name: [{ "ID": 319, "TopID": 25, "AddName": "雅安市" }, { "ID": 320, "TopID": 25, "AddName": "宜宾市" }]
+                    }, {
+                        title: "Z",
+                        name: [{ "ID": 321, "TopID": 25, "AddName": "资阳市" }, { "ID": 322, "TopID": 25, "AddName": "自贡市" }]
+                    }]
+                }]
+            },
+
+            {
+                title: "T",
+                name: [{
+                    "ID": 26,
+                    "TopID": 0,
+                    "AddName": "天津",
+                    "hasCity": [
+                        {
+                            title: "B",
+                            name: [{ "ID": 3066, "TopID": 323, "AddName": "宝坻区" }, { "ID": 3064, "TopID": 323, "AddName": "北辰区" }, { "ID": 3060, "TopID": 323, "AddName": "滨海新区" }]
+                        },
+                        {
+                            title: "D",
+                            name: [{ "ID": 3057, "TopID": 323, "AddName": "东丽区" }]
+                        },
+                        {
+                            title: "H",
+                            name: [{ "ID": 3055, "TopID": 323, "AddName": "河东区" }, { "ID": 3063, "TopID": 323, "AddName": "河北区" },
+                            { "ID": 3059, "TopID": 323, "AddName": "和平区" }, { "ID": 3061, "TopID": 323, "AddName": "河西区" }, { "ID": 3054, "TopID": 323, "AddName": "红桥区" }]
+                        },
+                        {
+                            title: "J",
+                            name: [{ "ID": 3058, "TopID": 323, "AddName": "蓟州区" }, { "ID": 3058, "TopID": 323, "AddName": "津南区" }, { "ID": 3058, "TopID": 323, "AddName": "静海区" }]
+                        },
+                        {
+                            title: "N",
+                            name: [{ "ID": 3062, "TopID": 323, "AddName": "南开区" }, { "ID": 3062, "TopID": 323, "AddName": "宁河区" }]
+                        },
+                        {
+                            title: "W",
+                            name: [{ "ID": 3065, "TopID": 323, "AddName": "武清区" }]
+                        },
+                        {
+                            title: "X",
+                            name: [{ "ID": 3056, "TopID": 323, "AddName": "西青区" }]
+                        }]
+                }]
+            },
+            {
+                title: "X",
+                name: [{
+                    "ID": 27, "TopID": 0, "AddName": "西藏自治区", "hasCity": [{
+                        title: "A",
+                        name: [{ "ID": 324, "TopID": 27, "AddName": "阿里地区" }],
+                    },
+                    {
+                        title: "C",
+                        name: [{ "ID": 325, "TopID": 27, "AddName": "昌都地区" }]
+                    },
+                    {
+                        title: "L",
+                        name: [{ "ID": 326, "TopID": 27, "AddName": "拉萨市" }, { "ID": 327, "TopID": 27, "AddName": "林芝地区" }]
+                    },
+                    {
+                        title: "N",
+                        name: [{ "ID": 328, "TopID": 27, "AddName": "那曲地区" }]
+                    },
+                    {
+                        title: "R",
+                        name: [{ "ID": 329, "TopID": 27, "AddName": "日喀则地区" }]
+                    },
+                    {
+                        title: "S",
+                        name: [{ "ID": 330, "TopID": 27, "AddName": "山南地区" }]
+                    }]
+                },
+                {
+                    "ID": 28, "TopID": 0, "AddName": "新疆维吾尔自治区", "hasCity": [{
+                        title: "A",
+                        name: [{ "ID": 331, "TopID": 28, "AddName": "阿克苏地区" }, { "ID": 331, "TopID": 28, "AddName": "阿拉尔市" }, { "ID": 332, "TopID": 28, "AddName": "阿勒泰地区" }],
+                    },
+                    {
+                        title: "B",
+                        name: [{ "ID": 333, "TopID": 28, "AddName": "巴音郭楞蒙古自治州" }, { "ID": 333, "TopID": 28, "AddName": "北屯市" }, { "ID": 334, "TopID": 28, "AddName": "博尔塔拉蒙古自治州" }]
+                    },
+                    {
+                        title: "C",
+                        name: [{ "ID": 335, "TopID": 28, "AddName": "昌吉回族自治州" }]
+                    },
+                    {
+                        title: "H",
+                        name: [{ "ID": 336, "TopID": 28, "AddName": "哈密地区" }, { "ID": 337, "TopID": 28, "AddName": "和田地区" }]
+                    },
+                    {
+                        title: "K",
+                        name: [{ "ID": 338, "TopID": 28, "AddName": "喀什地区" }, { "ID": 338, "TopID": 28, "AddName": "可克达拉市" }, { "ID": 339, "TopID": 28, "AddName": "克拉玛依市" }, { "ID": 340, "TopID": 28, "AddName": "克孜勒苏柯尔克孜自治州" }, { "ID": 340, "TopID": 28, "AddName": "昆玉市" }]
+                    },
+                    {
+                        title: "S",
+                        name: [{ "ID": 338, "TopID": 28, "AddName": "石河子市" }, { "ID": 338, "TopID": 28, "AddName": "双河市" }]
+                    },
+                    {
+                        title: "T",
+                        name: [{ "ID": 341, "TopID": 28, "AddName": "塔城地区" }, { "ID": 342, "TopID": 28, "AddName": "铁门关市" }, { "ID": 342, "TopID": 28, "AddName": "吐鲁番地区" }, { "ID": 342, "TopID": 28, "AddName": "图木舒克市" }]
+                    }, {
+                        title: "W",
+                        name: [{ "ID": 329, "TopID": 27, "AddName": "五家渠市" }, { "ID": 343, "TopID": 28, "AddName": "乌鲁木齐市" }]
+                    },
+                    {
+                        title: "Y",
+                        name: [{ "ID": 344, "TopID": 28, "AddName": "伊犁哈萨克自治州" }]
+                    }]
+                }]
+            },
+            {
+                title: "Y",
+                name: [{
+                    "ID": 29,
+                    "TopID": 0,
+                    "AddName": "云南省",
+                    "first": "Y",
+                    "hasCity": [{
+                        title: "B",
+                        name: [{ "ID": 346, "TopID": 29, "AddName": "保山市" }],
+                    },
+                    {
+                        title: "C",
+                        name: [{ "ID": 347, "TopID": 29, "AddName": "楚雄彝族自治州" }]
+                    },
+                    {
+                        title: "D",
+                        name: [{ "ID": 348, "TopID": 29, "AddName": "大理白族自治州" }, { "ID": 349, "TopID": 29, "AddName": "德宏傣族景颇族自治州" }, { "ID": 350, "TopID": 29, "AddName": "迪庆藏族自治州" }]
+                    },
+                    {
+                        title: "H",
+                        name: [{ "ID": 351, "TopID": 29, "AddName": "红河哈尼族彝族自治州" }]
+                    },
+                    {
+                        title: "K",
+                        name: [{ "ID": 352, "TopID": 29, "AddName": "昆明市" }]
+                    },
+                    {
+                        title: "L",
+                        name: [{ "ID": 353, "TopID": 29, "AddName": "丽江市" }, { "ID": 354, "TopID": 29, "AddName": "临沧市" }]
+                    },
+                    {
+                        title: "N",
+                        name: [{ "ID": 355, "TopID": 29, "AddName": "怒江傈僳族自治州" }]
+                    },
+                    {
+                        title: "P",
+                        name: [{ "ID": 356, "TopID": 29, "AddName": "普洱市" }]
+                    },
+                    {
+                        title: "Q",
+                        name: [{ "ID": 357, "TopID": 29, "AddName": "曲靖市" }]
+                    },
+                    {
+                        title: "W",
+                        name: [{ "ID": 358, "TopID": 29, "AddName": "文山壮族苗族自治州" }]
+                    }, {
+                        title: "X",
+                        name: [{ "ID": 359, "TopID": 29, "AddName": "西双版纳傣族自治州" }]
+                    }, {
+                        title: "Y",
+                        name: [{ "ID": 360, "TopID": 29, "AddName": "玉溪市" }]
+                    }, {
+                        title: "Z",
+                        name: [{ "ID": 361, "TopID": 29, "AddName": "昭通市" }]
+                    }]
+                }]
+            },
+            {
+                title: "Z",
+                name: [
+                    {
+                        "ID": 30, "TopID": 0, "AddName": "浙江省",
+                        "hasCity": [{
+                            title: "H",
+                            name: [{ "ID": 362, "TopID": 30, "AddName": "杭州市" }, { "ID": 363, "TopID": 30, "AddName": "湖州市" }],
+                        },
+                        {
+                            title: "J",
+                            name: [{ "ID": 364, "TopID": 30, "AddName": "嘉兴市" }, { "ID": 365, "TopID": 30, "AddName": "金华市" }]
+                        },
+                        {
+                            title: "L",
+                            name: [{ "ID": 366, "TopID": 30, "AddName": "丽水市" }]
+                        },
+                        {
+                            title: "N",
+                            name: [{ "ID": 367, "TopID": 30, "AddName": "宁波市" }]
+                        },
+                        {
+                            title: "Q",
+                            name: [{ "ID": 368, "TopID": 30, "AddName": "衢州市" }]
+                        },
+                        {
+                            title: "S",
+                            name: [{ "ID": 369, "TopID": 30, "AddName": "绍兴市" }]
+                        },
+                        {
+                            title: "T",
+                            name: [{ "ID": 370, "TopID": 30, "AddName": "台州市" }]
+                        },
+                        {
+                            title: "W",
+                            name: [{ "ID": 371, "TopID": 30, "AddName": "温州市" }]
+                        },
+                        {
+                            title: "Z",
+                            name: [{ "ID": 372, "TopID": 30, "AddName": "舟山市" }]
+                        }]
+                    }]
+            }
+        ]
+

+ 259 - 0
static/js/encrypt.js

@@ -0,0 +1,259 @@
+module.exports = {
+	chrsz:8,
+	hexcase:0,
+	b64pad:'',
+	/**
+	 * 哈希算法加密
+	 * @param {string}     str:要加密的数据
+	 * @param {string}     raw:方式
+	 */
+	sha1:function(str, raw){
+		str = this.utf16to8(str);
+		if (raw == true) {
+			return this.str_sha1(str);
+		} else {
+			return this.hex_sha1(str);
+		}
+	},
+	md5:function md5(s){ 
+	   return this.binl2hex(this.core_md5(this.str2binl(s), s.length * this.chrsz));
+	},
+	utf16to8:function(str){
+		var out, i, len, c;
+		out = '';
+		len = str.length;
+		for (i = 0; i < len; i++) {
+			c = str.charCodeAt(i);
+			if ((c >= 0x0001) && (c <= 0x007F)) {
+				out += str.charAt(i);
+			} else if (c > 0x07FF) {
+				out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
+				out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F));
+				out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
+			} else {
+				out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F));
+				out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
+			}
+		}
+		return out;
+	},
+	hex_sha1:function (s) {
+		return this.binb2hex(this.core_sha1(this.str2binb(s), s.length * this.chrsz));
+	},
+	str_sha1:function (s) {
+		return this.binb2str(this.core_sha1(this.str2binb(s), s.length * this.chrsz));
+	},
+	binb2hex:function(binarray) {
+		var hex_tab = this.hexcase ? '0123456789ABCDEF': '0123456789abcdef';
+		var str = "";
+		for (var i = 0; i < binarray.length * 4; i++) {
+			str += hex_tab.charAt((binarray[i >> 2] >> ((3 - i % 4) * 8 + 4)) & 0xF) + hex_tab.charAt((binarray[i >> 2] >> ((3 - i % 4) * 8)) & 0xF);
+		}
+		return str;
+	},
+	binl2hex:function (binarray){
+		var hex_tab = this.hexcase ? '0123456789ABCDEF' : '0123456789abcdef';
+		var str = "";
+		for(var i = 0; i < binarray.length * 4; i++){
+			str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) +hex_tab.charAt((binarray[i>>2] >> ((i%4)*8  )) & 0xF);
+		}
+		return str;
+	},
+	binb2str:function (bin) {
+		var str = "";
+		var mask = (1 << this.chrsz) - 1;
+		for (var i = 0; i < bin.length * 32; i += this.chrsz) str += String.fromCharCode((bin[i >> 5] >>> (32 - this.chrsz - i % 32)) & mask);
+		return str;
+	},
+	binl2str:function (bin){
+		var str = "";
+		var mask = (1 << this.chrsz) - 1;
+		for(var i = 0; i < bin.length * 32; i += this.chrsz) str += String.fromCharCode((bin[i>>5] >>> (i % 32)) & mask);
+		return str;
+	},
+	binl2b64:function (binarray){
+		var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
+		var str = '';
+		for(var i = 0; i < binarray.length * 4; i += 3){
+		var triplet = (((binarray[i   >> 2] >> 8 * ( i   %4)) & 0xFF) << 16)
+					| (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 )
+					|  ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF);
+			for(var j = 0; j < 4; j++){
+				if(i * 8 + j * 6 > binarray.length * 32) str += this.b64pad;
+				else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
+			}
+		}
+		return str;
+	},
+	str2binb:function (str) {
+		var bin = Array();
+		var mask = (1 << this.chrsz) - 1;
+		for (var i = 0; i < str.length * this.chrsz; i += this.chrsz) bin[i >> 5] |= (str.charCodeAt(i / this.chrsz) & mask) << (32 - this.chrsz - i % 32);
+		return bin;
+		
+	},
+	str2binl:function (str){
+		var bin = Array();
+		var mask = (1 << this.chrsz) - 1;
+		for(var i = 0; i < str.length * this.chrsz; i += this.chrsz) bin[i>>5] |= (str.charCodeAt(i / this.chrsz) & mask) << (i%32);
+		return bin;
+	},
+	safe_add:function (x, y) {
+		var lsw = (x & 0xFFFF) + (y & 0xFFFF);
+		var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
+		return (msw << 16) | (lsw & 0xFFFF);
+		
+	},
+	rol:function (num, cnt) {
+		return (num << cnt) | (num >>> (32 - cnt));
+	},
+	sha1_ft:function (t, b, c, d) {
+		if (t < 20) return (b & c) | ((~b) & d);
+		if (t < 40) return b ^ c ^ d;
+		if (t < 60) return (b & c) | (b & d) | (c & d);
+		return b ^ c ^ d;
+	},
+	sha1_kt:function (t) {
+		return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 : (t < 60) ? -1894007588 : -899497514;
+	},
+	core_sha1:function (x, len) {
+		x[len >> 5] |= 0x80 << (24 - len % 32);
+		x[((len + 64 >> 9) << 4) + 15] = len;
+		var w = Array(80);
+		var a = 1732584193;
+		var b = -271733879;
+		var c = -1732584194;
+		var d = 271733878;
+		var e = -1009589776;
+		for (var i = 0; i < x.length; i += 16) {
+			var olda = a;
+			var oldb = b;
+			var oldc = c;
+			var oldd = d;
+			var olde = e;
+
+			for (var j = 0; j < 80; j++) {
+				if (j < 16) w[j] = x[i + j];
+				else w[j] = this.rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
+				var t = this.safe_add(this.safe_add(this.rol(a, 5), this.sha1_ft(j, b, c, d)), this.safe_add(this.safe_add(e, w[j]), this.sha1_kt(j)));
+				e = d;
+				d = c;
+				c = this.rol(b, 30);
+				b = a;
+				a = t;
+			}
+
+			a = this.safe_add(a, olda);
+			b = this.safe_add(b, oldb);
+			c = this.safe_add(c, oldc);
+			d = this.safe_add(d, oldd);
+			e = this.safe_add(e, olde);
+		}
+		return Array(a, b, c, d, e);
+	},
+	core_md5:function (x, len){
+		x[len >> 5] |= 0x80 << ((len) % 32);
+		x[(((len + 64) >>> 9) << 4) + 14] = len;
+
+		var a =  1732584193;
+		var b = -271733879;
+		var c = -1732584194;
+		var d =  271733878;
+
+		for(var i = 0; i < x.length; i += 16){
+			var olda = a;
+			var oldb = b;
+			var oldc = c;
+			var oldd = d;
+
+			a = this.md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936);
+			d = this.md5_ff(d, a, b, c, x[i+ 1], 12, -389564586);
+			c = this.md5_ff(c, d, a, b, x[i+ 2], 17,  606105819);
+			b = this.md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330);
+			a = this.md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897);
+			d = this.md5_ff(d, a, b, c, x[i+ 5], 12,  1200080426);
+			c = this.md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341);
+			b = this.md5_ff(b, c, d, a, x[i+ 7], 22, -45705983);
+			a = this.md5_ff(a, b, c, d, x[i+ 8], 7 ,  1770035416);
+			d = this.md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417);
+			c = this.md5_ff(c, d, a, b, x[i+10], 17, -42063);
+			b = this.md5_ff(b, c, d, a, x[i+11], 22, -1990404162);
+			a = this.md5_ff(a, b, c, d, x[i+12], 7 ,  1804603682);
+			d = this.md5_ff(d, a, b, c, x[i+13], 12, -40341101);
+			c = this.md5_ff(c, d, a, b, x[i+14], 17, -1502002290);
+			b = this.md5_ff(b, c, d, a, x[i+15], 22,  1236535329);
+
+			a = this.md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510);
+			d = this.md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632);
+			c = this.md5_gg(c, d, a, b, x[i+11], 14,  643717713);
+			b = this.md5_gg(b, c, d, a, x[i+ 0], 20, -373897302);
+			a = this.md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691);
+			d = this.md5_gg(d, a, b, c, x[i+10], 9 ,  38016083);
+			c = this.md5_gg(c, d, a, b, x[i+15], 14, -660478335);
+			b = this.md5_gg(b, c, d, a, x[i+ 4], 20, -405537848);
+			a = this.md5_gg(a, b, c, d, x[i+ 9], 5 ,  568446438);
+			d = this.md5_gg(d, a, b, c, x[i+14], 9 , -1019803690);
+			c = this.md5_gg(c, d, a, b, x[i+ 3], 14, -187363961);
+			b = this.md5_gg(b, c, d, a, x[i+ 8], 20,  1163531501);
+			a = this.md5_gg(a, b, c, d, x[i+13], 5 , -1444681467);
+			d = this.md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784);
+			c = this.md5_gg(c, d, a, b, x[i+ 7], 14,  1735328473);
+			b = this.md5_gg(b, c, d, a, x[i+12], 20, -1926607734);
+
+			a = this.md5_hh(a, b, c, d, x[i+ 5], 4 , -378558);
+			d = this.md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463);
+			c = this.md5_hh(c, d, a, b, x[i+11], 16,  1839030562);
+			b = this.md5_hh(b, c, d, a, x[i+14], 23, -35309556);
+			a = this.md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060);
+			d = this.md5_hh(d, a, b, c, x[i+ 4], 11,  1272893353);
+			c = this.md5_hh(c, d, a, b, x[i+ 7], 16, -155497632);
+			b = this.md5_hh(b, c, d, a, x[i+10], 23, -1094730640);
+			a = this.md5_hh(a, b, c, d, x[i+13], 4 ,  681279174);
+			d = this.md5_hh(d, a, b, c, x[i+ 0], 11, -358537222);
+			c = this.md5_hh(c, d, a, b, x[i+ 3], 16, -722521979);
+			b = this.md5_hh(b, c, d, a, x[i+ 6], 23,  76029189);
+			a = this.md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487);
+			d = this.md5_hh(d, a, b, c, x[i+12], 11, -421815835);
+			c = this.md5_hh(c, d, a, b, x[i+15], 16,  530742520);
+			b = this.md5_hh(b, c, d, a, x[i+ 2], 23, -995338651);
+
+			a = this.md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844);
+			d = this.md5_ii(d, a, b, c, x[i+ 7], 10,  1126891415);
+			c = this.md5_ii(c, d, a, b, x[i+14], 15, -1416354905);
+			b = this.md5_ii(b, c, d, a, x[i+ 5], 21, -57434055);
+			a = this.md5_ii(a, b, c, d, x[i+12], 6 ,  1700485571);
+			d = this.md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606);
+			c = this.md5_ii(c, d, a, b, x[i+10], 15, -1051523);
+			b = this.md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799);
+			a = this.md5_ii(a, b, c, d, x[i+ 8], 6 ,  1873313359);
+			d = this.md5_ii(d, a, b, c, x[i+15], 10, -30611744);
+			c = this.md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380);
+			b = this.md5_ii(b, c, d, a, x[i+13], 21,  1309151649);
+			a = this.md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070);
+			d = this.md5_ii(d, a, b, c, x[i+11], 10, -1120210379);
+			c = this.md5_ii(c, d, a, b, x[i+ 2], 15,  718787259);
+			b = this.md5_ii(b, c, d, a, x[i+ 9], 21, -343485551);
+
+			a = this.safe_add(a, olda);
+			b = this.safe_add(b, oldb);
+			c = this.safe_add(c, oldc);
+			d = this.safe_add(d, oldd);
+		}
+		return Array(a, b, c, d);
+	},
+	md5_cmn:function (q, a, b, x, s, t){
+		return this.safe_add(this.rol(this.safe_add(this.safe_add(a, q), this.safe_add(x, t)), s),b);
+	},
+	md5_ff:function (a, b, c, d, x, s, t){
+		return this.md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
+	},
+	md5_gg:function (a, b, c, d, x, s, t){
+		return this.md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
+	},
+	md5_hh:function (a, b, c, d, x, s, t){
+		return this.md5_cmn(b ^ c ^ d, a, b, x, s, t);
+	},
+	md5_ii:function (a, b, c, d, x, s, t){
+		return this.md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
+	}
+}

+ 110 - 0
static/js/math.js

@@ -0,0 +1,110 @@
+module.exports = {
+	/**
+	 * +
+	 * @param arg1
+	 * @param arg2
+	 * @returns {number}
+	 */
+	add: function(arg1, arg2) {
+		var r1, r2, m;
+		try {
+			r1 = arg1.toString().split(".")[1].length
+		} catch (e) {
+			r1 = 0
+		}
+		try {
+			r2 = arg2.toString().split(".")[1].length
+		} catch (e) {
+			r2 = 0
+		}
+		m = Math.pow(10, Math.max(r1, r2))
+		return (arg1 * m + arg2 * m) / m
+	},
+	/**
+	 * -
+	 * @param arg1
+	 * @param arg2
+	 * @returns {number}
+	 */
+	sub: function(arg1, arg2) {
+		var r1, r2, m, n;
+		try {
+			r1 = arg1.toString().split(".")[1].length
+		} catch (e) {
+			r1 = 0
+		}
+		try {
+			r2 = arg2.toString().split(".")[1].length
+		} catch (e) {
+			r2 = 0
+		}
+		m = Math.pow(10, Math.max(r1, r2));
+		n = (r1 >= r2) ? r1 : r2;
+		return ((arg1 * m - arg2 * m) / m).toFixed(n);
+	},
+	/**
+	 *  *
+	 * @param arg1
+	 * @param arg2
+	 * @returns {number}
+	 */
+	mul: function(arg1, arg2) {
+		var m = 0,
+			s1 = arg1.toString(),
+			s2 = arg2.toString();
+		try {
+			m += s1.split(".")[1].length
+		} catch (e) {}
+		try {
+			m += s2.split(".")[1].length
+		} catch (e) {}
+		return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m)
+	},
+	/**
+	 * /
+	 * @param arg1
+	 * @param arg2
+	 * @returns {number}
+	 */
+	div: function(arg1, arg2) {
+		var t1 = 0,
+			t2 = 0,
+			r1, r2;
+		try {
+			t1 = arg1.toString().split(".")[1].length
+		} catch (e) {}
+		try {
+			t2 = arg2.toString().split(".")[1].length
+		} catch (e) {}
+		r1 = Number(arg1.toString().replace(".", ""))
+		r2 = Number(arg2.toString().replace(".", ""))
+		return this.mul((r1 / r2), Math.pow(10, t2 - t1));
+	},
+	/**
+	 * 保留有效小数位 四舍五入,解决toFixed方法bug
+	 * @param num 需要操作的数字
+	 * @param decimal 保留小数的位数
+	 * @returns {string}
+	 */
+	toFixed: function(num, decimal) {
+		if(typeof decimal == 'undefined'){
+			decimal = 2;
+		}
+		var times = Math.pow(10, decimal)
+		var des = num * times + 0.5
+		des = (parseInt(des, 10) / times).toString()
+		if(decimal > 0){
+			var arr = des.split('.')
+			var len = decimal;
+			if(arr.length == 1){
+				des += '.';
+			}else{
+				len = decimal - arr[1].length;
+			}
+			for (let i = 1; i <= len; i++) {
+				des += '0';
+			}
+		}
+		return des;
+	},
+};

+ 742 - 0
static/js/qqmap-wx-jssdk.js

@@ -0,0 +1,742 @@
+/**
+ * 微信小程序JavaScriptSDK
+ * 地图
+ * 苍源怡家
+ * @version 1.1
+ * @date 2019-01-20
+ */
+
+var ERROR_CONF = {
+    KEY_ERR: 311,
+    KEY_ERR_MSG: 'key格式错误',
+    PARAM_ERR: 310,
+    PARAM_ERR_MSG: '请求参数信息有误',
+    SYSTEM_ERR: 600,
+    SYSTEM_ERR_MSG: '系统错误',
+    WX_ERR_CODE: 1000,
+    WX_OK_CODE: 200
+};
+var BASE_URL = 'https://apis.map.qq.com/ws/';
+var URL_SEARCH = BASE_URL + 'place/v1/search';
+var URL_SUGGESTION = BASE_URL + 'place/v1/suggestion';
+var URL_GET_GEOCODER = BASE_URL + 'geocoder/v1/';
+var URL_CITY_LIST = BASE_URL + 'district/v1/list';
+var URL_AREA_LIST = BASE_URL + 'district/v1/getchildren';
+var URL_DISTANCE = BASE_URL + 'distance/v1/';
+var EARTH_RADIUS = 6378136.49;
+var Utils = {
+    /**
+     * 得到终点query字符串
+     * @param {Array|String} 检索数据
+     */
+    location2query(data) {
+        if (typeof data == 'string') {
+            return data;
+        }
+        var query = '';
+        for (var i = 0; i < data.length; i++) {
+            var d = data[i];
+            if (!!query) {
+                query += ';';
+            }
+            if (d.location) {
+                query = query + d.location.lat + ',' + d.location.lng;
+            }
+            if (d.latitude && d.longitude) {
+                query = query + d.latitude + ',' + d.longitude;
+            }
+        }
+        return query;
+    },
+
+    /**
+     * 计算角度
+     */
+    rad(d) {
+      return d * Math.PI / 180.0;
+    },  
+    /**
+     * 处理终点location数组
+     * @return 返回终点数组
+     */
+    getEndLocation(location){
+      var to = location.split(';');
+      var endLocation = [];
+      for (var i = 0; i < to.length; i++) {
+        endLocation.push({
+          lat: parseFloat(to[i].split(',')[0]),
+          lng: parseFloat(to[i].split(',')[1])
+        })
+      }
+      return endLocation;
+    },
+
+    /**
+     * 计算两点间直线距离
+     * @param a 表示纬度差
+     * @param b 表示经度差
+     * @return 返回的是距离,单位m
+     */
+    getDistance(latFrom, lngFrom, latTo, lngTo) {
+      var radLatFrom = this.rad(latFrom);
+      var radLatTo = this.rad(latTo);
+      var a = radLatFrom - radLatTo;
+      var b = this.rad(lngFrom) - this.rad(lngTo);
+      var distance = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + Math.cos(radLatFrom) * Math.cos(radLatTo) * Math.pow(Math.sin(b / 2), 2)));
+      distance = distance * EARTH_RADIUS;
+      distance = Math.round(distance * 10000) / 10000;
+      return parseFloat(distance.toFixed(0));
+    },
+    /**
+     * 使用微信接口进行定位
+     */
+    getWXLocation(success, fail, complete) {
+        wx.getLocation({
+            type: 'gcj02',
+            success: success,
+            fail: fail,
+            complete: complete
+        });
+    },
+
+    /**
+     * 获取location参数
+     */
+    getLocationParam(location) {
+        if (typeof location == 'string') {
+            var locationArr = location.split(',');
+            if (locationArr.length === 2) {
+                location = {
+                    latitude: location.split(',')[0],
+                    longitude: location.split(',')[1]
+                };
+            } else {
+                location = {};
+            }
+        }
+        return location;
+    },
+
+    /**
+     * 回调函数默认处理
+     */
+    polyfillParam(param) {
+        param.success = param.success || function () { };
+        param.fail = param.fail || function () { };
+        param.complete = param.complete || function () { };
+    },
+
+    /**
+     * 验证param对应的key值是否为空
+     * 
+     * @param {Object} param 接口参数
+     * @param {String} key 对应参数的key
+     */
+    checkParamKeyEmpty(param, key) {
+        if (!param[key]) {
+            var errconf = this.buildErrorConfig(ERROR_CONF.PARAM_ERR, ERROR_CONF.PARAM_ERR_MSG + key +'参数格式有误');
+            param.fail(errconf);
+            param.complete(errconf);
+            return true;
+        }
+        return false;
+    },
+
+    /**
+     * 验证参数中是否存在检索词keyword
+     * 
+     * @param {Object} param 接口参数
+     */
+    checkKeyword(param){
+        return !this.checkParamKeyEmpty(param, 'keyword');
+    },
+
+    /**
+     * 验证location值
+     * 
+     * @param {Object} param 接口参数
+     */
+    checkLocation(param) {
+        var location = this.getLocationParam(param.location);
+        if (!location || !location.latitude || !location.longitude) {
+            var errconf = this.buildErrorConfig(ERROR_CONF.PARAM_ERR, ERROR_CONF.PARAM_ERR_MSG + ' location参数格式有误');
+            param.fail(errconf);
+            param.complete(errconf);
+            return false;
+        }
+        return true;
+    },
+
+    /**
+     * 构造错误数据结构
+     * @param {Number} errCode 错误码
+     * @param {Number} errMsg 错误描述
+     */
+    buildErrorConfig(errCode, errMsg) {
+        return {
+            status: errCode,
+            message: errMsg
+        };
+    },
+
+    /**
+     * 
+     * 数据处理函数
+     * 根据传入参数不同处理不同数据
+     * @param {String} feature 功能名称
+     * search 地点搜索
+     * suggest关键词提示
+     * reverseGeocoder逆地址解析
+     * geocoder地址解析
+     * getCityList获取城市列表:父集
+     * getDistrictByCityId获取区县列表:子集
+     * calculateDistance距离计算
+     * @param {Object} param 接口参数
+     * @param {Object} data 数据
+     */
+    handleData(param,data,feature){
+      if (feature === 'search') {
+        var searchResult = data.data;
+        var searchSimplify = [];
+        for (var i = 0; i < searchResult.length; i++) {
+          searchSimplify.push({
+            id: searchResult[i].id || null,
+            title: searchResult[i].title || null,
+            latitude: searchResult[i].location && searchResult[i].location.lat || null,
+            longitude: searchResult[i].location && searchResult[i].location.lng || null,
+            address: searchResult[i].address || null,
+            category: searchResult[i].category || null,
+            tel: searchResult[i].tel || null,
+            adcode: searchResult[i].ad_info && searchResult[i].ad_info.adcode || null,
+            city: searchResult[i].ad_info && searchResult[i].ad_info.city || null,
+            district: searchResult[i].ad_info && searchResult[i].ad_info.district || null,
+            province: searchResult[i].ad_info && searchResult[i].ad_info.province || null
+          })
+        }
+        param.success(data, {
+          searchResult: searchResult,
+          searchSimplify: searchSimplify
+        })
+      } else if (feature === 'suggest') {
+        var suggestResult = data.data;
+        var suggestSimplify = [];
+        for (var i = 0; i < suggestResult.length; i++) {
+          suggestSimplify.push({
+            adcode: suggestResult[i].adcode || null,
+            address: suggestResult[i].address || null,
+            category: suggestResult[i].category || null,
+            city: suggestResult[i].city || null,
+            district: suggestResult[i].district || null,
+            id: suggestResult[i].id || null,
+            latitude: suggestResult[i].location && suggestResult[i].location.lat || null,
+            longitude: suggestResult[i].location && suggestResult[i].location.lng || null,
+            province: suggestResult[i].province || null,
+            title: suggestResult[i].title || null,
+            type: suggestResult[i].type || null
+          })
+        }
+        param.success(data, {
+          suggestResult: suggestResult,
+          suggestSimplify: suggestSimplify
+          })
+      } else if (feature === 'reverseGeocoder') {
+        var reverseGeocoderResult = data.result;
+        var reverseGeocoderSimplify = {
+          address: reverseGeocoderResult.address || null,
+          latitude: reverseGeocoderResult.location && reverseGeocoderResult.location.lat || null,
+          longitude: reverseGeocoderResult.location && reverseGeocoderResult.location.lng || null,
+          adcode: reverseGeocoderResult.ad_info && reverseGeocoderResult.ad_info.adcode || null,
+          city: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.city || null,
+          district: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.district || null,
+          nation: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.nation || null,
+          province: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.province || null,
+          street: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.street || null,
+          street_number: reverseGeocoderResult.address_component && reverseGeocoderResult.address_component.street_number || null,
+          recommend: reverseGeocoderResult.formatted_addresses && reverseGeocoderResult.formatted_addresses.recommend || null,
+          rough: reverseGeocoderResult.formatted_addresses && reverseGeocoderResult.formatted_addresses.rough || null
+        };
+        if (reverseGeocoderResult.pois) {//判断是否返回周边poi
+          var pois = reverseGeocoderResult.pois;
+          var poisSimplify = [];
+          for (var i = 0;i < pois.length;i++) {
+            poisSimplify.push({
+              id: pois[i].id || null,
+              title: pois[i].title || null,
+              latitude: pois[i].location && pois[i].location.lat || null,
+              longitude: pois[i].location && pois[i].location.lng || null,
+              address: pois[i].address || null,
+              category: pois[i].category || null,
+              adcode: pois[i].ad_info && pois[i].ad_info.adcode || null,
+              city: pois[i].ad_info && pois[i].ad_info.city || null,
+              district: pois[i].ad_info && pois[i].ad_info.district || null,
+              province: pois[i].ad_info && pois[i].ad_info.province || null
+            })
+          }
+          param.success(data,{
+            reverseGeocoderResult: reverseGeocoderResult,
+            reverseGeocoderSimplify: reverseGeocoderSimplify,
+            pois: pois,
+            poisSimplify: poisSimplify
+          })
+        } else {
+          param.success(data, {
+            reverseGeocoderResult: reverseGeocoderResult,
+            reverseGeocoderSimplify: reverseGeocoderSimplify
+          })
+        }
+      } else if (feature === 'geocoder') {
+        var geocoderResult = data.result;
+        var geocoderSimplify = {
+          title: geocoderResult.title || null,
+          latitude: geocoderResult.location && geocoderResult.location.lat || null,
+          longitude: geocoderResult.location && geocoderResult.location.lng || null,
+          adcode: geocoderResult.ad_info && geocoderResult.ad_info.adcode || null,
+          province: geocoderResult.address_components && geocoderResult.address_components.province || null,
+          city: geocoderResult.address_components && geocoderResult.address_components.city || null,
+          district: geocoderResult.address_components && geocoderResult.address_components.district || null,
+          street: geocoderResult.address_components && geocoderResult.address_components.street || null,
+          street_number: geocoderResult.address_components && geocoderResult.address_components.street_number || null,
+          level: geocoderResult.level || null
+        };
+        param.success(data,{
+          geocoderResult: geocoderResult,
+          geocoderSimplify: geocoderSimplify
+        });
+      } else if (feature === 'getCityList') {
+        var provinceResult = data.result[0];
+        var cityResult = data.result[1];
+        var districtResult = data.result[2];
+        param.success(data,{
+          provinceResult: provinceResult,
+          cityResult: cityResult,
+          districtResult: districtResult
+        });
+      } else if (feature === 'getDistrictByCityId') {
+        var districtByCity = data.result[0];
+        param.success(data, districtByCity);
+      } else if (feature === 'calculateDistance') {
+        var calculateDistanceResult = data.result.elements;  
+        var distance = [];
+        for (var i = 0; i < calculateDistanceResult.length; i++){
+          distance.push(calculateDistanceResult[i].distance);
+        }   
+        param.success(data, {
+          calculateDistanceResult: calculateDistanceResult,
+          distance: distance
+          });
+      } else {
+        param.success(data);
+      }
+    },
+
+    /**
+     * 构造微信请求参数,公共属性处理
+     * 
+     * @param {Object} param 接口参数
+     * @param {Object} param 配置项
+     * @param {String} feature 方法名
+     */
+    buildWxRequestConfig(param, options, feature) {
+        var that = this;
+        options.header = { "content-type": "application/json" };
+        options.method = 'GET';
+        options.success = function (res) {
+            var data = res.data;
+            if (data.status === 0) {
+              that.handleData(param, data, feature);
+            } else {
+                param.fail(data);
+            }
+        };
+        options.fail = function (res) {
+            res.statusCode = ERROR_CONF.WX_ERR_CODE;
+            param.fail(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg));
+        };
+        options.complete = function (res) {
+            var statusCode = +res.statusCode;
+            switch(statusCode) {
+                case ERROR_CONF.WX_ERR_CODE: {
+                    param.complete(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg));
+                    break;
+                }
+                case ERROR_CONF.WX_OK_CODE: {
+                    var data = res.data;
+                    if (data.status === 0) {
+                        param.complete(data);
+                    } else {
+                        param.complete(that.buildErrorConfig(data.status, data.message));
+                    }
+                    break;
+                }
+                default:{
+                    param.complete(that.buildErrorConfig(ERROR_CONF.SYSTEM_ERR, ERROR_CONF.SYSTEM_ERR_MSG));
+                }
+
+            }
+        };
+        return options;
+    },
+
+    /**
+     * 处理用户参数是否传入坐标进行不同的处理
+     */
+    locationProcess(param, locationsuccess, locationfail, locationcomplete) {
+        var that = this;
+        locationfail = locationfail || function (res) {
+            res.statusCode = ERROR_CONF.WX_ERR_CODE;
+            param.fail(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg));
+        };
+        locationcomplete = locationcomplete || function (res) {
+            if (res.statusCode == ERROR_CONF.WX_ERR_CODE) {
+                param.complete(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg));
+            }
+        };
+        if (!param.location) {
+            that.getWXLocation(locationsuccess, locationfail, locationcomplete);
+        } else if (that.checkLocation(param)) {
+            var location = Utils.getLocationParam(param.location);
+            locationsuccess(location);
+        }
+    }
+};
+
+
+class QQMapWX {
+
+    /**
+     * 构造函数
+     * 
+     * @param {Object} options 接口参数,key 为必选参数
+     */
+    constructor(options) {
+        if (!options.key) {
+            throw Error('key值不能为空');
+        }
+        this.key = options.key;
+    };
+
+    /**
+     * POI周边检索
+     *
+     * @param {Object} options 接口参数对象
+     * 
+     * 参数对象结构可以参考
+     * @see http://lbs.qq.com/webservice_v1/guide-search.html
+     */
+    search(options) {
+        var that = this;
+        options = options || {};
+
+        Utils.polyfillParam(options);
+
+        if (!Utils.checkKeyword(options)) {
+            return;
+        }
+
+        var requestParam = {
+            keyword: options.keyword,
+            orderby: options.orderby || '_distance',
+            page_size: options.page_size || 10,
+            page_index: options.page_index || 1,
+            output: 'json',
+            key: that.key
+        };
+
+        if (options.address_format) {
+            requestParam.address_format = options.address_format;
+        }
+
+        if (options.filter) {
+            requestParam.filter = options.filter;
+        }
+
+        var distance = options.distance || "1000";
+        var auto_extend = options.auto_extend || 1;
+        var region = null;
+        var rectangle = null;
+
+        //判断城市限定参数
+        if (options.region) {
+          region = options.region;
+        }
+
+        //矩形限定坐标(暂时只支持字符串格式)
+        if (options.rectangle) {
+          rectangle = options.rectangle;
+        }
+
+        var locationsuccess = function (result) {        
+          if (region && !rectangle) {
+            //城市限定参数拼接
+            requestParam.boundary = "region(" + region + "," + auto_extend + "," + result.latitude + "," + result.longitude + ")";
+          } else if (rectangle && !region) {
+            //矩形搜索
+            requestParam.boundary = "rectangle(" + rectangle + ")";
+            } else {
+              requestParam.boundary = "nearby(" + result.latitude + "," + result.longitude + "," + distance + "," + auto_extend + ")";
+            }            
+            wx.request(Utils.buildWxRequestConfig(options, {
+                url: URL_SEARCH,
+                data: requestParam
+            }, 'search'));
+        };
+        Utils.locationProcess(options, locationsuccess);
+    };
+
+    /**
+     * sug模糊检索
+     *
+     * @param {Object} options 接口参数对象
+     * 
+     * 参数对象结构可以参考
+     * http://lbs.qq.com/webservice_v1/guide-suggestion.html
+     */
+    getSuggestion(options) {
+        var that = this;
+        options = options || {};
+        Utils.polyfillParam(options);
+
+        if (!Utils.checkKeyword(options)) {
+            return;
+        }
+
+        var requestParam = {
+            keyword: options.keyword,
+            region: options.region || '全国',
+            region_fix: options.region_fix || 0,
+            policy: options.policy || 0,
+            page_size: options.page_size || 10,//控制显示条数
+            page_index: options.page_index || 1,//控制页数
+            get_subpois : options.get_subpois || 0,//返回子地点
+            output: 'json',
+            key: that.key
+        };
+        //长地址
+        if (options.address_format) {
+          requestParam.address_format = options.address_format;
+        }
+        //过滤
+        if (options.filter) {
+          requestParam.filter = options.filter;
+        }
+        //排序
+        if (options.location) {
+          var locationsuccess = function (result) {
+            requestParam.location = result.latitude + ',' + result.longitude;
+            wx.request(Utils.buildWxRequestConfig(options, {
+              url: URL_SUGGESTION,
+              data: requestParam
+            }, "suggest"));      
+          };
+          Utils.locationProcess(options, locationsuccess);
+        } else {
+          wx.request(Utils.buildWxRequestConfig(options, {
+            url: URL_SUGGESTION,
+            data: requestParam
+          }, "suggest"));      
+        } 
+    };
+
+    /**
+     * 逆地址解析
+     *
+     * @param {Object} options 接口参数对象
+     * 
+     * 请求参数结构可以参考
+     * http://lbs.qq.com/webservice_v1/guide-gcoder.html
+     */
+    reverseGeocoder(options) {
+      console.log(options)
+        var that = this;
+        options = options || {};
+        Utils.polyfillParam(options);
+        var requestParam = {
+            coord_type: options.coord_type || 5,
+            get_poi: options.get_poi || 0,
+            output: 'json',
+            key: that.key
+        };
+        if (options.poi_options) {
+            requestParam.poi_options = options.poi_options
+        }
+
+        var locationsuccess = function (result) {
+            requestParam.location = result.latitude + ',' + result.longitude;
+            wx.request(Utils.buildWxRequestConfig(options, {
+                url: URL_GET_GEOCODER,
+                data: requestParam
+            }, 'reverseGeocoder'));
+        };
+        Utils.locationProcess(options, locationsuccess);
+    };
+
+    /**
+     * 地址解析
+     *
+     * @param {Object} options 接口参数对象
+     * 
+     * 请求参数结构可以参考
+     * http://lbs.qq.com/webservice_v1/guide-geocoder.html
+     */
+    geocoder(options) {
+        var that = this;
+        options = options || {};
+        Utils.polyfillParam(options);
+        if (Utils.checkParamKeyEmpty(options, 'address')) {
+            return;
+        }
+
+        var requestParam = {
+            address: options.address,
+            output: 'json',
+            key: that.key
+        };
+
+        //城市限定
+        if (options.region) {
+          requestParam.region = options.region;
+        }
+
+        wx.request(Utils.buildWxRequestConfig(options, {
+            url: URL_GET_GEOCODER,
+            data: requestParam
+        },'geocoder'));
+    };
+
+
+    /**
+     * 获取城市列表
+     *
+     * @param {Object} options 接口参数对象
+     * 
+     * 请求参数结构可以参考
+     * http://lbs.qq.com/webservice_v1/guide-region.html
+     */
+    getCityList(options) {
+        var that = this;
+        options = options || {};
+        Utils.polyfillParam(options);
+        var requestParam = {
+            output: 'json',
+            key: that.key
+        };
+
+        wx.request(Utils.buildWxRequestConfig(options, {
+            url: URL_CITY_LIST,
+            data: requestParam
+        },'getCityList'));
+    };
+
+    /**
+     * 获取对应城市ID的区县列表
+     *
+     * @param {Object} options 接口参数对象
+     * 
+     * 请求参数结构可以参考
+     * http://lbs.qq.com/webservice_v1/guide-region.html
+     */
+    getDistrictByCityId(options) {
+        var that = this;
+        options = options || {};
+        Utils.polyfillParam(options);
+
+        if (Utils.checkParamKeyEmpty(options, 'id')) {
+            return;
+        }
+
+        var requestParam = {
+            id: options.id || '',
+            output: 'json',
+            key: that.key
+        };
+
+        wx.request(Utils.buildWxRequestConfig(options, {
+            url: URL_AREA_LIST,
+            data: requestParam
+        },'getDistrictByCityId'));
+    };
+
+    /**
+     * 用于单起点到多终点的路线距离(非直线距离)计算:
+     * 支持两种距离计算方式:步行和驾车。
+     * 起点到终点最大限制直线距离10公里。
+     *
+     * 新增直线距离计算。
+     * 
+     * @param {Object} options 接口参数对象
+     * 
+     * 请求参数结构可以参考
+     * http://lbs.qq.com/webservice_v1/guide-distance.html
+     */
+    calculateDistance(options) {
+        var that = this;
+        options = options || {};
+        Utils.polyfillParam(options);
+
+        if (Utils.checkParamKeyEmpty(options, 'to')) {
+            return;
+        }
+
+        var requestParam = {
+            mode: options.mode || 'walking',
+            to: Utils.location2query(options.to),
+            output: 'json',
+            key: that.key
+        };
+
+        if (options.from) {
+          options.location = options.from;
+        }
+
+        //计算直线距离
+        if(requestParam.mode == 'straight'){        
+          var locationsuccess = function (result) {
+            var locationTo = Utils.getEndLocation(requestParam.to);//处理终点坐标
+            var data = {
+              message:"query ok",
+              result:{
+                elements:[]
+              },
+              status:0
+            };
+            for (var i = 0; i < locationTo.length; i++) {
+              data.result.elements.push({//将坐标存入
+                distance: Utils.getDistance(result.latitude, result.longitude, locationTo[i].lat, locationTo[i].lng),
+                duration:0,
+                from:{
+                  lat: result.latitude,
+                  lng:result.longitude
+                },
+                to:{
+                  lat: locationTo[i].lat,
+                  lng: locationTo[i].lng
+                }
+              });            
+            }
+            var calculateResult = data.result.elements;
+            var distanceResult = [];
+            for (var i = 0; i < calculateResult.length; i++) {
+              distanceResult.push(calculateResult[i].distance);
+            }  
+            return options.success(data,{
+              calculateResult: calculateResult,
+              distanceResult: distanceResult
+            });
+          };
+          
+          Utils.locationProcess(options, locationsuccess);
+        } else {
+          var locationsuccess = function (result) {
+            requestParam.from = result.latitude + ',' + result.longitude;
+            wx.request(Utils.buildWxRequestConfig(options, {
+              url: URL_DISTANCE,
+              data: requestParam
+            },'calculateDistance'));
+          };
+
+          Utils.locationProcess(options, locationsuccess);
+        }      
+    }
+};
+
+module.exports = QQMapWX;

Datei-Diff unterdrückt, da er zu groß ist
+ 6 - 0
static/js/weapp.qrcode.min.js


+ 26 - 0
static/kongbai_moban.vue

@@ -0,0 +1,26 @@
+<template>
+	<view class="content">
+		
+	</view>
+</template>
+
+<script>
+	import $api from '@/static/js/api.js'
+	var that = ''
+	export default {
+		data() {
+			return {
+				
+			}
+		},
+		onLoad() {
+			that = this
+		},
+		methods: {
+			
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+</style>

+ 1 - 1
uni.scss

@@ -1,4 +1,4 @@
-@import 'uview-ui/theme.scss';
+@import '@/uni_modules/uview-ui/theme.scss';
 /**
  * 这里是uni-app内置的常用样式变量
  *

+ 0 - 0
uview-ui/LICENSE → uni_modules/uview-ui/LICENSE


+ 66 - 0
uni_modules/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应用到您的产品中。
+

+ 344 - 0
uni_modules/uview-ui/changelog.md

@@ -0,0 +1,344 @@
+## 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
uni_modules/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) {
+				// #ifdef MP-WEIXIN
+				this.setMpData()
+				// #endif
+				return this.$refs.uForm.validateField(value, callback)
+			},
+			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
uni_modules/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>

+ 72 - 0
uni_modules/uview-ui/components/u--input/u--input.vue

@@ -0,0 +1,72 @@
+<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"
+		@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
uni_modules/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>

+ 47 - 0
uni_modules/uview-ui/components/u--textarea/u--textarea.vue

@@ -0,0 +1,47 @@
+<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"
+		@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
uni_modules/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
uni_modules/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
uni_modules/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
uni_modules/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
uni_modules/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
+        }
+    }
+}

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.