Browse Source

适配OA系统;更新清水营:1.0.2;金家渠:1.0.4;

tiandewen 3 years ago
parent
commit
22d5a026b0
100 changed files with 11063 additions and 1062 deletions
  1. 2 2
      App.vue
  2. 5 1
      common/time.js
  3. 149 0
      common/vmeitime-http/api.js
  4. 2 2
      common/vmeitime-http/interface.js
  5. 26 26
      components/e-link/e-link.vue
  6. 8 1
      components/p-personnel-orientation-section-1/p-personnel-orientation-section-1.vue
  7. 38 2
      components/t-i-banner/t-i-banner.vue
  8. 1 1
      components/t-i-common/t-i-common.vue
  9. 96 0
      components/t-i-icon/t-i-icon - 横向可滑动.vue
  10. 56 30
      components/t-i-icon/t-i-icon.vue
  11. 116 43
      components/t-i-jinjiaqu/t-i-jinjiaqu.vue
  12. 21 1
      components/t-i-notice/t-i-notice.vue
  13. 6 13
      components/t-i-yangchangwan/t-i-yangchangwan.vue
  14. 309 0
      components/t-o-news-tab-1/t-o-news-tab-1 - 副本.vue
  15. 57 162
      components/t-o-news-tab-1/t-o-news-tab-1.vue
  16. 2 2
      components/t-p-meihuajing/t-p-meihuajing.vue
  17. 15 0
      components/t-p-n-section-1/t-p-n-section-1.vue
  18. 36 0
      components/t-p-qingshuiying/t-p-qingshuiying.vue
  19. 14 5
      components/t-p-yangchangwan/t-p-yangchangwan.vue
  20. 1 1
      components/t-p-yangchangwanyifenqu/t-p-yangchangwanyifenqu.vue
  21. 1 1
      components/t-p-yangchanwanerfenqu/t-p-yangchanwanerfenqu.vue
  22. 3 3
      manifest.json
  23. 148 1
      pages.json
  24. 5 0
      pages/index/h5/h5.vue
  25. 1 1
      pages/index/record/h5/h5.vue
  26. 3 3
      pages/index/record/record-browse/record-browse.vue
  27. 23 5
      pages/index/record/record.vue
  28. 248 0
      pages/my/personal_information/honor/honor.vue
  29. 162 0
      pages/my/personal_information/job_record/job_record.vue
  30. 5 410
      pages/my/personal_information/personal_information - 副本.vue
  31. 652 5
      pages/my/personal_information/personal_information.vue
  32. 3 5
      pages/my/setPhone/setPhone.vue
  33. 399 0
      pages/my/signature/js/signature.js
  34. 38 0
      pages/my/signature/signature - 副本.vue
  35. 237 19
      pages/my/signature/signature.vue
  36. 2 2
      pages/ningdongyunying/personnel_orientation/personnel_orientation.vue
  37. 268 0
      pages/origanization/OA/application_list/application_list.vue
  38. 470 0
      pages/origanization/OA/application_list/detail_apply/detail_apply.vue
  39. BIN
      pages/origanization/OA/application_list/icon/close.png
  40. BIN
      pages/origanization/OA/application_list/icon/open.png
  41. 159 0
      pages/origanization/OA/application_list/search/search.vue
  42. 118 0
      pages/origanization/OA/apply_list/apply_list.vue
  43. 495 0
      pages/origanization/OA/approval_list/approval/approval.vue
  44. 118 0
      pages/origanization/OA/approval_list/approval_list - UI页面.vue
  45. 126 0
      pages/origanization/OA/approval_list/approval_list.vue
  46. 600 0
      pages/origanization/OA/approval_list/detail/detail.vue
  47. 41 0
      pages/origanization/OA/h5/h5.vue
  48. 189 0
      pages/origanization/news/tab_1/all_list/all_list - 副本.vue
  49. 68 167
      pages/origanization/news/tab_1/all_list/all_list.vue
  50. BIN
      pages/production/personnel_orientation/icon/overtime.png
  51. 133 7
      pages/production/personnel_orientation/personnel_orientation.vue
  52. 20 11
      pages/production/personnel_orientation/search/search.vue
  53. 26 0
      pages/production/qingshuiying/zidonghua_list/detail/detail.vue
  54. BIN
      pages/production/qingshuiying/zidonghua_list/img/icon.png
  55. BIN
      pages/production/qingshuiying/zidonghua_list/img/psxt.jpg
  56. BIN
      pages/production/qingshuiying/zidonghua_list/img/tfgl.jpg
  57. BIN
      pages/production/qingshuiying/zidonghua_list/img/yfzd.jpg
  58. BIN
      pages/production/qingshuiying/zidonghua_list/img/zys.jpg
  59. 294 0
      pages/production/qingshuiying/zidonghua_list/zidonghua_list.vue
  60. 160 0
      pages/production/safety_monitoring/safety_monitoring - 副本.vue
  61. 2 80
      pages/production/safety_monitoring/safety_monitoring.vue
  62. 106 0
      pages/production/shangtang/shangtang - 过期验证.vue
  63. 55 0
      pages/production/shangtang/shangtang.vue
  64. 20 5
      pages/tabbar/index/index.vue
  65. 1 0
      pages/tabbar/origanization/origanization.vue
  66. 56 0
      pages/tabbar/workbench/workbench - 副本.vue
  67. 282 36
      pages/tabbar/workbench/workbench.vue
  68. 1 1
      pages/workbench/duty_information/duty_information.vue
  69. 264 0
      pages/workbench/gridding/chart_statistics/chart_statistics.vue
  70. 134 0
      pages/workbench/gridding/grid_query/detail/detail.vue
  71. 243 0
      pages/workbench/gridding/grid_query/grid_query.vue
  72. 23 0
      pages/workbench/gridding/gridding - 副本.vue
  73. 727 4
      pages/workbench/gridding/gridding.vue
  74. BIN
      pages/workbench/gridding/icon/icon_1.png
  75. BIN
      pages/workbench/gridding/icon/icon_2.png
  76. BIN
      pages/workbench/gridding/icon/icon_3.png
  77. 130 0
      pages/workbench/gridding/timeline_details/detail/detail.vue
  78. BIN
      pages/workbench/gridding/timeline_details/detail/icon/icon.png
  79. BIN
      pages/workbench/gridding/timeline_details/icon/day.jpg
  80. 134 0
      pages/workbench/gridding/timeline_details/timeline_details.vue
  81. 1 1
      pages/workbench/h5/h5.vue
  82. 41 0
      uni_modules/uni-data-checkbox/changelog.md
  83. 817 0
      uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.vue
  84. 87 0
      uni_modules/uni-data-checkbox/package.json
  85. 18 0
      uni_modules/uni-data-checkbox/readme.md
  86. 52 0
      uni_modules/uni-data-picker/changelog.md
  87. 45 0
      uni_modules/uni-data-picker/components/uni-data-picker/keypress.js
  88. 537 0
      uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue
  89. 563 0
      uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js
  90. 333 0
      uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue
  91. 92 0
      uni_modules/uni-data-picker/package.json
  92. 22 0
      uni_modules/uni-data-picker/readme.md
  93. 6 0
      uni_modules/uni-icons/changelog.md
  94. 54 0
      uni_modules/uni-icons/components/uni-icons/icons.js
  95. 9 2
      uni_modules/uni-icons/components/uni-icons/uni-icons.vue
  96. 1 1
      uni_modules/uni-icons/package.json
  97. 19 0
      uni_modules/uni-load-more/changelog.md
  98. 5 0
      uni_modules/uni-load-more/components/uni-load-more/i18n/en.json
  99. 8 0
      uni_modules/uni-load-more/components/uni-load-more/i18n/index.js
  100. 0 0
      uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json

+ 2 - 2
App.vue

@@ -8,8 +8,8 @@
 			// uni.setStorageSync('mine_code', 'ningdongyunying');
 			// uni.setStorageSync('mine_code', 'shicaocun');
 			// uni.setStorageSync('mine_code', 'meihuajing');
-			uni.setStorageSync('mine_code', 'zaoquan');
-			// uni.setStorageSync('mine_code', 'qingshuiying');
+			// uni.setStorageSync('mine_code', 'zaoquan');
+			uni.setStorageSync('mine_code', 'qingshuiying');
 			// uni.setStorageSync('mine_code', 'wuyegongsi');
 			// uni.setStorageSync('mine_code', 'jinjiaqu');
 			// uni.setStorageSync('mine_code', 'yangchangwan');

+ 5 - 1
common/time.js

@@ -21,4 +21,8 @@ Date.prototype.format = function(fmt) {
 	}
 
 	return fmt;
-}
+}
+
+// import time from "@/common/time.js"
+
+// console.log(new Date().format("yyyy-MM-dd"))

+ 149 - 0
common/vmeitime-http/api.js

@@ -530,4 +530,153 @@ export const jigsawPuzzle_specialList = (data) => {
 		url: '/jigsawPuzzle/specialList',
 		data,
 	})
+}
+
+
+// OA 审批流
+// 消息页面
+// 五定表
+export const five_fixed_fiveFixed = (data) => {
+	return http.request({
+		method: "POST",
+		url: '/five_fixed/fiveFixed',
+		data,
+	})
+}
+// 五定表详情
+export const five_fixed_fiveFixedDetail = (data) => {
+	return http.request({
+		method: "POST",
+		url: '/five_fixed/fiveFixedDetail',
+		data,
+	})
+}
+
+// 申请列表
+export const workflow_get_all_list = (data) => {
+	return http.request({
+		url: '/workflow/get_all_list',
+		data,
+	})
+}
+// 申请详情
+export const workflow_get_detail = (data) => {
+	return http.request({
+		url: '/workflow/get_detail',
+		data,
+	})
+}
+// 申请提交
+export const workflow_submit_apply = (data) => {
+	return http.request({
+		method: "POST",
+		url: '/workflow/submit_apply',
+		data,
+	})
+}
+// 上传图片
+export const worksheet_design_up_images = (data) => {
+	return http.request({
+		method: "POST",
+		url: '/worksheet/design/up_images',
+		data,
+	})
+}
+
+// 流程待办
+// 审核列表
+export const workflow_get_check_list = (data) => {
+	return http.request({
+		url: '/workflow/get_check_list',
+		data,
+	})
+}
+// 全矿人员列表
+export const section_getSectionStaff = (data) => {
+	return http.request({
+		method: "POST",
+		url: '/section/getSectionStaff',
+		data,
+	})
+}
+
+// 网格排查
+// 配置参数 网格编号
+export const trouble_grid_number_list = (data) => {
+	return http.request({
+		method: "POST",
+		url: '/trouble/grid/number/list',
+		data,
+	})
+}
+// 获取网格范围
+export const trouble_grid_range_list = (data) => {
+	return http.request({
+		method: "POST",
+		url: '/trouble/grid/range/list',
+		data,
+	})
+}
+// 获取巡检人员
+export const trouble_grid_owner_list = (data) => {
+	return http.request({
+		method: "POST",
+		url: '/trouble/grid/owner/list',
+		data,
+	})
+}
+// 获取网格区域
+export const trouble_grid_region_list = (data) => {
+	return http.request({
+		method: "POST",
+		url: '/trouble/grid/region/list',
+		data,
+	})
+}
+// 添加巡检
+export const trouble_grid_check_add = (data) => {
+	return http.request({
+		method: "POST",
+		url: '/trouble/grid/check/add',
+		data,
+	})
+}
+// 网格化时间线
+export const trouble_grid_timeline = (data) => {
+	return http.request({
+		method: "POST",
+		url: '/trouble/grid/timeline',
+		data,
+	})
+}
+// 记录详情
+export const trouble_grid_check_detail = (data) => {
+	return http.request({
+		method: "POST",
+		url: '/trouble/grid/check/detail',
+		data,
+	})
+}
+// 查询
+export const trouble_grid_region_annular = (data) => {
+	return http.request({
+		method: "POST",
+		url: '/trouble/grid/region/annular',
+		data,
+	})
+}
+// 网格化巡检记录
+export const trouble_grid_list = (data) => {
+	return http.request({
+		url: '/trouble/grid/list',
+		data,
+	})
+}
+// 巡检详情
+export const trouble_grid_check_detailed = (data) => {
+	return http.request({
+		method: "POST",
+		url: '/trouble/grid/check/detailed',
+		data,
+	})
 }

+ 2 - 2
common/vmeitime-http/interface.js

@@ -35,8 +35,8 @@ export default {
 	config: {
 		// baseUrl: "http://colliery.nxjiewei.com/api",
 		// baseUrl: "http://ningdongyunying.nxjiewei.com:8011/api",
-		baseUrl: "http://zaoquan.nxjiewei.com:8011/api",
-		// baseUrl: "http://qingshuiying.nxjiewei.com:8011/api",
+		// baseUrl: "http://zaoquan.nxjiewei.com:8011/api",
+		baseUrl: "http://qingshuiying.nxjiewei.com:8011/api",
 		// baseUrl: "http://wuyegongsi.nxjiewei.com:8011/api",
 		// baseUrl: "http://jinjiaqu.nxjiewei.com:8011/api",
 		// baseUrl: "http://yangchangwan.nxjiewei.com:8011/api",

+ 26 - 26
components/e-link/e-link.vue

@@ -5,7 +5,7 @@
 
 			<view v-if="linksList[0].types == 11">
 				<view class="list_11">
-					<view class="item" v-for="item in linksList" :key="item.id" @click="go_page(item.linkUrl)">
+					<view class="item" v-for="item in linksList" :key="item.id" @click="go_page(item)">
 						<view class="left">
 							<view class="icon">
 								<view class="img"
@@ -26,7 +26,7 @@
 			</view>
 			<view v-if="linksList[0].types == 12">
 				<view class="list_12">
-					<view class="item" v-for="item in linksList" :key="item.id" @click="go_page(item.linkUrl)">
+					<view class="item" v-for="item in linksList" :key="item.id" @click="go_page(item)">
 						<view class="icon">
 							<view class="img"
 								v-if="item.imageUrl == '../../static/images/link.png'  || item.imageUrl == ''">
@@ -42,7 +42,7 @@
 			</view>
 			<view v-if="linksList[0].types == 13">
 				<view class="list_13">
-					<view class="item" v-for="item in linksList" :key="item.id" @click="go_page(item.linkUrl)">
+					<view class="item" v-for="item in linksList" :key="item.id" @click="go_page(item)">
 						<view class="icon">
 							<view class="img"
 								v-if="item.imageUrl == '../../static/images/link.png'  || item.imageUrl == ''">
@@ -58,7 +58,7 @@
 			</view>
 			<view v-if="linksList[0].types == 14">
 				<view class="list_14">
-					<view class="item" v-for="item in linksList" :key="item.id" @click="go_page(item.linkUrl)">
+					<view class="item" v-for="item in linksList" :key="item.id" @click="go_page(item)">
 						<view class="icon">
 							<view class="img"
 								v-if="item.imageUrl == '../../static/images/link.png'  || item.imageUrl == ''">
@@ -88,29 +88,28 @@
 			};
 		},
 		methods: {
-			// go_page(link) {
-			// 	console.log(link)
-			// 	let pageId = ""
-			// 	function GetQueryString(name) {
-			// 		var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
-			// 		var r = link.match(reg);
-			// 		if (r != null) return unescape(r[2]);
-			// 		return null;
-			// 	}
-			// 	console.log(GetQueryString("pageId"))
-			// 	if (GetQueryString("pageId")) {
-			// 		pageId = GetQueryString("pageId")
-			// 	} else {
-			// 		pageId = link.split('=')[1]
-			// 	}
-
-			// 	uni.navigateTo({
-			// 		url: "../../index/record/record?pageId=" + pageId + "&mine_code=" + this.mine_code,
-			// 	})
-			// }
-			
-			go_page(link){
+			go_page(item){
+				console.log(item)
+				
+				let link = item.linkUrl
 				console.log(link)
+				
+				// OA系统
+				if(link.indexOf("oa_system.nxjiewei.com") != -1 ){
+					uni.navigateTo({
+						url:"../../origanization/OA/h5/h5",
+						success: (res) =>{
+							// 通过eventChannel向被打开页面传送数据
+							res.eventChannel.emit('acceptDataFromOpenerPage', {
+								url: link,
+							})
+						}
+					})
+					
+					return
+				}
+				
+				
 				// 二维码
 				if(link.indexOf("pageId") != -1 && link.indexOf("app:") == -1){
 					let pageId = ""
@@ -147,6 +146,7 @@
 				if(link.indexOf("pageId") == -1 && link.indexOf("app:") != -1){
 					console.log("原生")
 				}
+				
 			}
 		}
 	}

+ 8 - 1
components/p-personnel-orientation-section-1/p-personnel-orientation-section-1.vue

@@ -16,7 +16,7 @@
 					<view class="text box_2">下井时间</view>
 					<view class="text box_3">当前位置</view>
 				</view>
-				<view class="item" v-for="(item,index) in people_list" :key="index">
+				<view class="item" v-for="(item,index) in people_list" :key="index" @click="go_downhole_statistics(item.people_num,item.depart_name,item.name)">
 					<view class="text box_1">{{item.name}}</view>
 					<view class="text box_2">{{item.down_time}}</view>
 					<view class="text box_3">{{item.station_name}}</view>
@@ -50,6 +50,13 @@
 				console.log(res)
 				this.people_list = res.data.data.people_list
 			})
+		},
+		methods:{
+			go_downhole_statistics(people_num,depart_name,name){
+				uni.navigateTo({
+					url:"./downhole_statistics/downhole_statistics?people_num="+people_num+"&depart_name="+depart_name+"&name="+name+"&mine="+this.mine
+				})
+			}
 		}
 	}
 </script>

+ 38 - 2
components/t-i-banner/t-i-banner.vue

@@ -2,7 +2,7 @@
 	<view>
 		<view class="banner">
 			<swiper class="box" autoplay circular>
-				<swiper-item v-for="(item,index) in banner" :key="item.id">
+				<swiper-item v-for="(item,index) in banner" :key="item.id" @click="go_link(item.jumpURL)">
 					<view class="item">
 						<view class="img">
 							<image :src="item.imgURL"></image>
@@ -24,13 +24,49 @@
 	export default {
 		name:"t-i-banner",
 		props: [
-			"banner"
+			"banner",
+			"mine_code"
 		],
 		data() {
 			return {
 				
 			}
 		},
+		methods:{
+			go_link(link){
+				console.log(link)
+				
+				// 二维码
+				if (link.indexOf("pageId") != -1 && link.indexOf("app:") == -1) {
+					let pageId = ""
+				
+					function GetQueryString(name) {
+						var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
+						var r = link.match(reg);
+						if (r != null) return unescape(r[2]);
+						return null;
+					}
+					console.log(GetQueryString("pageId"))
+					if (GetQueryString("pageId")) {
+						pageId = GetQueryString("pageId")
+					} else {
+						pageId = link.split('=')[1]
+					}
+				
+					uni.navigateTo({
+						url: "../../index/record/record?pageId=" + pageId + "&mine_code=" + this.mine_code,
+					})
+				}// h5
+				if (link.indexOf("pageId") == -1 && link.indexOf("app:") == -1) {
+					console.log("H5")
+					uni.navigateTo({
+						url:"../../index/h5/h5?url=" + link
+					})
+				}
+
+				
+			}
+		}
 	}
 </script>
 

+ 1 - 1
components/t-i-common/t-i-common.vue

@@ -46,7 +46,7 @@
 				this.$api.getCommonMenuList({
 
 				}).then((res) => {
-					console.log(res.data)
+					// console.log(res.data)
 
 					this.list = res.data.data
 				})

+ 96 - 0
components/t-i-icon/t-i-icon - 横向可滑动.vue

@@ -0,0 +1,96 @@
+<template>
+	<view class="content">
+		<scroll-view scroll-x="true">
+			<view class="list">
+				<view class="item" v-for="(item,index) in iconList" :key="index" @click="go_link(item.link)">
+					<view class="icon">
+						<image :src="item.icon" mode=""></image>
+					</view>
+					<view class="name">{{item.title}}</view>
+				</view>
+			</view>
+		</scroll-view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "t-i-icon",
+		props: [
+			"iconList",
+			"mine_code"
+		],
+		data() {
+			return {
+
+			};
+		},
+		methods: {
+			go_link(link) {
+				// console.log(link.split('=')[3].split('&')[0])
+				// let pageId = link.split('=')[3].split('&')[0]
+				console.log(link)
+				let pageId = ""
+
+				function GetQueryString(name) {
+					var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
+					var r = link.match(reg);
+					if (r != null) return unescape(r[2]);
+					return null;
+				}
+				console.log(GetQueryString("pageId"))
+				if (GetQueryString("pageId")) {
+					pageId = GetQueryString("pageId")
+				} else {
+					pageId = link.split('=')[1]
+				}
+
+				uni.navigateTo({
+					url: "../../index/record/record?pageId=" + pageId + "&mine_code=" + this.mine_code,
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.content {
+		margin-bottom: 30rpx;
+		background-color: #FFFFFF;
+
+		box-sizing: border-box;
+		padding: 50rpx 25rpx;
+	}
+
+	.list {
+		display: flex;
+
+		.item {
+			margin-right: 25rpx;
+			width: 120rpx;
+			.icon {
+				width: 120rpx;
+				text-align: center;
+
+				image {
+					width: 104rpx;
+					height: 104rpx;
+				}
+			}
+
+			.name {
+				width: 120rpx;
+				text-align: center;
+				font-size: 30rpx;
+
+				white-space: nowrap;
+				overflow: hidden;
+				text-overflow: ellipsis;
+			}
+		}
+
+		.item:last-child {
+			margin-right: 0;
+		}
+	}
+</style>

+ 56 - 30
components/t-i-icon/t-i-icon.vue

@@ -1,15 +1,13 @@
 <template>
 	<view class="content">
-		<scroll-view scroll-x="true">
-			<view class="list">
-				<view class="item" v-for="(item,index) in iconList" :key="index" @click="go_link(item.link)">
-					<view class="icon">
-						<image :src="item.icon" mode=""></image>
-					</view>
-					<view class="name">{{item.title}}</view>
+		<view class="list">
+			<view class="item" v-for="(item,index) in iconList" :key="index" @click="go_link(item)">
+				<view class="icon">
+					<image :src="item.icon" mode=""></image>
 				</view>
+				<view class="name">{{item.title}}</view>
 			</view>
-		</scroll-view>
+		</view>
 	</view>
 </template>
 
@@ -26,28 +24,53 @@
 			};
 		},
 		methods: {
-			go_link(link) {
-				// console.log(link.split('=')[3].split('&')[0])
-				// let pageId = link.split('=')[3].split('&')[0]
+			go_link(item) {
+				let link = item.link
 				console.log(link)
-				let pageId = ""
-
-				function GetQueryString(name) {
-					var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
-					var r = link.match(reg);
-					if (r != null) return unescape(r[2]);
-					return null;
+				
+				// OA系统
+				if(link.indexOf("oa_system.nxjiewei.com") != -1 ){
+					uni.navigateTo({
+						url:"../../origanization/OA/h5/h5",
+						success: (res) =>{
+							// 通过eventChannel向被打开页面传送数据
+							res.eventChannel.emit('acceptDataFromOpenerPage', {
+								url: link,
+							})
+						}
+					})
+					
+					return
 				}
-				console.log(GetQueryString("pageId"))
-				if (GetQueryString("pageId")) {
-					pageId = GetQueryString("pageId")
-				} else {
-					pageId = link.split('=')[1]
+				
+				// 二维码
+				if (link.indexOf("pageId") != -1 && link.indexOf("app:") == -1) {
+					let pageId = ""
+				
+					function GetQueryString(name) {
+						var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
+						var r = link.match(reg);
+						if (r != null) return unescape(r[2]);
+						return null;
+					}
+					console.log(GetQueryString("pageId"))
+					if (GetQueryString("pageId")) {
+						pageId = GetQueryString("pageId")
+					} else {
+						pageId = link.split('=')[1]
+					}
+				
+					uni.navigateTo({
+						url: "../../index/record/record?pageId=" + pageId + "&mine_code=" + this.mine_code,
+					})
 				}
-
-				uni.navigateTo({
-					url: "../../index/record/record?pageId=" + pageId + "&mine_code=" + this.mine_code,
-				})
+				// h5
+				if (link.indexOf("pageId") == -1 && link.indexOf("app:") == -1) {
+					uni.navigateTo({
+						url:"../../index/h5/h5?url="+link
+					})
+				}
+				
 			}
 		}
 	}
@@ -59,14 +82,16 @@
 		background-color: #FFFFFF;
 
 		box-sizing: border-box;
-		padding: 50rpx 25rpx;
+		padding: 50rpx 25rpx 25rpx 25rpx;
 	}
 
 	.list {
-		display: flex;
+		overflow: hidden;
 
 		.item {
+			float: left;
 			margin-right: 25rpx;
+			margin-bottom: 30rpx;
 			width: 120rpx;
 			.icon {
 				width: 120rpx;
@@ -75,6 +100,7 @@
 				image {
 					width: 104rpx;
 					height: 104rpx;
+					border-radius: 50%;
 				}
 			}
 
@@ -89,7 +115,7 @@
 			}
 		}
 
-		.item:last-child {
+		.item:nth-child(5n) {
 			margin-right: 0;
 		}
 	}

+ 116 - 43
components/t-i-jinjiaqu/t-i-jinjiaqu.vue

@@ -11,16 +11,16 @@
 				</view>
 			</view>
 		</view>
-		
+
 		<!-- 图片链接 -->
 		<view class="section_2">
 			<view class="list">
-				<view class="item" v-for="(item,index) in list_3.children" :key="index"  @click="go_record(item.link)">
+				<view class="item" v-for="(item,index) in list_3.children" :key="index" @click="go_record(item.link)">
 					<image :src="item.thumb" mode=""></image>
 				</view>
 			</view>
 		</view>
-		
+
 		<!-- 快速通道 -->
 		<view class="section_3">
 			<view class="title">快速通道</view>
@@ -30,7 +30,7 @@
 				</view>
 			</view>
 		</view>
-		
+
 
 	</view>
 </template>
@@ -38,7 +38,7 @@
 <script>
 	export default {
 		name: "t-i-jinjiaqu",
-		props:[
+		props: [
 			"mine_code"
 		],
 		data() {
@@ -47,11 +47,11 @@
 				list: [],
 				list_1: [],
 				list_2: [],
-				
+
 				// 图片链接
-				list_3:[],
+				list_3: [],
 				// 快速通道
-				list_4:[]
+				list_4: []
 			};
 		},
 		created() {
@@ -79,17 +79,19 @@
 					this.list_1 = res.data.data[2]
 					// 基层区队
 					this.list_2 = res.data.data[3]
-					
+
 					// 图片链接
 					this.list_3 = res.data.data[1]
 					// 快速通道
 					this.list_4 = res.data.data[0]
 				})
 			},
-			go_record(link){
+			go_record(link) {
+				console.log(link)
 				// 二维码
-				if(link.indexOf("pageId") != -1 && link.indexOf("app:") == -1){
+				if (link.indexOf("pageId") != -1 && link.indexOf("app:") == -1) {
 					let pageId = ""
+
 					function GetQueryString(name) {
 						var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
 						var r = link.match(reg);
@@ -102,23 +104,86 @@
 					} else {
 						pageId = link.split('=')[1]
 					}
-					
-					uni.navigateTo({
-						url:"../../index/record/record?pageId=" + pageId + "&mine_code=" + this.mine_code,
-					})
-				}else if(link.indexOf("webdevelop.nxjiewei.com/assets/html/pingce") != -1){
-					uni.navigateTo({
-						url:"../../index/h5/h5?url=jinjiaqu_pingce"
-					})
-				}else if(link.indexOf("/wordorder/wordOrderGrid_win") != -1){
-					console.log(link)
+
 					uni.navigateTo({
-						url:"../../index/business_approval/business_approval"
+						url: "../../index/record/record?pageId=" + pageId + "&mine_code=" + this.mine_code,
 					})
-				}else{
+				}
+
+				// h5
+				if (link.indexOf("pageId") == -1 && link.indexOf("app:") == -1) {
+					console.log("H5")
+					// #ifdef APP
+					if (plus.os.name == 'Android') {
+
+						if (link.indexOf("cmb.pb") != -1) {
+							plus.runtime.launchApplication({
+								pname: 'cmb.pb'
+							}, (e) => {
+								console.log('Open system default browser failed: ' + e.message)
+
+								uni.showToast({
+									icon: "none",
+									title: "未安装此应用"
+								})
+							})
+						} else if (link.indexOf("com.icbc") != -1) {
+							plus.runtime.launchApplication({
+								pname: 'com.icbc'
+							}, (e) => {
+								console.log('Open system default browser failed: ' + e.message)
+
+								uni.showToast({
+									icon: "none",
+									title: "未安装此应用"
+								})
+							})
+						} else if (link.indexOf("webdevelop.nxjiewei.com/assets/html/pingce") != -1) {
+							uni.navigateTo({
+								url: "../../index/h5/h5?url=jinjiaqu_pingce"
+							})
+						} else if (link.indexOf("/yinhuanpaicha/yinhuaninfo") != -1) {
+							uni.navigateTo({
+								url: "../../index/h5/h5?url="+link
+							})
+						}
+					}
+
+
+					// #endif
+
+					// #ifdef H5
+					if (link.indexOf("webdevelop.nxjiewei.com/assets/html/pingce") != -1) {
+						uni.navigateTo({
+							url: "../../index/h5/h5?url=jinjiaqu_pingce"
+						})
+					} else if (link.indexOf("/yinhuanpaicha/yinhuaninfo") != -1) {
+						uni.navigateTo({
+							url: "../../index/h5/h5?url="+link
+						})
+					}
+					// #endif
+				}
+
+
+
+				if (link.indexOf("pageId") == -1 && link.indexOf("app:") != -1) {
+					console.log("原生")
+					if (link.indexOf("/browseQrcode/gridSubmitItem_win") != -1) {
+						console.log("网格排查")
+						uni.navigateTo({
+							url: "../../workbench/gridding/gridding"
+						})
+					} else if (link.indexOf("/wordorder/wordOrderGrid_win") != -1) {
+						console.log(link)
+						uni.navigateTo({
+							url: "../../index/business_approval/business_approval"
+						})
+					}
+				} else {
 					console.log(link)
 				}
-				
+
 			}
 		}
 	}
@@ -152,11 +217,12 @@
 		.list {
 			margin-top: 30rpx;
 			overflow: hidden;
-			.item{
+
+			.item {
 				float: left;
 				margin-right: 20rpx;
 				margin-bottom: 30rpx;
-				
+
 				width: 160rpx;
 				box-sizing: border-box;
 				border: 2rpx solid #009fe8;
@@ -167,63 +233,70 @@
 				overflow: hidden;
 				white-space: nowrap;
 				text-overflow: ellipsis;
-				
+
 				padding: 0 10rpx;
 				background-color: #66C7F218;
 				color: #009FE8;
-			
+
 				text-align: center;
 			}
-			.item:nth-child(4n){
+
+			.item:nth-child(4n) {
 				margin-right: 0;
 			}
 		}
 
 	}
-	
-	.section_2{
+
+	.section_2 {
 		box-sizing: border-box;
 		padding: 0 25rpx;
-		.list{
+
+		.list {
 			display: flex;
 			flex-wrap: wrap;
 			justify-content: space-between;
-			.item{
+
+			.item {
 				margin-bottom: 20rpx;
 				width: 340rpx;
 				height: 180rpx;
-				
+
 				border-radius: 20rpx;
 				overflow: hidden;
-				
-				image{
+
+				image {
 					width: 340rpx;
 					height: 180rpx;
 				}
 			}
 		}
 	}
-	.section_3{
+
+	.section_3 {
 		box-sizing: border-box;
 		padding: 0 25rpx;
-		.title{
+
+		.title {
 			line-height: 120rpx;
 			font-size: 36rpx;
 			font-weight: 700;
 		}
-		.list{
+
+		.list {
 			display: flex;
 			flex-wrap: wrap;
 			justify-content: space-between;
-			.item{
+
+			.item {
 				margin-bottom: 20rpx;
 				width: 340rpx;
 				height: 220rpx;
-				
+
 				border-radius: 20rpx;
 				overflow: hidden;
-				
-				image{
+
+				image {
 					width: 340rpx;
 					height: 220rpx;
 				}

+ 21 - 1
components/t-i-notice/t-i-notice.vue

@@ -9,6 +9,10 @@
 			<!-- 文字滚动 -->
 			<uni-notice-bar scrollable="true" :speed="20" background-color="#ffffff00" color="#fff" single="true"
 				:text="text"></uni-notice-bar>
+				
+			<!-- <view class="more" @click="go_duty_information()">
+				<uni-icons type="more-filled" color="#fff"></uni-icons>
+			</view> -->
 		</view>
 	</view>
 </template>
@@ -120,6 +124,12 @@
 
 			},
 
+		
+			go_duty_information(){
+				uni.navigateTo({
+					url:"../../workbench/duty_information/duty_information"
+				})
+			}
 		}
 	}
 </script>
@@ -147,7 +157,8 @@
 
 		box-sizing: border-box;
 		padding: 0 20rpx;
-
+		
+		position: relative;
 
 		/deep/.uni-noticebar {
 			margin-bottom: 0;
@@ -156,5 +167,14 @@
 		/deep/.uni-noticebar:nth-child(2) {
 			padding-top: 0;
 		}
+		
+		
+		.more{
+			transform: rotate(90deg);
+			
+			position: absolute;
+			top: 42rpx;
+			right: 5rpx;
+		}
 	}
 </style>

+ 6 - 13
components/t-i-yangchangwan/t-i-yangchangwan.vue

@@ -1,6 +1,6 @@
 <template>
 	<view class="content">
-		<view class="section" v-for="(item,index) in list" :key="index">
+		<view class="section" v-for="(item,index) in home_link" :key="index">
 			<view class="title">{{item.title}}</view>
 			<view class="list">
 				<view class="item" v-for="(item_2,index_2) in item.children" :key="index_2" @click="go_record(item_2.link)">
@@ -15,26 +15,19 @@
 	export default {
 		name: "t-i-yangchangwan",
 		props:[
-			"mine_code"
+			"mine_code",
+			"home_link"
 		],
 		data() {
 			return {
-				list: [],
+				// list: [],
 			};
 		},
 		created() {
-			this.get_home_link()
+			// this.get_home_link()
 		},
 		methods: {
-			get_home_link() {
-				this.$api.home_link({
-
-				}).then((res) => {
-					console.log(res.data.data)
-
-					this.list = res.data.data
-				})
-			},
+			
 			go_record(link){
 				// 二维码
 				if(link.indexOf("pageId") != -1 && link.indexOf("app:") == -1){

+ 309 - 0
components/t-o-news-tab-1/t-o-news-tab-1 - 副本.vue

@@ -0,0 +1,309 @@
+<template>
+	<view>
+		<view class="tab">
+			<view class="item" @click="change_active(1)">
+				<view class="text" :class="active == 1?'active':''">安全管理</view>
+				<view class="line" v-if="active == 1"></view>
+			</view>
+			<view class="item" @click="change_active(2)">
+				<view class="text" :class="active == 2?'active':''">巡检维护</view>
+				<view class="line" v-if="active == 2"></view>
+			</view>
+			<view class="item" @click="change_active(3)">
+				<view class="text" :class="active == 3?'active':''">党建经营</view>
+				<view class="line" v-if="active == 3"></view>
+			</view>
+			<view class="item" @click="change_active(4)">
+				<view class="text" :class="active == 4?'active':''">其他</view>
+				<view class="line" v-if="active == 4"></view>
+			</view>
+
+		</view>
+
+		<view class="list">
+			<view class="item" v-for="item in 2">
+				<view class="title">五定表</view>
+				<scroll-view scroll-x>
+					<view class="inner">
+						<view class="line">
+							<view class="box">
+								<view class="text text_1">序号</view>
+							</view>
+							<view class="box">
+								<view class="text text_2">检查时间</view>
+							</view>
+							<view class="box">
+								<view class="text text_3">检查地点</view>
+							</view>
+							<view class="box">
+								<view class="text text_4">检查人</view>
+							</view>
+							<view class="box">
+								<view class="text text_5">问题类型</view>
+							</view>
+							<view class="box">
+								<view class="text text_6">问题或隐患描述</view>
+							</view>
+							<view class="box">
+								<view class="text text_7">整改措施</view>
+							</view>
+							<view class="box">
+								<view class="text text_8">完成日期</view>
+							</view>
+							<view class="box">
+								<view class="text text_9">详情</view>
+							</view>
+						</view>
+						<view class="line" v-for="item in 5">
+							<view class="icon">
+								<image src="./icon/new.png" mode=""></image>
+							</view>
+							<view class="box">
+								<view class="text text_1">{{item}}</view>
+							</view>
+							<view class="box">
+								<view class="text text_2">2021-12-25</view>
+							</view>
+							<view class="box">
+								<view class="text text_3">红柳机房</view>
+							</view>
+							<view class="box">
+								<view class="text text_4">李建中、牛之星、李雅婷</view>
+							</view>
+							<view class="box">
+								<view class="text text_5">标准化</view>
+							</view>
+							<view class="box">
+								<view class="text text_6">问题或隐患描述问题或隐患描述问题或隐患描述问题或隐患描述问题或隐患描述问题或隐患描述问题或隐患描述问题或隐患描述
+								</view>
+							</view>
+							<view class="box">
+								<view class="text text_7">整改措施整改措施整改措施整改措施整改措施整改措施</view>
+							</view>
+							<view class="box">
+								<view class="text text_8">2021-12-31</view>
+							</view>
+							<view class="box">
+								<view class="text text_9">查看</view>
+							</view>
+						</view>
+
+
+					</view>
+				</scroll-view>
+				<view class="btn">
+					<view class="icon">
+						<image src="./icon/btn.png" mode=""></image>
+					</view>
+					<view class="btn_text" @click="go_all_list()">点击查看全部信息</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "t-o-news-tab-1",
+		data() {
+			return {
+				active: 1
+			};
+		},
+		methods: {
+			change_active(item) {
+				this.active = item
+			},
+			get_list(){
+				
+			},
+			go_all_list(){
+				uni.navigateTo({
+					url:"../../origanization/news/tab_1/all_list/all_list"
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.tab {
+		display: flex;
+		justify-content: space-around;
+		align-items: center;
+
+		background-color: #FFFFFF;
+		margin-bottom: 20rpx;
+		height: 90rpx;
+
+		.item {
+			position: relative;
+
+			.text {
+				font-size: 30rpx;
+				color: #666666;
+			}
+
+			.active {
+				font-weight: 700;
+				color: #000000;
+			}
+
+			.line {
+				position: absolute;
+				bottom: -15rpx;
+				left: 50%;
+
+				transform: translateX(-30rpx);
+
+				width: 60rpx;
+				height: 4rpx;
+				background-color: #009FE8;
+			}
+		}
+	}
+
+	.list {
+		box-sizing: border-box;
+		padding: 0 25rpx;
+
+		.item {
+			margin-bottom: 20rpx;
+			width: 700rpx;
+			background-color: #FFFFFF;
+			border-radius: 20rpx;
+
+			box-sizing: border-box;
+			padding: 0 25rpx;
+			padding-bottom: 20rpx;
+
+			.title {
+				text-align: center;
+				height: 120rpx;
+				line-height: 120rpx;
+				font-size: 40rpx;
+				font-weight: 700;
+			}
+
+			.inner {
+				.line {
+					display: flex;
+					align-items: center;
+					
+					position: relative;
+					
+					.icon{
+						position: absolute;
+						top: -10rpx;
+						right: 0;
+						image{
+							width: 33rpx;
+							height: 18rpx;
+						}
+					}
+
+					.box {
+						display: flex;
+						align-items: center;
+						height: 90rpx;
+						box-sizing: border-box;
+						border: 1rpx solid #D9D9D9;
+
+						.text {
+							font-size: 26rpx;
+							color: #333333;
+							text-align: center;
+
+							text-overflow: -o-ellipsis-lastline;
+							overflow: hidden;
+							text-overflow: ellipsis;
+							display: -webkit-box;
+							-webkit-line-clamp: 2;
+							line-clamp: 2;
+							-webkit-box-orient: vertical;
+						}
+
+						.text_1 {
+							width: 80rpx;
+						}
+
+						.text_2 {
+							width: 220rpx;
+						}
+
+						.text_3 {
+							width: 200rpx;
+						}
+
+						.text_4 {
+							width: 400rpx;
+						}
+
+						.text_5 {
+							width: 200rpx;
+						}
+
+						.text_6 {
+							width: 500rpx;
+						}
+
+						.text_7 {
+							width: 500rpx;
+						}
+
+						.text_8 {
+							width: 200rpx;
+						}
+
+						.text_9 {
+							width: 200rpx;
+						}
+					}
+
+
+				}
+
+				.line:nth-child(1) {
+					.box {
+						height: 80rpx;
+						background-color: #D8D8D8;
+
+						.text {
+							font-size: 28rpx;
+							color: #000000;
+						}
+					}
+				}
+
+			}
+
+			.btn {
+				margin: 20rpx auto;
+				width: 400rpx;
+				height: 50rpx;
+
+				background-color: #69BBFA;
+				border-radius: 50rpx;
+
+				display: flex;
+				align-items: center;
+				justify-content: center;
+
+				.icon {
+					image {
+						width: 23rpx;
+						height: 24rpx;
+
+						display: block;
+					}
+				}
+
+				.btn_text {
+					margin-left: 10rpx;
+					font-size: 28rpx;
+					color: #FFFFFF;
+				}
+			}
+		}
+	}
+</style>

+ 57 - 162
components/t-o-news-tab-1/t-o-news-tab-1.vue

@@ -21,83 +21,37 @@
 		</view>
 
 		<view class="list">
-			<view class="item" v-for="item in 2">
-				<view class="title">五定表</view>
-				<scroll-view scroll-x>
-					<view class="inner">
-						<view class="line">
-							<view class="box">
-								<view class="text text_1">序号</view>
-							</view>
-							<view class="box">
-								<view class="text text_2">检查时间</view>
-							</view>
-							<view class="box">
-								<view class="text text_3">检查地点</view>
-							</view>
-							<view class="box">
-								<view class="text text_4">检查人</view>
-							</view>
-							<view class="box">
-								<view class="text text_5">问题类型</view>
-							</view>
-							<view class="box">
-								<view class="text text_6">问题或隐患描述</view>
-							</view>
-							<view class="box">
-								<view class="text text_7">整改措施</view>
-							</view>
-							<view class="box">
-								<view class="text text_8">完成日期</view>
-							</view>
-							<view class="box">
-								<view class="text text_9">详情</view>
-							</view>
-						</view>
-						<view class="line" v-for="item in 5">
+			<view class="item" v-for="(item,index) in list" :key="index">
+				<view class="title">{{item.title}}</view>
+
+				<uni-table border emptyText="暂无更多数据">
+					<!-- 表头行 -->
+					<uni-tr>
+						<uni-th align="center" width="60">序号</uni-th>
+						<uni-th align="center" v-for="(item_2,index_2) in item.name">{{item_2}}</uni-th>
+					</uni-tr>
+					<!-- 表格数据行 -->
+					<uni-tr v-for="(item_2,index_2) in item.data" :key="index_2">
+						<uni-td align="center">
 							<view class="icon">
-								<image src="./icon/new.png" mode=""></image>
-							</view>
-							<view class="box">
-								<view class="text text_1">{{item}}</view>
-							</view>
-							<view class="box">
-								<view class="text text_2">2021-12-25</view>
-							</view>
-							<view class="box">
-								<view class="text text_3">红柳机房</view>
-							</view>
-							<view class="box">
-								<view class="text text_4">李建中、牛之星、李雅婷</view>
-							</view>
-							<view class="box">
-								<view class="text text_5">标准化</view>
-							</view>
-							<view class="box">
-								<view class="text text_6">问题或隐患描述问题或隐患描述问题或隐患描述问题或隐患描述问题或隐患描述问题或隐患描述问题或隐患描述问题或隐患描述
-								</view>
+								<image v-if="index_2 < 3" src="./icon/new.png" mode=""></image> <text
+									style="margin-left: 10rpx;">{{index_2+1}}</text>
 							</view>
-							<view class="box">
-								<view class="text text_7">整改措施整改措施整改措施整改措施整改措施整改措施</view>
-							</view>
-							<view class="box">
-								<view class="text text_8">2021-12-31</view>
-							</view>
-							<view class="box">
-								<view class="text text_9">查看</view>
-							</view>
-						</view>
+						</uni-td>
+						<uni-td align="center" v-for="(item_3,index_3) in item_2" :key="index_3">{{item_3}}</uni-td>
+					</uni-tr>
 
+				</uni-table>
 
-					</view>
-				</scroll-view>
 				<view class="btn">
 					<view class="icon">
 						<image src="./icon/btn.png" mode=""></image>
 					</view>
-					<view class="btn_text" @click="go_all_list()">点击查看全部信息</view>
+					<view class="btn_text" @click="go_all_list(item.title,item.table)">点击查看全部信息</view>
 				</view>
 			</view>
+
+
 		</view>
 	</view>
 </template>
@@ -107,16 +61,29 @@
 		name: "t-o-news-tab-1",
 		data() {
 			return {
-				active: 1
+				active: 1,
+				list:[]
 			};
 		},
+		mounted() {
+			this.get_list()
+		},
 		methods: {
 			change_active(item) {
 				this.active = item
 			},
-			go_all_list(){
+			get_list() {
+				this.$api.five_fixed_fiveFixed({
+					
+				}).then((res)=>{
+					console.log(res.data.content.data)
+					
+					this.list = res.data.content.data
+				})
+			},
+			go_all_list(title,table) {
 				uni.navigateTo({
-					url:"../../origanization/news/tab_1/all_list/all_list"
+					url: "../../origanization/news/tab_1/all_list/all_list?title="+title+"&table="+table
 				})
 			}
 		}
@@ -124,6 +91,15 @@
 </script>
 
 <style lang="scss">
+	.uni-table-th.table--border {
+		color: #000000;
+		background-color: #D8D8D8;
+	}
+
+	.uni-table-td.table--border {
+		color: #666666;
+	}
+
 	.tab {
 		display: flex;
 		justify-content: space-around;
@@ -182,98 +158,6 @@
 				font-weight: 700;
 			}
 
-			.inner {
-				.line {
-					display: flex;
-					align-items: center;
-					
-					position: relative;
-					
-					.icon{
-						position: absolute;
-						top: -10rpx;
-						right: 0;
-						image{
-							width: 33rpx;
-							height: 18rpx;
-						}
-					}
-
-					.box {
-						display: flex;
-						align-items: center;
-						height: 90rpx;
-						box-sizing: border-box;
-						border: 1rpx solid #D9D9D9;
-
-						.text {
-							font-size: 26rpx;
-							color: #333333;
-							text-align: center;
-
-							text-overflow: -o-ellipsis-lastline;
-							overflow: hidden;
-							text-overflow: ellipsis;
-							display: -webkit-box;
-							-webkit-line-clamp: 2;
-							line-clamp: 2;
-							-webkit-box-orient: vertical;
-						}
-
-						.text_1 {
-							width: 80rpx;
-						}
-
-						.text_2 {
-							width: 220rpx;
-						}
-
-						.text_3 {
-							width: 200rpx;
-						}
-
-						.text_4 {
-							width: 400rpx;
-						}
-
-						.text_5 {
-							width: 200rpx;
-						}
-
-						.text_6 {
-							width: 500rpx;
-						}
-
-						.text_7 {
-							width: 500rpx;
-						}
-
-						.text_8 {
-							width: 200rpx;
-						}
-
-						.text_9 {
-							width: 200rpx;
-						}
-					}
-
-
-				}
-
-				.line:nth-child(1) {
-					.box {
-						height: 80rpx;
-						background-color: #D8D8D8;
-
-						.text {
-							font-size: 28rpx;
-							color: #000000;
-						}
-					}
-				}
-
-			}
-
 			.btn {
 				margin: 20rpx auto;
 				width: 400rpx;
@@ -303,4 +187,15 @@
 			}
 		}
 	}
+
+	.icon {
+		position: relative;
+		top: 0;
+		right: 0;
+
+		image {
+			width: 33rpx;
+			height: 18rpx;
+		}
+	}
 </style>

+ 2 - 2
components/t-p-meihuajing/t-p-meihuajing.vue

@@ -66,7 +66,7 @@
 		</view>
 		<view class="item_box" style="background-color: #2C3E50;" @click="go_zdhxt('http://webdevelop.nxjiewei.com/assets/html/meihuajing-pc/dmml/')">
 			<view class="img">
-				<image src="../t-p-icon/icon_9.png" mode=""></image>
+				<image src="../t-p-icon/icon_8.png" mode=""></image>
 			</view>
 			<view class="text">
 				<view class="name">主运输系统</view>
@@ -94,7 +94,7 @@
 		<view class="item_box" style="background-color: #2873FF;"
 			@click="go_zdhxt('http://webdevelop.nxjiewei.com/assets/html/meihuajing/11bf','MeiHuaJing_11BengFang')">
 			<view class="img">
-				<image src="../t-p-icon/icon_8.png" mode=""></image>
+				<image src="../t-p-icon/icon_9.png" mode=""></image>
 			</view>
 			<view class="text">
 				<view class="name">排水系统</view>

+ 15 - 0
components/t-p-n-section-1/t-p-n-section-1.vue

@@ -100,6 +100,14 @@
 				<view class="tip">容知设备监控</view>
 			</view>
 		</view>
+		<view class="item_box" style="background-color: #BD5A79;" @click="go_shangtang()">
+			<view class="img">
+				<image src="../t-p-icon/icon_11.png" mode=""></image>
+			</view>
+			<view class="text">
+				<view class="name">商汤</view>
+			</view>
+		</view>
 	</view>
 </template>
 
@@ -170,6 +178,13 @@
 					url: "../../ningdongyunying/h5/h5?url=" + url
 				})
 			},
+			
+			// 商汤
+			go_shangtang(){
+				uni.navigateTo({
+					url:"../../production/shangtang/shangtang"
+				})
+			}
 		}
 	}
 </script>

+ 36 - 0
components/t-p-qingshuiying/t-p-qingshuiying.vue

@@ -27,6 +27,36 @@
 				<view class="tip">工业视频</view>
 			</view>
 		</view>
+		<view class="item_box" style="background-color: #2873FF;"
+			@click="go_zdhxt('psxt')">
+			<view class="img">
+				<image src="../t-p-icon/icon_9.png" mode=""></image>
+			</view>
+			<view class="text">
+				<view class="name">排水系统</view>
+				<view class="tip"></view>
+			</view>
+		</view>
+		<view class="item_box" style="background-color: #9CE2A6;"
+			@click="go_zdhxt('tfgl')">
+			<view class="img">
+				<image src="../t-p-icon/icon_5.png" mode=""></image>
+			</view>
+			<view class="text">
+				<view class="name">通风管理</view>
+				<view class="tip"></view>
+			</view>
+		</view>
+		<!-- <view class="item_box" style="background-color: #2C3E50;"
+			@click="go_zdhxt('zys')">
+			<view class="img">
+				<image src="../t-p-icon/icon_8.png" mode=""></image>
+			</view>
+			<view class="text">
+				<view class="name">主运输系统</view>
+				<view class="tip"></view>
+			</view>
+		</view> -->
 	</view>
 </template>
 
@@ -51,6 +81,12 @@
 
 		},
 		methods: {
+			// 自动化统计列表
+			go_zdhxt(zdhxt) {
+				uni.navigateTo({
+					url:"../../production/qingshuiying/zidonghua_list/zidonghua_list?zdhxt=" + zdhxt
+				})
+			},
 			// 安全监测
 			go_safety_monitoring() {
 				uni.navigateTo({

+ 14 - 5
components/t-p-yangchangwan/t-p-yangchangwan.vue

@@ -1,12 +1,21 @@
 <template>
 	<view class="content">
-		<view class="item_box" style="background-color: #FBB47B;" @click="go_video_monitor()">
+		<view class="item_box" style="background-color: #FBB47B;" @click="go_video_monitor('yangchangwanmeikuang')">
 			<view class="img">
 				<image src="../t-p-icon/icon_6.png" mode=""></image>
 			</view>
 			<view class="text">
 				<view class="name">视频监控</view>
-				<view class="tip">工业视频</view>
+				<view class="tip">一分区</view>
+			</view>
+		</view>
+		<view class="item_box" style="background-color: #D4B5B3;" @click="go_video_monitor('yangchangwanmeikuangerfenqu')">
+			<view class="img">
+				<image src="../t-p-icon/icon_6.png" mode=""></image>
+			</view>
+			<view class="text">
+				<view class="name">视频监控</view>
+				<view class="tip">二分区</view>
 			</view>
 		</view>
 		<view class="item_box" style="background-color: #638BD5;" @click="go_production_report('640181B0011010030750','1003-1')">
@@ -74,7 +83,7 @@
 		name: "t-p-yangchangwanyifenqu",
 		data() {
 			return {
-				mine_code:"yangchangwan",
+				
 				
 			};
 		},
@@ -98,9 +107,9 @@
 				})
 			},
 			// 视频监控
-			go_video_monitor(){
+			go_video_monitor(mine_code){
 				uni.navigateTo({
-					url:"../../production/video_monitor/video_monitor?mine_code=" + this.mine_code
+					url:"../../production/video_monitor/video_monitor?mine_code=" + mine_code
 				})
 			},
 		}

+ 1 - 1
components/t-p-yangchangwanyifenqu/t-p-yangchangwanyifenqu.vue

@@ -46,7 +46,7 @@
 			return {
 				mine:"640181B0011010030750",
 				org_num:"1003-1",
-				mine_code:"yangchangwan",
+				mine_code:"yangchangwanmeikuang",
 				
 				mineall_people: "",
 				days_output: ""

+ 1 - 1
components/t-p-yangchanwanerfenqu/t-p-yangchanwanerfenqu.vue

@@ -46,7 +46,7 @@
 			return {
 				mine:"640181B0011010032422",
 				org_num:"1003-2",
-				mine_code:"yangchangwan",
+				mine_code:"yangchangwanmeikuangerfenqu",
 				
 				mineall_people: "",
 				days_output: ""

+ 3 - 3
manifest.json

@@ -1,8 +1,8 @@
 {
-    "name" : "智慧枣泉",
-    "appid" : "__UNI__4B520D3",
+    "name" : "智慧清水营",
+    "appid" : "__UNI__91286B5",
     "description" : "",
-    "versionName" : "1.0.7",
+    "versionName" : "1.0.2",
     "versionCode" : "100",
     "transformPx" : false,
     /* 5+App特有相关 */

+ 148 - 1
pages.json

@@ -322,7 +322,7 @@
 		}, {
 			"path": "pages/workbench/gridding/gridding",
 			"style": {
-				"navigationBarTitleText": " "
+				"navigationBarTitleText": "网格化管理"
 			}
 
 		}
@@ -528,6 +528,153 @@
             }
             
         }
+        ,{
+            "path" : "pages/origanization/OA/approval_list/approval_list",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "流程待办"
+            }
+            
+        }
+        ,{
+            "path" : "pages/origanization/OA/approval_list/detail/detail",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": ""
+            }
+            
+        }
+        ,{
+            "path" : "pages/origanization/OA/approval_list/approval/approval",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": ""
+            }
+            
+        }
+        ,{
+            "path" : "pages/origanization/OA/application_list/application_list",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "OA审批"
+            }
+            
+        }
+        ,{
+            "path" : "pages/origanization/OA/application_list/search/search",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "OA审批"
+            }
+            
+        }
+        ,{
+            "path" : "pages/origanization/OA/application_list/detail_apply/detail_apply",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": ""
+            }
+            
+        }
+        ,{
+            "path" : "pages/my/personal_information/job_record/job_record",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "工作经历"
+            }
+            
+        }
+        ,{
+            "path" : "pages/my/personal_information/honor/honor",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "荣誉及证书"
+            }
+            
+        }
+        ,{
+            "path" : "pages/workbench/gridding/timeline_details/timeline_details",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "网格化时间线"
+            }
+            
+        }
+        ,{
+            "path" : "pages/workbench/gridding/timeline_details/detail/detail",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "记录详情"
+            }
+            
+        }
+        ,{
+            "path" : "pages/workbench/gridding/chart_statistics/chart_statistics",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "网格化图表统计"
+            }
+            
+        }
+        ,{
+            "path" : "pages/workbench/gridding/grid_query/grid_query",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "网格化巡查记录"
+            }
+            
+        }
+        ,{
+            "path" : "pages/workbench/gridding/grid_query/detail/detail",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "巡检详情"
+            }
+            
+        }
+        ,{
+            "path" : "pages/production/qingshuiying/zidonghua_list/zidonghua_list",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": ""
+            }
+            
+        }
+        ,{
+            "path" : "pages/production/qingshuiying/zidonghua_list/detail/detail",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "",
+				"navigationBarBackgroundColor":"#397CCA"
+            }
+            
+        }
+        ,{
+            "path" : "pages/origanization/OA/apply_list/apply_list",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "流程申请"
+            }
+            
+        }
+        ,{
+            "path" : "pages/origanization/OA/h5/h5",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+        ,{
+            "path" : "pages/production/shangtang/shangtang",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "",
+                "enablePullDownRefresh": false
+            }
+            
+        }
     ],
 	"globalStyle": {
 		"navigationBarTextStyle": "white",

+ 5 - 0
pages/index/h5/h5.vue

@@ -14,7 +14,12 @@
 		onLoad(option) {
 			if (option.url == 'jinjiaqu_pingce') {
 				this.href = 'http://webdevelop.nxjiewei.com/assets/html/pingce/?mine_code=jinjiaqu&token=' + uni.getStorageSync('Authorization') + '#/'
+			}else{
+				this.href = option.url + "?token="+uni.getStorageSync('Authorization')
+				console.log(this.href)
 			}
+			
+			
 		}
 	}
 </script>

+ 1 - 1
pages/index/record/h5/h5.vue

@@ -12,7 +12,7 @@
 			};
 		},
 		onLoad(option) {
-			this.href = option.url
+			this.href = option.url + "?token="+uni.getStorageSync('Authorization')
 		}
 	}
 </script>

+ 3 - 3
pages/index/record/record-browse/record-browse.vue

@@ -56,7 +56,7 @@
 			};
 		},
 		onLoad(option) {
-			console.log(option)
+			// console.log(option)
 			this.mine_code = option.mine_code
 			// 根据矿编码切换首页接口不同的请求基础路径
 			this.base_url = set_base_url(this.mine_code)
@@ -73,7 +73,7 @@
 				uni.request({
 					url: this.base_url + "/swagger/api/pageuser/v1/getPageUserByPageId/" + this.pageId,
 					success: (res) => {
-						console.log(res.data.data)
+						// console.log(res.data.data)
 						this.browse = res.data.data
 
 						for (let i = 0; i < this.browse.length; i++) {
@@ -96,7 +96,7 @@
 			},
 
 			click(item) {
-				console.log(item)
+				// console.log(item)
 				
 				this.user = item
 				this.$refs.popup.open()

+ 23 - 5
pages/index/record/record.vue

@@ -189,7 +189,7 @@
 				uni.showActionSheet({
 					itemList: ['添加到常用'],
 					success: (res) => {
-						console.log('选中了第' + (res.tapIndex + 1) + '个按钮');
+						// console.log('选中了第' + (res.tapIndex + 1) + '个按钮');
 
 						if (res.tapIndex == 0) {
 							console.log(this.pageId)
@@ -205,7 +205,7 @@
 									icon: "none",
 									title: "添加成功"
 								})
-								console.log(res)
+								// console.log(res)
 							})
 						}
 					},
@@ -221,7 +221,7 @@
 					url: this.base_url + "/swagger/api/page/v1/detailPage?pageId=" + this.pageId +
 						"&sourceType=&organizationIds=&userId=&userName=",
 					success: (res) => {
-						console.log(res.data.data)
+						// console.log(res.data.data)
 						const data = res.data.data
 
 						// 设置页面标题
@@ -298,13 +298,31 @@
 
 			// 获取浏览记录
 			get_browse() {
+				
+				// 添加浏览记录
+				uni.request({
+					method:"POST",
+					url: this.base_url + "/swagger/api/pageuser/v1/addPageUser/",
+					data:{
+						createBy:"",
+						createDate:"",
+						id:"",
+						userId: uni.getStorageSync('user').staff_num,
+						pageId:this.pageId,
+						status:"CREATE"
+					},
+					success: (res) => {
+						// console.log(res)
+					}
+				})
+				
 				uni.request({
 					url: this.base_url + "/swagger/api/pageuser/v1/getPageUserByPageId/" + this.pageId,
 					success: (res) => {
-						console.log(res.data.data)
+						// console.log(res.data.data)
 						this.browse = res.data.data
 						this.browse.length = 3
-						console.log(this.browse)
+						// console.log(this.browse)
 
 						for (let i = 0; i < 3; i++) {
 							// 获取随机色

+ 248 - 0
pages/my/personal_information/honor/honor.vue

@@ -0,0 +1,248 @@
+<template>
+	<view>
+		<view class="content">
+			<view class="input_box">
+				<view class="label"><text> * </text>荣誉名称:</view>
+				<view class="box">
+					<input type="text" value="" placeholder="请输入荣誉名称" v-model="imageName" />
+				</view>
+			</view>
+			<view class="input_box">
+				<view class="label"><text> * </text>上传图片:</view>
+				<view class="img_box">
+					<view class="item" v-if="data.path">
+						<view class="img">
+							<image :src="data.path" mode=""></image>
+						</view>
+						<view class="text">data.imageName</view>
+					</view>
+					<view class="item" v-if="!data.path">
+						<view class="img">
+							<view class="add" @click="up_image()">+</view>
+						</view>
+						<view class="text" style="color: #FFFFFF;">xxx</view>
+					</view>
+				</view>
+			</view>
+
+			<view class="btn" @click="add()">提交</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				base_url: "",
+				
+				honor_list: [],
+
+				imageName: "",
+				data: {}
+			};
+		},
+		onLoad() {
+			const eventChannel = this.getOpenerEventChannel();
+			// 监听acceptDataFromOpenerPage事件,获取上一页面通过eventChannel传送到当前页面的数据
+			eventChannel.on('acceptDataFromOpenerPage', (data) => {
+				console.log(data.data)
+
+				this.base_url = data.data.base_url
+
+				this.honor_list = data.data.honor_list
+			})
+		},
+
+		methods: {
+			up_image() {
+				uni.chooseImage({
+					count: 1,
+					success: (chooseImageRes) => {
+						const tempFilePaths = chooseImageRes.tempFilePaths;
+						console.log(chooseImageRes.tempFiles[0]);
+
+						uni.showLoading({
+							mask: true,
+							title: "上传中..."
+						})
+
+						uni.uploadFile({
+							url: this.base_url + "/worksheet/design/up_images",
+							header: {
+								'Authorization': uni.getStorageSync('token_type') +' '+uni.getStorageSync('Authorization')
+							},
+							filePath: tempFilePaths[0],
+							name: 'file',
+							// formData只有H5存在
+							formData: {
+								image: chooseImageRes.tempFiles[0]
+							},
+							success: (uploadFileRes) => {
+								// console.log(uploadFileRes.data);
+								console.log(JSON.parse(uploadFileRes.data));
+
+								this.data = JSON.parse(uploadFileRes.data).data
+
+								uni.hideLoading()
+
+								uni.showToast({
+									icon: "none",
+									title: "上传成功"
+								})
+							}
+						})
+					}
+				})
+			},
+			add() {
+				if (this.imageName != '' && this.data.path) {
+					console.log(this.imageName, this.data.path)
+
+					this.data.imageName = this.imageName
+
+					if (!this.honor_list) {
+						this.honor_list = []
+						this.honor_list.push(this.data)
+					} else {
+						this.honor_list.push(this.data)
+					}
+
+					console.log(this.honor_list)
+					
+					this.$api.user_updateUserMessage({
+						honor: JSON.stringify(this.honor_list)
+					}).then((res) => {
+						console.log(res)
+						
+						uni.showToast({
+							icon: "none",
+							title: "提交成功"
+						})
+						
+						setTimeout(() => {
+							uni.navigateBack()
+						}, 1500)
+					})
+				} else {
+					uni.showToast({
+						icon: "none",
+						title: "请填写荣誉名称或上传图片"
+					})
+				}
+
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.content {
+		margin-bottom: 50rpx;
+		box-sizing: border-box;
+		padding: 25rpx;
+
+		.input_box {
+			margin-bottom: 20rpx;
+			font-size: 32rpx;
+
+			.label {
+				min-height: 80rpx;
+				line-height: 80rpx;
+				color: #6C6F74;
+
+				text {
+					color: red;
+				}
+			}
+
+			.box {
+				width: 700rpx;
+				background: #FFFFFF;
+				border-radius: 8rpx;
+				border: 2rpx solid #E9EBF2;
+
+				box-sizing: border-box;
+				padding: 0 25rpx;
+
+				.uni-input {
+					font-size: 30rpx;
+					height: 90rpx;
+					line-height: 90rpx;
+					color: #666;
+				}
+
+				input {
+					font-size: 30rpx;
+					height: 90rpx;
+					line-height: 90rpx;
+				}
+
+				/deep/.uni-date-editor--x {
+					.uniui-clear {
+						display: none;
+					}
+				}
+
+				/deep/.uni-date-x--border {
+					box-sizing: border-box;
+					border-radius: 4px;
+					border: none;
+				}
+
+				/deep/.uni-date-x {
+					padding: 0;
+				}
+			}
+
+			.img_box {
+				margin-top: 20rpx;
+				overflow: hidden;
+
+				.item {
+					float: left;
+					margin-right: 50rpx;
+
+					width: 300rpx;
+					text-align: center;
+
+					.img {
+						margin-bottom: 10rpx;
+
+						image {
+							width: 300rpx;
+							height: 180rpx;
+						}
+
+						.add {
+							font-size: 140rpx;
+							color: #DCDCDC;
+							text-align: center;
+							height: 180rpx;
+							line-height: 160rpx;
+							background-color: #EEEEEE;
+						}
+					}
+
+					.text {
+						width: 260rpx;
+						font-size: 30rpx;
+						color: #8e8e8e;
+
+						overflow: hidden;
+						white-space: nowrap;
+						text-overflow: ellipsis;
+					}
+				}
+			}
+		}
+
+		.btn {
+			margin-top: 40rpx;
+			background-color: #009FE8;
+			padding: 25rpx 50rpx;
+			color: #FFFFFF;
+			text-align: center;
+		}
+	}
+</style>

+ 162 - 0
pages/my/personal_information/job_record/job_record.vue

@@ -0,0 +1,162 @@
+<template>
+	<view>
+		<view class="content">
+			<view class="input_box">
+				<view class="label"><text> * </text>起止时间(XX年X月-XX年X月):</view>
+				<view class="box">
+					<input type="text" value="" placeholder="请输入起止时间" v-model="range_text" />
+				</view>
+			</view>
+			<view class="input_box">
+				<view class="label"><text> * </text>工作单位:</view>
+				<view class="box">
+					<input type="text" value="" placeholder="请输入工作单位" v-model="job_unit" />
+				</view>
+			</view>
+			<view class="input_box">
+				<view class="label"><text> * </text>职务:</view>
+				<view class="box">
+					<input type="text" value="" placeholder="请输入职务" v-model="job_post" />
+				</view>
+			</view>
+			<view class="btn" @click="add()">提交</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				range_text: "",
+				// 工作单位
+				job_unit: "",
+				job_post: "",
+
+				work_experience: [],
+			};
+		},
+		onLoad() {
+			const eventChannel = this.getOpenerEventChannel();
+			// 监听acceptDataFromOpenerPage事件,获取上一页面通过eventChannel传送到当前页面的数据
+			eventChannel.on('acceptDataFromOpenerPage', (data) => {
+				console.log(data.data)
+				
+				this.work_experience = data.data.work_experience
+			})
+		},
+
+		methods: {
+
+			add() {
+
+				if (this.job_post != "" && this.job_unit != "" && this.range_text != "") {
+					const data = {
+						range_text: this.range_text,
+						job_unit: this.job_unit,
+						job_post: this.job_post
+					}
+
+					if (!this.work_experience) {
+						this.work_experience = []
+						this.work_experience.push(data)
+					} else {
+						this.work_experience.push(data)
+					}
+
+					console.log(this.work_experience)
+
+					this.$api.user_updateUserMessage({
+						work_experience: JSON.stringify(this.work_experience)
+					}).then((res) => {
+						console.log(res)
+						
+						uni.showToast({
+							icon: "none",
+							title: "提交成功"
+						})
+						
+						setTimeout(() => {
+							uni.navigateBack()
+						}, 1500)
+					})
+				} else {
+					uni.showToast({
+						icon: "none",
+						title: "请填写完整再提交"
+					})
+				}
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.content {
+		margin-bottom: 50rpx;
+		box-sizing: border-box;
+		padding: 25rpx;
+
+		.input_box {
+			margin-bottom: 20rpx;
+			font-size: 32rpx;
+
+			.label {
+				min-height: 80rpx;
+				line-height: 80rpx;
+				color: #6C6F74;
+
+				text {
+					color: red;
+				}
+			}
+
+			.box {
+				width: 700rpx;
+				background: #FFFFFF;
+				border-radius: 8rpx;
+				border: 2rpx solid #E9EBF2;
+
+				box-sizing: border-box;
+				padding: 0 25rpx;
+
+				.uni-input {
+					font-size: 30rpx;
+					height: 90rpx;
+					line-height: 90rpx;
+					color: #666;
+				}
+
+				input {
+					font-size: 30rpx;
+					height: 90rpx;
+					line-height: 90rpx;
+				}
+
+				/deep/.uni-date-editor--x {
+					.uniui-clear {
+						display: none;
+					}
+				}
+
+				/deep/.uni-date-x--border {
+					box-sizing: border-box;
+					border-radius: 4px;
+					border: none;
+				}
+
+				/deep/.uni-date-x {
+					padding: 0;
+				}
+			}
+		}
+
+		.btn {
+			margin-top: 40rpx;
+			background-color: #009FE8;
+			padding: 25rpx 50rpx;
+			color: #FFFFFF;
+			text-align: center;
+		}
+	}
+</style>

+ 5 - 410
pages/my/personal_information/personal_information - 副本.vue

@@ -1,119 +1,6 @@
 <template>
 	<view>
-		<view class="top">
-			<view class="avatar">
-				<image v-if="info.avatar" :src="info.avatar" mode="aspectFill"></image>
-				<view class="avatar" v-if="!info.avatar && !info" :style="{backgroundColor:bgColor[1]}">
-					{{info.name.split('').pop()}}
-				</view>
-			</view>
-			<view class="info">
-				<view class="name">{{info.name}}</view>
-				<view class="box">
-					<view class="item">
-						<view class="label">部门</view>
-						<view class="text">{{info.section_fullname}}</view>
-					</view>
-					<view class="item">
-						<view class="label">职务</view>
-						<view class="text">{{info.duty_num}}</view>
-					</view>
-					<view class="item">
-						<view class="label">员工编号</view>
-						<view class="text">{{info.staff_num}}</view>
-					</view>
-				</view>
-			</view>
-		</view>
-
-		<view class="content">
-			<view class="box">
-				<view class="item" @click="change_active(1)">
-					<view class="text" :style="{color:active == 1?'#333':'#8e8e8e'}">个人信息</view>
-					<view class="line" v-if="active == 1"></view>
-				</view>
-				<view class="item" @click="change_active(2)">
-					<view class="text" :style="{color:active == 2?'#333':'#8e8e8e'}">工作经历</view>
-					<view class="line" v-if="active == 2"></view>
-				</view>
-				<view class="item" @click="change_active(3)">
-					<view class="text" :style="{color:active == 3?'#333':'#8e8e8e'}">荣誉及证书</view>
-					<view class="line" v-if="active == 3"></view>
-				</view>
-			</view>
-
-
-			<!-- 个人信息 -->
-			<view class="list_1" v-if="active == 1">
-				<view class="item" @click="binding_phone()">
-					<view class="label">手机号</view>
-					<view class="text">12345678</view>
-					<view class="right">
-						<uni-icons type="arrowright" size="20" color="#999"></uni-icons>
-					</view>
-				</view>
-				<view class="item" @click="go_signature()">
-					<view class="label">手写签名</view>
-					<view class="text"> </view>
-					<view class="right">
-						<uni-icons type="arrowright" size="20" color="#999"></uni-icons>
-					</view>
-				</view>
-				<view class="item">
-					<view class="label">岗位分类</view>
-					<view class="text">{{info.job_classify}}</view>
-					<view class="right"></view>
-				</view>
-				<!-- <view class="item">
-					<view class="label">岗位</view>
-					<view class="text">{{info.position.title}}</view>
-					<view class="right"></view>
-				</view> -->
-				<view class="item">
-					<view class="label">民族</view>
-					<view class="text">{{info.nation}}</view>
-					<view class="right"></view>
-				</view>
-				<view class="item">
-					<view class="label">出生日期</view>
-					<view class="text">{{info.birthday}}</view>
-					<view class="right"></view>
-				</view>
-			</view>
-
-			<!-- 工作经历 -->
-			<view class="list_2" v-if="active == 2">
-				<view class="item">
-					<view class="text_1">任职时间</view>
-					<view class="text_2">工作单位</view>
-					<view class="text_3">职务</view>
-				</view>
-				<view class="item" v-for="item in 3" :key="item">
-					<view class="text_1">2008-06-23至1010-05-14</view>
-					<view class="text_2">公司名称公司名称公司名称</view>
-					<view class="text_3">工程师</view>
-				</view>
-			</view>
-			<!-- 荣誉及证书 -->
-			<view class="list_3" v-if="active == 3">
-				<view class="item" v-for="item in 4" :key="item">
-					<view class="img">
-						<image
-							src="https://cdn.colorhub.me/7X-46x4lrKMmT8Tyo5qNMRFN0p1R-nMEzlYx-XvdZiw/rs:auto:280:0:0/g:ce/bG9jYWw6Ly8vMTgv/NzUvOGFkNWU4NmZj/Mzc2NWJjYTBiYzAw/YTY1N2JiNWE5ZmMz/MjAyMTg3NS5qcGc.jpg"
-							mode="aspectFill"></image>
-					</view>
-					<view class="text">奖项名称奖项名称奖项名称</view>
-				</view>
-				<view class="item">
-					<view class="img">
-						<view class="add" @click="add()">+</view>
-					</view>
-					<view class="text"></view>
-				</view>
-			</view>
-		</view>
-
-
+		<web-view :src="href"></web-view>
 	</view>
 </template>
 
@@ -121,308 +8,16 @@
 	export default {
 		data() {
 			return {
-				// 当前煤矿编码
-				mine_code: "",
-				// 基础请求路径
-				base_url: " ",
-				token:"",
-				
-				active: 1,
-				info: {},
-				// 头像随机色
-				bgColor: [],
-			};
-		},
-		onLoad() {
-			// 设置头像
-			for (let i = 0; i < 2; i++) {
-				// 获取随机色
-				let r = parseInt(Math.random() * 256)
-				let g = parseInt(Math.random() * 256)
-				let b = parseInt(Math.random() * 256)
+				href: ""
 
-				// ES6 字符串拼接
-				// this.bgColor = `rgba(${r},${g},${b},0.3)`
-				let color = "rgba(" + r + "," + g + "," + b + "," + 0.3 + ")"
-				// console.log(color)
-				this.bgColor.push(color)
-			}
-			
-			// 初始化当前煤矿编码
-			this.mine_code = uni.getStorageSync('mine_code')
-			
-			// 根据矿编码切换首页接口不同的请求基础路径
-			switch (this.mine_code) {
-				case 'ningdongyunying':
-					this.base_url = "http://ningdongyunying.nxjiewei.com:8011/api"
-					break;
-				case 'meihuajing':
-					this.base_url = "http://meihuajing.nxjiewei.com:8011/api"
-					break;
-				case 'zaoquan':
-					this.base_url = "http://zaoquan.nxjiewei.com:8011/api"
-					break;
-				default:
-					this.base_url = ""
-			}
-			
-			this.token = "Bearer " +  uni.getStorageSync('Authorization')
-			this.get_info()
+			};
 		},
-		methods: {
-			change_active(index) {
-				this.active = index
-			},
-			// 绑定手机
-			binding_phone() {
-				uni.navigateTo({
-					url: "../../my/setPhone/setPhone"
-				})
-			},
-			// 手写签名
-			go_signature() {
-				uni.navigateTo({
-					url: "../../my/signature/signature"
-				})
-			},
-			get_info() {
-				this.$api.user_getUinfo({
-					staff_num: uni.getStorageSync('user').staff_num
-				}).then((res) => {
-					console.log(res.data.data)
-					this.info = res.data.data
-				})
-			},
-			
-			add(){
-				uni.chooseImage({
-					count: 1,
-					success: (chooseImageRes) => {
-						const tempFilePaths = chooseImageRes.tempFilePaths;
-						console.log(chooseImageRes.tempFiles[0]);
-						console.log(tempFilePaths)
-						
-						
-						// uni.uploadFile({
-						// 	url: this.base_url + "/worksheet/design/up_images",
-						// 	header: {
-						// 		'Authorization': this.token
-						// 	},
-						// 	filePath: tempFilePaths[0],
-						// 	formData: {
-						// 		image: chooseImageRes.tempFiles[0]
-						// 	},
-						// 	success: (uploadFileRes) => {
-						// 		console.log(uploadFileRes);
-						// 		console.log(uploadFileRes.data);
-						// 		// console.log(JSON.parse(uploadFileRes.data));
-								
-								
-						// 	}
-						// })
-					}
-				})
-			}
+		onLoad(option) {
+			this.href = "http://webdevelop.nxjiewei.com/assets/html/zhks-quankuang/user_info?token=" + uni.getStorageSync('Authorization') + "&mine_code=" + uni.getStorageSync('mine_code') + "&staff_num=" + uni.getStorageSync('user').staff_num
 		}
 	}
 </script>
 
 <style lang="scss">
-	page {
-		background-color: #F5F8F8;
-	}
-
-	.top {
-		background-color: #FFFFFF;
-		width: 750rpx;
-		height: 440rpx;
-
-		background-image: url(./icon/top.png);
-		background-size: 100% 100%;
-		background-position: 0 -110rpx;
-		background-repeat: no-repeat;
-
-		.avatar {
-			padding-top: 34rpx;
-			text-align: center;
-
-			image {
-				width: 200rpx;
-				height: 200rpx;
-
-				border-radius: 50%;
-			}
-		}
-
-		.info {
-			margin-top: 20rpx;
-
-			.name {
-				text-align: center;
-				font-size: 40rpx;
-				font-weight: 700;
-			}
-
-			.box {
-				margin-top: 30rpx;
-				display: flex;
-				justify-content: space-around;
-
-				.item {
-					width: 250rpx;
-					text-align: center;
-
-					.label {
-						font-size: 30rpx;
-						color: #009FE8;
-						margin-bottom: 10rpx;
-					}
-
-					.text {
-						font-size: 32rpx;
-					}
-				}
-			}
-		}
-
-		margin-bottom: 20rpx;
-	}
-
-	.content {
-		background-color: #FFFFFF;
 
-		.box {
-			display: flex;
-			justify-content: space-around;
-			align-items: center;
-
-			border-bottom: 2rpx solid #F5F8F8;
-
-			.item {
-				height: 95rpx;
-				width: 230rpx;
-				text-align: center;
-
-				position: relative;
-
-				.text {
-					font-size: 34rpx;
-					line-height: 95rpx;
-				}
-
-				.line {
-					margin: -6rpx auto 0;
-					width: 80rpx;
-					height: 6rpx;
-					background-color: #009FE8;
-				}
-			}
-		}
-
-		.list_1 {
-			box-sizing: border-box;
-			padding: 0 50rpx;
-
-			.item {
-				border-bottom: 2rpx solid #F5F8F8;
-				height: 95rpx;
-				display: flex;
-				justify-content: space-between;
-				align-items: center;
-				font-size: 32rpx;
-
-				.label {
-					width: 200rpx;
-					text-align: left;
-				}
-
-				.text {
-					width: 350rpx;
-					text-align: left;
-					color: #8e8e8e;
-
-				}
-
-				.right {
-					width: 100rpx;
-					text-align: right;
-				}
-			}
-
-		}
-
-		.list_2 {
-			box-sizing: border-box;
-			padding: 0 50rpx;
-
-			.item {
-				border-bottom: 2rpx solid #F5F8F8;
-				height: 95rpx;
-				display: flex;
-				justify-content: space-between;
-				align-items: center;
-				font-size: 30rpx;
-				text-align: center;
-				color: #8e8e8e;
-
-				.text_1 {
-					width: 190rpx;
-				}
-
-				.text_2 {
-					width: 240rpx;
-
-				}
-
-				.text_3 {
-					width: 160rpx;
-				}
-			}
-
-			.item:first-child {
-				font-size: 32rpx;
-				color: #333;
-			}
-
-		}
-
-		.list_3 {
-			box-sizing: border-box;
-			padding: 50rpx;
-			
-			overflow: hidden;
-			
-			.item {
-				float: left;
-				margin-right: 25rpx;
-				margin-bottom: 30rpx;
-				
-				width: 200rpx;
-				text-align: center;
-				.img{
-					image{
-						width: 200rpx;
-						height: 140rpx;
-					}
-					
-					.add{
-						font-size: 110rpx;
-						color: #DCDCDC;
-						text-align: center;
-						height: 140rpx;
-						line-height: 140rpx;
-						background-color: #EEEEEE;
-					}
-				}
-				.text{
-					width: 180rpx;
-					font-size: 24rpx;
-					color: #8e8e8e;
-				}
-			}
-			.item:nth-child(3n){
-				margin-right: 0;
-			}
-		}
-	}
 </style>

+ 652 - 5
pages/my/personal_information/personal_information.vue

@@ -1,23 +1,670 @@
 <template>
 	<view>
-		<web-view :src="href"></web-view>
+		<view class="top">
+			<view class="avatar" @click="change_avatar(info.avatar)">
+				<image v-if="info.avatar" :src="info.avatar" mode="aspectFill"></image>
+				<view class="avatar" v-if="!info.avatar && !info" :style="{backgroundColor:bgColor[1]}">
+					{{info.name.split('').pop()}}
+				</view>
+			</view>
+			<view class="info">
+				<view class="name">{{info.name}}</view>
+				<view class="box">
+					<view class="item">
+						<view class="label">部门</view>
+						<view class="text">{{info.section_fullname}}</view>
+					</view>
+					<view class="item">
+						<view class="label">职务</view>
+						<view class="text">{{info.duty_num}}</view>
+					</view>
+					<view class="item">
+						<view class="label">员工编号</view>
+						<view class="text">{{info.staff_num}}</view>
+					</view>
+				</view>
+			</view>
+		</view>
+
+		<view class="content">
+			<view class="box">
+				<view class="item" @click="change_active(1)">
+					<view class="text" :style="{color:active == 1?'#333':'#8e8e8e'}">个人信息</view>
+					<view class="line" v-if="active == 1"></view>
+				</view>
+				<view class="item" @click="change_active(2)">
+					<view class="text" :style="{color:active == 2?'#333':'#8e8e8e'}">工作经历</view>
+					<view class="line" v-if="active == 2"></view>
+				</view>
+				<view class="item" @click="change_active(3)">
+					<view class="text" :style="{color:active == 3?'#333':'#8e8e8e'}">荣誉及证书</view>
+					<view class="line" v-if="active == 3"></view>
+				</view>
+			</view>
+
+
+			<!-- 个人信息 -->
+			<view class="list_1" v-if="active == 1">
+				<view class="item" @click="binding_phone()">
+					<view class="label">手机号</view>
+					<view class="text">{{info.mobile}}</view>
+					<view class="right">
+						<uni-icons type="arrowright"></uni-icons>
+					</view>
+				</view>
+				<view class="item" @click="go_qianming()">
+					<view class="label">手写签名</view>
+					<view class="text">
+						<image :src="info.base_img" style="width: 300rpx;height: 120rpx;" mode="aspectFill"></image>
+					</view>
+					<view class="right">
+						<uni-icons type="arrowright"></uni-icons>
+					</view>
+				</view>
+				<view class="item">
+					<view class="label">岗位分类</view>
+					<view class="text">{{info.job_classify}}</view>
+					<view class="right"></view>
+				</view>
+				<view class="item">
+					<view class="label">岗位</view>
+					<view class="text">{{info.job}}</view>
+					<view class="right"></view>
+				</view>
+				<view class="item">
+					<view class="label">职级(职务码)</view>
+					<view class="text">{{info.duty_num}}</view>
+					<view class="right"></view>
+				</view>
+				<view class="item">
+					<view class="label">性别</view>
+					<view class="text" v-if="info.sex == 1">男</view>
+					<view class="text" v-if="info.sex == 0">女</view>
+					<view class="right"></view>
+				</view>
+				<view class="item">
+					<view class="label">初始学历</view>
+					<view class="text">{{info.start_education}}</view>
+					<view class="right"></view>
+				</view>
+				<view class="item">
+					<view class="label">最高学历</view>
+					<view class="text">{{info.best_education}}</view>
+					<view class="right"></view>
+				</view>
+				<view class="item">
+					<view class="label">员工组</view>
+					<view class="text">{{info.group}}</view>
+					<view class="right"></view>
+				</view>
+				<view class="item">
+					<view class="label">员工子组</view>
+					<view class="text">{{info.group_sub}}</view>
+					<view class="right"></view>
+				</view>
+				<view class="item">
+					<view class="label">籍贯</view>
+					<view class="text">{{info.native}}</view>
+					<view class="right"></view>
+				</view>
+				<view class="item">
+					<view class="label">宗教信仰</view>
+					<view class="text">{{info.faith}}</view>
+					<view class="right"></view>
+				</view>
+				<view class="item">
+					<view class="label">户口性质</view>
+					<view class="text">{{info.registered}}</view>
+					<view class="right"></view>
+				</view>
+				<view class="item">
+					<view class="label">民族</view>
+					<view class="text">{{info.nation}}</view>
+					<view class="right"></view>
+				</view>
+				<view class="item">
+					<view class="label">出生日期</view>
+					<view class="text">{{info.birthday}}</view>
+					<view class="right"></view>
+				</view>
+				<view class="item">
+					<view class="label">身份证号</view>
+					<view class="text">{{info.identity_card}}</view>
+					<view class="right"></view>
+				</view>
+
+				<view class="item">
+					<view class="label">参加工作时间</view>
+					<view class="text">{{info.working_date}}</view>
+					<view class="right"></view>
+				</view>
+				<view class="item">
+					<view class="label">进入神华系统时间</view>
+					<view class="text">{{info.system_date}}</view>
+					<view class="right"></view>
+				</view>
+				<view class="item">
+					<view class="label">进入子分公司时间</view>
+					<view class="text">{{info.system_sub_date}}</view>
+					<view class="right"></view>
+				</view>
+				<view class="item">
+					<view class="label">进入本单位时间</view>
+					<view class="text">{{info.section_date}}</view>
+					<view class="right"></view>
+				</view>
+				<view class="item">
+					<view class="label">政治面貌</view>
+					<view class="text">{{info.politics}}</view>
+					<view class="right"></view>
+				</view>
+				<view class="item">
+					<view class="label">参加党派时间</view>
+					<view class="text">{{info.politics_date}}</view>
+					<view class="right"></view>
+				</view>
+			</view>
+
+			<!-- 工作经历 -->
+			<view class="list_2" v-if="active == 2">
+				<view class="item">
+					<view class="text_1">任职时间</view>
+					<view class="text_2">工作单位</view>
+					<view class="text_3">职务</view>
+				</view>
+				<view class="item" v-for="(item,index) in info.work_experience" :key="index" @click="del_job(index)">
+					<view class="text_1">{{item.range_text}}</view>
+					<view class="text_2">{{item.job_unit}}</view>
+					<view class="text_3">{{item.job_post}}</view>
+				</view>
+				<view class="item" @click="add_text()">
+					<view style="margin: 0 auto;">
+						<uni-icons type="compose" size="24"></uni-icons>
+					</view>
+				</view>
+			</view>
+			<!-- 荣誉及证书 -->
+			<view class="list_3" v-if="active == 3">
+				<view class="item" v-for="(item,index) in info.honor" :key="index"
+					@click="click_image(index,item.path)">
+					<view class="img">
+						<image :src="item.path" mode="aspectFill"></image>
+					</view>
+					<view class="text">{{item.imageName}}</view>
+				</view>
+				<view class="item">
+					<view class="img">
+						<view class="add" @click="add_image()">+</view>
+					</view>
+					<view class="text"></view>
+				</view>
+			</view>
+		</view>
+
+
 	</view>
 </template>
 
 <script>
+	import {set_base_url} from '@/common/set_base_url.js'
+	
 	export default {
 		data() {
 			return {
-				href: ""
-
+				mine_code:"",
+				base_url: "",
+				active: 1,
+				info: {},
+				// 头像随机色
+				bgColor: [],
 			};
 		},
-		onLoad(option) {
-			this.href = "http://webdevelop.nxjiewei.com/assets/html/zhks-quankuang/user_info?token=" + uni.getStorageSync('Authorization') + "&mine_code=" + uni.getStorageSync('mine_code') + "&staff_num=" + uni.getStorageSync('user').staff_num
+		onLoad() {
+			// 初始化当前煤矿编码
+			this.mine_code = uni.getStorageSync('mine_code')
+			// 根据矿编码切换首页接口不同的请求基础路径
+			this.base_url = set_base_url(this.mine_code)
+			
+			// 设置头像
+			for (let i = 0; i < 2; i++) {
+				// 获取随机色
+				let r = parseInt(Math.random() * 256)
+				let g = parseInt(Math.random() * 256)
+				let b = parseInt(Math.random() * 256)
+
+				// ES6 字符串拼接
+				// this.bgColor = `rgba(${r},${g},${b},0.3)`
+				let color = "rgba(" + r + "," + g + "," + b + "," + 0.3 + ")"
+				// console.log(color)
+				this.bgColor.push(color)
+			}
+
+		},
+		onShow() {
+			this.get_info()
+		},
+		methods: {
+			change_active(index) {
+				this.active = index
+			},
+			// 获取个人信息
+			get_info() {
+				this.$api.user_getUinfo({
+					staff_num: uni.getStorageSync('user').staff_num
+				}).then((res) => {
+					console.log(res.data.data)
+					this.info = res.data.data
+					this.info.work_experience = JSON.parse(res.data.data.work_experience)
+					this.info.honor = JSON.parse(res.data.data.honor)
+				})
+			},
+
+			// 新增工作经历
+			add_text() {
+
+				const data = {
+					work_experience: this.info.work_experience
+				}
+				uni.navigateTo({
+					url: "./job_record/job_record",
+					success: (res) => {
+						// 通过eventChannel向被打开页面传送数据
+						res.eventChannel.emit('acceptDataFromOpenerPage', {
+							data: data
+						})
+					}
+				})
+			},
+			del_job(index) {
+				uni.showActionSheet({
+					itemList: ['删除'],
+					success: (res) => {
+						this.info.work_experience.splice(index, 1)
+
+						this.$api.user_updateUserMessage({
+							work_experience: JSON.stringify(this.info.work_experience)
+						}).then((res) => {
+							console.log(res)
+
+							uni.showToast({
+								icon: "none",
+								title: "删除成功"
+							})
+						})
+
+					},
+					fail: (res) => {
+						console.log(res.errMsg);
+					}
+				});
+			},
+			// 新增荣誉
+			add_image() {
+				const data = {
+					base_url: this.base_url,
+					
+					honor_list: this.info.honor
+				}
+				uni.navigateTo({
+					url: "./honor/honor",
+					success: (res) => {
+						// 通过eventChannel向被打开页面传送数据
+						res.eventChannel.emit('acceptDataFromOpenerPage', {
+							data: data
+						})
+					}
+				})
+			},
+
+			click_image(index, path) {
+				console.log(index, path)
+				uni.showActionSheet({
+					itemList: ['查看', '删除'],
+					success: (res) => {
+
+						if (res.tapIndex == 0) {
+							console.log('选中了第' + (res.tapIndex + 1) + '个按钮');
+
+							uni.previewImage({
+								urls: path.split(','),
+							});
+
+						} else if (res.tapIndex == 1) {
+							console.log('选中了第' + (res.tapIndex + 1) + '个按钮');
+							console.log(index)
+
+							this.info.honor.splice(index, 1)
+
+							console.log(this.info.honor)
+
+							this.$api.user_updateUserMessage({
+								honor: JSON.stringify(this.info.honor)
+							}).then((res) => {
+								console.log(res)
+
+								uni.showToast({
+									icon: "none",
+									title: "删除成功"
+								})
+							})
+						}
+
+					},
+					fail: (res) => {
+						console.log(res.errMsg);
+					}
+				})
+			},
+
+			// 更换头像
+			change_avatar() {
+				uni.showActionSheet({
+					itemList: ['更换头像'],
+					success: (res) => {
+						uni.chooseImage({
+							count: 1,
+							success: (chooseImageRes) => {
+								const tempFilePaths = chooseImageRes.tempFilePaths;
+								console.log(chooseImageRes.tempFiles[0]);
+
+								uni.showLoading({
+									mask: true,
+									title: "上传中..."
+								})
+								
+								uni.uploadFile({
+									url: this.base_url + "/worksheet/design/up_images",
+									header: {
+										'Authorization': uni.getStorageSync('token_type') +' '+uni.getStorageSync('Authorization')
+									},
+									filePath: tempFilePaths[0],
+									name: 'file',
+									// formData只有H5存在
+									formData: {
+										image: chooseImageRes.tempFiles[0]
+									},
+									success: (uploadFileRes) => {
+										
+										console.log(JSON.parse(uploadFileRes.data));
+
+										const data = JSON.parse(uploadFileRes.data).data
+
+										if (!this.info.avatar) {
+											this.info.avatar = data.path
+										} else {
+											this.info.avatar = data.path
+										}
+
+										console.log(this.info.avatar)
+
+										this.$api.user_updateUserMessage({
+											avatar: this.info.avatar
+										}).then((res) => {
+											console.log(res)
+											
+											uni.hideLoading()
+											
+											uni.showToast({
+												icon: "none",
+												title: "更换成功"
+											})
+										})
+										
+										
+									}
+								})
+
+							}
+						})
+
+					},
+					fail: (res) => {
+						console.log(res.errMsg);
+					}
+				})
+			},
+			
+			
+			// 绑定手机
+			binding_phone(){
+				uni.navigateTo({
+					url:"../setPhone/setPhone"
+				})
+			},
+			go_qianming(){
+				uni.navigateTo({
+					url:"../signature/signature"
+				})
+			}
 		}
 	}
 </script>
 
 <style lang="scss">
+	page {
+		background-color: #F5F8F8;
+	}
+
+	.top {
+		position: relative;
+		background-color: #FFFFFF;
+		width: 750rpx;
+		height: 490rpx;
+
+		background-image: url(./icon/top.png);
+		background-size: 100% 100%;
+		background-position: 0 -110rpx;
+		background-repeat: no-repeat;
+
+		.avatar {
+			padding-top: 70rpx;
+			text-align: center;
+
+			image {
+				width: 200rpx;
+				height: 200rpx;
+
+				border-radius: 50%;
+			}
+		}
+
+		.info {
+			margin-top: 20rpx;
+
+			.name {
+				text-align: center;
+				font-size: 40rpx;
+				font-weight: 700;
+			}
+
+			.box {
+				margin-top: 30rpx;
+				display: flex;
+				justify-content: space-around;
+
+				.item {
+					width: 250rpx;
+					text-align: center;
+
+					.label {
+						font-size: 30rpx;
+						color: #009FE8;
+						margin-bottom: 10rpx;
+					}
 
+					.text {
+						font-size: 32rpx;
+					}
+				}
+			}
+		}
+
+		.redo {
+			width: 100rpx;
+			height: 100rpx;
+
+			line-height: 100rpx;
+			text-align: center;
+
+
+			position: absolute;
+			top: 0;
+			right: 0;
+		}
+
+		margin-bottom: 20rpx;
+	}
+
+
+	.content {
+		background-color: #FFFFFF;
+
+		.box {
+			display: flex;
+			justify-content: space-around;
+			align-items: center;
+
+			border-bottom: 2rpx solid #F5F8F8;
+
+			.item {
+				height: 95rpx;
+				width: 230rpx;
+				text-align: center;
+
+				position: relative;
+
+				.text {
+					font-size: 34rpx;
+					line-height: 95rpx;
+				}
+
+				.line {
+					margin: -6rpx auto 0;
+					width: 80rpx;
+					height: 6rpx;
+					background-color: #009FE8;
+				}
+			}
+		}
+
+		.list_1 {
+			box-sizing: border-box;
+			padding: 0 50rpx;
+
+			.item {
+				border-bottom: 2rpx solid #F5F8F8;
+				// height: 95rpx;
+				box-sizing: border-box;
+				padding: 30rpx 0;
+				display: flex;
+				// justify-content: space-between;
+				justify-content: space-between;
+				align-items: center;
+				font-size: 32rpx;
+
+				.label {
+					width: 300rpx;
+					text-align: left;
+				}
+
+				.text {
+					width: 300rpx;
+					text-align: left;
+					color: #8e8e8e;
+
+				}
+
+				.right {
+					// width: 100rpx;
+					text-align: right;
+				}
+			}
+
+		}
+
+		.list_2 {
+			box-sizing: border-box;
+			padding: 0 50rpx;
+
+			.item {
+				border-bottom: 2rpx solid #F5F8F8;
+				// height: 95rpx;
+				box-sizing: border-box;
+				padding: 20rpx 0;
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				font-size: 28rpx;
+				text-align: center;
+				color: #8e8e8e;
+
+				.text_1 {
+					width: 190rpx;
+				}
+
+				.text_2 {
+					width: 240rpx;
+
+				}
+
+				.text_3 {
+					width: 160rpx;
+				}
+			}
+
+			.item:first-child {
+				font-size: 32rpx;
+				color: #333;
+			}
+
+		}
+
+		.list_3 {
+			box-sizing: border-box;
+			padding: 50rpx;
+
+			overflow: hidden;
+
+			.item {
+				float: left;
+				margin-right: 50rpx;
+				margin-bottom: 30rpx;
+
+				width: 300rpx;
+				text-align: center;
+
+				.img {
+					margin-bottom: 10rpx;
+
+					image {
+						width: 300rpx;
+						height: 180rpx;
+					}
+
+					.add {
+						font-size: 140rpx;
+						color: #DCDCDC;
+						text-align: center;
+						height: 180rpx;
+						line-height: 160rpx;
+						background-color: #EEEEEE;
+					}
+				}
+
+				.text {
+					width: 260rpx;
+					font-size: 30rpx;
+					color: #8e8e8e;
+
+					overflow: hidden;
+					white-space: nowrap;
+					text-overflow: ellipsis;
+				}
+			}
+
+			.item:nth-child(2n) {
+				margin-right: 0;
+			}
+		}
+	}
 </style>

+ 3 - 5
pages/my/setPhone/setPhone.vue

@@ -115,11 +115,9 @@
 						this.send_text = "发送验证码"
 					}
 					
-					setTimeout(function(){
-						uni.switchTab({
-							url:"../../tabbar/my/my",
-						})
-					},1000)
+					setTimeout(() => {
+						uni.navigateBack()
+					}, 1500)
 				})
 				
 			},

+ 399 - 0
pages/my/signature/js/signature.js

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

+ 38 - 0
pages/my/signature/signature - 副本.vue

@@ -0,0 +1,38 @@
+<template>
+	<view>
+		<web-view :src="href"></web-view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				// 手写签名H5地址
+				href:'',
+				mine_code:"",
+				
+				staff_num:'',
+				Authorization:""
+			}
+		},
+		onLoad() {
+			// 初始化当前煤矿编码
+			this.mine_code = uni.getStorageSync('mine_code')
+			// 用户工号
+			this.staff_num = uni.getStorageSync('user').staff_num
+			this.Authorization = uni.getStorageSync('token_type') + ' ' + uni.getStorageSync('Authorization')
+			// console.log(this.Authorization)
+			// console.log(this.staff_num)
+			
+			this.href = "http://webdevelop.nxjiewei.com/assets/html/zhks-quankuang/signature?staff=" + this.staff_num + "&token=" + this.Authorization + "&mine_code=" + this.mine_code
+		
+		}
+	}
+
+
+</script>
+
+<style scoped="true" lang="scss">
+	
+</style>

+ 237 - 19
pages/my/signature/signature.vue

@@ -1,38 +1,256 @@
 <template>
-	<view>
-		<web-view :src="href"></web-view>
+	<view class="wrapper">
+		<view class="handRight"></view>
+		<view class="handBtn">
+			<view class="slide-wrapper">
+				<text>选择粗细</text>
+				<slider @change="updateValue" value="25" show-value class="slider" step="25" />
+			</view>
+		</view>
+		<view class="handCenter">
+			<canvas class="handWriting" disable-scroll="true" @touchstart="uploadScaleStart"
+				@touchmove="uploadScaleMove" @touchend="uploadScaleEnd" @tap="mouseDown" canvas-id="handWriting">
+			</canvas>
+		</view>
+		<view class="showimg">
+			<image v-if="showimg" :src="showimg" mode=""></image>
+			<text v-else>图片展示</text>
+		</view>
+		<view class="buttons">
+			<button @click="retDraw" class="delBtn">重写</button>
+			<button @click="subCanvas" class="subBtn">保存</button>
+		</view>
 	</view>
 </template>
 
 <script>
+	import Handwriting from "./js/signature.js"
 	export default {
 		data() {
 			return {
-				// 手写签名H5地址
-				href:'',
-				mine_code:"",
+				lineColor: 'black',
+				slideValue: 25,
+				handwriting: '',
+				selectColor: 'black',
+				color: '',
+				showimg: '',
+				share_popup: false,
 				
-				staff_num:'',
-				Authorization:""
 			}
 		},
 		onLoad() {
-			// 初始化当前煤矿编码
-			this.mine_code = uni.getStorageSync('mine_code')
-			// 用户工号
-			this.staff_num = uni.getStorageSync('user').staff_num
-			this.Authorization = uni.getStorageSync('token_type') + ' ' + uni.getStorageSync('Authorization')
-			// console.log(this.Authorization)
-			// console.log(this.staff_num)
+			this.handwriting = new Handwriting({
+				lineColor: this.lineColor,
+				slideValue: this.slideValue, // 0, 25, 50, 75, 100
+				canvasName: 'handWriting',
+			})
 			
-			this.href = "http://webdevelop.nxjiewei.com/assets/html/zhks-quankuang/signature?staff=" + this.staff_num + "&token=" + this.Authorization + "&mine_code=" + this.mine_code
-		
+		},
+		methods: {
+			// 选择画笔颜色
+			selectColorEvent(event) {
+				this.selectColor = event;
+				if (event == 'black') {
+					this.color = '#1A1A1A'
+				} else if (event == 'red') {
+					this.color = '#ca262a'
+				}
+				this.handwriting.selectColorEvent(this.color)
+			},
+			retDraw() {
+				this.handwriting.retDraw()
+			},
+			// 笔迹粗细滑块
+			updateValue(e) {
+				console.log(e.detail);
+				this.slideValue = e.detail.value;
+				this.handwriting.selectSlideValue(this.slideValue);
+			},
+			uploadScaleStart(event) {
+				this.handwriting.uploadScaleStart(event)
+			},
+			uploadScaleMove(event) {
+				this.handwriting.uploadScaleMove(event)
+			},
+			uploadScaleEnd(event) {
+				this.handwriting.uploadScaleEnd(event)
+			},
+			subCanvas() {
+				this.handwriting.saveCanvas().then(res => {
+					this.showimg = res;
+					console.log(res);
+					
+					this.$api.worksheet_baseimg({
+						staff_num: uni.getStorageSync('user').staff_num,
+						base_img:res
+					}).then((res)=>{
+						uni.showToast({
+							icon:"none",
+							title:"保存成功"
+						})
+						
+						setTimeout(() => {
+							uni.navigateBack()
+						}, 1500)
+						
+						console.log(res)
+					})
+					
+					
+				}).catch(err => {
+					console.log(err);
+				});
+
+			},
 		}
 	}
+</script>
 
+<style scoped="true">
+	view{
+		display: flex;
+	}
+	.wrapper {
+		width: 100%;
+		height: 100%;
+		margin: 30upx 0;
+		overflow: hidden;
+		display: flex;
+		align-content: center;
+		flex-direction: column;
+		justify-content: center;
+		font-size: 28upx;
+	}
 
-</script>
+	.handWriting {
+		background: #fff;
+		width: 100%;
+		height: 350upx;
+	}
+
+	.handRight {
+		align-items: center;
+	}
+
+	.handCenter {
+		border: 4upx dashed #e9e9e9;
+		flex: 5;
+		overflow: hidden;
+		box-sizing: border-box;
+		width: 90%;
+		margin: 0 auto;
+	}
+
+	.handTitle {
+		flex: 1;
+		color: #666;
+		justify-content: center;
+		font-size: 30upx;
+	}
+
+	.handBtn {
+		flex-direction: column;
+		padding: 40upx 0;
+		width: 90%;
+		margin: 0 auto;
+	}
+
+	.buttons {
+		width: 100%;
+		margin-top: 100upx;
+		justify-content: space-between;
+	}
+
+	.buttons>button {
+		font-size: 30upx;
+		height: 80upx;
+		width: 120upx;
+	}
+
+	.delBtn {
+		color: #666;
+	}
+
+	.color {
+		align-items: center;
+	}
+
+	.color>text {
+		margin-right: 20upx;
+	}
+
+	.subBtn {
+		background: #008ef6;
+		color: #fff;
+		text-align: center;
+		justify-content: center;
+	}
+
+	.black-select {
+		width: 60upx;
+		height: 60upx;
+	}
+
+	.black-select.color_select {
+		width: 90upx;
+		height: 90upx;
+	}
+
+	.red-select {
+		width: 60upx;
+		height: 60upx;
+	}
+
+	.red-select.color_select {
+		width: 90upx;
+		height: 90upx;
+	}
+
+	.slide-wrapper {
+		align-items: center;
+		margin-bottom: 20upx;
+	}
+
+	.slider {
+		width: 400upx;
+		padding-left: 20upx;
+	}
+
+	.drop {
+		width: 50upx;
+		height: 50upx;
+		border-radius: 50%;
+		background: #FFF;
+		position: absolute;
+		left: 0upx;
+		top: -10upx;
+		box-shadow: 0px 1px 5px #888888;
+	}
+
+	.slide {
+		width: 250upx;
+		height: 30upx;
+	}
+
+	.showimg {
+		border: 4upx solid #e9e9e9;
+		overflow: hidden;
+		width: 90%;
+		margin: 0 auto;
+		background: #eee;
+		height: 350upx;
+		margin-top: 40upx;
+		align-items: center;
+		justify-content: center;
+	}
 
-<style scoped="true" lang="scss">
-	
+	.showimg>image {
+		width: 100%;
+		height: 100%;
+	}
+
+	.showimg>text {
+		font-size: 40upx;
+		color: #888;
+	}
 </style>

+ 2 - 2
pages/ningdongyunying/personnel_orientation/personnel_orientation.vue

@@ -10,7 +10,7 @@
 			</view>
 
 			<view class="list">
-				<view class="item" v-for="(item,index) in list" :key="index">
+				<view class="item" v-for="(item,index) in list" :key="index" @click="go_personnel_orientation(item.mine_code)">
 					<view class="title" :style="{borderLeftColor: item.color}">{{item.cocalminename}}</view>
 					<view class="inner">
 						<view class="box" v-for="(item_2,index_2) in item.data">
@@ -18,7 +18,7 @@
 							<view class="num">{{item_2.num}}个</view>
 						</view>
 					</view>
-					<view class="right_arrow" @click="go_personnel_orientation(item.mine_code)">
+					<view class="right_arrow">
 						<view class="text">查看详情</view>
 						<view class="icon"></view>
 					</view>

+ 268 - 0
pages/origanization/OA/application_list/application_list.vue

@@ -0,0 +1,268 @@
+<template>
+	<view>
+		<view class="search">
+			<view class="box" @click="go_search()">
+				<view class="icon">
+					<uni-icons type="search" size="16" color="#BBBBBB"></uni-icons>
+				</view>
+				<view class="text">搜索</view>
+			</view>
+		</view>
+
+		<view class="content">
+			<!-- <view class="title">
+
+				<view class="tab" @click="change_tab_active(1)">
+					<view class="text" :class="tab_active == 1?'active':''">最近常用</view>
+					<view class="line" v-if="tab_active == 1"></view>
+				</view>
+				<view class="tab" @click="change_tab_active(2)">
+					<view class="text" :class="tab_active == 2?'active':''">全部流程</view>
+					<view class="line" v-if="tab_active == 2"></view>
+				</view>
+
+			</view> -->
+
+			<!-- 暂时一个分类 -->
+			<view class="title">
+				<view class="tab">
+					<view class="text" :class="tab_active == 1?'active':''">全部流程</view>
+					<view class="line" v-if="tab_active == 1"></view>
+				</view>
+			</view>
+
+			<view class="section" v-for="(item,index) in list" :key="index">
+				<view class="box">
+					<view class="item">
+						<view class="left">
+							<view class="icon" v-if="active == index" @click.stop="change_active(index)">
+								<image src="./icon/close.png" mode=""></image>
+							</view>
+							<view class="icon" v-if="active != index" @click.stop="change_active(index)">
+								<image src="./icon/open.png" mode=""></image>
+							</view>
+							<view class="text">{{item.type}} ({{item.count}})</view>
+						</view>
+					</view>
+					<view class="list" v-if="active == index">
+						<view class="item" v-for="(item_2,index_2) in item.list" :key="index_2"
+							@click="go_detail_apply(item_2.name,item_2.flow_set_id)">
+							<view class="left">
+								<view class="text">{{item_2.name}}</view>
+							</view>
+							<view class="right">
+								<uni-icons type="compose"></uni-icons>
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		set_base_url
+	} from '@/common/set_base_url.js'
+
+	export default {
+		data() {
+			return {
+				// 切换
+				tab_active: 1,
+
+				list: [],
+				// 当前展开
+				active: 99999999,
+
+			};
+		},
+		onLoad() {
+			this.get_list()
+		},
+		methods: {
+			// 搜索
+			go_search() {
+				uni.navigateTo({
+					url: "./search/search",
+					animationType: "fade-in",
+					animationDuration: 200
+				})
+			},
+
+			change_tab_active(item) {
+				this.tab_active = item
+			},
+
+			change_active(index) {
+				if (this.active == index) {
+					this.active = 99999999
+				} else {
+					this.active = index
+				}
+			},
+
+			get_list() {
+				this.$api.workflow_get_all_list({
+
+				}).then((res) => {
+					console.log(res)
+					this.list = res.data.content.data
+				})
+
+			},
+			go_detail_apply(name, flow_set_id) {
+				uni.navigateTo({
+					url: "./detail_apply/detail_apply?title=" + name + "&flow_set_id=" + flow_set_id
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	page {
+		background-color: #F3F8F7;
+	}
+
+	.search {
+		margin-bottom: 20rpx;
+		background-color: #FFFFFF;
+		box-sizing: border-box;
+		padding: 25rpx 30rpx;
+
+		.box {
+			height: 80rpx;
+			background-color: #F4F4F4;
+			border-radius: 50rpx;
+
+			display: flex;
+			align-items: center;
+
+			box-sizing: border-box;
+			padding: 0 25rpx;
+
+			.icon {
+				margin-right: 10rpx;
+			}
+
+			.text {
+				font-size: 30rpx;
+				color: #BBBBBB;
+			}
+		}
+	}
+
+	.content {
+		background-color: #FFFFFF;
+
+		.title {
+			height: 110rpx;
+			display: flex;
+			align-items: center;
+
+			box-sizing: border-box;
+			padding: 0 25rpx;
+			border-bottom: 1rpx solid #F3F8F7;
+
+			.tab {
+				width: 350rpx;
+				line-height: 110rpx;
+				position: relative;
+
+				.text {
+					text-align: center;
+				}
+
+				.line {
+					position: absolute;
+					left: 50%;
+					bottom: 0;
+
+					transform: translateX(-40rpx);
+
+					width: 80rpx;
+					height: 4rpx;
+					background-color: #00A0E8;
+				}
+
+				.active {
+					color: #00A0E8;
+					font-weight: 700;
+				}
+			}
+		}
+
+		.section {
+			box-sizing: border-box;
+			padding: 0 20rpx;
+
+			.box {
+
+				.item {
+					height: 110rpx;
+					display: flex;
+					align-items: center;
+					justify-content: space-between;
+
+					margin-left: 20rpx;
+					border-bottom: 1rpx solid #F3F8F7;
+
+					.left {
+						display: flex;
+						align-items: center;
+
+						.icon {
+							line-height: 110rpx;
+							width: 90rpx;
+							text-align: center;
+
+							image {
+								width: 24rpx;
+								height: 24rpx;
+							}
+						}
+
+						.text {
+							font-size: 32rpx;
+						}
+					}
+
+				}
+
+				.list {
+					.item {
+						height: 110rpx;
+
+						display: flex;
+						justify-content: space-between;
+						align-items: center;
+
+						margin-left: 108rpx;
+						border-bottom: 1rpx solid #F3F8F7;
+
+						.left {
+							.text {
+								margin-left: 18rpx;
+								font-size: 30rpx;
+
+							}
+						}
+
+						.right {
+							line-height: 110rpx;
+							width: 90rpx;
+							text-align: center;
+						}
+
+					}
+				}
+
+			}
+
+		}
+
+	}
+</style>

+ 470 - 0
pages/origanization/OA/application_list/detail_apply/detail_apply.vue

@@ -0,0 +1,470 @@
+<template>
+	<view>
+		<!-- 提交内容 -->
+		<view class="content" v-if="list.length > 0">
+			<view class="inner" v-for="(item,index) in list" :key="index">
+				<!-- 从全矿人员里单选 -->
+				<!-- <view class="input_box">
+					<view class="label"><text> * </text>从全矿人员里单选:</view>
+					<view class="box_picker">
+						<uni-data-picker popup-title="-" :localdata="user_list"  @change="onchange" @nodeclick="onnodeclick"></uni-data-picker>
+					</view>
+				</view> -->
+
+				<!-- 文本框 -->
+				<view class="input_box" v-if="item.fieldstype == 'text'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}:</view>
+					<view class="box">
+						<input type="text" @blur="blur_text($event,index)" :placeholder="'请输入'+item.name" />
+					</view>
+				</view>
+				<!-- 文本域 -->
+				<view class="input_box" v-if="item.fieldstype == 'textarea'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}</view>
+					<view class="box">
+						<textarea @blur="blur_textarea($event,index)" auto-height="true"
+							:placeholder="'请输入'+item.name" />
+					</view>
+				</view>
+				<!-- 日期(Y-m-d 的日期格式) -->
+				<view class="input_box" v-if="item.fieldstype == 'date'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}:</view>
+					<view class="box date_box">
+						<uni-datetime-picker type="date" @change="change_time($event,index)" />
+					</view>
+				</view>
+				<!-- Y-m-d H:i:s的格式 -->
+				<view class="input_box" v-if="item.fieldstype == 'datetime'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}:</view>
+					<view class="box date_box">
+						<uni-datetime-picker type="datetime" @change="change_time($event,index)" />
+					</view>
+				</view>
+				<!-- 选择人员(多选) 返回{"id","name"}格式,提交时传id -->
+				<view class="input_box" v-if="item.fieldstype == 'changeusercheck'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}(多选):</view>
+					<view class="box">
+						<uni-data-checkbox multiple :map="{text:'name',value:'id'}" :localdata="item.data"
+							@change="change_select_box($event,index)"></uni-data-checkbox>
+					</view>
+				</view>
+				<!-- 选择人员(单选) 返回{"id","name"}格式,提交时传id -->
+				<!-- <view class="input_box" v-if="item.fieldstype == 'changeuser'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}(单选):</view>
+					<view class="box">
+						<uni-data-checkbox :map="{text:'name',value:'id'}" :localdata="item.data"
+							@change="change_select_box($event,index)"></uni-data-checkbox>
+					</view>
+				</view> -->
+				<!-- 从全矿人员里单选 -->
+				<view class="input_box" v-if="item.fieldstype == 'changeuser'">
+					<view class="label"><text> * </text>{{item.name}}(单选):</view>
+					<view class="box_picker">
+						<uni-data-picker popup-title="-" :localdata="user_list" @nodeclick="onnodeclick($event,index)"></uni-data-picker>
+					</view>
+				</view>
+				<!-- 选择部门(单选) 返回{"id","name"}格式,提交时传id -->
+				<view class="input_box" v-if="item.fieldstype == 'changedept'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}(单选):</view>
+					<view class="box">
+						<uni-data-checkbox :map="{text:'name',value:'id'}" :localdata="item.data.children[0].children"
+							@change="change_select_box($event,index)"></uni-data-checkbox>
+					</view>
+				</view>
+				<!-- 选择部门(多选) 返回{"id","name"}格式,提交时传id -->
+				<view class="input_box" v-if="item.fieldstype == 'changedeptcheck'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}(多选):</view>
+					<view class="box">
+						<uni-data-checkbox multiple :map="{text:'name',value:'id'}"
+							:localdata="item.data.children[0].children" @change="change_select_box($event,index)">
+						</uni-data-checkbox>
+					</view>
+				</view>
+				<!-- 单个复选框 返回{"key":"val"}格式,提交时传key	 -->
+				<!-- <view class="input_box" v-if="item.fieldstype == 'checkbox'">
+					checkbox{{index}}{{item.isbt}}
+				</view> -->
+				<!-- 多个复选框 返回{"key":"val"}格式,提交时传key	 -->
+				<view class="input_box" v-if="item.fieldstype == 'checkboxall'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}:</view>
+					<view class="box">
+						<uni-data-checkbox multiple :map="{text:'name',value:'id'}" :localdata="item.data"
+							@change="change_select_box($event,index)"></uni-data-checkbox>
+					</view>
+				</view>
+				<!-- 固定值 -->
+				<view class="input_box" v-if="item.fieldstype == 'fixed'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}:</view>
+					<view class="box">
+						{{inner_list[index].data}}
+					</view>
+				</view>
+				<!-- 隐藏文本框 -->
+				<view class="input_box" v-if="item.fieldstype == 'hidden'" v-show="false">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}:</view>
+					<view class="box">
+						{{inner_list[index].data}}
+					</view>
+				</view>
+				<!-- 数字 -->
+				<view class="input_box" v-if="item.fieldstype == 'number'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}:</view>
+					<view class="box">
+						<input type="number" @blur="blur_text($event,index)" :placeholder="'请输入'+item.name" />
+					</view>
+				</view>
+				<!-- 单选框 返回{"key":"val"}格式,提交时传key -->
+				<view class="input_box" v-if="item.fieldstype == 'radio'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}(单选):</view>
+					<view class="box">
+						<uni-data-checkbox :map="{text:'name',value:'id'}" :localdata="item.data"
+							@change="change_select_box($event,index)"></uni-data-checkbox>
+					</view>
+				</view>
+				<!-- 下拉框 返回{"key":"val"}格式,提交时传key -->
+				<view class="input_box" v-if="item.fieldstype == 'select'">
+					<!-- 下拉框形式 -->
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}:下拉框{{index}}</view>
+					<view class="box select_box" @click="select_showActionSheet(item.data,index)">
+						<view>{{inner_list[index].data.name}}</view>
+						<view>
+							<uni-icons type="arrowdown"></uni-icons>
+						</view>
+					</view>
+
+					<!-- radio形式 -->
+					<!-- <view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}(单选):</view>
+					<view class="box">
+						<uni-data-checkbox :map="{text:'name',value:'id'}" :localdata="item.data"
+							@change="change_select_box($event,index)"></uni-data-checkbox>
+					</view> -->
+				</view>
+				<!-- H:i:s的格式 -->
+				<view class="input_box" v-if="item.fieldstype == 'time'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}:</view>
+					<view class="box">
+						<picker mode="time" :value="inner_list[index].data" @change="bindTimeChange($event,index)">
+							<view class="uni-input" v-if="inner_list[index].data != ''">{{inner_list[index].data}}
+							</view>
+							<view class="uni-input" v-if="inner_list[index].data == ''">请选择时间</view>
+						</picker>
+					</view>
+
+				</view>
+
+			</view>
+
+			<view class="btn" @click="submit()">提交</view>
+		</view>
+
+
+
+	</view>
+</template>
+
+<script>
+	import {
+		set_base_url
+	} from '@/common/set_base_url.js'
+	export default {
+		data() {
+			return {
+				mine_code: "",
+				base_url: "",
+				// 单据id
+				flow_set_id: "",
+				// 单据项目
+				list: [],
+
+				// 需要提交的数据
+				inner_list: [],
+				
+				// 全矿人员数据
+				user_list:[]
+			};
+		},
+		onLoad(option) {
+			// 初始化当前煤矿编码
+			this.mine_code = uni.getStorageSync('mine_code')
+			// 根据矿编码切换首页接口不同的请求基础路径
+			this.base_url = set_base_url(this.mine_code)
+			// 设置单据标题
+			uni.setNavigationBarTitle({
+				title: option.title
+			})
+			// 初始化单据标识
+			this.flow_set_id = option.flow_set_id
+
+			// 获取单据详情
+			this.get_detail()
+			// 获取部门和人员
+			this.get_user()
+		},
+		methods: {
+			// 获取单据详情
+			get_detail() {
+				uni.showLoading({
+					mask: true
+				})
+				this.$api.workflow_get_detail({
+					flow_set_id: this.flow_set_id,
+					staff_num: uni.getStorageSync('user').staff_num
+				}).then((res) => {
+					uni.hideLoading()
+					console.log(res.data.content.data)
+
+					let data = res.data.content.data
+
+					this.list = data.flow_element
+					console.log(this.list)
+
+					// 设置提交的初始值
+					this.list.forEach((item, index) => {
+						console.log(item)
+						this.inner_list.push({
+							fields: item.fields,
+							fieldstype: item.fieldstype,
+							isbt: item.isbt,
+							name: item.name,
+							data: ""
+						})
+
+						// 固定值
+						if (item.fieldstype == 'fixed') {
+							this.inner_list[index].data = item.data
+						}
+						// 隐藏文本框
+						if (item.fieldstype == 'hidden') {
+							this.inner_list[index].data = item.data
+						}
+
+					})
+
+				})
+
+			},
+			// 提交内容
+			submit() {
+				console.log(this.inner_list)
+
+				uni.showLoading({
+					mask: true
+				})
+
+				this.$api.workflow_submit_apply({
+					staff_num: uni.getStorageSync('user').staff_num,
+					flow_set_id: this.flow_set_id,
+					data_list: JSON.stringify(this.inner_list)
+				}).then((res) => {
+					uni.hideLoading()
+
+					if (res.data.code == '0000') {
+						uni.showToast({
+							icon: "none",
+							title: res.data.content.msg
+						})
+						
+						if(res.data.content.status){
+							uni.navigateBack()
+						}
+					} else {
+
+					}
+
+					console.log(res.data)
+				})
+
+			},
+
+
+			// 获取部门和人员
+			get_user() {
+				this.$api.section_getSectionStaff({
+					
+				}).then((res)=>{
+					console.log(res.data.data)
+					this.user_list = res.data.data
+				})
+			},
+
+			// 文本框
+			blur_text(e, index) {
+				console.log(e.detail.value, index)
+
+				this.inner_list[index].data = e.detail.value
+			},
+
+			// 文本域
+			blur_textarea(e, index) {
+				console.log(e.detail.value, index)
+
+				this.inner_list[index].data = e.detail.value
+			},
+
+			// 日期(Y-m-d 的日期格式)
+			change_time(e, index) {
+				console.log("-change事件:", e, index);
+
+				this.inner_list[index].data = e
+			},
+
+
+			// 多选人员 选择部门(单选) 选择部门(多选) 
+			change_select_box(e, index) {
+				console.log(e.detail.value, index)
+
+				this.inner_list[index].data = e.detail.value
+			},
+
+			// 下拉框
+			select_showActionSheet(data, index) {
+				let array = []
+
+				data.forEach((item, index) => {
+					array.push(item.name)
+				})
+
+				uni.showActionSheet({
+					itemList: array,
+					success: (res) => {
+						console.log('选中了第' + (res.tapIndex + 1) + '个按钮');
+						console.log(data[res.tapIndex].id, index)
+						this.inner_list[index].data = data[res.tapIndex]
+					},
+				});
+
+
+				// 上传图片
+				// uni.chooseImage({
+				// 	count: 1,
+				// 	sourceType: ['camera'],
+				// 	success: (chooseImageRes) => {
+				// 		const tempFilePaths = chooseImageRes.tempFilePaths;
+				// 		console.log(tempFilePaths)
+				// 		console.log(chooseImageRes.tempFiles[0]);
+
+
+				// 		uni.uploadFile({
+				// 			url: this.base_url + "/worksheet/design/up_images",
+				// 			header: {
+				// 				'Authorization': 'Bearer ' + uni.getStorageSync('Authorization')
+				// 			},
+				// 			filePath: tempFilePaths[0],
+				// 			name: 'file',
+				// 			// formData只有H5存在
+				// 			formData: {
+				// 				image: chooseImageRes.tempFiles[0]
+				// 			},
+				// 			success: (uploadFileRes) => {
+				// 				console.log(uploadFileRes)
+				// 				console.log(uploadFileRes.data);
+				// 				console.log(JSON.parse(uploadFileRes.data));
+
+
+				// 			}
+				// 		});
+				// 	}
+				// })
+			},
+
+			// time
+			bindTimeChange(e, index) {
+				console.log(e.detail.value, index)
+				this.inner_list[index].data = e.detail.value
+			},
+			
+			
+			// 从全矿人员里单选
+			onnodeclick(node,index) {
+				console.log(node.value,index)
+				this.inner_list[index].data = node.value
+			}
+		}
+	}
+</script>
+
+
+<style lang="scss">
+	page {
+		background-color: #009FE8;
+		box-sizing: border-box;
+		padding: 25rpx;
+	}
+
+	.content {
+		background-color: #FFFFFF;
+		border-radius: 10rpx;
+
+		box-sizing: border-box;
+		padding: 30rpx 25rpx;
+
+		.inner {
+			margin-bottom: 25rpx;
+
+			.input_box {
+				font-size: 32rpx;
+
+				.label {
+					margin: 15rpx 0;
+					line-height: 50rpx;
+					color: #6C6F74;
+
+					text {
+						color: red;
+					}
+				}
+
+				.box {
+					width: 650rpx;
+					background: #FFFFFF;
+					border-radius: 8rpx;
+					border: 2rpx solid #E9EBF2;
+
+					box-sizing: border-box;
+					padding: 20rpx 25rpx;
+
+					// 文本域
+					textarea {
+						min-height: 120rpx;
+					}
+
+					// 选择时间
+					/deep/.uni-date-editor--x {
+						.uniui-clear {
+							display: none;
+						}
+					}
+
+					/deep/.uni-date-x--border {
+						box-sizing: border-box;
+						border-radius: 4px;
+						border: none;
+					}
+
+					/deep/.uni-date-x {
+						padding: 0;
+					}
+				}
+
+				// 日期(Y-m-d 的日期格式)
+				.date_box {
+					padding: 2rpx 25rpx;
+				}
+
+				// 下拉选择 下拉菜单
+				.select_box {
+					display: flex;
+					justify-content: space-between;
+				}
+			}
+		}
+	}
+
+	.btn {
+		margin-top: 40rpx;
+		background-color: #009FE8;
+		padding: 25rpx 50rpx;
+		color: #FFFFFF;
+		text-align: center;
+	}
+</style>

BIN
pages/origanization/OA/application_list/icon/close.png


BIN
pages/origanization/OA/application_list/icon/open.png


+ 159 - 0
pages/origanization/OA/application_list/search/search.vue

@@ -0,0 +1,159 @@
+<template>
+	<view>
+		<view class="search">
+			<view class="box">
+				<view class="icon">
+					<uni-icons type="search" size="16" color="#BBBBBB"></uni-icons>
+				</view>
+				<view class="text">
+					<input type="text" v-model="search_text" value="" placeholder="搜索" confirm-type="search"
+						placeholder-style="font-size: 30rpx;color: #BBBBBB;" @input="get_list()" />
+				</view>
+			</view>
+		</view>
+
+		<view class="content">
+			<view class="title">
+				<view class="text">搜索结果:</view>
+			</view>
+
+			<view class="list">
+				<view class="item" v-for="(item,index) in list" :key="index">
+					<view class="left">
+						<view class="text">{{item.name}}</view>
+					</view>
+					<view class="right">
+						<uni-icons type="compose"></uni-icons>
+					</view>
+				</view>
+
+				<view v-if="list.length == 0" style="font-size: 32rpx;text-align: center;line-height: 400rpx;">暂无搜索结果
+				</view>
+			</view>
+
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				mine_code: "",
+				search_text: "",
+				
+				list: [
+
+				],
+
+			};
+		},
+		onLoad() {
+			
+		},
+		methods: {
+			get_list() {
+				this.list = [
+					{
+						name:"工单名称1",
+					},
+					{
+						name:"工单名称2",
+					},
+					{
+						name:"工单名称3"
+					}
+				]
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	page {
+		background-color: #F3F8F7;
+	}
+
+	.search {
+		margin-bottom: 20rpx;
+		background-color: #FFFFFF;
+		box-sizing: border-box;
+		padding: 25rpx 30rpx;
+
+		.box {
+			height: 80rpx;
+			background-color: #F4F4F4;
+			border-radius: 50rpx;
+
+			display: flex;
+			align-items: center;
+
+			box-sizing: border-box;
+			padding: 0 25rpx;
+
+			.icon {
+				margin-right: 10rpx;
+			}
+
+			.text {
+				font-size: 30rpx;
+				color: #BBBBBB;
+
+			}
+		}
+	}
+
+	.content {
+		background-color: #FFFFFF;
+
+		.title {
+			height: 110rpx;
+			display: flex;
+			align-items: center;
+
+			box-sizing: border-box;
+			padding: 0 36rpx;
+			border-bottom: 1rpx solid #F3F8F7;
+
+			.text {
+				margin-left: 20rpx;
+				font-size: 36rpx;
+				font-weight: 700;
+			}
+		}
+
+		.list {
+			box-sizing: border-box;
+			padding: 0 20rpx;
+
+			.item {
+				height: 110rpx;
+
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+
+				margin-left: 58rpx;
+				border-bottom: 1rpx solid #F3F8F7;
+				
+				box-sizing: border-box;
+				padding-right: 20rpx;
+
+				.left {
+					display: flex;
+					.text {
+						margin-left: 18rpx;
+						font-size: 30rpx;
+
+					}
+				}
+
+				.right {
+					
+				}
+			}
+
+		}
+
+	}
+</style>

+ 118 - 0
pages/origanization/OA/apply_list/apply_list.vue

@@ -0,0 +1,118 @@
+<template>
+	<view>
+		<view class="list">
+			<view class="item" v-for="item in 6">
+				<view class="title">用车申请</view>
+				<view class="box">
+					<view class="left">
+						<view class="line">申请人:申请人姓名</view>
+						<view class="line">单号:XA-ymd_045</view>
+						<view class="line">申请日期:2022-01-13 13:25:32</view>
+					</view>
+					<view class="right">
+						<view class="btn" @click="go_detail('用车申请')">详情</view>
+						<view class="btn" @click="go_approval('用车申请')">操作</view>
+					</view>
+				</view>
+				<view class="tip">待处理</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+
+			};
+		},
+		methods:{
+			go_detail(title){
+				uni.navigateTo({
+					url:"./detail/detail?title="+title
+				})
+			},
+			go_approval(title){
+				uni.navigateTo({
+					url:"./approval/approval?title="+title
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	page {
+		background-color: #F2FAF7;
+
+		box-sizing: border-box;
+		padding: 20rpx 25rpx;
+	}
+
+	.list {
+		.item {
+			position: relative;
+			overflow: hidden;
+			background-color: #FFFFFF;
+			
+			box-sizing: border-box;
+			padding: 25rpx;
+
+			border-radius: 15rpx;
+			margin-bottom: 30rpx;
+			
+			.title{
+				height: 70rpx;
+				line-height: 70rpx;
+				font-size: 36rpx;
+				font-weight: 700;
+			}
+			.box{
+				margin-top: 10rpx;
+				display: flex;
+				justify-content: space-between;
+				.left {
+					height: 140rpx;
+					
+					display: flex;
+					flex-direction: column;
+					justify-content: space-between;
+					.line{
+						font-size: 28rpx;
+						color: #7f7f7f;
+					}
+				}
+				
+				.right {
+					height: 140rpx;
+					display: flex;
+					flex-direction: column;
+					justify-content: space-between;
+					
+					.btn{
+						font-size: 28rpx;
+						background-color: #E1F7FF;
+						color: #1e88e5;
+						padding: 10rpx 30rpx;
+						border-radius: 40rpx;
+					}
+				}
+			}
+			.tip{
+				transform: rotate(45deg);
+				
+				background-color: #04A0E6;
+				color: #FFFFFF;
+				
+				position: absolute;
+				top: -10rpx;
+				right: -50rpx;
+				
+				font-size: 24rpx;
+				padding: 30rpx 40rpx 10rpx;
+				
+			}
+		}
+	}
+</style>

+ 495 - 0
pages/origanization/OA/approval_list/approval/approval.vue

@@ -0,0 +1,495 @@
+<template>
+	<view>
+		<!-- 申请的内容 -->
+		<view class="content" v-if="flow_element.length > 0">
+			<view class="inner" v-for="(item,index) in flow_element" :key="index">
+				<!-- 文本框 -->
+				<view class="input_box" v-if="item.fieldstype == 'text'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}:</view>
+					<view class="box">
+						<input type="text" @blur="blur_text($event,index)" :placeholder="'请输入'+item.name" />
+					</view>
+				</view>
+				<!-- 文本域 -->
+				<view class="input_box" v-if="item.fieldstype == 'textarea'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}</view>
+					<view class="box">
+						<textarea @blur="blur_textarea($event,index)" auto-height="true"
+							:placeholder="'请输入'+item.name" />
+					</view>
+				</view>
+				<!-- 日期(Y-m-d 的日期格式) -->
+				<view class="input_box" v-if="item.fieldstype == 'date'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}:</view>
+					<view class="box date_box">
+						<uni-datetime-picker type="date" @change="change_time($event,index)" />
+					</view>
+				</view>
+				<!-- Y-m-d H:i:s的格式 -->
+				<view class="input_box" v-if="item.fieldstype == 'datetime'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}:</view>
+					<view class="box date_box">
+						<uni-datetime-picker type="datetime" @change="change_time($event,index)" />
+					</view>
+				</view>
+				<!-- 选择人员(多选) 返回{"id","name"}格式,提交时传id -->
+				<view class="input_box" v-if="item.fieldstype == 'changeusercheck'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}(多选):</view>
+					<view class="box">
+						<uni-data-checkbox multiple :map="{text:'name',value:'id'}" :localdata="item.data"
+							@change="change_select_box($event,index)"></uni-data-checkbox>
+					</view>
+				</view>
+				<!-- 选择人员(单选) 返回{"id","name"}格式,提交时传id -->
+				<view class="input_box" v-if="item.fieldstype == 'changeuser'">
+					<view class="label"><text> * </text>{{item.name}}(单选):</view>
+					<view class="box_picker">
+						<uni-data-picker popup-title="-" :localdata="user_list" @nodeclick="onnodeclick($event,index)">
+						</uni-data-picker>
+					</view>
+				</view>
+				<!-- 选择部门(单选) 返回{"id","name"}格式,提交时传id -->
+				<view class="input_box" v-if="item.fieldstype == 'changedept'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}(单选):</view>
+					<view class="box">
+						<uni-data-checkbox :map="{text:'name',value:'id'}" :localdata="item.data.children[0].children"
+							@change="change_select_box($event,index)"></uni-data-checkbox>
+					</view>
+				</view>
+				<!-- 选择部门(多选) 返回{"id","name"}格式,提交时传id -->
+				<view class="input_box" v-if="item.fieldstype == 'changedeptcheck'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}(多选):</view>
+					<view class="box">
+						<uni-data-checkbox multiple :map="{text:'name',value:'id'}"
+							:localdata="item.data.children[0].children" @change="change_select_box($event,index)">
+						</uni-data-checkbox>
+					</view>
+				</view>
+				<!-- 多个复选框 返回{"key":"val"}格式,提交时传key	 -->
+				<view class="input_box" v-if="item.fieldstype == 'checkboxall'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}:</view>
+					<view class="box">
+						<uni-data-checkbox multiple :map="{text:'name',value:'id'}" :localdata="item.data"
+							@change="change_select_box($event,index)"></uni-data-checkbox>
+					</view>
+				</view>
+				<!-- 固定值 -->
+				<view class="input_box" v-if="item.fieldstype == 'fixed'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}:</view>
+					<view class="box">
+						{{inner_list[index].data}}
+					</view>
+				</view>
+				<!-- 隐藏文本框 -->
+				<view class="input_box" v-if="item.fieldstype == 'hidden'" v-show="false">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}:</view>
+					<view class="box">
+						{{inner_list[index].data}}
+					</view>
+				</view>
+				<!-- 数字 -->
+				<view class="input_box" v-if="item.fieldstype == 'number'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}:</view>
+					<view class="box">
+						<input type="number" @blur="blur_text($event,index)" :placeholder="'请输入'+item.name" />
+					</view>
+				</view>
+				<!-- 单选框 返回{"key":"val"}格式,提交时传key -->
+				<view class="input_box" v-if="item.fieldstype == 'radio'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}(单选):</view>
+					<view class="box">
+						<uni-data-checkbox :map="{text:'name',value:'id'}" :localdata="item.data"
+							@change="change_select_box($event,index)"></uni-data-checkbox>
+					</view>
+				</view>
+				<!-- 下拉框 返回{"key":"val"}格式,提交时传key -->
+				<view class="input_box" v-if="item.fieldstype == 'select'">
+					<!-- 下拉框形式 -->
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}:下拉框{{index}}</view>
+					<view class="box select_box" @click="select_showActionSheet(item.data,index)">
+						<view>{{inner_list[index].data.name}}</view>
+						<view>
+							<uni-icons type="arrowdown"></uni-icons>
+						</view>
+					</view>
+
+					<!-- radio形式 -->
+					<!-- <view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}(单选):</view>
+					<view class="box">
+						<uni-data-checkbox :map="{text:'name',value:'id'}" :localdata="item.data"
+							@change="change_select_box($event,index)"></uni-data-checkbox>
+					</view> -->
+				</view>
+				<!-- H:i:s的格式 -->
+				<view class="input_box" v-if="item.fieldstype == 'time'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}:</view>
+					<view class="box">
+						<picker mode="time" :value="inner_list[index].data" @change="bindTimeChange($event,index)">
+							<view class="uni-input" v-if="inner_list[index].data != ''">{{inner_list[index].data}}
+							</view>
+							<view class="uni-input" v-if="inner_list[index].data == ''">请选择时间</view>
+						</picker>
+					</view>
+
+				</view>
+
+			</view>
+		</view>
+		
+		
+		<!-- 当前审批步骤 -->
+		<view class="content" v-if="flow_course.length > 0 && item.checkfields" v-for="(item,index) in flow_course" :key="index">
+			<view>{{item.name}}</view>
+			
+			<view class="inner" v-for="(item_2,index_2) in item.formfields" :key="index_2">
+				<!-- 文本框 -->
+				{{item_2}}
+			</view>
+			
+
+			<view class="approval_btn">
+				<view class="btn" v-for="(item,index) in item.courseact">{{item}}</view>
+			</view>
+			
+			<view class="btn" @click="submit()">提交</view>
+		</view>
+
+		
+
+
+
+	</view>
+</template>
+
+<script>
+	import {
+		set_base_url
+	} from '@/common/set_base_url.js'
+	export default {
+		data() {
+			return {
+				mine_code: "",
+				base_url: "",
+
+
+				// 流程id
+				flow_set_id: "",
+				// 单据table
+				table: "",
+				// 单据项目
+				flow_element: [],
+
+				// 审批项目
+				flow_course: [],
+
+				// 需要提交的数据
+				inner_list: [],
+
+				// 全矿人员数据
+				user_list: []
+			};
+		},
+		onLoad(option) {
+			// 初始化当前煤矿编码
+			this.mine_code = uni.getStorageSync('mine_code')
+			// 根据矿编码切换首页接口不同的请求基础路径
+			this.base_url = set_base_url(this.mine_code)
+
+			// 设置流程id
+			this.flow_set_id = option.flow_set_id
+			// 设置单据标题
+			uni.setNavigationBarTitle({
+				title: option.title
+			})
+			// 初始化单据标识
+			this.table = "admin"
+
+			// 获取单据详情
+			this.get_detail()
+			// 获取部门和人员
+			this.get_user()
+		},
+		methods: {
+			// 获取单据详情
+			get_detail() {
+				uni.showLoading({
+					mask: true
+				})
+				this.$api.workflow_get_detail({
+					flow_set_id: this.flow_set_id,
+					staff_num: uni.getStorageSync('user').staff_num
+				}).then((res) => {
+					uni.hideLoading()
+					console.log(res.data.content.data)
+
+					let data = res.data.content.data
+
+					this.flow_element = data.flow_element
+					this.flow_course = data.flow_course
+
+					// 设置提交的初始值
+					this.flow_element.forEach((item, index) => {
+						this.inner_list.push({
+							fields: item.fields,
+							fieldstype: item.fieldstype,
+							isbt: item.isbt,
+							name: item.name,
+							data: ""
+						})
+
+						// 固定值
+						if (item.fieldstype == 'fixed') {
+							this.inner_list[index].data = item.data
+						}
+						// 隐藏文本框
+						if (item.fieldstype == 'hidden') {
+							this.inner_list[index].data = item.data
+						}
+
+					})
+
+				})
+
+			},
+			// 提交内容
+			submit() {
+				console.log(this.inner_list)
+
+				// uni.showLoading({
+				// 	mask: true
+				// })
+
+				// this.$api.workflow_submit_apply({
+				// 	flow_set_id: this.flow_set_id,
+				// 	staff_num: uni.getStorageSync('user').staff_num,
+				// 	data_list: JSON.stringify(this.inner_list)
+				// }).then((res) => {
+				// 	uni.hideLoading()
+
+				// 	if (res.data.code == '0000') {
+				// 		uni.showToast({
+				// 			icon: "none",
+				// 			title: res.data.content.msg
+				// 		})
+				// 	} else {
+
+				// 	}
+
+				// 	console.log(res.data)
+				// })
+
+			},
+
+
+			// 获取部门和人员
+			get_user() {
+				this.$api.section_getSectionStaff({
+
+				}).then((res) => {
+					// console.log(res.data.data)
+					this.user_list = res.data.data
+				})
+			},
+
+			// 文本框
+			blur_text(e, index) {
+				console.log(e.detail.value, index)
+
+				this.inner_list[index].data = e.detail.value
+			},
+
+			// 文本域
+			blur_textarea(e, index) {
+				console.log(e.detail.value, index)
+
+				this.inner_list[index].data = e.detail.value
+			},
+
+			// 日期(Y-m-d 的日期格式)
+			change_time(e, index) {
+				console.log("-change事件:", e, index);
+
+				this.inner_list[index].data = e
+			},
+
+
+			// 多选人员 选择部门(单选) 选择部门(多选) 
+			change_select_box(e, index) {
+				console.log(e.detail.value, index)
+
+				this.inner_list[index].data = e.detail.value
+			},
+
+			// 下拉框
+			select_showActionSheet(data, index) {
+				let array = []
+
+				data.forEach((item, index) => {
+					array.push(item.name)
+				})
+
+				uni.showActionSheet({
+					itemList: array,
+					success: (res) => {
+						console.log('选中了第' + (res.tapIndex + 1) + '个按钮');
+						console.log(data[res.tapIndex].id, index)
+						this.inner_list[index].data = data[res.tapIndex]
+					},
+				});
+
+
+				// 上传图片
+				// uni.chooseImage({
+				// 	count: 1,
+				// 	sourceType: ['camera'],
+				// 	success: (chooseImageRes) => {
+				// 		const tempFilePaths = chooseImageRes.tempFilePaths;
+				// 		console.log(tempFilePaths)
+				// 		console.log(chooseImageRes.tempFiles[0]);
+
+
+				// 		uni.uploadFile({
+				// 			url: this.base_url + "/worksheet/design/up_images",
+				// 			header: {
+				// 				'Authorization': 'Bearer ' + uni.getStorageSync('Authorization')
+				// 			},
+				// 			filePath: tempFilePaths[0],
+				// 			name: 'file',
+				// 			// formData只有H5存在
+				// 			formData: {
+				// 				image: chooseImageRes.tempFiles[0]
+				// 			},
+				// 			success: (uploadFileRes) => {
+				// 				console.log(uploadFileRes)
+				// 				console.log(uploadFileRes.data);
+				// 				console.log(JSON.parse(uploadFileRes.data));
+
+
+				// 			}
+				// 		});
+				// 	}
+				// })
+			},
+
+			// time
+			bindTimeChange(e, index) {
+				console.log(e.detail.value, index)
+				this.inner_list[index].data = e.detail.value
+			},
+
+
+			// 从全矿人员里单选
+			onnodeclick(node, index) {
+				console.log(node.value, index)
+				this.inner_list[index].data = node.value
+			}
+		}
+	}
+</script>
+
+
+<style lang="scss">
+	page {
+		background-color: #009FE8;
+		box-sizing: border-box;
+		padding: 25rpx;
+	}
+
+	.content {
+		margin-bottom: 30rpx;
+		background-color: #FFFFFF;
+		border-radius: 10rpx;
+
+		box-sizing: border-box;
+		padding: 30rpx 25rpx;
+
+		.inner {
+			margin-bottom: 25rpx;
+
+			.input_box {
+				font-size: 32rpx;
+
+				.label {
+					margin: 15rpx 0;
+					line-height: 50rpx;
+					color: #6C6F74;
+
+					text {
+						color: red;
+					}
+				}
+
+				.box {
+					width: 650rpx;
+					background: #FFFFFF;
+					border-radius: 8rpx;
+					border: 2rpx solid #E9EBF2;
+
+					box-sizing: border-box;
+					padding: 20rpx 25rpx;
+
+					// 文本域
+					textarea {
+						min-height: 120rpx;
+					}
+
+					// 选择时间
+					/deep/.uni-date-editor--x {
+						.uniui-clear {
+							display: none;
+						}
+					}
+
+					/deep/.uni-date-x--border {
+						box-sizing: border-box;
+						border-radius: 4px;
+						border: none;
+					}
+
+					/deep/.uni-date-x {
+						padding: 0;
+					}
+				}
+
+				// 日期(Y-m-d 的日期格式)
+				.date_box {
+					padding: 2rpx 25rpx;
+				}
+
+				// 下拉选择 下拉菜单
+				.select_box {
+					display: flex;
+					justify-content: space-between;
+				}
+			}
+		}
+	}
+	
+	.btn {
+		margin-top: 40rpx;
+		background-color: #009FE8;
+		padding: 25rpx 50rpx;
+		color: #FFFFFF;
+		text-align: center;
+	}
+	
+	.approval_btn {
+		margin-top: 40rpx;
+
+		display: flex;
+		justify-content: space-between;
+
+		.btn {
+			width: 250rpx;
+			background-color: #009FE8;
+			padding: 25rpx;
+			color: #FFFFFF;
+			text-align: center;
+		}
+
+		.btn:nth-child(2) {
+			background-color: #E43D33;
+		}
+
+	}
+</style>

+ 118 - 0
pages/origanization/OA/approval_list/approval_list - UI页面.vue

@@ -0,0 +1,118 @@
+<template>
+	<view>
+		<view class="list">
+			<view class="item" v-for="item in 6">
+				<view class="title">用车申请</view>
+				<view class="box">
+					<view class="left">
+						<view class="line">申请人:申请人姓名</view>
+						<view class="line">单号:XA-ymd_045</view>
+						<view class="line">申请日期:2022-01-13 13:25:32</view>
+					</view>
+					<view class="right">
+						<view class="btn" @click="go_detail('用车申请')">详情</view>
+						<view class="btn" @click="go_approval('用车申请')">操作</view>
+					</view>
+				</view>
+				<view class="tip">待处理</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+
+			};
+		},
+		methods:{
+			go_detail(title){
+				uni.navigateTo({
+					url:"./detail/detail?title="+title
+				})
+			},
+			go_approval(title){
+				uni.navigateTo({
+					url:"./approval/approval?title="+title
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	page {
+		background-color: #F2FAF7;
+
+		box-sizing: border-box;
+		padding: 20rpx 25rpx;
+	}
+
+	.list {
+		.item {
+			position: relative;
+			overflow: hidden;
+			background-color: #FFFFFF;
+			
+			box-sizing: border-box;
+			padding: 25rpx;
+
+			border-radius: 15rpx;
+			margin-bottom: 30rpx;
+			
+			.title{
+				height: 70rpx;
+				line-height: 70rpx;
+				font-size: 36rpx;
+				font-weight: 700;
+			}
+			.box{
+				margin-top: 10rpx;
+				display: flex;
+				justify-content: space-between;
+				.left {
+					height: 140rpx;
+					
+					display: flex;
+					flex-direction: column;
+					justify-content: space-between;
+					.line{
+						font-size: 28rpx;
+						color: #7f7f7f;
+					}
+				}
+				
+				.right {
+					height: 140rpx;
+					display: flex;
+					flex-direction: column;
+					justify-content: space-between;
+					
+					.btn{
+						font-size: 28rpx;
+						background-color: #E1F7FF;
+						color: #1e88e5;
+						padding: 10rpx 30rpx;
+						border-radius: 40rpx;
+					}
+				}
+			}
+			.tip{
+				transform: rotate(45deg);
+				
+				background-color: #04A0E6;
+				color: #FFFFFF;
+				
+				position: absolute;
+				top: -10rpx;
+				right: -50rpx;
+				
+				font-size: 24rpx;
+				padding: 30rpx 40rpx 10rpx;
+				
+			}
+		}
+	}
+</style>

+ 126 - 0
pages/origanization/OA/approval_list/approval_list.vue

@@ -0,0 +1,126 @@
+<template>
+	<view>
+		<view class="list">
+			<view class="item" v-for="(item,index) in list" :key="index" @click="go_approval(item.flow_set_id,item.flow_set_name)">
+				<view class="title">{{item.flow_set_name}}</view>
+				<view class="box">
+					<view class="left">
+						<view class="line">申请人:{{item.optname}}</view>
+						<view class="line">单号:{{item.flow_set_id}}</view>
+						<view class="line">申请日期:{{item.optdt}}</view>
+					</view>
+				</view>
+				<view class="tip" v-if="item.status == 0">待审核</view>
+				<view class="tip" v-if="item.status == 1" style="background-color: #67C23A;">已通过</view>
+				<view class="tip" v-if="item.status == 2" style="background-color: #F56C6C;">已驳回</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				list:[]
+			};
+		},
+		onLoad() {
+			this.get_workflow_get_check_list()
+		},
+		methods:{
+			get_workflow_get_check_list(){
+				this.$api.workflow_get_check_list({
+					staff_num: uni.getStorageSync('user').staff_num,
+					status:""
+				}).then((res)=>{
+					console.log(res.data.content.data)
+					
+					this.list = res.data.content.data
+				})
+			},
+			
+			// 前往审核
+			go_approval(id,flow_set_name){
+				uni.navigateTo({
+					url:"./approval/approval?flow_set_id="+id+"&title="+flow_set_name
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	page {
+		background-color: #F2FAF7;
+
+		box-sizing: border-box;
+		padding: 20rpx 25rpx;
+	}
+
+	.list {
+		.item {
+			position: relative;
+			overflow: hidden;
+			background-color: #FFFFFF;
+			
+			box-sizing: border-box;
+			padding: 25rpx;
+
+			border-radius: 15rpx;
+			margin-bottom: 30rpx;
+			
+			.title{
+				height: 70rpx;
+				line-height: 70rpx;
+				font-size: 36rpx;
+				font-weight: 700;
+			}
+			.box{
+				margin-top: 10rpx;
+				display: flex;
+				justify-content: space-between;
+				.left {
+					height: 140rpx;
+					
+					display: flex;
+					flex-direction: column;
+					justify-content: space-between;
+					.line{
+						font-size: 28rpx;
+						color: #7f7f7f;
+					}
+				}
+				
+				.right {
+					height: 140rpx;
+					display: flex;
+					flex-direction: column;
+					justify-content: space-between;
+					
+					.btn{
+						font-size: 28rpx;
+						background-color: #E1F7FF;
+						color: #1e88e5;
+						padding: 10rpx 30rpx;
+						border-radius: 40rpx;
+					}
+				}
+			}
+			.tip{
+				transform: rotate(45deg);
+				
+				background-color: #04A0E6;
+				color: #FFFFFF;
+				
+				position: absolute;
+				top: -10rpx;
+				right: -50rpx;
+				
+				font-size: 24rpx;
+				padding: 30rpx 40rpx 10rpx;
+				
+			}
+		}
+	}
+</style>

+ 600 - 0
pages/origanization/OA/approval_list/detail/detail.vue

@@ -0,0 +1,600 @@
+<template>
+	<view>
+		<!-- 提交内容 -->
+		<view class="content" v-if="list.length > 0">
+			<!-- <view class="title">填写人:测试用户</view> -->
+
+			<view class="inner" v-for="(item,index) in list" :key="index">
+				<!-- 文本框 -->
+				<view class="input_box" v-if="item.fieldstype == 'text'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}:</view>
+					<view class="box">
+						<input type="text" @blur="blur_text($event,index)" :placeholder="'请输入'+item.name" />
+					</view>
+				</view>
+				<!-- 文本域 -->
+				<view class="input_box" v-if="item.fieldstype == 'textarea'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}</view>
+					<view class="box">
+						<textarea @blur="blur_textarea($event,index)" auto-height="true"
+							:placeholder="'请输入'+item.name" />
+					</view>
+				</view>
+				<!-- 日期(Y-m-d 的日期格式) -->
+				<view class="input_box" v-if="item.fieldstype == 'date'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}:</view>
+					<view class="box date_box">
+						<uni-datetime-picker type="date" @change="change_time($event,index)" />
+					</view>
+				</view>
+				<!-- Y-m-d H:i:s的格式 -->
+				<view class="input_box" v-if="item.fieldstype == 'datetime'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}:</view>
+					<view class="box date_box">
+						<uni-datetime-picker type="datetime" @change="change_time($event,index)" />
+					</view>
+				</view>
+				<!-- 选择人员(多选) 返回{"id","name"}格式,提交时传id -->
+				<view class="input_box" v-if="item.fieldstype == 'changeusercheck'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}(多选):</view>
+					<view class="box">
+						<uni-data-checkbox multiple :map="{text:'name',value:'id'}" :localdata="item.data"
+							@change="change_select_box($event,index)"></uni-data-checkbox>
+					</view>
+				</view>
+				<!-- 选择人员(单选) 返回{"id","name"}格式,提交时传id -->
+				<view class="input_box" v-if="item.fieldstype == 'changeuser'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}(单选):</view>
+					<view class="box">
+						<uni-data-checkbox :map="{text:'name',value:'id'}" :localdata="item.data"
+							@change="change_select_box($event,index)"></uni-data-checkbox>
+					</view>
+				</view>
+
+
+
+				<view class="input_box" v-if="item.fieldstype == 'changeuser'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}(单选):</view>
+					<view class="box">
+						<view class="box_label">
+							<label v-for="(item_2,index_2) in item.data" :key="index_2">
+								<checkbox style="transform:scale(0.7)" :value="item_2.name" :checked="true" />
+								<text style="color: #007AFF;">{{item_2.name}}</text>
+							</label>
+						</view>
+					</view>
+				</view>
+				<view class="input_box" v-if="item.fieldstype == 'changeuser'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}(单选):</view>
+					<view class="box">
+						<view class="box_label">
+							<label v-for="(item_2,index_2) in item.data" :key="index_2">
+								<radio style="transform:scale(0.7)" :value="item_2.name" :checked="true" />
+								<text style="color: #007AFF;">{{item_2.name}}</text>
+							</label>
+						</view>
+					</view>
+				</view>
+				<!-- 选择部门(单选) 返回{"id","name"}格式,提交时传id -->
+				<view class="input_box" v-if="item.fieldstype == 'changedept'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}(单选):</view>
+					<view class="box">
+						<uni-data-checkbox :map="{text:'name',value:'id'}" :localdata="item.data.children[0].children"
+							@change="change_select_box($event,index)"></uni-data-checkbox>
+					</view>
+				</view>
+				<!-- 选择部门(多选) 返回{"id","name"}格式,提交时传id -->
+				<view class="input_box" v-if="item.fieldstype == 'changedeptcheck'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}(多选):</view>
+					<view class="box">
+						<uni-data-checkbox multiple :map="{text:'name',value:'id'}"
+							:localdata="item.data.children[0].children" @change="change_select_box($event,index)">
+						</uni-data-checkbox>
+					</view>
+				</view>
+				<!-- 单个复选框 返回{"key":"val"}格式,提交时传key	 -->
+				<!-- <view class="input_box" v-if="item.fieldstype == 'checkbox'">
+					checkbox{{index}}{{item.isbt}}
+				</view> -->
+				<!-- 多个复选框 返回{"key":"val"}格式,提交时传key	 -->
+				<view class="input_box" v-if="item.fieldstype == 'checkboxall'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}:</view>
+					<view class="box">
+						<uni-data-checkbox multiple :map="{text:'name',value:'id'}" :localdata="item.data"
+							@change="change_select_box($event,index)"></uni-data-checkbox>
+					</view>
+				</view>
+				<!-- 固定值 -->
+				<view class="input_box" v-if="item.fieldstype == 'fixed'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}:</view>
+					<view class="box">
+						{{inner_list[index].data}}
+					</view>
+				</view>
+				<!-- 隐藏文本框 -->
+				<view class="input_box" v-if="item.fieldstype == 'hidden'" v-show="false">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}:</view>
+					<view class="box">
+						{{inner_list[index].data}}
+					</view>
+				</view>
+				<!-- 数字 -->
+				<view class="input_box" v-if="item.fieldstype == 'number'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}:</view>
+					<view class="box">
+						<input type="number" @blur="blur_text($event,index)" :placeholder="'请输入'+item.name" />
+					</view>
+				</view>
+				<!-- 单选框 返回{"key":"val"}格式,提交时传key -->
+				<view class="input_box" v-if="item.fieldstype == 'radio'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}(单选):</view>
+					<view class="box">
+						<uni-data-checkbox :map="{text:'name',value:'id'}" :localdata="item.data"
+							@change="change_select_box($event,index)"></uni-data-checkbox>
+					</view>
+				</view>
+				<!-- 下拉框 返回{"key":"val"}格式,提交时传key -->
+				<view class="input_box" v-if="item.fieldstype == 'select'">
+					<!-- <view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}:下拉框{{index}}</view>
+					<view class="box select_box" @click="select_showActionSheet(item.data,index)">
+						<view>{{inner_list[index].data}}</view>
+						<view>
+							<uni-icons type="arrowdown"></uni-icons>
+						</view>
+					</view> -->
+
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}(单选):</view>
+					<view class="box">
+						<uni-data-checkbox :map="{text:'name',value:'id'}" :localdata="item.data"
+							@change="change_select_box($event,index)"></uni-data-checkbox>
+					</view>
+				</view>
+				<!-- H:i:s的格式 -->
+				<view class="input_box" v-if="item.fieldstype == 'time'">
+					<view class="label"><text v-if="item.isbt == 1"> * </text>{{item.name}}:</view>
+					<view class="box">
+						<picker mode="time" :value="inner_list[index].data" @change="bindTimeChange($event,index)">
+							<view class="uni-input" v-if="inner_list[index].data != ''">{{inner_list[index].data}}
+							</view>
+							<view class="uni-input" v-if="inner_list[index].data == ''">请选择时间</view>
+						</picker>
+					</view>
+
+				</view>
+
+			</view>
+
+			<view class="approval_box">
+				<view class="title">审批</view>
+				<view class="list">
+					<view class="item" v-for="item in 6">
+						<view class="left">
+							<view class="img">
+								<image
+									src="https://cdn.colorhub.me/mLTc_QwjdJe9PWaZ2Hy9vkjFMiV2uKzJRMj5qkPd9Ig/rs:fill:280:280:0/g:sm/bG9jYWw6Ly8vNTQv/ZDIvNDM2MTkxZGVi/NTYzMzk3NWZkNTUx/NjIzYWQzMzgxOWFk/NDdkNTRkMi5qcGc.jpg"
+									mode="aspectFill"></image>
+
+								<view class="tip">
+									<uni-icons type="checkbox-filled" color="#31ED55"></uni-icons>
+								</view>
+							</view>
+
+						</view>
+						<view class="right">
+							<view class="line">
+								<view class="label">发起申请</view>
+								<view class="time">2021.12.23 15:03</view>
+							</view>
+							<view class="line">
+								<view class="name">主管姓名(已同意)</view>
+							</view>
+							<view class="line">
+								<view class="tip">审批意见审批意见审批意见审批意见审批意见审批意见审批意见审批意见审批意见审批意见</view>
+							</view>
+							<view class="line_bottom">
+								<view class="tip">签名:</view>
+								<view class="img">
+									<image
+										src="https://cdn.colorhub.me/uJ7lu7Vl6XmX4zqenjbVB245jjJitvFvA7AT6wS92Xs/rs:fill:280:280:0/g:sm/bG9jYWw6Ly8vNWQv/YTYvMDRmOGI1ZjA3/Y2MyMGQxZmU5ZmJm/Y2Q3NmQzNjI3OTA2/NjNjNWRhNi5qcGVn.jpg"
+										mode="aspectFill"></image>
+								</view>
+							</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+
+
+
+	</view>
+</template>
+
+<script>
+	import {
+		set_base_url
+	} from '@/common/set_base_url.js'
+	export default {
+		data() {
+			return {
+				mine_code: "",
+				base_url: "",
+				// 单据table
+				table: "",
+				// 单据项目
+				list: [],
+
+				// 需要提交的数据
+				inner_list: [],
+
+
+				popup_checkbox_group: []
+			};
+		},
+		onLoad(option) {
+			// 初始化当前煤矿编码
+			this.mine_code = uni.getStorageSync('mine_code')
+			// 根据矿编码切换首页接口不同的请求基础路径
+			this.base_url = set_base_url(this.mine_code)
+			// 设置单据标题
+			uni.setNavigationBarTitle({
+				title: option.title
+			})
+			// 初始化单据标识
+			this.table = "admin"
+
+			// 获取单据详情
+			this.get_detail()
+
+		},
+		methods: {
+			// 获取单据详情
+			get_detail() {
+				uni.showLoading({
+					mask: true
+				})
+
+				uni.request({
+					method: "GET",
+					url: this.base_url + "/workflow/get_detail",
+					data: {
+						table: this.table,
+						staff_num: "123456"
+					},
+					success: (res) => {
+						uni.hideLoading()
+						console.log(res.data.content)
+
+						let data = res.data.content.data
+
+						this.list = data
+
+						// 设置提交的初始值
+						data.forEach((item, index) => {
+							this.inner_list.push({
+								fields: item.fields,
+								fieldstype: item.fieldstype,
+								isbt: item.isbt,
+								name: item.name,
+								data: ""
+							})
+
+							// 固定值
+							if (item.fieldstype == 'fixed') {
+								this.inner_list[index].data = item.data
+							}
+							// 隐藏文本框
+							if (item.fieldstype == 'hidden') {
+								this.inner_list[index].data = item.data
+							}
+
+						})
+					}
+				})
+
+			},
+			// 提交内容
+			submit() {
+				// // 必填项是否全部填写
+				// let isbt = true
+
+				// this.inner_list.forEach((item,index)=>{
+				// 	if(item.isbt == 1 && item.data == ""){
+				// 		// 必填项不完整
+				// 		isbt = false
+				// 		console.log(item,index)
+				// 		uni.showToast({
+				// 			icon:"none",
+				// 			title:"请补充必填项!"
+				// 		})
+				// 	}
+				// })
+
+				// console.log(isbt)
+
+
+				// // 必填项全部填写提交
+				// if(isbt){
+				// 	console.log(this.list)
+				// 	console.log(this.inner_list)
+				// }
+
+				console.log(this.inner_list)
+
+				uni.showLoading({
+					mask: true
+				})
+				uni.request({
+					method: "POST",
+					url: this.base_url + "/workflow/submit_apply",
+					data: {
+						data: this.inner_list
+					},
+					success: (res) => {
+						uni.hideLoading()
+
+						uni.showToast({
+							icon: "none",
+							title: "提交成功!"
+						})
+						console.log(res)
+					}
+				})
+			},
+
+			// 文本框
+			blur_text(e, index) {
+				console.log(e.detail.value, index)
+
+				this.inner_list[index].data = e.detail.value
+			},
+
+			// 文本域
+			blur_textarea(e, index) {
+				console.log(e.detail.value, index)
+
+				this.inner_list[index].data = e.detail.value
+			},
+
+			// 日期(Y-m-d 的日期格式)
+			change_time(e, index) {
+				console.log("-change事件:", e, index);
+
+				this.inner_list[index].data = e
+			},
+
+
+			// 多选人员 选择部门(单选) 选择部门(多选) 
+			change_select_box(e, index) {
+				console.log(e.detail.value, index)
+
+				this.inner_list[index].data = e.detail.value
+			},
+
+			// 下拉框
+			// select_showActionSheet(data, index) {
+			// 	uni.showActionSheet({
+			// 		itemList: data,
+			// 		success: (res) => {
+			// 			console.log('选中了第' + (res.tapIndex + 1) + '个按钮');
+			// 			this.inner_list[index].data = data[res.tapIndex]
+			// 		},
+			// 	});
+			// },
+
+			// time
+			bindTimeChange(e, index) {
+				console.log(e.detail.value, index)
+				this.inner_list[index].data = e.detail.value
+			},
+		}
+	}
+</script>
+
+
+<style lang="scss">
+	page {
+		background-color: #009FE8;
+		box-sizing: border-box;
+		padding: 25rpx;
+	}
+
+	.content {
+		background-color: #FFFFFF;
+		border-radius: 10rpx;
+
+		box-sizing: border-box;
+		padding: 30rpx 25rpx;
+
+		.title {
+			line-height: 80rpx;
+			color: #2980B9;
+			font-size: 38rpx;
+			font-weight: 500;
+			margin-bottom: 20rpx;
+		}
+
+		.inner {
+			margin-bottom: 25rpx;
+
+			.input_box {
+				font-size: 32rpx;
+
+				.label {
+					margin: 15rpx 0;
+					line-height: 50rpx;
+					color: #6C6F74;
+
+					text {
+						color: red;
+					}
+				}
+
+				.box {
+					width: 650rpx;
+					background: #FFFFFF;
+					border-radius: 8rpx;
+					border: 2rpx solid #E9EBF2;
+
+					box-sizing: border-box;
+					padding: 20rpx 25rpx;
+
+					// 文本域
+					textarea {
+						min-height: 120rpx;
+					}
+
+					// 选择时间
+					/deep/.uni-date-editor--x {
+						.uniui-clear {
+							display: none;
+						}
+					}
+
+					/deep/.uni-date-x--border {
+						box-sizing: border-box;
+						border-radius: 4px;
+						border: none;
+					}
+
+					/deep/.uni-date-x {
+						padding: 0;
+					}
+
+					.box_label {
+						font-size: 28rpx;
+						color: #666;
+
+						display: flex;
+						// justify-content: space-around;
+						flex-wrap: wrap;
+						.uni-label-pointer {
+							display: flex;
+							align-items: center;
+							
+							margin-right: 35rpx;
+						}
+					}
+				}
+
+				// 日期(Y-m-d 的日期格式)
+				.date_box {
+					padding: 2rpx 25rpx;
+				}
+
+				// 下拉选择 下拉菜单
+				.select_box {
+					display: flex;
+					justify-content: space-between;
+				}
+			}
+		}
+
+
+		.approval_box {
+			width: 650rpx;
+
+			.title {
+				font-size: 36rpx;
+				font-weight: 700;
+				color: #000000;
+			}
+
+			.list {
+				margin-left: 50rpx;
+
+				.item {
+					margin-bottom: 20rpx;
+					display: flex;
+					justify-content: space-between;
+
+					border-left: 2rpx solid #DCDCDC;
+
+					.left {
+						position: relative;
+						left: -50rpx;
+
+						.img {
+							width: 100rpx;
+							height: 100rpx;
+
+							position: relative;
+
+							image {
+								width: 100rpx;
+								height: 100rpx;
+								border-radius: 50%;
+								overflow: hidden;
+							}
+
+							.tip {
+								position: absolute;
+								bottom: -10rpx;
+								right: -10rpx;
+							}
+						}
+
+					}
+
+					.right {
+						.line {
+							display: flex;
+							justify-content: space-between;
+							align-items: center;
+
+							.label {}
+
+							.time {
+								font-size: 28rpx;
+								color: #a9a9a9;
+							}
+
+							.name {
+								height: 80rpx;
+								line-height: 80rpx;
+								font-size: 28rpx;
+								color: #a9a9a9;
+							}
+
+							.tip {
+								background-color: #E5E5E5;
+								border-radius: 6rpx;
+								color: #666666;
+								font-size: 28rpx;
+								box-sizing: border-box;
+								padding: 10rpx;
+							}
+						}
+
+						.line_bottom {
+							margin-top: 30rpx;
+							padding-bottom: 20rpx;
+							border-bottom: 2rpx solid #DCDCDC;
+							display: flex;
+
+							.tip {
+								font-size: 28rpx;
+								color: #a9a9a9;
+							}
+
+							.img {
+								image {
+									width: 280rpx;
+									height: 90rpx;
+								}
+							}
+						}
+					}
+				}
+
+				.item:last-child {
+					border: 0;
+
+					.line_bottom {
+						border: 0;
+					}
+				}
+			}
+		}
+	}
+</style>

+ 41 - 0
pages/origanization/OA/h5/h5.vue

@@ -0,0 +1,41 @@
+<template>
+	<view>
+		<web-view update-title :src="href"></web-view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				href: ""
+			};
+		},
+		onLoad(option) {
+			// #ifndef APP-NVUE
+			const eventChannel = this.getOpenerEventChannel();
+			// #endif
+			// 监听acceptDataFromOpenerPage事件,获取上一页面通过eventChannel传送到当前页面的数据
+			eventChannel.on('acceptDataFromOpenerPage', (data) => {
+				console.log(data)
+				
+				let url = escape(data.url)
+					console.log(url)
+					console.log(unescape(url))
+				
+				// this.href = "http://oa_system.nxjiewei.com:8011/oa_login?staff_num=" + uni.getStorageSync('user').staff_num + "&url=" + url
+				
+				
+				this.href = "http://webdevelop.nxjiewei.com/assets/html/zhks-quankuang/ningdongyunying/download/oa_login/?staff_num=" + uni.getStorageSync('user').staff_num + "&url=" + url
+				
+				// this.href = "http://oa_system.nxjiewei.com:8011/?m=ying&d=we&mnum=carmrese&show=we&hideheader=true"
+			})
+			
+			// this.href = "http://oa_system.nxjiewei.com:8011/oa_login?staff_num=" + uni.getStorageSync('user').staff_num + "&url=" + escape("http://oa_system.nxjiewei.com:8011/?m=ying&d=we&num=flow&hideheader=true")
+		}
+	}
+</script>
+
+<style lang="scss">
+
+</style>

+ 189 - 0
pages/origanization/news/tab_1/all_list/all_list - 副本.vue

@@ -0,0 +1,189 @@
+<template>
+	<view class="content">
+		<view class="list">
+			<view class="item">
+				<scroll-view scroll-x>
+					<view class="inner">
+						<view class="line">
+							<view class="box">
+								<view class="text text_1">序号</view>
+							</view>
+							<view class="box">
+								<view class="text text_2">检查时间</view>
+							</view>
+							<view class="box">
+								<view class="text text_3">检查地点</view>
+							</view>
+							<view class="box">
+								<view class="text text_4">检查人</view>
+							</view>
+							<view class="box">
+								<view class="text text_5">问题类型</view>
+							</view>
+							<view class="box">
+								<view class="text text_6">问题或隐患描述</view>
+							</view>
+							<view class="box">
+								<view class="text text_7">整改措施</view>
+							</view>
+							<view class="box">
+								<view class="text text_8">完成日期</view>
+							</view>
+							<view class="box">
+								<view class="text text_9">详情</view>
+							</view>
+						</view>
+						<view class="line" v-for="item in 16">
+							<view class="icon">
+								<image src="./icon/new.png" mode=""></image>
+							</view>
+							<view class="box">
+								<view class="text text_1">{{item}}</view>
+							</view>
+							<view class="box">
+								<view class="text text_2">2021-12-25</view>
+							</view>
+							<view class="box">
+								<view class="text text_3">红柳机房</view>
+							</view>
+							<view class="box">
+								<view class="text text_4">李建中、牛之星、李雅婷</view>
+							</view>
+							<view class="box">
+								<view class="text text_5">标准化</view>
+							</view>
+							<view class="box">
+								<view class="text text_6">问题或隐患描述问题或隐患描述问题或隐患描述问题或隐患描述问题或隐患描述问题或隐患描述问题或隐患描述问题或隐患描述
+								</view>
+							</view>
+							<view class="box">
+								<view class="text text_7">整改措施整改措施整改措施整改措施整改措施整改措施</view>
+							</view>
+							<view class="box">
+								<view class="text text_8">2021-12-31</view>
+							</view>
+							<view class="box">
+								<view class="text text_9">查看</view>
+							</view>
+						</view>
+		
+		
+					</view>
+				</scroll-view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				
+			};
+		}
+	}
+</script>
+
+<style lang="scss">
+	.list {
+		.item {
+			background-color: #FFFFFF;
+			border-radius: 20rpx;
+			.inner {
+				.line {
+					display: flex;
+					align-items: center;
+					
+					position: relative;
+					
+					.icon{
+						position: absolute;
+						top: -10rpx;
+						right: 0;
+						image{
+							width: 33rpx;
+							height: 18rpx;
+						}
+					}
+	
+					.box {
+						display: flex;
+						align-items: center;
+						height: 90rpx;
+						box-sizing: border-box;
+						border: 1rpx solid #D9D9D9;
+	
+						.text {
+							font-size: 26rpx;
+							color: #333333;
+							text-align: center;
+	
+							text-overflow: -o-ellipsis-lastline;
+							overflow: hidden;
+							text-overflow: ellipsis;
+							display: -webkit-box;
+							-webkit-line-clamp: 2;
+							line-clamp: 2;
+							-webkit-box-orient: vertical;
+						}
+	
+						.text_1 {
+							width: 80rpx;
+						}
+	
+						.text_2 {
+							width: 220rpx;
+						}
+	
+						.text_3 {
+							width: 200rpx;
+						}
+	
+						.text_4 {
+							width: 400rpx;
+						}
+	
+						.text_5 {
+							width: 200rpx;
+						}
+	
+						.text_6 {
+							width: 500rpx;
+							padding: 0 10rpx;
+						}
+	
+						.text_7 {
+							width: 500rpx;
+							padding: 0 10rpx;
+						}
+	
+						.text_8 {
+							width: 200rpx;
+						}
+	
+						.text_9 {
+							width: 200rpx;
+						}
+					}
+	
+				}
+	
+				.line:nth-child(1) {
+					.box {
+						height: 80rpx;
+						background-color: #D8D8D8;
+	
+						.text {
+							font-size: 28rpx;
+							color: #000000;
+						}
+					}
+				}
+	
+			}
+	
+			
+		}
+	}
+</style>

+ 68 - 167
pages/origanization/news/tab_1/all_list/all_list.vue

@@ -1,76 +1,27 @@
 <template>
-	<view class="content">
-		<view class="list">
-			<view class="item">
-				<scroll-view scroll-x>
-					<view class="inner">
-						<view class="line">
-							<view class="box">
-								<view class="text text_1">序号</view>
-							</view>
-							<view class="box">
-								<view class="text text_2">检查时间</view>
-							</view>
-							<view class="box">
-								<view class="text text_3">检查地点</view>
-							</view>
-							<view class="box">
-								<view class="text text_4">检查人</view>
-							</view>
-							<view class="box">
-								<view class="text text_5">问题类型</view>
-							</view>
-							<view class="box">
-								<view class="text text_6">问题或隐患描述</view>
-							</view>
-							<view class="box">
-								<view class="text text_7">整改措施</view>
-							</view>
-							<view class="box">
-								<view class="text text_8">完成日期</view>
-							</view>
-							<view class="box">
-								<view class="text text_9">详情</view>
-							</view>
+	<view>
+		<view class="content" v-if="list != ''">
+			<uni-table border emptyText="暂无更多数据">
+				<!-- 表头行 -->
+				<uni-tr>
+					<uni-th align="center" width="60">序号</uni-th>
+					<uni-th align="center" v-for="(item,index) in list.name" :key="index">{{item}}</uni-th>
+					<uni-th align="center">查看</uni-th>
+				</uni-tr>
+				<!-- 表格数据行 -->
+				<uni-tr v-for="(item,index) in list.data.data" :key="index">
+					<uni-td align="center">
+						<view class="icon">
+							<image src="./icon/new.png" mode=""></image> <text style="margin-left: 10rpx;">{{index+1}}</text>
 						</view>
-						<view class="line" v-for="item in 16">
-							<view class="icon">
-								<image src="./icon/new.png" mode=""></image>
-							</view>
-							<view class="box">
-								<view class="text text_1">{{item}}</view>
-							</view>
-							<view class="box">
-								<view class="text text_2">2021-12-25</view>
-							</view>
-							<view class="box">
-								<view class="text text_3">红柳机房</view>
-							</view>
-							<view class="box">
-								<view class="text text_4">李建中、牛之星、李雅婷</view>
-							</view>
-							<view class="box">
-								<view class="text text_5">标准化</view>
-							</view>
-							<view class="box">
-								<view class="text text_6">问题或隐患描述问题或隐患描述问题或隐患描述问题或隐患描述问题或隐患描述问题或隐患描述问题或隐患描述问题或隐患描述
-								</view>
-							</view>
-							<view class="box">
-								<view class="text text_7">整改措施整改措施整改措施整改措施整改措施整改措施</view>
-							</view>
-							<view class="box">
-								<view class="text text_8">2021-12-31</view>
-							</view>
-							<view class="box">
-								<view class="text text_9">查看</view>
-							</view>
-						</view>
-		
+					</uni-td>
+					<uni-td align="center" v-for="(item_2,index_2) in item" :key="index_2">{{item_2}}</uni-td>
+					<uni-td align="center">
+						<view @click="chakan()">查看</view>
+					</uni-td>
+				</uni-tr>
 		
-					</view>
-				</scroll-view>
-			</view>
+			</uni-table>
 		</view>
 	</view>
 </template>
@@ -79,111 +30,61 @@
 	export default {
 		data() {
 			return {
+				table:"",
 				
+				page:1,
+				pageSize:30,
+				
+				list:""
 			};
+		},
+		onLoad(option) {
+			uni.setNavigationBarTitle({
+				title:option.title
+			})
+			
+			this.table = option.table
+			this.get_five_fixed_fiveFixedDetail()
+		},
+		methods:{
+			chakan(){
+				uni.navigateTo({
+					url:"../../../OA/approval_list/approval_list"
+				})
+			},
+			get_five_fixed_fiveFixedDetail(){
+				this.$api.five_fixed_fiveFixedDetail({
+					table:this.table,
+					page:this.page,
+					pageSize:this.pageSize
+				}).then((res)=>{
+					console.log(res.data.content.data)
+					
+					
+					this.list = res.data.content.data
+				})
+			}
 		}
 	}
 </script>
 
 <style lang="scss">
-	.list {
-		.item {
-			background-color: #FFFFFF;
-			border-radius: 20rpx;
-			.inner {
-				.line {
-					display: flex;
-					align-items: center;
-					
-					position: relative;
-					
-					.icon{
-						position: absolute;
-						top: -10rpx;
-						right: 0;
-						image{
-							width: 33rpx;
-							height: 18rpx;
-						}
-					}
-	
-					.box {
-						display: flex;
-						align-items: center;
-						height: 90rpx;
-						box-sizing: border-box;
-						border: 1rpx solid #D9D9D9;
-	
-						.text {
-							font-size: 26rpx;
-							color: #333333;
-							text-align: center;
-	
-							text-overflow: -o-ellipsis-lastline;
-							overflow: hidden;
-							text-overflow: ellipsis;
-							display: -webkit-box;
-							-webkit-line-clamp: 2;
-							line-clamp: 2;
-							-webkit-box-orient: vertical;
-						}
-	
-						.text_1 {
-							width: 80rpx;
-						}
-	
-						.text_2 {
-							width: 220rpx;
-						}
-	
-						.text_3 {
-							width: 200rpx;
-						}
-	
-						.text_4 {
-							width: 400rpx;
-						}
-	
-						.text_5 {
-							width: 200rpx;
-						}
-	
-						.text_6 {
-							width: 500rpx;
-							padding: 0 10rpx;
-						}
-	
-						.text_7 {
-							width: 500rpx;
-							padding: 0 10rpx;
-						}
-	
-						.text_8 {
-							width: 200rpx;
-						}
-	
-						.text_9 {
-							width: 200rpx;
-						}
-					}
-	
-				}
-	
-				.line:nth-child(1) {
-					.box {
-						height: 80rpx;
-						background-color: #D8D8D8;
-	
-						.text {
-							font-size: 28rpx;
-							color: #000000;
-						}
-					}
-				}
-	
-			}
+	.uni-table-th.table--border{
+		color: #000000;
+		background-color: #D8D8D8;
+	}
+	.uni-table-td.table--border{
+		color: #666666;
+	}
+
 	
-			
+	.icon{
+		position: relative;
+		top: 0;
+		right: 0;
+		image{
+			width: 33rpx;
+			height: 18rpx;
 		}
 	}
 </style>

BIN
pages/production/personnel_orientation/icon/overtime.png


+ 133 - 7
pages/production/personnel_orientation/personnel_orientation.vue

@@ -26,7 +26,23 @@
 					@touchstart="touchRing"></canvas>
 
 			</p-personnel-orientation-section-1>
-
+			
+			
+			<!-- <view class="overtime_box">
+				<view class="left">
+					<view class="icon">
+						<image src="./icon/overtime.png" mode=""></image>
+					</view>
+					<view class="text">井下超时人员统计</view>
+				</view>
+				<view class="right">
+					<view class="text">6</view>
+					<view class="icon">
+						<uni-icons type="arrowright" size="14"></uni-icons>
+					</view>
+				</view>
+			</view> -->
+			
 			<p-personnel-orientation-section-3>
 				<!-- 职能科室 -->
 				<view class="section_title">职能科室</view>
@@ -280,8 +296,36 @@
 			},
 			touchRing(e) {
 				canvaRing.showToolTip(e, {
-					format: function(item) {
+					// format: function(item) {
 
+					// 	return item.name + ':' + item.data + '人'
+					// },
+					format: (item) => {
+					
+						let _this = this;
+						let curTime = new Date().getTime();
+						let lastTime = _this.lastTapDiffTime;
+						_this.lastTapDiffTime = curTime;
+						//两次点击间隔小于300ms, 认为是双击
+						let diff = curTime - lastTime;
+						if (diff < 300) {
+							console.log("双击")
+						
+							uni.navigateTo({
+								url: "./depart-people/depart-people?title=" + item.name + "&id=" + item.name +
+									"&mine=" + this.mine
+							})
+						
+							//_this.handleVideo('screen',index)自定义事件
+							clearTimeout(_this.lastTapTimeoutFunc); // 成功触发双击事件时,取消单击事件的执行
+						} else {
+							// 单击事件延时300毫秒执行
+							_this.lastTapTimeoutFunc = setTimeout(function() {
+								console.log("单击")
+								//_this.handleVideo('playOrStop',index)自定义事件
+							}, 300);
+						}
+						
 						return item.name + ':' + item.data + '人'
 					}
 				});
@@ -346,12 +390,28 @@
 			},
 
 			go_depart_people(item) {
-				setTimeout(() => {
+				let _this = this;
+				let curTime = new Date().getTime();
+				let lastTime = _this.lastTapDiffTime;
+				_this.lastTapDiffTime = curTime;
+				//两次点击间隔小于300ms, 认为是双击
+				let diff = curTime - lastTime;
+				if (diff < 300) {
+					console.log("双击")
+				
 					uni.navigateTo({
 						url: "./depart-people/depart-people?title=" + item.name + "&id=" + item.id +
 							"&mine=" + this.mine
 					})
-				}, 1000)
+					//_this.handleVideo('screen',index)自定义事件
+					clearTimeout(_this.lastTapTimeoutFunc); // 成功触发双击事件时,取消单击事件的执行
+				} else {
+					// 单击事件延时300毫秒执行
+					_this.lastTapTimeoutFunc = setTimeout(function() {
+						console.log("单击")
+						//_this.handleVideo('playOrStop',index)自定义事件
+					}, 300);
+				}
 			},
 
 
@@ -410,11 +470,27 @@
 			},
 
 			go_depart_people_2(item) {
-				setTimeout(() => {
+				let _this = this;
+				let curTime = new Date().getTime();
+				let lastTime = _this.lastTapDiffTime;
+				_this.lastTapDiffTime = curTime;
+				//两次点击间隔小于300ms, 认为是双击
+				let diff = curTime - lastTime;
+				if (diff < 300) {
+					console.log("双击")
+				
 					uni.navigateTo({
 						url: "./depart-people-2/depart-people-2?title=" + item.name + "&mine=" + this.mine
 					})
-				}, 1000)
+					//_this.handleVideo('screen',index)自定义事件
+					clearTimeout(_this.lastTapTimeoutFunc); // 成功触发双击事件时,取消单击事件的执行
+				} else {
+					// 单击事件延时300毫秒执行
+					_this.lastTapTimeoutFunc = setTimeout(function() {
+						console.log("单击")
+						//_this.handleVideo('playOrStop',index)自定义事件
+					}, 300);
+				}
 			},
 
 
@@ -598,7 +674,7 @@
 			}
 
 			.text {
-				font-size: 32rpx;
+				font-size: 34rpx;
 				font-weight: 700;
 			}
 		}
@@ -616,4 +692,54 @@
 		}
 
 	}
+	
+	.overtime_box {
+		margin-top: 16rpx;
+		background: #FFFFFF;
+		box-shadow: 0rpx 3rpx 29rpx 0rpx rgba(59, 74, 116, 0.14);
+		border-radius: 20rpx;
+	
+		box-sizing: border-box;
+		padding: 0 50rpx;
+	
+		height: 110rpx;
+	
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+	
+		.left {
+			display: flex;
+	
+			.icon {
+				margin-right: 20rpx;
+	
+				image {
+					display: block;
+					width: 43rpx;
+					height: 43rpx;
+				}
+			}
+	
+			.text {
+				font-size: 34rpx;
+				font-weight: 700;
+			}
+		}
+	
+		.right {
+			display: flex;
+			align-items: center;
+			.text {
+				font-weight: 700;
+				color: #FF6A5C;
+				font-size: 36rpx;
+			}
+	
+			.icon {
+				margin-left: 10rpx;
+			}
+		}
+	
+	}
 </style>

+ 20 - 11
pages/production/personnel_orientation/search/search.vue

@@ -26,7 +26,8 @@
 
 		<!-- 搜索列表 -->
 		<view class="list">
-			<view class="item" v-for="(item,index) in list" :key="index" v-if="index < 100" @click="open(item.people_id)">
+			<!-- <view class="item" v-for="(item,index) in list" :key="index" v-if="index < 100" @click="open(item.people_id)"> -->
+			<view class="item" v-for="(item,index) in list" :key="index" v-if="index < 100" @click="open(item)">
 				<view class="avatar" :style="{backgroundColor:bgColor[index]}">{{item.remark.split('').pop()}}</view>
 				<view class="info">
 					<view class="name">{{item.remark}}</view>
@@ -123,17 +124,25 @@
 				
 			},
 			
-			open(people_id) {
-				console.log(people_id)
-				// 通过组件定义的ref调用uni-popup方法 ,如果传入参数 ,type 属性将失效 ,仅支持 ['top','left','bottom','right','center']
-				this.$refs.popup.open('center')
+			// open(people_id) {
+			// 	console.log(people_id)
+			// 	// 通过组件定义的ref调用uni-popup方法 ,如果传入参数 ,type 属性将失效 ,仅支持 ['top','left','bottom','right','center']
+			// 	this.$refs.popup.open('center')
 					
-				this.$p_api.personnel_people_info({
-					mine:this.mine,
-					people_id:people_id
-				}).then((res)=>{
-					console.log(res.data.data)
-					this.info = res.data.data
+			// 	this.$p_api.personnel_people_info({
+			// 		mine:this.mine,
+			// 		people_id:people_id
+			// 	}).then((res)=>{
+			// 		console.log(res.data.data)
+			// 		this.info = res.data.data
+			// 	})
+			// }
+			
+			open(item) {
+				console.log(item)
+
+				uni.navigateTo({
+					url:"../downhole_statistics/downhole_statistics?people_num="+item.people_id+"&depart_name="+item.dept_name+"&name="+item.remark+"&mine="+this.mine
 				})
 			}
 		}

+ 26 - 0
pages/production/qingshuiying/zidonghua_list/detail/detail.vue

@@ -0,0 +1,26 @@
+<template>
+	<view>
+		<web-view :src="url"></web-view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				url:""
+			};
+		},
+		onLoad(option) {
+			this.url = option.url
+			
+			uni.setNavigationBarTitle({
+				title:option.name
+			})
+		}
+	}
+</script>
+
+<style lang="scss">
+
+</style>

BIN
pages/production/qingshuiying/zidonghua_list/img/icon.png


BIN
pages/production/qingshuiying/zidonghua_list/img/psxt.jpg


BIN
pages/production/qingshuiying/zidonghua_list/img/tfgl.jpg


BIN
pages/production/qingshuiying/zidonghua_list/img/yfzd.jpg


BIN
pages/production/qingshuiying/zidonghua_list/img/zys.jpg


+ 294 - 0
pages/production/qingshuiying/zidonghua_list/zidonghua_list.vue

@@ -0,0 +1,294 @@
+<template>
+	<view>
+		<!-- 头图 -->
+		<view class="top_img">
+			<!-- 通风管理 -->
+			<view v-if="zdhxt == 'tfgl'">
+				<image src="./img/tfgl.jpg" mode=""></image>
+			</view>
+			<!-- 排水系统 -->
+			<view v-if="zdhxt == 'psxt'">
+				<image src="./img/psxt.jpg" mode=""></image>
+			</view>
+			<!-- 主运输 -->
+			<view v-if="zdhxt == 'zys'">
+				<image src="./img/zys.jpg" mode=""></image>
+			</view>
+		</view>
+		
+		<!-- 列表 -->
+		<view class="list">
+			<!-- 通风管理 -->
+			<view v-if="zdhxt == 'tfgl'">
+				<view class="item" v-for="(item,index) in data_tfgl" :key="index">
+					<view class="title" @click="item_active(index)">
+						<view class="left">
+							<view class="icon"></view>
+							<view class="name">
+								{{item.name}}
+							</view>
+						</view>
+						<view class="right" v-if="index != active">
+							<uni-icons type="arrowright"></uni-icons>
+						</view>
+						<view class="right" v-if="index == active">
+							<uni-icons type="arrowdown"></uni-icons>
+						</view>
+					</view>
+					<view class="inner_list" v-if="active == index">
+						<view class="inner_item" v-for="(item_2,index_2) in item.list" :key="index_2" @click="inner_item_active(item_2)">
+							<view class="inner_icon"></view>
+							<view class="inner_name">{{item_2.name}}</view>
+						</view>
+					</view>
+				</view>
+				
+			</view>
+			<!-- 压风制氮 -->
+			<view v-if="zdhxt == 'yfzd'">
+				<view class="item" v-for="(item,index) in data_yfzd" :key="index">
+					<view class="title" @click="item_active(index)">
+						<view class="left">
+							<view class="icon"></view>
+							<view class="name">
+								{{item.name}}
+							</view>
+						</view>
+						<view class="right" v-if="index != active">
+							<uni-icons type="arrowright"></uni-icons>
+						</view>
+						<view class="right" v-if="index == active">
+							<uni-icons type="arrowdown"></uni-icons>
+						</view>
+					</view>
+					<view class="inner_list" v-if="active == index">
+						<view class="inner_item" v-for="(item_2,index_2) in item.list" :key="index_2" @click="inner_item_active(item_2)">
+							<view class="inner_icon"></view>
+							<view class="inner_name">{{item_2.name}}</view>
+						</view>
+					</view>
+				</view>
+				
+			</view>
+			<!-- 排水系统 -->
+			<view v-if="zdhxt == 'psxt'">
+				<view class="item" v-for="(item,index) in data_psxt" :key="index">
+					<view class="title" @click="item_active(index)">
+						<view class="left">
+							<view class="icon"></view>
+							<view class="name">
+								{{item.name}}
+							</view>
+						</view>
+						<view class="right" v-if="index != active">
+							<uni-icons type="arrowright"></uni-icons>
+						</view>
+						<view class="right" v-if="index == active">
+							<uni-icons type="arrowdown"></uni-icons>
+						</view>
+					</view>
+					<view class="inner_list" v-if="active == index">
+						<view class="inner_item" v-for="(item_2,index_2) in item.list" :key="index_2" @click="inner_item_active(item_2)">
+							<view class="inner_icon"></view>
+							<view class="inner_name">{{item_2.name}}</view>
+						</view>
+					</view>
+				</view>
+				
+			</view>
+			<!-- 主运输 -->
+			<view v-if="zdhxt == 'zys'">
+				<view class="item" v-for="(item,index) in data_zys" :key="index">
+					<view class="title" @click="item_active(index)">
+						<view class="left">
+							<view class="icon"></view>
+							<view class="name">
+								{{item.name}}
+							</view>
+						</view>
+						<view class="right" v-if="index != active">
+							<uni-icons type="arrowright"></uni-icons>
+						</view>
+						<view class="right" v-if="index == active">
+							<uni-icons type="arrowdown"></uni-icons>
+						</view>
+					</view>
+					<view class="inner_list" v-if="active == index">
+						<view class="inner_item" v-for="(item_2,index_2) in item.list" :key="index_2" @click="inner_item_active(item_2)">
+							<view class="inner_icon"></view>
+							<view class="inner_name">{{item_2.name}}</view>
+						</view>
+					</view>
+				</view>
+				
+			</view>
+		</view>
+	
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				zdhxt:"",
+				active:0,
+				
+				
+				// 通风管理
+				data_tfgl:[
+					{
+						name:"清水营煤矿",
+						list:[
+							{
+								name:"通风系统",
+								url:"http://webdevelop.nxjiewei.com/assets/html/qingshuiying/zidonghua_app/#/pages/index/ztfxt/ztfxt"
+							}
+						]
+					}
+				],
+				// 排水系统
+				data_psxt:[
+					{
+						name:"清水营煤矿",
+						list:[
+							{
+								name:"主排水泵房786",
+								url:"http://webdevelop.nxjiewei.com/assets/html/qingshuiying/zidonghua_app/#/pages/index/786bf/786bf"
+							},
+							{
+								name:"主排水泵房11采区",
+								url:"http://webdevelop.nxjiewei.com/assets/html/qingshuiying/zidonghua_app/#/pages/index/11bf/11bf"
+							}
+						]
+					},
+					
+				],
+				// 主运输系统
+				data_zys:[
+					{
+						name:"清水营煤矿",
+						list:[
+							{
+								name:"06机巷皮带监控系统",
+								url:"http://webdevelop.nxjiewei.com/assets/html/qingshuiying/zidonghua_app/#/pages/index/06jx_pd/06jx_pd"
+							},
+							{
+								name:"07风巷皮带监控系统",
+								url:"http://webdevelop.nxjiewei.com/assets/html/qingshuiying/zidonghua_app/#/pages/index/07fx_pd/07fx_pd"
+							},
+							{
+								name:"二煤上山皮带监控系统",
+								url:"http://webdevelop.nxjiewei.com/assets/html/qingshuiying/zidonghua_app/#/pages/index/emss_pd/emss_pd"
+							},
+							{
+								name:"井下皮带监控系统",
+								url:"http://webdevelop.nxjiewei.com/assets/html/qingshuiying/zidonghua_app/#/pages/index/jx_pd/jx_pd"
+							}
+						]
+					},
+					
+				],
+				
+			}
+		},
+		onLoad(option) {
+			this.zdhxt = option.zdhxt
+			
+			if(this.zdhxt == 'tfgl'){
+				uni.setNavigationBarTitle({
+					title:"通风管理"
+				})
+			}else if(this.zdhxt == 'psxt'){
+				uni.setNavigationBarTitle({
+					title:"排水系统"
+				})
+			}
+		},
+		methods: {
+			inner_item_active(item_2){
+				console.log(item_2)
+				
+				uni.navigateTo({
+					url:"./detail/detail?url=" + item_2.url + "&name=" + item_2.name
+				})
+				
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	page{
+		background-color: #F7F7F7;
+	}
+	
+	.top_img{
+		image{
+			width: 750rpx;
+			height: 360rpx;
+		}
+	}
+	
+	.list{
+		padding-top: 20rpx;
+		.item{
+			background-color: #FFFFFF;
+			margin-bottom: 20rpx;
+			
+			box-sizing: border-box;
+			padding: 0 35rpx;
+			
+			.title{
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				
+				height: 110rpx;
+				border-bottom: 1rpx solid #f7f7f7;
+				.left{
+					display: flex;
+					align-items: center;
+					.icon{
+						width: 31rpx;
+						height: 27rpx;
+						
+						background-image: url(img/icon.png);
+						background-size: cover;
+						background-repeat: no-repeat;
+					}
+					.name{
+						margin-left: 26rpx;
+						font-size: 38rpx;
+					}
+				}
+				.right{
+					
+				}
+			}
+			.inner_list{
+				.inner_item{
+					display: flex;
+					align-items: center;
+					
+					height: 110rpx;
+					border-bottom: 1rpx solid #f7f7f7;
+					
+					padding-left: 96rpx;
+					.inner_icon{
+						width: 20rpx;
+						height: 20rpx;
+						background-color: #0992E5;
+						border-radius: 50%;
+					}
+					.inner_name{
+						margin-left: 29rpx;
+						font-size: 32rpx;
+						color: #8a8a8a;
+					}
+				}
+			}
+		}
+		
+	}
+</style>

+ 160 - 0
pages/production/safety_monitoring/safety_monitoring - 副本.vue

@@ -0,0 +1,160 @@
+<template>
+	<view>
+		<!-- navbar -->
+		<p-safety-monitoring-navbar :mine="mine"></p-safety-monitoring-navbar>
+		
+		<view style="margin-bottom: 200rpx;">
+			<!-- 模拟量 -->
+			<view v-if="active == 1">
+				<p-safety-monitoring-content-1 :mine="mine" :simulation="simulation" :simulationList="simulationList"></p-safety-monitoring-content-1>
+			</view>
+			<!-- 开关量 -->
+			<view v-if="active == 2">
+				<p-safety-monitoring-content-2 :mine="mine" :sluice="sluice" :sluiceList="sluiceList"></p-safety-monitoring-content-2>
+			</view>
+		</view>
+		
+		<!-- tabbar -->
+		<view class="tabbar">
+			<view class="list_item">
+				<view class="item" :class="active === 1 ? 'active':''" @click="click_item(1)">
+					<view class="item_icon icon_one"></view>
+					<view class="item_name">
+						模拟量
+					</view>
+				</view>
+				<view class="item" :class="active === 2 ? 'active':''" @click="click_item(2)">
+					<view class="item_icon icon_two"></view>
+					<view class="item_name">
+						开关量
+					</view>
+				</view>
+			</view>
+		</view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				mine:"",
+				
+				active:1,
+				
+				// 模拟量
+				// 监测统计
+				simulation:[],
+				simulationList:[],
+				
+				
+				// 开关量
+				sluice:[],
+				sluiceList:[],
+			};
+		},
+		onLoad(option) {
+			this.mine = option.mine
+			
+			
+			// 模拟量统计
+			this.getSimulation()
+			
+			
+			// 开关量统计
+			this.getSluice()
+			
+		},
+		methods:{
+			click_item(item){
+				this.active = item
+			
+			},
+			// 模拟量统计
+			getSimulation(){
+				uni.showLoading()
+				this.$p_api.jt_safety_simulation_total({
+					mine:this.mine,
+					mine_code:this.mine
+				}).then((res)=>{
+					uni.hideLoading()
+					// console.log(res)
+					this.simulation = res.data.content.total
+					this.simulationList = res.data.content.data
+				})
+			},
+			
+			// 开关量统计
+			getSluice(){
+				uni.showLoading()
+				this.$p_api.jt_safety_sluice_total({
+					mine:this.mine,
+					mine_code:this.mine
+				}).then((res)=>{
+					uni.hideLoading()
+					// console.log(res.data.content)
+					this.sluice = res.data.content.total
+					this.sluiceList = res.data.content.data
+				})
+				
+			},
+			
+		}
+	}
+</script>
+
+<style lang="scss">
+	.tabbar{
+		z-index: 999;
+		background-color: #fff;
+		position: fixed;
+		bottom: 0;
+		width: 750rpx;
+		.list_item{
+			width: 100%;
+			border-top: 2rpx solid #f3f3f3;
+			box-sizing: border-box;
+			padding: 12rpx 0;
+			
+			.item{
+				float: left;
+				width: 50%;
+				.item_icon{
+					margin: 0 auto;
+					width: 45rpx;
+					height: 45rpx;
+					
+					background-size: cover;
+					background-repeat: no-repeat;
+				}
+				.icon_one{
+					background-image: url(icon/ss1.png);
+				}
+				.icon_two{
+					background-image: url(icon/work.png);
+				}
+				.item_name{
+					text-align: center;
+					font-size: 25rpx;
+					font-family: PingFangSC-Regular, PingFang SC;
+					font-weight: 400;
+					color: #929292;
+					line-height: 40rpx;
+
+				}
+			}
+			.active{
+				.icon_one{
+					background-image: url(icon/ss2.png);
+				}
+				.icon_two{
+					background-image: url(icon/work_active.png);
+				}
+				.item_name{
+					color: #3498DB;
+				}
+			}
+		}
+	}
+</style>

+ 2 - 80
pages/production/safety_monitoring/safety_monitoring.vue

@@ -3,35 +3,7 @@
 		<!-- navbar -->
 		<p-safety-monitoring-navbar :mine="mine"></p-safety-monitoring-navbar>
 		
-		<view style="margin-bottom: 200rpx;">
-			<!-- 模拟量 -->
-			<view v-if="active == 1">
-				<p-safety-monitoring-content-1 :mine="mine" :simulation="simulation" :simulationList="simulationList"></p-safety-monitoring-content-1>
-			</view>
-			<!-- 开关量 -->
-			<view v-if="active == 2">
-				<p-safety-monitoring-content-2 :mine="mine" :sluice="sluice" :sluiceList="sluiceList"></p-safety-monitoring-content-2>
-			</view>
-		</view>
-		
-		<!-- tabbar -->
-		<view class="tabbar">
-			<view class="list_item">
-				<view class="item" :class="active === 1 ? 'active':''" @click="click_item(1)">
-					<view class="item_icon icon_one"></view>
-					<view class="item_name">
-						模拟量
-					</view>
-				</view>
-				<view class="item" :class="active === 2 ? 'active':''" @click="click_item(2)">
-					<view class="item_icon icon_two"></view>
-					<view class="item_name">
-						开关量
-					</view>
-				</view>
-			</view>
-		</view>
-		
+		678
 	</view>
 </template>
 
@@ -105,56 +77,6 @@
 </script>
 
 <style lang="scss">
-	.tabbar{
-		z-index: 999;
-		background-color: #fff;
-		position: fixed;
-		bottom: 0;
-		width: 750rpx;
-		.list_item{
-			width: 100%;
-			border-top: 2rpx solid #f3f3f3;
-			box-sizing: border-box;
-			padding: 12rpx 0;
-			
-			.item{
-				float: left;
-				width: 50%;
-				.item_icon{
-					margin: 0 auto;
-					width: 45rpx;
-					height: 45rpx;
-					
-					background-size: cover;
-					background-repeat: no-repeat;
-				}
-				.icon_one{
-					background-image: url(icon/ss1.png);
-				}
-				.icon_two{
-					background-image: url(icon/work.png);
-				}
-				.item_name{
-					text-align: center;
-					font-size: 25rpx;
-					font-family: PingFangSC-Regular, PingFang SC;
-					font-weight: 400;
-					color: #929292;
-					line-height: 40rpx;
+	
 
-				}
-			}
-			.active{
-				.icon_one{
-					background-image: url(icon/ss2.png);
-				}
-				.icon_two{
-					background-image: url(icon/work_active.png);
-				}
-				.item_name{
-					color: #3498DB;
-				}
-			}
-		}
-	}
 </style>

+ 106 - 0
pages/production/shangtang/shangtang - 过期验证.vue

@@ -0,0 +1,106 @@
+<template>
+	<view>
+		<web-view :src="href"></web-view>
+	</view>
+</template>
+
+<script>
+	import "@/common/time.js"
+
+	// 返回指定日期距今多少天
+	const daysComputed = time => {
+		let oldTimeFormat = new Date(time)
+		let nowDate = new Date()
+		if (nowDate.getTime() - oldTimeFormat.getTime() > 0) {
+			let times = nowDate.getTime() - oldTimeFormat.getTime()
+			let days = parseInt(times / (60 * 60 * 24 * 1000))
+			return days
+		} else {
+			throw ('传入时间不能大于当前日期')
+		}
+	}
+
+	// console.log(daysComputed('2022-02-26'))
+
+	export default {
+		data() {
+			return {
+				href: "",
+				
+				staff_num:"",
+				mine_code:""
+			};
+		},
+		onLoad() {
+			this.staff_num = uni.getStorageSync('user').staff_num
+			this.mine_code = uni.getStorageSync('mine_code')
+			
+			console.log(this.staff_num,this.mine_code)
+			
+			let shangtang_login_time = uni.getStorageSync('shangtang_login_time')
+
+			console.log(shangtang_login_time)
+
+			if (!uni.getStorageSync('shangtang_login_time')) {
+				console.log('第一次登录')
+				// 第一次登录
+				this.get_token()
+			} else {
+				// 有登录记录
+				console.log('有登录记录')
+				// 判断距离登录日期过去多少天
+				console.log(daysComputed(shangtang_login_time))
+				// 如果大于5天 重新登录
+				if (daysComputed(shangtang_login_time) > 2) {
+					console.log("大于2天")
+
+					this.get_token()
+				} else {
+					console.log("小于2天")
+					
+					// 小于5天,直接进入对应页面
+					this.href = "http://shangtang.nxjiewei.com:8011/?token=" + uni.getStorageSync('shangtang_token')
+				}
+			}
+
+		},
+		methods:{
+			get_token(){
+				uni.request({
+					// 登录 获取token
+					method:"POST",
+					url: "http://shangtang.nxjiewei.com:8011/v1/app/token/get",
+					header:{
+						"Content-Type": "application/json"
+					},
+					data: {
+						staff_num: this.staff_num,
+						area_code: this.mine_code
+					},
+					success: (res) => {
+						console.log(res.data.data)
+						
+						
+						// uni.setStorageSync('shangtang_token',res.data.data.access_token)
+						// uni.setStorageSync('shangtang_login_time',new Date().format("yyyy-MM-dd"))
+						
+						// 登录成功后进入对应页面
+						// 商汤链接+token
+						this.href = "http://shangtang.nxjiewei.com:8011/?token=" + uni.getStorageSync('shangtang_token')
+						// this.href = "http://shangtang.nxjiewei.com:8011/?token=" + res.data.data.access_token
+					},
+					fail: (err) => {
+						uni.showToast({
+							icon:"none",
+							title:err
+						})
+					}
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+
+</style>

+ 55 - 0
pages/production/shangtang/shangtang.vue

@@ -0,0 +1,55 @@
+<template>
+	<view>
+		<web-view :src="href"></web-view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				href: "",
+				
+				staff_num:"",
+				mine_code:""
+			};
+		},
+		onLoad() {
+			this.staff_num = uni.getStorageSync('user').staff_num
+			this.mine_code = uni.getStorageSync('mine_code')
+
+			this.get_token()
+		},
+		methods:{
+			get_token(){
+				uni.request({
+					// 登录 获取token
+					method:"POST",
+					url: "http://shangtang.nxjiewei.com:8011/v1/app/token/get",
+					header:{
+						"Content-Type": "application/json"
+					},
+					data: {
+						staff_num: this.staff_num,
+						area_code: this.mine_code
+					},
+					success: (res) => {
+						console.log(res.data.data)
+						
+						this.href = "http://shangtang.nxjiewei.com:8011/?token=" + res.data.data.access_token
+					},
+					fail: (err) => {
+						uni.showToast({
+							icon:"none",
+							title:err
+						})
+					}
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+
+</style>

+ 20 - 5
pages/tabbar/index/index.vue

@@ -4,7 +4,7 @@
 		<!-- notice -->
 		<t-i-notice :text="text"></t-i-notice>
 		<!-- banner -->
-		<t-i-banner :banner="banners"></t-i-banner>
+		<t-i-banner :banner="banners" :mine_code="mine_code"></t-i-banner>
 		<!-- 固定入口 -->
 		<t-i-icon :iconList="iconList" :mine_code="mine_code"></t-i-icon>
 		<!-- 常用功能 -->
@@ -19,7 +19,7 @@
 		
 		<!-- 羊场湾 -->
 		<view v-if="mine_code == 'yangchangwan'">
-			<t-i-yangchangwan :mine_code="mine_code"></t-i-yangchangwan>
+			<t-i-yangchangwan :mine_code="mine_code" :home_link="home_link"></t-i-yangchangwan>
 		</view>
 
 	</view>
@@ -47,7 +47,9 @@
 				// 值班公告
 				text: "暂无公告。",
 				// 固定入口
-				iconList: []
+				iconList: [],
+				// 首页链接
+				home_link:[]
 
 			}
 		},
@@ -110,6 +112,7 @@
 			this.get_notice()
 			// 固定入口
 			this.get_list()
+			this.get_home_link()
 		},
 		methods: {
 			// 获取轮播图
@@ -144,7 +147,8 @@
 						if (!res.data.data.content) {
 							this.text = res.data.data.message
 						} else {
-							this.text = res.data.data.content
+							this.text = res.data.data.content.replace(/<br /g," ").replace(/>/g," ").replace(/\//g," ")
+							// console.log(this.text)
 						}
 					}
 				})
@@ -159,7 +163,18 @@
 						this.iconList = res.data.data.data
 					}
 				})
-			}
+			},
+			// 首页链接
+			get_home_link() {
+				uni.request({
+					url: this.base_url + "/home/links",
+					method: "GET",
+					success: (res) => {
+						// console.log(res)
+						this.home_link = res.data.data
+					}
+				})
+			},
 
 		}
 

+ 1 - 0
pages/tabbar/origanization/origanization.vue

@@ -12,6 +12,7 @@
 		
 		<view v-if="mine_code == 'ningdongyunying'">
 			<t-o-news></t-o-news>
+			<!-- <t-o-origanization></t-o-origanization> -->
 		</view>
 	</view>
 </template>

+ 56 - 0
pages/tabbar/workbench/workbench - 副本.vue

@@ -0,0 +1,56 @@
+<template>
+	<view class="">
+		<!-- 枣泉 -->
+		<view v-if="mine_code == 'zaoquan'">
+			<!-- 有问题的组件 -->
+			<t-w-zaoquan :mine_code="mine_code"></t-w-zaoquan>
+		</view>
+		
+		<!-- 宁东运营 -->
+		<view v-if="mine_code == 'ningdongyunying'">
+			<!-- 有问题的组件 -->
+			<t-w-ningdongyunying :mine_code="mine_code"></t-w-ningdongyunying>
+		</view>
+		
+		<!-- 金家渠 -->
+		<view v-if="mine_code == 'jinjiaqu'">
+			<!-- 有问题的组件 -->
+			<t-w-jinjiaqu :mine_code="mine_code"></t-w-jinjiaqu>
+		</view>
+		
+		<!-- 羊场湾 -->
+		<view v-if="mine_code == 'yangchangwan'">
+			<!-- 有问题的组件 -->
+			<t-w-yangchangwan :mine_code="mine_code"></t-w-yangchangwan>
+		</view>
+		
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				// 当前煤矿编码
+				mine_code:"",
+				
+				
+				
+			}
+		},
+		onLoad() {
+			// 初始化当前煤矿编码
+			this.mine_code = uni.getStorageSync('mine_code')
+			
+		},
+		methods: {
+
+		}
+	}
+</script>
+
+<style lang="scss">
+	page{
+		background-color: #f5f5f5;
+	}
+</style>

+ 282 - 36
pages/tabbar/workbench/workbench.vue

@@ -1,29 +1,41 @@
 <template>
-	<view class="">
-		<!-- 枣泉 -->
-		<view v-if="mine_code == 'zaoquan'">
-			<!-- 有问题的组件 -->
-			<t-w-zaoquan :mine_code="mine_code"></t-w-zaoquan>
+	<view class="headers">
+		<view class="headers_img">
+			<image :src="header" mode="aspectFill"></image>
 		</view>
-		
-		<!-- 宁东运营 -->
-		<view v-if="mine_code == 'ningdongyunying'">
-			<!-- 有问题的组件 -->
-			<t-w-ningdongyunying :mine_code="mine_code"></t-w-ningdongyunying>
+		<view class="headers_nav">
+			<view class="headers_ul">
+				<view class="headers_li" v-for="(item,index) in nav" :key="index" @click="go_link(item)">
+					<view class="headers_li_img">
+						<image :src="item.icon" mode=""></image>
+					</view>
+					<view class="headers_li_text">
+						{{item.title}}
+					</view>
+				</view>
+			</view>
 		</view>
-		
-		<!-- 金家渠 -->
-		<view v-if="mine_code == 'jinjiaqu'">
-			<!-- 有问题的组件 -->
-			<t-w-jinjiaqu :mine_code="mine_code"></t-w-jinjiaqu>
-		</view>
-		
-		<!-- 羊场湾 -->
-		<view v-if="mine_code == 'yangchangwan'">
-			<!-- 有问题的组件 -->
-			<t-w-yangchangwan :mine_code="mine_code"></t-w-yangchangwan>
+
+
+		<view class="headers_list" v-for="(item,index) in module" :key="index">
+			<view class="headers_title">
+				<text class="headers_title_h1">
+					{{item.title}}
+				</text>
+			</view>
+			<view class="headers_ul">
+				<view class="headers_li" v-for="(items,index) in item.children" :key="index"
+					@click="go_link(items)">
+					<view class="headers_li_img">
+						<image :src="items.icon" mode=""></image>
+					</view>
+					<view class="headers_li_text">
+						{{items.title}}
+					</view>
+
+				</view>
+			</view>
 		</view>
-		
 	</view>
 </template>
 
@@ -32,32 +44,266 @@
 		data() {
 			return {
 				// 当前煤矿编码
-				mine_code:"",
-				
-				
-				
-			}
+				mine_code: "",
+
+				module: [],
+				nav: [],
+				header: "",
+			};
 		},
 		onLoad() {
 			// 初始化当前煤矿编码
 			this.mine_code = uni.getStorageSync('mine_code')
-			
+
+			this.getworkbench()
 		},
 		methods: {
+			getworkbench() {
+				this.$api.workbench_index({
+
+				}).then((res) => {
+					console.log(res)
+					this.header = res.data.data.header
+					this.nav = res.data.data.nav
+					this.module = res.data.data.module
+
+				})
+			},
+
+			go_link(item) {
+				// console.log(item)
+				
+				let link = item.link
+				
+				// OA系统
+				if(link.indexOf("oa_system.nxjiewei.com") != -1 ){
+					uni.navigateTo({
+						url:"../../origanization/OA/h5/h5",
+						success: (res) =>{
+							// 通过eventChannel向被打开页面传送数据
+							res.eventChannel.emit('acceptDataFromOpenerPage', {
+								url: link,
+							})
+						}
+					})
+					
+					return
+				}
+
+				// 二维码
+				if (link.indexOf("pageId") != -1 && link.indexOf("app:") == -1) {
+					let pageId = ""
+
+					function GetQueryString(name) {
+						var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
+						var r = link.match(reg);
+						if (r != null) return unescape(r[2]);
+						return null;
+					}
+					console.log(GetQueryString("pageId"))
+					if (GetQueryString("pageId")) {
+						pageId = GetQueryString("pageId")
+					} else {
+						pageId = link.split('=')[1]
+					}
+
+					uni.navigateTo({
+						url: "../../index/record/record?pageId=" + pageId + "&mine_code=" + this.mine_code,
+					})
+				}
+				// h5
+				if (link.indexOf("pageId") == -1 && link.indexOf("app:") == -1) {
+					console.log("H5")
+					// #ifdef APP
+					if (plus.os.name == 'Android') {
+					
+						if (link.indexOf("cmb.pb") != -1) {
+							plus.runtime.launchApplication({
+								pname: 'cmb.pb'
+							}, (e) => {
+								console.log('Open system default browser failed: ' + e.message)
+					
+								uni.showToast({
+									icon: "none",
+									title: "未安装此应用"
+								})
+							})
+						} else if (link.indexOf("com.icbc") != -1) {
+							plus.runtime.launchApplication({
+								pname: 'com.icbc'
+							}, (e) => {
+								console.log('Open system default browser failed: ' + e.message)
+					
+								uni.showToast({
+									icon: "none",
+									title: "未安装此应用"
+								})
+							})
+						} else {
+							uni.navigateTo({
+								url: "../../workbench/h5/h5?url=" + link
+							})
+						}
+					
+					
+					}
+					
+					// #endif
+					
+					// #ifdef H5
+					uni.navigateTo({
+						url: "../../workbench/h5/h5?url=" + link
+					})
+					// #endif
+				}
+
+				// 原生
+				if (link.indexOf("pageId") == -1 && link.indexOf("app:") != -1) {
+					console.log("原生")
+
+					console.log(link)
+					// 发票助手
+					if (link.indexOf("/workBench/invoice") != -1) {
+						console.log("发票助手")
+						uni.navigateTo({
+							url: "../../workbench/invoice_assistant/invoice_assistant"
+						})
+					} else if (link.indexOf("/news/news_win") != -1) {
+						console.log("通知公告")
+
+						uni.navigateTo({
+							url: "../../my/message-reminder/message-reminder"
+						})
+					} else if (link.indexOf("/workBench/getDuty") != -1) {
+						console.log("值班信息")
+
+						uni.navigateTo({
+							url: "../../workbench/duty_information/duty_information"
+						})
+					} else if (link.indexOf("/workBench/huiyiList") != -1) {
+						console.log("会议列表")
+						uni.navigateTo({
+							url: "../../workbench/meeting_arrangements/meeting_arrangements"
+						})
+					} else if (link.indexOf("/workBench/lifeCircleWin") != -1) {
+						console.log("生活圈")
+
+						uni.showToast({
+							icon: "none",
+							title: "暂未开通"
+						})
+					} else if (link.indexOf("/productionData/logging") != -1) {
+						console.log("下井记录")
+						// people_num 特殊值
+						if (!uni.getStorageSync('people_code')) {
+							uni.navigateTo({
+								url: "../../production/personnel_orientation/downhole_statistics/downhole_statistics?people_num=null&depart_name=" +
+									uni.getStorageSync('user').section + "&name=" + uni.getStorageSync('user')
+									.name + "&mine=640323B0011010019259"
+							})
+						} else {
+							uni.navigateTo({
+								url: "../../production/personnel_orientation/downhole_statistics/downhole_statistics?people_num=" +
+									uni.getStorageSync('user').people_code + "&depart_name=" + uni.getStorageSync(
+										'user').section + "&name=" + uni.getStorageSync('user').name +
+									"&mine=640323B0011010019259"
+							})
+						}
+
+					}else if(link.indexOf("/browseQrcode/gridSubmitItem_win") != -1){
+						console.log("网格排查")
+						uni.navigateTo({
+							url:"../../workbench/gridding/gridding"
+						})
+					}else if(link.indexOf("/workBench/evaluate") != -1){
+						console.log("干部评测")
+						uni.navigateTo({
+							url:"../../workbench/h5/h5?mine_code=zaoquan&workBench=pingce"
+						})
+					} else {
+						uni.showToast({
+							icon: "none",
+							title: "暂未开通"
+						})
+					}
+				}
+			}
+
+		},
 
-		}
 	}
 </script>
 
-<style lang="scss">
-	page{
-		background-color: #F3F8F7;
+<style>
+	page {
+		background-color: #F5F5F5;
+	}
+
+	.headers {
+		width: 100%;
+		background-color: #F5F5F5;
+	}
+
+	.headers_img>image {
+		width: 100%;
+		height: 360rpx;
+	}
+
+	.headers_nav {
+		width: 100%;
+		background-color: #FFFFFF;
+		margin-bottom: 25rpx;
+	}
+
+	.headers_ul {
+		width: 100%;
+		/* display: flex;
+		flex-wrap: wrap;
+		justify-content: space-between; */
+		margin-top: 10rpx;
+		overflow: hidden;
+	}
+
+	.headers_ul::after {
+		content: '';
+		width: 25%;
 	}
-</style>
 
+	.headers_title {
+		margin-left: 40rpx;
+		padding-top: 30rpx;
+		padding-bottom: 5rpx;
+	}
+
+	.headers_li {
+		float: left;
+
+		width: 25%;
+		text-align: center;
+		margin-bottom: 25rpx;
+		margin-top: 25rpx;
+	}
+
+	.headers_li_img>image {
+		width: 100rpx;
+		height: 100rpx;
+		margin-bottom: 10rpx;
+	}
+
+	.headers_li_text {
+		font-size: 14px;
+	}
+
+	.headers_title_h1 {
+		font-weight: 800;
+	}
+
+	.headers_list {
+		width: 100%;
+		background-color: #fff;
+	}
 
-<style lang="scss">
-	page{
-		background-color: #f5f5f5;
+	.ly-tree-node__label {
+		color: #000000;
 	}
 </style>

+ 1 - 1
pages/workbench/duty_information/duty_information.vue

@@ -50,7 +50,7 @@
 					</view>
 				</view>
 			</view>
-			<view v-if="month_list.length == 0" style="text-align: center;line-height: 90rpx;font-size: 34rpx;">当前没有你值班的排期!</view>
+			<view v-if="month_list.length == 0" style="text-align: center;line-height: 90rpx;font-size: 28rpx;color:#666; ">当前没有你值班的排期!</view>
 		</view>
 		
 		<!-- content -->

+ 264 - 0
pages/workbench/gridding/chart_statistics/chart_statistics.vue

@@ -0,0 +1,264 @@
+<template>
+	<view>
+		<view class="section">
+			<view class="title">统计图</view>
+			<view class="box">
+				<view class="charts-box">
+					<qiun-data-charts type="ring" :opts="ring_1" :chartData="chartData" tooltipFormat="column_1"
+						background="none" />
+				</view>
+			</view>
+		</view>
+
+		<view class="content">
+			<view class="input_box">
+				<view class="label"><text> * </text>时间范围:</view>
+				<view class="box">
+					<uni-datetime-picker v-model="range" type="daterange" rangeSeparator="至" />
+				</view>
+			</view>
+			<view class="input_box">
+				<view class="label"><text> * </text>网格编号(单选):</view>
+				<view class="box" @click="change()">
+					{{array_text}}
+				</view>
+			</view>
+			<view class="btn" @click="get_trouble_grid_region_annular()">查询</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	Date.prototype.format = function(fmt) {
+		var o = {
+			"M+": this.getMonth() + 1, //月份
+			"d+": this.getDate(), //日
+			"h+": this.getHours(), //小时
+			"m+": this.getMinutes(), //分
+			"s+": this.getSeconds(), //秒
+			"q+": Math.floor((this.getMonth() + 3) / 3), //季度
+			"S": this.getMilliseconds() //毫秒
+		};
+
+		if (/(y+)/.test(fmt)) {
+			fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
+		}
+
+		for (var k in o) {
+			if (new RegExp("(" + k + ")").test(fmt)) {
+				fmt = fmt.replace(
+					RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
+			}
+		}
+
+		return fmt;
+	}
+	export default {
+		data() {
+			return {
+				// 时间范围
+				range: [],
+				array_text: "",
+				// 网格编号的配置参数
+				array: [],
+				// 网格编号的原始数据
+				array_data: [],
+				// 选中网格编号的id
+				array_id: "",
+
+				// 图表数据
+				chartData: {
+					categories: [],
+					"series": [{
+						"data": []
+					}]
+				},
+				ring_1: {
+					"dataLabel": false,
+					"legend": {
+						"position": "bottom",
+						"float": "left"
+					},
+					"title": {
+						"name": " "
+					},
+					"subtitle": {
+						"name": " "
+					},
+					"extra": {
+						"ring": {
+							"centerColor": "#FFFFFF",
+							"border": true,
+						},
+
+					}
+				}
+
+			};
+		},
+		watch: {
+			range(newval) {
+				console.log("范围选:", this.range);
+			},
+		},
+		onLoad() {
+			// 初始化时间
+			this.range[0] = new Date().format("yyyy-MM-01")
+			this.range[1] = new Date().format("yyyy-MM-dd")
+			// console.log(this.range)
+
+			this.get_trouble_grid_number_list()
+		},
+		methods: {
+			// 配置参数 网格编号
+			get_trouble_grid_number_list() {
+				this.$api.trouble_grid_number_list({
+					type: 1
+				}).then((res)=>{
+					// console.log(res.data.data)
+					this.array_data = res.data.data
+					
+					const data = res.data.data
+					data.forEach((item, index) => {
+						this.array.push(item.itemValue)
+					})
+					
+					// 初始化
+					// 当前显示的名称
+					this.array_text = data[0].itemValue
+					// 当前选中的id
+					this.array_id = data[0].id
+					
+					// 初始化查询
+					this.get_trouble_grid_region_annular()
+				})
+			},
+
+
+			change() {
+				uni.showActionSheet({
+					itemList: this.array,
+					success: (res) => {
+						// 当前显示的名称
+						this.array_text = this.array_data[res.tapIndex].itemValue
+						// 当前选中的id
+						this.array_id = this.array_data[res.tapIndex].id
+					}
+				});
+			},
+
+			// 查询
+			get_trouble_grid_region_annular() {
+				uni.showLoading({
+					mask: true
+				})
+				this.$api.trouble_grid_region_annular({
+					type: 1,
+					
+					number_id: this.array_id,
+					start_time: this.range[0],
+					end_time: this.range[1]
+				}).then((res)=>{
+					uni.hideLoading()
+					console.log(res.data.data)
+					
+					const data = res.data.data
+					const series = []
+					data.map((item, index) => {
+						//新数组的项,用来盛放每一项中的各个参数,每次清空,这样避免改变sevm的值
+						var sevm = {};
+						//给每一项中的参数初始化并赋值
+						sevm['name'] = item.name + '(' + item.size + '次' + ')';
+						sevm['value'] = item.size;
+						//将项放进新的数组
+						series.push(sevm)
+					})
+					this.chartData.series[0].data = series
+					console.log(this.chartData.series[0].data)
+				})
+
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.section {
+		box-sizing: border-box;
+		padding: 25rpx;
+
+		.title {
+			line-height: 60rpx;
+			border-left: 8rpx solid #009FE8;
+			box-sizing: border-box;
+			padding-left: 20rpx;
+			margin-bottom: 20rpx;
+		}
+
+		.box {
+
+			/* 请根据需求修改图表容器尺寸,如果父容器没有高度图表则会显示异常 */
+			.charts-box {
+				width: 100%;
+				height: 350px;
+			}
+		}
+	}
+
+	.content {
+		margin-bottom: 50rpx;
+		box-sizing: border-box;
+		padding: 25rpx;
+
+		.input_box {
+			margin-bottom: 20rpx;
+			font-size: 32rpx;
+
+			.label {
+				min-height: 80rpx;
+				line-height: 80rpx;
+				color: #6C6F74;
+
+				text {
+					color: red;
+				}
+			}
+
+			.box {
+				width: 700rpx;
+				min-height: 90rpx;
+				line-height: 90rpx;
+				background: #FFFFFF;
+				border-radius: 8rpx;
+				border: 2rpx solid #E9EBF2;
+
+				box-sizing: border-box;
+				padding: 0 25rpx;
+
+				/deep/.uni-date-editor--x {
+					.uniui-clear {
+						display: none;
+					}
+				}
+
+				/deep/.uni-date-x--border {
+					box-sizing: border-box;
+					border-radius: 4px;
+					border: none;
+				}
+
+				/deep/.uni-date-x {
+					padding: 0;
+				}
+			}
+		}
+
+		.btn {
+			margin-top: 40rpx;
+			background-color: #009FE8;
+			padding: 25rpx 50rpx;
+			color: #FFFFFF;
+			text-align: center;
+		}
+	}
+</style>

+ 134 - 0
pages/workbench/gridding/grid_query/detail/detail.vue

@@ -0,0 +1,134 @@
+<template>
+	<view>
+		<view class="list">
+			<view class="item" v-for="(item,index) in list" :key="index">
+				<view class="left">
+					<view class="icon">
+						<image v-if="item.avatar" :src="item.avatar" mode="aspectFill"></image>
+						<view class="avatar" v-if="!item.avatar" :style="{backgroundColor:bgColor[index]}">
+							{{item.name.split('').pop()}}
+						</view>
+					</view>
+					<view class="info">
+						<view class="name">{{item.name}}({{item.section}})</view>
+						<view class="time">{{item.time}}</view>
+					</view>
+				</view>
+				<view class="right">
+					{{item.size}} 次
+				</view>
+
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				list: [],
+				// 头像随机色
+				bgColor: [],
+			};
+		},
+		onLoad(option) {
+			// 设置头像
+			for (let i = 0; i < 100; i++) {
+				// 获取随机色
+				let r = parseInt(Math.random() * 256)
+				let g = parseInt(Math.random() * 256)
+				let b = parseInt(Math.random() * 256)
+
+				// ES6 字符串拼接
+				// this.bgColor = `rgba(${r},${g},${b},0.3)`
+				let color = "rgba(" + r + "," + g + "," + b + "," + 0.3 + ")"
+				// console.log(color)
+				this.bgColor.push(color)
+			}
+
+			this.get_list(option.id)
+		},
+		methods: {
+			get_list(id) {
+				uni.showLoading({
+					mask:true
+				})
+				this.$api.trouble_grid_check_detailed({
+					type: 1,
+					
+					check_id: id
+				}).then((res)=>{
+					uni.hideLoading()
+					console.log(res.data.data)
+					
+					this.list = res.data.data
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.list {
+		box-sizing: border-box;
+		padding: 25rpx;
+
+		.item {
+			padding: 10rpx 0;
+			border-bottom: 1rpx solid #F0F0F0;
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+			height: 115rpx;
+
+			.left {
+				display: flex;
+				align-items: center;
+
+				.icon {
+					width: 110rpx;
+					height: 110rpx;
+
+					border-radius: 50%;
+					overflow: hidden;
+
+					image {
+						width: 110rpx;
+						height: 110rpx;
+
+					}
+
+					.avatar {
+						width: 110rpx;
+						line-height: 110rpx;
+						text-align: center;
+						font-size: 44rpx;
+						color: #FFFFFF;
+
+					}
+				}
+
+				.info {
+					margin-left: 20rpx;
+
+					.name {
+						line-height: 50rpx;
+						font-weight: 500;
+						color: #2C3E50;
+					}
+
+					.time {
+						font-size: 30rpx;
+
+						color: #9C9FA5;
+					}
+				}
+			}
+
+			.right {
+				font-size: 30rpx;
+			}
+		}
+	}
+</style>

+ 243 - 0
pages/workbench/gridding/grid_query/grid_query.vue

@@ -0,0 +1,243 @@
+<template>
+	<view>
+		<view class="section">
+			<view class="title">检查情况</view>
+			<view class="input_box">
+				<view class="box">
+					<uni-datetime-picker v-model="range" type="daterange" rangeSeparator="至" />
+				</view>
+			</view>
+			<view class="btn" @click="get_trouble_grid_list()">查询</view>
+		</view>
+
+		<view class="content">
+			<view class="list">
+				<view class="item" v-for="(item,index) in grid_list" :key="index">
+					<view class="name" @click="change_active(index)">
+						<view class="left">
+							<view class="text">{{item.gridName}}</view>
+							<view class="tip">{{item.detailsGrid}}</view>
+						</view>
+						<view class="right">
+							<uni-icons type="arrowright" v-if="active == index"></uni-icons>
+							<uni-icons type="arrowdown" v-if="active != index"></uni-icons>
+						</view>
+					</view>
+					<view class="box" v-if="active == index">
+						<view class="box_item" v-for="(item_2,index_2) in item.gridList" :key="index_2">
+							<view class="text">{{item_2.name}}</view>
+							<view @click="go_detail(item_2.check_id)" v-if="item_2.status == 2" class="btn">已巡检</view>
+							<view v-if="!item_2.status"class="btn" style="background-color: #E74C3C;">未巡检</view>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	Date.prototype.format = function(fmt){
+	  var o = {
+	    "M+" : this.getMonth()+1,                 //月份
+	    "d+" : this.getDate(),                    //日
+	    "h+" : this.getHours(),                   //小时
+	    "m+" : this.getMinutes(),                 //分
+	    "s+" : this.getSeconds(),                 //秒
+	    "q+" : Math.floor((this.getMonth()+3)/3), //季度
+	    "S"  : this.getMilliseconds()             //毫秒
+	  };
+	
+	  if(/(y+)/.test(fmt)){
+	    fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));
+	  }
+	        
+	  for(var k in o){
+	    if(new RegExp("("+ k +")").test(fmt)){
+	      fmt = fmt.replace(
+	        RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));  
+	    }       
+	  }
+	
+	  return fmt;
+	}
+	export default {
+		data() {
+			return {
+				active:9999,
+				
+				// 时间范围
+				range: [],
+				
+				// 网格数据
+				grid_list:[]
+			};
+		},
+		watch: {
+			range(newval) {
+				console.log("范围选:", this.range);
+			},
+		},
+		onLoad() {
+			// 初始化时间
+			this.range[0] = new Date().format("yyyy-MM-01")
+			this.range[1] = new Date().format("yyyy-MM-dd")
+			
+			this.get_trouble_grid_list()
+		},
+		methods:{
+			change_active(index){
+				if(this.active == index){
+					// 关闭当前项
+					this.active = 9999
+				}else{
+					// 展开当前项
+					this.active = index
+				}
+			},
+			
+			get_trouble_grid_list(){
+				uni.showLoading({
+					mask: true
+				})
+				this.$api.trouble_grid_list({
+					type:1,
+					start_time:this.range[0],
+					end_time:this.range[1]
+				}).then((res)=>{
+					uni.hideLoading()
+					console.log(res.data.data)
+					
+					this.grid_list = res.data.data
+				})
+			},
+			
+			go_detail(id){
+				uni.navigateTo({
+					url:"./detail/detail?id="+id
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	.section {
+		box-sizing: border-box;
+		padding: 25rpx;
+
+		.title {
+			line-height: 60rpx;
+			border-left: 8rpx solid #009FE8;
+			box-sizing: border-box;
+			padding-left: 20rpx;
+			margin-bottom: 20rpx;
+		}
+
+		.input_box {
+			margin-bottom: 20rpx;
+			font-size: 32rpx;
+
+			.box {
+				width: 700rpx;
+				min-height: 90rpx;
+				line-height: 90rpx;
+				background: #FFFFFF;
+				border-radius: 8rpx;
+				border: 2rpx solid #E9EBF2;
+
+				box-sizing: border-box;
+				padding: 0 25rpx;
+
+				/deep/.uni-date-editor--x {
+					.uniui-clear {
+						display: none;
+					}
+				}
+
+				/deep/.uni-date-x--border {
+					box-sizing: border-box;
+					border-radius: 4px;
+					border: none;
+				}
+
+				/deep/.uni-date-x {
+					padding: 0;
+				}
+			}
+		}
+
+		.btn {
+			background-color: #009FE8;
+			padding: 25rpx 50rpx;
+			color: #FFFFFF;
+			text-align: center;
+		}
+	}
+
+	.content {
+		box-sizing: border-box;
+		padding: 25rpx;
+
+		.list {
+			.item {
+				margin-bottom: 30rpx;
+				box-sizing: border-box;
+				padding: 25rpx;
+
+				border: 1rpx solid #E9EBF2;
+				border-radius: 4rpx;
+
+				.name {
+					display: flex;
+					justify-content: space-between;
+					align-items: center;
+
+					border-left: 6rpx solid #009FE8;
+					padding-left: 10rpx;
+
+					.left {
+						.text {
+							line-height: 50rpx;
+							font-size: 30rpx;
+						}
+
+						.tip {
+							line-height: 40rpx;
+							font-size: 28rpx;
+							color: #999;
+						}
+					}
+
+					.right {}
+				}
+
+				.box {
+					margin-top: 10rpx;
+					.box_item {
+						display: flex;
+						justify-content: space-between;
+						align-items: center;
+						
+						box-sizing: border-box;
+						padding: 20rpx 0;
+						border-bottom: 1rpx solid #E9EBF2;
+
+						.text {
+							width: 450rpx;
+							line-height: 40rpx;
+							font-size: 30rpx;
+						}
+
+						.btn {
+							padding: 10rpx 20rpx;
+							background-color: #2ECC71;
+							color: #FFFFFF;
+							font-size: 26rpx;
+						}
+					}
+				}
+			}
+		}
+	}
+</style>

+ 23 - 0
pages/workbench/gridding/gridding - 副本.vue

@@ -0,0 +1,23 @@
+<template>
+	<view>
+		<web-view :src="href"></web-view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				href: ""
+
+			};
+		},
+		onLoad(option) {
+			this.href = "http://webdevelop.nxjiewei.com/assets/html/zhks-quankuang/grid_troubleshoot?token=" + uni.getStorageSync('Authorization') + "&mine_code=" + uni.getStorageSync('mine_code')
+		}
+	}
+</script>
+
+<style lang="scss">
+
+</style>

+ 727 - 4
pages/workbench/gridding/gridding.vue

@@ -1,23 +1,746 @@
 <template>
 	<view>
-		<web-view :src="href"></web-view>
+		<!-- 入口列表 -->
+		<view class="list">
+			<view class="item" @click="go_query()">
+				<view class="icon">
+					<image src="./icon/icon_1.png" mode=""></image>
+				</view>
+				<view class="name">网格化查询</view>
+			</view>
+			<view class="item" @click="go_chart_statistics()">
+				<view class="icon">
+					<image src="./icon/icon_2.png" mode=""></image>
+				</view>
+				<view class="name">图表统计</view>
+			</view>
+			<view class="item" @click="go_timeline_details()">
+				<view class="icon">
+					<image src="./icon/icon_3.png" mode=""></image>
+				</view>
+				<view class="name">记录详情</view>
+			</view>
+		</view>
+
+		<!-- 提交内容 -->
+		<view class="content">
+			<view class="title">网格化管理巡回检查</view>
+
+			<view class="inner">
+				<view class="input_box">
+					<view class="label"><text> * </text>网格编号(单选):</view>
+					<view class="box" @click="change_bianhao()">
+						{{array_text_bianhao}}
+					</view>
+				</view>
+				<view class="input_box" v-if="array_fanwei.length != 0">
+					<view class="label"><text> * </text>网格范围(单选):</view>
+					<view class="box" @click="change_fanwei()">
+						{{array_text_fanwei}}
+					</view>
+				</view>
+				<view class="input_box" v-if="array_quyu.length != 0">
+					<view class="label"><text> * </text>网格区域(多选):(选择网格范围后自动出现)</view>
+					<view class="box" @click="open">
+						{{array_text_quyu}}
+					</view>
+				</view>
+				<view class="input_box">
+					<view class="label"><text> * </text>巡检日期(单选):</view>
+					<view class="box">
+						<uni-datetime-picker type="date" :value="single" @change="change_time" />
+					</view>
+				</view>
+				<view class="input_box">
+					<view class="label"><text> * </text>巡检人员:</view>
+					<view class="box" @click="open_renyuan">
+						{{array_text_renyuan}}
+					</view>
+				</view>
+				<!-- 图片 -->
+				<view class="input_box">
+					<view class="label">现场照片:</view>
+					<view class="img_box">
+						<view class="item" v-for="(item,index) in up_img_list" :key="index"
+							@click="open_img(item.path)">
+							<image :src="item.path" mode="aspectFill"></image>
+							<view class="clear" @click.stop="del_img(index)">
+								<uni-icons type="clear" size="20" color="red"></uni-icons>
+							</view>
+						</view>
+						<view class="item" v-if="up_img_list.length < 1" @click="up_img()">
+							<view class="image">+</view>
+						</view>
+					</view>
+				</view>
+
+				<view class="btn" @click="tijiao()">提交</view>
+			</view>
+		</view>
+
+		<!-- 弹出层 -->
+		<!-- 网格区域 -->
+		<uni-popup ref="popup" type="bottom">
+			<view class="select_box">
+				<checkbox-group @change="checkboxChange">
+					<view class="item" v-for="item in array_quyu" :key="item.value">
+						<view class="text">{{item.name}}</view>
+						<view class="box">
+							<checkbox style="transform:scale(0.7)" :value="item.value" :checked="item.checked" />
+						</view>
+					</view>
+				</checkbox-group>
+			</view>
+		</uni-popup>
+		<!-- 巡检人员 -->
+		<uni-popup ref="popup_renyuan" type="bottom">
+			<view class="select_box">
+				<checkbox-group @change="checkboxChange_renyuan">
+					<view class="item" v-for="item in array_renyuan" :key="item.value">
+						<view class="text">{{item.name}}</view>
+						<view class="box">
+							<checkbox style="transform:scale(0.7)" :value="item.value" :checked="item.checked" />
+						</view>
+					</view>
+				</checkbox-group>
+			</view>
+		</uni-popup>
+
 	</view>
 </template>
 
 <script>
+	import {
+		set_base_url
+	} from '@/common/set_base_url.js'
+
 	export default {
 		data() {
 			return {
-				href: ""
+				// 当前煤矿编码
+				mine_code: "",
+				// 上传图片的基础路径
+				base_url: "",
+
+				// 当前选中的网格编号文本
+				array_text_bianhao: "请选择",
+				// 网格编号的配置参数
+				array_bianhao: [],
+				// 网格编号的原始数据
+				array_data_bianhao: [],
+				// 选中网格编号的id
+				array_id_bianhao: "",
+
+
+				// 网格范围
+				// 文本
+				array_text_fanwei: "请选择",
+				// 配置参数
+				array_fanwei: [],
+				// 原始数据
+				array_data_fanwei: [],
+				// id
+				array_id_fanwei: "",
+
+				// 网格区域
+				// 文本
+				array_text_quyu: "请选择",
+				// 配置参数
+				array_quyu: [],
+				// 原始数据
+				array_data_quyu: [],
+				array_id_quyu: "",
+
+				// 巡检人员
+				// 文本
+				array_text_renyuan: "请选择",
+				// 配置参数
+				array_renyuan: [],
+				// 原始数据
+				array_data_renyuan: [],
+				array_id_renyuan: "",
+
+
+				// 已上传图片列表
+				up_img_list: [],
+
+				// 巡检时间
+				single: "",
 
+				// 提交的图片地址
+				img_url: ""
 			};
 		},
-		onLoad(option) {
-			this.href = "http://webdevelop.nxjiewei.com/assets/html/zhks-quankuang/grid_troubleshoot?token=" + uni.getStorageSync('Authorization') + "&mine_code=" + uni.getStorageSync('mine_code')
+		onLoad() {
+			// 初始化当前煤矿编码
+			this.mine_code = uni.getStorageSync('mine_code')
+			// 根据矿编码切换首页接口不同的请求基础路径
+			this.base_url = set_base_url(this.mine_code)
+
+			this.get_trouble_grid_number_list()
+		},
+		methods: {
+			// 查询页
+			go_query() {
+				uni.navigateTo({
+					url: "./grid_query/grid_query"
+				})
+			},
+			// 图表统计页
+			go_chart_statistics() {
+				uni.navigateTo({
+					url: "./chart_statistics/chart_statistics"
+				})
+			},
+			// 时间线详情
+			go_timeline_details() {
+				uni.navigateTo({
+					url: "./timeline_details/timeline_details"
+				})
+			},
+
+
+			// 配置参数 网格编号
+			get_trouble_grid_number_list() {
+				uni.showLoading({
+					mask: true
+				})
+				this.$api.trouble_grid_number_list({
+					type: 1
+				}).then((res) => {
+					uni.hideLoading()
+					console.log(res.data.data)
+					this.array_data_bianhao = res.data.data
+
+					const data = res.data.data
+					data.forEach((item, index) => {
+						this.array_bianhao.push(item.itemValue)
+					})
+				})
+			},
+
+			change_bianhao() {
+				uni.showActionSheet({
+					itemList: this.array_bianhao,
+					success: (res) => {
+						// 当前显示的名称
+						this.array_text_bianhao = this.array_data_bianhao[res.tapIndex].itemValue
+						// 当前选中的网格id
+						this.array_id_bianhao = this.array_data_bianhao[res.tapIndex].id
+						console.log(this.array_id_bianhao)
+
+
+						// 获取前先清空
+						// 网格范围
+						// 文本
+						this.array_text_fanwei = "请选择"
+						// 配置参数
+						this.array_fanwei = []
+						// 原始数据
+						this.array_data_fanwei = []
+						// id
+						this.array_id_fanwei = ""
+						// 获取前先清空
+						// 网格区域
+						// 文本
+						this.array_text_quyu = "请选择"
+						// 配置参数
+						this.array_quyu = []
+						// 原始数据
+						this.array_data_quyu = []
+						// id
+						this.array_id_quyu = ""
+
+						// 巡检人员
+						// 文本
+						this.array_text_renyuan = "请选择"
+						// 配置参数
+						this.array_renyuan = []
+						// 原始数据
+						this.array_data_renyuan = []
+						// id
+						this.array_id_renyuan = ""
+						// 获取网格范围
+						uni.showLoading({
+							mask: true
+						})
+
+						this.$api.trouble_grid_range_list({
+							type: 1,
+
+							grid_number_id: this.array_id_bianhao
+						}).then((res) => {
+							uni.hideLoading()
+							console.log(res.data.data)
+							this.array_data_fanwei = res.data.data
+
+							const data = res.data.data
+							data.forEach((item, index) => {
+								this.array_fanwei.push(item.itemValue)
+							})
+
+						})
+
+
+						// 获取巡检人员
+						this.$api.trouble_grid_owner_list({
+							type: 1,
+
+							member_id: this.array_data_bianhao[res.tapIndex].member_id
+						}).then((res) => {
+							uni.hideLoading()
+							console.log(res.data.data)
+							this.array_data_renyuan = res.data.data
+
+							const data = res.data.data
+							const series = []
+							data.map((item, index) => {
+								//新数组的项,用来盛放每一项中的各个参数,每次清空,这样避免改变sevm的值
+								var sevm = {};
+								//给每一项中的参数初始化并赋值
+								sevm['value'] = '"' + item.id + '"'
+								sevm['name'] = item.itemValue
+								//将项放进新的数组
+								series.push(sevm)
+							})
+							this.array_renyuan = series
+							this.$set(this.array_renyuan)
+							console.log(this.array_renyuan)
+						})
+
+
+					}
+				});
+			},
+			change_fanwei() {
+				uni.showActionSheet({
+					itemList: this.array_fanwei,
+					success: (res) => {
+						// 当前显示的名称
+						this.array_text_fanwei = this.array_data_fanwei[res.tapIndex].itemValue
+						// 当前选中的网格id
+						this.array_id_fanwei = this.array_data_fanwei[res.tapIndex].id
+						console.log(this.array_id_fanwei)
+
+						// 获取前先清空
+						// 网格区域
+						// 文本
+						this.array_text_quyu = "请选择"
+						// 配置参数
+						this.array_quyu = []
+						// 原始数据
+						this.array_data_quyu = []
+						// id
+						this.array_id_quyu = ""
+
+						// 获取网格区域
+						uni.showLoading({
+							mask: true
+						})
+						this.$api.trouble_grid_region_list({
+							type: 1,
+
+							grid_range_id: this.array_id_fanwei
+						}).then((res) => {
+							uni.hideLoading()
+							console.log(res.data.data)
+							this.array_data_quyu = res.data.data
+
+							const data = res.data.data
+							const series = []
+							data.map((item, index) => {
+								//新数组的项,用来盛放每一项中的各个参数,每次清空,这样避免改变sevm的值
+								var sevm = {};
+								//给每一项中的参数初始化并赋值
+								sevm['value'] = '"' + item.id + '"'
+								sevm['name'] = item.itemValue
+								//将项放进新的数组
+								series.push(sevm)
+							})
+							this.array_quyu = series
+							this.$set(this.array_quyu)
+							console.log(this.array_quyu)
+						})
+					}
+				});
+			},
+
+			open() {
+				this.$refs.popup.open()
+			},
+			open_renyuan() {
+				this.$refs.popup_renyuan.open()
+			},
+
+			// 多选区域
+			checkboxChange: function(e) {
+				var items = this.array_quyu,
+					values = e.detail.value;
+				for (var i = 0, lenI = items.length; i < lenI; ++i) {
+					const item = items[i]
+					if (values.includes(item.value)) {
+						this.$set(item, 'checked', true)
+					} else {
+						this.$set(item, 'checked', false)
+					}
+				}
+
+				console.log(values)
+
+				this.array_id_quyu = ""
+				this.array_text_quyu = ""
+				values.forEach((item, index) => {
+					// console.log(item)
+					this.array_id_quyu += item + ','
+
+					this.array_quyu.forEach((item_2, index_2) => {
+						console.log(item_2.value)
+
+						if (item == item_2.value) {
+							this.array_text_quyu += this.array_quyu[index_2].name + ','
+						}
+					})
+				})
+			},
+
+			// 巡检人员
+			checkboxChange_renyuan: function(e) {
+				var items = this.array_renyuan,
+					values = e.detail.value;
+				for (var i = 0, lenI = items.length; i < lenI; ++i) {
+					const item = items[i]
+					if (values.includes(item.value)) {
+						this.$set(item, 'checked', true)
+					} else {
+						this.$set(item, 'checked', false)
+					}
+				}
+
+				console.log(values)
+				this.array_id_renyuan = values
+
+				this.array_id_renyuan = ""
+				this.array_text_renyuan = ""
+				values.forEach((item, index) => {
+					// console.log(item)
+					this.array_id_renyuan += item + ','
+					console.log(this.array_id_renyuan)
+					this.array_renyuan.forEach((item_2, index_2) => {
+						console.log(item_2.value)
+
+						if (item == item_2.value) {
+							this.array_text_renyuan += this.array_renyuan[index_2].name + ','
+						}
+					})
+				})
+			},
+
+			// 巡检时间
+			change_time(e) {
+				this.single = e;
+				console.log("-change事件:", e);
+			},
+
+			// 上传图片
+			up_img() {
+				uni.chooseImage({
+					count: 1,
+					success: (chooseImageRes) => {
+						const tempFilePaths = chooseImageRes.tempFilePaths;
+						console.log(chooseImageRes.tempFiles[0]);
+
+						uni.showLoading({
+							mask: true,
+							title: "上传中..."
+						})
+
+						uni.uploadFile({
+							url: this.base_url + "/worksheet/design/up_images",
+							header: {
+								'Authorization': uni.getStorageSync('token_type') + ' ' + uni
+									.getStorageSync('Authorization')
+							},
+							filePath: tempFilePaths[0],
+							name: 'file',
+							// formData只有H5存在
+							formData: {
+								image: chooseImageRes.tempFiles[0]
+							},
+							success: (uploadFileRes) => {
+								// console.log(uploadFileRes.data);
+								console.log(JSON.parse(uploadFileRes.data));
+
+								const img = JSON.parse(uploadFileRes.data)
+								this.up_img_list.push(img.data)
+
+								console.log(this.up_img_list)
+
+								uni.hideLoading()
+
+								uni.showToast({
+									icon: "none",
+									title: "上传成功"
+								})
+								this.$forceUpdate()
+							}
+						})
+					}
+				})
+			},
+			// 删除已上传图片
+			del_img(index) {
+				this.up_img_list.splice(index, 1)
+
+				console.log(this.up_img_list)
+
+				uni.showToast({
+					icon: "none",
+					title: "删除成功"
+				})
+
+				this.$forceUpdate()
+			},
+			open_img(path) {
+				console.log(path)
+				
+				let urls = []
+					urls[0] = path
+				uni.previewImage({
+					urls: urls
+				});
+			},
+
+			// 提交
+			tijiao() {
+				this.array_id_quyu = this.array_id_quyu.substring(0, this.array_id_quyu.lastIndexOf(','))
+				this.array_id_renyuan = this.array_id_renyuan.substring(0, this.array_id_renyuan.lastIndexOf(','))
+
+				if (this.up_img_list.length != 0) {
+					this.img_url = this.up_img_list[0].path
+				}
+
+				if (this.array_id_bianhao != "" && this.array_id_fanwei != "" && this.array_id_quyu != "" && this.single !=
+					"" && this.array_id_renyuan != "") {
+					console.log("网格编号:" + this.array_id_bianhao)
+					console.log("网格范围:" + this.array_id_fanwei)
+					console.log("网格区域:" + this.array_id_quyu)
+					console.log("巡检日期:" + this.single)
+					console.log("巡检人员:" + this.array_id_renyuan)
+					console.log("现场照片:" + this.img_url)
+
+					uni.showLoading({
+						mask: true,
+						title: "提交中..."
+					})
+					this.$api.trouble_grid_check_add({
+						type: 1,
+
+						grid_number_id: this.array_id_bianhao,
+						grid_range_id: this.array_id_fanwei,
+						grid_region_id: this.array_id_quyu,
+						grid_owner_id: this.array_id_renyuan,
+						img_url: this.img_url,
+					}).then((res) => {
+						uni.hideLoading()
+						uni.showToast({
+							icon: "none",
+							title: "提交成功"
+						})
+						console.log(res)
+
+						setTimeout(() => {
+							this.go_timeline_details()
+						}, 1500)
+					})
+
+
+				} else {
+					uni.showToast({
+						icon: "none",
+						title: "请补充必填项"
+					})
+				}
+
+
+			}
 		}
 	}
 </script>
 
 <style lang="scss">
+	page {
+		background-color: #009FE8;
+		box-sizing: border-box;
+		padding: 25rpx;
+	}
+
+	.list {
+		background-color: #FFFFFF;
+		border-radius: 10rpx;
+
+		box-sizing: border-box;
+		padding: 50rpx 0;
+
+		display: flex;
+		justify-content: space-around;
+		align-items: center;
+
+		.item {
+			font-size: 32rpx;
+			text-align: center;
+
+			.icon {
+				image {
+					width: 70rpx;
+					height: 70rpx;
+				}
+			}
+
+			.name {
+				margin-top: 20rpx;
+			}
+		}
+	}
+
+	.content {
+		margin-top: 20rpx;
+		background-color: #FFFFFF;
+		border-radius: 10rpx;
+
+		box-sizing: border-box;
+		padding: 30rpx 25rpx;
+
+		.title {
+			line-height: 80rpx;
+			color: #2980B9;
+			font-size: 38rpx;
+			font-weight: 500;
+		}
+
+		.inner {
+			padding-top: 10rpx;
+
+			.input_box {
+				margin-bottom: 20rpx;
+				font-size: 32rpx;
+
+				.label {
+					min-height: 80rpx;
+					line-height: 80rpx;
+					color: #6C6F74;
 
+					text {
+						color: red;
+					}
+				}
+
+				.box {
+					width: 650rpx;
+					min-height: 90rpx;
+					line-height: 90rpx;
+					background: #FFFFFF;
+					border-radius: 8rpx;
+					border: 2rpx solid #E9EBF2;
+
+					box-sizing: border-box;
+					padding: 0 25rpx;
+
+					/deep/.uni-date-editor--x {
+						.uniui-clear {
+							display: none;
+						}
+					}
+
+					/deep/.uni-date-x--border {
+						box-sizing: border-box;
+						border-radius: 4px;
+						border: none;
+					}
+
+					/deep/.uni-date-x {
+						padding: 0;
+					}
+				}
+
+				.img_box {
+					width: 650rpx;
+					min-height: 160rpx;
+					background: #FFFFFF;
+					border-radius: 8rpx;
+					border: 2rpx solid #E9EBF2;
+
+					box-sizing: border-box;
+					padding: 30rpx 25rpx 0;
+
+					overflow: hidden;
+
+					.item {
+						position: relative;
+						float: left;
+						width: 180rpx;
+						height: 170rpx;
+						margin-right: 25rpx;
+						margin-bottom: 25rpx;
+
+						image {
+							width: 180rpx;
+							height: 170rpx;
+						}
+
+						.image {
+							width: 180rpx;
+							line-height: 170rpx;
+
+							text-align: center;
+							border: 1rpx solid #E9EBF2;
+							font-size: 120rpx;
+							color: #E9EBF2;
+
+						}
+
+						.clear {
+							position: absolute;
+							right: -10px;
+							top: -10px;
+						}
+					}
+
+					.item:nth-child(3n) {
+						margin-right: 0;
+					}
+				}
+			}
+		}
+	}
+
+	.select_box {
+		background-color: #FFFFFF;
+		border-radius: 10rpx 10rpx 0 0;
+		width: 750rpx;
+
+		box-sizing: border-box;
+		padding: 30rpx 50rpx;
+
+		.item {
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+
+			border-bottom: 1rpx solid #E9EBF2;
+			box-sizing: border-box;
+			padding: 15rpx 0;
+
+			.box {}
+
+			.text {}
+		}
+	}
+
+	.btn {
+		margin-top: 40rpx;
+		background-color: #009FE8;
+		padding: 25rpx 50rpx;
+		color: #FFFFFF;
+		text-align: center;
+	}
 </style>

BIN
pages/workbench/gridding/icon/icon_1.png


BIN
pages/workbench/gridding/icon/icon_2.png


BIN
pages/workbench/gridding/icon/icon_3.png


+ 130 - 0
pages/workbench/gridding/timeline_details/detail/detail.vue

@@ -0,0 +1,130 @@
+<template>
+	<view>
+		<view class="top">
+			<view class="icon">
+				<image src="./icon/icon.png" mode=""></image>
+			</view>
+			<view class="title">网格化管理</view>
+			<view class="time">{{detail.create_date}}</view>
+		</view>
+		
+		<view class="section">
+			<view class="text">检查记录</view>
+		</view>
+		
+		<view class="content">
+			<view class="inner">
+				<view class="label">网格编号:</view>
+				<view class="text">{{detail.number_name}}</view>
+			</view>
+			<view class="inner">
+				<view class="label">网格范围:</view>
+				<view class="text">{{detail.range_name}}</view>
+			</view>
+			<view class="inner">
+				<view class="label">网格区域:</view>
+				<view class="text">{{detail.region_name}}</view>
+			</view>
+			<view class="inner">
+				<view class="label">巡检人员:</view>
+				<view class="text">{{detail.owner_name}}</view>
+			</view>
+			<view class="inner">
+				<view class="label">巡检日期:</view>
+				<view class="text">{{detail.inspection_date}}</view>
+			</view>
+			<view class="inner">
+				<view class="label">现场照片:</view>
+				<view class="img">
+					<image :src="detail.img_url" mode=""></image>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				detail:{}
+			};
+		},
+		onLoad(option) {
+			this.get_trouble_grid_check_detail(option.id)
+		},
+		methods:{
+			get_trouble_grid_check_detail(id) {
+				uni.showLoading({
+					mask:true
+				})
+				this.$api.trouble_grid_check_detail({
+					id: id
+				}).then((res)=>{
+					uni.hideLoading()
+					console.log(res.data.data)
+					this.detail = res.data.data
+				})
+			},
+		}
+	}
+</script>
+
+<style lang="scss">
+	.top{
+		text-align: center;
+		box-sizing: border-box;
+		padding: 25rpx;
+		.icon{
+			image{
+				width: 91rpx;
+				height: 106rpx;
+			}
+		}
+		.title{
+			line-height: 60rpx;
+		}
+		.time{
+			font-size: 28rpx;
+			color: #999999;
+		}
+	}
+	
+	.section{
+		box-sizing: border-box;
+		padding: 15rpx 25rpx;
+		background-color: #ECF0F1;;
+		.text{
+			line-height: 50rpx;
+			color: #009FE8;
+			border-left: 6rpx solid #009FE8;
+			padding-left: 20rpx;
+		}
+	}
+	
+	.content{
+		box-sizing: border-box;
+		padding: 0 25rpx;
+		.inner {
+			padding-top: 40rpx;
+			width: 700rpx;
+			display: flex;
+			font-size: 32rpx;
+		
+			.label {
+				width: 200rpx;
+			}
+		
+			.text {
+				width: 500rpx;
+			}
+			
+			.img{
+				image{
+					width: 300rpx;
+					height: 300rpx;
+				}
+			}
+		}
+	}
+</style>

BIN
pages/workbench/gridding/timeline_details/detail/icon/icon.png


BIN
pages/workbench/gridding/timeline_details/icon/day.jpg


+ 134 - 0
pages/workbench/gridding/timeline_details/timeline_details.vue

@@ -0,0 +1,134 @@
+<template>
+	<view>
+		<view class="section" v-for="(item,index) in list" :key="index">
+			<view class="time">
+				<view class="icon">
+					<image src="./icon/day.jpg" mode=""></image>
+				</view>
+				<view class="text">{{item.time}}</view>
+			</view>
+			<view class="list">
+				<view class="box" v-for="(item_2,index_2) in item.itemMessage" :key="index_2" @click="go_detail(item_2.gridregion_id)">
+					<view class="title">{{item_2.gridregion}}</view>
+					<view class="inner">
+						<view class="label">网格范围:</view>
+						<view class="text">{{item_2.gridRange}}</view>
+					</view>
+					<view class="inner">
+						<view class="label">网格区域:</view>
+						<view class="text">{{item_2.gridregionItem}}</view>
+					</view>
+					<view class="inner">
+						<view class="label">巡检人:</view>
+						<view class="text">{{item_2.gridInspector}}</view>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				page: 1,
+				list: []
+			};
+		},
+		onLoad() {
+			this.get_trouble_grid_timeline()
+		},
+		methods: {
+			get_trouble_grid_timeline() {
+				uni.showLoading({
+					mask:true
+				})
+				
+				this.$api.trouble_grid_timeline({
+					page: this.page
+				}).then((res)=>{
+					uni.hideLoading()
+					console.log(res.data.data)
+					this.list = this.list.concat(res.data.data)
+				})
+			},
+			
+			// 详情
+			go_detail(id){
+				uni.navigateTo({
+					url:"./detail/detail?id="+id
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	page {
+		box-sizing: border-box;
+		padding: 150rpx 50rpx;
+	}
+
+	.section {
+		margin-bottom: 150rpx;
+		position: relative;
+
+		border-left: 1rpx solid #BDC3C7;
+
+		.time {
+			position: absolute;
+			left: -45rpx;
+			top: -120rpx;
+
+			width: 90rpx;
+			text-align: center;
+
+			.icon {
+				image {
+					width: 61rpx;
+					height: 68rpx;
+				}
+			}
+		}
+
+		.list {
+			box-sizing: border-box;
+			padding: 25rpx;
+
+			.box {
+				width: 600rpx;
+				min-height: 400rpx;
+				box-shadow: 0rpx 0rpx 20rpx 0rpx rgba(189, 195, 199, 0.5);
+				border-radius: 8rpx;
+
+				box-sizing: border-box;
+				padding: 25rpx;
+
+				.title {
+					width: 550rpx;
+					border-left: 8rpx solid #009FE8;
+					box-sizing: border-box;
+					padding: 10rpx 20rpx;
+					font-size: 30rpx;
+					margin-bottom: 20rpx;
+				}
+
+				.inner {
+					padding-top: 20rpx;
+					width: 550rpx;
+					display: flex;
+					font-size: 28rpx;
+
+					.label {
+						width: 150rpx;
+					}
+
+					.text {
+						width: 400rpx;
+					}
+				}
+			}
+		}
+	}
+</style>

+ 1 - 1
pages/workbench/h5/h5.vue

@@ -15,7 +15,7 @@
 			if(option.mine_code == 'zaoquan' && option.workBench == 'pingce'){
 				this.href = "http://webdevelop.nxjiewei.com/assets/html/pingce/?mine_code=zaoquan&token=" + uni.getStorageSync('Authorization')
 			}else{
-				this.href = option.url
+				this.href = option.url + "?token="+uni.getStorageSync('Authorization')
 			}
 			
 		}

+ 41 - 0
uni_modules/uni-data-checkbox/changelog.md

@@ -0,0 +1,41 @@
+## 1.0.1(2022-02-07)
+- 修复 multiple 为 true 时,v-model 的值为 null 报错的 bug
+## 1.0.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-data-checkbox](https://uniapp.dcloud.io/component/uniui/uni-data-checkbox)
+## 0.2.5(2021-08-23)
+- 修复 在uni-forms中 modelValue 中不存在当前字段,当前字段必填写也不参与校验的问题
+## 0.2.4(2021-08-17)
+- 修复 单选 list 模式下 ,icon 为 left 时,选中图标不显示的问题
+## 0.2.3(2021-08-11)
+- 修复 在 uni-forms 中重置表单,错误信息无法清除的问题
+## 0.2.2(2021-07-30)
+- 优化 在uni-forms组件,与label不对齐的问题
+## 0.2.1(2021-07-27)
+- 修复 单选默认值为0不能选中的Bug
+## 0.2.0(2021-07-13)
+- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 0.1.11(2021-07-06)
+- 优化 删除无用日志
+## 0.1.10(2021-07-05)
+- 修复 由 0.1.9 引起的非 nvue 端图标不显示的问题
+## 0.1.9(2021-07-05)
+- 修复 nvue 黑框样式问题
+## 0.1.8(2021-06-28)
+- 修复 selectedTextColor 属性不生效的Bug
+## 0.1.7(2021-06-02)
+- 新增 map 属性,可以方便映射text/value属性
+## 0.1.6(2021-05-26)
+- 修复 不关联服务空间的情况下组件报错的Bug
+## 0.1.5(2021-05-12)
+- 新增 组件示例地址
+## 0.1.4(2021-04-09)
+- 修复 nvue 下无法选中的问题
+## 0.1.3(2021-03-22)
+- 新增 disabled属性
+## 0.1.2(2021-02-24)
+- 优化 默认颜色显示
+## 0.1.1(2021-02-24)
+- 新增 支持nvue
+## 0.1.0(2021-02-18)
+- “暂无数据”显示居中

+ 817 - 0
uni_modules/uni-data-checkbox/components/uni-data-checkbox/uni-data-checkbox.vue

@@ -0,0 +1,817 @@
+<template>
+	<view class="uni-data-checklist" :style="{'margin-top':isTop+'px'}">
+		<template v-if="!isLocal">
+			<view class="uni-data-loading">
+				<uni-load-more v-if="!mixinDatacomErrorMessage" status="loading" iconType="snow" :iconSize="18" :content-text="contentText"></uni-load-more>
+				<text v-else>{{mixinDatacomErrorMessage}}</text>
+			</view>
+		</template>
+		<template v-else>
+			<checkbox-group v-if="multiple" class="checklist-group" :class="{'is-list':mode==='list' || wrap}" @change="chagne">
+				<label class="checklist-box" :class="['is--'+mode,item.selected?'is-checked':'',(disabled || !!item.disabled)?'is-disable':'',index!==0&&mode==='list'?'is-list-border':'']"
+				 :style="item.styleBackgroud" v-for="(item,index) in dataList" :key="index">
+					<checkbox class="hidden" hidden :disabled="disabled || !!item.disabled" :value="item[map.value]+''" :checked="item.selected" />
+					<view v-if="(mode !=='tag' && mode !== 'list') || ( mode === 'list' && icon === 'left')" class="checkbox__inner"  :style="item.styleIcon">
+						<view class="checkbox__inner-icon"></view>
+					</view>
+					<view class="checklist-content" :class="{'list-content':mode === 'list' && icon ==='left'}">
+						<text class="checklist-text" :style="item.styleIconText">{{item[map.text]}}</text>
+						<view v-if="mode === 'list' && icon === 'right'" class="checkobx__list" :style="item.styleBackgroud"></view>
+					</view>
+				</label>
+			</checkbox-group>
+			<radio-group v-else class="checklist-group" :class="{'is-list':mode==='list','is-wrap':wrap}" @change="chagne">
+				<!-- -->
+				<label class="checklist-box" :class="['is--'+mode,item.selected?'is-checked':'',(disabled || !!item.disabled)?'is-disable':'',index!==0&&mode==='list'?'is-list-border':'']"
+				 :style="item.styleBackgroud" v-for="(item,index) in dataList" :key="index">
+					<radio class="hidden" hidden :disabled="disabled || item.disabled" :value="item[map.value]+''" :checked="item.selected" />
+					<view v-if="(mode !=='tag' && mode !== 'list') || ( mode === 'list' && icon === 'left')" class="radio__inner"
+					 :style="item.styleBackgroud">
+						<view class="radio__inner-icon" :style="item.styleIcon"></view>
+					</view>
+					<view class="checklist-content" :class="{'list-content':mode === 'list' && icon ==='left'}">
+						<text class="checklist-text" :style="item.styleIconText">{{item[map.text]}}</text>
+						<view v-if="mode === 'list' && icon === 'right'" :style="item.styleRightIcon" class="checkobx__list"></view>
+					</view>
+				</label>
+			</radio-group>
+		</template>
+	</view>
+</template>
+
+<script>
+	/**
+	 * DataChecklist 数据选择器
+	 * @description 通过数据渲染 checkbox 和 radio
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=xxx
+	 * @property {String} mode = [default| list | button | tag] 显示模式
+	 * @value default  	默认横排模式
+	 * @value list		列表模式
+	 * @value button	按钮模式
+	 * @value tag 		标签模式
+	 * @property {Boolean} multiple = [true|false] 是否多选
+	 * @property {Array|String|Number} value 默认值
+	 * @property {Array} localdata 本地数据 ,格式 [{text:'',value:''}]
+	 * @property {Number|String} min 最小选择个数 ,multiple为true时生效
+	 * @property {Number|String} max 最大选择个数 ,multiple为true时生效
+	 * @property {Boolean} wrap 是否换行显示
+	 * @property {String} icon = [left|right]  list 列表模式下icon显示位置
+	 * @property {Boolean} selectedColor 选中颜色
+	 * @property {Boolean} emptyText 没有数据时显示的文字 ,本地数据无效
+	 * @property {Boolean} selectedTextColor 选中文本颜色,如不填写则自动显示
+	 * @property {Object} map 字段映射, 默认 map={text:'text',value:'value'}
+	 * @value left 左侧显示
+	 * @value right 右侧显示
+	 * @event {Function} change  选中发生变化触发
+	 */
+
+	export default {
+		name: 'uniDataChecklist',
+		mixins: [uniCloud.mixinDatacom || {}],
+		emits:['input','update:modelValue','change'],
+		props: {
+			mode: {
+				type: String,
+				default: 'default'
+			},
+
+			multiple: {
+				type: Boolean,
+				default: false
+			},
+			value: {
+				type: [Array, String, Number],
+				default () {
+					return ''
+				}
+			},
+			// TODO vue3
+			modelValue: {
+				type: [Array, String, Number],
+				default() {
+					return '';
+				}
+			},
+			localdata: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			min: {
+				type: [Number, String],
+				default: ''
+			},
+			max: {
+				type: [Number, String],
+				default: ''
+			},
+			wrap: {
+				type: Boolean,
+				default: false
+			},
+			icon: {
+				type: String,
+				default: 'left'
+			},
+			selectedColor: {
+				type: String,
+				default: ''
+			},
+			selectedTextColor: {
+				type: String,
+				default: ''
+			},
+			emptyText:{
+				type: String,
+				default: '暂无数据'
+			},
+			disabled:{
+				type: Boolean,
+				default: false
+			},
+			map:{
+				type: Object,
+				default(){
+					return {
+						text:'text',
+						value:'value'
+					}
+				}
+			}
+		},
+		watch: {
+			localdata: {
+				handler(newVal) {
+					this.range = newVal
+					this.dataList = this.getDataList(this.getSelectedValue(newVal))
+				},
+				deep: true
+			},
+			mixinDatacomResData(newVal) {
+				this.range = newVal
+				this.dataList = this.getDataList(this.getSelectedValue(newVal))
+			},
+			value(newVal) {
+				this.dataList = this.getDataList(newVal)
+				// fix by mehaotian is_reset 在 uni-forms 中定义
+				if(!this.is_reset){
+					this.is_reset = false
+					this.formItem && this.formItem.setValue(newVal)
+				}
+			},
+			modelValue(newVal) {
+				this.dataList = this.getDataList(newVal);
+				if(!this.is_reset){
+					this.is_reset = false
+					this.formItem && this.formItem.setValue(newVal)
+				}
+			}
+		},
+		data() {
+			return {
+				dataList: [],
+				range: [],
+				contentText: {
+					contentdown: '查看更多',
+					contentrefresh: '加载中',
+					contentnomore: '没有更多'
+				},
+				isLocal:true,
+				styles: {
+					selectedColor: '#2979ff',
+					selectedTextColor: '#666',
+				},
+				isTop:0
+			};
+		},
+		computed:{
+			dataValue(){
+				if(this.value === '')return this.modelValue
+				if(this.modelValue === '') return this.value
+				return this.value
+			}
+		},
+		created() {
+			this.form = this.getForm('uniForms')
+			this.formItem = this.getForm('uniFormsItem')
+			// this.formItem && this.formItem.setValue(this.value)
+
+			if (this.formItem) {
+				this.isTop = 6
+				if (this.formItem.name) {
+					// 如果存在name添加默认值,否则formData 中不存在这个字段不校验
+					if(!this.is_reset){
+						this.is_reset = false
+						this.formItem.setValue(this.dataValue)
+					}
+					this.rename = this.formItem.name
+					this.form.inputChildrens.push(this)
+				}
+			}
+
+			if (this.localdata && this.localdata.length !== 0) {
+				this.isLocal = true
+				this.range = this.localdata
+				this.dataList = this.getDataList(this.getSelectedValue(this.range))
+			} else {
+				if (this.collection) {
+					this.isLocal = false
+					this.loadData()
+				}
+			}
+		},
+		methods: {
+			loadData() {
+				this.mixinDatacomGet().then(res=>{
+					this.mixinDatacomResData = res.result.data
+					if(this.mixinDatacomResData.length === 0){
+						this.isLocal = false
+						this.mixinDatacomErrorMessage = this.emptyText
+					}else{
+						this.isLocal = true
+					}
+				}).catch(err=>{
+					this.mixinDatacomErrorMessage = err.message
+				})
+			},
+			/**
+			 * 获取父元素实例
+			 */
+			getForm(name = 'uniForms') {
+				let parent = this.$parent;
+				let parentName = parent.$options.name;
+				while (parentName !== name) {
+					parent = parent.$parent;
+					if (!parent) return false
+					parentName = parent.$options.name;
+				}
+				return parent;
+			},
+			chagne(e) {
+				const values = e.detail.value
+
+				let detail = {
+					value: [],
+					data: []
+				}
+
+				if (this.multiple) {
+					this.range.forEach(item => {
+
+						if (values.includes(item[this.map.value] + '')) {
+							detail.value.push(item[this.map.value])
+							detail.data.push(item)
+						}
+					})
+				} else {
+					const range = this.range.find(item => (item[this.map.value] + '') === values)
+					if (range) {
+						detail = {
+							value: range[this.map.value],
+							data: range
+						}
+					}
+				}
+				this.formItem && this.formItem.setValue(detail.value)
+				// TODO 兼容 vue2
+				this.$emit('input', detail.value);
+				// // TOTO 兼容 vue3
+				this.$emit('update:modelValue', detail.value);
+				this.$emit('change', {
+					detail
+				})
+				if (this.multiple) {
+					// 如果 v-model 没有绑定 ,则走内部逻辑
+					// if (this.value.length === 0) {
+					this.dataList = this.getDataList(detail.value, true)
+					// }
+				} else {
+					this.dataList = this.getDataList(detail.value)
+				}
+			},
+
+			/**
+			 * 获取渲染的新数组
+			 * @param {Object} value 选中内容
+			 */
+			getDataList(value) {
+				// 解除引用关系,破坏原引用关系,避免污染源数据
+				let dataList = JSON.parse(JSON.stringify(this.range))
+				let list = []
+				if (this.multiple) {
+					if (!Array.isArray(value)) {
+						value = []
+					}
+				}
+				dataList.forEach((item, index) => {
+					item.disabled = item.disable || item.disabled || false
+					if (this.multiple) {
+						if (value.length > 0) {
+							let have = value.find(val => val === item[this.map.value])
+							item.selected = have !== undefined
+						} else {
+							item.selected = false
+						}
+					} else {
+						item.selected = value === item[this.map.value]
+					}
+
+					list.push(item)
+				})
+				return this.setRange(list)
+			},
+			/**
+			 * 处理最大最小值
+			 * @param {Object} list
+			 */
+			setRange(list) {
+				let selectList = list.filter(item => item.selected)
+				let min = Number(this.min) || 0
+				let max = Number(this.max) || ''
+				list.forEach((item, index) => {
+					if (this.multiple) {
+						if (selectList.length <= min) {
+							let have = selectList.find(val => val[this.map.value] === item[this.map.value])
+							if (have !== undefined) {
+								item.disabled = true
+							}
+						}
+
+						if (selectList.length >= max && max !== '') {
+							let have = selectList.find(val => val[this.map.value] === item[this.map.value])
+							if (have === undefined) {
+								item.disabled = true
+							}
+						}
+					}
+					this.setStyles(item, index)
+					list[index] = item
+				})
+				return list
+			},
+			/**
+			 * 设置 class
+			 * @param {Object} item
+			 * @param {Object} index
+			 */
+			setStyles(item, index) {
+				//  设置自定义样式
+				item.styleBackgroud = this.setStyleBackgroud(item)
+				item.styleIcon = this.setStyleIcon(item)
+				item.styleIconText = this.setStyleIconText(item)
+				item.styleRightIcon = this.setStyleRightIcon(item)
+			},
+
+			/**
+			 * 获取选中值
+			 * @param {Object} range
+			 */
+			getSelectedValue(range) {
+				if (!this.multiple) return this.dataValue
+				let selectedArr = []
+				range.forEach((item) => {
+					if (item.selected) {
+						selectedArr.push(item[this.map.value])
+					}
+				})
+				return this.dataValue && this.dataValue.length > 0 ? this.dataValue : selectedArr
+			},
+
+			/**
+			 * 设置背景样式
+			 */
+			setStyleBackgroud(item) {
+				let styles = {}
+				let selectedColor = this.selectedColor?this.selectedColor:'#2979ff'
+				if (this.mode !== 'list') {
+					styles['border-color'] = item.selected?selectedColor:'#DCDFE6'
+				}
+				if (this.mode === 'tag') {
+					styles['background-color'] = item.selected? selectedColor:'#f5f5f5'
+				}
+				let classles = ''
+				for (let i in styles) {
+					classles += `${i}:${styles[i]};`
+				}
+				return classles
+			},
+			setStyleIcon(item) {
+				let styles = {}
+				let classles = ''
+				let selectedColor = this.selectedColor?this.selectedColor:'#2979ff'
+				styles['background-color'] = item.selected?selectedColor:'#fff'
+				styles['border-color'] = item.selected?selectedColor:'#DCDFE6'
+
+				if(!item.selected && item.disabled){
+					styles['background-color'] = '#F2F6FC'
+					styles['border-color'] = item.selected?selectedColor:'#DCDFE6'
+				}
+
+				for (let i in styles) {
+					classles += `${i}:${styles[i]};`
+				}
+				return classles
+			},
+			setStyleIconText(item) {
+				let styles = {}
+				let classles = ''
+				let selectedColor = this.selectedColor?this.selectedColor:'#2979ff'
+				if (this.mode === 'tag') {
+					styles.color = item.selected?(this.selectedTextColor?this.selectedTextColor:'#fff'):'#666'
+				} else {
+					styles.color = item.selected?(this.selectedTextColor?this.selectedTextColor:selectedColor):'#666'
+				}
+				if(!item.selected && item.disabled){
+					styles.color = '#999'
+				}
+
+				for (let i in styles) {
+					classles += `${i}:${styles[i]};`
+				}
+				return classles
+			},
+			setStyleRightIcon(item) {
+				let styles = {}
+				let classles = ''
+				if (this.mode === 'list') {
+					styles['border-color'] = item.selected?this.styles.selectedColor:'#DCDFE6'
+				}
+				for (let i in styles) {
+					classles += `${i}:${styles[i]};`
+				}
+
+				return classles
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	$checked-color: #2979ff;
+	$border-color: #DCDFE6;
+	$disable:0.4;
+
+	@mixin flex {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+	}
+
+	.uni-data-loading {
+		@include flex;
+		flex-direction: row;
+		justify-content: center;
+		align-items: center;
+		height: 36px;
+		padding-left: 10px;
+		color: #999;
+	}
+
+	.uni-data-checklist {
+		position: relative;
+		z-index: 0;
+		flex: 1;
+		// 多选样式
+		.checklist-group {
+			@include flex;
+			flex-direction: row;
+			flex-wrap: wrap;
+
+			&.is-list {
+				flex-direction: column;
+			}
+
+			.checklist-box {
+				@include flex;
+				flex-direction: row;
+				align-items: center;
+				position: relative;
+				margin: 5px 0;
+				margin-right: 25px;
+
+				.hidden {
+					position: absolute;
+					opacity: 0;
+				}
+
+				// 文字样式
+				.checklist-content {
+					@include flex;
+					flex: 1;
+					flex-direction: row;
+					align-items: center;
+					justify-content: space-between;
+					.checklist-text {
+						font-size: 14px;
+						color: #666;
+						margin-left: 5px;
+						line-height: 14px;
+					}
+
+					.checkobx__list {
+						border-right-width: 1px;
+						border-right-color: #007aff;
+						border-right-style: solid;
+						border-bottom-width:1px;
+						border-bottom-color: #007aff;
+						border-bottom-style: solid;
+						height: 12px;
+						width: 6px;
+						left: -5px;
+						transform-origin: center;
+						transform: rotate(45deg);
+						opacity: 0;
+					}
+				}
+
+				// 多选样式
+				.checkbox__inner {
+					/* #ifndef APP-NVUE */
+					flex-shrink: 0;
+					box-sizing: border-box;
+					/* #endif */
+					position: relative;
+					width: 16px;
+					height: 16px;
+					border: 1px solid $border-color;
+					border-radius: 4px;
+					background-color: #fff;
+					z-index: 1;
+					.checkbox__inner-icon {
+						position: absolute;
+						/* #ifdef APP-NVUE */
+						top: 2px;
+						/* #endif */
+						/* #ifndef APP-NVUE */
+						top: 1px;
+						/* #endif */
+						left: 5px;
+						height: 8px;
+						width: 4px;
+						border-right-width: 1px;
+						border-right-color: #fff;
+						border-right-style: solid;
+						border-bottom-width:1px ;
+						border-bottom-color: #fff;
+						border-bottom-style: solid;
+						opacity: 0;
+						transform-origin: center;
+						transform: rotate(40deg);
+					}
+				}
+
+				// 单选样式
+				.radio__inner {
+					@include flex;
+					/* #ifndef APP-NVUE */
+					flex-shrink: 0;
+					box-sizing: border-box;
+					/* #endif */
+					justify-content: center;
+					align-items: center;
+					position: relative;
+					width: 16px;
+					height: 16px;
+					border: 1px solid $border-color;
+					border-radius: 16px;
+					background-color: #fff;
+					z-index: 1;
+
+					.radio__inner-icon {
+						width: 8px;
+						height: 8px;
+						border-radius: 10px;
+						opacity: 0;
+					}
+				}
+
+				// 默认样式
+				&.is--default {
+
+					// 禁用
+					&.is-disable {
+						/* #ifdef H5 */
+						cursor: not-allowed;
+						/* #endif */
+						.checkbox__inner {
+							background-color: #F2F6FC;
+							border-color: $border-color;
+							/* #ifdef H5 */
+							cursor: not-allowed;
+							/* #endif */
+						}
+
+						.radio__inner {
+							background-color: #F2F6FC;
+							border-color: $border-color;
+						}
+						.checklist-text {
+							color: #999;
+						}
+					}
+
+					// 选中
+					&.is-checked {
+						.checkbox__inner {
+							border-color: $checked-color;
+							background-color: $checked-color;
+
+							.checkbox__inner-icon {
+								opacity: 1;
+								transform: rotate(45deg);
+							}
+						}
+						.radio__inner {
+							border-color: $checked-color;
+							.radio__inner-icon {
+								opacity: 1;
+								background-color: $checked-color;
+							}
+						}
+						.checklist-text {
+							color: $checked-color;
+						}
+						// 选中禁用
+						&.is-disable {
+							.checkbox__inner {
+								opacity: $disable;
+							}
+
+							.checklist-text {
+								opacity: $disable;
+							}
+							.radio__inner {
+								opacity: $disable;
+							}
+						}
+					}
+				}
+
+				// 按钮样式
+				&.is--button {
+					margin-right: 10px;
+					padding: 5px 10px;
+					border: 1px $border-color solid;
+					border-radius: 3px;
+					transition: border-color 0.2s;
+
+					// 禁用
+					&.is-disable {
+						/* #ifdef H5 */
+						cursor: not-allowed;
+						/* #endif */
+						border: 1px #eee solid;
+						opacity: $disable;
+						.checkbox__inner {
+							background-color: #F2F6FC;
+							border-color: $border-color;
+							/* #ifdef H5 */
+							cursor: not-allowed;
+							/* #endif */
+						}
+						.radio__inner {
+							background-color: #F2F6FC;
+							border-color: $border-color;
+							/* #ifdef H5 */
+							cursor: not-allowed;
+							/* #endif */
+						}
+						.checklist-text {
+							color: #999;
+						}
+					}
+
+					&.is-checked {
+						border-color: $checked-color;
+						.checkbox__inner {
+							border-color: $checked-color;
+							background-color: $checked-color;
+							.checkbox__inner-icon {
+								opacity: 1;
+								transform: rotate(45deg);
+							}
+						}
+
+						.radio__inner {
+							border-color: $checked-color;
+
+							.radio__inner-icon {
+								opacity: 1;
+								background-color: $checked-color;
+							}
+						}
+
+						.checklist-text {
+							color: $checked-color;
+						}
+
+						// 选中禁用
+						&.is-disable {
+							opacity: $disable;
+						}
+					}
+				}
+
+				// 标签样式
+				&.is--tag {
+					margin-right: 10px;
+					padding: 5px 10px;
+					border: 1px $border-color solid;
+					border-radius: 3px;
+					background-color: #f5f5f5;
+
+					.checklist-text {
+						margin: 0;
+						color: #666;
+					}
+
+					// 禁用
+					&.is-disable {
+						/* #ifdef H5 */
+						cursor: not-allowed;
+						/* #endif */
+						opacity: $disable;
+					}
+
+					&.is-checked {
+						background-color: $checked-color;
+						border-color: $checked-color;
+
+						.checklist-text {
+							color: #fff;
+						}
+					}
+				}
+				// 列表样式
+				&.is--list {
+					/* #ifndef APP-NVUE */
+					display: flex;
+					/* #endif */
+					padding: 10px 15px;
+					padding-left: 0;
+					margin: 0;
+
+					&.is-list-border {
+						border-top: 1px #eee solid;
+					}
+
+					// 禁用
+					&.is-disable {
+						/* #ifdef H5 */
+						cursor: not-allowed;
+						/* #endif */
+						.checkbox__inner {
+							background-color: #F2F6FC;
+							border-color: $border-color;
+							/* #ifdef H5 */
+							cursor: not-allowed;
+							/* #endif */
+						}
+						.checklist-text {
+							color: #999;
+						}
+					}
+
+					&.is-checked {
+						.checkbox__inner {
+							border-color: $checked-color;
+							background-color: $checked-color;
+
+							.checkbox__inner-icon {
+								opacity: 1;
+								transform: rotate(45deg);
+							}
+						}
+						.radio__inner {
+							.radio__inner-icon {
+								opacity: 1;
+							}
+						}
+						.checklist-text {
+							color: $checked-color;
+						}
+
+						.checklist-content {
+							.checkobx__list {
+								opacity: 1;
+								border-color: $checked-color;
+							}
+						}
+
+						// 选中禁用
+						&.is-disable {
+							.checkbox__inner {
+								opacity: $disable;
+							}
+
+							.checklist-text {
+								opacity: $disable;
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+</style>

+ 87 - 0
uni_modules/uni-data-checkbox/package.json

@@ -0,0 +1,87 @@
+{
+  "id": "uni-data-checkbox",
+  "displayName": "uni-data-checkbox 数据选择器",
+  "version": "1.0.1",
+  "description": "通过数据驱动的单选框和复选框",
+  "keywords": [
+    "uni-ui",
+    "checkbox",
+    "单选",
+    "多选",
+    "单选多选"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": "^3.1.1"
+  },
+  "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-load-more","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"
+        }
+      }
+    }
+  }
+}

+ 18 - 0
uni_modules/uni-data-checkbox/readme.md

@@ -0,0 +1,18 @@
+
+
+## DataCheckbox 数据驱动的单选复选框
+> **组件名:uni-data-checkbox**
+> 代码块: `uDataCheckbox`
+
+
+本组件是基于uni-app基础组件checkbox的封装。本组件要解决问题包括:
+
+1. 数据绑定型组件:给本组件绑定一个data,会自动渲染一组候选内容。再以往,开发者需要编写不少代码实现类似功能
+2. 自动的表单校验:组件绑定了data,且符合[uni-forms](https://ext.dcloud.net.cn/plugin?id=2773)组件的表单校验规范,搭配使用会自动实现表单校验
+3. 本组件合并了单选多选
+4. 本组件有若干风格选择,如普通的单选多选框、并列button风格、tag风格。开发者可以快速选择需要的风格。但作为一个封装组件,样式代码虽然不用自己写了,却会牺牲一定的样式自定义性
+
+在uniCloud开发中,`DB Schema`中配置了enum枚举等类型后,在web控制台的[自动生成表单](https://uniapp.dcloud.io/uniCloud/schema?id=autocode)功能中,会自动生成``uni-data-checkbox``组件并绑定好data
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-data-checkbox)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 

+ 52 - 0
uni_modules/uni-data-picker/changelog.md

@@ -0,0 +1,52 @@
+## 1.0.1(2021-11-23)
+- 修复 由上个版本引发的map、v-model等属性不生效的bug
+## 1.0.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-data-picker](https://uniapp.dcloud.io/component/uniui/uni-data-picker)
+## 0.4.9(2021-10-28)
+- 修复 VUE2 v-model 概率无效的 bug
+## 0.4.8(2021-10-27)
+- 修复 v-model 概率无效的 bug
+## 0.4.7(2021-10-25)
+- 新增 属性 spaceInfo 服务空间配置 HBuilderX 3.2.11+
+- 修复 树型 uniCloud 数据类型为 int 时报错的 bug
+## 0.4.6(2021-10-19)
+- 修复 非 VUE3 v-model 为 0 时无法选中的 bug
+## 0.4.5(2021-09-26)
+- 新增 清除已选项的功能(通过 clearIcon 属性配置是否显示按钮),同时提供 clear 方法以供调用,二者等效
+- 修复 readonly 为 true 时报错的 bug
+## 0.4.4(2021-09-26)
+- 修复 上一版本造成的 map 属性失效的 bug
+- 新增 ellipsis 属性,支持配置 tab 选项长度过长时是否自动省略
+## 0.4.3(2021-09-24)
+- 修复 某些情况下级联未触发的 bug
+## 0.4.2(2021-09-23)
+- 新增 提供 show 和 hide 方法,开发者可以通过 ref 调用
+- 新增 选项内容过长自动添加省略号
+## 0.4.1(2021-09-15)
+- 新增 map 属性 字段映射,将 text/value 映射到数据中的其他字段
+## 0.4.0(2021-07-13)
+- 组件兼容 vue3,如何创建 vue3 项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 0.3.5(2021-06-04)
+- 修复 无法加载云端数据的问题
+## 0.3.4(2021-05-28)
+- 修复 v-model 无效问题
+- 修复 loaddata 为空数据组时加载时间过长问题
+- 修复 上个版本引出的本地数据无法选择带有 children 的 2 级节点
+## 0.3.3(2021-05-12)
+- 新增 组件示例地址
+## 0.3.2(2021-04-22)
+- 修复 非树形数据有 where 属性查询报错的问题
+## 0.3.1(2021-04-15)
+- 修复 本地数据概率无法回显时问题
+## 0.3.0(2021-04-07)
+- 新增 支持云端非树形表结构数据
+- 修复 根节点 parent_field 字段等于 null 时选择界面错乱问题
+## 0.2.0(2021-03-15)
+- 修复 nodeclick、popupopened、popupclosed 事件无法触发的问题
+## 0.1.9(2021-03-09)
+- 修复 微信小程序某些情况下无法选择的问题
+## 0.1.8(2021-02-05)
+- 优化 部分样式在 nvue 上的兼容表现
+## 0.1.7(2021-02-05)
+- 调整为 uni_modules 目录规范

+ 45 - 0
uni_modules/uni-data-picker/components/uni-data-picker/keypress.js

@@ -0,0 +1,45 @@
+// #ifdef H5
+export default {
+  name: 'Keypress',
+  props: {
+    disable: {
+      type: Boolean,
+      default: false
+    }
+  },
+  mounted () {
+    const keyNames = {
+      esc: ['Esc', 'Escape'],
+      tab: 'Tab',
+      enter: 'Enter',
+      space: [' ', 'Spacebar'],
+      up: ['Up', 'ArrowUp'],
+      left: ['Left', 'ArrowLeft'],
+      right: ['Right', 'ArrowRight'],
+      down: ['Down', 'ArrowDown'],
+      delete: ['Backspace', 'Delete', 'Del']
+    }
+    const listener = ($event) => {
+      if (this.disable) {
+        return
+      }
+      const keyName = Object.keys(keyNames).find(key => {
+        const keyName = $event.key
+        const value = keyNames[key]
+        return value === keyName || (Array.isArray(value) && value.includes(keyName))
+      })
+      if (keyName) {
+        // 避免和其他按键事件冲突
+        setTimeout(() => {
+          this.$emit(keyName, {})
+        }, 0)
+      }
+    }
+    document.addEventListener('keyup', listener)
+    this.$once('hook:beforeDestroy', () => {
+      document.removeEventListener('keyup', listener)
+    })
+  },
+	render: () => {}
+}
+// #endif

+ 537 - 0
uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue

@@ -0,0 +1,537 @@
+<template>
+	<view class="uni-data-tree">
+		<view class="uni-data-tree-input" @click="handleInput">
+			<slot :options="options" :data="inputSelected" :error="errorMessage">
+				<view class="input-value" :class="{'input-value-border': border}">
+					<text v-if="errorMessage" class="selected-area error-text">{{errorMessage}}</text>
+					<view v-else-if="loading && !isOpened" class="selected-area">
+						<uni-load-more class="load-more" :contentText="loadMore" status="loading"></uni-load-more>
+					</view>
+					<scroll-view v-else-if="inputSelected.length" class="selected-area" scroll-x="true">
+						<view class="selected-list">
+							<view class="selected-item" v-for="(item,index) in inputSelected" :key="index">
+								<text>{{item.text}}</text><text v-if="index<inputSelected.length-1"
+									class="input-split-line">{{split}}</text>
+							</view>
+						</view>
+					</scroll-view>
+					<text v-else class="selected-area placeholder">{{placeholder}}</text>
+					<view v-show="clearIcon && !readonly && inputSelected.length" class="icon-clear"
+						@click.stop="clear">
+						<uni-icons type="clear" color="#e1e1e1" size="14"></uni-icons>
+					</view>
+					<view class="arrow-area" v-if="(!clearIcon || !inputSelected.length) && !readonly ">
+						<view class="input-arrow"></view>
+					</view>
+				</view>
+			</slot>
+		</view>
+		<view class="uni-data-tree-cover" v-if="isOpened" @click="handleClose"></view>
+		<view class="uni-data-tree-dialog" v-if="isOpened">
+			<view class="uni-popper__arrow"></view>
+			<view class="dialog-caption">
+				<view class="title-area">
+					<text class="dialog-title">{{popupTitle}}</text>
+				</view>
+				<view class="dialog-close" @click="handleClose">
+					<view class="dialog-close-plus" data-id="close"></view>
+					<view class="dialog-close-plus dialog-close-rotate" data-id="close"></view>
+				</view>
+			</view>
+			<data-picker-view class="picker-view" ref="pickerView" v-model="dataValue" :localdata="localdata"
+				:preload="preload" :collection="collection" :field="field" :orderby="orderby" :where="where"
+				:step-searh="stepSearh" :self-field="selfField" :parent-field="parentField" :managed-mode="true"
+				:map="map" :ellipsis="ellipsis" @change="onchange" @datachange="ondatachange" @nodeclick="onnodeclick">
+			</data-picker-view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import dataPicker from "../uni-data-pickerview/uni-data-picker.js"
+	import DataPickerView from "../uni-data-pickerview/uni-data-pickerview.vue"
+
+	/**
+	 * DataPicker 级联选择
+	 * @description 支持单列、和多列级联选择。列数没有限制,如果屏幕显示不全,顶部tab区域会左右滚动。
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=3796
+	 * @property {String} popup-title 弹出窗口标题
+	 * @property {Array} localdata 本地数据,参考
+	 * @property {Boolean} border = [true|false] 是否有边框
+	 * @property {Boolean} readonly = [true|false] 是否仅读
+	 * @property {Boolean} preload = [true|false] 是否预加载数据
+	 * @value true 开启预加载数据,点击弹出窗口后显示已加载数据
+	 * @value false 关闭预加载数据,点击弹出窗口后开始加载数据
+	 * @property {Boolean} step-searh = [true|false] 是否分布查询
+	 * @value true 启用分布查询,仅查询当前选中节点
+	 * @value false 关闭分布查询,一次查询出所有数据
+	 * @property {String|DBFieldString} self-field 分布查询当前字段名称
+	 * @property {String|DBFieldString} parent-field 分布查询父字段名称
+	 * @property {String|DBCollectionString} collection 表名
+	 * @property {String|DBFieldString} field 查询字段,多个字段用 `,` 分割
+	 * @property {String} orderby 排序字段及正序倒叙设置
+	 * @property {String|JQLString} where 查询条件
+	 * @event {Function} popupshow 弹出的选择窗口打开时触发此事件
+	 * @event {Function} popuphide 弹出的选择窗口关闭时触发此事件
+	 */
+	export default {
+		name: 'UniDataPicker',
+		emits: ['popupopened', 'popupclosed', 'nodeclick', 'input', 'change', 'update:modelValue'],
+		mixins: [dataPicker],
+		components: {
+			DataPickerView
+		},
+		props: {
+			options: {
+				type: [Object, Array],
+				default () {
+					return {}
+				}
+			},
+			popupTitle: {
+				type: String,
+				default: '请选择'
+			},
+			placeholder: {
+				type: String,
+				default: '请选择'
+			},
+			heightMobile: {
+				type: String,
+				default: ''
+			},
+			readonly: {
+				type: Boolean,
+				default: false
+			},
+			clearIcon: {
+				type: Boolean,
+				default: true
+			},
+			border: {
+				type: Boolean,
+				default: true
+			},
+			split: {
+				type: String,
+				default: '/'
+			},
+			ellipsis: {
+				type: Boolean,
+				default: true
+			}
+		},
+		data() {
+			return {
+				isOpened: false,
+				inputSelected: []
+			}
+		},
+		created() {
+			this.form = this.getForm('uniForms')
+			this.formItem = this.getForm('uniFormsItem')
+			if (this.formItem) {
+				if (this.formItem.name) {
+					this.rename = this.formItem.name
+					this.form.inputChildrens.push(this)
+				}
+			}
+
+			this.$nextTick(() => {
+				this.load()
+			})
+		},
+		methods: {
+			clear() {
+				this.inputSelected.splice(0)
+				this._dispatchEvent([])
+			},
+			onPropsChange() {
+				this._treeData = []
+				this.selectedIndex = 0
+				this.load()
+			},
+			load() {
+				if (this.readonly) {
+					this._processReadonly(this.localdata, this.dataValue)
+					return
+				}
+
+				if (this.isLocaldata) {
+					this.loadData()
+					this.inputSelected = this.selected.slice(0)
+				} else if (!this.parentField && !this.selfField && this.hasValue) {
+					this.getNodeData(() => {
+						this.inputSelected = this.selected.slice(0)
+					})
+				} else if (this.hasValue) {
+					this.getTreePath(() => {
+						this.inputSelected = this.selected.slice(0)
+					})
+				}
+			},
+			getForm(name = 'uniForms') {
+				let parent = this.$parent;
+				let parentName = parent.$options.name;
+				while (parentName !== name) {
+					parent = parent.$parent;
+					if (!parent) return false;
+					parentName = parent.$options.name;
+				}
+				return parent;
+			},
+			show() {
+				this.isOpened = true
+				this.$nextTick(() => {
+					this.$refs.pickerView.updateData({
+						treeData: this._treeData,
+						selected: this.selected,
+						selectedIndex: this.selectedIndex
+					})
+				})
+				this.$emit('popupopened')
+			},
+			hide() {
+				this.isOpened = false
+				this.$emit('popupclosed')
+			},
+			handleInput() {
+				if (this.readonly) {
+					return
+				}
+				this.show()
+			},
+			handleClose(e) {
+				this.hide()
+			},
+			onnodeclick(e) {
+				this.$emit('nodeclick', e)
+			},
+			ondatachange(e) {
+				this._treeData = this.$refs.pickerView._treeData
+			},
+			onchange(e) {
+				this.hide()
+				this.inputSelected = e
+				this._dispatchEvent(e)
+			},
+			_processReadonly(dataList, value) {
+				var isTree = dataList.findIndex((item) => {
+					return item.children
+				})
+				if (isTree > -1) {
+					let inputValue
+					if (Array.isArray(value)) {
+						inputValue = value[value.length - 1]
+						if (typeof inputValue === 'object' && inputValue.value) {
+							inputValue = inputValue.value
+						}
+					} else {
+						inputValue = value
+					}
+					this.inputSelected = this._findNodePath(inputValue, this.localdata)
+					return
+				}
+
+				if (!this.hasValue) {
+					this.inputSelected = []
+					return
+				}
+
+				let result = []
+				for (let i = 0; i < value.length; i++) {
+					var val = value[i]
+					var item = dataList.find((v) => {
+						return v.value == val
+					})
+					if (item) {
+						result.push(item)
+					}
+				}
+				if (result.length) {
+					this.inputSelected = result
+				}
+			},
+			_filterForArray(data, valueArray) {
+				var result = []
+				for (let i = 0; i < valueArray.length; i++) {
+					var value = valueArray[i]
+					var found = data.find((item) => {
+						return item.value == value
+					})
+					if (found) {
+						result.push(found)
+					}
+				}
+				return result
+			},
+			_dispatchEvent(selected) {
+				let item = {}
+				if (selected.length) {
+					var value = new Array(selected.length)
+					for (var i = 0; i < selected.length; i++) {
+						value[i] = selected[i].value
+					}
+					item = selected[selected.length - 1]
+				} else {
+					item.value = ''
+				}
+				if (this.formItem) {
+					this.formItem.setValue(item.value)
+				}
+
+				this.$emit('input', item.value)
+				this.$emit('update:modelValue', item.value)
+				this.$emit('change', {
+					detail: {
+						value: selected
+					}
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped>
+	.uni-data-tree {
+		position: relative;
+		font-size: 14px;
+	}
+
+	.error-text {
+		color: #DD524D;
+	}
+
+	.input-value {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+		flex-wrap: nowrap;
+		font-size: 14px;
+		line-height: 38px;
+		padding: 0 5px;
+		overflow: hidden;
+		/* #ifdef APP-NVUE */
+		height: 40px;
+		/* #endif */
+	}
+
+	.input-value-border {
+		border: 1px solid #e5e5e5;
+		border-radius: 5px;
+	}
+
+	.selected-area {
+		flex: 1;
+		overflow: hidden;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+	}
+
+	.load-more {
+		/* #ifndef APP-NVUE */
+		margin-right: auto;
+		/* #endif */
+		/* #ifdef APP-NVUE */
+		width: 40px;
+		/* #endif */
+	}
+
+	.selected-list {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		flex-wrap: nowrap;
+		padding: 0 5px;
+	}
+
+	.selected-item {
+		flex-direction: row;
+		padding: 0 1px;
+		/* #ifndef APP-NVUE */
+		white-space: nowrap;
+		/* #endif */
+	}
+
+	.placeholder {
+		color: grey;
+	}
+
+	.input-split-line {
+		opacity: .5;
+	}
+
+	.arrow-area {
+		position: relative;
+		width: 20px;
+		/* #ifndef APP-NVUE */
+		margin-bottom: 5px;
+		margin-left: auto;
+		display: flex;
+		/* #endif */
+		justify-content: center;
+		transform: rotate(-45deg);
+		transform-origin: center;
+	}
+
+	.input-arrow {
+		width: 7px;
+		height: 7px;
+		border-left: 1px solid #999;
+		border-bottom: 1px solid #999;
+	}
+
+	.uni-data-tree-cover {
+		position: fixed;
+		left: 0;
+		top: 0;
+		right: 0;
+		bottom: 0;
+		background-color: rgba(0, 0, 0, .4);
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		z-index: 100;
+	}
+
+	.uni-data-tree-dialog {
+		position: fixed;
+		left: 0;
+		top: 20%;
+		right: 0;
+		bottom: 0;
+		background-color: #FFFFFF;
+		border-top-left-radius: 10px;
+		border-top-right-radius: 10px;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		z-index: 102;
+		overflow: hidden;
+		/* #ifdef APP-NVUE */
+		width: 750rpx;
+		/* #endif */
+	}
+
+	.dialog-caption {
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		/* border-bottom: 1px solid #f0f0f0; */
+	}
+
+	.title-area {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		align-items: center;
+		/* #ifndef APP-NVUE */
+		margin: auto;
+		/* #endif */
+		padding: 0 10px;
+	}
+
+	.dialog-title {
+		/* font-weight: bold; */
+		line-height: 44px;
+	}
+
+	.dialog-close {
+		position: absolute;
+		top: 0;
+		right: 0;
+		bottom: 0;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+		padding: 0 15px;
+	}
+
+	.dialog-close-plus {
+		width: 16px;
+		height: 2px;
+		background-color: #666;
+		border-radius: 2px;
+		transform: rotate(45deg);
+	}
+
+	.dialog-close-rotate {
+		position: absolute;
+		transform: rotate(-45deg);
+	}
+
+	.picker-view {
+		flex: 1;
+		overflow: hidden;
+	}
+
+	/* #ifdef H5 */
+	@media all and (min-width: 768px) {
+		.uni-data-tree-cover {
+			background-color: transparent;
+		}
+
+		.uni-data-tree-dialog {
+			position: absolute;
+			top: 55px;
+			height: auto;
+			min-height: 400px;
+			max-height: 50vh;
+			background-color: #fff;
+			border: 1px solid #EBEEF5;
+			box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
+			border-radius: 4px;
+			overflow: unset;
+		}
+
+		.dialog-caption {
+			display: none;
+		}
+
+		.icon-clear {
+			margin-right: 5px;
+		}
+	}
+
+	/* #endif */
+	
+	/* picker 弹出层通用的指示小三角, todo:扩展至上下左右方向定位 */
+	.uni-popper__arrow,
+	.uni-popper__arrow::after {
+		position: absolute;
+		display: block;
+		width: 0;
+		height: 0;
+		border-color: transparent;
+		border-style: solid;
+		border-width: 6px;
+	}
+
+	.uni-popper__arrow {
+		filter: drop-shadow(0 2px 12px rgba(0, 0, 0, 0.03));
+		top: -6px;
+		left: 10%;
+		margin-right: 3px;
+		border-top-width: 0;
+		border-bottom-color: #EBEEF5;
+	}
+
+	.uni-popper__arrow::after {
+		content: " ";
+		top: 1px;
+		margin-left: -6px;
+		border-top-width: 0;
+		border-bottom-color: #fff;
+	}
+	</style>

+ 563 - 0
uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js

@@ -0,0 +1,563 @@
+export default {
+  props: {
+    localdata: {
+      type: [Array, Object],
+      default () {
+        return []
+      }
+    },
+    spaceInfo: {
+      type: Object,
+      default () {
+        return {}
+      }
+    },
+    collection: {
+      type: String,
+      default: ''
+    },
+    action: {
+      type: String,
+      default: ''
+    },
+    field: {
+      type: String,
+      default: ''
+    },
+    orderby: {
+      type: String,
+      default: ''
+    },
+    where: {
+      type: [String, Object],
+      default: ''
+    },
+    pageData: {
+      type: String,
+      default: 'add'
+    },
+    pageCurrent: {
+      type: Number,
+      default: 1
+    },
+    pageSize: {
+      type: Number,
+      default: 20
+    },
+    getcount: {
+      type: [Boolean, String],
+      default: false
+    },
+    getone: {
+      type: [Boolean, String],
+      default: false
+    },
+    gettree: {
+      type: [Boolean, String],
+      default: false
+    },
+    manual: {
+      type: Boolean,
+      default: false
+    },
+    value: {
+      type: [Array, String, Number],
+      default () {
+        return []
+      }
+    },
+    modelValue: {
+      type: [Array, String, Number],
+      default () {
+        return []
+      }
+    },
+    preload: {
+      type: Boolean,
+      default: false
+    },
+    stepSearh: {
+      type: Boolean,
+      default: true
+    },
+    selfField: {
+      type: String,
+      default: ''
+    },
+    parentField: {
+      type: String,
+      default: ''
+    },
+    multiple: {
+      type: Boolean,
+      default: false
+    },
+    map: {
+      type: Object,
+      default() {
+        return {
+          text: "text",
+          value: "value"
+        }
+      }
+    }
+  },
+  data() {
+    return {
+      loading: false,
+      errorMessage: '',
+      loadMore: {
+        contentdown: '',
+        contentrefresh: '',
+        contentnomore: ''
+      },
+      dataList: [],
+      selected: [],
+      selectedIndex: 0,
+      page: {
+        current: this.pageCurrent,
+        size: this.pageSize,
+        count: 0
+      }
+    }
+  },
+  computed: {
+    isLocaldata() {
+      return !this.collection.length
+    },
+    postField() {
+      let fields = [this.field];
+      if (this.parentField) {
+        fields.push(`${this.parentField} as parent_value`);
+      }
+      return fields.join(',');
+    },
+    dataValue() {
+      let isModelValue = Array.isArray(this.modelValue) ? (this.modelValue.length > 0) : (this.modelValue !== null || this.modelValue !== undefined)
+      return isModelValue ? this.modelValue : this.value
+    },
+    hasValue() {
+      if (typeof this.dataValue === 'number') {
+        return true
+      }
+      return (this.dataValue != null) && (this.dataValue.length > 0)
+    }
+  },
+  created() {
+    this.$watch(() => {
+      var al = [];
+      ['pageCurrent',
+        'pageSize',
+        'spaceInfo',
+        'value',
+        'modelValue',
+        'localdata',
+        'collection',
+        'action',
+        'field',
+        'orderby',
+        'where',
+        'getont',
+        'getcount',
+        'gettree'
+      ].forEach(key => {
+        al.push(this[key])
+      });
+      return al
+    }, (newValue, oldValue) => {
+      let needReset = false
+      for (let i = 2; i < newValue.length; i++) {
+        if (newValue[i] != oldValue[i]) {
+          needReset = true
+          break
+        }
+      }
+      if (newValue[0] != oldValue[0]) {
+        this.page.current = this.pageCurrent
+      }
+      this.page.size = this.pageSize
+
+      this.onPropsChange()
+    })
+    this._treeData = []
+  },
+  methods: {
+    onPropsChange() {
+      this._treeData = []
+    },
+    getCommand(options = {}) {
+      /* eslint-disable no-undef */
+      let db = uniCloud.database(this.spaceInfo)
+
+      const action = options.action || this.action
+      if (action) {
+        db = db.action(action)
+      }
+
+      const collection = options.collection || this.collection
+      db = db.collection(collection)
+
+      const where = options.where || this.where
+      if (!(!where || !Object.keys(where).length)) {
+        db = db.where(where)
+      }
+
+      const field = options.field || this.field
+      if (field) {
+        db = db.field(field)
+      }
+
+      const orderby = options.orderby || this.orderby
+      if (orderby) {
+        db = db.orderBy(orderby)
+      }
+
+      const current = options.pageCurrent !== undefined ? options.pageCurrent : this.page.current
+      const size = options.pageSize !== undefined ? options.pageSize : this.page.size
+      const getCount = options.getcount !== undefined ? options.getcount : this.getcount
+      const getTree = options.gettree !== undefined ? options.gettree : this.gettree
+
+      const getOptions = {
+        getCount,
+        getTree
+      }
+      if (options.getTreePath) {
+        getOptions.getTreePath = options.getTreePath
+      }
+
+      db = db.skip(size * (current - 1)).limit(size).get(getOptions)
+
+      return db
+    },
+		getNodeData(callback) {
+		  if (this.loading) {
+		    return
+		  }
+		  this.loading = true
+		  this.getCommand({
+		    field: this.postField,
+				where: this._pathWhere()
+		  }).then((res) => {
+		    this.loading = false
+		    this.selected = res.result.data
+		    callback && callback()
+		  }).catch((err) => {
+		    this.loading = false
+		    this.errorMessage = err
+		  })
+		},
+    getTreePath(callback) {
+      if (this.loading) {
+        return
+      }
+      this.loading = true
+
+      this.getCommand({
+        field: this.postField,
+        getTreePath: {
+          startWith: `${this.selfField}=='${this.dataValue}'`
+        }
+      }).then((res) => {
+        this.loading = false
+        let treePath = []
+        this._extractTreePath(res.result.data, treePath)
+        this.selected = treePath
+        callback && callback()
+      }).catch((err) => {
+        this.loading = false
+        this.errorMessage = err
+      })
+    },
+    loadData() {
+      if (this.isLocaldata) {
+        this._processLocalData()
+        return
+      }
+
+      if (this.dataValue != null) {
+        this._loadNodeData((data) => {
+          this._treeData = data
+          this._updateBindData()
+          this._updateSelected()
+        })
+        return
+      }
+
+      if (this.stepSearh) {
+        this._loadNodeData((data) => {
+          this._treeData = data
+          this._updateBindData()
+        })
+      } else {
+        this._loadAllData((data) => {
+          this._treeData = []
+          this._extractTree(data, this._treeData, null)
+          this._updateBindData()
+        })
+      }
+    },
+    _loadAllData(callback) {
+      if (this.loading) {
+        return
+      }
+      this.loading = true
+
+      this.getCommand({
+        field: this.postField,
+        gettree: true,
+        startwith: `${this.selfField}=='${this.dataValue}'`
+      }).then((res) => {
+        this.loading = false
+        callback(res.result.data)
+        this.onDataChange()
+      }).catch((err) => {
+        this.loading = false
+        this.errorMessage = err
+      })
+    },
+    _loadNodeData(callback, pw) {
+      if (this.loading) {
+        return
+      }
+      this.loading = true
+
+      this.getCommand({
+        field: this.postField,
+        where: pw || this._postWhere(),
+        pageSize: 500
+      }).then((res) => {
+        this.loading = false
+        callback(res.result.data)
+        this.onDataChange()
+      }).catch((err) => {
+        this.loading = false
+        this.errorMessage = err
+      })
+    },
+    _pathWhere() {
+      let result = []
+      let where_field = this._getParentNameByField();
+      if (where_field) {
+        result.push(`${where_field} == '${this.dataValue}'`)
+      }
+
+      if (this.where) {
+        return `(${this.where}) && (${result.join(' || ')})`
+      }
+
+      return result.join(' || ')
+    },
+    _postWhere() {
+      let result = []
+      let selected = this.selected
+      let parentField = this.parentField
+      if (parentField) {
+        result.push(`${parentField} == null || ${parentField} == ""`)
+      }
+      if (selected.length) {
+        for (var i = 0; i < selected.length - 1; i++) {
+          result.push(`${parentField} == '${selected[i].value}'`)
+        }
+      }
+
+      let where = []
+      if (this.where) {
+        where.push(`(${this.where})`)
+      }
+      if (result.length) {
+        where.push(`(${result.join(' || ')})`)
+      }
+
+      return where.join(' && ')
+    },
+    _nodeWhere() {
+      let result = []
+      let selected = this.selected
+      if (selected.length) {
+        result.push(`${this.parentField} == '${selected[selected.length - 1].value}'`)
+      }
+
+      if (this.where) {
+        return `(${this.where}) && (${result.join(' || ')})`
+      }
+
+      return result.join(' || ')
+    },
+    _getParentNameByField() {
+      const fields = this.field.split(',');
+      let where_field = null;
+      for (let i = 0; i < fields.length; i++) {
+        const items = fields[i].split('as');
+        if (items.length < 2) {
+          continue;
+        }
+        if (items[1].trim() === 'value') {
+          where_field = items[0].trim();
+          break;
+        }
+      }
+      return where_field
+    },
+    _isTreeView() {
+      return (this.parentField && this.selfField)
+    },
+    _updateSelected() {
+      var dl = this.dataList
+      var sl = this.selected
+      let textField = this.map.text
+      let valueField = this.map.value
+      for (var i = 0; i < sl.length; i++) {
+        var value = sl[i].value
+        var dl2 = dl[i]
+        for (var j = 0; j < dl2.length; j++) {
+          var item2 = dl2[j]
+          if (item2[valueField] === value) {
+            sl[i].text = item2[textField]
+            break
+          }
+        }
+      }
+    },
+    _updateBindData(node) {
+      const {
+        dataList,
+        hasNodes
+      } = this._filterData(this._treeData, this.selected)
+
+      let isleaf = this._stepSearh === false && !hasNodes
+
+      if (node) {
+        node.isleaf = isleaf
+      }
+
+      this.dataList = dataList
+      this.selectedIndex = dataList.length - 1
+
+      if (!isleaf && this.selected.length < dataList.length) {
+        this.selected.push({
+          value: null,
+          text: "请选择"
+        })
+      }
+
+      return {
+        isleaf,
+        hasNodes
+      }
+    },
+    _filterData(data, paths) {
+      let dataList = []
+      let hasNodes = true
+
+      dataList.push(data.filter((item) => {
+        return (item.parent_value === null || item.parent_value === undefined || item.parent_value === '')
+      }))
+      for (let i = 0; i < paths.length; i++) {
+        var value = paths[i].value
+        var nodes = data.filter((item) => {
+          return item.parent_value === value
+        })
+
+        if (nodes.length) {
+          dataList.push(nodes)
+        } else {
+          hasNodes = false
+        }
+      }
+
+      return {
+        dataList,
+        hasNodes
+      }
+    },
+    _extractTree(nodes, result, parent_value) {
+      let list = result || []
+      let valueField = this.map.value
+      for (let i = 0; i < nodes.length; i++) {
+        let node = nodes[i]
+
+        let child = {}
+        for (let key in node) {
+          if (key !== 'children') {
+            child[key] = node[key]
+          }
+        }
+        if (parent_value !== null && parent_value !== undefined && parent_value !== '') {
+          child.parent_value = parent_value
+        }
+        result.push(child)
+
+        let children = node.children
+        if (children) {
+          this._extractTree(children, result, node[valueField])
+        }
+      }
+    },
+    _extractTreePath(nodes, result) {
+      let list = result || []
+      for (let i = 0; i < nodes.length; i++) {
+        let node = nodes[i]
+
+        let child = {}
+        for (let key in node) {
+          if (key !== 'children') {
+            child[key] = node[key]
+          }
+        }
+        result.push(child)
+
+        let children = node.children
+        if (children) {
+          this._extractTreePath(children, result)
+        }
+      }
+    },
+    _findNodePath(key, nodes, path = []) {
+      let textField = this.map.text
+      let valueField = this.map.value
+      for (let i = 0; i < nodes.length; i++) {
+        let node = nodes[i]
+        let children = node.children
+        let text = node[textField]
+        let value = node[valueField]
+
+        path.push({
+          value,
+          text
+        })
+
+        if (value === key) {
+          return path
+        }
+
+        if (children) {
+          const p = this._findNodePath(key, children, path)
+          if (p.length) {
+            return p
+          }
+        }
+
+        path.pop()
+      }
+      return []
+    },
+    _processLocalData() {
+      this._treeData = []
+      this._extractTree(this.localdata, this._treeData)
+
+      var inputValue = this.dataValue
+      if (inputValue === undefined) {
+        return
+      }
+
+      if (Array.isArray(inputValue)) {
+        inputValue = inputValue[inputValue.length - 1]
+        if (typeof inputValue === 'object' && inputValue[this.map.value]) {
+          inputValue = inputValue[this.map.value]
+        }
+      }
+
+      this.selected = this._findNodePath(inputValue, this.localdata)
+    }
+  }
+}

+ 333 - 0
uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue

@@ -0,0 +1,333 @@
+<template>
+	<view class="uni-data-pickerview">
+		<scroll-view class="selected-area" scroll-x="true" scroll-y="false" :show-scrollbar="false">
+			<view class="selected-list">
+				<template v-for="(item,index) in selected">
+					<view class="selected-item"
+						:class="{'selected-item-active':index==selectedIndex, 'selected-item-text-overflow': ellipsis}"
+						:key="index" v-if="item.text" @click="handleSelect(index)">
+						<text class="">{{item.text}}</text>
+					</view>
+				</template>
+			</view>
+		</scroll-view>
+		<view class="tab-c">
+			<template v-for="(child, i) in dataList">
+				<scroll-view class="list" :key="i" v-if="i==selectedIndex" :scroll-y="true">
+					<view class="item" :class="{'is-disabled': !!item.disable}" v-for="(item, j) in child" :key="j"
+						@click="handleNodeClick(item, i, j)">
+						<text class="item-text item-text-overflow">{{item[map.text]}}</text>
+						<view class="check" v-if="selected.length > i && item[map.value] == selected[i].value"></view>
+					</view>
+				</scroll-view>
+			</template>
+
+			<view class="loading-cover" v-if="loading">
+				<uni-load-more class="load-more" :contentText="loadMore" status="loading"></uni-load-more>
+			</view>
+			<view class="error-message" v-if="errorMessage">
+				<text class="error-text">{{errorMessage}}</text>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import dataPicker from "./uni-data-picker.js"
+
+	/**
+	 * DataPickerview
+	 * @description uni-data-pickerview
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=3796
+	 * @property {Array} localdata 本地数据,参考
+	 * @property {Boolean} step-searh = [true|false] 是否分布查询
+	 * @value true 启用分布查询,仅查询当前选中节点
+	 * @value false 关闭分布查询,一次查询出所有数据
+	 * @property {String|DBFieldString} self-field 分布查询当前字段名称
+	 * @property {String|DBFieldString} parent-field 分布查询父字段名称
+	 * @property {String|DBCollectionString} collection 表名
+	 * @property {String|DBFieldString} field 查询字段,多个字段用 `,` 分割
+	 * @property {String} orderby 排序字段及正序倒叙设置
+	 * @property {String|JQLString} where 查询条件
+	 */
+	export default {
+		name: 'UniDataPickerView',
+		emits: ['nodeclick', 'change', 'datachange', 'update:modelValue'],
+		mixins: [dataPicker],
+		props: {
+			managedMode: {
+				type: Boolean,
+				default: false
+			},
+			ellipsis: {
+				type: Boolean,
+				default: true
+			}
+		},
+		data() {
+			return {}
+		},
+		created() {
+			if (this.managedMode) {
+				return
+			}
+
+			this.$nextTick(() => {
+				this.load()
+			})
+		},
+		methods: {
+			onPropsChange() {
+				this._treeData = []
+				this.selectedIndex = 0
+				this.load()
+			},
+			load() {
+				if (this.isLocaldata) {
+					this.loadData()
+				} else if (this.dataValue.length) {
+					this.getTreePath((res) => {
+						this.loadData()
+					})
+				}
+			},
+			handleSelect(index) {
+				this.selectedIndex = index
+			},
+			handleNodeClick(item, i, j) {
+				if (item.disable) {
+					return
+				}
+				const node = this.dataList[i][j]
+				const text = node[this.map.text]
+				const value = node[this.map.value]
+				if (i < this.selected.length - 1) {
+					this.selected.splice(i, this.selected.length - i)
+					this.selected.push({
+						text,
+						value
+					})
+				} else if (i === this.selected.length - 1) {
+					this.selected.splice(i, 1, {
+						text,
+						value
+					})
+				}
+
+				if (node.isleaf) {
+					this.onSelectedChange(node, node.isleaf)
+					return
+				}
+
+				const {
+					isleaf,
+					hasNodes
+				} = this._updateBindData()
+
+				if (!this._isTreeView() && !hasNodes) {
+					this.onSelectedChange(node, true)
+					return
+				}
+
+				if (this.isLocaldata && (!hasNodes || isleaf)) {
+					this.onSelectedChange(node, true)
+					return
+				}
+
+				if (!isleaf && !hasNodes) {
+					this._loadNodeData((data) => {
+						if (!data.length) {
+							node.isleaf = true
+						} else {
+							this._treeData.push(...data)
+							this._updateBindData(node)
+						}
+						this.onSelectedChange(node, node.isleaf)
+					}, this._nodeWhere())
+					return
+				}
+
+				this.onSelectedChange(node, false)
+			},
+			updateData(data) {
+				this._treeData = data.treeData
+				this.selected = data.selected
+				if (!this._treeData.length) {
+					this.loadData()
+				} else {
+					//this.selected = data.selected
+					this._updateBindData()
+				}
+			},
+			onDataChange() {
+				this.$emit('datachange')
+			},
+			onSelectedChange(node, isleaf) {
+				if (isleaf) {
+					this._dispatchEvent()
+				}
+
+				if (node) {
+					this.$emit('nodeclick', node)
+				}
+			},
+			_dispatchEvent() {
+				this.$emit('change', this.selected.slice(0))
+			}
+		}
+	}
+</script>
+<style scoped>
+	.uni-data-pickerview {
+		flex: 1;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		overflow: hidden;
+		height: 100%;
+	}
+
+	.error-text {
+		color: #DD524D;
+	}
+
+	.loading-cover {
+		position: absolute;
+		left: 0;
+		top: 0;
+		right: 0;
+		bottom: 0;
+		background-color: rgba(255, 255, 255, .5);
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		align-items: center;
+		z-index: 1001;
+	}
+
+	.load-more {
+		/* #ifndef APP-NVUE */
+		margin: auto;
+		/* #endif */
+	}
+
+	.error-message {
+		background-color: #fff;
+		position: absolute;
+		left: 0;
+		top: 0;
+		right: 0;
+		bottom: 0;
+		padding: 15px;
+		opacity: .9;
+		z-index: 102;
+	}
+
+	/* #ifdef APP-NVUE */
+	.selected-area {
+		width: 750rpx;
+	}
+
+	/* #endif */
+
+	.selected-list {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		flex-wrap: nowrap;
+		padding: 0 5px;
+		border-bottom: 1px solid #f8f8f8;
+	}
+
+	.selected-item {
+		margin-left: 10px;
+		margin-right: 10px;
+		padding: 12px 0;
+		text-align: center;
+		/* #ifndef APP-NVUE */
+		white-space: nowrap;
+		/* #endif */
+	}
+
+	.selected-item-text-overflow {
+		width: 168px;
+		/* fix nvue */
+		overflow: hidden;
+		/* #ifndef APP-NVUE */
+		width: 6em;
+		white-space: nowrap;
+		text-overflow: ellipsis;
+		-o-text-overflow: ellipsis;
+		/* #endif */
+	}
+
+	.selected-item-active {
+		border-bottom: 2px solid #007aff;
+	}
+
+	.selected-item-text {
+		color: #007aff;
+	}
+
+	.tab-c {
+		position: relative;
+		flex: 1;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		overflow: hidden;
+	}
+
+	.list {
+		flex: 1;
+	}
+
+	.item {
+		padding: 12px 15px;
+		/* border-bottom: 1px solid #f0f0f0; */
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		justify-content: space-between;
+	}
+
+	.is-disabled {
+		opacity: .5;
+	}
+
+	.item-text {
+		/* flex: 1; */
+		color: #333333;
+	}
+
+	.item-text-overflow {
+		width: 280px;
+		/* fix nvue */
+		overflow: hidden;
+		/* #ifndef APP-NVUE */
+		width: 20em;
+		white-space: nowrap;
+		text-overflow: ellipsis;
+		-o-text-overflow: ellipsis;
+		/* #endif */
+	}
+
+	.check {
+		margin-right: 5px;
+		border: 2px solid #007aff;
+		border-left: 0;
+		border-top: 0;
+		height: 12px;
+		width: 6px;
+		transform-origin: center;
+		/* #ifndef APP-NVUE */
+		transition: all 0.3s;
+		/* #endif */
+		transform: rotate(45deg);
+	}
+</style>

+ 92 - 0
uni_modules/uni-data-picker/package.json

@@ -0,0 +1,92 @@
+{
+  "id": "uni-data-picker",
+  "displayName": "uni-data-picker 数据驱动的picker选择器",
+  "version": "1.0.1",
+  "description": "单列、多列级联选择器,常用于省市区城市选择、公司部门选择、多级分类等场景",
+  "keywords": [
+    "uni-ui",
+    "uniui",
+    "picker",
+    "级联",
+    "省市区",
+    ""
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": ""
+  },
+  "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-load-more",
+			"uni-icons",
+			"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"
+        }
+      }
+    }
+  }
+}

+ 22 - 0
uni_modules/uni-data-picker/readme.md

@@ -0,0 +1,22 @@
+## DataPicker 级联选择
+> **组件名:uni-data-picker**
+> 代码块: `uDataPicker`
+> 关联组件:`uni-data-pickerview`、`uni-load-more`。
+
+
+`<uni-data-picker>` 是一个选择类[datacom组件](https://uniapp.dcloud.net.cn/component/datacom)。
+
+支持单列、和多列级联选择。列数没有限制,如果屏幕显示不全,顶部tab区域会左右滚动。
+
+候选数据支持一次性加载完毕,也支持懒加载,比如示例图中,选择了“北京”后,动态加载北京的区县数据。
+
+`<uni-data-picker>` 组件尤其适用于地址选择、分类选择等选择类。
+
+`<uni-data-picker>` 支持本地数据、云端静态数据(json),uniCloud云数据库数据。
+
+`<uni-data-picker>` 可以通过JQL直连uniCloud云数据库,配套[DB Schema](https://uniapp.dcloud.net.cn/uniCloud/schema),可在schema2code中自动生成前端页面,还支持服务器端校验。
+
+在uniCloud数据表中新建表“uni-id-address”和“opendb-city-china”,这2个表的schema自带foreignKey关联。在“uni-id-address”表的表结构页面使用schema2code生成前端页面,会自动生成地址管理的维护页面,自动从“opendb-city-china”表包含的中国所有省市区信息里选择地址。
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-data-picker)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 

+ 6 - 0
uni_modules/uni-icons/changelog.md

@@ -1,3 +1,9 @@
+## 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)

+ 54 - 0
uni_modules/uni-icons/components/uni-icons/icons.js

@@ -173,6 +173,13 @@ export default {
       "unicode": "e6bb",
       "unicode_decimal": 59067
     },
+		{
+		  "icon_id": "24923353",
+		  "name": "arrowthinright",
+		  "font_class": "arrowthinright",
+		  "unicode": "e6bb",
+		  "unicode_decimal": 59067
+		},
     {
       "icon_id": "24923354",
       "name": "arrowthinleft",
@@ -180,6 +187,13 @@ export default {
       "unicode": "e6bc",
       "unicode_decimal": 59068
     },
+		{
+		  "icon_id": "24923354",
+		  "name": "arrowthinleft",
+		  "font_class": "arrowthinleft",
+		  "unicode": "e6bc",
+		  "unicode_decimal": 59068
+		},
     {
       "icon_id": "24923355",
       "name": "arrowthinup",
@@ -187,12 +201,25 @@ export default {
       "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",
@@ -200,6 +227,12 @@ export default {
       "font_class": "bottom",
       "unicode": "e6b8",
       "unicode_decimal": 59064
+    },{
+      "icon_id": "24923349",
+      "name": "arrowdown",
+      "font_class": "arrowdown",
+      "unicode": "e6b8",
+      "unicode_decimal": 59064
     },
     {
       "icon_id": "24923346",
@@ -208,6 +241,13 @@ export default {
       "unicode": "e6b5",
       "unicode_decimal": 59061
     },
+		{
+		  "icon_id": "24923346",
+		  "name": "arrowright",
+		  "font_class": "arrowright",
+		  "unicode": "e6b5",
+		  "unicode_decimal": 59061
+		},
     {
       "icon_id": "24923347",
       "name": "arrowup",
@@ -215,6 +255,13 @@ export default {
       "unicode": "e6b6",
       "unicode_decimal": 59062
     },
+		{
+		  "icon_id": "24923347",
+		  "name": "arrowup",
+		  "font_class": "arrowup",
+		  "unicode": "e6b6",
+		  "unicode_decimal": 59062
+		},
     {
       "icon_id": "24923348",
       "name": "arrowleft",
@@ -222,6 +269,13 @@ export default {
       "unicode": "e6b7",
       "unicode_decimal": 59063
     },
+		{
+		  "icon_id": "24923348",
+		  "name": "arrowleft",
+		  "font_class": "arrowleft",
+		  "unicode": "e6b7",
+		  "unicode_decimal": 59063
+		},
     {
       "icon_id": "24923334",
       "name": "eye",

+ 9 - 2
uni_modules/uni-icons/components/uni-icons/uni-icons.vue

@@ -1,14 +1,18 @@
 <template>
 	<!-- #ifdef APP-NVUE -->
-	<text :style="{ color: color, 'font-size': size + 'px' }" class="uni-icons" @click="_onClick">{{unicode}}</text>
+	<text :style="{ color: color, 'font-size': iconSize }" class="uni-icons" @click="_onClick">{{unicode}}</text>
 	<!-- #endif -->
 	<!-- #ifndef APP-NVUE -->
-	<text :style="{ color: color, 'font-size': size + 'px' }" class="uni-icons" :class="['uniui-'+type,customPrefix,customPrefix?type:'']" @click="_onClick"></text>
+	<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'
@@ -61,6 +65,9 @@
 					return unescape(`%u${code.unicode}`)
 				}
 				return ''
+			},
+			iconSize(){
+				return getVal(this.size)
 			}
 		},
 		methods: {

+ 1 - 1
uni_modules/uni-icons/package.json

@@ -1,7 +1,7 @@
 {
   "id": "uni-icons",
   "displayName": "uni-icons 图标",
-  "version": "1.3.2",
+  "version": "1.3.5",
   "description": "图标组件,用于展示移动端常见的图标,可自定义颜色、大小。",
   "keywords": [
     "uni-ui",

+ 19 - 0
uni_modules/uni-load-more/changelog.md

@@ -0,0 +1,19 @@
+## 1.3.3(2022-01-20)
+- 新增 showText属性 ,是否显示文本
+## 1.3.2(2022-01-19)
+- 修复 nvue 平台下不显示文本的bug
+## 1.3.1(2022-01-19)
+- 修复 微信小程序平台样式选择器报警告的问题
+## 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-load-more](https://uniapp.dcloud.io/component/uniui/uni-load-more)
+## 1.2.1(2021-08-24)
+- 新增 支持国际化
+## 1.2.0(2021-07-30)
+- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 1.1.8(2021-05-12)
+- 新增 组件示例地址
+## 1.1.7(2021-03-30)
+- 修复 uni-load-more 在首页使用时,h5 平台报 'uni is not defined' 的 bug
+## 1.1.6(2021-02-05)
+- 调整为uni_modules目录规范

+ 5 - 0
uni_modules/uni-load-more/components/uni-load-more/i18n/en.json

@@ -0,0 +1,5 @@
+{
+	"uni-load-more.contentdown": "Pull up to show more",
+	"uni-load-more.contentrefresh": "loading...",
+	"uni-load-more.contentnomore": "No more data"
+}

+ 8 - 0
uni_modules/uni-load-more/components/uni-load-more/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
+}

+ 0 - 0
uni_modules/uni-load-more/components/uni-load-more/i18n/zh-Hans.json


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