From 52d463e03c1f074099ed8e8a6b7c3ddde52d2708 Mon Sep 17 00:00:00 2001
From: quanyawei <401863037@qq.com>
Date: Fri, 27 Oct 2023 14:50:28 +0800
Subject: [PATCH] fix:小程序初版

---
 pages/actionChange/workOrderDetails/index.vue                                          |  176 
 uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js           |    8 
 uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue         |  934 +++++
 uni_modules/uni-icons/package.json                                                     |   86 
 pages/actionChange/components/rectificationInfor.vue                                   |  146 
 uni_modules/uni-scss/styles/setting/_variables.scss                                    |  146 
 uni_modules/uni-icons/components/uni-icons/icons.js                                    | 1169 +++++++
 uni_modules/uni-icons/components/uni-icons/uni-icons.vue                               |   96 
 utils/storage.js                                                                       |   52 
 uni_modules/uni-nav-bar/components/uni-nav-bar/uni-status-bar.vue                      |   24 
 uni_modules/uni-scss/variables.scss                                                    |   62 
 uni_modules/uni-datetime-picker/package.json                                           |   87 
 main.js                                                                                |   44 
 .env.dev.js                                                                            |    4 
 uni_modules/uni-icons/components/uni-icons/uniicons.ttf                                |    0 
 uni_modules/uni-nav-bar/changelog.md                                                   |   51 
 uni_modules/uni-nav-bar/readme.md                                                      |   15 
 uni_modules/uni-scss/styles/setting/_color.scss                                        |   66 
 uni_modules/uni-scss/styles/setting/_space.scss                                        |   56 
 pages.json                                                                             |  147 
 uni_modules/uni-icons/changelog.md                                                     |   22 
 uni_modules/uni-scss/styles/setting/_styles.scss                                       |  167 +
 uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js                 |  403 ++
 uni_modules/uni-scss/readme.md                                                         |    4 
 uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue | 1034 ++++++
 utils/login.js                                                                         |    7 
 pages/actionChange/components/userAvatar.vue                                           |   67 
 uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue            |  928 +++++
 uni_modules/uni-nav-bar/package.json                                                   |   86 
 uni_modules/uni-scss/styles/setting/_text.scss                                         |   24 
 uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json       |   22 
 uni_modules/uni-scss/styles/tools/functions.scss                                       |   19 
 uni_modules/uni-datetime-picker/readme.md                                              |   21 
 uni_modules/uni-datetime-picker/changelog.md                                           |  142 
 App.vue                                                                                |  126 
 pages/actionChange/components/fileUpload.vue                                           |  130 
 pages/actionChange/components/basicInfor.vue                                           |  339 +
 store/index.js                                                                         |   40 
 uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json       |   22 
 uni_modules/uni-icons/readme.md                                                        |    8 
 pages/actionChange/myInfor/index.vue                                                   |   45 
 uni_modules/uni-scss/changelog.md                                                      |    8 
 uni_modules/uni-scss/index.scss                                                        |    1 
 pages/actionChange/components/commonUserTabBar.vue                                     |   41 
 pages/index/index.vue                                                                  |   81 
 pages/actionChange/agencyPage/index.vue                                                |  298 +
 uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue       |  177 +
 pages/login/login.vue                                                                  |   41 
 pages/actionChange/newPage/index.vue                                                   |  597 +--
 pages/actionChange/components/approvalnfor.vue                                         |   97 
 uni_modules/uni-scss/package.json                                                      |   82 
 uni_modules/uni-scss/styles/setting/_border.scss                                       |    3 
 uni_modules/uni-scss/styles/setting/_radius.scss                                       |   55 
 /dev/null                                                                              |  111 
 utils/request.js                                                                       |    8 
 uni_modules/uni-scss/styles/index.scss                                                 |    7 
 uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json            |   22 
 uni_modules/uni-nav-bar/components/uni-nav-bar/uni-nav-bar.vue                         |  357 ++
 uni_modules/uni-icons/components/uni-icons/uniicons.css                                |  663 ++++
 uni_modules/uni-scss/theme.scss                                                        |   31 
 60 files changed, 8,578 insertions(+), 1,127 deletions(-)

diff --git a/.env.dev.js b/.env.dev.js
index ed166ca..8093bf2 100644
--- a/.env.dev.js
+++ b/.env.dev.js
@@ -1,6 +1,6 @@
 const config = {
-	baseUrl: "http://120.26.43.34:8081/api", //������
-	// baseUrl: "http://47.99.64.149:8081/api", //������
+	// baseUrl: "http://120.26.43.34:8081/api/", //������
+	baseUrl: "https://qx.7drlb.com/api", //������
 	// baseUrl: "http://192.168.0.9:8081/api", //������
 };
 module.exports = config;
\ No newline at end of file
diff --git a/App.vue b/App.vue
index dd2c821..2dbd4d1 100644
--- a/App.vue
+++ b/App.vue
@@ -1,46 +1,34 @@
 <script>
-	import Vue from 'vue'
 	import {
-		getUserInfor,
 		getDic
 	} from '@/utils/login.js' // ������������
+	import store from '@/store/index.js'
 	import {
 		httpPost,
 		httpGet
 	} from '@/utils/http.js'
 	export default {
-		onLaunch: function() {
+		onLaunch() {
 			// ������������������
-			this.getUserInfo()
-		},
-		methods: {
-			/**
-			 * ������������
-			 * ���������������������������������������������������������������������
-			 *
-			 */
-			getUserInfo() {
+			let token = uni.getStorageSync('token')
+			console.log('apptoken', token)
+			if (!token) {
 				uni.login({
 					provider: 'weixin',
-					success(res) {
-						if (res.code) {
-							// ������������������������code������������������������
-							httpGet('/AppUser/wx/login', {
-								'code': res.code
-							}).then(result => {
+					success: loginRes => {
+						console.log('loginRes', loginRes)
+						httpGet('/AppUser/wx/login', {
+							'code': loginRes.code
+						}).then(result => {
+							try {
 								if (result.data.code === 0) {
-									// ������������
 									uni.clearStorageSync()
-									uni.setStorageSync('token', result.data.token)
-									// setTimeout(() => {
-									// 	uni.reLaunch({
-									// 		url: '/pages/actionChange/agencyPage/index',
-									// 	})
-									// }, 3000)
-									getUserInfor(result.data.token)
+									uni.setStorageSync('userInfor', JSON.stringify(result.data))
+									uni.setStorageSync('tonken', result.data.token)
 									getDic()
+									this.$isResolve()
 								} else {
-									// ���������������
+									uni.clearStorageSync()
 									uni.setStorageSync('openId', result.data.openId)
 									uni.showModal({
 										title: '���������',
@@ -55,14 +43,62 @@
 											}
 										},
 									})
+									this.$isResolve()
 								}
+							} catch (e) {
+								console.error(e)
+							}
+						}).catch(errors => {
+							console.log('appdddd', errors)
+							uni.showToast({
+								title: errors,
+								icon: 'none',
 							})
-						} else {
-							console.log(res.errMsg)
-						}
+						})
+					}
+				})
+			} else {
+				this.$isResolve()
+			}
+		},
+		methods: {
+			/**
+			 * ������������
+			 * ���������������������������������������������������������������������
+			 *
+			 */
+			getWXCode() {
+				let that = this
+				uni.login({
+					provider: 'weixin',
+					success(res) {
+						that.getLogin(res.code)
 					}
 				})
 			},
+			getLogin(data) {
+				// ������������������������code������������������������
+				httpGet('/AppUser/wx/login', {
+					'code': data
+				}).then(result => {
+					if (result.data.code === 0) {
+						// ������������
+						uni.clearStorage()
+						store.commit('setUserInfor', result.data)
+						store.commit('setTonken', result.data.token)
+						getDic()
+						try {
+							this.$isResolve()
+						} catch (e) {
+							console.error(e)
+						}
+						// getUserInfor(result.data.token)
+					} else {
+						// ���������������
+						// console.log('openId', result.data.openId)
+					}
+				})
+			}
 		},
 	}
 </script>
@@ -76,18 +112,40 @@
 
 	.formItemContent {
 		::v-deep.u-form-item {
-			padding: 8px 0;
+			padding: 5px 0;
 			border-bottom: 1px dashed #bbb;
+		}
+
+		::v-deep.u-form-item__body__left__content__label {
+			font-size: 16px !important;
 		}
 
 		::v-deep.u-form-item__body,
 		/deep/.u-textarea {
 			padding: 0 !important;
 		}
+	}
 
-		::v-deep.u-form-item__body__left__content__label,
-		/deep/.u-radio__text {
-			font-size: 13px !important;
+	.tabarStyle {
+		/deep/.u-tabbar-item__text {
+			font-size: 18px !important;
+		}
+
+		/deep/.u-tabbar__content__item-wrapper {
+			height: 60px !important;
+		}
+
+		/deep/.u-icon__icon {
+			font-size: 25px !important;
+		}
+	}
+
+	.dataRangeSerch {
+
+		/deep/.range-separator,
+		/deep/.uni-date__x-input {
+			height: 30px !important;
+			line-height: 30px !important;
 		}
 	}
 </style>
\ No newline at end of file
diff --git a/main.js b/main.js
index 3892abb..5470a1f 100644
--- a/main.js
+++ b/main.js
@@ -1,25 +1,27 @@
-import Vue from "vue";
-import App from "./App";
-import * as http from "./utils/http"; // http������������
-import * as login from "./utils/login"; // ������
-import * as utils from "./utils/utils"; // ������������
+import Vue from 'vue'
+import App from './App'
+import * as http from './utils/http' // http������������
+import * as login from './utils/login' // ������
+import * as utils from './utils/utils' // ������������
 // import * as common from './utils/common' // ������������
-import store from "./store";
-import storage from "./utils/storage"; // ������������
-import ".env.js";
+import store from './store/index.js'
+import storage from './utils/storage' // ������������
+import '.env.js'
 // ������������
-Vue.prototype.$store = store;
-Vue.prototype.$storage = storage;
-Vue.prototype.$http = http;
-Vue.prototype.$login = login;
-Vue.prototype.$utils = utils;
+Vue.prototype.$store = store
+Vue.prototype.$storage = storage
+Vue.prototype.$http = http
+Vue.prototype.$login = login
+Vue.prototype.$utils = utils
 // Vue.prototype.$common = common
-
-App.mpType = "app";
+App.mpType = 'app'
 const app = new Vue({
-  store,
-  ...App,
-});
-app.$mount();
-import uView from "@/uni_modules/uview-ui";
-Vue.use(uView);
+    store,
+    ...App,
+})
+Vue.prototype.$onLaunched = new Promise(resolve => {
+    Vue.prototype.$isResolve = resolve
+})
+app.$mount()
+import uView from '@/uni_modules/uview-ui'
+Vue.use(uView)
\ No newline at end of file
diff --git a/pages.json b/pages.json
index f0efe61..0122ed8 100644
--- a/pages.json
+++ b/pages.json
@@ -1,70 +1,81 @@
 {
-  "pages": [
-    //pages���������������������������������������������������https://uniapp.dcloud.io/collocation/pages
-  
-    {
-      "path": "pages/actionChange/agencyPage/index",
-      "style": {
-        "navigationBarTitleText": "������",
-        "enablePullDownRefresh": false
-      }
-    },
-	{
-	  "path": "pages/login/login"
-	},
-    {
-      "path": "pages/login/register/register",
-      "style": {
-        "navigationBarTitleText": "������",
-        "enablePullDownRefresh": false
-      }
-    },
-    {
-      "path": "pages/actionChange/newPage/index", //���������������������������
-      "style": {
-        "navigationBarTitleText": "���������������",
-        "enablePullDownRefresh": false,
-		"navigationBarHidden":true
-      }
-    },
-    {
-      "path": "pages/actionChange/workOrderDetails/index", //���������������������������
-      "style": {
-        "navigationBarTitleText": "���������������",
-        "enablePullDownRefresh": false
-      }
-    },
-    {
-      "path": "pages/actionChange/myInfor/index",
-      "style": {
-        "navigationBarTitleText": "������",
-        "enablePullDownRefresh": false
-      }
-    }
-  ],
-  "tabBar": {
-    "color": "#515151",
-    "selectedColor": "#3875C5",
-    "list": [
+	"pages": [
+		//pages���������������������������������������������������https://uniapp.dcloud.io/collocation/pages
 		{
-		  "text": "������",
-		  "pagePath": "pages/actionChange/agencyPage/index",
-		  "iconPath": "static/img/shouye.png",
-		  "selectedIconPath": "static/img/shouyeClick.png"
-		},
-      {
-        "text": "���������������",
-        "pagePath": "pages/actionChange/newPage/index",
-        "iconPath": "static/img/xinjian.png",
-        "selectedIconPath": "static/img/xinjianClick.png"
-      },
-	  
-      {
-        "text": "������",
-        "iconPath": "static/img/wode-.png",
-        "selectedIconPath": "static/img/wodeClick.png",
-        "pagePath": "pages/actionChange/myInfor/index"
-      }
-    ]
-  }
-}
+			"path": "pages/index/index",
+			"style": {
+				"navigationBarTitleText": "������",
+				"enablePullDownRefresh": false,
+				"disableSwipeBack": true,
+				"navigationStyle": "custom"
+			}
+		}, {
+			"path": "pages/actionChange/agencyPage/index",
+			"style": {
+				"navigationBarTitleText": "������",
+				"navigationStyle": "custom",
+				"enablePullDownRefresh": false
+			}
+		}, {
+			"path": "pages/login/login"
+		}, {
+			"path": "pages/login/register/register",
+			"style": {
+				"navigationBarTitleText": "������",
+				"enablePullDownRefresh": false
+			}
+		}, {
+			"path": "pages/actionChange/newPage/index", //���������������������������
+			"style": {
+				"navigationBarTitleText": "���������������",
+				"enablePullDownRefresh": false
+			}
+		}, {
+			"path": "pages/actionChange/workOrderDetails/index", //���������������������������
+			"style": {
+				"navigationBarTitleText": "���������������",
+				"enablePullDownRefresh": false
+			}
+		}, {
+			"path": "pages/actionChange/myInfor/index",
+			"style": {
+				"navigationBarTitleText": "������",
+				"enablePullDownRefresh": false,
+				"disableSwipeBack": true,
+				"navigationStyle": "custom"
+			}
+		}
+	]
+	// "tabBar": {
+	// 	"color": "#515151",
+	// 	"height": "60px",
+	// 	"fontSize": "60px",
+	// 	"selectedFontSize": 20,
+	// 	"selectedColor": "#3875C5",
+	// 	"list": [{
+	// 		"text": "������",
+	// 		"pagePath": "pages/actionChange/agencyPage/index",
+	// 		"iconPath": "static/img/shouye.png",
+	// 		"selectedIconPath": "static/img/shouyeClick.png",
+	// 		"textStyle": {
+	// 			"fontSize": "60px"
+	// 		}
+	// 	}, {
+	// 		"text": "���������������",
+	// 		"pagePath": "pages/actionChange/newPage/index",
+	// 		"iconPath": "static/img/xinjian.png",
+	// 		"selectedIconPath": "static/img/xinjianClick.png",
+	// 		"textStyle": {
+	// 			"fontSize": "20px"
+	// 		}
+	// 	}, {
+	// 		"text": "������",
+	// 		"iconPath": "static/img/wode-.png",
+	// 		"selectedIconPath": "static/img/wodeClick.png",
+	// 		"pagePath": "pages/actionChange/myInfor/index",
+	// 		"textStyle": {
+	// 			"fontSize": "20px"
+	// 		}
+	// 	}]
+	// }
+}
\ No newline at end of file
diff --git a/pages/actionChange/agencyPage/index.vue b/pages/actionChange/agencyPage/index.vue
index 5c535ca..563f912 100644
--- a/pages/actionChange/agencyPage/index.vue
+++ b/pages/actionChange/agencyPage/index.vue
@@ -3,23 +3,35 @@
 		<view class="hearderInfor">
 			<view>
 				<p class="unit">
-					<text>���������������{{ userInfor.userName ||''}}</text>
+					<text>���������������{{ unitName }}</text>
 				</p>
 			</view>
 			<view class="headSculpture">
-				<image alt="" src="/static/img/headSculpture.png" />
-				<text>������������{{ userInfor.userName || ''}}</text>
+				<button open-type="chooseAvatar" @chooseavatar='onChooseAvatar'
+					style="padding: 0;margin: 0;border-radius: 100px;">
+					<u-avatar :src="avatarUrl" randomBgColor size='60'></u-avatar>
+				</button>
+				<text style="margin-left: 46.15rpx;">������������{{ userName || ''}}</text>
 			</view>
 		</view>
 		<view>
-			<u-tabs :list="list" :scrollable="scrollable" @change="changeTap" />
+			<u-tabs :list="list" :scrollable="scrollable" lineWidth="60" @change="changeTap" />
 		</view>
-		<view class="" v-if="userInfor.userName">
+		<view class="" v-if="userName">
+			<view class="dataRangeSerch" v-if="current===3">
+				<view class="dataRangeSerchLabel">
+					<text style="margin-right: 8px;">������:</text>
+					<uni-datetime-picker v-model="range" type="daterange" rangeSeparator="���" />
+				</view>
+				<view>
+					<u-button type="primary" size="small" text="������" @click="getWorkOrder"></u-button>
+				</view>
+			</view>
 			<view :key="index" v-for="(item, index) in workOderList" class="workOrderDetail"
 				@tap="handleClick(item, 'edit')">
 				<view class="mainContent">
 					<p class="rowTip" style="justify-content: space-between">
-						<text class=""> ������������: {{ item.allocationNum }}
+						<text class=" titleLable"> ������������: {{ item.allocationNum }}
 						</text>
 						<text class="rowTipContenet_right">
 							<text catchtap class="butsName" @tap.stop="handleClick(item, 'view')"> ������ </text>
@@ -69,9 +81,14 @@
 						<view class="rowTipContenet">
 							<view class="wholeLine">
 								<text class="rowTipContenetLabel">������������:</text>
-								<text class="rowTipContenetAll">
-									{{ stateFormatter(item.state) }}
-								</text>
+								<u--text type="warning" :text="item.state |stateFormatter" size='30.77rpx'
+									v-if="item.state===20 ||item.state===9"></u--text>
+								<u--text type="primary" :text="item.state |stateFormatter" size='30.77rpx'
+									v-if="item.state===30"></u--text>
+								<u--text type="success" :text="item.state |stateFormatter" size='30.77rpx'
+									v-if="item.state===40"></u--text>
+								<u--text type="error" :text="item.state |stateFormatter" size='30.77rpx'
+									v-if="item.state===50"></u--text>
 							</view>
 						</view>
 					</p>
@@ -108,7 +125,12 @@
 						</view>
 					</p>
 				</view>
+				<view class="yingzhang" v-if="item.isInvalid===1">
+					<view class="seal-red"> ��������� </view>
+				</view>
 			</view>
+			<u-loadmore :status="status" :loading-text="loadingText" @loadmore='getLoadmore'
+				:loadmore-text="loadmoreText" dashed line :nomore-text="nomoreText" />
 		</view>
 	</view>
 </template>
@@ -117,11 +139,13 @@
 		httpPost,
 		httpGet
 	} from '@/utils/http.js'
+	import store from '@/store/index.js'
 	export default {
 		data() {
 			return {
+				range: [],
 				scrollable: false,
-				userInfor: {},
+				userInfor: null,
 				dictObj: [],
 				list: [{
 					name: '������',
@@ -136,54 +160,188 @@
 					name: '���������',
 					value: 3,
 				}, ],
+				showeEscalationTime: false,
 				current: 0,
+				startTime: '',
+				endTime: '',
 				workOderList: [],
 				unitList: [],
 				polluteList: [],
+				avatarUrl: '',
+				baseUrl: '',
+				token: '',
+				status: 'loadmore',
+				loadingText: '���������������',
+				loadmoreText: '������������',
+				nomoreText: '���������������',
+				isLoading: false,
+				page: {
+					currentPage: 1,
+					pageSize: 10
+				}
 			}
 		},
-		mounted() {
-			console.log('mounted this.userInfo', this.userInfo)
+		watch: {
+			range(newval) {
+				console.log('newval', newval)
+				this.startTime = newval[0]
+				this.endTime = newval[1]
+			},
 		},
-		created() {
-			console.log('created this.userInfo', this.userInfo)
-			this.getContaminateList()
-			this.getUnitList()
-			this.getWorkOrder()
+		computed: {
+			unitName() {
+				let data = ''
+				if (this.userInfor && this.unitList.length > 0) {
+					data = this.unitList && this.unitList.find(a => Number(a.unitId) === Number(this.userInfor.unitId))
+				}
+				if (this.userInfor) {
+					data = this.userInfor.unName
+				}
+				return data
+			},
+			userName() {
+				let data = ''
+				if (this.userInfor) {
+					data = this.userInfor.userName
+				}
+				return data
+			}
 		},
-		onShow() {
-			uni.showTabBar()
+		onReachBottom() {
+			//������������������������������������������
+			if (this.isLoading) {
+				this.status = 'loading'
+				//������������������,���������++
+				this.page.currentPage = ++this.page.currentPage
+				//������������,������������tab������������
+				this.getWorkOrder()
+			}
 		},
+		mounted() {},
+		filters: {
+			stateFormatter(val) {
+				let information = JSON.parse(uni.getStorageSync('dictObj') || '[]')
+				return information.allocationApproveEnum[val]
+			}
+		},
+		onLoad: () => {},
 		methods: {
+			getLoadmore() {
+				if (this.isLoading) {
+					this.status = 'loading'
+					//������������������,���������++
+					this.page.currentPage = ++this.page.currentPage
+					//������������,������������tab������������
+					this.getWorkOrder()
+				}
+			},
+			async onChooseAvatar(e) {
+				const {
+					avatarUrl
+				} = e.detail // ������������������������������������������������������������������������
+				this.avatarUrl = avatarUrl
+				uni.showToast({
+					title: '������',
+					duration: 1000
+				})
+				let a = uni.uploadFile({
+					url: this.baseUrl + '/file/upload',
+					filePath: this.avatarUrl,
+					header: {
+						token: this.token,
+						Authorization: this.token,
+					},
+					name: 'file',
+					formData: {
+						sysCode: '1202401'
+					},
+					success: res => {
+						let resData = JSON.parse(res.data)
+						let parms = {
+							'file': resData.data,
+							'userId': this.userInfor.userId
+						}
+						this.$http.httpPost('/allocationApp/appFile', parms).then(res => {
+							uni.removeStorageSync('userInfor')
+							this.userInfor.file = resData.data
+							console.log('resData.data', resData.data)
+							uni.setStorageSync('userInfor', JSON.stringify(this.userInfor))
+							console.log('this.userInforSet', this.userInfor)
+						})
+						console.log(this.url)
+					},
+					fail: res => {
+						uni.showToast({
+							title: res.data,
+							icon: 'none',
+						})
+					}
+				})
+			},
 			changeTap(data) {
+				console.log(data)
 				this.current = data.value
+				this.page = {
+					currentPage: 1,
+					pageSize: 10
+				}
+				this.startTime = ''
+				this.endTime = ''
 				this.getWorkOrder()
 			},
 			// ������������������list
 			getUnitList() {
 				this.$http.httpGet('/allocation/unit').then(res => {
 					this.unitList = res.data
-					this.userInfor = this.$storage.getJson('userInfo')
-					this.dictObj = this.$storage.getJson('dictObj')
-					this.$storage.setJson('unitList', this.unitList)
 				})
 			},
 			getContaminateList() {
+				console.log('indexindex')
 				this.$http.httpGet('/allocation/contaminate').then(res => {
 					this.polluteList = res.data
-					this.$storage.setJson('polluteList', this.polluteList)
+					this.dictObj = JSON.parse(uni.getStorageSync('dictObj') || '[]')
+					this.userInfor = JSON.parse(uni.getStorageSync('userInfor') || '{}')
+					this.baseUrl = this.$storage.get('baseUrl')
+					this.token = uni.getStorageSync('tonken')
+					this.avatarUrl = `${this.baseUrl}/file/preview/${this.userInfor.file.fileId}`
+					console.log('indexindexindexindexthis.userInfor', this.userInfor)
+					this.getUnitList()
+					this.getWorkOrder()
+				}).catch(res => {
+					console.log('���������', res)
+					// this.getContaminateList()
 				})
 			},
-			stateFormatter(val) {
-				return this.dictObj.allocationApproveEnum[val]
-			},
 			getWorkOrder() {
-				httpGet('/allocationApp/select', {
+				httpPost('/allocationApp/page', {
 					state: this.current,
-					startTime: '',
-					endTime: '',
+					startTime: this.startTime,
+					endTime: this.endTime,
+					page: {
+						'currentPage': this.page.currentPage,
+						'pageSize': this.page.pageSize
+					},
 				}).then(res => {
-					this.workOderList = res.data
+					console.log('indexindex', res.data.list)
+					if (res.data.list) {
+						if (res.data.list.length < this.page.pageSize) {
+							//���������������false������������������������,������������������������������������������
+							this.isLoading = false
+							this.status = 'nomore'
+						} else {
+							this.isLoading = true
+							this.status = 'loadmore'
+						}
+						if (this.page.currentPage === res.data.page.currentPage) {
+							this.workOderList = res.data.list
+						} else {
+							res.data.list.forEach(el => {
+								this.workOderList.push(el)
+							})
+						}
+					} else {
+						this.status = 'nomore'
+					}
 				})
 			},
 			handleClick(e, pageState) {
@@ -191,7 +349,7 @@
 					id: e.allocationId
 				}).then(res => {
 					let data = res.data
-					data.pageState = pageState
+					data.pageState = data.state === 50 || data.state === 40 ? 'view' : pageState
 					let myData = JSON.stringify(data)
 					uni.navigateTo({
 						url: '/pages/actionChange/workOrderDetails/index?infor=' + myData,
@@ -208,9 +366,9 @@
 	}
 
 	.hearderInfor {
-		font-size: 26.92rpx;
-		height: 223.08rpx;
+		font-size: 28.85rpx;
 		background-color: #3875c5;
+		padding-bottom: 8px;
 		color: #f2f2f2;
 
 		.unit {
@@ -222,8 +380,9 @@
 		.headSculpture {
 			display: flex;
 			align-items: center;
+			padding-left: 20px;
 
-			image {
+			.imageSrc {
 				height: 117.31rpx;
 				width: 117.31rpx;
 				margin: 0rpx 46.15rpx;
@@ -234,25 +393,23 @@
 	.textContent {
 		text-align: left;
 		width: 100%;
-		font-size: 28.85rpx;
+		font-size: 30.77rpx;
 	}
 
 	.workOrderDetail {
 		border: 1px solid #bbb;
 		border-radius: 5px;
-		min-height: 288.46rpx;
-		margin: 19.23rpx;
-		padding: 19.23rpx;
+		margin: 9.62rpx;
+		padding: 9.62rpx 19.23rpx;
 		color: #101010;
-		font-weight: 700;
-		font-size: 26.92rpx;
+		font-size: 30.77rpx;
 
 		/deep/.u-line {
-			margin: 19.23rpx 0px !important;
+			margin: 9.62rpx 0px !important;
 		}
 
 		.mainContent {
-			margin-bottom: 10px;
+			margin-bottom: 5px;
 
 			.rowTip {
 				display: flex;
@@ -283,9 +440,66 @@
 				color: #1990ff;
 			}
 
+			.titleLable {
+				font-size: 30.77rpx;
+				font-weight: bold;
+			}
+
 			.rowTipContenet_right {
 				text-align: right !important;
 			}
 		}
 	}
+
+	/deep/.u-tabs__wrapper__nav__item__text {
+		font-size: 34.62rpx !important;
+	}
+
+	.yingzhang {
+		position: relative;
+
+		.seal-red {
+			position: absolute;
+			right: 0;
+			top: -85px;
+			display: inline-block;
+			border: solid 2px #e93e00;
+			border-radius: .2em;
+			color: #e24c06;
+			font-size: 19px;
+			line-height: 1;
+			opacity: 0;
+			padding: .1em .5em;
+			text-transform: uppercase;
+			opacity: 0;
+			transform: rotate(-2deg) scale(5);
+			animation: seal .3s cubic-bezier(0.6, 0.04, 0.98, 0.335) forwards;
+		}
+
+		@keyframes seal {
+			100% {
+				opacity: .75;
+				transform: rotate(-15deg) scale(1);
+			}
+		}
+	}
+
+	.dataRangeSerch {
+		display: flex;
+		justify-content: space-around;
+		align-items: center;
+		padding: 10px 0 5px 0px;
+
+		.dataRangeSerchLabel {
+			display: flex;
+			align-items: center;
+			width: 75%;
+		}
+
+		/deep/.range-separator,
+		/deep/.uni-date__x-inpu {
+			height: 30px !important;
+			line-height: 30px !important;
+		}
+	}
 </style>
\ No newline at end of file
diff --git a/pages/actionChange/components/approvalnfor.vue b/pages/actionChange/components/approvalnfor.vue
index 98bc05c..ad8ce63 100644
--- a/pages/actionChange/components/approvalnfor.vue
+++ b/pages/actionChange/components/approvalnfor.vue
@@ -8,33 +8,36 @@
 			<u-line color="#bbb" />
 			<view>
 				<view class="mainContent">
-					
-					<u--form labelPosition="left" label-width="70" :model="form" :border-bottom="false" :rules="rules"
+					<u--form labelPosition="left" label-width="80" :model="form" :border-bottom="false" :rules="rules"
 						ref="uForm">
 						<view class="formItemContent">
-							<u-form-item border-bottom label="������������:" prop="checkScore" required :border-bottom="false">
-								<view class="" v-if="basicInfor.pageState==='view'">
+							<u-form-item border-bottom label="������������:" prop="checkScore"
+								:required="basicInfor.pageState==='edit'" :border-bottom="false">
+								<view class="fonttest" v-if="basicInfor.pageState==='view'">
 									{{ basicInfor.checkScore ||''}}
 								</view>
-								<u-input v-else v-model="form.checkScore" border="none" placeholder="���������" type="text" />
+								<u-input v-else v-model="form.checkScore" border="none" placeholder="���������"
+									type="number" />
 							</u-form-item>
 						</view>
 						<view class="formItemContent">
-							<u-form-item border-bottom label="������:" prop="checkDescribe" required :border-bottom="false">
-								<view class="" v-if="basicInfor.pageState==='view'">
+							<u-form-item border-bottom label="������:" prop="checkDescribe"
+								:required="basicInfor.pageState==='edit'" :border-bottom="false">
+								<view class="fonttest" v-if="basicInfor.pageState==='view'">
 									{{ basicInfor.checkDescribe ||''}}
 								</view>
 								<u--textarea v-else v-model="form.checkDescribe" border="none" placeholder="���������������" />
 							</u-form-item>
 						</view>
 						<view class="formItemContent">
-							<u-form-item border-bottom label="������������" :border-bottom="false">
+							<u-form-item border-bottom label="������������:" :border-bottom="false">
 								<view class="fileBox" v-if="basicInfor.pageState==='view'">
 									<cl-upload v-model="fileList" :add="false" :action="`''`" cloud-type="other"
 										:remove="false" />
 								</view>
 								<view class="fileBox" v-else>
-									<fileUpload class="rowTipContenetAll" :sys-code="sysCode" @handleFile="handleFile" />
+									<fileUpload class="rowTipContenetAll" :sys-code="sysCode"
+										@handleFile="handleFile" />
 								</view>
 							</u-form-item>
 						</view>
@@ -68,7 +71,7 @@
 					checkScore: 0,
 					checkDescribe: '',
 				},
-				dictObj: this.$storage.getJson('dictObj'),
+				dictObj: JSON.parse(uni.getStorageSync('dictObj') || '[]'),
 				fileList: [],
 				fileBaseList: [],
 				baseUrl: this.$storage.get('baseUrl'),
@@ -104,7 +107,6 @@
 				console.log('this.fileList', this.basicInfor.fileBaseList)
 				console.log('this.fileList', this.fileList)
 			}
-
 		},
 		methods: {
 			handleFile(data) {
@@ -113,26 +115,21 @@
 			},
 			formVali() {
 				return new Promise((resolve, reject) => {
-					if(this.basicInfor.pageState!=='view'){
+					if (this.basicInfor.pageState !== 'view') {
 						this.$refs.uForm.validate().then(res => {
-								resolve(true)
-							})
-							.catch(errors => {
-								reject(false)
-								uni.$u.toast('������������')
-							})
-					} else{
+							resolve(true)
+						}).catch(errors => {
+							reject(false)
+							uni.$u.toast('������������')
+						})
+					} else {
 						resolve(true)
 					}
-				
-				});
-
+				})
 			}
-
 		},
 	}
 </script>
-
 <style scoped lang="scss">
 	/deep/.u-line {
 		margin: 19.23rpx 0px !important;
@@ -141,17 +138,16 @@
 	.workOrderDetail {
 		border: 1px solid #bbb;
 		border-radius: 5px;
-		min-height: 288.46rpx;
 		margin: 19.23rpx;
 		padding: 19.23rpx;
 		color: #101010;
 		font-weight: 700;
-		font-size: 26.92rpx;
+		font-size: 30.77rpx;
 
 		.headerCont {
 			display: flex;
 			justify-content: space-between;
-			font-size: 15px;
+			font-size: 30.77rpx;
 		}
 
 		.mainContent {
@@ -159,21 +155,25 @@
 			font-weight: 500;
 
 			.rowTip {
-				// display: flex;
-				padding: 8px 0;
+				display: flex;
+				padding: 5px 0;
 				border-bottom: 1px dashed #bbb;
 
 				.wholeLine {
 					display: flex;
+					width: 100%;
 					align-items: center;
 
 					.rowTipContenetLabel {
-						min-width: 125rpx;
+						min-width: 144.23rpx;
+						font-size: 28.85rpx;
+						text-align: left;
 					}
-				}
 
-				.rowTipContenetAll {
-					width: calc(100% - 125rpx; );
+					.rowTipContenetAll {
+						font-size: 28.85rpx;
+						width: calc(100% - 144.23rpx);
+					}
 				}
 
 				.rowTipContenet {
@@ -195,36 +195,5 @@
 				text-align: right !important;
 			}
 		}
-	}
-
-	/deep/.u-form-item {
-		padding: 8px 0;
-		border-bottom: 1px dashed #bbb;
-	}
-
-	/deep/.u-form-item__body,
-	/deep/.u-textarea {
-		padding: 0 !important;
-	}
-
-	/deep/.u-form-item__body__left__content__label,
-	/deep/.u-radio__text {
-		font-size: 13px !important;
-	}
-
-	.fileBox {
-		display: -webkit-box;
-		display: -webkit-flex;
-		display: flex;
-		position: relative;
-		width: 100%;
-		height: 100%;
-		-webkit-box-orient: vertical;
-		-webkit-box-direction: normal;
-		-webkit-flex-direction: column;
-		flex-direction: column;
-		-webkit-box-pack: center;
-		-webkit-justify-content: center;
-		justify-content: center;
 	}
 </style>
\ No newline at end of file
diff --git a/pages/actionChange/components/basicInfor.vue b/pages/actionChange/components/basicInfor.vue
index f7e26bb..47de5eb 100644
--- a/pages/actionChange/components/basicInfor.vue
+++ b/pages/actionChange/components/basicInfor.vue
@@ -12,6 +12,22 @@
 					<p class="rowTip">
 						<view class="rowTipContenet">
 							<view class="wholeLine">
+								<text class="rowTipContenetLabel">������������:</text>
+								<text class="rowTipContenetAll">
+									{{ basicInfor.escalationTime ||'' }}
+								</text>
+							</view>
+						</view>
+						<view class="rowTipContenet">
+							<view class="wholeLine">
+								<text class="rowTipContenetLabel">���������:</text>
+								<text class="rowTipContenetAll">{{ basicInfor.escalationName ||'' }}</text>
+							</view>
+						</view>
+					</p>
+					<p class="rowTip">
+						<view class="rowTipContenet">
+							<view class="wholeLine">
 								<text class="rowTipContenetLabel">������������:</text>
 								<text class="rowTipContenetAll">
 									{{ unitName }}
@@ -41,7 +57,8 @@
 							<view class="wholeLine">
 								<text class="rowTipContenetLabel">������������:</text>
 								<text class="rowTipContenetAll">
-									{{ dictObj.changeEnum[basicInfor.changeType] ||'' }}
+									<text>{{ dictObj.changeEnum[basicInfor.changeType]||'' }}</text>
+									<!-- <text>{{ basicInfor.residueDay||'' }}</text> -->
 								</text>
 							</view>
 						</view>
@@ -55,18 +72,6 @@
 								</text>
 							</view>
 						</view>
-						<view class="rowTipContenet">
-							<view class="wholeLine">
-								<text class="rowTipContenetLabel">���������:</text>
-								<text class="rowTipContenetAll">{{ basicInfor.escalationName ||'' }}</text>
-							</view>
-						</view>
-					</p>
-					<p class="rowTip">
-						<view class="wholeLine">
-							<text class="rowTipContenetLabel">������������:</text>
-							<text class="rowTipContenetAll">{{ basicInfor.escalationTime ||'' }}</text>
-						</view>
 					</p>
 					<p class="rowTip">
 						<view class="wholeLine">
@@ -74,161 +79,173 @@
 							<text class="rowTipContenetAll">{{ basicInfor.pollutePosition ||'' }}</text>
 						</view>
 					</p>
-					<p class="rowTip">
-						<view class="wholeLine">
-							<text class="rowTipContenetLabel">������������:</text>
-							<text v-if="fileList.length>0" class="rowTipContenetAll">
-								<cl-upload
-									v-model="fileList"
-									:action="`''`"
-									:add="false"
-									cloud-type="other"
-									:remove="false"
-								/>
-							</text>
-						</view>
-					</p>
+					<view class="formItemContent">
+						<u--form labelPosition="left" label-width="75" :border-bottom="false" ref="uForm">
+							<u-form-item border-bottom label="������������:" :border-bottom="false">
+								<view class="fileBox">
+									<cl-upload v-model="fileList" :add="false" :action="`''`" cloud-type="other"
+										:remove="false" />
+								</view>
+							</u-form-item>
+						</u--form>
+					</view>
 				</view>
 			</view>
 		</view>
 	</view>
 </template>
 <script>
-export default {
-	props: {
-	 basicInfor: {
-	  type: Object,
-	  default: ()=> {}
-		},
-	},
-	data() {
-		return {
-			polluteList: this.$storage.getJson('polluteList'),
-			unitList: this.$storage.getJson('unitList'),
-			dictObj: this.$storage.getJson('dictObj'),
-			fileList: [],
-			baseUrl: this.$storage.get('baseUrl'),
-		}
-	},
-	computed: {
-		unitName(){
-			let data ={}
-			if(this.basicInfor.unitId){
-				data=this.unitList&& this.unitList.find(
-					(a)=> parseInt(a.unitId) === this.basicInfor.unitId
-				)
-				console.log('nnnnnn', this.unitList)
-				console.log('nnnnnn', this.basicInfor.unitId)
-
-			}
-			return data.unitName || ''
-		},
-		escalationUnitName(){
-			let data ={}
-			if(this.basicInfor.unitId){
-				data=this.unitList&& this.unitList.find(
-					(a)=> parseInt(a.unitId) === this.basicInfor.escalationUnitId
-				)
-				console.log('nnnnnn', this.unitList)
-				console.log('nnnnnn', this.basicInfor.unitId)
-
-			}
-			return data.unitName || ''
-
-		},
-		polluteType(){
-			let data ={}
-			if(this.basicInfor.polluteType){
-				data=this.polluteList.find(
-					(a)=> parseInt(a.dataKey) === this.basicInfor.polluteType
-				)
-			}
-			return data.dataValue ||''
-		}
-	},
-	watch: {
-		basicInfor: {
-			handler: function(newValue, oldValue) {
-				// ������������������
-				this.basicInfor=newValue
+	export default {
+		props: {
+			basicInfor: {
+				type: Object,
+				default: () => {}
 			},
-			deep: true
-		}
-	},
-	onLoad: function (option) {
-		//option���object������������������������������������������������
-		console.log(option) //���������������������������������������
-	},
-	mounted() {
-		if(this.basicInfor.fileBaseList&&this.basicInfor.fileBaseList.length>0){
-			this.basicInfor.fileBaseList.forEach(item=> {
-				this.baseUrl='http://120.26.43.34:8081/api/'
-				let name = item.fileType === 1 ? 'name.png' : ''
-				this.fileList.push(`${this.baseUrl}/file/preview/${item.fileId}?${name}`) // ������
-				this.fileList.push('http://120.26.43.34:8081/api//file/preview/145?name.png') // ������
-			})
-			console.log('this.fileList', this.basicInfor.fileBaseList)
-			console.log('this.fileList', this.fileList)
-		}
-
-	},
-	methods: {},
-}
+		},
+		data() {
+			return {
+				polluteList: [],
+				unitList: [],
+				dictObj: JSON.parse(uni.getStorageSync('dictObj') || '[]'),
+				fileList: [],
+				baseUrl: this.$storage.get('baseUrl'),
+			}
+		},
+		computed: {
+			unitName() {
+				let data = ''
+				if (this.basicInfor.unitId && this.unitList.length > 0) {
+					data = this.unitList && this.unitList.find(a => Number(a.unitId) === Number(this.basicInfor.unitId))
+						.unitName
+				}
+				return data
+			},
+			escalationUnitName() {
+				let data = ''
+				if (this.basicInfor.unitId && this.unitList.length > 0) {
+					data = this.unitList && this.unitList.find(a => Number(a.unitId) === Number(this.basicInfor
+						.escalationUnitId)).unitName
+				}
+				return data
+			},
+			polluteType() {
+				let data = ''
+				console.log('this.polluteList', this.polluteList)
+				console.log('this.basicInfor.polluteType', this.basicInfor.polluteType)
+				if (String(this.basicInfor.polluteType) && this.polluteList.length > 0) {
+					data = this.polluteList.find(a => Number(a.dataKey) === Number(this.basicInfor.polluteType)).dataValue
+				}
+				console.log('data', data)
+				return data
+			}
+		},
+		watch: {
+			basicInfor: {
+				handler: function(newValue, oldValue) {
+					// ������������������
+					this.basicInfor = newValue
+				},
+				deep: true
+			}
+		},
+		onLoad: function(option) {
+			//option���object������������������������������������������������
+			console.log(option) //���������������������������������������
+		},
+		created() {
+			this.getUnitList()
+		},
+		mounted() {
+			// ������������������list
+			if (this.basicInfor.fileBaseList && this.basicInfor.fileBaseList.length > 0) {
+				this.basicInfor.fileBaseList.forEach(item => {
+					let name = item.fileType === 1 ? 'name.png' : ''
+					this.fileList.push(`${this.baseUrl}/file/preview/${item.fileId}?${name}`) // ������
+				})
+				console.log('this.basicInfor.fileList', this.basicInfor.fileBaseList)
+				console.log('this.fileList', this.fileList)
+			}
+		},
+		methods: {
+			getUnitList() {
+				this.$http.httpGet('/allocation/unit').then(res => {
+					this.unitList = res.data
+					this.getContaminateList()
+				})
+			},
+			getContaminateList() {
+				this.$http.httpGet('/allocation/contaminate').then(res => {
+					this.polluteList = res.data
+				})
+			},
+		},
+	}
 </script>
-
 <style scoped lang="scss">
-/deep/.u-line {
-  margin: 19.23rpx 0px !important;
-}
-.workOrderDetail {
-  border: 1px solid #bbb;
-  border-radius: 5px;
-  min-height: 288.46rpx;
-  margin: 19.23rpx;
-  padding: 19.23rpx;
-  color: #101010;
-  font-weight: 700;
-  font-size: 26.92rpx;
-  .headerCont {
-    display: flex;
-    justify-content: space-between;
-    font-size: 15px;
-  }
-  .mainContent {
-    margin-bottom: 10px;
-    font-weight: 500;
-    .rowTip {
-      display: flex;
-      padding: 8px 0;
-      border-bottom: 1px dashed #bbb;
-      .wholeLine {
-        display: flex;
-		width: 100%;
-        align-items: center;
-        .rowTipContenetLabel {
-          min-width: 125rpx;
-        }
-		.rowTipContenetAll{
-			width: calc(100% - 125rpx);
-		}
-      }
+	/deep/.u-line {
+		margin: 19.23rpx 0px !important;
+	}
 
-      .rowTipContenet {
-        width: 50%;
-        text-align: left;
-        overflow: hidden;
-        text-overflow: ellipsis;
-        white-space: nowrap;
-        .butsName {
-          display: inline-block;
-          margin-left: 19.23rpx;
-          color: #1990ff;
-        }
-      }
-    }
-    .rowTipContenet_right {
-      text-align: right !important;
-    }
-  }
-}
-</style>
+	.workOrderDetail {
+		border: 1px solid #bbb;
+		border-radius: 5px;
+		min-height: 288.46rpx;
+		margin: 19.23rpx;
+		padding: 19.23rpx;
+		color: #101010;
+		font-weight: 700;
+		font-size: 30.77rpx;
+
+		.headerCont {
+			display: flex;
+			justify-content: space-between;
+			font-size: 30.77rpx;
+		}
+
+		.mainContent {
+			margin-bottom: 10px;
+			font-weight: 500;
+
+			.rowTip {
+				display: flex;
+				padding: 5px 0;
+				border-bottom: 1px dashed #bbb;
+
+				.wholeLine {
+					display: flex;
+					width: 100%;
+					align-items: center;
+
+					.rowTipContenetLabel {
+						min-width: 144.23rpx;
+						font-size: 28.85rpx;
+						text-align: left;
+					}
+
+					.rowTipContenetAll {
+						font-size: 28.85rpx;
+						width: calc(100% - 144.23rpx);
+					}
+				}
+
+				.rowTipContenet {
+					width: 50%;
+					text-align: left;
+					overflow: hidden;
+					text-overflow: ellipsis;
+					white-space: nowrap;
+
+					.butsName {
+						display: inline-block;
+						margin-left: 19.23rpx;
+						color: #1990ff;
+					}
+				}
+			}
+
+			.rowTipContenet_right {
+				text-align: right !important;
+			}
+		}
+	}
+</style>
\ No newline at end of file
diff --git a/pages/actionChange/components/commonUserTabBar.vue b/pages/actionChange/components/commonUserTabBar.vue
new file mode 100644
index 0000000..1157205
--- /dev/null
+++ b/pages/actionChange/components/commonUserTabBar.vue
@@ -0,0 +1,41 @@
+<template>
+	<view class="tabarStyle">
+		<u-tabbar :value="value" @change="name => value = name" :fixed="true" :placeholder="true"
+			:safeAreaInsetBottom="true">
+			<u-tabbar-item text="������" @click="clickTo" icon="home"></u-tabbar-item>
+			<u-tabbar-item text="���������������" icon="plus-circle" @click="clickTo"></u-tabbar-item>
+			<u-tabbar-item text="������" icon="account" @click="clickTo"></u-tabbar-item>
+		</u-tabbar>
+	</view>
+</template>
+<script>
+	export default {
+		data() {
+			return {
+				value: 0,
+			}
+		},
+		props: {
+			currIndex: {
+				type: String,
+				default: '0'
+			},
+		},
+		watch: {
+			currIndex(newValue, oldValue) {
+				console.log('currIndex', newValue)
+				this.value = Number(newValue)
+			}
+		},
+		mounted() {
+			this.value = Number(this.currIndex)
+		},
+		methods: {
+			clickTo(index) {
+				this.$emit('handleChangeTabe', index)
+			}
+		}
+	}
+</script>
+<style scoped lang="scss">
+</style>
\ No newline at end of file
diff --git a/pages/actionChange/components/fileUpload.vue b/pages/actionChange/components/fileUpload.vue
index c9d6d82..72461e8 100644
--- a/pages/actionChange/components/fileUpload.vue
+++ b/pages/actionChange/components/fileUpload.vue
@@ -1,87 +1,79 @@
 <template>
 	<view class="">
-		<cl-upload
-			v-model="fileList"
-			:action="uploadTermExcelUrl"
-			cloud-type="other"
-			:data="{ sysCode }"
-			:headers="hearder"
-			:image-form-data="{
+		<cl-upload v-model="fileList" :action="uploadTermExcelUrl" cloud-type="other" :data="{ sysCode }"
+			:headers="hearder" :image-form-data="{
 				compress: true,
-			}"
-			:list-style="{
+			}" :list-style="{
 				columns: 3,
 				columnGap: '10rpx',
 				rowGap: '10rpx',
 				padding: '10rpx',
 				radius: '20rpx'
-			}"
-			use-before-delete
-			@beforeDelete="beforeDelete"
-			@onSuccess="onSuccess"
-		/>
+			}" use-before-delete @beforeDelete="beforeDelete" @onSuccess="onSuccess" />
 		</cl-upload>
 	</view>
 </template>
-
 <script>
-export default {
-	props: {
-		sysCode: {
-			type: String,
+	export default {
+		props: {
+			sysCode: {
+				type: String,
+			},
 		},
-	},
-	data() {
-		return {
-			fileList: [],
-			upLoadList: [],
-			beforFileList: [],
-			baseUrl: this.$storage.get('baseUrl'),
-			token: this.$storage.get('token'),
-		}
-	},
-	computed: {
-		uploadTermExcelUrl() {
-			return `${this.baseUrl}/file/upload` || ''
+		data() {
+			return {
+				fileList: [],
+				upLoadList: [],
+				beforFileList: [],
+				baseUrl: this.$storage.get('baseUrl'),
+				token: '',
+			}
 		},
-		hearder() {
-			let obj = { token: this.token, Authorization: this.token }
-			return obj
+		created() {
+			this.token = uni.getStorageSync('tonken')
+			console.log('tonken', this.token)
 		},
-	},
-	methods: {
-		onSuccess(res) {
-			console.log(res.data.fileId)
-			let fileId = res.data.fileId
-			let name = res.data.fileType === 1 ? 'name.png' : ''
-			this.fileList.push(`${this.baseUrl}/file/preview/${fileId}?${name}`) // ������
-			this.upLoadList.push(res.data)
-			console.log(this.fileList)
-			this.$emit('handleFile', this.upLoadList)
-		},
-		/**
-		 * ���������������
-		 * @param {Object} item ���������������������������������������
-		 * @param {Number} index ������������������������������������
-		 * @param {Function} next ���������������������������������������������
-		 * */
-		beforeDelete(item, index, next) {
-
-			uni.showModal({
-				title: '������������',
-				content: '���������������������������������',
-				success: res=> {
-					if (res.confirm) {
-						this.fileList.splice(index, 1)
-						this.upLoadList.splice(index, 1)
-						console.log('this.fileList', this.upLoadList)
-						 this.$emit('handleFile', this.upLoadList)
-					}
+		computed: {
+			uploadTermExcelUrl() {
+				return `${this.baseUrl}/file/upload` || ''
+			},
+			hearder() {
+				let obj = {
+					token: this.token,
+					Authorization: this.token
 				}
-			})
+				return obj
+			},
 		},
-	},
-}
+		methods: {
+			onSuccess(res) {
+				let fileId = res.data.fileId
+				let name = res.data.fileType === 1 ? 'name.png' : ''
+				this.fileList.push(`${this.baseUrl}/file/preview/${fileId}?${name}`) // ������
+				this.upLoadList.push(res.data)
+				this.$emit('handleFile', this.upLoadList)
+			},
+			/**
+			 * ���������������
+			 * @param {Object} item ���������������������������������������
+			 * @param {Number} index ������������������������������������
+			 * @param {Function} next ���������������������������������������������
+			 * */
+			beforeDelete(item, index, next) {
+				uni.showModal({
+					title: '������������',
+					content: '���������������������������������',
+					success: res => {
+						if (res.confirm) {
+							this.fileList.splice(index, 1)
+							this.upLoadList.splice(index, 1)
+							console.log('this.fileList', this.upLoadList)
+							this.$emit('handleFile', this.upLoadList)
+						}
+					}
+				})
+			},
+		},
+	}
 </script>
-
-<style></style>
+<style></style>
\ No newline at end of file
diff --git a/pages/actionChange/components/rectificationInfor.vue b/pages/actionChange/components/rectificationInfor.vue
index 8f532aa..fad999f 100644
--- a/pages/actionChange/components/rectificationInfor.vue
+++ b/pages/actionChange/components/rectificationInfor.vue
@@ -8,38 +8,54 @@
 			<u-line color="#bbb" />
 			<view>
 				<view class="mainContent">
-					<u--form labelPosition="left" label-width="70" :model="form" :border-bottom="false" :rules="rules"
+					<u--form labelPosition="left" label-width="80" :model="form" :border-bottom="false" :rules="rules"
 						ref="uForm">
-						<view class="formItemContent">
-							<u-form-item label="������������:" required :border-bottom="false">
-								<view class="" v-if="pageState">
-									{{ dictObj.yesOrNo[basicInfor.isChange] ||''}}
+						<view class="" v-if="pageState">
+							<p class="rowTip">
+								<view class="rowTipContenet">
+									<view class="wholeLine">
+										<text class="rowTipContenetLabel">������������:</text>
+										<text class="rowTipContenetAll">
+											{{ dictObj.yesOrNo[basicInfor.isChange] ||''}}
+										</text>
+									</view>
 								</view>
-								<u-radio-group v-else v-model="form.isChange" @change="radioGroupChange">
-									<u-radio :key="index" v-for="(item, index) in list"
-										:custom-style="{marginRight: '8px'}" :label="item.name" :name="item.value" />
-								</u-radio-group>
-							</u-form-item>
+								<view class="rowTipContenet">
+									<view class="wholeLine">
+										<text class="rowTipContenetLabel">���������:</text>
+										<text class="rowTipContenetAll">{{ basicInfor.changeName ||''}}</text>
+									</view>
+								</view>
+							</p>
+						</view>
+						<view class="" v-else>
+							<view class="formItemContent">
+								<u-form-item label="������������:" :required="!pageState" :border-bottom="false">
+									<u-radio-group v-model="form.isChange" @change="radioGroupChange">
+										<u-radio :key="index" v-for="(item, index) in list"
+											:custom-style="{marginRight: '8px'}" :label="item.name"
+											:name="item.value" />
+									</u-radio-group>
+								</u-form-item>
+							</view>
+							<view class="formItemContent">
+								<u-form-item label="���������:" prop="changeName" :border-bottom="false"
+									:required="!pageState">
+									<u-input v-model="form.changeName" border="none" placeholder="���������" type="text" />
+								</u-form-item>
+							</view>
 						</view>
 						<view class="formItemContent">
-							<u-form-item label="���������:" prop="changeName" :border-bottom="false" required>
-								<view class="" v-if="pageState">
-									{{ basicInfor.changeName ||''}}
-								</view>
-								<u-input v-else v-model="form.changeName" border="none" placeholder="���������" type="text" />
-							</u-form-item>
-						</view>
-						<view class="formItemContent">
-							<u-form-item label="������������" prop="changeDescribe" :border-bottom="false" required>
-								<view class="" v-if="pageState">
+							<u-form-item label="������������:" prop="changeDescribe" :border-bottom="false"
+								:required="!pageState">
+								<view class="fonttest" v-if="pageState">
 									{{ basicInfor.changeDescribe ||''}}
 								</view>
-								<u--textarea v-else v-model="form.changeDescribe" border="none" placeholder="���������������" />
+								<u--textarea v-else v-model="form.changeDescribe" border="none" />
 							</u-form-item>
 						</view>
-						
 						<view class="formItemContent">
-							<u-form-item label="������������" :border-bottom="false">
+							<u-form-item label="������������:" :border-bottom="false">
 								<view class="fileBox" v-if="pageState">
 									<cl-upload v-model="fileList" :add="false" :action="`''`" cloud-type="other"
 										:remove="false" />
@@ -86,20 +102,18 @@
 			return {
 				sysCode: '1010202',
 				list: [{
-						name: '���',
-						value: 0,
-					},
-					{
-						name: '���',
-						value: 1,
-					},
-				],
+					name: '���',
+					value: 0,
+				}, {
+					name: '���',
+					value: 1,
+				}, ],
 				form: {
 					isChange: 0,
 					changeName: '',
 					changeDescribe: '',
 				},
-				dictObj: this.$storage.getJson('dictObj'),
+				dictObj: JSON.parse(uni.getStorageSync('dictObj') || '[]'),
 				fileList: [],
 				fileBaseList: [],
 				baseUrl: this.$storage.get('baseUrl'),
@@ -147,23 +161,19 @@
 				return new Promise((resolve, reject) => {
 					if (!this.pageState) {
 						this.$refs.uForm.validate().then(res => {
-								resolve(true)
-							})
-							.catch(errors => {
-								reject(false)
-								uni.$u.toast('������������')
-							})
+							resolve(true)
+						}).catch(errors => {
+							reject(false)
+							uni.$u.toast('������������')
+						})
 					} else {
 						resolve(true)
 					}
-
-				});
-
+				})
 			}
 		},
 	}
 </script>
-
 <style scoped lang="scss">
 	/deep/.u-line {
 		margin: 19.23rpx 0px !important;
@@ -172,17 +182,16 @@
 	.workOrderDetail {
 		border: 1px solid #bbb;
 		border-radius: 5px;
-		min-height: 288.46rpx;
 		margin: 19.23rpx;
 		padding: 19.23rpx;
 		color: #101010;
 		font-weight: 700;
-		font-size: 26.92rpx;
+		font-size: 30.77rpx;
 
 		.headerCont {
 			display: flex;
 			justify-content: space-between;
-			font-size: 15px;
+			font-size: 30.77rpx;
 		}
 
 		.mainContent {
@@ -190,7 +199,8 @@
 			font-weight: 500;
 
 			.rowTip {
-				padding: 8px 0;
+				display: flex;
+				padding: 5px 0;
 				border-bottom: 1px dashed #bbb;
 
 				.wholeLine {
@@ -199,12 +209,15 @@
 					align-items: center;
 
 					.rowTipContenetLabel {
-						min-width: 125rpx;
+						min-width: 144.23rpx;
+						font-size: 28.85rpx;
+						text-align: left;
 					}
-				}
 
-				.rowTipContenetAll {
-					width: calc(100% - 125rpx; );
+					.rowTipContenetAll {
+						font-size: 28.85rpx;
+						width: calc(100% - 144.23rpx);
+					}
 				}
 
 				.rowTipContenet {
@@ -226,38 +239,5 @@
 				text-align: right !important;
 			}
 		}
-	}
-
-	.formItemContent {
-		/deep/.u-form-item {
-			padding: 8px 0;
-			border-bottom: 1px dashed #bbb;
-		}
-
-		/deep/.u-form-item__body,
-		/deep/.u-textarea {
-			padding: 0 !important;
-		}
-
-		/deep/.u-form-item__body__left__content__label,
-		/deep/.u-radio__text {
-			font-size: 13px !important;
-		}
-	}
-
-	.fileBox {
-		display: -webkit-box;
-		display: -webkit-flex;
-		display: flex;
-		position: relative;
-		width: 100%;
-		height: 100%;
-		-webkit-box-orient: vertical;
-		-webkit-box-direction: normal;
-		-webkit-flex-direction: column;
-		flex-direction: column;
-		-webkit-box-pack: center;
-		-webkit-justify-content: center;
-		justify-content: center;
 	}
 </style>
\ No newline at end of file
diff --git a/pages/actionChange/components/userAvatar.vue b/pages/actionChange/components/userAvatar.vue
new file mode 100644
index 0000000..d64eaca
--- /dev/null
+++ b/pages/actionChange/components/userAvatar.vue
@@ -0,0 +1,67 @@
+<template>
+	<view class="">
+		<u-modal :show="showUserSculpture" :title="title">
+			<view class="slot-content">
+				<view class="">
+					<u-avatar :src="avatarUrl" size="60"></u-avatar>
+				</view>
+			</view>
+			<view class="" slot="confirmButton">
+				<view class="confirmButton">
+					<button type="primary" open-type="chooseAvatar" @chooseavatar="onChooseAvatar" plain="true"
+						style="border: none;position: relative;">
+						<image :src="avatar" mode="aspectFill"
+							style="width: 150rpx;height: 150rpx;border-radius: 20rpx;" v-if="avatar">
+						</image>
+						<image src="../../static/home/noavatar.jpg" mode="aspectFill"
+							style="width: 150rpx;height: 150rpx;border-radius: 20rpx;" v-else></image>
+						<view class="tips">������������������</view>
+					</button>
+					<button type="primary" open-type="chooseAvatar" @chooseavatar="onChooseAvatar" plain="true"
+						style="border: none;position: relative; width: 200px;">
+						<u-button text="������" class="buts"></u-button> </button>
+					<button type="primary" plain="true" style="border: none;position: relative; width: 200px;">
+						<u-button text="������" class="buts"></u-button>
+					</button>
+				</view>
+			</view>
+		</u-modal>
+	</view>
+</template>
+<script>
+	export default {
+		props: {
+			showUserSculpture: {
+				type: Boolean,
+				default: false
+			},
+		},
+		data() {
+			return {
+				title: '������������',
+				avatarUrl: ''
+			}
+		},
+		methods: {
+			onChooseAvatar(e) {
+				const {
+					avatarUrl
+				} = e.detail // ������������������������������������������������������������������������
+				this.avatarUrl = avatarUrl
+			}
+		}
+	}
+</script>
+<style lang="scss" scoped>
+	.slot-content {
+		display: flex;
+		width: 100%;
+		align-items: center;
+		flex-wrap: wrap;
+		justify-content: center;
+	}
+
+	.confirmButton {
+		display: flex;
+	}
+</style>
\ No newline at end of file
diff --git a/pages/actionChange/myInfor/index.vue b/pages/actionChange/myInfor/index.vue
index b63dc6c..a186dec 100644
--- a/pages/actionChange/myInfor/index.vue
+++ b/pages/actionChange/myInfor/index.vue
@@ -2,11 +2,11 @@
 	<view class="mainContent">
 		<view class="headerAvatar">
 			<view class="">
-				<u-avatar :text="firstFont" fontSize="40" randomBgColor size='100'></u-avatar>
+				<u-avatar :src="avatarUrl" fontSize="40" randomBgColor size='100'></u-avatar>
 			</view>
 		</view>
 		<view class="inforBox">
-			<u-cell-group>
+			<u-cell-group :custom-style='fontStyleobj'>
 				<u-cell icon="server-man" title="������" :value="userInfor.userName"></u-cell>
 				<u-cell icon="account-fill" title="������" :value="userInfor.account"></u-cell>
 				<u-cell icon="integral-fill" title="������������" :value="unitName"></u-cell>
@@ -19,38 +19,49 @@
 	</view>
 </template>
 <script>
-	import {
-		created
-	} from '../../../uni_modules/uview-ui/libs/mixin/mixin'
+	import store from '@/store/index.js'
 	export default {
 		data() {
 			return {
 				loading: false,
 				userInfor: {},
-				unitList: []
+				avatarUrl: '',
+				unitList: [],
+				fontStyleobj: {
+					'fontSize': '16px'
+				}
 			}
 		},
 		computed: {
 			unitName() {
 				let data = ''
-				if (this.unitList.length > 0) {
-					data = this.unitList.find(a => parseInt(a.unitId) === this.userInfor.unitId).unitName
+				if (Object.values(this.userInfor).length > 0 && this.unitList.length > 0) {
+					if (this.userInfor.unitId) {
+						data = this.unitList.find(a => parseInt(a.unitId) === this.userInfor.unitId).unitName
+					}
 				}
 				return data || ''
 			},
-			firstFont() {
-				return this.userInfor.userName[0] || '���'
-			}
+			// firstFont() {
+			// 	let data = ''
+			// 	if (Object.values(this.userInfor).length > 0) {
+			// 		data = this.userInfor.userName[0]
+			// 	}
+			// 	return data || '���'
+			// }
 		},
 		created() {
 			this.$http.httpGet('/allocation/unit').then(res => {
 				this.unitList = res.data
 			})
-			this.userInfor = this.$storage.getJson('userInfo')
-			console.log('userInfor', this.userInfor.userName[0])
+			this.userInfor = JSON.parse(uni.getStorageSync('userInfor') || '{}')
+			console.log('this.userInforGet', this.userInfor)
+			let baseUrl = this.$storage.get('baseUrl')
+			this.avatarUrl = `${baseUrl}/file/preview/${this.userInfor.file.fileId}`
 		},
 		methods: {
 			goOut() {
+				let openId = uni.getStorageSync('openId')
 				uni.showModal({
 					title: '������',
 					content: '������������������',
@@ -60,10 +71,11 @@
 								userId: this.userInfor.userId
 							}).then(res => {
 								uni.clearStorageSync()
+								uni.setStorageSync('openId', openId)
 								uni.reLaunch({
 									url: '/pages/login/login',
 								})
-							}).catch(uni.$u.toast('������������'))
+							})
 						}
 					}
 				})
@@ -88,4 +100,9 @@
 	.bunts {
 		margin-top: 57.69rpx;
 	}
+
+	/deep/ .u-cell__title-text,
+	/deep/.u-cell__value {
+		font-size: 30.77rpx !important;
+	}
 </style>
\ No newline at end of file
diff --git a/pages/actionChange/newPage/index.vue b/pages/actionChange/newPage/index.vue
index e33c5bf..e84ee88 100644
--- a/pages/actionChange/newPage/index.vue
+++ b/pages/actionChange/newPage/index.vue
@@ -1,173 +1,61 @@
 <template>
 	<view class="mianContent">
 		<p class="title">������������</p>
-		<u-form
-			ref="uForm"
-			label-width="65"
-			:model="form"
-			:rules="rules"
-		>
-			<u-form-item
-				border-bottom
-				label="������������:"
-				prop="unitId"
-				required
-				@click="
+		<u-form ref="uForm" label-width="80" :model="form" :rules="rules" :labelStyle="labelStyle">
+			<u-form-item border-bottom label="������������:" prop="escalationTime" required @click="showeEscalationTime = true">
+				<u-input v-model="form.escalationTime" border="none" disabled disabled-color="#ffffff" placeholder="���������"
+					type="select" />
+				<u-icon slot="right" name="arrow-right" />
+				<u-datetime-picker ref="datetimePicker" v-model="timeFormet" mode="date" :show="showeEscalationTime"
+					@confirm="checkTime" @cancel='showeEscalationTime=false' />
+			</u-form-item>
+			<u-form-item border-bottom label="������������:" prop="pollutePosition" required>
+				<u-input v-model="form.pollutePosition" border="none" placeholder="���������" type="text" />
+			</u-form-item>
+			<u-form-item border-bottom label="������������:" prop="unitId" required @click="
 					showCheckBox = true;
 					hideKeyboard('unitList', 'unitId');
-				"
-			>
-				<u--input
-					v-model="form.unitId"
-					border="none"
-					disabled
-					disabled-color="#ffffff"
-					placeholder="���������"
-				/>
+				">
+				<u--input v-model="form.unitId" border="none" disabled disabled-color="#ffffff" placeholder="���������" />
 				<u-icon slot="right" name="arrow-right" />
 			</u-form-item>
-
-			<u-form-item
-				border-bottom
-				label="������������:"
-				prop="polluteType"
-				required
-				@click="
+			<u-form-item border-bottom label="������������:" prop="polluteType" required @click="
 					showCheckBox = true;
 					hideKeyboard('polluteList', 'polluteType');
-				"
-			>
-				<u-input
-					v-model="form.polluteType"
-					border="none"
-					disabled
-					disabled-color="#ffffff"
-					placeholder="���������"
-					type="select"
-				/>
+				">
+				<u-input v-model="form.polluteType" border="none" disabled disabled-color="#ffffff" placeholder="���������"
+					type="select" />
 				<u-icon slot="right" name="arrow-right" />
 			</u-form-item>
-			<u-form-item
-				border="none"
-				border-bottom
-				label="������������:"
-				prop="changeType"
-				required
-				@click="
+			<u-form-item border="none" border-bottom label="������������:" prop="changeType" required @click="
 					showCheckBox = true;
 					hideKeyboard('changeEnum', 'changeType');
-				"
-			>
-				<u-input
-					v-model="form.changeType"
-					border="none"
-					disabled
-					disabled-color="#ffffff"
-					placeholder="���������"
-					type="select"
-				/>
+				">
+				<u-input v-model="form.changeType" border="none" disabled disabled-color="#ffffff" placeholder="���������"
+					type="select" />
 				<u-icon slot="right" name="arrow-right" />
 			</u-form-item>
-			<u-form-item
-				border-bottom
-				label="������������:"
-				placeholder="���������"
-				required
-			>
+			<u-form-item border-bottom label="������������:" placeholder="���������" required>
 				<u-input v-model="form.changeDay" border="none" type="number" />
 			</u-form-item>
-			<u-form-item
-				border-bottom
-				label="������������:"
-				prop="escalationUnitId"
-				required
-				@click="
+			<u-form-item border-bottom label="������������:" prop="escalationUnitId" required @click="
 					showCheckBox = true;
 					hideKeyboard('unitList', 'escalationUnitId');
-				"
-			>
-				<u-input
-					v-model="form.escalationUnitId"
-					border="none"
-					disabled
-					disabled-color="#ffffff"
-					placeholder="���������"
-					type="select"
-				/>
+				">
+				<u-input v-model="form.escalationUnitId" border="none" disabled disabled-color="#ffffff"
+					placeholder="���������" type="select" />
 				<u-icon slot="right" name="arrow-right" />
 			</u-form-item>
-			<u-form-item
-				border-bottom
-				label="���������:"
-				prop="escalationName"
-				required
-			>
-				<u-input
-					v-model="form.escalationName"
-					border="none"
-					placeholder="���������"
-					type="text"
-				/>
+			<u-form-item border-bottom label="���������:" prop="escalationName" required>
+				<u-input v-model="form.escalationName" border="none" placeholder="���������" type="text" />
 			</u-form-item>
-			<u-form-item
-				border-bottom
-				label="������������:"
-				prop="investigationType"
-				required
-			>
+			<u-form-item border-bottom label="������������:" prop="investigationType" required>
 				<u-radio-group v-model="form.investigationType" style="font-size: 13px;">
-					<u-radio
-						:key="index"
-						v-for="(item, index) in Dic.investigationEnum"
-						:custom-style="{marginRight: '8px'}"
-						:label="item.name"
-						:name="item.value"
-					/>
+					<u-radio :key="index" v-for="(item, index) in Dic.investigationEnum"
+						:custom-style="{marginRight: '8px'}" :label="item.name" :name="item.value" />
 				</u-radio-group>
 			</u-form-item>
-			<u-form-item
-				border-bottom
-				label="������������:"
-				prop="escalationTime"
-				required
-				@click="showeEscalationTime = true"
-			>
-				<u-input
-					v-model="form.escalationTime"
-					border="none"
-					disabled
-					disabled-color="#ffffff"
-					placeholder="���������"
-					type="select"
-				/>
-				<u-icon slot="right" name="arrow-right" />
-				<u-datetime-picker
-					ref="datetimePicker"
-					v-model="timeFormet"
-					mode="date"
-					:show="showeEscalationTime"
-					@confirm="checkTime"
-				/>
-			</u-form-item>
-			<u-form-item
-				border-bottom
-				label="������������:"
-				prop="pollutePosition"
-				required
-			>
-				<u-input
-					v-model="form.pollutePosition"
-					border="none"
-					placeholder="���������"
-					type="text"
-				/>
-			</u-form-item>
-			<u-form-item
-				border-bottom
-				label="������������:"
-				prop="problemDescribe"
-				required
-			>
+			<u-form-item border-bottom label="������������:" prop="problemDescribe" required>
 				<u--textarea v-model="form.problemDescribe" border="none" placeholder="���������������" />
 			</u-form-item>
 			<u-form-item border-bottom label="������������:">
@@ -176,185 +64,230 @@
 				</view>
 			</u-form-item>
 		</u-form>
-		<u-action-sheet
-			v-if="actionOptionList.length > 0"
-			:actions="actionOptionList"
-			:show="showCheckBox"
-			title="���������"
-			@close="showCheckBox = false"
-			@select="selectBack"
-		/>
+		<u-picker :show="showCheckBox" keyName="label" :columns="actionOptionList" @cancel="showCheckBox = false"
+			@confirm="selectBack"></u-picker>
+		<!-- 	<u-action-sheet v-if="actionOptionList.length > 0" :actions="actionOptionList" :show="showCheckBox" title="���������"
+			@close="showCheckBox = false" @select="selectBack" /> -->
 		<view class="bunts">
-			<u-button shape="square" @click="close">������</u-button>
-			<u-button shape="square" type="primary" @click="submit">������</u-button>
+			<view class="but butRight">
+				<u-button shape="square" @click="close">������</u-button>
+			</view>
+			<view class="but butleft">
+				<u-button shape="square" type="primary" @click="submit">������</u-button>
+			</view>
 		</view>
 	</view>
 </template>
-
 <script>
-import fileUpload from '../components/fileUpload.vue'
-export default {
-	components: {
-		fileUpload
-	},
-	data() {
-		return {
-			sysCode: '1010201', //
-			showCheckBox: false,
-			showeEscalationTime: false,
-			actionOptionList: [],
-			rules: {
-				'unitId': {
-					required: true,
-					message: '���������',
-					trigger: ['blur', 'change']
-				},
-				'polluteType': {
-					required: true,
-					message: '���������',
-					trigger: ['blur', 'change']
-				},
-				'changeType': {
-					required: true,
-					message: '���������',
-					trigger: ['blur', 'change']
-				},
-				'changeDay': {
-					required: true,
-					message: '���������',
-					trigger: ['blur', 'change']
-				},
-				'escalationName': {
-					required: true,
-					message: '���������',
-					trigger: ['blur']
-				},
-				'escalationUnitId': {
-					required: true,
-					message: '���������',
-					trigger: ['blur', 'change']
-				},
-				'escalationTime': {
-					required: true,
-					message: '���������',
-					trigger: ['blur']
-				}, 'problemDescribe': {
-					required: true,
-					message: '���������',
-					trigger: ['blur']
-				}, 'pollutePosition': {
-					required: true,
-					message: '���������',
-					trigger: ['blur']
-				},
-			},
-			currentKey: '',
-			Dic: this.$storage.getJson('dict'),
-			changeEnum: [],
-			timeFormet: Number(new Date()),
-			form: {
-				unitId: '',
-				polluteType: '',
-				changeType: '',
-				changeDay: '',
-				escalationName: '',
-				escalationUnitId: '',
-				escalationTime: '',
-				problemDescribe: '',
-				pollutePosition: '',
-			},
-			sumbitForm: {
-				unitId: '',
-				polluteType: '',
-				changeType: '',
-				changeDay: '',
-				escalationName: '',
-				escalationUnitId: '',
-				escalationTime: '',
-				problemDescribe: '',
-				pollutePosition: '',
-			},
-			unitList: [],
-			polluteList: [],
-			fileBaseList: [],
-		}
-	},
-	onReady() {
-		//onReady ���uni-app���������������������������
-		this.$refs.uForm.setRules(this.rules)
-	},
-	onShow(){
-		uni.hideTabBar()
-	},
-	created() {
-		this.changeEnum = this.Dic.changeEnum
-		this.getUnitList()
-		this.getContaminateList()
-	},
-	methods: {
-		handleFile(data){
-			this.fileBaseList=data
+	import fileUpload from '../components/fileUpload.vue'
+	export default {
+		components: {
+			fileUpload
 		},
-		close(){
-			uni.reLaunch({
-				url: '/pages/actionChange/agencyPage/index',
+		data() {
+			return {
+				sysCode: '1010201', //
+				showCheckBox: false,
+				labelStyle: {
+					fontSize: '30.77rpx'
+				},
+				showeEscalationTime: false,
+				actionOptionList: [],
+				rules: {
+					'unitId': {
+						required: true,
+						message: '���������',
+						trigger: ['blur', 'change']
+					},
+					'polluteType': {
+						required: true,
+						message: '���������',
+						trigger: ['blur', 'change']
+					},
+					'changeType': {
+						required: true,
+						message: '���������',
+						trigger: ['blur', 'change']
+					},
+					'changeDay': {
+						required: true,
+						message: '���������',
+						trigger: ['blur', 'change']
+					},
+					'escalationName': {
+						required: true,
+						message: '���������',
+						trigger: ['blur']
+					},
+					'escalationUnitId': {
+						required: true,
+						message: '���������',
+						trigger: ['blur', 'change']
+					},
+					'escalationTime': {
+						required: true,
+						message: '���������',
+						trigger: ['blur']
+					},
+					'problemDescribe': {
+						required: true,
+						message: '���������',
+						trigger: ['blur']
+					},
+					'pollutePosition': {
+						required: true,
+						message: '���������',
+						trigger: ['blur']
+					},
+				},
+				currentKey: '',
+				Dic: [],
+				changeEnum: [],
+				timeFormet: Number(new Date()),
+				form: {
+					unitId: '',
+					polluteType: '',
+					changeType: '',
+					changeDay: '',
+					escalationName: '',
+					escalationUnitId: '',
+					escalationTime: '',
+					problemDescribe: '',
+					pollutePosition: '',
+				},
+				sumbitForm: {
+					unitId: '',
+					polluteType: '',
+					changeType: '',
+					changeDay: '',
+					escalationName: '',
+					escalationUnitId: '',
+					escalationTime: '',
+					problemDescribe: '',
+					pollutePosition: '',
+				},
+				unitList: [],
+				polluteList: [],
+				fileBaseList: [],
+			}
+		},
+		onReady() {
+			//onReady ���uni-app���������������������������
+			this.$refs.uForm.setRules(this.rules)
+		},
+		onShow() {
+			uni.hideTabBar()
+		},
+		created() {
+			this.getUnitList()
+			this.getContaminateList()
+		},
+		onBackPress(e) {
+			uni.navigateBack({
+				delta: 1, //������������������������������������������2
 			})
+			return false
 		},
-		hideKeyboard(data, key) {
-			this.actionOptionList = []
-			let list = this[data]
-
-			this.currentKey = key
-			list.forEach((item)=> {
-				item.name = item.dataValue || item.name || item.unitName
-				item.value = item.dataKey || item.value|| item.unitId
-			})
-
-			this.actionOptionList = list
-		},
-		selectBack(e) {
-			this.form[this.currentKey] = e.name
-			this.sumbitForm[this.currentKey] = e.value
-
-		},
-		checkTime(e) {
-			this.showeEscalationTime = false
-			let data = this.$utils.dateFormatter(e.value)
-			this.form.escalationTime = data
-			this.sumbitForm.escalationTime = data
-		},
-		submit() {
-			this.$refs.uForm.validate().then(res=> {
-				this.sumbitForm.problemDescribe=this.form.problemDescribe
-				this.sumbitForm.pollutePosition=this.form.pollutePosition
-				this.sumbitForm.changeDay=this.form.changeDay
-				this.sumbitForm.escalationName=this.form.escalationName
-				this.sumbitForm.fileBaseList=this.fileBaseList
-				this.sumbitForm.state='10'
-				console.log('this.sumbitForm', this.sumbitForm)
-				this.$http.httpPost('/allocation/insert', {...this.sumbitForm}).then((res)=> {
-					uni.$u.toast('������������')
-					this.close()
+		methods: {
+			handleFile(data) {
+				this.fileBaseList = data
+			},
+			close() {
+				uni.$emit('currIndex', {
+					data: {
+						index: '0',
+						showTabBar: true
+					}
 				})
-			}).catch(errors=> {
-				uni.$u.toast('������������')
-			})
+				uni.navigateBack({
+					delta: 1, //������������������������������������������2
+				})
+			},
+			hideKeyboard(data, key) {
+				this.actionOptionList = []
+				let list = this[data]
+				this.currentKey = key
+				list.forEach(item => {
+					item.label = item.dataValue || item.name || item.unitName
+					item.id = item.dataKey || item.value || item.unitId
+				})
+				console.log('list', list)
+				this.$set(this.actionOptionList, 0, list)
+			},
+			selectBack(e) {
+				console.log(e)
+				this.form[this.currentKey] = e.value[0].label
+				this.sumbitForm[this.currentKey] = e.value[0].id
+				this.showCheckBox = false
+			},
+			checkTime(e) {
+				this.showeEscalationTime = false
+				let data = this.$utils.dateFormatter(e.value)
+				console.log('e.value', e.value)
+				this.form.escalationTime = data
+				this.sumbitForm.escalationTime = data
+			},
+			submit() {
+				this.$refs.uForm.validate().then(res => {
+					this.sumbitForm.problemDescribe = this.form.problemDescribe
+					this.sumbitForm.pollutePosition = this.form.pollutePosition
+					this.sumbitForm.changeDay = this.form.changeDay
+					this.sumbitForm.escalationName = this.form.escalationName
+					this.sumbitForm.investigationType = this.form.investigationType
+					this.sumbitForm.fileBaseList = this.fileBaseList
+					this.sumbitForm.state = '20'
+					console.log('this.sumbitForm', this.sumbitForm)
+					this.$http.httpPost('/allocation/insert', {
+						...this.sumbitForm
+					}).then(res => {
+						uni.$u.toast('������������')
+						this.close()
+					})
+				}).catch(errors => {
+					uni.$u.toast('������������')
+				})
+			},
+			setDefaultValue() {
+				let time = new Date().getTime()
+				let data = this.$utils.dateFormatter(time)
+				this.form.escalationTime = data
+				this.sumbitForm.escalationTime = data
+				if (this.changeEnum.length > 0) {
+					this.form.changeType = this.changeEnum[0].name
+					this.sumbitForm.changeType = this.changeEnum[0].value
+				}
+				let userInfor = JSON.parse(uni.getStorageSync('userInfor') || '{}')
+				if (userInfor.unitId && this.unitList.length > 0) {
+					let data = this.unitList && this.unitList.find(a => Number(a.unitId) === Number(userInfor.unitId))
+						.unitName
+					this.form.unitId = data
+					this.sumbitForm.unitId = userInfor.unitId
+					this.form.escalationUnitId = data
+					this.sumbitForm.escalationUnitId = userInfor.unitId
+				}
+				this.form.escalationName = userInfor.name || ''
+				this.sumbitForm.escalationName = userInfor.name || ''
+				this.form.investigationType = 1
+				this.sumbitForm.investigationType = 1
+				console.log('this.sumbitForm', this.sumbitForm)
+			},
+			// ������������������list
+			getUnitList() {
+				this.$http.httpGet('/allocation/unit').then(res => {
+					this.unitList = res.data
+					this.Dic = JSON.parse(uni.getStorageSync('dict') || '[]')
+					this.changeEnum = this.Dic.changeEnum
+					this.setDefaultValue()
+				})
+			},
+			getContaminateList() {
+				this.$http.httpGet('/allocation/contaminate').then(res => {
+					this.polluteList = res.data
+				})
+			},
 		},
-		// ������������������list
-		getUnitList() {
-			this.$http.httpGet('/allocation/unit').then((res)=> {
-				this.unitList = res.data
-			})
-		},
-		getContaminateList() {
-			this.$http.httpGet('/allocation/contaminate').then((res)=> {
-				this.polluteList = res.data
-			})
-		},
-	},
-}
+	}
 </script>
-
 <style scoped lang="scss">
 	uni-page-body {
 		padding-top: 10px;
@@ -363,6 +296,8 @@
 	.mianContent {
 		margin: 19.23rpx;
 		border-radius: 5px;
+		padding-bottom: 38.46rpx;
+
 		.title {
 			padding: 9.62rpx;
 			font-size: 16px;
@@ -375,24 +310,38 @@
 			padding-left: 10px;
 		}
 
-		/deep/.u-form-item__body {
-			padding: 5px 0px !important;
-			font-size: 13px!important;
-		}
-		/deep/.u-form-item__body__left__content__label,/deep/.u-input__content__field-wrapper__field,/deep/.u-radio__text{
-			font-size: 13px!important;
-		}
+		// /deep/.u-form-item__body {
+		// 	padding: 8px 0px !important;
+		// 	font-size: 15px !important;
+		// }
+		// /deep/.u-form-item__body__left__content__label,
+		// /deep/.u-input__content__field-wrapper__field,
+		// /deep/.u-radio__text {
+		// 	font-size: 15px !important;
+		// }
 	}
+
 	.bunts {
 		display: flex;
 		margin-top: 20px;
 		margin-bottom: 96.15rpx;
-		padding-bottom: 20px;
-		.u-button {
-			width: 288.46rpx;
+		padding: 0 20px;
+		justify-content: center;
+
+		.but {
+			width: 50%;
+		}
+
+		.butRight {
+			padding-right: 20px;
+		}
+
+		.butleft {
+			padding-left: 20px;
 		}
 	}
-	.fileBox{
+
+	.fileBox {
 		display: -webkit-box;
 		display: -webkit-flex;
 		display: flex;
diff --git a/pages/actionChange/workOrderDetails/index.vue b/pages/actionChange/workOrderDetails/index.vue
index 1e79165..9feaf22 100644
--- a/pages/actionChange/workOrderDetails/index.vue
+++ b/pages/actionChange/workOrderDetails/index.vue
@@ -1,93 +1,110 @@
 <template>
 	<view class="mainContent">
 		<basicInfor :basic-infor="basicInfor" />
-		<rectificationInfor ref="rectificationInfor" :basic-infor="basicInfor" />
+		<rectificationInfor ref="rectificationInfor" :basic-infor="basicInfor"
+			v-if="!(pageState === 'view' && basicInfor.state === 20)" />
 		<approvalnfor ref="approvalnfor" v-if="basicInfor.state >= 30" :basic-infor="basicInfor" />
 		<view class="bunts">
-			<u-button shape="square" @click="close">������</u-button>
-			<u-button
-				v-if="pageState==='edit'"
-				shape="square"
-				type="primary"
-				@click="submit"
-			>
-				������
-			</u-button>
+			<view class="but butRight">
+				<u-button shape="square" @click="refuse" type="error"
+					v-if="pageState==='edit'&& basicInfor.state >= 30">������</u-button>
+				<u-button shape=" square" @click="close" v-else>������</u-button>
+			</view>
+			<view class="but butleft" v-if="pageState==='edit'">
+				<u-button shape="square" type="primary" @click="submit"> ������ </u-button>
+			</view>
 		</view>
 	</view>
 </template>
 <script>
-import basicInfor from '../components/basicInfor.vue'
-import rectificationInfor from '../components/rectificationInfor.vue'
-import approvalnfor from '../components/approvalnfor.vue'
-export default {
-	components: {
-		basicInfor,
-		rectificationInfor,
-		approvalnfor,
-	},
-	data() {
-		return {
-			basicInfor: {}
-		}
-	},
-	computed: {
-		pageState() {
-			return this.basicInfor.pageState
-		}
-	},
-	onLoad: function(option) {
-		console.log('option', option)
-		//option���object������������������������������������������������
-		this.basicInfor = JSON.parse(option.infor)
-
-	},
-	onBackPress(e) {
-		uni.navigateTo({
-			url: '/pages/actionChange/agencyPage/index',
-		})
-		return false
-	},
-	methods: {
-		radioGroupChange(e) {
-			console.log('radioGroupe���e', this.workForme.isChange)
+	import basicInfor from '../components/basicInfor.vue'
+	import rectificationInfor from '../components/rectificationInfor.vue'
+	import approvalnfor from '../components/approvalnfor.vue'
+	export default {
+		components: {
+			basicInfor,
+			rectificationInfor,
+			approvalnfor,
 		},
-		close() {
-			let pages = getCurrentPages() // ������������
-			let beforePage = pages[pages.length - 3] // ������������
-			//beforePage.$vm.reFresh = Math.random()//������������������������
+		data() {
+			return {
+				basicInfor: {}
+			}
+		},
+		computed: {
+			pageState() {
+				return this.basicInfor.pageState
+			}
+		},
+		onLoad: function(option) {
+			console.log('option', option)
+			//option���object������������������������������������������������
+			this.basicInfor = JSON.parse(option.infor)
+		},
+		onBackPress(e) {
 			uni.navigateBack({
 				delta: 1, //������������������������������������������2
-				success: function() {
-					// beforePage.$vm.reFresh()
-				}
 			})
+			return false
 		},
-		submit() {
-			Promise.all([this.$refs.rectificationInfor && this.$refs.rectificationInfor.formVali(), this.$refs
-				.approvalnfor && this.$refs.approvalnfor.formVali()
-			]) //
-				.then(()=> {
-					let api = this.basicInfor.state >= 30 ? '/allocation/check' : '/allocation/change' //������
-					let form = this.basicInfor.state >=30 ? this.$refs.approvalnfor.form : this.$refs.rectificationInfor.form
-					let data = {
-						allocationId: this.basicInfor.allocationId,
-						...form,
-						state: this.basicInfor.state,
+		methods: {
+			radioGroupChange(e) {
+				console.log('radioGroupe���e', this.workForme.isChange)
+			},
+			close() {
+				uni.$emit('currIndex', {
+					data: {
+						index: '0',
+						showTabBar: true
 					}
-					this.$http.httpPost(api, data).then((res)=> {
-						this.close()
+				})
+				uni.navigateBack({
+					delta: 1, //������������������������������������������2
+				})
+			},
+			refuse() {
+				Promise.all([this.$refs.rectificationInfor && this.$refs.rectificationInfor.formVali(), this.$refs
+						.approvalnfor && this.$refs.approvalnfor.formVali()
+					]) //
+					.then(() => {
+						let api = this.basicInfor.state >= 30 ? '/allocation/check' : '/allocation/change' //������
+						let form = this.basicInfor.state >= 30 ? this.$refs.approvalnfor.form : this.$refs
+							.rectificationInfor.form
+						let data = {
+							allocationId: this.basicInfor.allocationId,
+							...form,
+							state: 50,
+						}
+						this.$http.httpPost(api, data).then(res => {
+							this.close()
+						})
+					}).catch(err => {
+						console.log('���������������', err)
 					})
-				})
-				.catch(err=> {
-					console.log('���������������������', err)
-				})
-
-		}
-	},
-}
+			},
+			submit() {
+				Promise.all([this.$refs.rectificationInfor && this.$refs.rectificationInfor.formVali(), this.$refs
+						.approvalnfor && this.$refs.approvalnfor.formVali()
+					]) //
+					.then(() => {
+						let api = this.basicInfor.state >= 30 ? '/allocation/check' : '/allocation/change' //������
+						let form = this.basicInfor.state >= 30 ? this.$refs.approvalnfor.form : this.$refs
+							.rectificationInfor.form
+						let data = {
+							allocationId: this.basicInfor.allocationId,
+							...form,
+							state: this.basicInfor.state === 20 ? 30 : 40,
+						}
+						this.$http.httpPost(api, data).then(res => {
+							this.close()
+						})
+					}).catch(err => {
+						console.log('���������������', err)
+					})
+			}
+		},
+	}
 </script>
-
 <style scoped lang="scss">
 	.mainContent {
 		padding-bottom: 38.46rpx;
@@ -98,9 +115,18 @@
 		margin-top: 20px;
 		margin-bottom: 96.15rpx;
 		padding: 0 20px;
+		justify-content: center;
 
-		.u-button {
-			width: 288.46rpx;
+		.but {
+			width: 50%;
+		}
+
+		.butRight {
+			padding-right: 20px;
+		}
+
+		.butleft {
+			padding-left: 20px;
 		}
 	}
 </style>
\ No newline at end of file
diff --git a/pages/index/index.vue b/pages/index/index.vue
index 6445b39..bc74e39 100644
--- a/pages/index/index.vue
+++ b/pages/index/index.vue
@@ -1,5 +1,76 @@
-<template />
-
-<script></script>
-
-<style></style>
+<template>
+	<view class="newIndex">
+		<uni-nav-bar backgroundColor='#000' color='#fff' statusBar :border='false' fixed :title="title" />
+		<u-loading-page :loading="loading"></u-loading-page>
+		<agencyPage v-if="isShow" ref="agencyPage"></agencyPage>
+		<myInfor v-if="!isShow"></myInfor>
+		<tabBar v-if="showTabBar" @handleChangeTabe='handleChangeTabe' :currIndex='currIndex'></tabBar>
+	</view>
+</template>
+<script>
+	import agencyPage from '@/pages/actionChange/agencyPage/index.vue'
+	import myInfor from '@/pages/actionChange/myInfor/index.vue'
+	import tabBar from '@/pages/actionChange/components/commonUserTabBar.vue'
+	export default {
+		data() {
+			return {
+				isShow: true,
+				loading: true,
+				showTabBar: true,
+				token: '',
+				currIndex: '0',
+				title: '������'
+			}
+		},
+		components: {
+			agencyPage,
+			myInfor,
+			tabBar
+		},
+		onLoad(option) {},
+		onReady() {},
+		onShow() {
+			this.currIndex = '0'
+			this.showTabBar = true
+		},
+		async mounted() {
+			//������������������
+			await this.$onLaunched
+			this.token = uni.getStorageSync('tonken')
+			console.log('indextoken', this.token)
+			this.loading = false
+			this.getData()
+			uni.$on('currIndex', data => {
+				console.log('currIndexOn', data)
+				this.currIndex = data.data.index
+				this.showTabBar = data.data.showTabBar
+				this.$refs.agencyPage.getContaminateList()
+			})
+		},
+		methods: {
+			getData() {
+				console.log('indextokengetContaminateList')
+				this.$refs.agencyPage.getContaminateList()
+			},
+			handleChangeTabe(index) {
+				if (index === 2) {
+					this.isShow = false
+					this.title = '������'
+				}
+				if (index === 0) {
+					this.isShow = true
+					this.$nextTick(() => {
+						this.getData()
+					})
+				}
+				if (index === 1) {
+					uni.navigateTo({
+						url: '/pages/actionChange/newPage/index'
+					})
+					this.showTabBar = false
+				}
+			}
+		}
+	}
+</script>
+<style></style>
\ No newline at end of file
diff --git a/pages/login/login.vue b/pages/login/login.vue
index 147529c..04a8c27 100644
--- a/pages/login/login.vue
+++ b/pages/login/login.vue
@@ -21,11 +21,11 @@
 				</u-form>
 			</view>
 			<view class="loginContent">
-				<p>
+				<!-- <p>
 					<navigator style="display: inline-block;" url="/pages/login/register/register">
 						<text style="text-decoration: underline">������������</text>
 					</navigator>
-				</p>
+				</p> -->
 				<u-button @click="submit">������</u-button>
 			</view>
 		</view>
@@ -34,19 +34,20 @@
 <script>
 	import {
 		login,
-		getUserInfor,
 		getDic
 	} from '@/utils/login.js' // ������������
 	import {
 		httpPost,
 		httpGet
 	} from '@/utils/http.js'
+	import store from '@/store/index.js'
 	export default {
 		data() {
 			return {
 				labelStyle: {
 					color: '#fff'
 				},
+				title: '������������',
 				passwordIcon: false,
 				form: {
 					account: '',
@@ -71,38 +72,48 @@
 			//onReady ���uni-app���������������������������
 			this.$refs.uForm.setRules(this.rules)
 		},
+		async onLoad(option) {
+			//������������������	
+			await this.$onLaunched
+			// ������������������
+		},
+		async onShow() {
+			uni.hideHomeButton()
+		},
 		methods: {
 			submit() {
 				this.$refs.uForm.validate().then(res => {
 					this.getlogin()
-				}).catch(errors => {
-					uni.$u.toast('������������')
-				})
+				}).catch(errors => {})
 			},
 			//������
 			getlogin() {
-				let openId = this.$storage.get('openId')
+				const value = uni.getStorageSync('openId')
+				console.log('openId', value)
+				if (value) {
+					this.logining(value)
+					console.log('openId', openId)
+				}
+			},
+			logining(openId) {
 				login({
 					...this.form,
 					openId
 				}).then(response => {
-					this.$storage.set('token', response.data.token)
+					uni.setStorageSync('userInfor', JSON.stringify(response.data))
+					uni.setStorageSync('tonken', response.data.token)
 					getDic()
-					getUserInfor(response.data.token)
 					uni.hideLoading()
-					uni.switchTab({
-						url: '/pages/actionChange/agencyPage/index',
+					uni.navigateTo({
+						url: '/pages/index/index',
 					})
-					// this.$storage.setJson("accountInFor", this.form);
-					// console.log('this.$store', this.$store)
-					// this.$store.commit('token', token)
 				}).catch(errors => {
 					uni.showToast({
 						title: errors,
 						icon: 'none',
 					})
 				})
-			},
+			}
 		},
 	}
 </script>
diff --git a/store/index.js b/store/index.js
index 293363c..3d8198f 100644
--- a/store/index.js
+++ b/store/index.js
@@ -1,7 +1,39 @@
 import Vue from 'vue'
 import Vuex from 'vuex'
-import modules from './modules/index.js'
 Vue.use(Vuex)
-
-const store = new Vuex.Store(modules)
-export default store
+const store = new Vuex.Store({
+    state: {
+        userInfor: {},
+        tonken: '',
+        dictObj: {},
+        dict: null
+    },
+    mutations: {
+        setUserInfor(state, data) {
+            state.userInfor = data
+            // ������������������
+            uni.setStorageSync('userInfor', JSON.stringify(data)) //������������������������������
+        },
+        setDictObj(state, data) {
+            state.dictObj = data
+            // ������������������
+            uni.setStorageSync('dictObj', JSON.stringify(data)) //������������������������������
+        },
+        setDict(state, data) {
+            state.dict = data
+            // ������������������
+            uni.setStorageSync('dict', JSON.stringify(data)) //������������������������������
+        },
+        setTonken(state, data) {
+            state.tonken = data
+            // ������������������
+            uni.setStorageSync('tonken', data)
+        },
+    },
+    actions: {
+        getUserInfo(context, data) {
+            context.commit('userInfor', data)
+        }
+    },
+})
+export default store
\ No newline at end of file
diff --git a/store/modules/index.js b/store/modules/index.js
deleted file mode 100644
index b32b44c..0000000
--- a/store/modules/index.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import _ from 'lodash'
-
-const files = require.context('.', false, /\.js$/)
-const modules = {}
-
-files.keys().forEach(key => {
-	if (key === './index.js') return
-	_.mergeWith(modules,files(key).default)
-})
-export default modules
diff --git a/store/modules/user.js b/store/modules/user.js
deleted file mode 100644
index 166094c..0000000
--- a/store/modules/user.js
+++ /dev/null
@@ -1,111 +0,0 @@
-import Vue from "vue";
-export default {
-  state: {
-    user: null,
-	tonken:''
-  },
-  mutations: {
-    login(state, user) {
-      state.user = user;
-      // ������������������
-      Vue.prototype.$cache.set("_userInfo", user, 0);
-    },
-	tonken(state, data) {
-	  state.tonken = data;
-	  // ������������������
-	  Vue.prototype.$cache.set("state",tonken,0);
-	},
-    logout(state) {
-      state.user = null;
-      // ������������������������
-      Vue.prototype.$cache.delete("_userInfo");
-    },
-  },
-  actions: {
-    autoLogin({ commit, getters, dispatch }) {
-		console.log('Vue.prototype.$storage',Vue.prototype.$storage.get("tonken"))
-      let tonken = Vue.prototype.$storage.get("tonken");
-      console.log("tonken", tonken);
-      // ���������������������������������������������������������������������
-      if (tonken) {
-        const params = {
-          account: accountInFor.account,
-          password: accountInFor.password,
-        };
-        uni.showLoading({
-          title: "���������������...",
-        });
-        dispatch("login", params)
-          .then((res) => {
-            uni.hideLoading();
-            // uni.showToast({
-            // 	title: '������������������',
-            // 	icon: 'success'
-            // })
-          })
-          .catch(() => {
-            uni.hideLoading();
-            uni.showToast({
-              title: "���������������������������������",
-              icon: "none",
-            });
-            setTimeout(() => {
-              uni.reLaunch({
-                url: "/pages/login/login",
-              });
-            }, 1000);
-          });
-      } else {
-        // ������������������������������������������������������������
-        uni.showModal({
-          title: "���������",
-          content: "������������������������������������������",
-          showCancel: false,
-          confirmText: "������",
-          success: (res) => {
-            if (res.confirm) {
-              uni.reLaunch({
-                url: "/pages/login/login",
-              });
-            }
-          },
-        });
-      }
-    },
-    login({ commit }, params) {
-      return new Promise((resolve, reject) => {
-        Vue.prototype.$login
-          .login(params)
-          .then((res) => {
-            if (res.ok()) {
-              console.log(response);
-              this.$storage.set("token", response.data.token);
-              this.$storage.setJson("accountInFor", this.form);
-              let token = this.$storage.get("token");
-              commit("login", tmp);
-              resolve(res);
-            } else {
-              reject(res);
-            }
-          })
-          .catch((err) => {
-            reject(err);
-          });
-      });
-    },
-    logout({ commit }) {
-      commit("logout");
-      uni.reLaunch({
-        url: "/pages/login/login",
-      });
-    },
-  },
-  getters: {
-    user: (state) => {
-      if (state.user) {
-        return state.user;
-      }
-      // return Vue.prototype.$cache.get('_userInfo')
-    },
-  },
-};
diff --git a/uni_modules/uni-datetime-picker/changelog.md b/uni_modules/uni-datetime-picker/changelog.md
new file mode 100644
index 0000000..64c2f04
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/changelog.md
@@ -0,0 +1,142 @@
+## 2.2.25���2023-10-18���
+- ������ PC������������������������������������������������Bug [������](https://github.com/dcloudio/uni-ui/issues/737)
+## 2.2.24���2023-06-02���
+- ������ ���������������������������������������������������������������Bug [������](https://ask.dcloud.net.cn/question/171146)
+- ������ ������������������������������������������������Bug
+## 2.2.23���2023-05-02���
+- ������ ���������������������������������������������������Bug [������](https://github.com/dcloudio/uni-ui/issues/737)
+- ������ ���������������������������������������������������������Bug
+- ������ ios ���������������������������������������������Bug [������](https://ask.dcloud.net.cn/question/162979)
+## 2.2.22���2023-03-30���
+- ������ ������ picker ������������������������������������1������Bug [������](https://ask.dcloud.net.cn/question/165937)
+- ������ ������������ ��������� ios NaN���Bug [������](https://ask.dcloud.net.cn/question/162979)
+## 2.2.21���2023-02-20���
+- ������ firefox ������������������������������������������������������Bug [������](https://ask.dcloud.net.cn/question/163362)
+## 2.2.20���2023-02-17���
+- ������ ���������������������������������
+- ������ ������ default-value ���������������������������������������������������������
+- ������ ���������������������������������������������������������������������������������
+- ������ ���������������������������������������������������������������Bug
+## 2.2.19���2023-02-09���
+- ������ 2.2.18 ������������������������ end ���������������Bug [������](https://github.com/dcloudio/uni-ui/issues/686)
+## 2.2.18���2023-02-08���
+- ������ ���������������������change���������������������Bug [������](https://github.com/dcloudio/uni-ui/issues/684)
+- ������ PC������������������������������������������������������
+- ������ PC��������������������������� start���end ���������Bug
+- ������ ������������������������������������������������������������
+## 2.2.17���2023-02-04���
+- ������ ������������������ Date ���������������Bug [������](https://github.com/dcloudio/uni-ui/issues/679)
+- ������ vue3 time-picker ������������������������������Bug
+## 2.2.16���2023-02-02���
+- ������ ������������������������Bug
+## 2.2.15���2023-02-02���
+- ������ ���������������������������������Bug
+## 2.2.14���2023-01-30���
+- ������ ���������������������������������Bug [������](https://ask.dcloud.net.cn/question/162033)
+## 2.2.13���2023-01-10���
+- ������ ���������������������������������������Bug
+## 2.2.12���2022-12-01���
+- ������ vue3 ��� i18n ������������������������������Bug
+## 2.2.11���2022-09-19���
+- ������ ���������������������������������Bug [������](https://github.com/dcloudio/uni-app/issues/3861)
+## 2.2.10���2022-09-19���
+- ������ ������������������������������������������������Bug [������](https://ask.dcloud.net.cn/question/153401?item_id=212892&rf=false)
+## 2.2.9���2022-09-16���
+- ������������ uni-scss ���������������
+## 2.2.8���2022-09-08���
+- ������ close���������������Bug
+## 2.2.7���2022-09-05���
+- ������ ��������� maskClick ���������Bug [������](https://ask.dcloud.net.cn/question/140824)
+## 2.2.6���2022-06-30���
+- ������ ���������������������������������������������������������������������uni-ui������������������
+## 2.2.5���2022-06-24���
+- ������ ������������������������������������������������Bug
+## 2.2.4���2022-03-31���
+- ������ Vue3 ���������������,������������������������Bug
+## 2.2.3���2022-03-28���
+- ������ Vue3 ���������������������������Bug
+## 2.2.2���2021-12-10���
+- ������ clear-icon ������������������������������������Bug
+## 2.2.1���2021-12-10���
+- ������ ������������������������������������������������������������������������������������Bug
+## 2.2.0���2021-11-19���
+- ������ ������UI������������������������ [������](https://uniapp.dcloud.io/component/uniui/resource)
+- ������������ [https://uniapp.dcloud.io/component/uniui/uni-datetime-picker](https://uniapp.dcloud.io/component/uniui/uni-datetime-picker)
+## 2.1.5���2021-11-09���
+- ������ ���������������������������������������������
+## 2.1.4���2021-09-10���
+- ������ hide-second ���������������Bug
+- ������ ������������������������������������������������Bug
+- ������ ���������������������������������������������������Bug
+## 2.1.3���2021-09-09���
+- ������ hide-second ������������������������������������������
+## 2.1.2���2021-09-03���
+- ������ ���������������������������������������������������������, ������������������
+- ������ ������������������������������������������������ ref ��������������� clear ������
+- ������ ���������������������������������������
+- ������ ��������������������� placeholder ���������Bug
+## 2.1.1���2021-08-24���
+- ������ ���������������
+- ������ ������������������ pc ������������������
+## 2.1.0���2021-08-09���
+- ������ ������ vue3
+## 2.0.19���2021-08-09���
+- ������ ������������ uni-forms ���������������������
+- ������ ��� uni-forms ������������������������������ NAN ���������Bug
+## 2.0.18���2021-08-05���
+- ������ type ���������������������������Bug
+- ������ ��������������������� tabbar ������ bug
+- ������ ���������������������������������������������������Bug
+## 2.0.17���2021-08-04���
+- ������ ������������������������������������Bug
+- ������ h5 ��������������������������� 'cale' of undefined ���Bug
+## 2.0.16���2021-07-21���
+- ������ return-type ������������������ date ������������
+## 2.0.15���2021-07-14���
+- ������ ���������������������������������������������������������Bug
+- ������ clearIcon ������������������������������������������������������������ pc ���������
+- ������ ���������������������������������������������������������
+## 2.0.14���2021-07-14���
+- ������ ���������������������������������������Bug
+- ������ start ��� end ���������������������Bug
+- ������ ���������������������������������������������������������������������������������������������Bug
+## 2.0.13���2021-07-08���
+- ������ ���������������������������������Bug
+## 2.0.12���2021-07-08���
+- ������ ���������������������������������������������������������������������bug
+## 2.0.11���2021-07-08���
+- ������ ������������������������������������������������������
+## 2.0.10���2021-07-08���
+- ������ ���������������������������������������������������������������������������������������������������������Bug
+- ������ ������������������������������������������������
+## 2.0.9���2021-07-07���
+- ������ maskClick ������
+- ������ ������������������ rpx ���������������Bug���rpx -> px
+- ������ ������������������������������������������bug���['', ''] -> []
+## 2.0.8���2021-07-07���
+- ������ ���������������������������������
+## 2.0.7���2021-07-01���
+- ������ ������ uni-icons ������
+## 2.0.6���2021-05-22���
+- ������ ���������������������������������Bug
+- ������ ������������������������������������������������������
+## 2.0.5���2021-05-20���
+- ������ ���������������������
+## 2.0.4���2021-05-12���
+- ������ ������������������
+## 2.0.3���2021-05-10���
+- ������ ios ������������ '-' ���������������Bug
+- ������ pc ���������������������������������
+## 2.0.2���2021-05-08���
+- ������ ��� admin ���������������������������������bug
+## 2.0.1���2021-05-08���
+- ������ type ��������������������������������� date ��������� datetime
+## 2.0.0���2021-04-30���
+- ���������������������������+���������������������
+ > ���������������������������������������������������������������������type=time��������������� hide-second ��������������������������������������� picker���
+## 1.0.6���2021-03-18���
+- ������ hide-second ���������������������������������������
+- ������ ������������������������������������Bug
+- ������ chang������������2������Bug
+- ������ ��������� end ���������������Bug
+- ������ ��������� nvue ������
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue
new file mode 100644
index 0000000..dba9887
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.vue
@@ -0,0 +1,177 @@
+<template>
+	<view class="uni-calendar-item__weeks-box" :class="{
+		'uni-calendar-item--disable':weeks.disable,
+		'uni-calendar-item--before-checked-x':weeks.beforeMultiple,
+		'uni-calendar-item--multiple': weeks.multiple,
+		'uni-calendar-item--after-checked-x':weeks.afterMultiple,
+		}" @click="choiceDate(weeks)" @mouseenter="handleMousemove(weeks)">
+		<view class="uni-calendar-item__weeks-box-item" :class="{
+				'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate && (calendar.userChecked || !checkHover),
+				'uni-calendar-item--checked-range-text': checkHover,
+				'uni-calendar-item--before-checked':weeks.beforeMultiple,
+				'uni-calendar-item--multiple': weeks.multiple,
+				'uni-calendar-item--after-checked':weeks.afterMultiple,
+				'uni-calendar-item--disable':weeks.disable,
+				}">
+			<text v-if="selected && weeks.extraInfo" class="uni-calendar-item__weeks-box-circle"></text>
+			<text class="uni-calendar-item__weeks-box-text uni-calendar-item__weeks-box-text-disable uni-calendar-item--checked-text">{{weeks.date}}</text>
+		</view>
+		<view :class="{'uni-calendar-item--today': weeks.isToday}"></view>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			weeks: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+			calendar: {
+				type: Object,
+				default: () => {
+					return {}
+				}
+			},
+			selected: {
+				type: Array,
+				default: () => {
+					return []
+				}
+			},
+			checkHover: {
+				type: Boolean,
+				default: false
+			}
+		},
+		methods: {
+			choiceDate(weeks) {
+				this.$emit('change', weeks)
+			},
+			handleMousemove(weeks) {
+				this.$emit('handleMouse', weeks)
+			}
+		}
+	}
+</script>
+
+<style lang="scss" >
+	$uni-primary: #007aff !default;
+
+	.uni-calendar-item__weeks-box {
+		flex: 1;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+		margin: 1px 0;
+		position: relative;
+	}
+
+	.uni-calendar-item__weeks-box-text {
+		font-size: 14px;
+		// font-family: Lato-Bold, Lato;
+		font-weight: bold;
+		color: darken($color: $uni-primary, $amount: 40%);
+	}
+
+	.uni-calendar-item__weeks-box-item {
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+		width: 40px;
+		height: 40px;
+		/* #ifdef H5 */
+		cursor: pointer;
+		/* #endif */
+	}
+
+
+	.uni-calendar-item__weeks-box-circle {
+		position: absolute;
+		top: 5px;
+		right: 5px;
+		width: 8px;
+		height: 8px;
+		border-radius: 8px;
+		background-color: #dd524d;
+
+	}
+
+	.uni-calendar-item__weeks-box .uni-calendar-item--disable {
+		cursor: default;
+	}
+
+	.uni-calendar-item--disable .uni-calendar-item__weeks-box-text-disable {
+		color: #D1D1D1;
+	}
+
+	.uni-calendar-item--today {
+		position: absolute;
+		top: 10px;
+		right: 17%;
+		background-color: #dd524d;
+		width:6px;
+		height: 6px;
+		border-radius: 50%;
+	}
+
+	.uni-calendar-item--extra {
+		color: #dd524d;
+		opacity: 0.8;
+	}
+
+	.uni-calendar-item__weeks-box .uni-calendar-item--checked {
+		background-color: $uni-primary;
+		border-radius: 50%;
+		box-sizing: border-box;
+		border: 3px solid #fff;
+	}
+
+	.uni-calendar-item--checked .uni-calendar-item--checked-text {
+		color: #fff;
+	}
+
+	.uni-calendar-item--multiple .uni-calendar-item--checked-range-text {
+		color: #333;
+	}
+
+	.uni-calendar-item--multiple {
+		background-color:  #F6F7FC;
+		// color: #fff;
+	}
+
+	.uni-calendar-item--multiple .uni-calendar-item--before-checked,
+	.uni-calendar-item--multiple .uni-calendar-item--after-checked {
+		background-color: $uni-primary;
+		border-radius: 50%;
+		box-sizing: border-box;
+		border: 3px solid #F6F7FC;
+	}
+
+	.uni-calendar-item--before-checked .uni-calendar-item--checked-text,
+	.uni-calendar-item--after-checked .uni-calendar-item--checked-text {
+		color: #fff;
+	}
+
+	.uni-calendar-item--before-checked-x {
+		border-top-left-radius: 50px;
+		border-bottom-left-radius: 50px;
+		box-sizing: border-box;
+		background-color: #F6F7FC;
+	}
+
+	.uni-calendar-item--after-checked-x {
+		border-top-right-radius: 50px;
+		border-bottom-right-radius: 50px;
+		background-color: #F6F7FC;
+	}
+</style>
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue
new file mode 100644
index 0000000..3418f49
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.vue
@@ -0,0 +1,928 @@
+<template>
+	<view class="uni-calendar" @mouseleave="leaveCale">
+
+		<view v-if="!insert && show" class="uni-calendar__mask" :class="{'uni-calendar--mask-show':aniMaskShow}"
+			@click="maskClick"></view>
+
+		<view v-if="insert || show" class="uni-calendar__content"
+			:class="{'uni-calendar--fixed':!insert,'uni-calendar--ani-show':aniMaskShow, 'uni-calendar__content-mobile': aniMaskShow}">
+			<view class="uni-calendar__header" :class="{'uni-calendar__header-mobile' :!insert}">
+
+				<view class="uni-calendar__header-btn-box" @click.stop="changeMonth('pre')">
+					<view class="uni-calendar__header-btn uni-calendar--left"></view>
+				</view>
+
+				<picker mode="date" :value="date" fields="month" @change="bindDateChange">
+					<text
+						class="uni-calendar__header-text">{{ (nowDate.year||'') + yearText + ( nowDate.month||'') + monthText}}</text>
+				</picker>
+
+				<view class="uni-calendar__header-btn-box" @click.stop="changeMonth('next')">
+					<view class="uni-calendar__header-btn uni-calendar--right"></view>
+				</view>
+
+				<view v-if="!insert" class="dialog-close" @click="close">
+					<view class="dialog-close-plus" data-id="close"></view>
+					<view class="dialog-close-plus dialog-close-rotate" data-id="close"></view>
+				</view>
+			</view>
+			<view class="uni-calendar__box">
+
+				<view v-if="showMonth" class="uni-calendar__box-bg">
+					<text class="uni-calendar__box-bg-text">{{nowDate.month}}</text>
+				</view>
+
+				<view class="uni-calendar__weeks" style="padding-bottom: 7px;">
+					<view class="uni-calendar__weeks-day">
+						<text class="uni-calendar__weeks-day-text">{{SUNText}}</text>
+					</view>
+					<view class="uni-calendar__weeks-day">
+						<text class="uni-calendar__weeks-day-text">{{MONText}}</text>
+					</view>
+					<view class="uni-calendar__weeks-day">
+						<text class="uni-calendar__weeks-day-text">{{TUEText}}</text>
+					</view>
+					<view class="uni-calendar__weeks-day">
+						<text class="uni-calendar__weeks-day-text">{{WEDText}}</text>
+					</view>
+					<view class="uni-calendar__weeks-day">
+						<text class="uni-calendar__weeks-day-text">{{THUText}}</text>
+					</view>
+					<view class="uni-calendar__weeks-day">
+						<text class="uni-calendar__weeks-day-text">{{FRIText}}</text>
+					</view>
+					<view class="uni-calendar__weeks-day">
+						<text class="uni-calendar__weeks-day-text">{{SATText}}</text>
+					</view>
+				</view>
+
+				<view class="uni-calendar__weeks" v-for="(item,weekIndex) in weeks" :key="weekIndex">
+					<view class="uni-calendar__weeks-item" v-for="(weeks,weeksIndex) in item" :key="weeksIndex">
+						<calendar-item class="uni-calendar-item--hook" :weeks="weeks" :calendar="calendar"
+							:selected="selected" :checkHover="range" @change="choiceDate"
+							@handleMouse="handleMouse">
+						</calendar-item>
+					</view>
+				</view>
+			</view>
+
+			<view v-if="!insert && !range && hasTime" class="uni-date-changed uni-calendar--fixed-top"
+				style="padding: 0 80px;">
+				<view class="uni-date-changed--time-date">{{tempSingleDate ? tempSingleDate : selectDateText}}</view>
+				<time-picker type="time" :start="timepickerStartTime" :end="timepickerEndTime" v-model="time"
+					:disabled="!tempSingleDate" :border="false" :hide-second="hideSecond" class="time-picker-style">
+				</time-picker>
+			</view>
+
+			<view v-if="!insert && range && hasTime" class="uni-date-changed uni-calendar--fixed-top">
+				<view class="uni-date-changed--time-start">
+					<view class="uni-date-changed--time-date">{{tempRange.before ? tempRange.before : startDateText}}
+					</view>
+					<time-picker type="time" :start="timepickerStartTime" v-model="timeRange.startTime" :border="false"
+						:hide-second="hideSecond" :disabled="!tempRange.before" class="time-picker-style">
+					</time-picker>
+				</view>
+				<view style="line-height: 50px;">
+					<uni-icons type="arrowthinright" color="#999"></uni-icons>
+				</view>
+				<view class="uni-date-changed--time-end">
+					<view class="uni-date-changed--time-date">{{tempRange.after ? tempRange.after : endDateText}}</view>
+					<time-picker type="time" :end="timepickerEndTime" v-model="timeRange.endTime" :border="false"
+						:hide-second="hideSecond" :disabled="!tempRange.after" class="time-picker-style">
+					</time-picker>
+				</view>
+			</view>
+
+			<view v-if="!insert" class="uni-date-changed uni-date-btn--ok">
+				<view class="uni-datetime-picker--btn" @click="confirm">{{confirmText}}</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import { Calendar, getDate, getTime } from './util.js';
+	import calendarItem from './calendar-item.vue'
+	import timePicker from './time-picker.vue'
+
+	import { initVueI18n } from '@dcloudio/uni-i18n'
+	import i18nMessages from './i18n/index.js'
+	const { t } = initVueI18n(i18nMessages)
+
+	/**
+	 * Calendar ������
+	 * @description ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=56
+	 * @property {String} date ���������������������������������������
+	 * @property {String} startDate ������������������-������������
+	 * @property {String} endDate ������������������-������������
+	 * @property {Boolean} range ������������
+	 * @property {Boolean} insert = [true|false] ������������,���������false
+	 * 	@value true ������������
+	 * 	@value false ������������
+	 * @property {Boolean} clearDate = [true|false] ������������������������������������������
+	 * @property {Array} selected ���������������������[{date: '2019-06-27', info: '������', data: { custom: '���������������', name: '������������������',xxx:xxx... }}]
+	 * @property {Boolean} showMonth ���������������������������
+	 * @property {[String} defaultValue ���������������������������������������
+	 * @event {Function} change ���������������`insert :ture` ���������
+	 * @event {Function} confirm ������������`insert :false` ���������
+	 * @event {Function} monthSwitch ���������������������
+	 * @example <uni-calendar :insert="true" :start-date="'2019-3-2'":end-date="'2019-5-20'"@change="change" />
+	 */
+	export default {
+		components: {
+			calendarItem,
+			timePicker
+		},
+		props: {
+			date: {
+				type: String,
+				default: ''
+			},
+			defTime: {
+				type: [String, Object],
+				default: ''
+			},
+			selectableTimes: {
+				type: [Object],
+				default () {
+					return {}
+				}
+			},
+			selected: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			startDate: {
+				type: String,
+				default: ''
+			},
+			endDate: {
+				type: String,
+				default: ''
+			},
+      startPlaceholder: {
+        type: String,
+				default: ''
+			},
+			endPlaceholder: {
+				type: String,
+				default: ''
+			},
+			range: {
+				type: Boolean,
+				default: false
+			},
+			hasTime: {
+				type: Boolean,
+				default: false
+			},
+			insert: {
+				type: Boolean,
+				default: true
+			},
+			showMonth: {
+				type: Boolean,
+				default: true
+			},
+			clearDate: {
+				type: Boolean,
+				default: true
+			},
+			checkHover: {
+				type: Boolean,
+				default: true
+			},
+			hideSecond: {
+				type: [Boolean],
+				default: false
+			},
+			pleStatus: {
+				type: Object,
+				default () {
+					return {
+						before: '',
+						after: '',
+						data: [],
+						fulldate: ''
+					}
+				}
+			},
+      defaultValue: {
+        type: [String, Object, Array],
+        default: ''
+      }
+		},
+		data() {
+			return {
+				show: false,
+				weeks: [],
+				calendar: {},
+				nowDate: {},
+				aniMaskShow: false,
+				firstEnter: true,
+				time: '',
+				timeRange: {
+					startTime: '',
+					endTime: ''
+				},
+				tempSingleDate: '',
+				tempRange: {
+					before: '',
+					after: ''
+				}
+			}
+		},
+		watch: {
+			date: {
+				immediate: true,
+				handler(newVal) {
+					if (!this.range) {
+						this.tempSingleDate = newVal
+						setTimeout(() => {
+							this.init(newVal)
+						}, 100)
+					}
+				}
+			},
+			defTime: {
+				immediate: true,
+				handler(newVal) {
+					if (!this.range) {
+						this.time = newVal
+					} else {
+						this.timeRange.startTime = newVal.start
+						this.timeRange.endTime = newVal.end
+					}
+				}
+			},
+			startDate(val) {
+				// ��������������� watch ������ created
+				if(!this.cale){
+					return
+				}
+				this.cale.setStartDate(val)
+				this.cale.setDate(this.nowDate.fullDate)
+				this.weeks = this.cale.weeks
+			},
+			endDate(val) {
+				// ��������������� watch ������ created
+				if(!this.cale){
+					return
+				}
+				this.cale.setEndDate(val)
+				this.cale.setDate(this.nowDate.fullDate)
+				this.weeks = this.cale.weeks
+			},
+			selected(newVal) {
+				// ��������������� watch ������ created
+				if(!this.cale){
+					return
+				}
+				this.cale.setSelectInfo(this.nowDate.fullDate, newVal)
+				this.weeks = this.cale.weeks
+			},
+			pleStatus: {
+				immediate: true,
+				handler(newVal) {
+					const {
+						before,
+						after,
+						fulldate,
+						which
+					} = newVal
+					this.tempRange.before = before
+					this.tempRange.after = after
+					setTimeout(() => {
+						if (fulldate) {
+							this.cale.setHoverMultiple(fulldate)
+							if (before && after) {
+								this.cale.lastHover = true
+								if (this.rangeWithinMonth(after, before)) return
+								this.setDate(before)
+							} else {
+								this.cale.setMultiple(fulldate)
+								this.setDate(this.nowDate.fullDate)
+								this.calendar.fullDate = ''
+								this.cale.lastHover = false
+							}
+						} else {
+              // ��������������� watch ������ created
+              if(!this.cale){
+                return
+              }
+
+							this.cale.setDefaultMultiple(before, after)
+							if (which === 'left' && before) {
+								this.setDate(before)
+								this.weeks = this.cale.weeks
+							} else if(after) {
+								this.setDate(after)
+								this.weeks = this.cale.weeks
+							}
+							this.cale.lastHover = true
+						}
+					}, 16)
+				}
+			}
+		},
+		computed: {
+			timepickerStartTime() {
+				const activeDate = this.range ? this.tempRange.before : this.calendar.fullDate
+				return activeDate === this.startDate ? this.selectableTimes.start : ''
+			},
+			timepickerEndTime() {
+				const activeDate = this.range ? this.tempRange.after : this.calendar.fullDate
+				return activeDate === this.endDate ? this.selectableTimes.end : ''
+			},
+			/**
+			 * for i18n
+			 */
+			selectDateText() {
+				return t("uni-datetime-picker.selectDate")
+			},
+			startDateText() {
+				return this.startPlaceholder || t("uni-datetime-picker.startDate")
+			},
+			endDateText() {
+				return this.endPlaceholder || t("uni-datetime-picker.endDate")
+			},
+			okText() {
+				return t("uni-datetime-picker.ok")
+			},
+			yearText() {
+				return t("uni-datetime-picker.year")
+			},
+			monthText() {
+				return t("uni-datetime-picker.month")
+			},
+			MONText() {
+				return t("uni-calender.MON")
+			},
+			TUEText() {
+				return t("uni-calender.TUE")
+			},
+			WEDText() {
+				return t("uni-calender.WED")
+			},
+			THUText() {
+				return t("uni-calender.THU")
+			},
+			FRIText() {
+				return t("uni-calender.FRI")
+			},
+			SATText() {
+				return t("uni-calender.SAT")
+			},
+			SUNText() {
+				return t("uni-calender.SUN")
+			},
+			confirmText() {
+				return t("uni-calender.confirm")
+			},
+		},
+		created() {
+			// ������������������������
+			this.cale = new Calendar({
+				selected: this.selected,
+				startDate: this.startDate,
+				endDate: this.endDate,
+				range: this.range,
+			})
+			// ���������������
+			this.init(this.date)
+		},
+		methods: {
+			leaveCale() {
+				this.firstEnter = true
+			},
+			handleMouse(weeks) {
+				if (weeks.disable) return
+				if (this.cale.lastHover) return
+				let {
+					before,
+					after
+				} = this.cale.multipleStatus
+				if (!before) return
+				this.calendar = weeks
+				// ���������������
+				this.cale.setHoverMultiple(this.calendar.fullDate)
+				this.weeks = this.cale.weeks
+				// hover������������������������������������������
+				if (this.firstEnter) {
+					this.$emit('firstEnterCale', this.cale.multipleStatus)
+					this.firstEnter = false
+				}
+			},
+			rangeWithinMonth(A, B) {
+				const [yearA, monthA] = A.split('-')
+				const [yearB, monthB] = B.split('-')
+				return yearA === yearB && monthA === monthB
+			},
+			// ������������������
+			maskClick() {
+        this.close()
+				this.$emit('maskClose')
+			},
+
+			clearCalender() {
+				if (this.range) {
+					this.timeRange.startTime = ''
+					this.timeRange.endTime = ''
+					this.tempRange.before = ''
+					this.tempRange.after = ''
+					this.cale.multipleStatus.before = ''
+					this.cale.multipleStatus.after = ''
+					this.cale.multipleStatus.data = []
+					this.cale.lastHover = false
+				} else {
+					this.time = ''
+					this.tempSingleDate = ''
+				}
+				this.calendar.fullDate = ''
+				this.setDate(new Date())
+			},
+
+			bindDateChange(e) {
+				const value = e.detail.value + '-1'
+				this.setDate(value)
+			},
+			/**
+			 * ���������������������
+			 * @param {Object} date
+			 */
+			init(date) {
+        // ��������������� watch ������ created
+				if(!this.cale){
+					return
+				}
+				this.cale.setDate(date || new Date())
+				this.weeks = this.cale.weeks
+				this.nowDate = this.cale.getInfo(date)
+        this.calendar = {...this.nowDate}
+        if(!date){
+          // ������date���������������������������
+          this.calendar.fullDate = ''
+          if(this.defaultValue && !this.range){
+            // ���������������������������������������
+            const defaultDate = new Date(this.defaultValue)
+            const fullDate = getDate(defaultDate)
+            const year = defaultDate.getFullYear()
+            const month = defaultDate.getMonth()+1
+            const date = defaultDate.getDate()
+            const day = defaultDate.getDay()
+            this.calendar = {
+              fullDate,
+              year,
+              month,
+              date,
+              day
+            },
+            this.tempSingleDate = fullDate
+            this.time = getTime(defaultDate, this.hideSecond)
+          }
+        }
+			},
+			/**
+			 * ������������������
+			 */
+			open() {
+				// ������������������������������
+				if (this.clearDate && !this.insert) {
+					this.cale.cleanMultipleStatus()
+					this.init(this.date)
+				}
+				this.show = true
+				this.$nextTick(() => {
+					setTimeout(() => {
+						this.aniMaskShow = true
+					}, 50)
+				})
+			},
+			/**
+			 * ������������������
+			 */
+			close() {
+				this.aniMaskShow = false
+				this.$nextTick(() => {
+					setTimeout(() => {
+						this.show = false
+						this.$emit('close')
+					}, 300)
+				})
+			},
+			/**
+			 * ������������
+			 */
+			confirm() {
+				this.setEmit('confirm')
+				this.close()
+			},
+			/**
+			 * ������������
+			 */
+			change() {
+				if (!this.insert) return
+				this.setEmit('change')
+			},
+			/**
+			 * ������������������
+			 */
+			monthSwitch() {
+				let {
+					year,
+					month
+				} = this.nowDate
+				this.$emit('monthSwitch', {
+					year,
+					month: Number(month)
+				})
+			},
+			/**
+			 * ������������
+			 * @param {Object} name
+			 */
+			setEmit(name) {
+        if(!this.range){
+					if(!this.calendar.fullDate){
+					  this.calendar = this.cale.getInfo(new Date())
+					  this.tempSingleDate = this.calendar.fullDate
+					}
+					if(this.hasTime && !this.time) {
+					  this.time = getTime(new Date(), this.hideSecond)
+					}
+				}
+				let {
+					year,
+					month,
+					date,
+					fullDate,
+					extraInfo
+				} = this.calendar
+				this.$emit(name, {
+					range: this.cale.multipleStatus,
+					year,
+					month,
+					date,
+					time: this.time,
+					timeRange: this.timeRange,
+					fulldate: fullDate,
+					extraInfo: extraInfo || {}
+				})
+			},
+			/**
+			 * ���������������
+			 * @param {Object} weeks
+			 */
+			choiceDate(weeks) {
+				if (weeks.disable) return
+				this.calendar = weeks
+				this.calendar.userChecked = true
+				// ������������
+				this.cale.setMultiple(this.calendar.fullDate, true)
+				this.weeks = this.cale.weeks
+				this.tempSingleDate = this.calendar.fullDate
+				const beforeDate = new Date(this.cale.multipleStatus.before).getTime()
+				const afterDate = new Date(this.cale.multipleStatus.after).getTime()
+				if (beforeDate > afterDate && afterDate) {
+					this.tempRange.before = this.cale.multipleStatus.after
+					this.tempRange.after = this.cale.multipleStatus.before
+				} else {
+					this.tempRange.before = this.cale.multipleStatus.before
+					this.tempRange.after = this.cale.multipleStatus.after
+				}
+				this.change()
+			},
+      changeMonth(type) {
+        let newDate
+        if(type === 'pre') {
+          newDate = this.cale.getPreMonthObj(this.nowDate.fullDate).fullDate
+        } else if(type === 'next') {
+          newDate = this.cale.getNextMonthObj(this.nowDate.fullDate).fullDate
+        }
+
+        this.setDate(newDate)
+				this.monthSwitch()
+      },
+			/**
+			 * ������������
+			 * @param {Object} date
+			 */
+			setDate(date) {
+				this.cale.setDate(date)
+				this.weeks = this.cale.weeks
+				this.nowDate = this.cale.getInfo(date)
+			}
+		}
+	}
+</script>
+
+<style lang="scss" >
+	$uni-primary: #007aff !default;
+
+	.uni-calendar {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+	}
+
+	.uni-calendar__mask {
+		position: fixed;
+		bottom: 0;
+		top: 0;
+		left: 0;
+		right: 0;
+		background-color: rgba(0, 0, 0, 0.4);
+		transition-property: opacity;
+		transition-duration: 0.3s;
+		opacity: 0;
+		/* #ifndef APP-NVUE */
+		z-index: 99;
+		/* #endif */
+	}
+
+	.uni-calendar--mask-show {
+		opacity: 1
+	}
+
+	.uni-calendar--fixed {
+		position: fixed;
+		bottom: calc(var(--window-bottom));
+		left: 0;
+		right: 0;
+		transition-property: transform;
+		transition-duration: 0.3s;
+		transform: translateY(460px);
+		/* #ifndef APP-NVUE */
+		z-index: 99;
+		/* #endif */
+	}
+
+	.uni-calendar--ani-show {
+		transform: translateY(0);
+	}
+
+	.uni-calendar__content {
+		background-color: #fff;
+	}
+
+	.uni-calendar__content-mobile {
+		border-top-left-radius: 10px;
+		border-top-right-radius: 10px;
+		box-shadow: 0px 0px 5px 3px rgba(0, 0, 0, 0.1);
+	}
+
+	.uni-calendar__header {
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		justify-content: center;
+		align-items: center;
+		height: 50px;
+	}
+
+	.uni-calendar__header-mobile {
+		padding: 10px;
+		padding-bottom: 0;
+	}
+
+	.uni-calendar--fixed-top {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		justify-content: space-between;
+		border-top-color: rgba(0, 0, 0, 0.4);
+		border-top-style: solid;
+		border-top-width: 1px;
+	}
+
+	.uni-calendar--fixed-width {
+		width: 50px;
+	}
+
+	.uni-calendar__backtoday {
+		position: absolute;
+		right: 0;
+		top: 25rpx;
+		padding: 0 5px;
+		padding-left: 10px;
+		height: 25px;
+		line-height: 25px;
+		font-size: 12px;
+		border-top-left-radius: 25px;
+		border-bottom-left-radius: 25px;
+		color: #fff;
+		background-color: #f1f1f1;
+	}
+
+	.uni-calendar__header-text {
+		text-align: center;
+		width: 100px;
+		font-size: 15px;
+		color: #666;
+	}
+
+	.uni-calendar__button-text {
+		text-align: center;
+		width: 100px;
+		font-size: 14px;
+		color: $uni-primary;
+		/* #ifndef APP-NVUE */
+		letter-spacing: 3px;
+		/* #endif */
+	}
+
+	.uni-calendar__header-btn-box {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+		justify-content: center;
+		width: 50px;
+		height: 50px;
+	}
+
+	.uni-calendar__header-btn {
+		width: 9px;
+		height: 9px;
+		border-left-color: #808080;
+		border-left-style: solid;
+		border-left-width: 1px;
+		border-top-color: #555555;
+		border-top-style: solid;
+		border-top-width: 1px;
+	}
+
+	.uni-calendar--left {
+		transform: rotate(-45deg);
+	}
+
+	.uni-calendar--right {
+		transform: rotate(135deg);
+	}
+
+
+	.uni-calendar__weeks {
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+	}
+
+	.uni-calendar__weeks-item {
+		flex: 1;
+	}
+
+	.uni-calendar__weeks-day {
+		flex: 1;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+		height: 40px;
+		border-bottom-color: #F5F5F5;
+		border-bottom-style: solid;
+		border-bottom-width: 1px;
+	}
+
+	.uni-calendar__weeks-day-text {
+		font-size: 12px;
+		color: #B2B2B2;
+	}
+
+	.uni-calendar__box {
+		position: relative;
+		// padding: 0 10px;
+		padding-bottom: 7px;
+	}
+
+	.uni-calendar__box-bg {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		justify-content: center;
+		align-items: center;
+		position: absolute;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+	}
+
+	.uni-calendar__box-bg-text {
+		font-size: 200px;
+		font-weight: bold;
+		color: #999;
+		opacity: 0.1;
+		text-align: center;
+		/* #ifndef APP-NVUE */
+		line-height: 1;
+		/* #endif */
+	}
+
+	.uni-date-changed {
+		padding: 0 10px;
+		// line-height: 50px;
+		text-align: center;
+		color: #333;
+		border-top-color: #DCDCDC;
+		;
+		border-top-style: solid;
+		border-top-width: 1px;
+		flex: 1;
+	}
+
+	.uni-date-btn--ok {
+		padding: 20px 15px;
+	}
+
+	.uni-date-changed--time-start {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		align-items: center;
+	}
+
+	.uni-date-changed--time-end {
+		/* #ifndef APP-NVUE */
+    display: flex;
+		/* #endif */
+		align-items: center;
+	}
+
+	.uni-date-changed--time-date {
+    color: #999;
+		line-height: 50px;
+    /* #ifdef MP-TOUTIAO */
+    font-size: 16px;
+    /* #endif */
+		margin-right: 5px;
+		// opacity: 0.6;
+	}
+
+	.time-picker-style {
+		// width: 62px;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		justify-content: center;
+		align-items: center
+	}
+
+	.mr-10 {
+		margin-right: 10px;
+	}
+
+	.dialog-close {
+		position: absolute;
+		top: 0;
+		right: 0;
+		bottom: 0;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+		padding: 0 25px;
+		margin-top: 10px;
+	}
+
+	.dialog-close-plus {
+		width: 16px;
+		height: 2px;
+		background-color: #737987;
+		border-radius: 2px;
+		transform: rotate(45deg);
+	}
+
+	.dialog-close-rotate {
+		position: absolute;
+		transform: rotate(-45deg);
+	}
+
+	.uni-datetime-picker--btn {
+		border-radius: 100px;
+		height: 40px;
+		line-height: 40px;
+		background-color: $uni-primary;
+		color: #fff;
+		font-size: 16px;
+		letter-spacing: 2px;
+	}
+
+	/* #ifndef APP-NVUE */
+	.uni-datetime-picker--btn:active {
+		opacity: 0.7;
+	}
+	/* #endif */
+</style>
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json
new file mode 100644
index 0000000..024f22f
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/en.json
@@ -0,0 +1,22 @@
+{
+	"uni-datetime-picker.selectDate": "select date",
+	"uni-datetime-picker.selectTime": "select time",
+	"uni-datetime-picker.selectDateTime": "select date and time",
+	"uni-datetime-picker.startDate": "start date",
+	"uni-datetime-picker.endDate": "end date",
+	"uni-datetime-picker.startTime": "start time",
+	"uni-datetime-picker.endTime": "end time",
+	"uni-datetime-picker.ok": "ok",
+	"uni-datetime-picker.clear": "clear",
+	"uni-datetime-picker.cancel": "cancel",
+	"uni-datetime-picker.year": "-",
+	"uni-datetime-picker.month": "",
+	"uni-calender.MON": "MON",
+	"uni-calender.TUE": "TUE",
+	"uni-calender.WED": "WED",
+	"uni-calender.THU": "THU",
+	"uni-calender.FRI": "FRI",
+	"uni-calender.SAT": "SAT",
+	"uni-calender.SUN": "SUN",
+	"uni-calender.confirm": "confirm"
+}
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js
new file mode 100644
index 0000000..de7509c
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/index.js
@@ -0,0 +1,8 @@
+import en from './en.json'
+import zhHans from './zh-Hans.json'
+import zhHant from './zh-Hant.json'
+export default {
+	en,
+	'zh-Hans': zhHans,
+	'zh-Hant': zhHant
+}
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json
new file mode 100644
index 0000000..d2df5e7
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hans.json
@@ -0,0 +1,22 @@
+{
+	"uni-datetime-picker.selectDate": "������������",
+	"uni-datetime-picker.selectTime": "������������",
+	"uni-datetime-picker.selectDateTime": "������������������",
+	"uni-datetime-picker.startDate": "������������",
+	"uni-datetime-picker.endDate": "������������",
+	"uni-datetime-picker.startTime": "������������",
+	"uni-datetime-picker.endTime": "������������",
+	"uni-datetime-picker.ok": "������",
+	"uni-datetime-picker.clear": "������",
+	"uni-datetime-picker.cancel": "������",
+	"uni-datetime-picker.year": "���",
+	"uni-datetime-picker.month": "���",
+	"uni-calender.SUN": "���",
+	"uni-calender.MON": "���",
+	"uni-calender.TUE": "���",
+	"uni-calender.WED": "���",
+	"uni-calender.THU": "���",
+	"uni-calender.FRI": "���",
+	"uni-calender.SAT": "���",
+	"uni-calender.confirm": "������"
+}
\ No newline at end of file
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json
new file mode 100644
index 0000000..d23fa3c
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/i18n/zh-Hant.json
@@ -0,0 +1,22 @@
+{
+  "uni-datetime-picker.selectDate": "������������",
+  "uni-datetime-picker.selectTime": "������������",
+  "uni-datetime-picker.selectDateTime": "������������������",
+  "uni-datetime-picker.startDate": "������������",
+  "uni-datetime-picker.endDate": "������������",
+  "uni-datetime-picker.startTime": "������������",
+  "uni-datetime-picker.endTime": "������������",
+  "uni-datetime-picker.ok": "������",
+  "uni-datetime-picker.clear": "������",
+  "uni-datetime-picker.cancel": "������",
+  "uni-datetime-picker.year": "���",
+  "uni-datetime-picker.month": "���",
+  "uni-calender.SUN": "���",
+  "uni-calender.MON": "���",
+  "uni-calender.TUE": "���",
+  "uni-calender.WED": "���",
+  "uni-calender.THU": "���",
+  "uni-calender.FRI": "���",
+  "uni-calender.SAT": "���",
+  "uni-calender.confirm": "������"
+}
\ No newline at end of file
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue
new file mode 100644
index 0000000..81a042a
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.vue
@@ -0,0 +1,934 @@
+<template>
+	<view class="uni-datetime-picker">
+		<view @click="initTimePicker">
+			<slot>
+				<view class="uni-datetime-picker-timebox-pointer"
+					:class="{'uni-datetime-picker-disabled': disabled, 'uni-datetime-picker-timebox': border}">
+					<text class="uni-datetime-picker-text">{{time}}</text>
+					<view v-if="!time" class="uni-datetime-picker-time">
+						<text class="uni-datetime-picker-text">{{selectTimeText}}</text>
+					</view>
+				</view>
+			</slot>
+		</view>
+		<view v-if="visible" id="mask" class="uni-datetime-picker-mask" @click="tiggerTimePicker"></view>
+		<view v-if="visible" class="uni-datetime-picker-popup" :class="[dateShow && timeShow ? '' : 'fix-nvue-height']"
+			:style="fixNvueBug">
+			<view class="uni-title">
+				<text class="uni-datetime-picker-text">{{selectTimeText}}</text>
+			</view>
+			<view v-if="dateShow" class="uni-datetime-picker__container-box">
+				<picker-view class="uni-datetime-picker-view" :indicator-style="indicatorStyle" :value="ymd"
+					@change="bindDateChange">
+					<picker-view-column>
+						<view class="uni-datetime-picker-item" v-for="(item,index) in years" :key="index">
+							<text class="uni-datetime-picker-item">{{lessThanTen(item)}}</text>
+						</view>
+					</picker-view-column>
+					<picker-view-column>
+						<view class="uni-datetime-picker-item" v-for="(item,index) in months" :key="index">
+							<text class="uni-datetime-picker-item">{{lessThanTen(item)}}</text>
+						</view>
+					</picker-view-column>
+					<picker-view-column>
+						<view class="uni-datetime-picker-item" v-for="(item,index) in days" :key="index">
+							<text class="uni-datetime-picker-item">{{lessThanTen(item)}}</text>
+						</view>
+					</picker-view-column>
+				</picker-view>
+				<!-- ������ nvue ��������������� -->
+				<text class="uni-datetime-picker-sign sign-left">-</text>
+				<text class="uni-datetime-picker-sign sign-right">-</text>
+			</view>
+			<view v-if="timeShow" class="uni-datetime-picker__container-box">
+				<picker-view class="uni-datetime-picker-view" :class="[hideSecond ? 'time-hide-second' : '']"
+					:indicator-style="indicatorStyle" :value="hms" @change="bindTimeChange">
+					<picker-view-column>
+						<view class="uni-datetime-picker-item" v-for="(item,index) in hours" :key="index">
+							<text class="uni-datetime-picker-item">{{lessThanTen(item)}}</text>
+						</view>
+					</picker-view-column>
+					<picker-view-column>
+						<view class="uni-datetime-picker-item" v-for="(item,index) in minutes" :key="index">
+							<text class="uni-datetime-picker-item">{{lessThanTen(item)}}</text>
+						</view>
+					</picker-view-column>
+					<picker-view-column v-if="!hideSecond">
+						<view class="uni-datetime-picker-item" v-for="(item,index) in seconds" :key="index">
+							<text class="uni-datetime-picker-item">{{lessThanTen(item)}}</text>
+						</view>
+					</picker-view-column>
+				</picker-view>
+				<!-- ������ nvue ��������������� -->
+				<text class="uni-datetime-picker-sign" :class="[hideSecond ? 'sign-center' : 'sign-left']">:</text>
+				<text v-if="!hideSecond" class="uni-datetime-picker-sign sign-right">:</text>
+			</view>
+			<view class="uni-datetime-picker-btn">
+				<view @click="clearTime">
+					<text class="uni-datetime-picker-btn-text">{{clearText}}</text>
+				</view>
+				<view class="uni-datetime-picker-btn-group">
+					<view class="uni-datetime-picker-cancel" @click="tiggerTimePicker">
+						<text class="uni-datetime-picker-btn-text">{{cancelText}}</text>
+					</view>
+					<view @click="setTime">
+						<text class="uni-datetime-picker-btn-text">{{okText}}</text>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import { initVueI18n } from '@dcloudio/uni-i18n'
+	import i18nMessages from './i18n/index.js'
+	const {	t	} = initVueI18n(i18nMessages)
+  import { fixIosDateFormat } from './util'
+
+	/**
+	 * DatetimePicker ���������������
+	 * @description ���������������������������������������������
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=xxx
+	 * @property {String} type = [datetime | date | time] ������������
+	 * @property {Boolean} multiple = [true|false] ������������
+	 * @property {String|Number} value ���������
+	 * @property {String|Number} start ���������������������
+	 * @property {String|Number} end ���������������������
+	 * @property {String} return-type = [timestamp | string]
+	 * @event {Function} change  ������������������������
+	 */
+
+	export default {
+		name: 'UniDatetimePicker',
+		data() {
+			return {
+				indicatorStyle: `height: 50px;`,
+				visible: false,
+				fixNvueBug: {},
+				dateShow: true,
+				timeShow: true,
+				title: '���������������',
+				// ���������������������
+				time: '',
+				// ���������������������������
+				year: 1920,
+				month: 0,
+				day: 0,
+				hour: 0,
+				minute: 0,
+				second: 0,
+				// ������������
+				startYear: 1920,
+				startMonth: 1,
+				startDay: 1,
+				startHour: 0,
+				startMinute: 0,
+				startSecond: 0,
+				// ������������
+				endYear: 2120,
+				endMonth: 12,
+				endDay: 31,
+				endHour: 23,
+				endMinute: 59,
+				endSecond: 59,
+			}
+		},
+		props: {
+			type: {
+				type: String,
+				default: 'datetime'
+			},
+			value: {
+				type: [String, Number],
+				default: ''
+			},
+			modelValue: {
+				type: [String, Number],
+				default: ''
+			},
+			start: {
+				type: [Number, String],
+				default: ''
+			},
+			end: {
+				type: [Number, String],
+				default: ''
+			},
+			returnType: {
+				type: String,
+				default: 'string'
+			},
+			disabled: {
+				type: [Boolean, String],
+				default: false
+			},
+			border: {
+				type: [Boolean, String],
+				default: true
+			},
+			hideSecond: {
+				type: [Boolean, String],
+				default: false
+			}
+		},
+		watch: {
+			// #ifndef VUE3
+			value: {
+				handler(newVal) {
+          if (newVal) {
+            this.parseValue(fixIosDateFormat(newVal))
+						this.initTime(false)
+					} else {
+            this.time = ''
+						this.parseValue(Date.now())
+					}
+				},
+				immediate: true
+			},
+			// #endif
+			// #ifdef VUE3
+			modelValue: {
+        handler(newVal) {
+          if (newVal) {
+						this.parseValue(fixIosDateFormat(newVal))
+						this.initTime(false)
+					} else {
+						this.time = ''
+						this.parseValue(Date.now())
+					}
+				},
+				immediate: true
+			},
+			// #endif
+			type: {
+				handler(newValue) {
+					if (newValue === 'date') {
+						this.dateShow = true
+						this.timeShow = false
+						this.title = '������'
+					} else if (newValue === 'time') {
+						this.dateShow = false
+						this.timeShow = true
+						this.title = '������'
+					} else {
+						this.dateShow = true
+						this.timeShow = true
+						this.title = '���������������'
+					}
+				},
+				immediate: true
+			},
+			start: {
+				handler(newVal) {
+					this.parseDatetimeRange(fixIosDateFormat(newVal), 'start')
+				},
+				immediate: true
+			},
+			end: {
+				handler(newVal) {
+					this.parseDatetimeRange(fixIosDateFormat(newVal), 'end')
+				},
+				immediate: true
+			},
+
+			// ���������������������������������������������������������������������������������������������������������������������������������������
+			months(newVal) {
+				this.checkValue('month', this.month, newVal)
+			},
+			days(newVal) {
+				this.checkValue('day', this.day, newVal)
+			},
+			hours(newVal) {
+				this.checkValue('hour', this.hour, newVal)
+			},
+			minutes(newVal) {
+				this.checkValue('minute', this.minute, newVal)
+			},
+			seconds(newVal) {
+				this.checkValue('second', this.second, newVal)
+			}
+		},
+		computed: {
+			// ���������������������������������������������������
+			years() {
+				return this.getCurrentRange('year')
+			},
+
+			months() {
+				return this.getCurrentRange('month')
+			},
+
+			days() {
+				return this.getCurrentRange('day')
+			},
+
+			hours() {
+				return this.getCurrentRange('hour')
+			},
+
+			minutes() {
+				return this.getCurrentRange('minute')
+			},
+
+			seconds() {
+				return this.getCurrentRange('second')
+			},
+
+			// picker ���������������
+			ymd() {
+				return [this.year - this.minYear, this.month - this.minMonth, this.day - this.minDay]
+			},
+			hms() {
+				return [this.hour - this.minHour, this.minute - this.minMinute, this.second - this.minSecond]
+			},
+
+			// ������ date ��� start
+			currentDateIsStart() {
+				return this.year === this.startYear && this.month === this.startMonth && this.day === this.startDay
+			},
+
+			// ������ date ��� end
+			currentDateIsEnd() {
+				return this.year === this.endYear && this.month === this.endMonth && this.day === this.endDay
+			},
+
+			// ���������������������������������������������������������������
+			minYear() {
+				return this.startYear
+			},
+			maxYear() {
+				return this.endYear
+			},
+			minMonth() {
+				if (this.year === this.startYear) {
+					return this.startMonth
+				} else {
+					return 1
+				}
+			},
+			maxMonth() {
+				if (this.year === this.endYear) {
+					return this.endMonth
+				} else {
+					return 12
+				}
+			},
+			minDay() {
+				if (this.year === this.startYear && this.month === this.startMonth) {
+					return this.startDay
+				} else {
+					return 1
+				}
+			},
+			maxDay() {
+				if (this.year === this.endYear && this.month === this.endMonth) {
+					return this.endDay
+				} else {
+					return this.daysInMonth(this.year, this.month)
+				}
+			},
+			minHour() {
+				if (this.type === 'datetime') {
+					if (this.currentDateIsStart) {
+						return this.startHour
+					} else {
+						return 0
+					}
+				}
+				if (this.type === 'time') {
+					return this.startHour
+				}
+			},
+			maxHour() {
+				if (this.type === 'datetime') {
+					if (this.currentDateIsEnd) {
+						return this.endHour
+					} else {
+						return 23
+					}
+				}
+				if (this.type === 'time') {
+					return this.endHour
+				}
+			},
+			minMinute() {
+				if (this.type === 'datetime') {
+					if (this.currentDateIsStart && this.hour === this.startHour) {
+						return this.startMinute
+					} else {
+						return 0
+					}
+				}
+				if (this.type === 'time') {
+					if (this.hour === this.startHour) {
+						return this.startMinute
+					} else {
+						return 0
+					}
+				}
+			},
+			maxMinute() {
+				if (this.type === 'datetime') {
+					if (this.currentDateIsEnd && this.hour === this.endHour) {
+						return this.endMinute
+					} else {
+						return 59
+					}
+				}
+				if (this.type === 'time') {
+					if (this.hour === this.endHour) {
+						return this.endMinute
+					} else {
+						return 59
+					}
+				}
+			},
+			minSecond() {
+				if (this.type === 'datetime') {
+					if (this.currentDateIsStart && this.hour === this.startHour && this.minute === this.startMinute) {
+						return this.startSecond
+					} else {
+						return 0
+					}
+				}
+				if (this.type === 'time') {
+					if (this.hour === this.startHour && this.minute === this.startMinute) {
+						return this.startSecond
+					} else {
+						return 0
+					}
+				}
+			},
+			maxSecond() {
+				if (this.type === 'datetime') {
+					if (this.currentDateIsEnd && this.hour === this.endHour && this.minute === this.endMinute) {
+						return this.endSecond
+					} else {
+						return 59
+					}
+				}
+				if (this.type === 'time') {
+					if (this.hour === this.endHour && this.minute === this.endMinute) {
+						return this.endSecond
+					} else {
+						return 59
+					}
+				}
+			},
+
+			/**
+			 * for i18n
+			 */
+			selectTimeText() {
+				return t("uni-datetime-picker.selectTime")
+			},
+			okText() {
+				return t("uni-datetime-picker.ok")
+			},
+			clearText() {
+				return t("uni-datetime-picker.clear")
+			},
+			cancelText() {
+				return t("uni-datetime-picker.cancel")
+			}
+		},
+
+		mounted() {
+			// #ifdef APP-NVUE
+			const res = uni.getSystemInfoSync();
+			this.fixNvueBug = {
+				top: res.windowHeight / 2,
+				left: res.windowWidth / 2
+			}
+			// #endif
+		},
+
+		methods: {
+			/**
+			 * @param {Object} item
+			 * ������ 10 ��������������� 0
+			 */
+
+			lessThanTen(item) {
+				return item < 10 ? '0' + item : item
+			},
+
+			/**
+			 * ������������������������������������00:00:00
+			 * @param {String} timeString
+			 */
+			parseTimeType(timeString) {
+				if (timeString) {
+					let timeArr = timeString.split(':')
+					this.hour = Number(timeArr[0])
+					this.minute = Number(timeArr[1])
+					this.second = Number(timeArr[2])
+				}
+			},
+
+			/**
+			 * ���������������������������������������������������������������������������2000-10-02���'08:30:00'��� 1610695109000
+			 * @param {String | Number} datetime
+			 */
+			initPickerValue(datetime) {
+				let defaultValue = null
+				if (datetime) {
+					defaultValue = this.compareValueWithStartAndEnd(datetime, this.start, this.end)
+				} else {
+					defaultValue = Date.now()
+					defaultValue = this.compareValueWithStartAndEnd(defaultValue, this.start, this.end)
+				}
+				this.parseValue(defaultValue)
+			},
+
+			/**
+			 * ������������������
+			 * - ��������������������� value
+			 * 	- ��������������������� start��������������� end������ start < value < end��������������� value��� ������������������ start
+			 * 	- ������������������������ start������ start < value��������������� value��������������������� start
+			 * 	- ������������������������ end������ value < end��������������� value��������������������� end
+			 * 	- ��������������������������������������� value
+			 * - ������������ value������������������������������������ Date.now()
+			 * @param {Object} value
+			 * @param {Object} dateBase
+			 */
+			compareValueWithStartAndEnd(value, start, end) {
+				let winner = null
+				value = this.superTimeStamp(value)
+				start = this.superTimeStamp(start)
+				end = this.superTimeStamp(end)
+
+				if (start && end) {
+					if (value < start) {
+						winner = new Date(start)
+					} else if (value > end) {
+						winner = new Date(end)
+					} else {
+						winner = new Date(value)
+					}
+				} else if (start && !end) {
+					winner = start <= value ? new Date(value) : new Date(start)
+				} else if (!start && end) {
+					winner = value <= end ? new Date(value) : new Date(end)
+				} else {
+					winner = new Date(value)
+				}
+
+				return winner
+			},
+
+			/**
+			 * ���������������������������������������������������������������������
+			 * @param {Object} value
+			 */
+			superTimeStamp(value) {
+				let dateBase = ''
+				if (this.type === 'time' && value && typeof value === 'string') {
+					const now = new Date()
+					const year = now.getFullYear()
+					const month = now.getMonth() + 1
+					const day = now.getDate()
+					dateBase = year + '/' + month + '/' + day + ' '
+				}
+				if (Number(value)) {
+					value = parseInt(value)
+					dateBase = 0
+				}
+				return this.createTimeStamp(dateBase + value)
+			},
+
+			/**
+			 * ��������������� value������������������������
+			 * @param {Object} defaultTime
+			 */
+			parseValue(value) {
+				if (!value) {
+					return
+				}
+				if (this.type === 'time' && typeof value === "string") {
+					this.parseTimeType(value)
+				} else {
+					let defaultDate = null
+					defaultDate = new Date(value)
+					if (this.type !== 'time') {
+						this.year = defaultDate.getFullYear()
+						this.month = defaultDate.getMonth() + 1
+						this.day = defaultDate.getDate()
+					}
+					if (this.type !== 'date') {
+						this.hour = defaultDate.getHours()
+						this.minute = defaultDate.getMinutes()
+						this.second = defaultDate.getSeconds()
+					}
+				}
+				if (this.hideSecond) {
+					this.second = 0
+				}
+			},
+
+			/**
+			 * ��������������������������� start���end���������������������������������
+			 * @param {Object} defaultTime
+			 */
+			parseDatetimeRange(point, pointType) {
+				// ������������������������������������
+				if (!point) {
+					if (pointType === 'start') {
+						this.startYear = 1920
+						this.startMonth = 1
+						this.startDay = 1
+						this.startHour = 0
+						this.startMinute = 0
+						this.startSecond = 0
+					}
+					if (pointType === 'end') {
+						this.endYear = 2120
+						this.endMonth = 12
+						this.endDay = 31
+						this.endHour = 23
+						this.endMinute = 59
+						this.endSecond = 59
+					}
+					return
+				}
+				if (this.type === 'time') {
+					const pointArr = point.split(':')
+					this[pointType + 'Hour'] = Number(pointArr[0])
+					this[pointType + 'Minute'] = Number(pointArr[1])
+					this[pointType + 'Second'] = Number(pointArr[2])
+				} else {
+					if (!point) {
+						pointType === 'start' ? this.startYear = this.year - 60 : this.endYear = this.year + 60
+						return
+					}
+					if (Number(point)) {
+						point = parseInt(point)
+					}
+					// datetime ��� end ���������������, ������������
+					const hasTime = /[0-9]:[0-9]/
+					if (this.type === 'datetime' && pointType === 'end' && typeof point === 'string' && !hasTime.test(
+							point)) {
+						point = point + ' 23:59:59'
+					}
+					const pointDate = new Date(point)
+					this[pointType + 'Year'] = pointDate.getFullYear()
+					this[pointType + 'Month'] = pointDate.getMonth() + 1
+					this[pointType + 'Day'] = pointDate.getDate()
+					if (this.type === 'datetime') {
+						this[pointType + 'Hour'] = pointDate.getHours()
+						this[pointType + 'Minute'] = pointDate.getMinutes()
+						this[pointType + 'Second'] = pointDate.getSeconds()
+					}
+				}
+			},
+
+			// ������ ��������������������������������� ������������������
+			getCurrentRange(value) {
+				const range = []
+				for (let i = this['min' + this.capitalize(value)]; i <= this['max' + this.capitalize(value)]; i++) {
+					range.push(i)
+				}
+				return range
+			},
+
+			// ������������������������
+			capitalize(str) {
+				return str.charAt(0).toUpperCase() + str.slice(1)
+			},
+
+			// ������������������������������������������������������������������������������������
+			checkValue(name, value, values) {
+				if (values.indexOf(value) === -1) {
+					this[name] = values[0]
+				}
+			},
+
+			// ������������������������
+			daysInMonth(year, month) { // Use 1 for January, 2 for February, etc.
+				return new Date(year, month, 0).getDate();
+			},
+
+			//������ iOS���safari ������������
+			fixIosDateFormat(value) {
+				if (typeof value === 'string') {
+					value = value.replace(/-/g, '/')
+				}
+				return value
+			},
+
+			/**
+			 * ���������������
+			 * @param {Object} time
+			 */
+			createTimeStamp(time) {
+				if (!time) return
+				if (typeof time === "number") {
+					return time
+				} else {
+					time = time.replace(/-/g, '/')
+					if (this.type === 'date') {
+						time = time + ' ' + '00:00:00'
+					}
+					return Date.parse(time)
+				}
+			},
+
+			/**
+			 * ���������������������������������
+			 */
+			createDomSting() {
+				const yymmdd = this.year +
+					'-' +
+					this.lessThanTen(this.month) +
+					'-' +
+					this.lessThanTen(this.day)
+
+				let hhmmss = this.lessThanTen(this.hour) +
+					':' +
+					this.lessThanTen(this.minute)
+
+				if (!this.hideSecond) {
+					hhmmss = hhmmss + ':' + this.lessThanTen(this.second)
+				}
+
+				if (this.type === 'date') {
+					return yymmdd
+				} else if (this.type === 'time') {
+					return hhmmss
+				} else {
+					return yymmdd + ' ' + hhmmss
+				}
+			},
+
+			/**
+			 * ������������������������������ change ������
+			 */
+			initTime(emit = true) {
+				this.time = this.createDomSting()
+				if (!emit) return
+				if (this.returnType === 'timestamp' && this.type !== 'time') {
+					this.$emit('change', this.createTimeStamp(this.time))
+					this.$emit('input', this.createTimeStamp(this.time))
+					this.$emit('update:modelValue', this.createTimeStamp(this.time))
+				} else {
+					this.$emit('change', this.time)
+					this.$emit('input', this.time)
+					this.$emit('update:modelValue', this.time)
+				}
+			},
+
+			/**
+			 * ��������������������������������� data
+			 * @param {Object} e
+			 */
+			bindDateChange(e) {
+				const val = e.detail.value
+				this.year = this.years[val[0]]
+				this.month = this.months[val[1]]
+				this.day = this.days[val[2]]
+			},
+			bindTimeChange(e) {
+				const val = e.detail.value
+				this.hour = this.hours[val[0]]
+				this.minute = this.minutes[val[1]]
+				this.second = this.seconds[val[2]]
+			},
+
+			/**
+			 * ������������������
+			 */
+			initTimePicker() {
+				if (this.disabled) return
+				const value = fixIosDateFormat(this.time)
+				this.initPickerValue(value)
+				this.visible = !this.visible
+			},
+
+			/**
+			 * ���������������������
+			 */
+			tiggerTimePicker(e) {
+				this.visible = !this.visible
+			},
+
+			/**
+			 * ������������������������������������������������
+			 */
+			clearTime() {
+				this.time = ''
+				this.$emit('change', this.time)
+				this.$emit('input', this.time)
+				this.$emit('update:modelValue', this.time)
+				this.tiggerTimePicker()
+			},
+
+			/**
+			 * ������������������������������
+			 */
+			setTime() {
+				this.initTime()
+				this.tiggerTimePicker()
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	$uni-primary: #007aff !default;
+
+	.uni-datetime-picker {
+		/* #ifndef APP-NVUE */
+		/* width: 100%; */
+		/* #endif */
+	}
+
+	.uni-datetime-picker-view {
+		height: 130px;
+		width: 270px;
+		/* #ifndef APP-NVUE */
+		cursor: pointer;
+		/* #endif */
+	}
+
+	.uni-datetime-picker-item {
+		height: 50px;
+		line-height: 50px;
+		text-align: center;
+		font-size: 14px;
+	}
+
+	.uni-datetime-picker-btn {
+		margin-top: 60px;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		cursor: pointer;
+		/* #endif */
+		flex-direction: row;
+		justify-content: space-between;
+	}
+
+	.uni-datetime-picker-btn-text {
+		font-size: 14px;
+		color: $uni-primary;
+	}
+
+	.uni-datetime-picker-btn-group {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+	}
+
+	.uni-datetime-picker-cancel {
+		margin-right: 30px;
+	}
+
+	.uni-datetime-picker-mask {
+		position: fixed;
+		bottom: 0px;
+		top: 0px;
+		left: 0px;
+		right: 0px;
+		background-color: rgba(0, 0, 0, 0.4);
+		transition-duration: 0.3s;
+		z-index: 998;
+	}
+
+	.uni-datetime-picker-popup {
+		border-radius: 8px;
+		padding: 30px;
+		width: 270px;
+		/* #ifdef APP-NVUE */
+		height: 500px;
+		/* #endif */
+		/* #ifdef APP-NVUE */
+		width: 330px;
+		/* #endif */
+		background-color: #fff;
+		position: fixed;
+		top: 50%;
+		left: 50%;
+		transform: translate(-50%, -50%);
+		transition-duration: 0.3s;
+		z-index: 999;
+	}
+
+	.fix-nvue-height {
+		/* #ifdef APP-NVUE */
+		height: 330px;
+		/* #endif */
+	}
+
+	.uni-datetime-picker-time {
+		color: grey;
+	}
+
+	.uni-datetime-picker-column {
+		height: 50px;
+	}
+
+	.uni-datetime-picker-timebox {
+
+		border: 1px solid #E5E5E5;
+		border-radius: 5px;
+		padding: 7px 10px;
+		/* #ifndef APP-NVUE */
+		box-sizing: border-box;
+		cursor: pointer;
+		/* #endif */
+	}
+
+	.uni-datetime-picker-timebox-pointer {
+		/* #ifndef APP-NVUE */
+		cursor: pointer;
+		/* #endif */
+	}
+
+
+	.uni-datetime-picker-disabled {
+		opacity: 0.4;
+		/* #ifdef H5 */
+		cursor: not-allowed !important;
+		/* #endif */
+	}
+
+	.uni-datetime-picker-text {
+		font-size: 14px;
+		line-height: 50px
+	}
+
+	.uni-datetime-picker-sign {
+		position: absolute;
+		top: 53px;
+		/* ������ 10px ������������������������nvue */
+		color: #999;
+		/* #ifdef APP-NVUE */
+		font-size: 16px;
+		/* #endif */
+	}
+
+	.sign-left {
+		left: 86px;
+	}
+
+	.sign-right {
+		right: 86px;
+	}
+
+	.sign-center {
+		left: 135px;
+	}
+
+	.uni-datetime-picker__container-box {
+		position: relative;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+		margin-top: 40px;
+	}
+
+	.time-hide-second {
+		width: 180px;
+	}
+</style>
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue
new file mode 100644
index 0000000..a4c0340
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.vue
@@ -0,0 +1,1034 @@
+<template>
+	<view class="uni-date">
+		<view class="uni-date-editor" @click="show">
+			<slot>
+				<view
+          class="uni-date-editor--x"
+          :class="{'uni-date-editor--x__disabled': disabled,'uni-date-x--border': border}"
+        >
+					<view v-if="!isRange" class="uni-date-x uni-date-single">
+						<uni-icons class="icon-calendar" type="calendar" color="#c0c4cc" size="22"></uni-icons>
+						<view class="uni-date__x-input">{{ displayValue || singlePlaceholderText }}</view>
+					</view>
+
+					<view v-else class="uni-date-x uni-date-range">
+            <uni-icons class="icon-calendar" type="calendar" color="#c0c4cc" size="22"></uni-icons>
+            <view class="uni-date__x-input text-center">{{ displayRangeValue.startDate || startPlaceholderText }}</view>
+
+            <view class="range-separator">{{rangeSeparator}}</view>
+
+            <view class="uni-date__x-input text-center">{{ displayRangeValue.endDate || endPlaceholderText }}</view>
+					</view>
+
+					<view v-if="showClearIcon" class="uni-date__icon-clear" @click.stop="clear">
+						<uni-icons type="clear" color="#c0c4cc" size="22"></uni-icons>
+					</view>
+				</view>
+			</slot>
+		</view>
+
+		<view v-show="pickerVisible" class="uni-date-mask--pc" @click="close"></view>
+
+		<view v-if="!isPhone" v-show="pickerVisible" ref="datePicker" class="uni-date-picker__container">
+			<view v-if="!isRange" class="uni-date-single--x" :style="pickerPositionStyle">
+				<view class="uni-popper__arrow"></view>
+
+				<view v-if="hasTime" class="uni-date-changed popup-x-header">
+					<input class="uni-date__input text-center" type="text" v-model="inputDate"
+						:placeholder="selectDateText" />
+
+					<time-picker type="time" v-model="pickerTime" :border="false" :disabled="!inputDate"
+						:start="timepickerStartTime" :end="timepickerEndTime" :hideSecond="hideSecond" style="width: 100%;">
+						<input class="uni-date__input text-center" type="text" v-model="pickerTime" :placeholder="selectTimeText"
+							:disabled="!inputDate" />
+					</time-picker>
+				</view>
+
+				<Calendar ref="pcSingle" :showMonth="false" :start-date="calendarRange.startDate"
+					:end-date="calendarRange.endDate" :date="calendarDate" @change="singleChange"
+          :default-value="defaultValue"
+					style="padding: 0 8px;" />
+
+				<view v-if="hasTime" class="popup-x-footer">
+					<text class="confirm-text" @click="confirmSingleChange">{{okText}}</text>
+				</view>
+			</view>
+
+			<view v-else class="uni-date-range--x" :style="pickerPositionStyle">
+				<view class="uni-popper__arrow"></view>
+				<view v-if="hasTime" class="popup-x-header uni-date-changed">
+					<view class="popup-x-header--datetime">
+            <input class="uni-date__input uni-date-range__input" type="text" v-model="tempRange.startDate"
+            :placeholder="startDateText" />
+
+						<time-picker type="time" v-model="tempRange.startTime" :start="timepickerStartTime" :border="false"
+            :disabled="!tempRange.startDate" :hideSecond="hideSecond">
+            <input class="uni-date__input uni-date-range__input" type="text"
+            v-model="tempRange.startTime" :placeholder="startTimeText"
+            :disabled="!tempRange.startDate" />
+          </time-picker>
+        </view>
+
+        <uni-icons type="arrowthinright" color="#999" style="line-height: 40px;"></uni-icons>
+
+					<view class="popup-x-header--datetime">
+						<input class="uni-date__input uni-date-range__input" type="text" v-model="tempRange.endDate"
+							:placeholder="endDateText" />
+
+						<time-picker type="time" v-model="tempRange.endTime" :end="timepickerEndTime" :border="false"
+							:disabled="!tempRange.endDate" :hideSecond="hideSecond">
+							<input class="uni-date__input uni-date-range__input" type="text" v-model="tempRange.endTime"
+								:placeholder="endTimeText" :disabled="!tempRange.endDate" />
+						</time-picker>
+					</view>
+				</view>
+
+				<view class="popup-x-body">
+					<Calendar ref="left" :showMonth="false" :start-date="calendarRange.startDate"
+            :end-date="calendarRange.endDate" :range="true" :pleStatus="endMultipleStatus"
+            @change="leftChange" @firstEnterCale="updateRightCale" style="padding: 0 8px;" />
+					<Calendar ref="right" :showMonth="false" :start-date="calendarRange.startDate"
+						:end-date="calendarRange.endDate" :range="true" @change="rightChange"
+						:pleStatus="startMultipleStatus" @firstEnterCale="updateLeftCale"
+						style="padding: 0 8px;border-left: 1px solid #F1F1F1;" />
+				</view>
+
+				<view v-if="hasTime" class="popup-x-footer">
+					<text @click="clear">{{clearText}}</text>
+					<text class="confirm-text" @click="confirmRangeChange">{{okText}}</text>
+				</view>
+			</view>
+		</view>
+
+		<Calendar v-if="isPhone" ref="mobile" :clearDate="false" :date="calendarDate" :defTime="mobileCalendarTime"
+			:start-date="calendarRange.startDate" :end-date="calendarRange.endDate" :selectableTimes="mobSelectableTime"
+      :startPlaceholder="startPlaceholder" :endPlaceholder="endPlaceholder"
+      :default-value="defaultValue"
+			:pleStatus="endMultipleStatus" :showMonth="false" :range="isRange" :hasTime="hasTime" :insert="false"
+			:hideSecond="hideSecond" @confirm="mobileChange" @maskClose="close" />
+	</view>
+</template>
+<script>
+	/**
+	 * DatetimePicker ���������������
+	 * @description ������������ PC ���������������������������������������������������
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=3962
+	 * @property {String} type ���������������
+	 * @property {String|Number|Array|Date} value ���������
+	 * @property {String} placeholder ���������������������������
+	 * @property {String} start ������������
+	 * @property {String} end ������������
+	 * @property {String} start-placeholder ������������������������������������������
+	 * @property {String} end-placeholder ������������������������������������������
+	 * @property {String} range-separator ���������������������������
+	 * @property {Boolean} border = [true|false] ���������������
+	 * @property {Boolean} disabled = [true|false] ������������
+	 * @property {Boolean} clearIcon = [true|false] ������������������������������PC������������
+	 * @property {[String} defaultValue ���������������������������������������
+	 * @event {Function} change ������������������������������
+	 * @event {Function} maskClick ������������������������������
+	 * @event {Function} show ���������������
+	 * @event {Function} close ���������������
+	 * @event {Function} clear ���������������������������������
+	 **/
+	import Calendar from './calendar.vue'
+	import TimePicker from './time-picker.vue'
+	import { initVueI18n } from '@dcloudio/uni-i18n'
+	import i18nMessages from './i18n/index.js'
+  import { getDateTime, getDate, getTime, getDefaultSecond, dateCompare, checkDate, fixIosDateFormat } from './util'
+
+	export default {
+		name: 'UniDatetimePicker',
+		options: {
+			virtualHost: true
+		},
+		components: {
+			Calendar,
+			TimePicker
+		},
+		data() {
+			return {
+				isRange: false,
+				hasTime: false,
+				displayValue: '',
+				inputDate: '',
+				calendarDate: '',
+				pickerTime: '',
+				calendarRange: {
+					startDate: '',
+					startTime: '',
+					endDate: '',
+					endTime: ''
+				},
+				displayRangeValue: {
+					startDate: '',
+					endDate: '',
+				},
+				tempRange: {
+					startDate: '',
+					startTime: '',
+					endDate: '',
+					endTime: ''
+				},
+				// ������������������������
+				startMultipleStatus: {
+					before: '',
+					after: '',
+					data: [],
+					fulldate: ''
+				},
+				endMultipleStatus: {
+					before: '',
+					after: '',
+					data: [],
+					fulldate: ''
+				},
+				pickerVisible: false,
+				pickerPositionStyle: null,
+				isEmitValue: false,
+				isPhone: false,
+				isFirstShow: true,
+        i18nT: () => {}
+			}
+		},
+		props: {
+			type: {
+				type: String,
+				default: 'datetime'
+			},
+			value: {
+				type: [String, Number, Array, Date],
+				default: ''
+			},
+			modelValue: {
+				type: [String, Number, Array, Date],
+				default: ''
+			},
+			start: {
+				type: [Number, String],
+				default: ''
+			},
+			end: {
+				type: [Number, String],
+				default: ''
+			},
+			returnType: {
+				type: String,
+				default: 'string'
+			},
+			placeholder: {
+				type: String,
+				default: ''
+			},
+			startPlaceholder: {
+        type: String,
+				default: ''
+			},
+			endPlaceholder: {
+				type: String,
+				default: ''
+			},
+			rangeSeparator: {
+				type: String,
+				default: '-'
+			},
+			border: {
+				type: [Boolean],
+				default: true
+			},
+			disabled: {
+				type: [Boolean],
+				default: false
+			},
+			clearIcon: {
+				type: [Boolean],
+				default: true
+			},
+			hideSecond: {
+				type: [Boolean],
+				default: false
+			},
+      defaultValue: {
+        type: [String, Object, Array],
+        default: ''
+      }
+		},
+		watch: {
+			type: {
+				immediate: true,
+				handler(newVal) {
+          this.hasTime = newVal.indexOf('time') !== -1
+					this.isRange = newVal.indexOf('range') !== -1
+				}
+			},
+			// #ifndef VUE3
+			value: {
+				immediate: true,
+				handler(newVal) {
+					if (this.isEmitValue) {
+						this.isEmitValue = false
+						return
+					}
+					this.initPicker(newVal)
+				}
+			},
+			// #endif
+			// #ifdef VUE3
+			modelValue: {
+				immediate: true,
+				handler(newVal) {
+					if (this.isEmitValue) {
+						this.isEmitValue = false
+						return
+					}
+					this.initPicker(newVal)
+				}
+			},
+			// #endif
+			start: {
+				immediate: true,
+				handler(newVal) {
+					if (!newVal) return
+					this.calendarRange.startDate = getDate(newVal)
+					if (this.hasTime) {
+						this.calendarRange.startTime = getTime(newVal)
+					}
+				}
+			},
+			end: {
+				immediate: true,
+				handler(newVal) {
+					if (!newVal) return
+					this.calendarRange.endDate = getDate(newVal)
+					if (this.hasTime) {
+						this.calendarRange.endTime = getTime(newVal, this.hideSecond)
+					}
+				}
+			},
+		},
+		computed: {
+			timepickerStartTime() {
+				const activeDate = this.isRange ? this.tempRange.startDate : this.inputDate
+				return activeDate === this.calendarRange.startDate ? this.calendarRange.startTime : ''
+			},
+			timepickerEndTime() {
+				const activeDate = this.isRange ? this.tempRange.endDate : this.inputDate
+				return activeDate === this.calendarRange.endDate ? this.calendarRange.endTime : ''
+			},
+			mobileCalendarTime() {
+				const timeRange = {
+					start: this.tempRange.startTime,
+					end: this.tempRange.endTime
+				}
+				return this.isRange ? timeRange : this.pickerTime
+			},
+			mobSelectableTime() {
+				return {
+					start: this.calendarRange.startTime,
+					end: this.calendarRange.endTime
+				}
+			},
+			datePopupWidth() {
+				// todo
+				return this.isRange ? 653 : 301
+			},
+
+			/**
+			 * for i18n
+			 */
+			singlePlaceholderText() {
+				return this.placeholder || (this.type === 'date' ? this.selectDateText : this.selectDateTimeText)
+			},
+			startPlaceholderText() {
+				return this.startPlaceholder || this.startDateText
+			},
+			endPlaceholderText() {
+				return this.endPlaceholder || this.endDateText
+			},
+			selectDateText() {
+				return this.i18nT("uni-datetime-picker.selectDate")
+			},
+      selectDateTimeText() {
+        return this.i18nT("uni-datetime-picker.selectDateTime")
+      },
+			selectTimeText() {
+				return this.i18nT("uni-datetime-picker.selectTime")
+			},
+			startDateText() {
+				return this.startPlaceholder || this.i18nT("uni-datetime-picker.startDate")
+			},
+			startTimeText() {
+				return this.i18nT("uni-datetime-picker.startTime")
+			},
+			endDateText() {
+				return this.endPlaceholder || this.i18nT("uni-datetime-picker.endDate")
+			},
+			endTimeText() {
+				return this.i18nT("uni-datetime-picker.endTime")
+			},
+			okText() {
+				return this.i18nT("uni-datetime-picker.ok")
+			},
+			clearText() {
+				return this.i18nT("uni-datetime-picker.clear")
+			},
+			showClearIcon() {
+				return this.clearIcon && !this.disabled && (this.displayValue || (this.displayRangeValue.startDate && this.displayRangeValue.endDate))
+			}
+		},
+		created() {
+			this.initI18nT()
+      this.platform()
+		},
+		methods: {
+      initI18nT() {
+        const vueI18n = initVueI18n(i18nMessages)
+        this.i18nT = vueI18n.t
+      },
+			initPicker(newVal) {
+				if ((!newVal && !this.defaultValue) || Array.isArray(newVal) && !newVal.length) {
+					this.$nextTick(() => {
+						this.clear(false)
+					})
+					return
+				}
+
+				if (!Array.isArray(newVal) && !this.isRange) {
+          if(newVal){
+            this.displayValue = this.inputDate = this.calendarDate = getDate(newVal)
+            if (this.hasTime) {
+              this.pickerTime = getTime(newVal, this.hideSecond)
+              this.displayValue = `${this.displayValue} ${this.pickerTime}`
+            }
+          }else if(this.defaultValue){
+            this.inputDate = this.calendarDate = getDate(this.defaultValue)
+            if(this.hasTime){
+              this.pickerTime = getTime(this.defaultValue, this.hideSecond)
+            }
+          }
+				} else {
+					const [before, after] = newVal
+					if (!before && !after) return
+          const beforeDate = getDate(before)
+          const beforeTime = getTime(before, this.hideSecond)
+
+          const afterDate = getDate(after)
+          const afterTime = getTime(after, this.hideSecond)
+					const startDate = beforeDate
+					const endDate = afterDate
+					this.displayRangeValue.startDate = this.tempRange.startDate = startDate
+					this.displayRangeValue.endDate = this.tempRange.endDate = endDate
+
+					if (this.hasTime) {
+						this.displayRangeValue.startDate = `${beforeDate} ${beforeTime}`
+						this.displayRangeValue.endDate = `${afterDate} ${afterTime}`
+						this.tempRange.startTime = beforeTime
+						this.tempRange.endTime = afterTime
+					}
+					const defaultRange = {
+						before: beforeDate,
+						after: afterDate
+					}
+					this.startMultipleStatus = Object.assign({}, this.startMultipleStatus, defaultRange, {
+						which: 'right'
+					})
+					this.endMultipleStatus = Object.assign({}, this.endMultipleStatus, defaultRange, {
+						which: 'left'
+					})
+				}
+			},
+			updateLeftCale(e) {
+				const left = this.$refs.left
+				// ���������������
+				left.cale.setHoverMultiple(e.after)
+				left.setDate(this.$refs.left.nowDate.fullDate)
+			},
+			updateRightCale(e) {
+				const right = this.$refs.right
+				// ���������������
+				right.cale.setHoverMultiple(e.after)
+				right.setDate(this.$refs.right.nowDate.fullDate)
+			},
+			platform() {
+        if(typeof navigator !== "undefined"){
+          this.isPhone = navigator.userAgent.toLowerCase().indexOf('mobile') !== -1
+          return
+        }
+				const { windowWidth } = uni.getSystemInfoSync()
+				this.isPhone = windowWidth <= 500
+				this.windowWidth = windowWidth
+			},
+			show() {
+				if (this.disabled) {
+					return
+				}
+				this.platform()
+				if (this.isPhone) {
+					setTimeout(() => {
+            this.$refs.mobile.open()
+          }, 0);
+					return
+				}
+				this.pickerPositionStyle = {
+					top: '10px'
+				}
+				const dateEditor = uni.createSelectorQuery().in(this).select(".uni-date-editor")
+				dateEditor.boundingClientRect(rect => {
+					if (this.windowWidth - rect.left < this.datePopupWidth) {
+						this.pickerPositionStyle.right = 0
+					}
+				}).exec()
+				setTimeout(() => {
+					this.pickerVisible = !this.pickerVisible
+					if (!this.isPhone && this.isRange && this.isFirstShow) {
+						this.isFirstShow = false
+						const {
+							startDate,
+							endDate
+						} = this.calendarRange
+						if (startDate && endDate) {
+							if (this.diffDate(startDate, endDate) < 30) {
+								this.$refs.right.changeMonth('pre')
+							}
+						} else {
+							this.$refs.right.changeMonth('next')
+							if(this.isPhone){
+								this.$refs.right.cale.lastHover = false;
+							}
+						}
+					}
+
+				}, 50)
+			},
+			close() {
+				setTimeout(() => {
+					this.pickerVisible = false
+					this.$emit('maskClick', this.value)
+					this.$refs.mobile && this.$refs.mobile.close()
+				}, 20)
+			},
+			setEmit(value) {
+				if (this.returnType === "timestamp" || this.returnType === "date") {
+					if (!Array.isArray(value)) {
+						if (!this.hasTime) {
+							value = value + ' ' + '00:00:00'
+						}
+						value = this.createTimestamp(value)
+						if (this.returnType === "date") {
+							value = new Date(value)
+						}
+					} else {
+						if (!this.hasTime) {
+							value[0] = value[0] + ' ' + '00:00:00'
+							value[1] = value[1] + ' ' + '00:00:00'
+						}
+						value[0] = this.createTimestamp(value[0])
+						value[1] = this.createTimestamp(value[1])
+						if (this.returnType === "date") {
+							value[0] = new Date(value[0])
+							value[1] = new Date(value[1])
+						}
+					}
+				}
+
+				this.$emit('update:modelValue', value)
+				this.$emit('input', value)
+				this.$emit('change', value)
+				this.isEmitValue = true
+			},
+			createTimestamp(date) {
+				date = fixIosDateFormat(date)
+				return Date.parse(new Date(date))
+			},
+			singleChange(e) {
+				this.calendarDate = this.inputDate = e.fulldate
+				if (this.hasTime) return
+				this.confirmSingleChange()
+			},
+			confirmSingleChange() {
+        if(!checkDate(this.inputDate)){
+					const now = new Date()
+          this.calendarDate = this.inputDate = getDate(now)
+					this.pickerTime = getTime(now, this.hideSecond)
+        }
+
+        let startLaterInputDate = false
+        let startDate, startTime
+        if(this.start) {
+          let startString = this.start
+          if(typeof this.start === 'number'){
+            startString = getDateTime(this.start, this.hideSecond)
+          }
+          [startDate, startTime] = startString.split(' ')
+          if(this.start && !dateCompare(startDate, this.inputDate)) {
+            startLaterInputDate = true
+            this.inputDate = startDate
+          }
+        }
+
+        let endEarlierInputDate = false
+        let endDate, endTime
+        if(this.end) {
+          let endString = this.end
+          if(typeof this.end === 'number'){
+            endString = getDateTime(this.end, this.hideSecond)
+          }
+          [endDate, endTime] = endString.split(' ')
+          if(this.end && !dateCompare(this.inputDate, endDate)) {
+            endEarlierInputDate = true
+            this.inputDate = endDate
+          }
+        }
+				if (this.hasTime) {
+          if(startLaterInputDate){
+            this.pickerTime = startTime || getDefaultSecond(this.hideSecond)
+          }
+          if(endEarlierInputDate){
+            this.pickerTime = endTime || getDefaultSecond(this.hideSecond)
+          }
+          if(!this.pickerTime){
+            this.pickerTime = getTime(Date.now(), this.hideSecond)
+          }
+					this.displayValue = `${this.inputDate} ${this.pickerTime}`
+				} else {
+          this.displayValue = this.inputDate
+				}
+				this.setEmit(this.displayValue)
+				this.pickerVisible = false
+			},
+			leftChange(e) {
+				const {
+					before,
+					after
+				} = e.range
+				this.rangeChange(before, after)
+				const obj = {
+					before: e.range.before,
+					after: e.range.after,
+					data: e.range.data,
+					fulldate: e.fulldate
+				}
+				this.startMultipleStatus = Object.assign({}, this.startMultipleStatus, obj)
+			},
+			rightChange(e) {
+				const {
+					before,
+					after
+				} = e.range
+				this.rangeChange(before, after)
+				const obj = {
+					before: e.range.before,
+					after: e.range.after,
+					data: e.range.data,
+					fulldate: e.fulldate
+				}
+				this.endMultipleStatus = Object.assign({}, this.endMultipleStatus, obj)
+			},
+			mobileChange(e) {
+				if (this.isRange) {
+					const {before, after} = e.range
+
+          if(!before || !after){
+            return
+          }
+
+					this.handleStartAndEnd(before, after, true)
+					if (this.hasTime) {
+						const {
+							startTime,
+							endTime
+						} = e.timeRange
+						this.tempRange.startTime = startTime
+						this.tempRange.endTime = endTime
+					}
+					this.confirmRangeChange()
+				} else {
+					if (this.hasTime) {
+						this.displayValue = e.fulldate + ' ' + e.time
+					} else {
+						this.displayValue = e.fulldate
+					}
+					this.setEmit(this.displayValue)
+				}
+				this.$refs.mobile.close()
+			},
+			rangeChange(before, after) {
+				if (!(before && after)) return
+				this.handleStartAndEnd(before, after, true)
+				if (this.hasTime) return
+				this.confirmRangeChange()
+			},
+			confirmRangeChange() {
+				if (!this.tempRange.startDate || !this.tempRange.endDate) {
+					this.pickerVisible = false
+					return
+				}
+        if(!checkDate(this.tempRange.startDate)){
+          this.tempRange.startDate = getDate(Date.now())
+        }
+        if(!checkDate(this.tempRange.endDate)){
+          this.tempRange.endDate = getDate(Date.now())
+        }
+
+				let start, end
+
+        let startDateLaterRangeStartDate = false
+        let startDateLaterRangeEndDate = false
+        let startDate, startTime
+        if(this.start) {
+          let startString = this.start
+          if(typeof this.start === 'number'){
+            startString = getDateTime(this.start, this.hideSecond)
+          }
+          [startDate,startTime] = startString.split(' ')
+          if(this.start && !dateCompare(this.start, this.tempRange.startDate)) {
+            startDateLaterRangeStartDate = true
+            this.tempRange.startDate = startDate
+          }
+          if(this.start && !dateCompare(this.start, this.tempRange.endDate)) {
+            startDateLaterRangeEndDate = true
+            this.tempRange.endDate = startDate
+          }
+        }
+        let endDateEarlierRangeStartDate = false
+        let endDateEarlierRangeEndDate = false
+        let endDate, endTime
+        if(this.end) {
+          let endString = this.end
+          if(typeof this.end === 'number'){
+            endString = getDateTime(this.end, this.hideSecond)
+          }
+          [endDate,endTime] = endString.split(' ')
+
+          if(this.end && !dateCompare(this.tempRange.startDate, this.end)) {
+            endDateEarlierRangeStartDate = true
+            this.tempRange.startDate = endDate
+          }
+          if(this.end && !dateCompare(this.tempRange.endDate, this.end)) {
+            endDateEarlierRangeEndDate = true
+            this.tempRange.endDate = endDate
+          }
+        }
+				if (!this.hasTime) {
+          start = this.displayRangeValue.startDate = this.tempRange.startDate
+					end = this.displayRangeValue.endDate = this.tempRange.endDate
+				} else {
+          if(startDateLaterRangeStartDate){
+            this.tempRange.startTime = startTime || getDefaultSecond(this.hideSecond)
+          }else if(endDateEarlierRangeStartDate){
+            this.tempRange.startTime = endTime || getDefaultSecond(this.hideSecond)
+          }
+          if(!this.tempRange.startTime){
+            this.tempRange.startTime = getTime(Date.now(), this.hideSecond)
+          }
+
+          if(startDateLaterRangeEndDate){
+            this.tempRange.endTime = startTime || getDefaultSecond(this.hideSecond)
+          }else if(endDateEarlierRangeEndDate){
+            this.tempRange.endTime = endTime || getDefaultSecond(this.hideSecond)
+          }
+          if(!this.tempRange.endTime){
+            this.tempRange.endTime = getTime(Date.now(), this.hideSecond)
+          }
+					start = this.displayRangeValue.startDate = `${this.tempRange.startDate} ${this.tempRange.startTime}`
+					end = this.displayRangeValue.endDate = `${this.tempRange.endDate} ${this.tempRange.endTime}`
+				}
+        if(!dateCompare(start,end)){
+          [start, end] = [end, start]
+        }
+				this.displayRangeValue.startDate = start
+				this.displayRangeValue.endDate = end
+				const displayRange = [start, end]
+				this.setEmit(displayRange)
+				this.pickerVisible = false
+			},
+			handleStartAndEnd(before, after, temp = false) {
+				if (!(before && after)) return
+
+				const type = temp ? 'tempRange' : 'range'
+        const isStartEarlierEnd = dateCompare(before, after)
+        this[type].startDate = isStartEarlierEnd ? before : after
+        this[type].endDate = isStartEarlierEnd ? after : before
+    },
+			/**
+			 * ������������������
+			 */
+			dateCompare(startDate, endDate) {
+				// ������������������
+				startDate = new Date(startDate.replace('-', '/').replace('-', '/'))
+				// ������������������������������
+				endDate = new Date(endDate.replace('-', '/').replace('-', '/'))
+				return startDate <= endDate
+			},
+
+			/**
+			 * ���������������
+			 */
+			diffDate(startDate, endDate) {
+				// ������������������
+				startDate = new Date(startDate.replace('-', '/').replace('-', '/'))
+				// ������������������������������
+				endDate = new Date(endDate.replace('-', '/').replace('-', '/'))
+				const diff = (endDate - startDate) / (24 * 60 * 60 * 1000)
+				return Math.abs(diff)
+			},
+
+			clear(needEmit = true) {
+				if (!this.isRange) {
+					this.displayValue = ''
+					this.inputDate = ''
+					this.pickerTime = ''
+					if (this.isPhone) {
+						this.$refs.mobile && this.$refs.mobile.clearCalender()
+					} else {
+						this.$refs.pcSingle && this.$refs.pcSingle.clearCalender()
+					}
+					if (needEmit) {
+						this.$emit('change', '')
+						this.$emit('input', '')
+						this.$emit('update:modelValue', '')
+					}
+				} else {
+					this.displayRangeValue.startDate = ''
+					this.displayRangeValue.endDate = ''
+					this.tempRange.startDate = ''
+					this.tempRange.startTime = ''
+					this.tempRange.endDate = ''
+					this.tempRange.endTime = ''
+					if (this.isPhone) {
+						this.$refs.mobile && this.$refs.mobile.clearCalender()
+					} else {
+						this.$refs.left && this.$refs.left.clearCalender()
+						this.$refs.right && this.$refs.right.clearCalender()
+						this.$refs.right && this.$refs.right.changeMonth('next')
+					}
+					if (needEmit) {
+						this.$emit('change', [])
+						this.$emit('input', [])
+						this.$emit('update:modelValue', [])
+					}
+				}
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	$uni-primary: #007aff !default;
+
+	.uni-date {
+		width: 100%;
+		flex: 1;
+	}
+	.uni-date-x {
+		display: flex;
+		flex-direction: row;
+		align-items: center;
+		justify-content: center;
+		border-radius: 4px;
+		background-color: #fff;
+		color: #666;
+		font-size: 14px;
+		flex: 1;
+
+    .icon-calendar{
+      padding-left: 3px;
+    }
+    .range-separator{
+      height: 35px;
+      /* #ifndef MP */
+      padding: 0 2px;
+      /* #endif */
+			line-height: 35px;
+    }
+	}
+
+	.uni-date-x--border {
+		box-sizing: border-box;
+		border-radius: 4px;
+		border: 1px solid #e5e5e5;
+	}
+
+	.uni-date-editor--x {
+		display: flex;
+		align-items: center;
+		position: relative;
+	}
+
+	.uni-date-editor--x .uni-date__icon-clear {
+		padding-right: 3px;
+		display: flex;
+		align-items: center;
+		/* #ifdef H5 */
+		cursor: pointer;
+		/* #endif */
+	}
+
+	.uni-date__x-input {
+		width: auto;
+		height: 35px;
+    /* #ifndef MP */
+    padding-left: 5px;
+    /* #endif */
+		position: relative;
+		flex: 1;
+		line-height: 35px;
+		font-size: 14px;
+		overflow: hidden;
+	}
+
+	.text-center {
+		text-align: center;
+	}
+
+	.uni-date__input {
+		height: 40px;
+		width: 100%;
+		line-height: 40px;
+		font-size: 14px;
+	}
+
+	.uni-date-range__input {
+		text-align: center;
+		max-width: 142px;
+	}
+
+	.uni-date-picker__container {
+		position: relative;
+	}
+
+	.uni-date-mask--pc {
+		position: fixed;
+		bottom: 0px;
+		top: 0px;
+		left: 0px;
+		right: 0px;
+		background-color: rgba(0, 0, 0, 0);
+		transition-duration: 0.3s;
+		z-index: 996;
+	}
+
+	.uni-date-single--x {
+		background-color: #fff;
+		position: absolute;
+		top: 0;
+		z-index: 999;
+		border: 1px solid #EBEEF5;
+		box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+		border-radius: 4px;
+	}
+
+	.uni-date-range--x {
+		background-color: #fff;
+		position: absolute;
+		top: 0;
+		z-index: 999;
+		border: 1px solid #EBEEF5;
+		box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+		border-radius: 4px;
+	}
+
+	.uni-date-editor--x__disabled {
+		opacity: 0.4;
+		cursor: default;
+	}
+
+	.uni-date-editor--logo {
+		width: 16px;
+		height: 16px;
+		vertical-align: middle;
+	}
+
+	/* ������������ */
+	.popup-x-header {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+	}
+
+	.popup-x-header--datetime {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		flex: 1;
+	}
+
+	.popup-x-body {
+		display: flex;
+	}
+
+	.popup-x-footer {
+		padding: 0 15px;
+		border-top-color: #F1F1F1;
+		border-top-style: solid;
+		border-top-width: 1px;
+		line-height: 40px;
+		text-align: right;
+		color: #666;
+	}
+
+	.popup-x-footer text:hover {
+		color: $uni-primary;
+		cursor: pointer;
+		opacity: 0.8;
+	}
+
+	.popup-x-footer .confirm-text {
+		margin-left: 20px;
+		color: $uni-primary;
+	}
+
+	.uni-date-changed {
+		text-align: center;
+		color: #333;
+		border-bottom-color: #F1F1F1;
+		border-bottom-style: solid;
+		border-bottom-width: 1px;
+	}
+
+	.uni-date-changed--time text {
+		height: 50px;
+		line-height: 50px;
+	}
+
+	.uni-date-changed .uni-date-changed--time {
+		flex: 1;
+	}
+
+	.uni-date-changed--time-date {
+		color: #333;
+		opacity: 0.6;
+	}
+
+	.mr-50 {
+		margin-right: 50px;
+	}
+
+	/* picker ���������������������������������, todo������������������������������������ */
+	.uni-popper__arrow,
+	.uni-popper__arrow::after {
+		position: absolute;
+		display: block;
+		width: 0;
+		height: 0;
+		border: 6px solid transparent;
+		border-top-width: 0;
+	}
+
+	.uni-popper__arrow {
+		filter: drop-shadow(0 2px 12px rgba(0, 0, 0, 0.03));
+		top: -6px;
+		left: 10%;
+		margin-right: 3px;
+		border-bottom-color: #EBEEF5;
+	}
+
+	.uni-popper__arrow::after {
+		content: " ";
+		top: 1px;
+		margin-left: -6px;
+		border-bottom-color: #fff;
+	}
+</style>
diff --git a/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js
new file mode 100644
index 0000000..ab40b23
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/components/uni-datetime-picker/util.js
@@ -0,0 +1,403 @@
+class Calendar {
+	constructor({
+		selected,
+		startDate,
+		endDate,
+		range,
+	} = {}) {
+		// ������������
+		this.date = this.getDateObj(new Date()) // ������������������
+		// ������������
+		this.selected = selected || [];
+		// ������������
+		this.startDate = startDate
+		// ������������
+		this.endDate = endDate
+    // ������������������
+		this.range = range
+		// ������������
+		this.cleanMultipleStatus()
+		// ������������
+		this.weeks = {}
+		this.lastHover = false
+	}
+	/**
+	 * ������������
+	 * @param {Object} date
+	 */
+	setDate(date) {
+		const selectDate = this.getDateObj(date)
+		this.getWeeks(selectDate.fullDate)
+	}
+
+	/**
+	 * ������������������
+	 */
+	cleanMultipleStatus() {
+		this.multipleStatus = {
+			before: '',
+			after: '',
+			data: []
+		}
+	}
+
+	setStartDate(startDate) {
+		this.startDate = startDate
+	}
+
+	setEndDate(endDate) {
+		this.endDate = endDate
+	}
+
+  getPreMonthObj(date){
+    date = fixIosDateFormat(date)
+    date = new Date(date)
+
+    const oldMonth = date.getMonth()
+    date.setMonth(oldMonth - 1)
+    const newMonth = date.getMonth()
+    if(oldMonth !== 0 && newMonth - oldMonth === 0){
+      date.setMonth(newMonth - 1)
+    }
+    return this.getDateObj(date)
+  }
+  getNextMonthObj(date){
+    date = fixIosDateFormat(date)
+    date = new Date(date)
+
+    const oldMonth = date.getMonth()
+    date.setMonth(oldMonth + 1)
+    const newMonth = date.getMonth()
+    if(newMonth - oldMonth > 1){
+      date.setMonth(newMonth - 1)
+    }
+    return this.getDateObj(date)
+  }
+
+	/**
+	 * ������������������Date������
+	 */
+	getDateObj(date) {
+    date = fixIosDateFormat(date)
+    date = new Date(date)
+
+		return {
+			fullDate: getDate(date),
+      year: date.getFullYear(),
+      month: addZero(date.getMonth() + 1),
+      date: addZero(date.getDate()),
+      day: date.getDay()
+		}
+	}
+
+	/**
+	 * ������������������������������
+	 */
+	getPreMonthDays(amount, dateObj) {
+		const result = []
+		for (let i = amount - 1; i >= 0; i--) {
+      const month = dateObj.month - 1
+			result.push({
+				date: new Date(dateObj.year, month, -i).getDate(),
+				month,
+				disable: true
+			})
+		}
+		return result
+	}
+	/**
+	 * ������������������������
+	 */
+	getCurrentMonthDays(amount, dateObj) {
+		const result = []
+		const fullDate = this.date.fullDate
+		for (let i = 1; i <= amount; i++) {
+			const currentDate = `${dateObj.year}-${dateObj.month}-${addZero(i)}`
+			const isToday = fullDate === currentDate
+			// ������������������
+			const info = this.selected && this.selected.find((item) => {
+				if (this.dateEqual(currentDate, item.date)) {
+					return item
+				}
+			})
+
+			// ������������
+			let disableBefore = true
+			let disableAfter = true
+			if (this.startDate) {
+				disableBefore = dateCompare(this.startDate, currentDate)
+			}
+
+			if (this.endDate) {
+				disableAfter = dateCompare(currentDate, this.endDate)
+			}
+
+			let multiples = this.multipleStatus.data
+			let multiplesStatus = -1
+			if (this.range && multiples) {
+        multiplesStatus = multiples.findIndex((item) => {
+          return this.dateEqual(item, currentDate)
+        })
+			}
+      const checked = multiplesStatus !== -1
+
+			result.push({
+				fullDate: currentDate,
+				year: dateObj.year,
+				date: i,
+				multiple: this.range ? checked : false,
+				beforeMultiple: this.isLogicBefore(currentDate, this.multipleStatus.before, this.multipleStatus.after),
+				afterMultiple: this.isLogicAfter(currentDate, this.multipleStatus.before, this.multipleStatus.after),
+				month: dateObj.month,
+				disable: (this.startDate && !dateCompare(this.startDate, currentDate)) || (this.endDate && !dateCompare(currentDate,this.endDate)),
+				isToday,
+				userChecked: false,
+        extraInfo: info
+			})
+		}
+		return result
+	}
+	/**
+	 * ������������������������������
+	 */
+	_getNextMonthDays(amount, dateObj) {
+		const result = []
+    const month = dateObj.month + 1
+		for (let i = 1; i <= amount; i++) {
+			result.push({
+				date: i,
+				month,
+				disable: true
+			})
+		}
+		return result
+	}
+
+	/**
+	 * ������������������������
+	 * @param {Object} date
+	 */
+	getInfo(date) {
+		if (!date) {
+			date = new Date()
+		}
+
+		return this.calendar.find(item => item.fullDate === this.getDateObj(date).fullDate)
+	}
+
+	/**
+	 * ������������������������
+	 */
+	dateEqual(before, after) {
+		before = new Date(fixIosDateFormat(before))
+		after = new Date(fixIosDateFormat(after))
+		return before.valueOf() === after.valueOf()
+	}
+
+	/**
+	 *  ������������������������
+	 */
+
+	isLogicBefore(currentDate, before, after) {
+		let logicBefore = before
+		if (before && after) {
+			logicBefore = dateCompare(before, after) ? before : after
+		}
+		return this.dateEqual(logicBefore, currentDate)
+	}
+
+	isLogicAfter(currentDate, before, after) {
+		let logicAfter = after
+		if (before && after) {
+			logicAfter = dateCompare(before, after) ? after : before
+		}
+		return this.dateEqual(logicAfter, currentDate)
+	}
+
+	/**
+	 * ���������������������������������
+	 * @param {Object} begin
+	 * @param {Object} end
+	 */
+	geDateAll(begin, end) {
+		var arr = []
+		var ab = begin.split('-')
+		var ae = end.split('-')
+		var db = new Date()
+		db.setFullYear(ab[0], ab[1] - 1, ab[2])
+		var de = new Date()
+		de.setFullYear(ae[0], ae[1] - 1, ae[2])
+		var unixDb = db.getTime() - 24 * 60 * 60 * 1000
+		var unixDe = de.getTime() - 24 * 60 * 60 * 1000
+		for (var k = unixDb; k <= unixDe;) {
+			k = k + 24 * 60 * 60 * 1000
+			arr.push(this.getDateObj(new Date(parseInt(k))).fullDate)
+		}
+		return arr
+	}
+
+	/**
+	 *  ������������������
+	 */
+	setMultiple(fullDate) {
+    if (!this.range) return
+
+		let {
+			before,
+			after
+		} = this.multipleStatus
+		if (before && after) {
+			if (!this.lastHover) {
+				this.lastHover = true
+				return
+			}
+			this.multipleStatus.before = fullDate
+			this.multipleStatus.after = ''
+			this.multipleStatus.data = []
+			this.multipleStatus.fulldate = ''
+			this.lastHover = false
+		} else {
+			if (!before) {
+				this.multipleStatus.before = fullDate
+				this.lastHover = false
+			} else {
+				this.multipleStatus.after = fullDate
+				if (dateCompare(this.multipleStatus.before, this.multipleStatus.after)) {
+					this.multipleStatus.data = this.geDateAll(this.multipleStatus.before, this.multipleStatus
+						.after);
+				} else {
+					this.multipleStatus.data = this.geDateAll(this.multipleStatus.after, this.multipleStatus
+						.before);
+				}
+				this.lastHover = true
+			}
+		}
+		this.getWeeks(fullDate)
+	}
+
+	/**
+	 *  ������ hover ������������������
+	 */
+	setHoverMultiple(fullDate) {
+    if (!this.range || this.lastHover) return
+
+		const { before } = this.multipleStatus
+
+		if (!before) {
+			this.multipleStatus.before = fullDate
+		} else {
+			this.multipleStatus.after = fullDate
+			if (dateCompare(this.multipleStatus.before, this.multipleStatus.after)) {
+				this.multipleStatus.data = this.geDateAll(this.multipleStatus.before, this.multipleStatus.after);
+			} else {
+				this.multipleStatus.data = this.geDateAll(this.multipleStatus.after, this.multipleStatus.before);
+			}
+		}
+		this.getWeeks(fullDate)
+	}
+
+	/**
+	 * ���������������������������
+	 */
+	setDefaultMultiple(before, after) {
+		this.multipleStatus.before = before
+		this.multipleStatus.after = after
+		if (before && after) {
+			if (dateCompare(before, after)) {
+				this.multipleStatus.data = this.geDateAll(before, after);
+				this.getWeeks(after)
+			} else {
+				this.multipleStatus.data = this.geDateAll(after, before);
+				this.getWeeks(before)
+			}
+		}
+	}
+
+	/**
+	 * ������������������
+	 * @param {Object} dateData
+	 */
+	getWeeks(dateData) {
+		const {
+			year,
+			month,
+		} = this.getDateObj(dateData)
+
+		const preMonthDayAmount = new Date(year, month - 1, 1).getDay()
+    const preMonthDays = this.getPreMonthDays(preMonthDayAmount, this.getDateObj(dateData))
+
+		const currentMonthDayAmount = new Date(year, month, 0).getDate()
+    const currentMonthDays = this.getCurrentMonthDays(currentMonthDayAmount, this.getDateObj(dateData))
+
+    const nextMonthDayAmount = 42 - preMonthDayAmount - currentMonthDayAmount
+    const nextMonthDays = this._getNextMonthDays(nextMonthDayAmount, this.getDateObj(dateData))
+
+		const calendarDays = [...preMonthDays, ...currentMonthDays, ...nextMonthDays]
+
+		const weeks = new Array(6)
+		for (let i = 0; i < calendarDays.length; i++) {
+      const index = Math.floor(i / 7)
+      if(!weeks[index]){
+        weeks[index] = new Array(7)
+      }
+			weeks[index][i % 7] = calendarDays[i]
+		}
+
+		this.calendar = calendarDays
+		this.weeks = weeks
+	}
+}
+
+function getDateTime(date, hideSecond){
+  return `${getDate(date)} ${getTime(date, hideSecond)}`
+}
+
+function getDate(date) {
+  date = fixIosDateFormat(date)
+  date = new Date(date)
+  const year = date.getFullYear()
+  const month = date.getMonth()+1
+  const day = date.getDate()
+  return `${year}-${addZero(month)}-${addZero(day)}`
+}
+
+function getTime(date, hideSecond){
+  date = fixIosDateFormat(date)
+  date = new Date(date)
+  const hour = date.getHours()
+  const minute = date.getMinutes()
+  const second = date.getSeconds()
+  return hideSecond ? `${addZero(hour)}:${addZero(minute)}` : `${addZero(hour)}:${addZero(minute)}:${addZero(second)}`
+}
+
+function addZero(num) {
+  if(num < 10){
+    num = `0${num}`
+  }
+  return num
+}
+
+function getDefaultSecond(hideSecond) {
+  return hideSecond ? '00:00' : '00:00:00'
+}
+
+function dateCompare(startDate, endDate) {
+  startDate = new Date(fixIosDateFormat(startDate))
+  endDate = new Date(fixIosDateFormat(endDate))
+  return startDate <= endDate
+}
+
+function checkDate(date){
+  const dateReg = /((19|20)\d{2})(-|\/)\d{1,2}(-|\/)\d{1,2}/g
+  return date.match(dateReg)
+}
+
+const dateTimeReg = /^\d{4}-(0?[1-9]|1[012])-(0?[1-9]|[12][0-9]|3[01])( [0-5]?[0-9]:[0-5]?[0-9]:[0-5]?[0-9])?$/
+function fixIosDateFormat(value) {
+  if (typeof value === 'string' && dateTimeReg.test(value)) {
+    value = value.replace(/-/g, '/')
+  }
+  return value
+}
+
+export {Calendar, getDateTime, getDate, getTime, addZero, getDefaultSecond, dateCompare, checkDate, fixIosDateFormat}
\ No newline at end of file
diff --git a/uni_modules/uni-datetime-picker/package.json b/uni_modules/uni-datetime-picker/package.json
new file mode 100644
index 0000000..254d7e3
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/package.json
@@ -0,0 +1,87 @@
+{
+  "id": "uni-datetime-picker",
+  "displayName": "uni-datetime-picker ���������������",
+  "version": "2.2.25",
+  "description": "uni-datetime-picker ���������������������������������������������������������",
+  "keywords": [
+    "uni-datetime-picker",
+    "uni-ui",
+    "uniui",
+    "���������������������",
+    "������������"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": ""
+  },
+  "directories": {
+    "example": "../../temps/example_temps"
+  },
+"dcloudext": {
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "���",
+      "data": "���",
+      "permissions": "���"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+    "type": "component-vue"
+  },
+  "uni_modules": {
+    "dependencies": [
+			"uni-scss",
+			"uni-icons"
+		],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "App": {
+          "app-vue": "y",
+          "app-nvue": "n"
+        },
+        "H5-mobile": {
+          "Safari": "y",
+          "Android Browser": "y",
+          "���������������(Android)": "y",
+          "QQ���������(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "y",
+          "Edge": "y",
+          "Firefox": "y",
+          "Safari": "y"
+        },
+        "���������": {
+          "������": "y",
+          "������": "y",
+          "������": "y",
+          "������������": "y",
+          "QQ": "y"
+        },
+        "���������": {
+          "������": "u",
+          "������": "u"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  }
+}
diff --git a/uni_modules/uni-datetime-picker/readme.md b/uni_modules/uni-datetime-picker/readme.md
new file mode 100644
index 0000000..162fbef
--- /dev/null
+++ b/uni_modules/uni-datetime-picker/readme.md
@@ -0,0 +1,21 @@
+
+
+> `��������������������������������� 2.0.0 ������������������+��������������������������� ui ������������������������������ui ��������������������������� PC ��� ���������������������������������������������������������������������������type=time��������������� hide-second ��������������������������������������� picker���������������������������������������������������������*���uni_modules������*���������������������������`
+
+## DatetimePicker ���������������
+
+> **������������uni-datetime-picker**
+> ������������ `uDatetimePicker`
+
+
+������������������������������**���������**������������������������������������������������������������������������**������������**������������������
+
+��������������������������������������������������������������������������������������������������� picker ���������
+
+**_������ picker ������������������_**
+
+- ������������������ value, ������������ picker ������������
+- ��������������� value��������������� value ��������������������� Date.now()��� ������������������ picker ������������
+
+### [������������](https://uniapp.dcloud.io/component/uniui/uni-datetime-picker)
+#### ������������������������������������������������uni-ui������������������������������������ uni-ui ������������871950839 
\ No newline at end of file
diff --git a/uni_modules/uni-icons/changelog.md b/uni_modules/uni-icons/changelog.md
new file mode 100644
index 0000000..6449885
--- /dev/null
+++ b/uni_modules/uni-icons/changelog.md
@@ -0,0 +1,22 @@
+## 1.3.5���2022-01-24���
+- ������ size ������������������������������������������������
+## 1.3.4���2022-01-24���
+- ������ size ������������������
+## 1.3.3���2022-01-17���
+- ������ nvue ������������������������bug������������������������
+## 1.3.2���2021-12-01���
+- ������ ���������������������������
+## 1.3.1���2021-11-23���
+- ������ ��������������� type ���
+## 1.3.0���2021-11-19���
+- ������ ������������
+- ������ ���������������������������
+- ������ ������UI���������������������������������:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- ���������������������:[https://uniapp.dcloud.io/component/uniui/uni-icons](https://uniapp.dcloud.io/component/uniui/uni-icons)
+## 1.1.7���2021-11-08���
+## 1.2.0���2021-07-30���
+- ������������ vue3���������������vue3��������������� [uni-app ������������ vue3 ������](https://ask.dcloud.net.cn/article/37834)
+## 1.1.5���2021-05-12���
+- ������ ������������������
+## 1.1.4���2021-02-05���
+- ���������uni_modules������������
diff --git a/uni_modules/uni-icons/components/uni-icons/icons.js b/uni_modules/uni-icons/components/uni-icons/icons.js
new file mode 100644
index 0000000..7889936
--- /dev/null
+++ b/uni_modules/uni-icons/components/uni-icons/icons.js
@@ -0,0 +1,1169 @@
+export default {
+  "id": "2852637",
+  "name": "uniui���������",
+  "font_family": "uniicons",
+  "css_prefix_text": "uniui-",
+  "description": "",
+  "glyphs": [
+    {
+      "icon_id": "25027049",
+      "name": "yanse",
+      "font_class": "color",
+      "unicode": "e6cf",
+      "unicode_decimal": 59087
+    },
+    {
+      "icon_id": "25027048",
+      "name": "wallet",
+      "font_class": "wallet",
+      "unicode": "e6b1",
+      "unicode_decimal": 59057
+    },
+    {
+      "icon_id": "25015720",
+      "name": "settings-filled",
+      "font_class": "settings-filled",
+      "unicode": "e6ce",
+      "unicode_decimal": 59086
+    },
+    {
+      "icon_id": "25015434",
+      "name": "shimingrenzheng-filled",
+      "font_class": "auth-filled",
+      "unicode": "e6cc",
+      "unicode_decimal": 59084
+    },
+    {
+      "icon_id": "24934246",
+      "name": "shop-filled",
+      "font_class": "shop-filled",
+      "unicode": "e6cd",
+      "unicode_decimal": 59085
+    },
+    {
+      "icon_id": "24934159",
+      "name": "staff-filled-01",
+      "font_class": "staff-filled",
+      "unicode": "e6cb",
+      "unicode_decimal": 59083
+    },
+    {
+      "icon_id": "24932461",
+      "name": "VIP-filled",
+      "font_class": "vip-filled",
+      "unicode": "e6c6",
+      "unicode_decimal": 59078
+    },
+    {
+      "icon_id": "24932462",
+      "name": "plus_circle_fill",
+      "font_class": "plus-filled",
+      "unicode": "e6c7",
+      "unicode_decimal": 59079
+    },
+    {
+      "icon_id": "24932463",
+      "name": "folder_add-filled",
+      "font_class": "folder-add-filled",
+      "unicode": "e6c8",
+      "unicode_decimal": 59080
+    },
+    {
+      "icon_id": "24932464",
+      "name": "yanse-filled",
+      "font_class": "color-filled",
+      "unicode": "e6c9",
+      "unicode_decimal": 59081
+    },
+    {
+      "icon_id": "24932465",
+      "name": "tune-filled",
+      "font_class": "tune-filled",
+      "unicode": "e6ca",
+      "unicode_decimal": 59082
+    },
+    {
+      "icon_id": "24932455",
+      "name": "a-rilidaka-filled",
+      "font_class": "calendar-filled",
+      "unicode": "e6c0",
+      "unicode_decimal": 59072
+    },
+    {
+      "icon_id": "24932456",
+      "name": "notification-filled",
+      "font_class": "notification-filled",
+      "unicode": "e6c1",
+      "unicode_decimal": 59073
+    },
+    {
+      "icon_id": "24932457",
+      "name": "wallet-filled",
+      "font_class": "wallet-filled",
+      "unicode": "e6c2",
+      "unicode_decimal": 59074
+    },
+    {
+      "icon_id": "24932458",
+      "name": "paihangbang-filled",
+      "font_class": "medal-filled",
+      "unicode": "e6c3",
+      "unicode_decimal": 59075
+    },
+    {
+      "icon_id": "24932459",
+      "name": "gift-filled",
+      "font_class": "gift-filled",
+      "unicode": "e6c4",
+      "unicode_decimal": 59076
+    },
+    {
+      "icon_id": "24932460",
+      "name": "fire-filled",
+      "font_class": "fire-filled",
+      "unicode": "e6c5",
+      "unicode_decimal": 59077
+    },
+    {
+      "icon_id": "24928001",
+      "name": "refreshempty",
+      "font_class": "refreshempty",
+      "unicode": "e6bf",
+      "unicode_decimal": 59071
+    },
+    {
+      "icon_id": "24926853",
+      "name": "location-ellipse",
+      "font_class": "location-filled",
+      "unicode": "e6af",
+      "unicode_decimal": 59055
+    },
+    {
+      "icon_id": "24926735",
+      "name": "person-filled",
+      "font_class": "person-filled",
+      "unicode": "e69d",
+      "unicode_decimal": 59037
+    },
+    {
+      "icon_id": "24926703",
+      "name": "personadd-filled",
+      "font_class": "personadd-filled",
+      "unicode": "e698",
+      "unicode_decimal": 59032
+    },
+    {
+      "icon_id": "24923351",
+      "name": "back",
+      "font_class": "back",
+      "unicode": "e6b9",
+      "unicode_decimal": 59065
+    },
+    {
+      "icon_id": "24923352",
+      "name": "forward",
+      "font_class": "forward",
+      "unicode": "e6ba",
+      "unicode_decimal": 59066
+    },
+    {
+      "icon_id": "24923353",
+      "name": "arrowthinright",
+      "font_class": "arrow-right",
+      "unicode": "e6bb",
+      "unicode_decimal": 59067
+    },
+		{
+		  "icon_id": "24923353",
+		  "name": "arrowthinright",
+		  "font_class": "arrowthinright",
+		  "unicode": "e6bb",
+		  "unicode_decimal": 59067
+		},
+    {
+      "icon_id": "24923354",
+      "name": "arrowthinleft",
+      "font_class": "arrow-left",
+      "unicode": "e6bc",
+      "unicode_decimal": 59068
+    },
+		{
+		  "icon_id": "24923354",
+		  "name": "arrowthinleft",
+		  "font_class": "arrowthinleft",
+		  "unicode": "e6bc",
+		  "unicode_decimal": 59068
+		},
+    {
+      "icon_id": "24923355",
+      "name": "arrowthinup",
+      "font_class": "arrow-up",
+      "unicode": "e6bd",
+      "unicode_decimal": 59069
+    },
+		{
+		  "icon_id": "24923355",
+		  "name": "arrowthinup",
+		  "font_class": "arrowthinup",
+		  "unicode": "e6bd",
+		  "unicode_decimal": 59069
+		},
+    {
+      "icon_id": "24923356",
+      "name": "arrowthindown",
+      "font_class": "arrow-down",
+      "unicode": "e6be",
+      "unicode_decimal": 59070
+    },{
+      "icon_id": "24923356",
+      "name": "arrowthindown",
+      "font_class": "arrowthindown",
+      "unicode": "e6be",
+      "unicode_decimal": 59070
+    },
+    {
+      "icon_id": "24923349",
+      "name": "arrowdown",
+      "font_class": "bottom",
+      "unicode": "e6b8",
+      "unicode_decimal": 59064
+    },{
+      "icon_id": "24923349",
+      "name": "arrowdown",
+      "font_class": "arrowdown",
+      "unicode": "e6b8",
+      "unicode_decimal": 59064
+    },
+    {
+      "icon_id": "24923346",
+      "name": "arrowright",
+      "font_class": "right",
+      "unicode": "e6b5",
+      "unicode_decimal": 59061
+    },
+		{
+		  "icon_id": "24923346",
+		  "name": "arrowright",
+		  "font_class": "arrowright",
+		  "unicode": "e6b5",
+		  "unicode_decimal": 59061
+		},
+    {
+      "icon_id": "24923347",
+      "name": "arrowup",
+      "font_class": "top",
+      "unicode": "e6b6",
+      "unicode_decimal": 59062
+    },
+		{
+		  "icon_id": "24923347",
+		  "name": "arrowup",
+		  "font_class": "arrowup",
+		  "unicode": "e6b6",
+		  "unicode_decimal": 59062
+		},
+    {
+      "icon_id": "24923348",
+      "name": "arrowleft",
+      "font_class": "left",
+      "unicode": "e6b7",
+      "unicode_decimal": 59063
+    },
+		{
+		  "icon_id": "24923348",
+		  "name": "arrowleft",
+		  "font_class": "arrowleft",
+		  "unicode": "e6b7",
+		  "unicode_decimal": 59063
+		},
+    {
+      "icon_id": "24923334",
+      "name": "eye",
+      "font_class": "eye",
+      "unicode": "e651",
+      "unicode_decimal": 58961
+    },
+    {
+      "icon_id": "24923335",
+      "name": "eye-filled",
+      "font_class": "eye-filled",
+      "unicode": "e66a",
+      "unicode_decimal": 58986
+    },
+    {
+      "icon_id": "24923336",
+      "name": "eye-slash",
+      "font_class": "eye-slash",
+      "unicode": "e6b3",
+      "unicode_decimal": 59059
+    },
+    {
+      "icon_id": "24923337",
+      "name": "eye-slash-filled",
+      "font_class": "eye-slash-filled",
+      "unicode": "e6b4",
+      "unicode_decimal": 59060
+    },
+    {
+      "icon_id": "24923305",
+      "name": "info-filled",
+      "font_class": "info-filled",
+      "unicode": "e649",
+      "unicode_decimal": 58953
+    },
+    {
+      "icon_id": "24923299",
+      "name": "reload-01",
+      "font_class": "reload",
+      "unicode": "e6b2",
+      "unicode_decimal": 59058
+    },
+    {
+      "icon_id": "24923195",
+      "name": "mic_slash_fill",
+      "font_class": "micoff-filled",
+      "unicode": "e6b0",
+      "unicode_decimal": 59056
+    },
+    {
+      "icon_id": "24923165",
+      "name": "map-pin-ellipse",
+      "font_class": "map-pin-ellipse",
+      "unicode": "e6ac",
+      "unicode_decimal": 59052
+    },
+    {
+      "icon_id": "24923166",
+      "name": "map-pin",
+      "font_class": "map-pin",
+      "unicode": "e6ad",
+      "unicode_decimal": 59053
+    },
+    {
+      "icon_id": "24923167",
+      "name": "location",
+      "font_class": "location",
+      "unicode": "e6ae",
+      "unicode_decimal": 59054
+    },
+    {
+      "icon_id": "24923064",
+      "name": "starhalf",
+      "font_class": "starhalf",
+      "unicode": "e683",
+      "unicode_decimal": 59011
+    },
+    {
+      "icon_id": "24923065",
+      "name": "star",
+      "font_class": "star",
+      "unicode": "e688",
+      "unicode_decimal": 59016
+    },
+    {
+      "icon_id": "24923066",
+      "name": "star-filled",
+      "font_class": "star-filled",
+      "unicode": "e68f",
+      "unicode_decimal": 59023
+    },
+    {
+      "icon_id": "24899646",
+      "name": "a-rilidaka",
+      "font_class": "calendar",
+      "unicode": "e6a0",
+      "unicode_decimal": 59040
+    },
+    {
+      "icon_id": "24899647",
+      "name": "fire",
+      "font_class": "fire",
+      "unicode": "e6a1",
+      "unicode_decimal": 59041
+    },
+    {
+      "icon_id": "24899648",
+      "name": "paihangbang",
+      "font_class": "medal",
+      "unicode": "e6a2",
+      "unicode_decimal": 59042
+    },
+    {
+      "icon_id": "24899649",
+      "name": "font",
+      "font_class": "font",
+      "unicode": "e6a3",
+      "unicode_decimal": 59043
+    },
+    {
+      "icon_id": "24899650",
+      "name": "gift",
+      "font_class": "gift",
+      "unicode": "e6a4",
+      "unicode_decimal": 59044
+    },
+    {
+      "icon_id": "24899651",
+      "name": "link",
+      "font_class": "link",
+      "unicode": "e6a5",
+      "unicode_decimal": 59045
+    },
+    {
+      "icon_id": "24899652",
+      "name": "notification",
+      "font_class": "notification",
+      "unicode": "e6a6",
+      "unicode_decimal": 59046
+    },
+    {
+      "icon_id": "24899653",
+      "name": "staff",
+      "font_class": "staff",
+      "unicode": "e6a7",
+      "unicode_decimal": 59047
+    },
+    {
+      "icon_id": "24899654",
+      "name": "VIP",
+      "font_class": "vip",
+      "unicode": "e6a8",
+      "unicode_decimal": 59048
+    },
+    {
+      "icon_id": "24899655",
+      "name": "folder_add",
+      "font_class": "folder-add",
+      "unicode": "e6a9",
+      "unicode_decimal": 59049
+    },
+    {
+      "icon_id": "24899656",
+      "name": "tune",
+      "font_class": "tune",
+      "unicode": "e6aa",
+      "unicode_decimal": 59050
+    },
+    {
+      "icon_id": "24899657",
+      "name": "shimingrenzheng",
+      "font_class": "auth",
+      "unicode": "e6ab",
+      "unicode_decimal": 59051
+    },
+    {
+      "icon_id": "24899565",
+      "name": "person",
+      "font_class": "person",
+      "unicode": "e699",
+      "unicode_decimal": 59033
+    },
+    {
+      "icon_id": "24899566",
+      "name": "email-filled",
+      "font_class": "email-filled",
+      "unicode": "e69a",
+      "unicode_decimal": 59034
+    },
+    {
+      "icon_id": "24899567",
+      "name": "phone-filled",
+      "font_class": "phone-filled",
+      "unicode": "e69b",
+      "unicode_decimal": 59035
+    },
+    {
+      "icon_id": "24899568",
+      "name": "phone",
+      "font_class": "phone",
+      "unicode": "e69c",
+      "unicode_decimal": 59036
+    },
+    {
+      "icon_id": "24899570",
+      "name": "email",
+      "font_class": "email",
+      "unicode": "e69e",
+      "unicode_decimal": 59038
+    },
+    {
+      "icon_id": "24899571",
+      "name": "personadd",
+      "font_class": "personadd",
+      "unicode": "e69f",
+      "unicode_decimal": 59039
+    },
+    {
+      "icon_id": "24899558",
+      "name": "chatboxes-filled",
+      "font_class": "chatboxes-filled",
+      "unicode": "e692",
+      "unicode_decimal": 59026
+    },
+    {
+      "icon_id": "24899559",
+      "name": "contact",
+      "font_class": "contact",
+      "unicode": "e693",
+      "unicode_decimal": 59027
+    },
+    {
+      "icon_id": "24899560",
+      "name": "chatbubble-filled",
+      "font_class": "chatbubble-filled",
+      "unicode": "e694",
+      "unicode_decimal": 59028
+    },
+    {
+      "icon_id": "24899561",
+      "name": "contact-filled",
+      "font_class": "contact-filled",
+      "unicode": "e695",
+      "unicode_decimal": 59029
+    },
+    {
+      "icon_id": "24899562",
+      "name": "chatboxes",
+      "font_class": "chatboxes",
+      "unicode": "e696",
+      "unicode_decimal": 59030
+    },
+    {
+      "icon_id": "24899563",
+      "name": "chatbubble",
+      "font_class": "chatbubble",
+      "unicode": "e697",
+      "unicode_decimal": 59031
+    },
+    {
+      "icon_id": "24881290",
+      "name": "upload-filled",
+      "font_class": "upload-filled",
+      "unicode": "e68e",
+      "unicode_decimal": 59022
+    },
+    {
+      "icon_id": "24881292",
+      "name": "upload",
+      "font_class": "upload",
+      "unicode": "e690",
+      "unicode_decimal": 59024
+    },
+    {
+      "icon_id": "24881293",
+      "name": "weixin",
+      "font_class": "weixin",
+      "unicode": "e691",
+      "unicode_decimal": 59025
+    },
+    {
+      "icon_id": "24881274",
+      "name": "compose",
+      "font_class": "compose",
+      "unicode": "e67f",
+      "unicode_decimal": 59007
+    },
+    {
+      "icon_id": "24881275",
+      "name": "qq",
+      "font_class": "qq",
+      "unicode": "e680",
+      "unicode_decimal": 59008
+    },
+    {
+      "icon_id": "24881276",
+      "name": "download-filled",
+      "font_class": "download-filled",
+      "unicode": "e681",
+      "unicode_decimal": 59009
+    },
+    {
+      "icon_id": "24881277",
+      "name": "pengyouquan",
+      "font_class": "pyq",
+      "unicode": "e682",
+      "unicode_decimal": 59010
+    },
+    {
+      "icon_id": "24881279",
+      "name": "sound",
+      "font_class": "sound",
+      "unicode": "e684",
+      "unicode_decimal": 59012
+    },
+    {
+      "icon_id": "24881280",
+      "name": "trash-filled",
+      "font_class": "trash-filled",
+      "unicode": "e685",
+      "unicode_decimal": 59013
+    },
+    {
+      "icon_id": "24881281",
+      "name": "sound-filled",
+      "font_class": "sound-filled",
+      "unicode": "e686",
+      "unicode_decimal": 59014
+    },
+    {
+      "icon_id": "24881282",
+      "name": "trash",
+      "font_class": "trash",
+      "unicode": "e687",
+      "unicode_decimal": 59015
+    },
+    {
+      "icon_id": "24881284",
+      "name": "videocam-filled",
+      "font_class": "videocam-filled",
+      "unicode": "e689",
+      "unicode_decimal": 59017
+    },
+    {
+      "icon_id": "24881285",
+      "name": "spinner-cycle",
+      "font_class": "spinner-cycle",
+      "unicode": "e68a",
+      "unicode_decimal": 59018
+    },
+    {
+      "icon_id": "24881286",
+      "name": "weibo",
+      "font_class": "weibo",
+      "unicode": "e68b",
+      "unicode_decimal": 59019
+    },
+    {
+      "icon_id": "24881288",
+      "name": "videocam",
+      "font_class": "videocam",
+      "unicode": "e68c",
+      "unicode_decimal": 59020
+    },
+    {
+      "icon_id": "24881289",
+      "name": "download",
+      "font_class": "download",
+      "unicode": "e68d",
+      "unicode_decimal": 59021
+    },
+    {
+      "icon_id": "24879601",
+      "name": "help",
+      "font_class": "help",
+      "unicode": "e679",
+      "unicode_decimal": 59001
+    },
+    {
+      "icon_id": "24879602",
+      "name": "navigate-filled",
+      "font_class": "navigate-filled",
+      "unicode": "e67a",
+      "unicode_decimal": 59002
+    },
+    {
+      "icon_id": "24879603",
+      "name": "plusempty",
+      "font_class": "plusempty",
+      "unicode": "e67b",
+      "unicode_decimal": 59003
+    },
+    {
+      "icon_id": "24879604",
+      "name": "smallcircle",
+      "font_class": "smallcircle",
+      "unicode": "e67c",
+      "unicode_decimal": 59004
+    },
+    {
+      "icon_id": "24879605",
+      "name": "minus-filled",
+      "font_class": "minus-filled",
+      "unicode": "e67d",
+      "unicode_decimal": 59005
+    },
+    {
+      "icon_id": "24879606",
+      "name": "micoff",
+      "font_class": "micoff",
+      "unicode": "e67e",
+      "unicode_decimal": 59006
+    },
+    {
+      "icon_id": "24879588",
+      "name": "closeempty",
+      "font_class": "closeempty",
+      "unicode": "e66c",
+      "unicode_decimal": 58988
+    },
+    {
+      "icon_id": "24879589",
+      "name": "clear",
+      "font_class": "clear",
+      "unicode": "e66d",
+      "unicode_decimal": 58989
+    },
+    {
+      "icon_id": "24879590",
+      "name": "navigate",
+      "font_class": "navigate",
+      "unicode": "e66e",
+      "unicode_decimal": 58990
+    },
+    {
+      "icon_id": "24879591",
+      "name": "minus",
+      "font_class": "minus",
+      "unicode": "e66f",
+      "unicode_decimal": 58991
+    },
+    {
+      "icon_id": "24879592",
+      "name": "image",
+      "font_class": "image",
+      "unicode": "e670",
+      "unicode_decimal": 58992
+    },
+    {
+      "icon_id": "24879593",
+      "name": "mic",
+      "font_class": "mic",
+      "unicode": "e671",
+      "unicode_decimal": 58993
+    },
+    {
+      "icon_id": "24879594",
+      "name": "paperplane",
+      "font_class": "paperplane",
+      "unicode": "e672",
+      "unicode_decimal": 58994
+    },
+    {
+      "icon_id": "24879595",
+      "name": "close",
+      "font_class": "close",
+      "unicode": "e673",
+      "unicode_decimal": 58995
+    },
+    {
+      "icon_id": "24879596",
+      "name": "help-filled",
+      "font_class": "help-filled",
+      "unicode": "e674",
+      "unicode_decimal": 58996
+    },
+    {
+      "icon_id": "24879597",
+      "name": "plus-filled",
+      "font_class": "paperplane-filled",
+      "unicode": "e675",
+      "unicode_decimal": 58997
+    },
+    {
+      "icon_id": "24879598",
+      "name": "plus",
+      "font_class": "plus",
+      "unicode": "e676",
+      "unicode_decimal": 58998
+    },
+    {
+      "icon_id": "24879599",
+      "name": "mic-filled",
+      "font_class": "mic-filled",
+      "unicode": "e677",
+      "unicode_decimal": 58999
+    },
+    {
+      "icon_id": "24879600",
+      "name": "image-filled",
+      "font_class": "image-filled",
+      "unicode": "e678",
+      "unicode_decimal": 59000
+    },
+    {
+      "icon_id": "24855900",
+      "name": "locked-filled",
+      "font_class": "locked-filled",
+      "unicode": "e668",
+      "unicode_decimal": 58984
+    },
+    {
+      "icon_id": "24855901",
+      "name": "info",
+      "font_class": "info",
+      "unicode": "e669",
+      "unicode_decimal": 58985
+    },
+    {
+      "icon_id": "24855903",
+      "name": "locked",
+      "font_class": "locked",
+      "unicode": "e66b",
+      "unicode_decimal": 58987
+    },
+    {
+      "icon_id": "24855884",
+      "name": "camera-filled",
+      "font_class": "camera-filled",
+      "unicode": "e658",
+      "unicode_decimal": 58968
+    },
+    {
+      "icon_id": "24855885",
+      "name": "chat-filled",
+      "font_class": "chat-filled",
+      "unicode": "e659",
+      "unicode_decimal": 58969
+    },
+    {
+      "icon_id": "24855886",
+      "name": "camera",
+      "font_class": "camera",
+      "unicode": "e65a",
+      "unicode_decimal": 58970
+    },
+    {
+      "icon_id": "24855887",
+      "name": "circle",
+      "font_class": "circle",
+      "unicode": "e65b",
+      "unicode_decimal": 58971
+    },
+    {
+      "icon_id": "24855888",
+      "name": "checkmarkempty",
+      "font_class": "checkmarkempty",
+      "unicode": "e65c",
+      "unicode_decimal": 58972
+    },
+    {
+      "icon_id": "24855889",
+      "name": "chat",
+      "font_class": "chat",
+      "unicode": "e65d",
+      "unicode_decimal": 58973
+    },
+    {
+      "icon_id": "24855890",
+      "name": "circle-filled",
+      "font_class": "circle-filled",
+      "unicode": "e65e",
+      "unicode_decimal": 58974
+    },
+    {
+      "icon_id": "24855891",
+      "name": "flag",
+      "font_class": "flag",
+      "unicode": "e65f",
+      "unicode_decimal": 58975
+    },
+    {
+      "icon_id": "24855892",
+      "name": "flag-filled",
+      "font_class": "flag-filled",
+      "unicode": "e660",
+      "unicode_decimal": 58976
+    },
+    {
+      "icon_id": "24855893",
+      "name": "gear-filled",
+      "font_class": "gear-filled",
+      "unicode": "e661",
+      "unicode_decimal": 58977
+    },
+    {
+      "icon_id": "24855894",
+      "name": "home",
+      "font_class": "home",
+      "unicode": "e662",
+      "unicode_decimal": 58978
+    },
+    {
+      "icon_id": "24855895",
+      "name": "home-filled",
+      "font_class": "home-filled",
+      "unicode": "e663",
+      "unicode_decimal": 58979
+    },
+    {
+      "icon_id": "24855896",
+      "name": "gear",
+      "font_class": "gear",
+      "unicode": "e664",
+      "unicode_decimal": 58980
+    },
+    {
+      "icon_id": "24855897",
+      "name": "smallcircle-filled",
+      "font_class": "smallcircle-filled",
+      "unicode": "e665",
+      "unicode_decimal": 58981
+    },
+    {
+      "icon_id": "24855898",
+      "name": "map-filled",
+      "font_class": "map-filled",
+      "unicode": "e666",
+      "unicode_decimal": 58982
+    },
+    {
+      "icon_id": "24855899",
+      "name": "map",
+      "font_class": "map",
+      "unicode": "e667",
+      "unicode_decimal": 58983
+    },
+    {
+      "icon_id": "24855825",
+      "name": "refresh-filled",
+      "font_class": "refresh-filled",
+      "unicode": "e656",
+      "unicode_decimal": 58966
+    },
+    {
+      "icon_id": "24855826",
+      "name": "refresh",
+      "font_class": "refresh",
+      "unicode": "e657",
+      "unicode_decimal": 58967
+    },
+    {
+      "icon_id": "24855808",
+      "name": "cloud-upload",
+      "font_class": "cloud-upload",
+      "unicode": "e645",
+      "unicode_decimal": 58949
+    },
+    {
+      "icon_id": "24855809",
+      "name": "cloud-download-filled",
+      "font_class": "cloud-download-filled",
+      "unicode": "e646",
+      "unicode_decimal": 58950
+    },
+    {
+      "icon_id": "24855810",
+      "name": "cloud-download",
+      "font_class": "cloud-download",
+      "unicode": "e647",
+      "unicode_decimal": 58951
+    },
+    {
+      "icon_id": "24855811",
+      "name": "cloud-upload-filled",
+      "font_class": "cloud-upload-filled",
+      "unicode": "e648",
+      "unicode_decimal": 58952
+    },
+    {
+      "icon_id": "24855813",
+      "name": "redo",
+      "font_class": "redo",
+      "unicode": "e64a",
+      "unicode_decimal": 58954
+    },
+    {
+      "icon_id": "24855814",
+      "name": "images-filled",
+      "font_class": "images-filled",
+      "unicode": "e64b",
+      "unicode_decimal": 58955
+    },
+    {
+      "icon_id": "24855815",
+      "name": "undo-filled",
+      "font_class": "undo-filled",
+      "unicode": "e64c",
+      "unicode_decimal": 58956
+    },
+    {
+      "icon_id": "24855816",
+      "name": "more",
+      "font_class": "more",
+      "unicode": "e64d",
+      "unicode_decimal": 58957
+    },
+    {
+      "icon_id": "24855817",
+      "name": "more-filled",
+      "font_class": "more-filled",
+      "unicode": "e64e",
+      "unicode_decimal": 58958
+    },
+    {
+      "icon_id": "24855818",
+      "name": "undo",
+      "font_class": "undo",
+      "unicode": "e64f",
+      "unicode_decimal": 58959
+    },
+    {
+      "icon_id": "24855819",
+      "name": "images",
+      "font_class": "images",
+      "unicode": "e650",
+      "unicode_decimal": 58960
+    },
+    {
+      "icon_id": "24855821",
+      "name": "paperclip",
+      "font_class": "paperclip",
+      "unicode": "e652",
+      "unicode_decimal": 58962
+    },
+    {
+      "icon_id": "24855822",
+      "name": "settings",
+      "font_class": "settings",
+      "unicode": "e653",
+      "unicode_decimal": 58963
+    },
+    {
+      "icon_id": "24855823",
+      "name": "search",
+      "font_class": "search",
+      "unicode": "e654",
+      "unicode_decimal": 58964
+    },
+    {
+      "icon_id": "24855824",
+      "name": "redo-filled",
+      "font_class": "redo-filled",
+      "unicode": "e655",
+      "unicode_decimal": 58965
+    },
+    {
+      "icon_id": "24841702",
+      "name": "list",
+      "font_class": "list",
+      "unicode": "e644",
+      "unicode_decimal": 58948
+    },
+    {
+      "icon_id": "24841489",
+      "name": "mail-open-filled",
+      "font_class": "mail-open-filled",
+      "unicode": "e63a",
+      "unicode_decimal": 58938
+    },
+    {
+      "icon_id": "24841491",
+      "name": "hand-thumbsdown-filled",
+      "font_class": "hand-down-filled",
+      "unicode": "e63c",
+      "unicode_decimal": 58940
+    },
+    {
+      "icon_id": "24841492",
+      "name": "hand-thumbsdown",
+      "font_class": "hand-down",
+      "unicode": "e63d",
+      "unicode_decimal": 58941
+    },
+    {
+      "icon_id": "24841493",
+      "name": "hand-thumbsup-filled",
+      "font_class": "hand-up-filled",
+      "unicode": "e63e",
+      "unicode_decimal": 58942
+    },
+    {
+      "icon_id": "24841494",
+      "name": "hand-thumbsup",
+      "font_class": "hand-up",
+      "unicode": "e63f",
+      "unicode_decimal": 58943
+    },
+    {
+      "icon_id": "24841496",
+      "name": "heart-filled",
+      "font_class": "heart-filled",
+      "unicode": "e641",
+      "unicode_decimal": 58945
+    },
+    {
+      "icon_id": "24841498",
+      "name": "mail-open",
+      "font_class": "mail-open",
+      "unicode": "e643",
+      "unicode_decimal": 58947
+    },
+    {
+      "icon_id": "24841488",
+      "name": "heart",
+      "font_class": "heart",
+      "unicode": "e639",
+      "unicode_decimal": 58937
+    },
+    {
+      "icon_id": "24839963",
+      "name": "loop",
+      "font_class": "loop",
+      "unicode": "e633",
+      "unicode_decimal": 58931
+    },
+    {
+      "icon_id": "24839866",
+      "name": "pulldown",
+      "font_class": "pulldown",
+      "unicode": "e632",
+      "unicode_decimal": 58930
+    },
+    {
+      "icon_id": "24813798",
+      "name": "scan",
+      "font_class": "scan",
+      "unicode": "e62a",
+      "unicode_decimal": 58922
+    },
+    {
+      "icon_id": "24813786",
+      "name": "bars",
+      "font_class": "bars",
+      "unicode": "e627",
+      "unicode_decimal": 58919
+    },
+    {
+      "icon_id": "24813788",
+      "name": "cart-filled",
+      "font_class": "cart-filled",
+      "unicode": "e629",
+      "unicode_decimal": 58921
+    },
+    {
+      "icon_id": "24813790",
+      "name": "checkbox",
+      "font_class": "checkbox",
+      "unicode": "e62b",
+      "unicode_decimal": 58923
+    },
+    {
+      "icon_id": "24813791",
+      "name": "checkbox-filled",
+      "font_class": "checkbox-filled",
+      "unicode": "e62c",
+      "unicode_decimal": 58924
+    },
+    {
+      "icon_id": "24813794",
+      "name": "shop",
+      "font_class": "shop",
+      "unicode": "e62f",
+      "unicode_decimal": 58927
+    },
+    {
+      "icon_id": "24813795",
+      "name": "headphones",
+      "font_class": "headphones",
+      "unicode": "e630",
+      "unicode_decimal": 58928
+    },
+    {
+      "icon_id": "24813796",
+      "name": "cart",
+      "font_class": "cart",
+      "unicode": "e631",
+      "unicode_decimal": 58929
+    }
+  ]
+}
diff --git a/uni_modules/uni-icons/components/uni-icons/uni-icons.vue b/uni_modules/uni-icons/components/uni-icons/uni-icons.vue
new file mode 100644
index 0000000..86e7444
--- /dev/null
+++ b/uni_modules/uni-icons/components/uni-icons/uni-icons.vue
@@ -0,0 +1,96 @@
+<template>
+	<!-- #ifdef APP-NVUE -->
+	<text :style="{ color: color, 'font-size': iconSize }" class="uni-icons" @click="_onClick">{{unicode}}</text>
+	<!-- #endif -->
+	<!-- #ifndef APP-NVUE -->
+	<text :style="{ color: color, 'font-size': iconSize }" class="uni-icons" :class="['uniui-'+type,customPrefix,customPrefix?type:'']" @click="_onClick"></text>
+	<!-- #endif -->
+</template>
+
+<script>
+	import icons from './icons.js';
+	const getVal = (val) => {
+		const reg = /^[0-9]*$/g
+		return (typeof val === 'number' ||���reg.test(val) )? val + 'px' : val;
+	} 
+	// #ifdef APP-NVUE
+	var domModule = weex.requireModule('dom');
+	import iconUrl from './uniicons.ttf'
+	domModule.addRule('fontFace', {
+		'fontFamily': "uniicons",
+		'src': "url('"+iconUrl+"')"
+	});
+	// #endif
+
+	/**
+	 * Icons ������
+	 * @description ������������ icons ������
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=28
+	 * @property {Number} size ������������
+	 * @property {String} type ���������������������������
+	 * @property {String} color ������������
+	 * @property {String} customPrefix ���������������
+	 * @event {Function} click ������ Icon ������������
+	 */
+	export default {
+		name: 'UniIcons',
+		emits:['click'],
+		props: {
+			type: {
+				type: String,
+				default: ''
+			},
+			color: {
+				type: String,
+				default: '#333333'
+			},
+			size: {
+				type: [Number, String],
+				default: 16
+			},
+			customPrefix:{
+				type: String,
+				default: ''
+			}
+		},
+		data() {
+			return {
+				icons: icons.glyphs
+			}
+		},
+		computed:{
+			unicode(){
+				let code = this.icons.find(v=>v.font_class === this.type)
+				if(code){
+					return unescape(`%u${code.unicode}`)
+				}
+				return ''
+			},
+			iconSize(){
+				return getVal(this.size)
+			}
+		},
+		methods: {
+			_onClick() {
+				this.$emit('click')
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	/* #ifndef APP-NVUE */
+	@import './uniicons.css';
+	@font-face {
+		font-family: uniicons;
+		src: url('./uniicons.ttf') format('truetype');
+	}
+
+	/* #endif */
+	.uni-icons {
+		font-family: uniicons;
+		text-decoration: none;
+		text-align: center;
+	}
+
+</style>
diff --git a/uni_modules/uni-icons/components/uni-icons/uniicons.css b/uni_modules/uni-icons/components/uni-icons/uniicons.css
new file mode 100644
index 0000000..2f56eab
--- /dev/null
+++ b/uni_modules/uni-icons/components/uni-icons/uniicons.css
@@ -0,0 +1,663 @@
+.uniui-color:before {
+  content: "\e6cf";
+}
+
+.uniui-wallet:before {
+  content: "\e6b1";
+}
+
+.uniui-settings-filled:before {
+  content: "\e6ce";
+}
+
+.uniui-auth-filled:before {
+  content: "\e6cc";
+}
+
+.uniui-shop-filled:before {
+  content: "\e6cd";
+}
+
+.uniui-staff-filled:before {
+  content: "\e6cb";
+}
+
+.uniui-vip-filled:before {
+  content: "\e6c6";
+}
+
+.uniui-plus-filled:before {
+  content: "\e6c7";
+}
+
+.uniui-folder-add-filled:before {
+  content: "\e6c8";
+}
+
+.uniui-color-filled:before {
+  content: "\e6c9";
+}
+
+.uniui-tune-filled:before {
+  content: "\e6ca";
+}
+
+.uniui-calendar-filled:before {
+  content: "\e6c0";
+}
+
+.uniui-notification-filled:before {
+  content: "\e6c1";
+}
+
+.uniui-wallet-filled:before {
+  content: "\e6c2";
+}
+
+.uniui-medal-filled:before {
+  content: "\e6c3";
+}
+
+.uniui-gift-filled:before {
+  content: "\e6c4";
+}
+
+.uniui-fire-filled:before {
+  content: "\e6c5";
+}
+
+.uniui-refreshempty:before {
+  content: "\e6bf";
+}
+
+.uniui-location-filled:before {
+  content: "\e6af";
+}
+
+.uniui-person-filled:before {
+  content: "\e69d";
+}
+
+.uniui-personadd-filled:before {
+  content: "\e698";
+}
+
+.uniui-back:before {
+  content: "\e6b9";
+}
+
+.uniui-forward:before {
+  content: "\e6ba";
+}
+
+.uniui-arrow-right:before {
+  content: "\e6bb";
+}
+
+.uniui-arrowthinright:before {
+  content: "\e6bb";
+}
+
+.uniui-arrow-left:before {
+  content: "\e6bc";
+}
+
+.uniui-arrowthinleft:before {
+  content: "\e6bc";
+}
+
+.uniui-arrow-up:before {
+  content: "\e6bd";
+}
+
+.uniui-arrowthinup:before {
+  content: "\e6bd";
+}
+
+.uniui-arrow-down:before {
+  content: "\e6be";
+}
+
+.uniui-arrowthindown:before {
+  content: "\e6be";
+}
+
+.uniui-bottom:before {
+  content: "\e6b8";
+}
+
+.uniui-arrowdown:before {
+  content: "\e6b8";
+}
+
+.uniui-right:before {
+  content: "\e6b5";
+}
+
+.uniui-arrowright:before {
+  content: "\e6b5";
+}
+
+.uniui-top:before {
+  content: "\e6b6";
+}
+
+.uniui-arrowup:before {
+  content: "\e6b6";
+}
+
+.uniui-left:before {
+  content: "\e6b7";
+}
+
+.uniui-arrowleft:before {
+  content: "\e6b7";
+}
+
+.uniui-eye:before {
+  content: "\e651";
+}
+
+.uniui-eye-filled:before {
+  content: "\e66a";
+}
+
+.uniui-eye-slash:before {
+  content: "\e6b3";
+}
+
+.uniui-eye-slash-filled:before {
+  content: "\e6b4";
+}
+
+.uniui-info-filled:before {
+  content: "\e649";
+}
+
+.uniui-reload:before {
+  content: "\e6b2";
+}
+
+.uniui-micoff-filled:before {
+  content: "\e6b0";
+}
+
+.uniui-map-pin-ellipse:before {
+  content: "\e6ac";
+}
+
+.uniui-map-pin:before {
+  content: "\e6ad";
+}
+
+.uniui-location:before {
+  content: "\e6ae";
+}
+
+.uniui-starhalf:before {
+  content: "\e683";
+}
+
+.uniui-star:before {
+  content: "\e688";
+}
+
+.uniui-star-filled:before {
+  content: "\e68f";
+}
+
+.uniui-calendar:before {
+  content: "\e6a0";
+}
+
+.uniui-fire:before {
+  content: "\e6a1";
+}
+
+.uniui-medal:before {
+  content: "\e6a2";
+}
+
+.uniui-font:before {
+  content: "\e6a3";
+}
+
+.uniui-gift:before {
+  content: "\e6a4";
+}
+
+.uniui-link:before {
+  content: "\e6a5";
+}
+
+.uniui-notification:before {
+  content: "\e6a6";
+}
+
+.uniui-staff:before {
+  content: "\e6a7";
+}
+
+.uniui-vip:before {
+  content: "\e6a8";
+}
+
+.uniui-folder-add:before {
+  content: "\e6a9";
+}
+
+.uniui-tune:before {
+  content: "\e6aa";
+}
+
+.uniui-auth:before {
+  content: "\e6ab";
+}
+
+.uniui-person:before {
+  content: "\e699";
+}
+
+.uniui-email-filled:before {
+  content: "\e69a";
+}
+
+.uniui-phone-filled:before {
+  content: "\e69b";
+}
+
+.uniui-phone:before {
+  content: "\e69c";
+}
+
+.uniui-email:before {
+  content: "\e69e";
+}
+
+.uniui-personadd:before {
+  content: "\e69f";
+}
+
+.uniui-chatboxes-filled:before {
+  content: "\e692";
+}
+
+.uniui-contact:before {
+  content: "\e693";
+}
+
+.uniui-chatbubble-filled:before {
+  content: "\e694";
+}
+
+.uniui-contact-filled:before {
+  content: "\e695";
+}
+
+.uniui-chatboxes:before {
+  content: "\e696";
+}
+
+.uniui-chatbubble:before {
+  content: "\e697";
+}
+
+.uniui-upload-filled:before {
+  content: "\e68e";
+}
+
+.uniui-upload:before {
+  content: "\e690";
+}
+
+.uniui-weixin:before {
+  content: "\e691";
+}
+
+.uniui-compose:before {
+  content: "\e67f";
+}
+
+.uniui-qq:before {
+  content: "\e680";
+}
+
+.uniui-download-filled:before {
+  content: "\e681";
+}
+
+.uniui-pyq:before {
+  content: "\e682";
+}
+
+.uniui-sound:before {
+  content: "\e684";
+}
+
+.uniui-trash-filled:before {
+  content: "\e685";
+}
+
+.uniui-sound-filled:before {
+  content: "\e686";
+}
+
+.uniui-trash:before {
+  content: "\e687";
+}
+
+.uniui-videocam-filled:before {
+  content: "\e689";
+}
+
+.uniui-spinner-cycle:before {
+  content: "\e68a";
+}
+
+.uniui-weibo:before {
+  content: "\e68b";
+}
+
+.uniui-videocam:before {
+  content: "\e68c";
+}
+
+.uniui-download:before {
+  content: "\e68d";
+}
+
+.uniui-help:before {
+  content: "\e679";
+}
+
+.uniui-navigate-filled:before {
+  content: "\e67a";
+}
+
+.uniui-plusempty:before {
+  content: "\e67b";
+}
+
+.uniui-smallcircle:before {
+  content: "\e67c";
+}
+
+.uniui-minus-filled:before {
+  content: "\e67d";
+}
+
+.uniui-micoff:before {
+  content: "\e67e";
+}
+
+.uniui-closeempty:before {
+  content: "\e66c";
+}
+
+.uniui-clear:before {
+  content: "\e66d";
+}
+
+.uniui-navigate:before {
+  content: "\e66e";
+}
+
+.uniui-minus:before {
+  content: "\e66f";
+}
+
+.uniui-image:before {
+  content: "\e670";
+}
+
+.uniui-mic:before {
+  content: "\e671";
+}
+
+.uniui-paperplane:before {
+  content: "\e672";
+}
+
+.uniui-close:before {
+  content: "\e673";
+}
+
+.uniui-help-filled:before {
+  content: "\e674";
+}
+
+.uniui-paperplane-filled:before {
+  content: "\e675";
+}
+
+.uniui-plus:before {
+  content: "\e676";
+}
+
+.uniui-mic-filled:before {
+  content: "\e677";
+}
+
+.uniui-image-filled:before {
+  content: "\e678";
+}
+
+.uniui-locked-filled:before {
+  content: "\e668";
+}
+
+.uniui-info:before {
+  content: "\e669";
+}
+
+.uniui-locked:before {
+  content: "\e66b";
+}
+
+.uniui-camera-filled:before {
+  content: "\e658";
+}
+
+.uniui-chat-filled:before {
+  content: "\e659";
+}
+
+.uniui-camera:before {
+  content: "\e65a";
+}
+
+.uniui-circle:before {
+  content: "\e65b";
+}
+
+.uniui-checkmarkempty:before {
+  content: "\e65c";
+}
+
+.uniui-chat:before {
+  content: "\e65d";
+}
+
+.uniui-circle-filled:before {
+  content: "\e65e";
+}
+
+.uniui-flag:before {
+  content: "\e65f";
+}
+
+.uniui-flag-filled:before {
+  content: "\e660";
+}
+
+.uniui-gear-filled:before {
+  content: "\e661";
+}
+
+.uniui-home:before {
+  content: "\e662";
+}
+
+.uniui-home-filled:before {
+  content: "\e663";
+}
+
+.uniui-gear:before {
+  content: "\e664";
+}
+
+.uniui-smallcircle-filled:before {
+  content: "\e665";
+}
+
+.uniui-map-filled:before {
+  content: "\e666";
+}
+
+.uniui-map:before {
+  content: "\e667";
+}
+
+.uniui-refresh-filled:before {
+  content: "\e656";
+}
+
+.uniui-refresh:before {
+  content: "\e657";
+}
+
+.uniui-cloud-upload:before {
+  content: "\e645";
+}
+
+.uniui-cloud-download-filled:before {
+  content: "\e646";
+}
+
+.uniui-cloud-download:before {
+  content: "\e647";
+}
+
+.uniui-cloud-upload-filled:before {
+  content: "\e648";
+}
+
+.uniui-redo:before {
+  content: "\e64a";
+}
+
+.uniui-images-filled:before {
+  content: "\e64b";
+}
+
+.uniui-undo-filled:before {
+  content: "\e64c";
+}
+
+.uniui-more:before {
+  content: "\e64d";
+}
+
+.uniui-more-filled:before {
+  content: "\e64e";
+}
+
+.uniui-undo:before {
+  content: "\e64f";
+}
+
+.uniui-images:before {
+  content: "\e650";
+}
+
+.uniui-paperclip:before {
+  content: "\e652";
+}
+
+.uniui-settings:before {
+  content: "\e653";
+}
+
+.uniui-search:before {
+  content: "\e654";
+}
+
+.uniui-redo-filled:before {
+  content: "\e655";
+}
+
+.uniui-list:before {
+  content: "\e644";
+}
+
+.uniui-mail-open-filled:before {
+  content: "\e63a";
+}
+
+.uniui-hand-down-filled:before {
+  content: "\e63c";
+}
+
+.uniui-hand-down:before {
+  content: "\e63d";
+}
+
+.uniui-hand-up-filled:before {
+  content: "\e63e";
+}
+
+.uniui-hand-up:before {
+  content: "\e63f";
+}
+
+.uniui-heart-filled:before {
+  content: "\e641";
+}
+
+.uniui-mail-open:before {
+  content: "\e643";
+}
+
+.uniui-heart:before {
+  content: "\e639";
+}
+
+.uniui-loop:before {
+  content: "\e633";
+}
+
+.uniui-pulldown:before {
+  content: "\e632";
+}
+
+.uniui-scan:before {
+  content: "\e62a";
+}
+
+.uniui-bars:before {
+  content: "\e627";
+}
+
+.uniui-cart-filled:before {
+  content: "\e629";
+}
+
+.uniui-checkbox:before {
+  content: "\e62b";
+}
+
+.uniui-checkbox-filled:before {
+  content: "\e62c";
+}
+
+.uniui-shop:before {
+  content: "\e62f";
+}
+
+.uniui-headphones:before {
+  content: "\e630";
+}
+
+.uniui-cart:before {
+  content: "\e631";
+}
diff --git a/uni_modules/uni-icons/components/uni-icons/uniicons.ttf b/uni_modules/uni-icons/components/uni-icons/uniicons.ttf
new file mode 100644
index 0000000..835f33b
--- /dev/null
+++ b/uni_modules/uni-icons/components/uni-icons/uniicons.ttf
Binary files differ
diff --git a/uni_modules/uni-icons/package.json b/uni_modules/uni-icons/package.json
new file mode 100644
index 0000000..d1c4e77
--- /dev/null
+++ b/uni_modules/uni-icons/package.json
@@ -0,0 +1,86 @@
+{
+  "id": "uni-icons",
+  "displayName": "uni-icons ������",
+  "version": "1.3.5",
+  "description": "������������������������������������������������������������������������������������",
+  "keywords": [
+    "uni-ui",
+    "uniui",
+    "icon",
+    "������"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": "^3.2.14"
+  },
+  "directories": {
+    "example": "../../temps/example_temps"
+  },
+  "dcloudext": {
+    "category": [
+      "������������",
+      "������������"
+    ],
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "���",
+      "data": "���",
+      "permissions": "���"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+  },
+  "uni_modules": {
+    "dependencies": ["uni-scss"],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "App": {
+          "app-vue": "y",
+          "app-nvue": "y"
+        },
+        "H5-mobile": {
+          "Safari": "y",
+          "Android Browser": "y",
+          "���������������(Android)": "y",
+          "QQ���������(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "y",
+          "Edge": "y",
+          "Firefox": "y",
+          "Safari": "y"
+        },
+        "���������": {
+          "������": "y",
+          "������": "y",
+          "������": "y",
+          "������������": "y",
+          "QQ": "y"
+        },
+        "���������": {
+          "������": "u",
+          "������": "u"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/uni_modules/uni-icons/readme.md b/uni_modules/uni-icons/readme.md
new file mode 100644
index 0000000..86234ba
--- /dev/null
+++ b/uni_modules/uni-icons/readme.md
@@ -0,0 +1,8 @@
+## Icons ������
+> **������������uni-icons**
+> ������������ `uIcons`
+
+������������ icons ������ ���
+
+### [������������](https://uniapp.dcloud.io/component/uniui/uni-icons)
+#### ������������������������������������������������uni-ui������������������������������������ uni-ui ������������871950839 
diff --git a/uni_modules/uni-nav-bar/changelog.md b/uni_modules/uni-nav-bar/changelog.md
new file mode 100644
index 0000000..0f9a2f1
--- /dev/null
+++ b/uni_modules/uni-nav-bar/changelog.md
@@ -0,0 +1,51 @@
+## 1.3.11���2023-03-29���
+- ������ ������������������������������BUG
+## 1.3.10���2023-03-29���
+- ������ ������������������������������������bug
+## 1.3.9���2022-10-13���
+- ������ ���������������������bug
+## 1.3.8���2022-10-12���
+- ������ nvue ������ fixed ��� true ������������������������������ bug
+## 1.3.7���2022-08-11���
+- ������ nvue ��������� fixed ��� true ������������������������������ bug
+## 1.3.6���2022-06-30���
+- ������ ������������������������������������������������bug
+## 1.3.5���2022-05-24���
+- ������ stat ������ ������������������title ������ ���������������title ������������������������uni������������
+## 1.3.4���2022-01-24���
+- ������ ������������
+## 1.3.3���2022-01-24���
+- ������ left-width/right-width������ ���������������������������������
+## 1.3.2���2022-01-18���
+- ������ ���vue������������������������������bug
+## 1.3.1���2022-01-18���
+- ������ height ������������������
+## 1.3.0���2022-01-18���
+- ������ height ������,���������������������
+- ������ dark ������������������������������
+- ������ ���������������������������������
+- ������ ������������������������������������
+## 1.2.1���2022-01-10���
+- ������ color ������������������bug
+## 1.2.0���2021-11-19���
+- ������ ������UI���������������������������������:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource)
+- ���������������������:[https://uniapp.dcloud.io/component/uniui/uni-nav-bar](https://uniapp.dcloud.io/component/uniui/uni-nav-bar)
+## 1.1.0���2021-07-30���
+- ������������ vue3���������������vue3��������������� [uni-app ������������ vue3 ������](https://ask.dcloud.net.cn/article/37834)
+## 1.0.11���2021-05-12���
+- ������ ������������������
+## 1.0.10���2021-04-30���
+- ������ ���nvue���fixed���true������������������������Bug
+## 1.0.9���2021-04-21���
+- ������ ������������ uni-icons, ���������������������������
+## 1.0.8���2021-04-14���
+- uni-ui ������ uni-nav-bar ��� fixed ��������� true ��������������������� bug
+
+## 1.0.7���2021-02-25���
+- ������ easycom ��������������� uni-status-bar ���bug
+
+## 1.0.6���2021-02-05���
+- ������ ���������������������������uni_modules������������
+
+## 1.0.5���2021-02-05���
+- ���������uni_modules������������
diff --git a/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-nav-bar.vue b/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-nav-bar.vue
new file mode 100644
index 0000000..c890860
--- /dev/null
+++ b/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-nav-bar.vue
@@ -0,0 +1,357 @@
+<template>
+	<view class="uni-navbar" :class="{'uni-dark':dark, 'uni-nvue-fixed': fixed}">
+		<view class="uni-navbar__content" :class="{ 'uni-navbar--fixed': fixed, 'uni-navbar--shadow': shadow, 'uni-navbar--border': border }"
+			:style="{ 'background-color': themeBgColor, 'border-bottom-color':themeColor }" >
+			<status-bar v-if="statusBar" />
+			<view :style="{ color: themeColor,backgroundColor: themeBgColor ,height:navbarHeight}"
+				class="uni-navbar__header">
+				<view @tap="onClickLeft" class="uni-navbar__header-btns uni-navbar__header-btns-left"
+					:style="{width:leftIconWidth}">
+					<slot name="left">
+						<view class="uni-navbar__content_view" v-if="leftIcon.length > 0">
+							<uni-icons :color="themeColor" :type="leftIcon" size="20" />
+						</view>
+						<view :class="{ 'uni-navbar-btn-icon-left': !leftIcon.length > 0 }" class="uni-navbar-btn-text"
+							v-if="leftText.length">
+							<text :style="{ color: themeColor, fontSize: '12px' }">{{ leftText }}</text>
+						</view>
+					</slot>
+				</view>
+				<view class="uni-navbar__header-container " @tap="onClickTitle">
+					<slot>
+						<view class="uni-navbar__header-container-inner" v-if="title.length>0">
+							<text class="uni-nav-bar-text uni-ellipsis-1"
+								:style="{color: themeColor }">{{ title }}</text>
+						</view>
+					</slot>
+				</view>
+				<view @click="onClickRight" class="uni-navbar__header-btns uni-navbar__header-btns-right"
+					:style="{width:rightIconWidth}">
+					<slot name="right">
+						<view v-if="rightIcon.length">
+							<uni-icons :color="themeColor" :type="rightIcon" size="22" />
+						</view>
+						<view class="uni-navbar-btn-text" v-if="rightText.length && !rightIcon.length">
+							<text class="uni-nav-bar-right-text" :style="{ color: themeColor}">{{ rightText }}</text>
+						</view>
+					</slot>
+				</view>
+			</view>
+		</view>
+		<!-- #ifndef APP-NVUE -->
+		<view class="uni-navbar__placeholder" v-if="fixed">
+			<status-bar v-if="statusBar" />
+			<view class="uni-navbar__placeholder-view" :style="{ height:navbarHeight}" />
+		</view>
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+	import statusBar from "./uni-status-bar.vue";
+	const getVal = (val) => typeof val === 'number' ? val + 'px' : val;
+
+	/**
+	 * 
+	 * 
+	 * NavBar ������������������
+	 * @description ������������������������������������������
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=52
+	 * @property {Boolean} dark ������������������
+	 * @property {String} title ������������
+	 * @property {String} leftText ������������������
+	 * @property {String} rightText ������������������
+	 * @property {String} leftIcon ��������������������������������������� [Icon ������](http://ext.dcloud.net.cn/plugin?id=28) type ���������
+	 * @property {String} rightIcon ��������������������������������������� [Icon ������](http://ext.dcloud.net.cn/plugin?id=28) type ���������
+	 * @property {String} color ���������������������
+	 * @property {String} backgroundColor ���������������������
+	 * @property {Boolean} fixed = [true|false] ������������������
+	 * @property {Boolean} statusBar = [true|false] ���������������������
+	 * @property {Boolean} shadow = [true|false] ���������������������������
+	 * @property {Boolean} stat ������������������������������
+	 * @event {Function} clickLeft ���������������������������
+	 * @event {Function} clickRight ���������������������������
+	 * @event {Function} clickTitle ���������������������������
+	 */
+	export default {
+		name: "UniNavBar",
+		components: {
+			statusBar
+		},
+		emits: ['clickLeft', 'clickRight', 'clickTitle'],
+		props: {
+			dark: {
+				type: Boolean,
+				default: false
+			},
+			title: {
+				type: String,
+				default: ""
+			},
+			leftText: {
+				type: String,
+				default: ""
+			},
+			rightText: {
+				type: String,
+				default: ""
+			},
+			leftIcon: {
+				type: String,
+				default: ""
+			},
+			rightIcon: {
+				type: String,
+				default: ""
+			},
+			fixed: {
+				type: [Boolean, String],
+				default: false
+			},
+			color: {
+				type: String,
+				default: ""
+			},
+			backgroundColor: {
+				type: String,
+				default: ""
+			},
+			statusBar: {
+				type: [Boolean, String],
+				default: false
+			},
+			shadow: {
+				type: [Boolean, String],
+				default: false
+			},
+			border: {
+				type: [Boolean, String],
+				default: true
+			},
+			height: {
+				type: [Number, String],
+				default: 44
+			},
+			leftWidth: {
+				type: [Number, String],
+				default: 60
+			},
+			rightWidth: {
+				type: [Number, String],
+				default: 60
+			},
+			stat: {
+				type: [Boolean, String],
+				default: ''
+			}
+		},
+		computed: {
+			themeBgColor() {
+				if (this.dark) {
+					// ���������
+					if (this.backgroundColor) {
+						return this.backgroundColor
+					} else {
+						return this.dark ? '#333' : '#FFF'
+					}
+				}
+				return this.backgroundColor || '#FFF'
+			},
+			themeColor() {
+				if (this.dark) {
+					// ���������
+					if (this.color) {
+						return this.color
+					} else {
+						return this.dark ? '#fff' : '#333'
+					}
+				}
+				return this.color || '#333'
+			},
+			navbarHeight() {
+				return getVal(this.height)
+			},
+			leftIconWidth() {
+				return getVal(this.leftWidth)
+			},
+			rightIconWidth() {
+				return getVal(this.rightWidth)
+			}
+		},
+		mounted() {
+			if (uni.report && this.stat && this.title !== '') {
+				uni.report('title', this.title)
+			}
+		},
+		methods: {
+			onClickLeft() {
+				this.$emit("clickLeft");
+			},
+			onClickRight() {
+				this.$emit("clickRight");
+			},
+			onClickTitle() {
+				this.$emit("clickTitle");
+			}
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	$nav-height: 44px;
+
+	.uni-nvue-fixed {
+		/* #ifdef APP-NVUE */
+		position: sticky;
+		/* #endif */
+	}
+	.uni-navbar {
+		// box-sizing: border-box;
+	}
+
+	.uni-nav-bar-text {
+		/* #ifdef APP-PLUS */
+		font-size: 34rpx;
+		/* #endif */
+		/* #ifndef APP-PLUS */
+		font-size: 14px;
+		/* #endif */
+	}
+
+	.uni-nav-bar-right-text {
+		font-size: 12px;
+	}
+
+	.uni-navbar__content {
+		position: relative;
+		// background-color: #fff;
+		// box-sizing: border-box;
+		background-color: transparent;
+	}
+
+	.uni-navbar__content_view {
+		// box-sizing: border-box;
+	}
+
+	.uni-navbar-btn-text {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		justify-content: flex-start;
+		align-items: center;
+		line-height: 12px;
+	}
+
+	.uni-navbar__header {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		padding: 0 10px;
+		flex-direction: row;
+		height: $nav-height;
+		font-size: 12px;
+	}
+
+	.uni-navbar__header-btns {
+		/* #ifndef APP-NVUE */
+		overflow: hidden;
+		display: flex;
+		/* #endif */
+		flex-wrap: nowrap;
+		flex-direction: row;
+		width: 120rpx;
+		// padding: 0 6px;
+		justify-content: center;
+		align-items: center;
+		/* #ifdef H5 */
+		cursor: pointer;
+		/* #endif */
+	}
+
+	.uni-navbar__header-btns-left {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		width: 120rpx;
+		justify-content: flex-start;
+		align-items: center;
+	}
+
+	.uni-navbar__header-btns-right {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		// width: 150rpx;
+		// padding-right: 30rpx;
+		justify-content: flex-end;
+		align-items: center;
+	}
+
+	.uni-navbar__header-container {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex: 1;
+		padding: 0 10px;
+		overflow: hidden;
+	}
+
+	.uni-navbar__header-container-inner {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex: 1;
+		flex-direction: row;
+		align-items: center;
+		justify-content: center;
+		font-size: 12px;
+		overflow: hidden;
+		// box-sizing: border-box;
+	}
+
+
+	.uni-navbar__placeholder-view {
+		height: $nav-height;
+	}
+
+	.uni-navbar--fixed {
+		position: fixed;
+		z-index: 998;
+		/* #ifdef H5 */
+		left: var(--window-left);
+		right: var(--window-right);
+		/* #endif */
+		/* #ifndef H5 */
+		left: 0;
+		right: 0;
+		/* #endif */
+
+	}
+
+	.uni-navbar--shadow {
+		box-shadow: 0 1px 6px #ccc;
+	}
+
+	.uni-navbar--border {
+		border-bottom-width: 1rpx;
+		border-bottom-style: solid;
+		border-bottom-color: #eee;
+	}
+
+	.uni-ellipsis-1 {
+		overflow: hidden;
+		/* #ifndef APP-NVUE */
+		white-space: nowrap;
+		text-overflow: ellipsis;
+		/* #endif */
+		/* #ifdef APP-NVUE */
+		lines: 1;
+		text-overflow: ellipsis;
+		/* #endif */
+	}
+
+	// ���������������
+	.uni-dark {}
+</style>
diff --git a/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-status-bar.vue b/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-status-bar.vue
new file mode 100644
index 0000000..4ac73ae
--- /dev/null
+++ b/uni_modules/uni-nav-bar/components/uni-nav-bar/uni-status-bar.vue
@@ -0,0 +1,24 @@
+<template>
+	<view :style="{ height: statusBarHeight }" class="uni-status-bar">
+		<slot />
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'UniStatusBar',
+		data() {
+			return {
+				statusBarHeight: uni.getSystemInfoSync().statusBarHeight + 'px'
+			}
+		}
+	}
+</script>
+
+<style lang="scss" >
+	.uni-status-bar {
+		// width: 750rpx;
+		height: 20px;
+		// height: var(--status-bar-height);
+	}
+</style>
diff --git a/uni_modules/uni-nav-bar/package.json b/uni_modules/uni-nav-bar/package.json
new file mode 100644
index 0000000..240ae95
--- /dev/null
+++ b/uni_modules/uni-nav-bar/package.json
@@ -0,0 +1,86 @@
+{
+  "id": "uni-nav-bar",
+  "displayName": "uni-nav-bar ������������������",
+  "version": "1.3.11",
+  "description": "������������������������������������������������������",
+  "keywords": [
+    "uni-ui",
+    "������",
+    "���������",
+    "������������������"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": ""
+  },
+  "directories": {
+    "example": "../../temps/example_temps"
+  },
+"dcloudext": {
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "���",
+      "data": "���",
+      "permissions": "���"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+    "type": "component-vue"
+  },
+  "uni_modules": {
+    "dependencies": [
+			"uni-scss",
+			"uni-icons"
+		],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "App": {
+          "app-vue": "y",
+          "app-nvue": "y"
+        },
+        "H5-mobile": {
+          "Safari": "y",
+          "Android Browser": "y",
+          "���������������(Android)": "y",
+          "QQ���������(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "y",
+          "Edge": "y",
+          "Firefox": "y",
+          "Safari": "y"
+        },
+        "���������": {
+          "������": "y",
+          "������": "y",
+          "������": "y",
+          "������������": "y",
+          "QQ": "y"
+        },
+        "���������": {
+          "������": "u",
+          "������": "u"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/uni_modules/uni-nav-bar/readme.md b/uni_modules/uni-nav-bar/readme.md
new file mode 100644
index 0000000..3934b32
--- /dev/null
+++ b/uni_modules/uni-nav-bar/readme.md
@@ -0,0 +1,15 @@
+
+
+## NavBar ���������
+> **������������uni-nav-bar**
+> ������������ `uNavBar`
+
+���������������������������������������������
+
+### [������������](https://uniapp.dcloud.io/component/uniui/uni-nav-bar)
+#### ������������������������������������������������uni-ui������������������������������������ uni-ui ������������871950839 
+
+
+
+
+
diff --git a/uni_modules/uni-scss/changelog.md b/uni_modules/uni-scss/changelog.md
new file mode 100644
index 0000000..b863bb0
--- /dev/null
+++ b/uni_modules/uni-scss/changelog.md
@@ -0,0 +1,8 @@
+## 1.0.3���2022-01-21���
+- ������ ������������
+## 1.0.2���2021-11-22���
+- ������ / ��������� vue ���������������������������������������������
+## 1.0.1���2021-11-22���
+- ������ vue3���scss������������������
+## 1.0.0���2021-11-18���
+- init
diff --git a/uni_modules/uni-scss/index.scss b/uni_modules/uni-scss/index.scss
new file mode 100644
index 0000000..1744a5f
--- /dev/null
+++ b/uni_modules/uni-scss/index.scss
@@ -0,0 +1 @@
+@import './styles/index.scss';
diff --git a/uni_modules/uni-scss/package.json b/uni_modules/uni-scss/package.json
new file mode 100644
index 0000000..7cc0ccb
--- /dev/null
+++ b/uni_modules/uni-scss/package.json
@@ -0,0 +1,82 @@
+{
+  "id": "uni-scss",
+  "displayName": "uni-scss ������������",
+  "version": "1.0.3",
+  "description": "uni-sass���uni-ui��������������������������� ���������������������������������sass���������������������������������������������������������������������������������",
+  "keywords": [
+    "uni-scss",
+    "uni-ui",
+    "������������"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": "^3.1.0"
+  },
+  "dcloudext": {
+    "category": [
+        "JS SDK",
+        "������ SDK"
+    ],
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "���",
+      "data": "���",
+      "permissions": "���"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui"
+  },
+  "uni_modules": {
+    "dependencies": [],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y"
+      },
+      "client": {
+        "App": {
+          "app-vue": "y",
+          "app-nvue": "u"
+        },
+        "H5-mobile": {
+          "Safari": "y",
+          "Android Browser": "y",
+          "���������������(Android)": "y",
+          "QQ���������(Android)": "y"
+        },
+        "H5-pc": {
+          "Chrome": "y",
+          "IE": "y",
+          "Edge": "y",
+          "Firefox": "y",
+          "Safari": "y"
+        },
+        "���������": {
+          "������": "y",
+          "������": "y",
+          "������": "y",
+          "������������": "y",
+          "QQ": "y"
+        },
+        "���������": {
+          "������": "n",
+          "������": "n"
+        },
+        "Vue": {
+            "vue2": "y",
+            "vue3": "y"
+        }
+      }
+    }
+  }
+}
diff --git a/uni_modules/uni-scss/readme.md b/uni_modules/uni-scss/readme.md
new file mode 100644
index 0000000..b7d1c25
--- /dev/null
+++ b/uni_modules/uni-scss/readme.md
@@ -0,0 +1,4 @@
+`uni-sass` ��� `uni-ui`��������������������������� ���������������������������������`sass`���������������������������������������������������������������������������������
+
+### [������������](https://uniapp.dcloud.io/component/uniui/uni-sass)
+#### ������������������������������������������������uni-ui������������������������������������ uni-ui ������������871950839 
\ No newline at end of file
diff --git a/uni_modules/uni-scss/styles/index.scss b/uni_modules/uni-scss/styles/index.scss
new file mode 100644
index 0000000..ffac4fe
--- /dev/null
+++ b/uni_modules/uni-scss/styles/index.scss
@@ -0,0 +1,7 @@
+@import './setting/_variables.scss';
+@import './setting/_border.scss';
+@import './setting/_color.scss';
+@import './setting/_space.scss';
+@import './setting/_radius.scss';
+@import './setting/_text.scss';
+@import './setting/_styles.scss';
diff --git a/uni_modules/uni-scss/styles/setting/_border.scss b/uni_modules/uni-scss/styles/setting/_border.scss
new file mode 100644
index 0000000..12a11c3
--- /dev/null
+++ b/uni_modules/uni-scss/styles/setting/_border.scss
@@ -0,0 +1,3 @@
+.uni-border {
+	border: 1px $uni-border-1 solid;
+}
\ No newline at end of file
diff --git a/uni_modules/uni-scss/styles/setting/_color.scss b/uni_modules/uni-scss/styles/setting/_color.scss
new file mode 100644
index 0000000..1ededd9
--- /dev/null
+++ b/uni_modules/uni-scss/styles/setting/_color.scss
@@ -0,0 +1,66 @@
+
+// TODO ��������������� class ��������������������������������� ���������������������������������������
+// @mixin get-styles($k,$c) {
+// 	@if $k == size or $k == weight{
+// 		font-#{$k}:#{$c}
+// 	}@else{
+// 		#{$k}:#{$c}
+// 	}
+// }
+$uni-ui-color:(
+	// ������
+	primary: $uni-primary,
+	primary-disable: $uni-primary-disable,
+	primary-light: $uni-primary-light,
+	// ���������
+	success: $uni-success,
+	success-disable: $uni-success-disable,
+	success-light: $uni-success-light,
+	warning: $uni-warning,
+	warning-disable: $uni-warning-disable,
+	warning-light: $uni-warning-light,
+	error: $uni-error,
+	error-disable: $uni-error-disable,
+	error-light: $uni-error-light,
+	info: $uni-info,
+	info-disable: $uni-info-disable,
+	info-light: $uni-info-light,
+	// ���������
+	main-color: $uni-main-color,
+	base-color: $uni-base-color,
+	secondary-color: $uni-secondary-color,
+	extra-color: $uni-extra-color,
+	// ���������
+	bg-color: $uni-bg-color,
+	// ������������
+	border-1: $uni-border-1,
+	border-2: $uni-border-2,
+	border-3: $uni-border-3,
+	border-4: $uni-border-4,
+	// ������
+	black:$uni-black,
+	// ������
+	white:$uni-white,
+	// ������
+	transparent:$uni-transparent
+) !default;
+@each $key, $child in $uni-ui-color {
+	.uni-#{"" + $key} {
+		color: $child;
+	}
+	.uni-#{"" + $key}-bg {
+		background-color: $child;
+	}
+}
+.uni-shadow-sm {
+	box-shadow: $uni-shadow-sm;
+}
+.uni-shadow-base {
+	box-shadow: $uni-shadow-base;
+}
+.uni-shadow-lg {
+	box-shadow: $uni-shadow-lg;
+}
+.uni-mask {
+	background-color:$uni-mask;
+}
diff --git a/uni_modules/uni-scss/styles/setting/_radius.scss b/uni_modules/uni-scss/styles/setting/_radius.scss
new file mode 100644
index 0000000..9a0428b
--- /dev/null
+++ b/uni_modules/uni-scss/styles/setting/_radius.scss
@@ -0,0 +1,55 @@
+@mixin radius($r,$d:null ,$important: false){
+  $radius-value:map-get($uni-radius, $r) if($important, !important, null);
+  // Key exists within the $uni-radius variable
+  @if (map-has-key($uni-radius, $r) and  $d){
+		@if $d == t {
+				border-top-left-radius:$radius-value;
+				border-top-right-radius:$radius-value;
+		}@else if $d == r {
+				border-top-right-radius:$radius-value;
+				border-bottom-right-radius:$radius-value;
+		}@else if $d == b {
+				border-bottom-left-radius:$radius-value;
+				border-bottom-right-radius:$radius-value;
+		}@else if $d == l {
+				border-top-left-radius:$radius-value;
+				border-bottom-left-radius:$radius-value;
+		}@else if $d == tl {
+				border-top-left-radius:$radius-value;
+		}@else if $d == tr {
+				border-top-right-radius:$radius-value;
+		}@else if $d == br {
+				border-bottom-right-radius:$radius-value;
+		}@else if $d == bl {
+				border-bottom-left-radius:$radius-value;
+		}
+  }@else{
+		border-radius:$radius-value;
+  }
+}
+
+@each $key, $child in $uni-radius {
+	@if($key){
+		.uni-radius-#{"" + $key} {
+				@include radius($key)
+		}
+	}@else{
+		.uni-radius {
+				@include radius($key)
+		}
+	}
+}
+
+@each $direction in t, r, b, l,tl, tr, br, bl {
+	@each $key, $child in $uni-radius {
+		@if($key){
+			.uni-radius-#{"" + $direction}-#{"" + $key} {
+				@include radius($key,$direction,false)
+			}
+		}@else{
+			.uni-radius-#{$direction} {
+				@include radius($key,$direction,false)
+			}
+		}
+	}
+}
diff --git a/uni_modules/uni-scss/styles/setting/_space.scss b/uni_modules/uni-scss/styles/setting/_space.scss
new file mode 100644
index 0000000..3c89528
--- /dev/null
+++ b/uni_modules/uni-scss/styles/setting/_space.scss
@@ -0,0 +1,56 @@
+
+@mixin fn($space,$direction,$size,$n) {
+	@if $n {
+		#{$space}-#{$direction}: #{$size*$uni-space-root}px
+	} @else {
+		 #{$space}-#{$direction}: #{-$size*$uni-space-root}px
+	}
+}
+@mixin get-styles($direction,$i,$space,$n){
+	@if $direction == t {
+		@include fn($space, top,$i,$n);
+	} 
+	@if $direction == r {
+		@include fn($space, right,$i,$n);
+	} 
+	@if $direction == b {
+		@include fn($space, bottom,$i,$n);
+	} 
+	@if $direction == l {
+	 @include fn($space, left,$i,$n);
+	} 
+	@if $direction == x {
+		@include fn($space, left,$i,$n);
+		@include fn($space, right,$i,$n);
+	} 
+	@if $direction == y {
+		@include fn($space, top,$i,$n);
+		@include fn($space, bottom,$i,$n);
+	} 
+	@if $direction == a {
+		@if $n {
+			#{$space}:#{$i*$uni-space-root}px;
+		} @else {
+			#{$space}:#{-$i*$uni-space-root}px;
+		}
+	} 
+}
+
+@each $orientation in m,p {
+	$space: margin;
+	@if $orientation == m {
+		$space: margin;
+	} @else {
+		$space: padding;
+	}
+	@for $i from 0 through 16 {
+		@each $direction in t, r, b, l, x, y, a {
+			.uni-#{$orientation}#{$direction}-#{$i} { 
+				@include  get-styles($direction,$i,$space,true);
+			} 
+			.uni-#{$orientation}#{$direction}-n#{$i} { 
+				@include  get-styles($direction,$i,$space,false);
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/uni_modules/uni-scss/styles/setting/_styles.scss b/uni_modules/uni-scss/styles/setting/_styles.scss
new file mode 100644
index 0000000..689afec
--- /dev/null
+++ b/uni_modules/uni-scss/styles/setting/_styles.scss
@@ -0,0 +1,167 @@
+/* #ifndef APP-NVUE */
+
+$-color-white:#fff;
+$-color-black:#000;
+@mixin base-style($color) {
+	color: #fff;
+	background-color: $color;
+	border-color: mix($-color-black, $color, 8%);
+	&:not([hover-class]):active {
+		background: mix($-color-black, $color, 10%);
+		border-color: mix($-color-black, $color, 20%);
+		color: $-color-white;
+		outline: none;
+	}
+}
+@mixin is-color($color) {
+	@include base-style($color);
+	&[loading] {
+		@include base-style($color);
+		&::before {
+			margin-right:5px;
+		}
+	}
+	&[disabled] {
+	  &,
+		&[loading],
+	  &:not([hover-class]):active {
+	    color: $-color-white;
+			border-color: mix(darken($color,10%), $-color-white);
+	    background-color: mix($color, $-color-white);
+	  }
+	}
+
+}
+@mixin base-plain-style($color) {
+	color:$color;
+	background-color: mix($-color-white, $color, 90%);
+	border-color: mix($-color-white, $color, 70%);
+	&:not([hover-class]):active {
+	  background: mix($-color-white, $color, 80%);
+	  color: $color;
+	  outline: none;
+		border-color: mix($-color-white, $color, 50%);
+	}
+}
+@mixin is-plain($color){
+	&[plain] {
+		@include base-plain-style($color);
+		&[loading] {
+			@include base-plain-style($color);
+			&::before {
+				margin-right:5px;
+			}
+		}
+		&[disabled] {
+		  &,
+		  &:active {
+		    color: mix($-color-white, $color, 40%);
+		    background-color: mix($-color-white, $color, 90%);
+				border-color: mix($-color-white, $color, 80%);
+		  }
+		}
+	}
+}
+
+
+.uni-btn {
+	margin: 5px;
+	color: #393939;
+	border:1px solid #ccc;
+	font-size: 16px;
+	font-weight: 200;
+	background-color: #F9F9F9;
+	// TODO ���������������������������������������
+	overflow: visible;
+	&::after{
+		border: none;
+	}
+
+	&:not([type]),&[type=default] {
+		color: #999;
+		&[loading] {
+			background: none;
+			&::before {
+				margin-right:5px;
+			}
+		}
+
+
+
+		&[disabled]{
+			color: mix($-color-white, #999, 60%);
+		  &,
+			&[loading],
+		  &:active {
+				color: mix($-color-white, #999, 60%);
+		    background-color: mix($-color-white,$-color-black , 98%);
+				border-color: mix($-color-white,  #999, 85%);
+		  }
+		}
+
+		&[plain] {
+			color: #999;
+			background: none;
+			border-color: $uni-border-1;
+			&:not([hover-class]):active {
+				background: none;
+			  color: mix($-color-white, $-color-black, 80%);
+				border-color: mix($-color-white, $-color-black, 90%);
+			  outline: none;
+			}
+			&[disabled]{
+			  &,
+				&[loading],
+			  &:active {
+			    background: none;
+					color: mix($-color-white, #999, 60%);
+					border-color: mix($-color-white,  #999, 85%);
+			  }
+			}
+		}
+	}
+
+	&:not([hover-class]):active {
+	  color: mix($-color-white, $-color-black, 50%);
+	}
+
+	&[size=mini] {
+		font-size: 16px;
+		font-weight: 200;
+		border-radius: 8px;
+	}
+
+
+
+	&.uni-btn-small {
+		font-size: 14px;
+	}
+	&.uni-btn-mini {
+		font-size: 12px;
+	}
+
+	&.uni-btn-radius {
+		border-radius: 999px;
+	}
+	&[type=primary] {
+		@include is-color($uni-primary);
+		@include is-plain($uni-primary)
+	}
+	&[type=success] {
+		@include is-color($uni-success);
+		@include is-plain($uni-success)
+	}
+	&[type=error] {
+		@include is-color($uni-error);
+		@include is-plain($uni-error)
+	}
+	&[type=warning] {
+		@include is-color($uni-warning);
+		@include is-plain($uni-warning)
+	}
+	&[type=info] {
+		@include is-color($uni-info);
+		@include is-plain($uni-info)
+	}
+}
+/* #endif */
diff --git a/uni_modules/uni-scss/styles/setting/_text.scss b/uni_modules/uni-scss/styles/setting/_text.scss
new file mode 100644
index 0000000..a34d08f
--- /dev/null
+++ b/uni_modules/uni-scss/styles/setting/_text.scss
@@ -0,0 +1,24 @@
+@mixin get-styles($k,$c) {
+	@if $k == size or $k == weight{
+		font-#{$k}:#{$c}
+	}@else{
+		#{$k}:#{$c}
+	}
+}
+
+@each $key, $child in $uni-headings {
+	/* #ifndef APP-NVUE */
+	.uni-#{$key} {
+		@each $k, $c in $child {
+			@include get-styles($k,$c)
+		}
+	}
+	/* #endif */
+	/* #ifdef APP-NVUE */
+	.container .uni-#{$key} {
+		@each $k, $c in $child {
+			@include get-styles($k,$c)
+		}
+	}
+	/* #endif */
+}
diff --git a/uni_modules/uni-scss/styles/setting/_variables.scss b/uni_modules/uni-scss/styles/setting/_variables.scss
new file mode 100644
index 0000000..557d3d7
--- /dev/null
+++ b/uni_modules/uni-scss/styles/setting/_variables.scss
@@ -0,0 +1,146 @@
+// @use "sass:math";
+@import  '../tools/functions.scss';
+// ������������������
+$uni-space-root: 2 !default;
+// ���������������������
+$uni-radius-root:5px !default;
+$uni-radius: () !default;
+// ������������������
+$uni-radius: map-deep-merge(
+  (
+    0: 0,
+		// TODO ��������������������������� sm ������
+    // 'sm': math.div($uni-radius-root, 2),
+    null: $uni-radius-root,
+    'lg': $uni-radius-root * 2,
+    'xl': $uni-radius-root * 6,
+    'pill': 9999px,
+    'circle': 50%
+  ),
+  $uni-radius
+);
+// ������������
+$body-font-family: 'Roboto', sans-serif !default;
+// ������
+$heading-font-family: $body-font-family !default;
+$uni-headings: () !default;
+$letterSpacing: -0.01562em;
+$uni-headings: map-deep-merge(
+  (
+    'h1': (
+      size: 32px,
+			weight: 300,
+			line-height: 50px,
+			// letter-spacing:-0.01562em
+    ),
+    'h2': (
+      size: 28px,
+      weight: 300,
+      line-height: 40px,
+      // letter-spacing: -0.00833em
+    ),
+    'h3': (
+      size: 24px,
+      weight: 400,
+      line-height: 32px,
+      // letter-spacing: normal
+    ),
+    'h4': (
+      size: 20px,
+      weight: 400,
+      line-height: 30px,
+      // letter-spacing: 0.00735em
+    ),
+    'h5': (
+      size: 16px,
+      weight: 400,
+      line-height: 24px,
+      // letter-spacing: normal
+    ),
+    'h6': (
+      size: 14px,
+      weight: 500,
+      line-height: 18px,
+      // letter-spacing: 0.0125em
+    ),
+    'subtitle': (
+      size: 12px,
+      weight: 400,
+      line-height: 20px,
+      // letter-spacing: 0.00937em
+    ),
+    'body': (
+      font-size: 14px,
+			font-weight: 400,
+			line-height: 22px,
+			// letter-spacing: 0.03125em
+    ),
+    'caption': (
+      'size': 12px,
+      'weight': 400,
+      'line-height': 20px,
+      // 'letter-spacing': 0.03333em,
+      // 'text-transform': false
+    )
+  ),
+  $uni-headings
+);
+
+
+
+// ������
+$uni-primary: #2979ff !default;
+$uni-primary-disable:lighten($uni-primary,20%) !default;
+$uni-primary-light: lighten($uni-primary,25%) !default;
+
+// ���������
+// ������������������������������������������������������������������������������������������������������������
+$uni-success: #18bc37 !default;
+$uni-success-disable:lighten($uni-success,20%) !default;
+$uni-success-light: lighten($uni-success,25%) !default;
+
+$uni-warning: #f3a73f !default;
+$uni-warning-disable:lighten($uni-warning,20%) !default;
+$uni-warning-light: lighten($uni-warning,25%) !default;
+
+$uni-error: #e43d33 !default;
+$uni-error-disable:lighten($uni-error,20%) !default;
+$uni-error-light: lighten($uni-error,25%) !default;
+
+$uni-info: #8f939c !default;
+$uni-info-disable:lighten($uni-info,20%) !default;
+$uni-info-light: lighten($uni-info,25%) !default;
+
+// ���������
+// ���������������������������������������������������������������������������������������������������������
+$uni-main-color: #3a3a3a !default; 			// ������������
+$uni-base-color: #6a6a6a !default;			// ������������
+$uni-secondary-color: #909399 !default;	// ������������
+$uni-extra-color: #c7c7c7 !default;			// ������������
+
+// ������������
+$uni-border-1: #F0F0F0 !default;
+$uni-border-2: #EDEDED !default;
+$uni-border-3: #DCDCDC !default;
+$uni-border-4: #B9B9B9 !default;
+
+// ���������
+$uni-black: #000000 !default;
+$uni-white: #ffffff !default;
+$uni-transparent: rgba($color: #000000, $alpha: 0) !default;
+
+// ���������
+$uni-bg-color: #f7f7f7 !default;
+
+/* ������������ */
+$uni-spacing-sm: 8px !default;
+$uni-spacing-base: 15px !default;
+$uni-spacing-lg: 30px !default;
+
+// ������
+$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5) !default;
+$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2) !default;
+$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5) !default;
+
+// ������
+$uni-mask: rgba($color: #000000, $alpha: 0.4) !default;
diff --git a/uni_modules/uni-scss/styles/tools/functions.scss b/uni_modules/uni-scss/styles/tools/functions.scss
new file mode 100644
index 0000000..ac6f63e
--- /dev/null
+++ b/uni_modules/uni-scss/styles/tools/functions.scss
@@ -0,0 +1,19 @@
+// ������ map
+@function map-deep-merge($parent-map, $child-map){
+	$result: $parent-map;
+	@each $key, $child in $child-map {
+		$parent-has-key: map-has-key($result, $key);
+		$parent-value: map-get($result, $key);
+		$parent-type: type-of($parent-value);
+		$child-type: type-of($child);
+		$parent-is-map: $parent-type == map;
+		$child-is-map: $child-type == map;
+			
+		@if (not $parent-has-key) or ($parent-type != $child-type) or (not ($parent-is-map and $child-is-map)){
+			$result: map-merge($result, ( $key: $child ));
+		}@else {
+			$result: map-merge($result, ( $key: map-deep-merge($parent-value, $child) ));
+		}
+	}
+	@return $result;
+};
diff --git a/uni_modules/uni-scss/theme.scss b/uni_modules/uni-scss/theme.scss
new file mode 100644
index 0000000..80ee62f
--- /dev/null
+++ b/uni_modules/uni-scss/theme.scss
@@ -0,0 +1,31 @@
+// ������������������
+$uni-space-root: 2;
+// ���������������������
+$uni-radius-root:5px;
+// ������
+$uni-primary: #2979ff;
+// ���������
+$uni-success: #4cd964;
+// ���������
+$uni-warning: #f0ad4e;
+// ���������
+$uni-error: #dd524d;
+// ���������
+$uni-info: #909399;
+// ���������
+$uni-main-color: #303133;
+$uni-base-color: #606266;
+$uni-secondary-color: #909399;
+$uni-extra-color: #C0C4CC;
+// ���������
+$uni-bg-color: #f5f5f5;
+// ������������
+$uni-border-1: #DCDFE6;
+$uni-border-2: #E4E7ED;
+$uni-border-3: #EBEEF5;
+$uni-border-4: #F2F6FC;
+
+// ���������
+$uni-black: #000000;
+$uni-white: #ffffff;
+$uni-transparent: rgba($color: #000000, $alpha: 0);
diff --git a/uni_modules/uni-scss/variables.scss b/uni_modules/uni-scss/variables.scss
new file mode 100644
index 0000000..1c062d4
--- /dev/null
+++ b/uni_modules/uni-scss/variables.scss
@@ -0,0 +1,62 @@
+@import './styles/setting/_variables.scss';
+// ������������������
+$uni-space-root: 2;
+// ���������������������
+$uni-radius-root:5px;
+
+// ������
+$uni-primary: #2979ff;
+$uni-primary-disable:mix(#fff,$uni-primary,50%);
+$uni-primary-light: mix(#fff,$uni-primary,80%);
+
+// ���������
+// ������������������������������������������������������������������������������������������������������������
+$uni-success: #18bc37;
+$uni-success-disable:mix(#fff,$uni-success,50%);
+$uni-success-light: mix(#fff,$uni-success,80%);
+
+$uni-warning: #f3a73f;
+$uni-warning-disable:mix(#fff,$uni-warning,50%);
+$uni-warning-light: mix(#fff,$uni-warning,80%);
+
+$uni-error: #e43d33;
+$uni-error-disable:mix(#fff,$uni-error,50%);
+$uni-error-light: mix(#fff,$uni-error,80%);
+
+$uni-info: #8f939c;
+$uni-info-disable:mix(#fff,$uni-info,50%);
+$uni-info-light: mix(#fff,$uni-info,80%);
+
+// ���������
+// ���������������������������������������������������������������������������������������������������������
+$uni-main-color: #3a3a3a; 			// ������������
+$uni-base-color: #6a6a6a;			// ������������
+$uni-secondary-color: #909399;	// ������������
+$uni-extra-color: #c7c7c7;			// ������������
+
+// ������������
+$uni-border-1: #F0F0F0;
+$uni-border-2: #EDEDED;
+$uni-border-3: #DCDCDC;
+$uni-border-4: #B9B9B9;
+
+// ���������
+$uni-black: #000000;
+$uni-white: #ffffff;
+$uni-transparent: rgba($color: #000000, $alpha: 0);
+
+// ���������
+$uni-bg-color: #f7f7f7;
+
+/* ������������ */
+$uni-spacing-sm: 8px;
+$uni-spacing-base: 15px;
+$uni-spacing-lg: 30px;
+
+// ������
+$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5);
+$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2);
+$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5);
+
+// ������
+$uni-mask: rgba($color: #000000, $alpha: 0.4);
diff --git a/utils/login.js b/utils/login.js
index aec9bba..dd08b18 100644
--- a/utils/login.js
+++ b/utils/login.js
@@ -1,4 +1,5 @@
 import request from '@/utils/request'
+import store from '@/store/index.js'
 export function login(params) {
     return new Promise((resolve, reject) => {
         request.post('/AppUser/logins', params, false).then(result => {
@@ -16,13 +17,13 @@
 }
 export function getUserInfor(token) {
     request.post('/getUserInfo', token).then(result => {
-        uni.setStorageSync('userInfo', JSON.stringify(result.data))
+        uni.setStorageSync('userInfor', JSON.stringify(result.data))
     })
 }
 export function getDic() {
     request.get('/dict/list').then(result => {
-        uni.setStorageSync('dict', JSON.stringify(result.data))
-        uni.setStorageSync('dictObj', JSON.stringify(objToArr(result.data)))
+        store.commit('setDict', result.data)
+        store.commit('setDictObj', objToArr(result.data))
     })
 }
 
diff --git a/utils/request.js b/utils/request.js
index 8496956..d863cdf 100644
--- a/utils/request.js
+++ b/utils/request.js
@@ -1,4 +1,5 @@
 import storage from './storage' // ������������
+import store from '../store/index.js'
 export default {
     console(options) {
         if (config.debug) {
@@ -20,13 +21,14 @@
         // loading������
         uni.showLoading({ title: '���������', })
         // ���������������������������������������������
+        // uni.showLoading({ title: baseUrl, })
         options.url = baseUrl + '' + options.url
         // ������������
         options.method = options.method || 'GET'
         // ������������������
         if (isLogin) {
-            let token = storage.get('token')
-            console.log('tokentoken', token)
+            let token = uni.getStorageSync('tonken')
+            console.log('token', token)
             if (token !== null) {
                 // options.header["token"] = token;
                 options.header = {
@@ -40,7 +42,7 @@
         return new Promise((resolve, reject) => {
             uni.request(options).then(data => {
                 var [error, res] = data
-                if (error != null) {
+                if (error !== null) {
                     reject(error)
                 } else {
                     // ���������������������������������������������������������������������������
diff --git a/utils/storage.js b/utils/storage.js
index 64b7e43..76f25cb 100644
--- a/utils/storage.js
+++ b/utils/storage.js
@@ -1,30 +1,24 @@
 export default {
-  set(name, value) {
-    uni.setStorageSync(name, value);
-  },
-
-  setJson(name, value) {
-    uni.setStorageSync(name, JSON.stringify(value));
-  },
-
-  get(name) {
-    return uni.getStorageSync(name);
-  },
-
-  getJson(name) {
-    const content = uni.getStorageSync(name);
-    if (!content) {
-      return null;
-    }
-
-    return JSON.parse(content);
-  },
-
-  remove(name) {
-    uni.removeStorageSync(name);
-  },
-
-  clear() {
-    uni.clearStorageSync();
-  },
-};
+    set(name, value) {
+        uni.setStorageSync(name, value)
+    },
+    setJson(name, value) {
+        uni.setStorageSync(name, JSON.stringify(value))
+    },
+    get(name) {
+        return uni.getStorageSync(name)
+    },
+    getJson(name) {
+        const content = uni.getStorageSync(name)
+        if (!content) {
+            return null
+        }
+        return JSON.parse(content)
+    },
+    remove(name) {
+        uni.removeStorageSync(name)
+    },
+    clear() {
+        uni.clearStorageSync()
+    },
+}
\ No newline at end of file

--
Gitblit v1.8.0