嘀嘀嘀 il y a 1 an
Parent
commit
cf41d31eaa
100 fichiers modifiés avec 4944 ajouts et 497 suppressions
  1. 16 0
      .hbuilderx/launch.json
  2. 1 1
      common/config.js
  3. 55 0
      common/httpRequest.js
  4. 2 2
      manifest.json
  5. 1 1
      pages.json
  6. 14 1
      pages/404/404.vue
  7. 286 225
      pages/index/index.vue
  8. 156 46
      pages/project/addProject.vue
  9. 74 50
      pages/project/addRenwu.vue
  10. 48 41
      pages/project/changeRenwu.vue
  11. 247 51
      pages/project/index.vue
  12. 382 37
      pages/project/projectChange.vue
  13. 250 12
      pages/project/projectX.vue
  14. 6 1
      pages/project/renwuUpdateJin.vue
  15. 29 12
      pages/project/renwuX.vue
  16. 4 4
      pages/project/sorce.vue
  17. 79 0
      uni_modules/uni-data-picker/changelog.md
  18. 45 0
      uni_modules/uni-data-picker/components/uni-data-picker/keypress.js
  19. 381 0
      uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.uvue
  20. 554 0
      uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.vue
  21. 564 0
      uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.js
  22. 692 0
      uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.uts
  23. 76 0
      uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.css
  24. 69 0
      uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.uvue
  25. 376 0
      uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.vue
  26. 91 0
      uni_modules/uni-data-picker/package.json
  27. 22 0
      uni_modules/uni-data-picker/readme.md
  28. 23 0
      uni_modules/uni-tag/changelog.md
  29. 252 0
      uni_modules/uni-tag/components/uni-tag/uni-tag.vue
  30. 84 0
      uni_modules/uni-tag/package.json
  31. 13 0
      uni_modules/uni-tag/readme.md
  32. BIN
      unpackage/dist/build/web.zip
  33. 1 1
      unpackage/dist/build/web/index.html
  34. BIN
      unpackage/dist/build/web/static/img/404.png
  35. BIN
      unpackage/dist/build/web/static/img/quesheng.png
  36. 1 1
      unpackage/dist/build/web/static/js/chunk-vendors.bd2ecca4.js
  37. 1 0
      unpackage/dist/build/web/static/js/index.91f1b726.js
  38. 0 1
      unpackage/dist/build/web/static/js/index.c2d1491d.js
  39. 1 0
      unpackage/dist/build/web/static/js/pages-404-404.a1eb1360.js
  40. 0 1
      unpackage/dist/build/web/static/js/pages-404-404.fda069c1.js
  41. 1 0
      unpackage/dist/build/web/static/js/pages-404-quesheng.5e4ec825.js
  42. 0 1
      unpackage/dist/build/web/static/js/pages-index-index.51fc21ae.js
  43. 1 0
      unpackage/dist/build/web/static/js/pages-index-index.99a72c99.js
  44. 1 0
      unpackage/dist/build/web/static/js/pages-index-index~pages-project-addProject~pages-project-addRenwu~pages-project-changeRenwu~pages-pr~6e77bd7c.331dbe54.js
  45. 0 1
      unpackage/dist/build/web/static/js/pages-index-index~pages-project-addProject~pages-project-addRenwu~pages-project-projectChange.dc36a4fb.js
  46. 0 1
      unpackage/dist/build/web/static/js/pages-index-index~pages-project-addRenwu.bda623e5.js
  47. 1 0
      unpackage/dist/build/web/static/js/pages-index-index~pages-project-addRenwu~pages-project-changeRenwu.7e6d0a2d.js
  48. 0 1
      unpackage/dist/build/web/static/js/pages-project-addProject.6f343f56.js
  49. 1 0
      unpackage/dist/build/web/static/js/pages-project-addProject.f02bb866.js
  50. 1 0
      unpackage/dist/build/web/static/js/pages-project-addProject~pages-project-addRenwu~pages-project-changeRenwu~pages-project-index~pages-~51e77e82.ce00d599.js
  51. 1 0
      unpackage/dist/build/web/static/js/pages-project-addProject~pages-project-addRenwu~pages-project-changeRenwu~pages-project-projectChang~dce6e7d1.1f88f1e7.js
  52. 0 1
      unpackage/dist/build/web/static/js/pages-project-addProject~pages-project-addRenwu~pages-project-projectChange.43a63999.js
  53. 1 0
      unpackage/dist/build/web/static/js/pages-project-addProject~pages-project-projectChange.f28e1406.js
  54. 0 1
      unpackage/dist/build/web/static/js/pages-project-addRenwu.2d635c86.js
  55. 1 0
      unpackage/dist/build/web/static/js/pages-project-addRenwu.3949b179.js
  56. 1 0
      unpackage/dist/build/web/static/js/pages-project-changeRenwu.da8a5335.js
  57. 0 1
      unpackage/dist/build/web/static/js/pages-project-index.64cff839.js
  58. 1 0
      unpackage/dist/build/web/static/js/pages-project-index.98ddc2b0.js
  59. 1 0
      unpackage/dist/build/web/static/js/pages-project-projectChange.1eee929c.js
  60. 0 1
      unpackage/dist/build/web/static/js/pages-project-projectChange.575cc14f.js
  61. 1 0
      unpackage/dist/build/web/static/js/pages-project-projectX.4c73c17f.js
  62. 1 0
      unpackage/dist/build/web/static/js/pages-project-renwuUpdateJin.c89897cf.js
  63. 1 0
      unpackage/dist/build/web/static/js/pages-project-renwuX.68f1bbaf.js
  64. 0 1
      unpackage/dist/build/web/static/js/pages-project-renwuX.e9f8f85b.js
  65. 1 0
      unpackage/dist/build/web/static/js/pages-project-sorce.82abbf17.js
  66. BIN
      unpackage/dist/build/web/static/project/select.png
  67. 0 0
      unpackage/dist/dev/.automator/mp-weixin/.automator.json
  68. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/common/main.js.map
  69. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/common/runtime.js.map
  70. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/common/vendor.js.map
  71. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/components/my-selectCheckbox.js.map
  72. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/404/404.js.map
  73. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/404/quesheng.js.map
  74. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/index/index.js.map
  75. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/project/addProject.js.map
  76. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/project/addRenwu.js.map
  77. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/project/changeRenwu.js.map
  78. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/project/index.js.map
  79. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/project/projectChange.js.map
  80. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/project/projectX.js.map
  81. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/project/renwuUpdateJin.js.map
  82. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/project/renwuX.js.map
  83. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/pages/project/sorce.js.map
  84. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.js.map
  85. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.js.map
  86. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.js.map
  87. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.js.map
  88. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.js.map
  89. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.js.map
  90. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.js.map
  91. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.js.map
  92. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-file-picker/components/uni-file-picker/upload-file.js.map
  93. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-file-picker/components/uni-file-picker/upload-image.js.map
  94. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-icons/components/uni-icons/uni-icons.js.map
  95. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.js.map
  96. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-popup/components/uni-popup/uni-popup.js.map
  97. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-table/components/uni-table/uni-table.js.map
  98. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-table/components/uni-td/uni-td.js.map
  99. 1 0
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-table/components/uni-th/uni-th.js.map
  100. 0 0
      unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-table/components/uni-tr/table-checkbox.js.map

+ 16 - 0
.hbuilderx/launch.json

@@ -0,0 +1,16 @@
+{ // launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/
+  // launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数
+    "version": "0.0",
+    "configurations": [{
+     	"default" : 
+     	{
+     		"launchtype" : "local"
+     	},
+     	"mp-weixin" : 
+     	{
+     		"launchtype" : "local"
+     	},
+     	"type" : "uniCloud"
+     }
+    ]
+}

+ 1 - 1
common/config.js

@@ -1,5 +1,5 @@
 
-const ROOTPATH1 = "/template"//"https://chtech.ncjti.edu.cn/kpi/template";
+const ROOTPATH1 = "/kpi/template"//"https://chtech.ncjti.edu.cn/kpi/template";
 
 module.exports = {
     APIHOST1: ROOTPATH1,

+ 55 - 0
common/httpRequest.js

@@ -61,6 +61,11 @@ module.exports = {
 						if(result.data.message=="登录凭证已过去,请重新登录"){
 							uni.removeStorageSync("tokenW")
 							uni.removeStorageSync("roleId")
+							uni.removeStorageSync("crerenwu")
+							uni.removeStorageSync("uprenwu")
+							uni.removeStorageSync("delerenwu")
+							uni.removeStorageSync("cuirenwu")
+							uni.removeStorageSync("gengrenwu")
 							uni.showModal({
 								title: '提示',
 								content: '用户信息失效,请重新登录!',
@@ -77,6 +82,11 @@ module.exports = {
 						if (result.data.code == 401 && token) {
 							uni.removeStorageSync("tokenW")
 							uni.removeStorageSync("roleId")
+							uni.removeStorageSync("crerenwu")
+							uni.removeStorageSync("uprenwu")
+							uni.removeStorageSync("delerenwu")
+							uni.removeStorageSync("cuirenwu")
+							uni.removeStorageSync("gengrenwu")
 							uni.showModal({
 								title: '提示',
 								content: '用户信息失效,请重新登录!',
@@ -158,6 +168,11 @@ module.exports = {
 						if(result.data.message=="登录凭证已过去,请重新登录"){
 							uni.removeStorageSync("tokenW")
 							uni.removeStorageSync("roleId")
+							uni.removeStorageSync("crerenwu")
+							uni.removeStorageSync("uprenwu")
+							uni.removeStorageSync("delerenwu")
+							uni.removeStorageSync("cuirenwu")
+							uni.removeStorageSync("gengrenwu")
 							uni.showModal({
 								title: '提示',
 								content: '用户信息失效,请重新登录!',
@@ -174,6 +189,11 @@ module.exports = {
 						if (result.data.code == 401 && token) {
 							uni.removeStorageSync("tokenW")
 							uni.removeStorageSync("roleId")
+							uni.removeStorageSync("crerenwu")
+							uni.removeStorageSync("uprenwu")
+							uni.removeStorageSync("delerenwu")
+							uni.removeStorageSync("cuirenwu")
+							uni.removeStorageSync("gengrenwu")
 							uni.showModal({
 								title: '提示',
 								content: '用户信息失效,请重新登录!',
@@ -211,6 +231,11 @@ module.exports = {
 						if(result.data.message=="登录凭证已过去,请重新登录"){
 							uni.removeStorageSync("tokenW")
 							uni.removeStorageSync("roleId")
+							uni.removeStorageSync("crerenwu")
+							uni.removeStorageSync("uprenwu")
+							uni.removeStorageSync("delerenwu")
+							uni.removeStorageSync("cuirenwu")
+							uni.removeStorageSync("gengrenwu")
 							uni.showModal({
 								title: '提示',
 								content: '用户信息失效,请重新登录!',
@@ -227,6 +252,11 @@ module.exports = {
 						if (result.data.code == 401) {
 							uni.removeStorageSync("tokenW")
 							uni.removeStorageSync("roleId")
+							uni.removeStorageSync("crerenwu")
+							uni.removeStorageSync("uprenwu")
+							uni.removeStorageSync("delerenwu")
+							uni.removeStorageSync("cuirenwu")
+							uni.removeStorageSync("gengrenwu")
 							uni.showModal({
 								title: '提示',
 								content: '用户信息失效,请重新登录!',
@@ -284,6 +314,11 @@ module.exports = {
 					if(result.data.message=="登录凭证已过去,请重新登录"){
 						uni.removeStorageSync("tokenW")
 						uni.removeStorageSync("roleId")
+						uni.removeStorageSync("crerenwu")
+						uni.removeStorageSync("uprenwu")
+						uni.removeStorageSync("delerenwu")
+						uni.removeStorageSync("cuirenwu")
+						uni.removeStorageSync("gengrenwu")
 						uni.showModal({
 							title: '提示',
 							content: '用户信息失效,请重新登录!',
@@ -300,6 +335,11 @@ module.exports = {
 					if(result.data.message=="token为空"){
 						uni.removeStorageSync("tokenW")
 						uni.removeStorageSync("roleId")
+						uni.removeStorageSync("crerenwu")
+						uni.removeStorageSync("uprenwu")
+						uni.removeStorageSync("delerenwu")
+						uni.removeStorageSync("cuirenwu")
+						uni.removeStorageSync("gengrenwu")
 						uni.showModal({
 							title: '提示',
 							content: '请登录!',
@@ -316,6 +356,11 @@ module.exports = {
 					if (result.data.code == 401) {
 						uni.removeStorageSync("tokenW")
 						uni.removeStorageSync("roleId")
+						uni.removeStorageSync("crerenwu")
+						uni.removeStorageSync("uprenwu")
+						uni.removeStorageSync("delerenwu")
+						uni.removeStorageSync("cuirenwu")
+						uni.removeStorageSync("gengrenwu")
 	
 						uni.showModal({
 							title: '提示',
@@ -370,6 +415,11 @@ module.exports = {
 						if(result.data.message=="登录凭证已过去,请重新登录"){
 							uni.removeStorageSync("tokenW")
 							uni.removeStorageSync("roleId")
+							uni.removeStorageSync("crerenwu")
+							uni.removeStorageSync("uprenwu")
+							uni.removeStorageSync("delerenwu")
+							uni.removeStorageSync("cuirenwu")
+							uni.removeStorageSync("gengrenwu")
 							uni.showModal({
 								title: '提示',
 								content: '用户信息失效,请重新登录!',
@@ -386,6 +436,11 @@ module.exports = {
 						if (result.data.code == 401 && token) {
 							uni.removeStorageSync("tokenW")
 							uni.removeStorageSync("roleId")
+							uni.removeStorageSync("crerenwu")
+							uni.removeStorageSync("uprenwu")
+							uni.removeStorageSync("delerenwu")
+							uni.removeStorageSync("cuirenwu")
+							uni.removeStorageSync("gengrenwu")
 	
 							// uni.showModal({
 							// 	title: '提示',

+ 2 - 2
manifest.json

@@ -76,7 +76,7 @@
 		    "proxy" : {
 		        //使用代理
 		        // https://chtech.ncjti.edu.cn/hotel/ihotel-api/ihotel/roomType/list
-		        "/template" : {
+		        "/kpi/template" : {
 		            "target" : "https://chtech.ncjti.edu.cn/kpi/template", //目标地址
 		            // "target" : "http://192.168.161.190:8090/ihotel/auto", //目标地址
 		            "changeOrigin" : true,
@@ -84,7 +84,7 @@
 		
 		            // 设置地址重定向,把程序中/api开头的路径替换成:http://t.yushu.im"
 		            "pathRewrite" : {
-		                "/template" : "" // 设置/api路径重定向
+		                "/kpi/template" : "" // 设置/api路径重定向
 		            }
 		        }
 		    }

+ 1 - 1
pages.json

@@ -3,7 +3,7 @@
 		{
 			"path": "pages/index/index",
 			"style": {
-				"navigationBarTitleText": "项目过程管理系统",
+				"navigationBarTitleText": "项目管理系统",
 				"enablePullDownRefresh": true
 			}
 		},{

+ 14 - 1
pages/404/404.vue

@@ -1,11 +1,24 @@
 <template>
 	<view class="content">
 		<image src="../../static/img/404.png" class="quesheng"></image>
-		<view style="color: rgba(87, 146, 240, 1);">404</view>
+		<view style="color: rgba(87, 146, 240, 1);">{{err}}</view>
 	</view>
 </template>
 
 <script>
+	export default {
+		data() {
+			return {
+				err:'',
+			}
+		},
+		onLoad() {
+			this.err=uni.getStorageSync("message")
+		},
+		methods: {
+		}
+	}
+	
 </script>
 
 <style>

+ 286 - 225
pages/index/index.vue

@@ -1,219 +1,225 @@
 <template>
-	<view class="content">
-		<!-- 项目总览 -->
-		<view class="projectAll">
-			<view class="all-text">项目总览</view>
-			<view class="all-more" @click="takeMore">查看更多</view>
-			<view class="all-select">
-				<view class="all-list" style="margin-left: 15rpx;" v-if="change==0">今日</view>
-				<view class="all-list2" style="margin-left: 15rpx;" v-else @click="changeTime(0)">今日</view>
-				<view class="all-list" style="margin-left: 25rpx;" v-if="change==1">本周</view>
-				<view class="all-list2" style="margin-left: 25rpx;" v-else @click="changeTime(1)">本周</view>
-				<view class="all-list" style="margin-left: 25rpx;" v-if="change==2">本月</view>
-				<view class="all-list2" style="margin-left: 25rpx;" v-else @click="changeTime(2)">本月</view>
-			</view>
-			<view class="all-num">
-				<view class="shuzi" v-for="(item,index) in allList.slice(0,5)">
-					<view class="shu-num">{{item.num}}</view>
-					<view>
-						<template v-if="item.state==1">正常在办</template>
-						<template v-if="item.state==2">预警在办</template>
-						<template v-if="item.state==3">超时在办</template>
-						<template v-if="item.state==4">正常办结</template>
-						<template v-if="item.state==5">超时办结</template>
-						<template v-if="item.state==6">项目总数</template>
+	<view>
+		<view class="content" v-if="shouye==1">
+			<!-- 项目总览 -->
+			<view class="projectAll">
+				<view class="all-text">项目总览</view>
+				<view class="all-more" @click="takeMore">查看更多</view>
+				<view class="all-select">
+					<view class="all-list" style="margin-left: 15rpx;" v-if="change==0">今日</view>
+					<view class="all-list2" style="margin-left: 15rpx;" v-else @click="changeTime(0)">今日</view>
+					<view class="all-list" style="margin-left: 25rpx;" v-if="change==1">本周</view>
+					<view class="all-list2" style="margin-left: 25rpx;" v-else @click="changeTime(1)">本周</view>
+					<view class="all-list" style="margin-left: 25rpx;" v-if="change==2">本月</view>
+					<view class="all-list2" style="margin-left: 25rpx;" v-else @click="changeTime(2)">本月</view>
+				</view>
+				<view class="all-num">
+					<view class="shuzi" v-for="(item,index) in allList.slice(0,5)">
+						<view class="shu-num">{{item.num}}</view>
+						<view>
+							<template v-if="item.state==1">正常在办</template>
+							<template v-if="item.state==2">预警在办</template>
+							<template v-if="item.state==3">超时在办</template>
+							<template v-if="item.state==4">正常办结</template>
+							<template v-if="item.state==5">超时办结</template>
+							<template v-if="item.state==6">项目总数</template>
+						</view>
 					</view>
 				</view>
 			</view>
-		</view>
-		<!-- 项目列表 -->
-		<view class="projectlist" style="height: 100%;">
-			<view class="all-text">项目列表</view>
-			<view class="all-cui" @click="cuiban('总的')">催办</view>
-			<view class="all-more" style="margin: -59rpx 0 0 581rpx;" @click="takeMore">查看更多</view>
-			<view class="all-select">
-				<view class="all-list" style="margin-left: 15rpx;" v-if="change2==0">今日</view>
-				<view class="all-list2" style="margin-left: 15rpx;" v-else @click="changeTime2(0)">今日</view>
-				<view class="all-list" style="margin-left: 25rpx;" v-if="change2==1">本周</view>
-				<view class="all-list2" style="margin-left: 25rpx;" v-else @click="changeTime2(1)">本周</view>
-				<view class="all-list" style="margin-left: 25rpx;" v-if="change2==2">本月</view>
-				<view class="all-list2" style="margin-left: 25rpx;" v-else @click="changeTime2(2)">本月</view>
-			</view>
-			<!-- 列表 -->
-			<view class="projectL" v-for="(item,index) in list" :key="index" @click="XiangPro(item)">
-				<view class="projectName">{{item.projectName}}</view>
-				<view class="all-cui" style="margin: -44rpx 0 0 581rpx;" @click.stop="cuiban(item)" v-if="item.state==1||item.state==2||item.state==3">催办</view>
-				<view style="margin: 10rpx 0 0 19rpx;">结束时间:{{item.endTime}}</view>
-				<view style="margin: 20rpx 0 0 19rpx;">参与成员:{{item.coSposonerName}}</view>
-				<progress v-if="item.progress!='/'" :percent="item.progress" activeColor="rgba(0, 97, 255, 1)" border-radius="50" stroke-width="12" show-info font-size='12' active='true' />
-				<view class="projectLine" v-if="list.length>=1&&(index<=list.length-1)"></view>
-			</view>
-		</view>
-		<!-- 未完成清单 -->
-		<view class="projectlist" style="height: 100%;">
-			<view class="all-text">未完成清单</view>
-			<view class="wei-title1 title1" v-if="qingdan==0">
-				<view>问题清单</view>
-				<view class="wei-line1"></view>
-			</view>
-			<view class="title1" style="rgba(0, 0, 0, 1)" v-else @click="qingQie(0)">
-				问题清单
-				<view class="wei-line1" style="background: rgba(255, 255, 255, 1);"></view>
-			</view>
-			<view class="wei-title1 title2" v-if="qingdan==1">
-				<view>预警清单</view>
-				<view class="wei-line1"></view>
-			</view>
-			<view class="title2" style="rgba(0, 0, 0, 1)" v-else @click="qingQie(1)">
-				预警清单
-				<view class="wei-line1" style="background: rgba(255, 255, 255, 1);"></view>
-			</view>
-			<view class="all-cui" style="margin: -35px 0 0 581rpx;" @click="cuiban('未完成')">催办</view>
-			<view class="all-select">
-				<view class="all-list" style="margin-left: 15rpx;" v-if="change3==0">今日</view>
-				<view class="all-list2" style="margin-left: 15rpx;" v-else @click="changeTime3(0)">今日</view>
-				<view class="all-list" style="margin-left: 25rpx;" v-if="change3==1">本周</view>
-				<view class="all-list2" style="margin-left: 25rpx;" v-else @click="changeTime3(1)">本周</view>
-				<view class="all-list" style="margin-left: 25rpx;" v-if="change3==2">本月</view>
-				<view class="all-list2" style="margin-left: 25rpx;" v-else @click="changeTime3(2)">本月</view>
-			</view>
-			<!-- 未完成清单表格 -->
-			<view style="margin: 24rpx 0 0 20rpx;width: 710rpx;">
-				<uni-table ref="table" emptyText="暂无更多数据"
-				 style="width:710rpx;table-layout: fixed; word-wrap: break-word;">
-					<uni-tr style="background-color: rgba(245, 246, 250, 1);color: rgba(90, 96, 127, 1);font-size: 24rpx;">
-						<uni-th align="center">姓名</uni-th>
-						<uni-th align="center">项目名称</uni-th>
-						<uni-th align="center">项目任务</uni-th>
-						<uni-th align="center">情况状态</uni-th>
-					</uni-tr>
-					<uni-tr v-for="(item, index) in tableNo" :key="index" style="color: rgba(0, 0, 0, 1);">
-						<uni-td align="center">{{ item.headerName }}</uni-td>
-						<uni-td align="center">
-							<view class="name">{{ item.proname1 }}</view>
-						</uni-td>
-						<uni-td align="center">{{ item.taskName }}</uni-td>
-						<uni-td align="center">{{ item.projectLevel }}</uni-td>
-					</uni-tr>
-				</uni-table>
-			</view>
-			
-		</view>
-		<!-- 部门排行榜 -->
-		<view class="projectlist" style="height: 100%;">
-			<view class="all-text">部门排行榜</view>
-			<view class="wei-title1 title1" v-if="bumen==0">
-				<view>评分</view>
-				<view class="wei-line1" style="margin: 10rpx 0 0 -8rpx;"></view>
-			</view>
-			<view class="title1" style="rgba(0, 0, 0, 1)" v-else @click="bumenQie(0)">
-				评分
-				<view class="wei-line1" style="background: rgba(255, 255, 255, 1);"></view>
-			</view>
-			<view class="wei-title1 title2" v-if="bumen==1">
-				<view>完成率</view>
-				<view class="wei-line1" style="margin: 10rpx 0 0 4rpx;"></view>
-			</view>
-			<view class="title2" style="rgba(0, 0, 0, 1)" v-else @click="bumenQie(1)">
-				完成率
-				<view class="wei-line1" style="background: rgba(255, 255, 255, 1);"></view>
-			</view>
-			<view class="all-select">
-				<view class="all-list" style="margin-left: 15rpx;" v-if="change4==0">今日</view>
-				<view class="all-list2" style="margin-left: 15rpx;" v-else @click="changeTime4(0)">今日</view>
-				<view class="all-list" style="margin-left: 25rpx;" v-if="change4==1">本周</view>
-				<view class="all-list2" style="margin-left: 25rpx;" v-else @click="changeTime4(1)">本周</view>
-				<view class="all-list" style="margin-left: 25rpx;" v-if="change4==2">本月</view>
-				<view class="all-list2" style="margin-left: 25rpx;" v-else @click="changeTime4(2)">本月</view>
-			</view>
-			<!-- 部门排行榜表格 -->
-			<view style="margin: 24rpx 0 0 20rpx;width: 710rpx;">
-				<uni-table ref="table" emptyText="暂无更多数据"
-				 style="width:710rpx;table-layout: fixed; word-wrap: break-word;">
-					<uni-tr style="background-color: rgba(245, 246, 250, 1);color: rgba(90, 96, 127, 1);font-size: 24rpx;">
-						<uni-th align="center">排行</uni-th>
-						<uni-th align="center">部门名称</uni-th>
-						<uni-th align="center">评分</uni-th>
-					</uni-tr>
-					<uni-tr v-for="(item, index) in tableData" :key="index" style="color: rgba(0, 0, 0, 1);">
-						<uni-td align="center">{{ item.id }}</uni-td>
-						<uni-td align="center">
-							<view class="name">{{ item.name }}</view>
-						</uni-td>
-						<uni-td align="center">{{ item.num }}</uni-td>
-					</uni-tr>
-				</uni-table>
-			</view>
-			
-		</view>
-		<!-- 消息预警推送汇总 -->
-		<view class="projectlist" style="height: 100%;">
-			<view class="all-text">消息预警推送汇总</view>
-			<view class="wei-title1 title1" v-if="yujin==0">
-				<view>汇总</view>
-				<view class="wei-line1" style="margin: 10rpx 0 0 -8rpx;"></view>
-			</view>
-			<view class="title1" style="rgba(0, 0, 0, 1)" v-else @click="yujinQie(0)">
-				汇总
-				<view class="wei-line1" style="background: rgba(255, 255, 255, 1);"></view>
-			</view>
-			<view class="wei-title1 title2" v-if="yujin==1">
-				<view>明细</view>
-				<view class="wei-line1" style="margin: 10rpx 0 0 -8rpx;"></view>
-			</view>
-			<view class="title2" style="rgba(0, 0, 0, 1)" v-else @click="yujinQie(1)">
-				明细
-				<view class="wei-line1" style="background: rgba(255, 255, 255, 1);"></view>
+			<!-- 项目列表 -->
+			<!-- <view class="projectlist" style="height: 100%;">
+				<view class="all-text">项目列表</view>
+				<view class="all-cui" @click="cuiban('总的')" v-if="allcuiban==1">催办</view>
+				<view class="all-more" style="margin: -59rpx 0 0 581rpx;" @click="takeMore">查看更多</view>
+				<view class="all-select">
+					<view class="all-list" style="margin-left: 15rpx;" v-if="change2==0">今日</view>
+					<view class="all-list2" style="margin-left: 15rpx;" v-else @click="changeTime2(0)">今日</view>
+					<view class="all-list" style="margin-left: 25rpx;" v-if="change2==1">本周</view>
+					<view class="all-list2" style="margin-left: 25rpx;" v-else @click="changeTime2(1)">本周</view>
+					<view class="all-list" style="margin-left: 25rpx;" v-if="change2==2">本月</view>
+					<view class="all-list2" style="margin-left: 25rpx;" v-else @click="changeTime2(2)">本月</view>
+				</view> -->
+				<!-- 列表 -->
+				<!-- <view class="projectL" v-for="(item,index) in list" :key="index" @click="XiangPro(item)">
+					<view class="projectName">{{item.projectName}}</view>
+					<view class="all-cui" style="margin: -44rpx 0 0 581rpx;" @click.stop="cuiban(item)" v-if="(item.state==1||item.state==2||item.state==3) && acuiban==1">催办</view>
+					<view style="margin: 10rpx 0 0 19rpx;">结束时间:{{item.endTime}}</view>
+					<view style="margin: 20rpx 0 0 19rpx;">参与成员:{{item.coSposonerName}}</view>
+					<progress v-if="item.progress!='/'" :percent="item.progress" activeColor="rgba(0, 97, 255, 1)" border-radius="50" stroke-width="12" show-info font-size='12' active='true' />
+					<view class="projectLine" v-if="list.length>=1&&(index<=list.length-1)"></view>
+				</view>
+			</view> -->
+			<!-- 未完成清单 -->
+			<view class="projectlist" style="height: 100%;">
+				<view class="all-text">未完成清单</view>
+				<view class="wei-title1 title1" v-if="qingdan==0">
+					<view>问题清单</view>
+					<view class="wei-line1"></view>
+				</view>
+				<view class="title1" style="rgba(0, 0, 0, 1)" v-else @click="qingQie(0)">
+					问题清单
+					<view class="wei-line1" style="background: rgba(255, 255, 255, 1);"></view>
+				</view>
+				<view class="wei-title1 title2" v-if="qingdan==1">
+					<view>预警清单</view>
+					<view class="wei-line1"></view>
+				</view>
+				<view class="title2" style="rgba(0, 0, 0, 1)" v-else @click="qingQie(1)">
+					预警清单
+					<view class="wei-line1" style="background: rgba(255, 255, 255, 1);"></view>
+				</view>
+				<view class="all-cui" style="margin: -35px 0 0 581rpx;" @click="cuiban('未完成')" v-if="allcuiban==1">催办</view>
+				<view class="all-select">
+					<view class="all-list" style="margin-left: 15rpx;" v-if="change3==0">今日</view>
+					<view class="all-list2" style="margin-left: 15rpx;" v-else @click="changeTime3(0)">今日</view>
+					<view class="all-list" style="margin-left: 25rpx;" v-if="change3==1">本周</view>
+					<view class="all-list2" style="margin-left: 25rpx;" v-else @click="changeTime3(1)">本周</view>
+					<view class="all-list" style="margin-left: 25rpx;" v-if="change3==2">本月</view>
+					<view class="all-list2" style="margin-left: 25rpx;" v-else @click="changeTime3(2)">本月</view>
+				</view>
+				<!-- 未完成清单表格 -->
+				<view style="margin: 24rpx 0 0 20rpx;width: 710rpx;">
+					<uni-table ref="table" emptyText="暂无更多数据"
+					 style="width:710rpx;table-layout: fixed; word-wrap: break-word;">
+						<uni-tr style="background-color: rgba(245, 246, 250, 1);color: rgba(90, 96, 127, 1);font-size: 24rpx;">
+							<uni-th align="center">姓名</uni-th>
+							<uni-th align="center">项目名称</uni-th>
+							<uni-th align="center">项目任务</uni-th>
+							<uni-th align="center">情况状态</uni-th>
+						</uni-tr>
+						<uni-tr v-for="(item, index) in tableNo" :key="index" style="color: rgba(0, 0, 0, 1);">
+							<uni-td align="center">{{ item.headerName }}</uni-td>
+							<uni-td align="center">
+								<view class="name">{{ item.projectName }}</view>
+							</uni-td>
+							<uni-td align="center">{{ item.taskName }}</uni-td>
+							<uni-td align="center">{{ item.projectLevel }}</uni-td>
+						</uni-tr>
+					</uni-table>
+				</view>
+				
 			</view>
-			<view class="all-select">
-				<view class="all-list" style="margin-left: 15rpx;" v-if="change5==0">今日</view>
-				<view class="all-list2" style="margin-left: 15rpx;" v-else @click="changeTime5(0)">今日</view>
-				<view class="all-list" style="margin-left: 25rpx;" v-if="change5==1">本周</view>
-				<view class="all-list2" style="margin-left: 25rpx;" v-else @click="changeTime5(1)">本周</view>
-				<view class="all-list" style="margin-left: 25rpx;" v-if="change5==2">本月</view>
-				<view class="all-list2" style="margin-left: 25rpx;" v-else @click="changeTime5(2)">本月</view>
+			<!-- 部门排行榜 -->
+			<view class="projectlist" style="height: 100%;">
+				<view class="all-text">部门排行榜</view>
+				<view class="wei-title1 title1" v-if="bumen==0">
+					<view>评分</view>
+					<view class="wei-line1" style="margin: 10rpx 0 0 -8rpx;"></view>
+				</view>
+				<view class="title1" style="rgba(0, 0, 0, 1)" v-else @click="bumenQie(0)">
+					评分
+					<view class="wei-line1" style="background: rgba(255, 255, 255, 1);"></view>
+				</view>
+				<view class="wei-title1 title2" v-if="bumen==1">
+					<view>完成率</view>
+					<view class="wei-line1" style="margin: 10rpx 0 0 4rpx;"></view>
+				</view>
+				<view class="title2" style="rgba(0, 0, 0, 1)" v-else @click="bumenQie(1)">
+					完成率
+					<view class="wei-line1" style="background: rgba(255, 255, 255, 1);"></view>
+				</view>
+				<view class="all-select">
+					<view class="all-list" style="margin-left: 15rpx;" v-if="change4==0">今日</view>
+					<view class="all-list2" style="margin-left: 15rpx;" v-else @click="changeTime4(0)">今日</view>
+					<view class="all-list" style="margin-left: 25rpx;" v-if="change4==1">本周</view>
+					<view class="all-list2" style="margin-left: 25rpx;" v-else @click="changeTime4(1)">本周</view>
+					<view class="all-list" style="margin-left: 25rpx;" v-if="change4==2">本月</view>
+					<view class="all-list2" style="margin-left: 25rpx;" v-else @click="changeTime4(2)">本月</view>
+				</view>
+				<!-- 部门排行榜表格 -->
+				<view style="margin: 24rpx 0 0 20rpx;width: 710rpx;">
+					<uni-table ref="table" emptyText="暂无更多数据"
+					 style="width:710rpx;table-layout: fixed; word-wrap: break-word;">
+						<uni-tr style="background-color: rgba(245, 246, 250, 1);color: rgba(90, 96, 127, 1);font-size: 24rpx;">
+							<uni-th align="center">排行</uni-th>
+							<uni-th align="center">部门名称</uni-th>
+							<uni-th align="center">评分</uni-th>
+						</uni-tr>
+						<uni-tr v-for="(item, index) in tableData" :key="index" style="color: rgba(0, 0, 0, 1);">
+							<uni-td align="center">{{ item.id }}</uni-td>
+							<uni-td align="center">
+								<view class="name">{{ item.name }}</view>
+							</uni-td>
+							<uni-td align="center">{{ item.num }}</uni-td>
+						</uni-tr>
+					</uni-table>
+				</view>
+				
 			</view>
-			<!-- 汇总表格 -->
-			<view style="margin: 24rpx 0 0 20rpx;width: 710rpx;" v-if="yujin==0">
-				<view class="hui-kuang" v-for="(item,index) in xiaoban" :key="index">
-					<view class="hui-left">{{item.organize}}</view>
-					<view>
-						<view class="hui-center">{{item.mtype}}</view>
-						<view class="hui-center">{{item.num}}次</view>
-					</view>
-					<view>
-						<view class="hui-center">预警次数</view>
-						<view class="hui-center">{{item.num2}}次</view>
+			<!-- 消息预警推送汇总 -->
+			<view class="projectlist" style="height: 100%;">
+				<view class="all-text">消息预警推送汇总</view>
+				<view class="wei-title1 title1" v-if="yujin==0">
+					<view>汇总</view>
+					<view class="wei-line1" style="margin: 10rpx 0 0 -8rpx;"></view>
+				</view>
+				<view class="title1" style="rgba(0, 0, 0, 1)" v-else @click="yujinQie(0)">
+					汇总
+					<view class="wei-line1" style="background: rgba(255, 255, 255, 1);"></view>
+				</view>
+				<view class="wei-title1 title2" v-if="yujin==1">
+					<view>明细</view>
+					<view class="wei-line1" style="margin: 10rpx 0 0 -8rpx;"></view>
+				</view>
+				<view class="title2" style="rgba(0, 0, 0, 1)" v-else @click="yujinQie(1)">
+					明细
+					<view class="wei-line1" style="background: rgba(255, 255, 255, 1);"></view>
+				</view>
+				<view class="all-select">
+					<view class="all-list" style="margin-left: 15rpx;" v-if="change5==0">今日</view>
+					<view class="all-list2" style="margin-left: 15rpx;" v-else @click="changeTime5(0)">今日</view>
+					<view class="all-list" style="margin-left: 25rpx;" v-if="change5==1">本周</view>
+					<view class="all-list2" style="margin-left: 25rpx;" v-else @click="changeTime5(1)">本周</view>
+					<view class="all-list" style="margin-left: 25rpx;" v-if="change5==2">本月</view>
+					<view class="all-list2" style="margin-left: 25rpx;" v-else @click="changeTime5(2)">本月</view>
+				</view>
+				<!-- 汇总表格 -->
+				<view style="margin: 24rpx 0 0 20rpx;width: 710rpx;" v-if="yujin==0">
+					<view class="hui-kuang" v-for="(item,index) in xiaoban" :key="index">
+						<view class="hui-left">{{item.organize}}</view>
+						<view>
+							<view class="hui-center">{{item.mtype}}</view>
+							<view class="hui-center">{{item.num}}次</view>
+						</view>
+						<view>
+							<view class="hui-center">预警次数</view>
+							<view class="hui-center">{{item.num2}}次</view>
+						</view>
 					</view>
 				</view>
+				<!-- 消息预警推送汇总明细表格 -->
+				<view style="margin: 24rpx 0 0 20rpx;width: 710rpx;" v-if="yujin==1">
+					<uni-table ref="table" emptyText="暂无更多数据"
+					 style="width:710rpx;table-layout: fixed; word-wrap: break-word;">
+						<uni-tr style="background-color: rgba(245, 246, 250, 1);color: rgba(90, 96, 127, 1);font-size: 24rpx;">
+							<uni-th align="center">项目</uni-th>
+							<uni-th align="center">任务</uni-th>
+							<uni-th align="center">类型</uni-th>
+							<uni-th align="center">发生时间</uni-th>
+							<uni-th align="center">部门</uni-th>
+							<uni-th align="center">姓名</uni-th>
+						</uni-tr>
+						<uni-tr v-for="(item, index) in yujinList" :key="index" style="color: rgba(0, 0, 0, 1);">
+							<uni-td align="center">{{ item.projectName }}</uni-td>
+							<uni-td align="center">
+								<view class="name">{{ item.taskName }}</view>
+							</uni-td>
+							<uni-td align="center">{{ item.mtype }}</uni-td>
+							<uni-td align="center">{{item.createTime}}</uni-td>
+							<uni-td align="center">
+								<view class="name">{{ item.organize }}</view>
+							</uni-td>
+							<uni-td align="center">{{ item.userName }}</uni-td>
+						</uni-tr>
+					</uni-table>
+				</view>
+				<view style="width: 100%;height:120rpx;"></view>
 			</view>
-			<!-- 消息预警推送汇总明细表格 -->
-			<view style="margin: 24rpx 0 0 20rpx;width: 710rpx;" v-if="yujin==1">
-				<uni-table ref="table" emptyText="暂无更多数据"
-				 style="width:710rpx;table-layout: fixed; word-wrap: break-word;">
-					<uni-tr style="background-color: rgba(245, 246, 250, 1);color: rgba(90, 96, 127, 1);font-size: 24rpx;">
-						<uni-th align="center">项目</uni-th>
-						<uni-th align="center">任务</uni-th>
-						<uni-th align="center">类型</uni-th>
-						<uni-th align="center">发生时间</uni-th>
-						<uni-th align="center">部门</uni-th>
-						<uni-th align="center">姓名</uni-th>
-					</uni-tr>
-					<uni-tr v-for="(item, index) in yujinList" :key="index" style="color: rgba(0, 0, 0, 1);">
-						<uni-td align="center">{{ item.projectName }}</uni-td>
-						<uni-td align="center">
-							<view class="name">{{ item.taskName }}</view>
-						</uni-td>
-						<uni-td align="center">{{ item.mtype }}</uni-td>
-						<uni-td align="center">{{item.createTime}}</uni-td>
-						<uni-td align="center">
-							<view class="name">{{ item.organize }}</view>
-						</uni-td>
-						<uni-td align="center">{{ item.userName }}</uni-td>
-					</uni-tr>
-				</uni-table>
-			</view>
-			<view style="width: 100%;height:120rpx;"></view>
+		</view>
+		<view v-if="shouye==0" class="content">
+			<image src="../../static/img/quesheng.png" class="quesheng"></image>
+			<view style="color: rgba(87, 146, 240, 1);">暂无内容</view>
 		</view>
 	</view>
 </template>
@@ -244,6 +250,16 @@
 				weekEnd:'',//本周结束时间
 				monthStart:'',//本月开始时间
 				monthEnd:'',//本月结束时间
+				
+				shouye:1,//首页
+				allcuiban:1,//一键催办
+				acuiban:1,//是否催办
+				
+				weidu:[],
+				
+				page:1,
+				size:10,
+				totalCount:0,
 			}
 		},
 		onLoad() {
@@ -255,7 +271,7 @@
 			//项目总览
 			this.getStateLb()
 			//项目列表
-			this.getList()
+			// this.getList()
 			//未完成清单
 			this.getNoQingdan()
 			//部门排行
@@ -305,8 +321,11 @@
 				var data={
 					roleId:roleId
 				}
-				that.$Request.postT('/api/sysRole/queryMenuByRole').then(res => {
+				that.$Request.postT('/api/sysRole/queryMenuByRole',data).then(res => {
 					if (res.code==200) {
+						this.shouye=res.data[0].state
+						this.allcuiban=res.data[1].menuLists[0].state
+						this.acuiban=res.data[1].menuLists[3].state
 						// uni.setStorageSync('roleId', res.data.roleId)
 						console.log(uni.getStorageSync('roleId'),'数据')
 					} else {
@@ -335,7 +354,7 @@
 					var time11=time.join(",")
 				}else if(that.change==1){
 					var time=[]
-					time=[that.weekStart,that.weekEnd]
+					time=[that.weekStart,that.nowDate+' 24:00:00']
 					var time11=time.join(",")
 				}else if(that.change==2){
 					var time11='本月'
@@ -365,7 +384,7 @@
 			//项目列表
 			changeTime2(a){
 				this.change2=a
-				this.getList()
+				// this.getList()
 			},
 			//查看项目详情
 			XiangPro(item){
@@ -375,8 +394,12 @@
 				str = str.replace(/%/g, '%25')
 				//这里———————————————————————————
 				let query = encodeURIComponent(str)
+				
+				let t2=JSON.stringify(this.weidu)
+				//这里———————————————————————————
+				let query2 = encodeURIComponent(t2)
 				uni.navigateTo({
-					url:'/pages/project/projectX?data='+query
+					url:'/pages/project/projectX?data='+query+'&weidu='+query2
 				})
 			},
 			// 催办
@@ -418,7 +441,7 @@
 										duration:800
 									});			
 									setTimeout(function() {
-										that.getList()
+										// that.getList()
 									}, 1000)
 								} else {
 									uni.showToast({
@@ -437,13 +460,14 @@
 			},
 			getList(){
 				this.list=[]
+				this.weidu=[]
 				let that = this
 				if(that.change2==0){
 					var time1=that.nowDate
 					var time2=that.nowDate+' 24:00:00'
 				}else if(that.change2==1){
 					var time1=that.weekStart
-					var time2=that.weekEnd
+					var time2=that.nowDate+' 24:00:00'//that.weekEnd
 				}else if(that.change2==2){
 					var time1=that.monthStart
 					var time2=that.monthEnd
@@ -453,7 +477,7 @@
 					mask: true, // 是否显示透明蒙层,防止触摸穿透
 				});
 				var data={
-					"type": null,    // 1我关注的我收藏的、3我负责的、4我协办的、null
+					"type": null,    // 3我负责的、4我协办的、5创建的、6我分管的
 					"project": {
 						"projectName": null,   // 项目名称
 						"projectFrom": null,    // 项目来源
@@ -463,6 +487,10 @@
 						"coOrganize": null,   // 协办单位-多选
 						"sposonerName": null,    // 主办人
 						"coSposonerName": null,    // 协办人
+						"scoreState": null,      // 是否已评分:1已评分,0未评分,null全部
+						"collect": null,     // 是否已关注,1收藏,0未收藏,null全部
+						"hasTask": null,      // 是否有任务:1有任务,0没有认为,null全部
+						"isScore": null     // 是否我评分,1是我,0不是我,null全部
 					},
 					"t1": time1,    // 创建开始时间
 					"t2": time2,    // 创建结束时间
@@ -474,6 +502,7 @@
 				that.$Request.postJson('/api/sysProject/queryPage?page=1&rows=2',data).then(res => {
 					if (res.code==200) {
 						that.list=res.data.project.rows.slice(0,2)
+						that.weidu=res.data.config
 						console.log(that.list,'数据')
 					} else {
 						uni.showToast({
@@ -504,7 +533,7 @@
 					var time11=time.join(",")
 				}else if(that.change3==1){
 					var time=[]
-					time=[that.weekStart,that.weekEnd]
+					time=[that.weekStart,that.nowDate+' 24:00:00']
 					var time11=time.join(",")
 				}else if(that.change3==2){
 					var time=[]
@@ -565,7 +594,7 @@
 					var time11=time.join(",")
 				}else if(that.change4==1){
 					var time=[]
-					time=[that.weekStart,that.weekEnd]
+					time=[that.weekStart,that.nowDate+' 24:00:00']
 					var time11=time.join(",")
 				}else if(that.change4==2){
 					var time11='本月'
@@ -602,7 +631,7 @@
 					var time11=time.join(",")
 				}else if(that.change4==1){
 					var time=[]
-					time=[that.weekStart,that.weekEnd]
+					time=[that.weekStart,that.nowDate+' 24:00:00']
 					var time11=time.join(",")
 				}else if(that.change4==2){
 					var time11='本月'
@@ -656,7 +685,7 @@
 					var time11=time.join(",")
 				}else if(that.change5==1){
 					var time=[]
-					time=[that.weekStart,that.weekEnd]
+					time=[that.weekStart,that.nowDate+' 24:00:00']
 					var time11=time.join(",")
 				}else if(that.change5==2){
 					var time11='本月'
@@ -692,7 +721,7 @@
 			},
 			//预警明细
 			getYujinXi(){
-				this.yujinList=[]
+				// this.yujinList=[]
 				let that = this
 				if(that.change5==0){
 					var time=[]
@@ -700,7 +729,7 @@
 					var time11=time.join(",")
 				}else if(that.change5==1){
 					var time=[]
-					time=[that.weekStart,that.weekEnd]
+					time=[that.weekStart,that.nowDate+' 24:00:00']
 					var time11=time.join(",")
 				}else if(that.change5==2){
 					var time11='本月'
@@ -720,10 +749,15 @@
 					"coSposonerName": null,    // 协办人
 					"updateBy": time11     // 时间类型:有:【最近7日】,【本月】,【本季度】,【2024-12-01,2024-12-30】
 				}
-				that.$Request.postJson('/api/sysProject/queryMessage',data).then(res => {
+				that.$Request.postJson('/api/sysProject/queryMessage?page='+that.page+'&rows='+that.size,data).then(res => {
 					if (res.code==200) {
 						console.log(res,data,'项目')
-						this.yujinList=res.data
+						that.totalCount = res.data.total
+						if (that.page == 1) {
+							that.yujinList = res.data.rows
+						} else {
+							that.yujinList = that.yujinList.concat(res.data.rows)
+						}
 					} else {
 						uni.showToast({
 							title: res.message,
@@ -734,15 +768,36 @@
 					uni.hideLoading();
 				});
 			},
+			// 上拉加载
+			onReachBottom: function() {
+				if(this.yujin==1){
+					if(this.yujinList.length < this.totalCount){
+						this.page = this.page + 1;
+						this.getYujinXi()
+					} else {
+						uni.showToast({
+							title: '已经最后一页啦',
+							icon: 'none'
+						})
+					}
+				}
+				
+			},
+			onPullDownRefresh: function() {
+				if(this.yujin==1){
+					this.page = 1;
+					this.getYujinXi()
+				}
+			},
 			
-			//获得本周的开始时间:
+			//获得7天前的开始时间:
 			getStartDayOfWeek(time) {
 				let now = new Date(time); // 当前日期
 				let nowDayOfWeek = now.getDay(); // 今天本周的第几天
 				let day = nowDayOfWeek || 7;
 				let nowDay = now.getDate(); // 当前日
 				let nowMonth = now.getMonth(); // 当前月
-				return this.formatDate(new Date(now.getFullYear(), nowMonth, nowDay + 1 - day));
+				return this.formatDate(new Date(now.getFullYear(), nowMonth, nowDay -6));
 			},
 			//获得本周的结束时间:
 			getEndDayOfWeek(time) {
@@ -969,4 +1024,10 @@
 	line-height: 60rpx;
 	text-align: center;
 }
+
+.quesheng{
+		margin-top: 300rpx;
+		width: 480rpx;
+		height: 558rpx;
+	}
 </style>

+ 156 - 46
pages/project/addProject.vue

@@ -21,8 +21,11 @@
 				></uni-file-picker>
 			</view>
 			<span style="margin: 20rpx 0 0 20rpx;">支持pdf/word/xlsx格式,单个文件大小不超过5MB</span>
-			<view class="proMiao">主办单位</view>
-			<uni-data-select class="proINname"
+			<view class="proMiao">主办单位/主办人</view>
+			<uni-data-picker placeholder="请选择主办单位" popup-title="请选择主办人" :localdata="range" v-model="value"
+				@change="onchange" @nodeclick="onnodeclick" @popupopened="onpopupopened" @popupclosed="onpopupclosed">
+			</uni-data-picker>
+			<!-- <uni-data-select class="proINname"
 				v-model="value" placeholder="请选择主办单位"
 				:localdata="range"
 				@change="change1"
@@ -32,13 +35,23 @@
 				v-model="peopleValue" placeholder="请选择主办人"
 				:localdata="rangePeople"
 				@change="change"
-			></uni-data-select>
-			<view class="proMiao">协办单位</view>
-			<mySelectCheckbox class="proINname" placeholder="请选择协办单位" v-model="value2" multiple dataKey="label" dataValue="value" :localdata="data"
+			></uni-data-select> -->
+			<view class="proMiao">协办单位/协办人</view>
+			<uni-data-picker placeholder="请选择协办单位" popup-title="请选择协办人" :showSearch= "true" :localdata="range" v-model="value2"
+				@change="onchange2" @nodeclick="onnodeclick2" @popupopened="onpopupopened2" @popupclosed="onpopupclosed2">
+			</uni-data-picker>
+			<view class="proINname" style="height: 100%;">
+				   <view class="tag-view" v-for="(value,key) in userListSelect"  :key="key" @click="clearTagAdmin(value)">
+						<uni-tag :text="value.parent_value.organize+'/'+value.text" type="primary" ></uni-tag>
+						<!-- {{value.parent_value.organize}}/{{value.text}} -->
+						<uni-icons class="clearBtn"  type="clear" size="15" color="#ccc" />
+					</view>
+			</view>
+			<!-- <mySelectCheckbox class="proINname" placeholder="请选择协办单位" v-model="value2" multiple dataKey="label" dataValue="value" :localdata="data"
 				@change="changeXie"></mySelectCheckbox>
 			<view class="proMiao">协办人</view>
 			<mySelectCheckbox class="proINname" placeholder="请选择协办人" v-model="peopleValue2" multiple dataKey="label" dataValue="value" :localdata="dataPeople"
-				@change="changeXiePeo"></mySelectCheckbox>
+				@change="changeXiePeo"></mySelectCheckbox> -->
 			
 			<view class="proMiao">项目级别</view>
 			<uni-data-select class="proINname"
@@ -73,8 +86,8 @@
 				</view>
 			</view> -->
 			<view class="proMiao">项目评分人</view>
-			<mySelectCheckbox class="proINname" placeholder="请选择项目评分人" v-model="value2" multiple dataKey="label" dataValue="value" :localdata="data"
-				@change="changeXie"></mySelectCheckbox>
+			<mySelectCheckbox class="proINname" placeholder="请选择项目评分人" v-model="peoplescore" multiple dataKey="label" dataValue="value" :localdata="scorePeople"
+				@change="changeScore"></mySelectCheckbox>
 			<view class="project">
 				<view class="butt quxiao" @click="quxiao">取消</view>
 				<view class="butt queren" @click="addProject">确认创建</view>
@@ -96,11 +109,13 @@
 				//主办单位
 				value: '',
 				range: [],
+				userListSelect1:[],
 				//主办人
 				peopleValue:'',
 				rangePeople:[],
 				//协办
-				value2:[],
+				userListSelect:[],
+				value2:'',
 				data: [],
 				xieban:[],//协办传入值数组
 				xieValue:[],//协办传入id
@@ -109,6 +124,11 @@
 				dataPeople: [],
 				xiebanPeople:[],//协办传入值数组
 				xieValuePeople:[],//协办传入id
+				//评分人
+				peoplescore:[],
+				scorePeople: [],
+				scorePeople22:[],//协办传入值数组
+				scoreValuePeople:[],//协办传入id
 				// 项目级别
 				jibieValue:0,
 				jibie:[
@@ -138,14 +158,32 @@
 				],
 			}
 		},
-		onLoad() {
-			this.getDanwei()
+		onShow() {
+			// this.getDanwei()
+			this.getPeopleZhu()
 		},
 		methods: {
 			// 主办单位
 			change1(e) {
 			   console.log("e:", e);
-			   this.getPeople()
+			   // this.getPeopleZhu(e)
+			   
+			},
+			onnodeclick(data) {
+				console.log(data);
+				this.userListSelect1 = data
+				// this.getPeople()
+			},
+			onpopupopened(e) {
+				console.log('popupopened');
+			},
+			onpopupclosed(e) {
+				console.log('popupclosed');
+			},
+			onchange(e) {
+				console.log('---------onchange:', e);
+				var acc=e.detail.value[0].text
+				this.getPeople(acc)
 			},
 			//协办单位选择
 			changeXie(e){
@@ -157,6 +195,28 @@
 					this.xieValue.push(item.value)
 				})
 			},
+			clearTagAdmin(value){
+				this.userListSelect = this.userListSelect.filter(item => item != value);
+			},
+			onnodeclick2(data) {
+				console.log(data);
+				if(data.parent_value){//存在父级
+				  let dataId = data.value;
+				  this.userListSelect.push(data);
+				  this.userListSelect = [...new Set(this.userListSelect)]//es6数组去重
+				}
+				console.log('多选',this.userListSelect)
+
+			},
+			onpopupopened2(e) {
+				console.log('popupopened');
+			},
+			onpopupclosed2(e) {
+				console.log('popupclosed');
+			},
+			onchange2(e) {
+				console.log('---------onchange:', e);
+			},
 			//协办人选择
 			changeXiePeo(e){
 				this.xieban=[]
@@ -167,6 +227,16 @@
 					this.xieValue.push(item.value)
 				})
 			},
+			//评分人选择
+			changeScore(e){
+				this.scorePeople22=[]
+				this.scoreValuePeople=[]
+				console.log('e:', e);
+				e.map(item =>{
+					this.scorePeople22.push(item.label)
+					this.scoreValuePeople.push(item.value)
+				})
+			},
 			//获取单位
 			getDanwei(){
 				this.range=[]
@@ -177,12 +247,12 @@
 				});
 				this.$Request.postT('/api/Organize/query').then(res => {
 					if (res.code==200&&res.data) {
-						this.range =res.data.map(item =>{
-							return {
-								value: item.id,
-								text: item.oname,
-							}
-						})
+						// this.range =res.data.map(item =>{
+						// 	return {
+						// 		value: item.id,
+						// 		text: item.oname,
+						// 	}
+						// })
 						this.data =res.data.map(item =>{
 							return {
 								value: item.id,
@@ -194,39 +264,69 @@
 					uni.hideLoading();
 				});
 			},
-			//根据单位获取人员
-			getPeople(){
+			//获取主办协办人,评分人
+			getPeopleZhu(){
+				this.range=[]
 				this.rangePeople=[]
 				uni.showLoading({
 					title: '加载中',
 					mask: true, // 是否显示透明蒙层,防止触摸穿透
 				});
-				this.$Request.postJson('/api/sysUser/queryPage?page=1&rows=10',{
-					"userName": null,      // 姓名
-					"roleName": null,      // 角色名称
-					"department": this.range[this.value].text,     // 部门
-					"createBy": "",   // 创建时间-开始日期
-					"updateBy": ""    // 创建时间-结束日期
-				}).then(res => {
-					if (res.code==200&&res.data.total>0) {
-						var total=res.data.total
-						this.$Request.postJson('/api/sysUser/queryPage?page=1&rows='+total,{
-							"userName": null,      // 姓名
-							"roleName": null,      // 角色名称
-							"department": this.range[this.value].text,     // 部门
-							"createBy": "",   // 创建时间-开始日期
-							"updateBy": ""    // 创建时间-结束日期
-						}).then(res => {
-							if (res.code==200&&res.data) {
-								this.rangePeople =res.data.rows.map(item =>{
-									return {
+				this.$Request.postJson('/api/sysProject/queryCoUsers',{}).then(res => {
+					if (res.code==200) {
+						var lianji=[]
+						for(var i=0;i<res.data.length;i++){
+							if(res.data[i].userList.length>0){
+								lianji.push(res.data[i])
+							}
+						}
+						this.range =lianji.map(item =>{
+							return {
+								value: item,
+								text: item.organize,
+								children:item.userList.map(item =>{
+									return{
 										value: item.id,
 										text: item.userName,
 									}
 								})
-								console.log(this.rangePeople,'人')
 							}
-						});
+						})
+						console.log(this.range,'人')
+					}else{
+						var ii=JSON.stringify(res)
+						console.log(res,res.data)
+						console.log(JSON.parse(res))
+						console.log(JSON.parse(ii))
+					}
+					uni.hideLoading();
+				});
+			},
+			//根据单位获取人员(评分人)
+			getPeople(acc){
+				console.log(this.userListSelect1)
+				this.scorePeople=[]
+				uni.showLoading({
+					title: '加载中',
+					mask: true, // 是否显示透明蒙层,防止触摸穿透
+				});
+				this.$Request.postT('/api/sysUser/queryScorer',{
+					organizes:acc
+				}).then(res => {
+					if (res.code==200) {
+						console.log(res,'评分')
+						this.scorePeople =res.data.map(item =>{
+							return {
+								value: item.id,
+								label: item.userName,
+							}
+						})
+						console.log(this.scorePeople,'人')
+					}else{
+						var ii=JSON.stringify(res)
+						console.log(res,res.data)
+						console.log(JSON.parse(res))
+						console.log(JSON.parse(ii))
 					}
 					uni.hideLoading();
 				});
@@ -239,7 +339,16 @@
 			},
 			//新增项目
 			addProject(){
+				console.log('协办',this.userListSelect1.parent_value.organize,this.value2,this.userListSelect)
+				console.log('评分人',this.scoreValuePeople)
 				console.log(this.jibie[this.jibieValue].text)
+				var xieban=[]
+				var xiebanValue=[]
+				this.userListSelect.map(item =>{
+					xieban.push(item.parent_value.organize)
+					xiebanValue.push(item.value)
+				})
+				console.log(xieban,xiebanValue)
 				let that = this
 				if (!that.pName) {
 					that.$queue.showToast("请输入项目标题");
@@ -260,10 +369,11 @@
 						"projectLevel": that.jibie[that.jibieValue].text,    // 项目等级
 						"projectContent": that.projectContent,    // 项目描述
 						"fileUrl": that.fileList22,   // 附件
-						"organize": that.range[that.value].text,   // 主办单位-单选
-						"sposoner": '26',//that.peopleValue,   // 主办人ID-单选
-						"coOrganize": that.xieban.join(","),   // 协办单位-多选
-						"coSposoner": '22,20'//that.xieValue.join(",")    // 协办人ID-多选
+						"organize": that.userListSelect1.parent_value.organize,   // 主办单位-单选
+						"sposoner": that.value,   // 主办人ID-单选
+						"coOrganize": xieban.join(","),   // 协办单位-多选
+						"coSposoner": xiebanValue.join(","),    // 协办人ID-多选
+						"scorer": that.scoreValuePeople.join(",")   // 评分人ID-多选
 					}
 					that.$Request.postJson('/api/sysProject/add',data).then(res => {
 						if (res.code==200) {
@@ -416,7 +526,7 @@
 		border: 1rpx solid rgba(229, 229, 229, 1);
 		font-size: 28rpx;
 		line-height: 90rpx;
-		color: rgba(179, 179, 179, 1);
+		/* color: rgba(179, 179, 179, 1); */
 	}
 	.proIMi{
 		height: 315rpx;

+ 74 - 50
pages/project/addRenwu.vue

@@ -26,7 +26,9 @@
 			<input class="proINname" placeholder="请输入权重" type="digit" v-model="weight"/>
 			<view class="proMiao">任务负责人</view>
 			<view @click="toggle()">
-				<input class="proINname" v-model="peopleValue" placeholder="请选择任务负责人"/>
+				<view class="proINname" v-if="peopleValue==''">请选择任务负责人</view>
+				<view class="proINname" v-else>{{peopleValue}}</view>
+				<!-- <input class="proINname" v-model="peopleValue" placeholder="请选择任务负责人"/> -->
 				<!-- <uni-data-select class="proINname" :disabled="true"
 					v-model="peopleValue" placeholder="请选择主办人"
 					:localdata="rangePeople"
@@ -48,31 +50,35 @@
 			
 			<!-- 任务负责人弹出框-->
 			<uni-popup ref="popup" background-color="#fff">
-				<view class="popup-content">
-					<view class="popup-title">
-						<view @click="quPopup">取消</view>
-						<view>选择任务负责人</view>
-						<view style="color: rgba(0, 97, 255, 1);" @click="selectPeo">确定</view>
-					</view>
-					<view class="popup-list">
-						<radio-group @change="radioChange" v-for="(item,index) in people" :key="index">
-						<view class="l-line"></view>
-						<view class="l-kuang">
-							<view class="l-circle"></view>
-							<view style="margin-left: 20rpx;width: 320px;">
-								<view style="font-size: 28rpx;">{{item.userName}}</view>
-								<view style="font-size: 24rpx;">{{item.department}}</view>
-							</view>
-							<label class="l-label">
-								<view>
-									<radio :id="item.userName" :value="item.userName" :checked="index==peopleCruuent"></radio>
-								</view>
-							</label>
-							
+				
+					<view class="popup-content">
+						<view class="popup-title">
+							<view @click="quPopup">取消</view>
+							<view>选择任务负责人</view>
+							<view style="color: rgba(0, 97, 255, 1);" @click="selectPeo">确定</view>
 						</view>
-						</radio-group>
+						<scroll-view scroll-y="true" class="scroll_view_style">
+							<view class="popup-list">
+								<radio-group @change="radioChange" v-for="(item,index) in people" :key="index">
+								<view class="l-line"></view>
+								<view class="l-kuang">
+									<view class="l-circle"></view>
+									<view style="margin-left: 20rpx;width: 320px;">
+										<view style="font-size: 28rpx;">{{item.userName}}</view>
+										<view style="font-size: 24rpx;">{{item.department}}</view>
+									</view>
+									<label class="l-label">
+										<view>
+											<radio :id="item.userName" :value="item.userName" :checked="index==peopleCruuent"></radio>
+										</view>
+									</label>
+								</view>
+								</radio-group>
+							</view>
+						</scroll-view>
 					</view>
-				</view>
+				
+			
 			</uni-popup>
 		</view>
 	</view>
@@ -92,7 +98,7 @@
 				warnTime:'',//预警时间
 				datetimerange: [],
 				people:[],
-				peopleCruuent:'',
+				peopleCruuent:0,
 				peopleValue:'',
 				// 附件
 				fileList: [],
@@ -105,10 +111,15 @@
 					"border": false, // 是否显示边框
 					"dividline": false
 				},
+				
+				page:1,
+				size:10,
+				totalCount:0,
 			}
 		},
 		onLoad(option) {
 			this.projectId=option.proId
+			this.people=JSON.parse(decodeURIComponent(option.people))
 		},
 		methods: {
 			// 任务负责人弹框
@@ -116,7 +127,7 @@
 				console.log('dd')
 				// open 方法传入参数 等同在 uni-popup 组件上绑定 type属性
 				this.$refs.popup.open('bottom')
-				this.getPeople()
+				// this.getPeople()
 			},
 			//取消弹框
 			quPopup(){
@@ -133,6 +144,7 @@
 				for (let i = 0; i < this.people.length; i++) {
 					if (this.people[i].userName === evt.detail.value) {
 						this.peopleCruuent = i;
+						this.peopleValue=this.people[this.peopleCruuent].userName
 						break;
 					}
 				}
@@ -144,27 +156,34 @@
 					title: '加载中',
 					mask: true, // 是否显示透明蒙层,防止触摸穿透
 				});
-				this.$Request.postJson('/api/sysUser/queryPage?page=1&rows=10',{
-					"userName": null,      // 姓名
-					"roleName": null,      // 角色名称
-					"department": null,     // 部门
-					"createBy": "",   // 创建时间-开始日期
-					"updateBy": ""    // 创建时间-结束日期
-				}).then(res => {
-					if (res.code==200&&res.data.total>0) {
-						var total=res.data.total
-						this.$Request.postJson('/api/sysUser/queryPage?page=1&rows='+total,{
-							"userName": null,      // 姓名
-							"roleName": null,      // 角色名称
-							"department": null,     // 部门
-							"createBy": "",   // 创建时间-开始日期
-							"updateBy": ""    // 创建时间-结束日期
-						}).then(res => {
-							if (res.code==200&&res.data) {
-								this.people =res.data.rows
-								console.log(this.people,'人')
-							}
-						});
+				this.$Request.postJson('/api/sysProject/queryCoUsers',{}).then(res => {
+					if (res.code==200) {
+						// var lianji=[]
+						// for(var i=0;i<res.data.length;i++){
+						// 	if(res.data[i].organize==acc){
+						// 		lianji=res.data[i].userList
+						// 	}
+						// }
+						// console.log(lianji,'评分')
+						// this.scorePeople =lianji.map(item =>{
+						// 	return {
+						// 		value: item.id,
+						// 		label: item.userName,
+						// 	}
+						// })
+						
+						if (this.page == 1) {
+							console.log('哈')
+							this.people = res.data.rows
+						} else {
+							this.people = this.people.concat(res.data.rows)
+						}
+						console.log(this.people,'人')
+					}else{
+						var ii=JSON.stringify(res)
+						console.log(res,res.data)
+						console.log(JSON.parse(res))
+						console.log(JSON.parse(ii))
 					}
 					uni.hideLoading();
 				});
@@ -192,8 +211,6 @@
 					that.$queue.showToast("请选择预警时间");
 				}else if (!that.datetimerange) {
 					that.$queue.showToast("请选择周期");
-				} else if (!that.peopleCruuent) {
-					that.$queue.showToast("请选择任务负责人");
 				}else {
 					uni.showLoading({
 						title: '加载中',
@@ -356,7 +373,7 @@
 		border: 1rpx solid rgba(229, 229, 229, 1);
 		font-size: 28rpx;
 		line-height: 90rpx;
-		color: rgba(179, 179, 179, 1);
+		/* color: rgba(179, 179, 179, 1); */
 	}
 	.proIMi{
 		height: 315rpx;
@@ -384,6 +401,13 @@
 		color: rgba(255, 255, 255, 1);
 	}
 	/* 任务负责人弹出框 */
+	.popup-content{
+		height: 452px;
+		overflow-x: hidden;
+		.scroll_view_style{
+			height: 100%;
+		}
+	}
 	.popup-title{
 		display: flex;
 		width: 100%;

+ 48 - 41
pages/project/changeRenwu.vue

@@ -26,7 +26,8 @@
 			<input class="proINname" placeholder="请输入权重" type="digit" v-model="data.weight"/>
 			<view class="proMiao">任务负责人</view>
 			<view @click="toggle()">
-				<input class="proINname" v-model="peopleValue" placeholder="请选择任务负责人"/>
+				<view class="proINname" v-if="peopleValue==''">请选择任务负责人</view>
+				<view class="proINname" v-else>{{peopleValue}}</view>
 				<!-- <uni-data-select class="proINname" :disabled="true"
 					v-model="peopleValue" placeholder="请选择主办人"
 					:localdata="rangePeople"
@@ -53,24 +54,26 @@
 						<view>选择任务负责人</view>
 						<view style="color: rgba(0, 97, 255, 1);" @click="selectPeo">确定</view>
 					</view>
-					<view class="popup-list">
-						<radio-group @change="radioChange" v-for="(item,index) in people" :key="index">
-						<view class="l-line"></view>
-						<view class="l-kuang">
-							<view class="l-circle"></view>
-							<view style="margin-left: 20rpx;width: 320px;">
-								<view style="font-size: 28rpx;">{{item.userName}}</view>
-								<view style="font-size: 24rpx;">{{item.department}}</view>
-							</view>
-							<label class="l-label">
-								<view>
-									<radio :id="item.userName" :value="item.userName" :checked="index==peopleCruuent"></radio>
+					<scroll-view scroll-y="true" class="scroll_view_style">
+						<view class="popup-list">
+							<radio-group @change="radioChange" v-for="(item,index) in people" :key="index">
+							<view class="l-line"></view>
+							<view class="l-kuang">
+								<view class="l-circle"></view>
+								<view style="margin-left: 20rpx;width: 320px;">
+									<view style="font-size: 28rpx;">{{item.userName}}</view>
+									<view style="font-size: 24rpx;">{{item.department}}</view>
 								</view>
-							</label>
-							
+								<label class="l-label">
+									<view>
+										<radio :id="item.userName" :value="item.userName" :checked="index==peopleCruuent"></radio>
+									</view>
+								</label>
+								
+							</view>
+							</radio-group>
 						</view>
-						</radio-group>
-					</view>
+					</scroll-view>
 				</view>
 			</uni-popup>
 		</view>
@@ -106,13 +109,20 @@
 					"border": false, // 是否显示边框
 					"dividline": false
 				},
+				
+				page:1,
+				size:10,
+				totalCount:0,
 			}
 		},
 		onLoad(option) {
 			console.log(JSON.parse(decodeURIComponent(option.data)))
+			console.log(JSON.parse(decodeURIComponent(option.people)))
 			this.data=JSON.parse(decodeURIComponent(option.data))
-			this.getPeople()
+			this.people=JSON.parse(decodeURIComponent(option.people))
+			// this.getPeople()
 			this.peopleValue=this.data.headerName
+			this.peopleId=this.data.header
 			this.datetimerange[0]=this.data.startTime
 			this.datetimerange[1]=this.data.endTime
 			var image=[]
@@ -131,7 +141,7 @@
 				console.log('dd')
 				// open 方法传入参数 等同在 uni-popup 组件上绑定 type属性
 				this.$refs.popup.open('bottom')
-				this.getPeople()
+				// this.getPeople()
 			},
 			//取消弹框
 			quPopup(){
@@ -155,37 +165,27 @@
 			},
 			//选择负责人
 			getPeople(){
-				this.people=[]
+				// this.people=[]
 				uni.showLoading({
 					title: '加载中',
 					mask: true, // 是否显示透明蒙层,防止触摸穿透
 				});
-				this.$Request.postJson('/api/sysUser/queryPage?page=1&rows=10',{
+				this.$Request.postJson('/api/sysUser/queryPage?page='+this.page+'&rows='+this.size,{
 					"userName": null,      // 姓名
 					"roleName": null,      // 角色名称
 					"department": null,     // 部门
 					"createBy": "",   // 创建时间-开始日期
 					"updateBy": ""    // 创建时间-结束日期
 				}).then(res => {
-					if (res.code==200&&res.data.total>0) {
-						var total=res.data.total
-						this.$Request.postJson('/api/sysUser/queryPage?page=1&rows='+total,{
-							"userName": null,      // 姓名
-							"roleName": null,      // 角色名称
-							"department": null,     // 部门
-							"createBy": "",   // 创建时间-开始日期
-							"updateBy": ""    // 创建时间-结束日期
-						}).then(res => {
-							if (res.code==200&&res.data) {
-								this.people =res.data.rows
-								console.log(this.people,'人')
-								for(var i=0;i<this.people.length;i++){
-									if(this.people[i].userName==this.data.headerName){
-										this.peopleId=this.people[i].id
-									}
-								}
-							}
-						});
+					if (res.code==200) {
+						this.totalCount = res.data.total
+						if (this.page == 1) {
+							console.log('哈')
+							this.people = res.data.rows
+						} else {
+							this.people = this.people.concat(res.data.rows)
+						}
+						console.log(this.people,'人')
 					}
 					uni.hideLoading();
 				});
@@ -372,7 +372,7 @@
 		border: 1rpx solid rgba(229, 229, 229, 1);
 		font-size: 28rpx;
 		line-height: 90rpx;
-		color: rgba(179, 179, 179, 1);
+		/* color: rgba(179, 179, 179, 1); */
 	}
 	.proIMi{
 		height: 315rpx;
@@ -400,6 +400,13 @@
 		color: rgba(255, 255, 255, 1);
 	}
 	/* 任务负责人弹出框 */
+	.popup-content{
+		height: 452px;
+		overflow-x: hidden;
+		.scroll_view_style{
+			height: 100%;
+		}
+	}
 	.popup-title{
 		display: flex;
 		width: 100%;

+ 247 - 51
pages/project/index.vue

@@ -7,30 +7,31 @@
 		</view>
 		<!-- 筛选 -->
 		<view class="select2">
-			<view class="wei-title1 title1" v-if="select==3">
+			<view class="wei-title1 title1" v-if="select==5 && create==1">
 				<view>我创建的</view>
 				<view class="wei-line1"></view>
 			</view>
-			<view class="title1" style="rgba(0, 0, 0, 1)" v-else @click="selectChange(3)">
+			<view v-if="select!=5 && create==1" class="title1" style="rgba(0, 0, 0, 1)" @click="selectChange(5)">
 				我创建的
 				<view class="wei-line1" style="background: rgba(255, 255, 255, 1);"></view>
 			</view>
-			<!-- <view class="wei-title1 title1" v-if="select==1">
-				<view>我收藏的</view>
-				<view class="wei-line1"></view>
-			</view>
-			<view class="title1" style="rgba(0, 0, 0, 1)" v-else @click="selectChange(1)">
-				我收藏的
+			<view v-if="select!=5 && create==0" class="title2 nontitle">
+				我创建的
 				<view class="wei-line1" style="background: rgba(255, 255, 255, 1);"></view>
-			</view> -->
-			<view class="wei-title1 title2" v-if="select==3">
+			</view>
+			<view class="wei-title1 title2" v-if="select==6 && fenguan==1">
 				<view>我分管的</view>
 				<view class="wei-line1"></view>
 			</view>
-			<view class="title2" style="rgba(0, 0, 0, 1)" v-else @click="selectChange(3)">
+			<view v-if="select!=6 && fenguan==1" class="title2" style="rgba(0, 0, 0, 1)" @click="selectChange(6)">
 				我分管的
 				<view class="wei-line1" style="background: rgba(255, 255, 255, 1);"></view>
 			</view>
+			<view v-if="select!=6 && fenguan==0" class="title2 nontitle">
+				我分管的
+				<view class="wei-line1" style="background: rgba(255, 255, 255, 1);"></view>
+			</view>
+			
 			<view class="wei-title1 title3" v-if="select==3">
 				<view>我负责的</view>
 				<view class="wei-line1"></view>
@@ -48,12 +49,17 @@
 				<view class="wei-line1" style="background: rgba(255, 255, 255, 1);"></view>
 			</view>
 		</view>
-		<view class="search" style="margin: 20rpx 0 0 11px;width: 100%;background-color: rgba(255, 255, 255, 1);">
-			<uni-data-select style="border: 1px solid; width: 100px;border-radius: 85px;"
+		<view class="search" style="margin: 20rpx 0 0 0;background-color: rgba(255, 255, 255, 1);display: flex;">
+			<uni-data-select style="border: 1px solid; width: 350rpx;border-radius: 85px;"
 				v-model="typeid"
 				:localdata="zhuangtai"
 				@change="changeType"
 			  ></uni-data-select>
+			  <uni-data-select style="border: 1px solid; width: 350rpx;border-radius: 85px;margin-left: 20px;"
+			  	v-model="typeid2"
+			  	:localdata="zhuangtai2"
+			  	@change="changeType2"
+			    ></uni-data-select>
 		</view>
 		<!-- 数据列表 -->
 		<view class="kuang">
@@ -66,43 +72,55 @@
 				<view class="all-list2" style="margin-left: 15rpx;" v-else @click="changeTime(1)">正常在办</view>
 				<view class="all-list" style="margin-left: 15rpx;" v-if="change==4">正常办结</view>
 				<view class="all-list2" style="margin-left: 15rpx;" v-else @click="changeTime(4)">正常办结</view>
+				<view class="all-list" style="margin-left: 15rpx;" v-if="change==5">超时办结</view>
+				<view class="all-list2" style="margin-left: 15rpx;" v-else @click="changeTime(5)">超时办结</view>
 			</view>
 			<!-- 数据列表循环 -->
 			<view class="list" v-for="(item,index) in list" :key="index" @click="XiangPro(item)">
 				<view class="list-proname">
-					{{item.projectName}}
+					<view>
+						{{item.projectName| ellipsis}}
+					</view>
 					<view class="list-kua">{{item.projectFrom}}</view>
-					<view class="bu-shou yishou" v-if="item.collect==1" @click.stop="Qushoucang(item)">已收藏</view>
-					<view class="bu-shou shou" v-else @click.stop="shoucang(item)">收藏</view>
-					<view class="bu-shou norl" v-if="item.projectLevel=='正常'">正常</view>
-					<view class="bu-shou jinji" v-else>紧急</view>
-					<view class="bu-shou more">
-						<view @click.stop="dianMore(item)">更多</view>
-						<view class="xiala" v-if="item.isChecked">
-							<view>复制</view>
-							<view @click.stop="changePro(item)">编辑</view>
-							<view @click.stop="deletePro(item)">删除</view>
-							<view @click.stop="score(item)">评分</view>
+					<view style="margin-left: 10%;width: 200px;">
+						<view style="margin-left: 25%;display: flex;margin-top: 10rpx;">
+							<view class="bu-shou yishou" v-if="item.collect==1" @click.stop="Qushoucang(item)">已收藏</view>
+							<view class="bu-shou shou" v-if="item.collect==0 &&shouxiang==1" @click.stop="shoucang(item)">收藏</view>
+							<view class="bu-shou norl" v-if="item.projectLevel=='正常'">正常</view>
+							<view class="bu-shou jinji" v-else>紧急</view>
+							<view class="bu-shou more">
+								<view @click.stop="dianMore(item)">更多</view>
+								<view class="xiala" v-if="item.isChecked">
+									<!-- <view>复制</view> -->
+									<view @click.stop="changePro(item)" v-if="(item.progress!=1 && upxiang==1) && (select==5 || select==3)">编辑</view>
+									<view @click.stop="deletePro(item)" v-if="delexiang==1 && (select==5 || select==3)">删除</view>
+									<view @click.stop="score(item)" v-if="pingxiang==1 && (select==5 || select==3|| select==6)">评分</view>
+								</view>
+							</view>
 						</view>
 					</view>
+					
+					
 				</view>
 				<view class="list-dan">主办单位:{{item.organize}}</view>
-				<view class="list-dan">主办人:{{item.leaderName}}</view>
+				<view class="list-dan">主办人:{{item.sposonerName}}</view>
+				<view class="list-dan">协办人:{{item.coSposonerName}}</view>
 				<view class="list-dan">项目周期:{{item.startTime}}-{{item.endTime}}</view>
 				<view class="list-dan">任务:{{item.taskNum}}个</view>
 				<view class="list-dan">预警次数:{{item.warnNum}}次</view>
 				<view class="list-dan">提醒次数:{{item.remindNum}}次</view>
+				<view class="list-dan" v-if="item.progress==1">分数:{{item.score}}分</view>
 				<view class="list-dan" style="width: 620rpx;display: flex;">
 					项目进度:
-					<progress v-if="item.score!='/'" style="width: 380rpx;" :percent="item.progress" activeColor="rgba(0, 97, 255, 1)" border-radius="50" stroke-width="9" show-info font-size='12' active='true' />
-					<image src="../../static/project/warn.png" style="width: 43rpx;height: 43rpx;margin-top: 10rpx;" @click.stop="cuiban(item)" v-if="item.state==1||item.state==2||item.state==3"></image>
+					<progress v-if="item.progress!='/'" style="width: 380rpx;" :percent="(item.progress)*100" activeColor="rgba(0, 97, 255, 1)" border-radius="50" stroke-width="9" show-info font-size='12' active='true' />
+					<image src="../../static/project/warn.png" style="width: 43rpx;height: 43rpx;margin-top: 10rpx;" @click.stop="cuiban(item)" v-if="(item.state==1||item.state==2||item.state==3) &&acuiban==1&& (select==5 || select==3|| select==6)"></image>
 				</view>
 			</view>
 			<view style="width: 100%;height: 100rpx;"></view>
 		</view>
 		
 		<!-- 添加项目 -->
-		<view class="serviceBtn" @click.stop="addProject"></view>
+		<view class="serviceBtn" @click.stop="addProject" v-if="(select==5 || select==3) && crexiang==1"></view>
 	</view>
 </template>
 
@@ -114,18 +132,127 @@
 				select:3,
 				change:1,
 				list:[],
+				weidu:[],
 				page:1,
 				size:10,
 				totalCount:0,
+				//状态筛选
+				typeid:0,
+				zhuangtai:[
+					{ value: 1, text: "是否已评分" },
+					{ value: 2, text: "是否已关注" },
+					{ value: 3, text: "是否有任务" },
+					{ value: 4, text: "是否我评分" },
+				],
+				typeid2:null,
+				zhuangtai2:[
+					{ value: 1, text: "是" },
+					{ value: 0, text: "否" },
+				],
+				
+				fenguan:1,//是否分管
+				allcuiban:1,//一键催办
+				create:1,//是否创建
+				acuiban:1,//是否催办
+				shouxiang:1,//是否收藏项目
+				crexiang:1,//创建项目
+				upxiang:1,//是否修改项目
+				delexiang:1,//是否删除项目
+				pingxiang:1,//是否评分
+				crerenwu:1,//添加任务
+				uprenwu:1,//修改任务
+				delerenwu:1,//是否删除任务
+				cuirenwu:1,//催办任务
+				gengrenwu:1,//是否更新任务
 			}
 		},
+		filters:{
+			ellipsis(value){
+			  if (!value) return '';
+			  if (value.length > 5) {
+				return value.slice(0,5) + '...'
+			  }
+			 //  else if (value.length ==4){
+				// return value + '\u3000\u3000'
+			 //  }else if (value.length ==3){
+				// return value + '\u3000\u3000\u3000'
+			 //  }else if (value.length ==2){
+				// return value + '\u3000\u3000\u3000\u3000'
+			 //  }else if (value.length ==1){
+				// return value + '\u3000\u3000\u3000\u3000\u3000'
+			 //  }
+			  return value
+			}
+		  },
 		onLoad() {
-
+			this.getUser()
 		},
 		onShow() {
 			this.getProject()
 		},
 		methods: {
+			//获取个人信息
+			getUser(){
+				let that = this
+				uni.showLoading({
+					title: '加载中',
+					mask: true, // 是否显示透明蒙层,防止触摸穿透
+				});
+				that.$Request.postT('/api/sysUser/queryOwn').then(res => {
+					if (res.code==200) {
+						uni.setStorageSync('roleId', res.data.roleId)
+						var roleId=res.data.roleId
+						that.getRole(roleId)
+						console.log(uni.getStorageSync('roleId'),'数据')
+					} else {
+						uni.showToast({
+							title: res.message,
+							icon: 'none',
+							duration:800
+						});
+					}
+					uni.hideLoading();
+				});
+			},
+			//查询角色权限
+			getRole(roleId){
+				let that = this
+				uni.showLoading({
+					title: '加载中',
+					mask: true, // 是否显示透明蒙层,防止触摸穿透
+				});
+				var data={
+					roleId:roleId
+				}
+				that.$Request.postT('/api/sysRole/queryMenuByRole',data).then(res => {
+					if (res.code==200) {
+						console.log(uni.getStorageSync('roleId'),'数据')
+						console.log(res.data)
+						this.fenguan=res.data[1].menuLists[1].state
+						this.allcuiban=res.data[1].menuLists[0].state
+						this.create=res.data[1].menuLists[2].state
+						this.acuiban=res.data[1].menuLists[3].state
+						this.shouxiang=res.data[1].menuLists[4].state
+						this.crexiang=res.data[1].menuLists[5].state
+						this.upxiang=res.data[1].menuLists[6].state
+						this.delexiang=res.data[1].menuLists[7].state
+						this.pingxiang=res.data[1].menuLists[8].state
+						
+						uni.setStorageSync('crerenwu',res.data[1].menuLists[9].state)
+						uni.setStorageSync('uprenwu',res.data[1].menuLists[10].state)
+						uni.setStorageSync('delerenwu',res.data[1].menuLists[11].state)
+						uni.setStorageSync('cuirenwu',res.data[1].menuLists[12].state)
+						uni.setStorageSync('gengrenwu',res.data[1].menuLists[13].state)
+					} else {
+						uni.showToast({
+							title: res.message,
+							icon: 'none',
+							duration:800
+						});
+					}
+					uni.hideLoading();
+				});
+			},
 			//最上层切换
 			selectChange(a){
 				this.select=a
@@ -136,6 +263,17 @@
 				this.change=a
 				this.getProject()
 			},
+			//状态筛选
+			changeType(e){
+				this.typeid=e
+				console.log(e)
+				this.getProject()
+			},
+			//状态筛选
+			changeType2(e){
+				this.typeid2=e
+				this.getProject()
+			},
 			// 新建项目
 			addProject(){
 				uni.navigateTo({
@@ -154,8 +292,12 @@
 				str = str.replace(/%/g, '%25')
 				//这里———————————————————————————
 				let query = encodeURIComponent(str)
+				
+				let t2=JSON.stringify(this.weidu)
+				//这里———————————————————————————
+				let query2 = encodeURIComponent(t2)
 				uni.navigateTo({
-					url:'/pages/project/projectChange?data='+query
+					url:'/pages/project/projectChange?data='+query+'&weidu='+query2+'&select='+this.select
 				})
 			},
 			//查看项目详情
@@ -166,8 +308,12 @@
 				str = str.replace(/%/g, '%25')
 				//这里———————————————————————————
 				let query = encodeURIComponent(str)
+				
+				let t2=JSON.stringify(this.weidu)
+				//这里———————————————————————————
+				let query2 = encodeURIComponent(t2)
 				uni.navigateTo({
-					url:'/pages/project/projectX?data='+query
+					url:'/pages/project/projectX?data='+query+'&weidu='+query2+'&select='+this.select
 				})
 			},
 			//收藏项目
@@ -358,13 +504,39 @@
 			//查询项目列表
 			getProject(){
 				let that = this
-				that.list=[]
+				// that.list=[]
+				that.weidu=[]
+				if(that.typeid==1){
+					if(that.typeid2==1){
+						var pingfen=1
+					}else if(that.typeid2==0){
+						var pingfen=0
+					}
+				}else if(that.typeid==2){
+					if(that.typeid2==1){
+						var collet=1
+					}else if(that.typeid2==0){
+						var collet=0
+					}
+				}else if(that.typeid==3){
+					if(that.typeid2==1){
+						var task=1
+					}else if(that.typeid2==0){
+						var task=0
+					}
+				}else if(that.typeid==4){
+					if(that.typeid2==1){
+						var score=1
+					}else if(that.typeid2==0){
+						var score=0
+					}
+				}
 				uni.showLoading({
 					title: '加载中',
 					mask: true, // 是否显示透明蒙层,防止触摸穿透
 				});
 				var data={
-					"type": that.select,    // 1我关注的我收藏的、3我负责的、4我协办的、null
+					"type": that.select,    // 3我负责的、4我协办的、5创建的、6我分管的
 					"project": {
 						"projectName": that.keyword,   // 项目名称
 						"projectFrom": null,    // 项目来源
@@ -374,6 +546,10 @@
 						"coOrganize": null,   // 协办单位-多选
 						"sposonerName": null,    // 主办人
 						"coSposonerName": null,    // 协办人
+						"scoreState": pingfen,      // 是否已评分:1已评分,0未评分,null全部
+						"collect": collet,     // 是否已关注,1收藏,0未收藏,null全部
+						"hasTask": task,      // 是否有任务:1有任务,0没有认为,null全部
+						"isScore": score     // 是否我评分,1是我,0不是我,null全部
 					},
 					"t1": null,    // 创建开始时间
 					"t2": null,    // 创建结束时间
@@ -391,7 +567,7 @@
 						} else {
 							that.list = that.list.concat(res.data.project.rows)
 						}
-						
+						that.weidu=res.data.config
 						for (let i = 0; i < that.list.length; i++) {
 						that.$set(that.list[i], "isChecked", false);
 						}
@@ -484,40 +660,58 @@
 	}
 	/* 筛选 */
 	.select2{
+		display: flex;
 		margin: 20rpx 0 0 0;
 		width: 100%;
 		height: 120rpx;
 		background: rgba(255, 255, 255, 1);
+		font-weight: 500;
+		font-size: 26px;
 	}
 	.wei-title1{
 		color: rgba(0, 97, 255, 1);
 	}
 	.title1{
-		margin: 41rpx 0 0 55rpx;
+		width: 25%;
+		// margin: 41rpx 0 0 55rpx;
 		font-size: 28rpx;
+		text-align: center;
+		line-height: 68px;
 	}
 	.title2{
-		margin: -41px 0 0 228rpx;
+		width: 25%;
+		line-height: 68px;
+		// margin: -37px 0 0 228rpx;
 		font-size: 28rpx;
+		text-align: center;
+	}
+	.nontitle{
+		color:rgba(140, 140, 140, 1.0);
 	}
 	.title3{
-		margin: -41px 0 0 408rpx;
+		width: 25%;
+		line-height: 68px;
+		// margin: -37px 0 0 408rpx;
 		font-size: 28rpx;
+		text-align: center;
 	}
 	.title4{
-		margin: -41px 0 0 588rpx;
+		width: 25%;
+		line-height: 68px;
+		// margin: -38px 0 0 588rpx;
 		font-size: 28rpx;
+		text-align: center;
 	}
 	.wei-line1{
-		margin: 31rpx 0 0 15rpx;
-		width: 79rpx;
+		// margin: 31rpx 0 0 0;
+		// width: 79rpx;
 		height: 8rpx;
 		border-radius: 75rpx;
 		background: rgba(0, 97, 255, 1);
 	}
 	/* 数据列表 */
 	.kuang{
-		margin: 20rpx 0 0 0;
+		margin: 0rpx 0 0 0;
 		width: 100%;
 		background: rgba(255, 255, 255, 1);
 		min-height: 100vh; /* 设置最小高度为视口高度 */
@@ -557,7 +751,7 @@
 		flex-direction: column;
 		margin: 20rpx 0 0 20rpx;
 		width: 709rpx;
-		height: 422rpx;
+		// height: 422rpx;
 		border-radius: 7rpx;
 		background: rgba(245, 248, 255, 1);
 		box-shadow: 0px 4rpx 6rpx  rgba(0, 0, 0, 0.05);
@@ -569,10 +763,11 @@
 		font-size: 29rpx;
 		font-weight: 500;
 		display: flex;
+		width: 709rpx;
 	}
 	.list-kua{
 		margin-left: 5px;
-		width: 60px;
+		width: 45px;
 		height: 29rpx;
 		border-radius: 4rpx;
 		border: 2rpx solid rgba(33, 107, 255, 1);
@@ -582,7 +777,8 @@
 		text-align: center;
 	}
 	.bu-shou{
-		width: 73px;
+		margin-right: 5rpx;
+		width: 60px;
 		height: 44rpx;
 		border-radius: 7rpx;
 		font-size: 24rpx;
@@ -591,31 +787,31 @@
 		color: rgba(255, 255, 255, 1);
 	}
 	.yishou{
-		margin: 10rpx 0 0 222rpx;
+		// margin: 10rpx 0 0 180rpx;
 		background: rgba(9, 101, 98, 1);
 	}
 	.shou{
-		margin: 10rpx 0 0 222rpx;
+		// margin: 10rpx 0 0 180rpx;
 		background: rgba(0, 97, 255, 1);
 	}
 	.jinji{
-		margin: 10rpx 0 0 15rpx;
+		// margin: 10rpx 0 0 15rpx;
 		background: rgba(254, 144, 51, 1);
 	}
 	.norl{
-		margin: 10rpx 0 0 15rpx;
+		// margin: 10rpx 0 0 15rpx;
 		background: rgba(166, 166, 166, 1);
 		color: rgba(255, 255, 255, 1);
 	}
 	.more{
-		margin: 10rpx 0 0 15rpx;
+		// margin: 10rpx 0 0 15rpx;
 		background: rgba(0, 97, 255, 1);
 	}
 	.xiala{
 		z-index: 4;
 		position: relative;
 		width: 87rpx;
-		height: 174rpx;
+		// height: 174rpx;
 		border-radius: 2rpx;
 		background: rgba(255, 255, 255, 1);
 		box-shadow: 0px 4rpx 4rpx  rgba(0, 0, 0, 0.1);

+ 382 - 37
pages/project/projectChange.vue

@@ -21,7 +21,11 @@
 				></uni-file-picker>
 			</view>
 			<span style="margin: 20rpx 0 0 20rpx;">支持pdf/word/xlsx格式,单个文件大小不超过5MB</span>
-			<view class="proMiao">主办单位</view>
+			<view class="proMiao">主办单位/主办人</view>
+			<uni-data-picker placeholder="请选择主办单位" popup-title="请选择主办人" :localdata="range" v-model="value"
+				@change="onchange" @nodeclick="onnodeclick" @popupopened="onpopupopened" @popupclosed="onpopupclosed">
+			</uni-data-picker>
+			<!-- <view class="proMiao">主办单位</view>
 			<uni-data-select class="proINname"
 				v-model="value" placeholder="请选择主办单位"
 				:localdata="range"
@@ -32,13 +36,28 @@
 				v-model="peopleValue" placeholder="请选择主办人"
 				:localdata="rangePeople"
 				@change="change"
-			></uni-data-select>
-			<view class="proMiao">协办单位</view>
+			></uni-data-select> -->
+			<view class="proMiao">协办单位/协办人</view>
+			<uni-data-picker placeholder="请选择协办单位" popup-title="请选择协办人" :showSearch= "true" :localdata="range" v-model="value2"
+				@change="onchange2" @nodeclick="onnodeclick2" @popupopened="onpopupopened2" @popupclosed="onpopupclosed2">
+			</uni-data-picker>
+			<view class="proINname" style="height: 100%;">
+				   <view v-if="userListSelectwei.length>0" class="tag-view" v-for="(value,key) in userListSelectwei"  :key="key" @click="clearTagAdminwei(value)">
+						<uni-tag :text="value.value+'/'+value.text[key]" type="primary" ></uni-tag>
+						<uni-icons class="clearBtn"  type="clear" size="15" color="#ccc" />
+					</view>
+					<view v-if="userListSelectwei.length==0" class="tag-view" v-for="(value,key) in userListSelect"  :key="key" @click="clearTagAdmin(value)">
+						<uni-tag :text="value.parent_value.organize+'/'+value.text" type="primary" ></uni-tag>
+						<!-- {{value.parent_value.organize}}/{{value.text}} -->
+						<uni-icons class="clearBtn"  type="clear" size="15" color="#ccc" />
+					</view>
+			</view>
+			<!-- <view class="proMiao">协办单位</view>
 			<mySelectCheckbox class="proINname" placeholder="请选择协办单位" v-model="value2" multiple dataKey="label" dataValue="value" :localdata="data2"
 				@change="changeXie"></mySelectCheckbox>
 			<view class="proMiao">协办人</view>
 			<mySelectCheckbox class="proINname" placeholder="请选择协办人" v-model="peopleValue2" multiple dataKey="label" dataValue="value" :localdata="dataPeople"
-				@change="changeXiePeo"></mySelectCheckbox>
+				@change="changeXiePeo"></mySelectCheckbox> -->
 			
 			<view class="proMiao">项目级别</view>
 			<uni-data-select class="proINname"
@@ -53,33 +72,38 @@
 				@change="change"
 			></uni-data-select>
 			<view class="proMiao">项目评分人</view>
-			<mySelectCheckbox class="proINname" placeholder="请选择项目评分人" v-model="value2" multiple dataKey="label" dataValue="value" :localdata="data"
-				@change="changeXie"></mySelectCheckbox>
+			<mySelectCheckbox class="proINname" placeholder="请选择项目评分人" v-model="peoplescore" multiple dataKey="label" dataValue="value" :localdata="scorePeople"
+				@change="changeScore"></mySelectCheckbox>
 			<view class="proMiao jindu">完成进度</view>
-			<view class="weidu">维度权重40%</view>
-			<view class="addRen" @click="addRen">新增任务</view>
+			<view class="weidu">维度权重{{weidu}}%</view>
+			<view class="addRen" @click="addRen" v-if="crerenwu==1&& (select==5 || select==3)">新增任务</view>
 			<!-- 任务列表 -->
 			<view style="width: 100%;margin: 50rpx 0 0 20rpx;">
 				<view class="renwu" v-for="(item,index) in renwu" :key="index" @click="clickRenwu(item)">
 					<view>{{item.taskName}}</view>
 					<view>{{item.createTime}}</view>
+					<view v-if="item.finishTime!=null">{{item.finishRemark}}</view>
+					<view v-if="gengrenwu==1">{{item.weight}}</view>
+					<view v-if="item.state==1">已完成</view>
+					<view style="color: rgba(0, 97, 255, 1);" @click.stop="updateJin(item)" v-if="gengrenwu==1&& (select==5 || select==3|| select==4)">更新进度</view>
+					<view style="color: rgba(0, 97, 255, 1);" @click.stop="cuirenwu2(item)" v-if="cuirenwu==1">催办</view>
 					<view style="display: flex;">
-						<view class="renwu-bu bianji" @click.stop="bianjiRenwu(item)">编辑</view>
-						<view class="renwu-bu delete" @click.stop="deleteRenwu(item)">删除</view>
+						<view class="renwu-bu bianji" v-if="item.finishTime==null&&uprenwu==1&& (select==5 || select==3)" @click.stop="bianjiRenwu(item)">编辑</view>
+						<view class="renwu-bu delete" @click.stop="deleteRenwu(item)" v-if="delerenwu==1&& (select==5 || select==3)">删除</view>
 					</view>
 				</view>
 			</view>
 			
-			<view style="width: 100%;margin: 50rpx 0 0 20rpx;">
+			<!-- <view style="width: 100%;margin: 50rpx 0 0 20rpx;">
 				<view class="renwu" v-for="(item,index) in renwu" :key="index">
 					<view>{{item.taskName}}</view>
 					<view>{{item.createTime}}</view>
-					<view>30%</view>
+					<view>{{item.weight}}</view>
 					<view>{{item.scoreLimit}}</view>
-					<view style="color: rgba(0, 97, 255, 1);" @click="updateJin(item)">更新进度</view>
-					<view style="color: rgba(0, 97, 255, 1);" @click="cuirenwu(item)">催办</view>
+					<view style="color: rgba(0, 97, 255, 1);" @click="updateJin(item)" v-if="gengrenwu==1">更新进度</view>
+					<view style="color: rgba(0, 97, 255, 1);" @click="cuirenwu(item)" v-if="cuirenwu==1">催办</view>
 				</view>
-			</view>
+			</view> -->
 			<view class="proMiao jindu" v-if="data.progress>0">进度详情</view>
 			<!-- 进度 -->
 			<view style="margin: 33rpx 0 0 19rpx;" v-if="data.progress>0">
@@ -89,20 +113,17 @@
 						<view>
 							<view style="width: 600rpx;display: flex;justify-content: space-between;margin-top: 20rpx;">
 								<view style="display: flex;">
-									<view style="margin-left: 28rpx;">周提</view>
-									<view class="jindu-type lixiang">已立项</view>
+									<view style="margin-left: 28rpx;">{{item.createName}}</view>
+									<view class="jindu-type lixiang">{{item.content}}</view>
 								</view>
 								<!-- <view class="jindu-type cuiban">已催办</view>
 								<view class="jindu-type tijiao">已提交</view> -->
-								<view>2024-06-10 12:00:00</view>
+								<view>{{item.createTime}}</view>
 							</view>
-							<view style="margin:7rpx 0 0 28rpx;">任务指派:xxx,xxx,xxx</view>
-							<view style="margin:7rpx 0 0 28rpx;">任务指派:xxx,xxx,xxx</view>
-							<view style="margin:7rpx 0 0 28rpx;">任务指派:xxx,xxx,xxx</view>
-							<view style="margin:7rpx 0 0 28rpx;">任务指派:xxx,xxx,xxx</view>
+							<view style="margin:7rpx 0 0 28rpx;">项目名:{{item.projectName}}</view>
 						</view>
 					</view>
-					<view class="jindu-line" v-if="index<4"></view>
+					<!-- <view class="jindu-line" v-if="index<4"></view> -->
 					
 				</view>
 			</view>
@@ -118,17 +139,23 @@
 	import configdata from '@/common/config.js'
 	import mySelectCheckbox from '../../components/my-selectCheckbox.vue'
 	export default {
+		components:{mySelectCheckbox},
 		data() {
 			return {
 				data:{},
 				//主办单位
-				value: '',
+				value: '1-2',
 				range: [],
 				//主办人
 				peopleValue:'',
 				rangePeople:[],
+				userListSelect1:[],
 				//协办
-				value2:[],
+				value2:'',
+				userListSelect:[],
+				userListSelectwei:[
+					{value:'',text:''},
+				],
 				data2: [],
 				xieban:[],//协办传入值数组
 				xieValue:[],//协办传入id
@@ -137,6 +164,11 @@
 				dataPeople: [],
 				xiebanPeople:[],//协办传入值数组
 				xieValuePeople:[],//协办传入id
+				//评分人
+				peoplescore:[],
+				scorePeople: [],
+				scorePeople22:[],//协办传入值数组
+				scoreValuePeople:[],//协办传入id
 				// 项目级别
 				jibieValue:0,
 				jibie:[
@@ -163,12 +195,34 @@
 					"dividline": false
 				},
 				renwu:[],
+				
+				weidu:'',
+				
+				crerenwu:1,//添加任务
+				uprenwu:1,//修改任务
+				delerenwu:1,//是否删除任务
+				cuirenwu:1,//催办任务
+				gengrenwu:1,//是否更新任务
+				select:0,//状态
 			}
 		},
+		onShow() {
+			this.getPeopleZhu()
+		},
 		onLoad(option) {
+			this.crerenwu=uni.getStorageSync('crerenwu')
+			this.uprenwu=uni.getStorageSync('uprenwu')
+			this.delerenwu=uni.getStorageSync('delerenwu')
+			this.cuirenwu=uni.getStorageSync('cuirenwu')
+			this.gengrenwu=uni.getStorageSync('gengrenwu')
+			this.select=option.select
+			
 			console.log(JSON.parse(decodeURIComponent(option.data)))
+			var wei=JSON.parse(decodeURIComponent(option.weidu))
 			this.data=JSON.parse(decodeURIComponent(option.data))
-			this.getDanwei()
+			this.weidu=(wei[2].configValue)
+			// this.getDanwei()
+			this.getPeople(this.data.organize)
 			for(var i=0;i<this.jibie.length;i++){
 				if(this.jibie[i].text==this.data.projectLevel){
 					this.jibieValue=this.jibie[i].value
@@ -189,19 +243,177 @@
 			this.fileList22=image.join(",")
 			console.log(this.fileList2)
 			this.getRenwu()
+			
+			console.log(this.data.coOrganize.split(','))
+			// this.userListSelect=
+			this.userListSelectwei=[]
+			var xieban=[]
+			var xiebanpeo=[]
+			var tt=[]
+			var xiebanV=[]
+			xieban=this.data.coOrganize.split(',')
+			xiebanpeo=this.data.coSposonerName.split(',')
+			xiebanV=this.data.coSposoner.split(',')
+			this.userListSelectwei=xieban.map(item =>{
+				console.log(item)
+				return {
+					value: item,
+					text:xiebanpeo,
+					id:xiebanV
+				}
+			})
+			// for(var i=0;i<xieban.length;i++){
+			// 	// for(var j=0;j<xiebanpeo.length;j++){
+			// 		// this.userListSelectwei.push({value:xieban[0]},{text:xiebanpeo[0]})
+			// 	// }
+			// }
+			// this.userListSelectwei.push({value:xieban[0]},{text:xiebanpeo[0]})
+			// xieban.map(item =>{
+			// 	tt.push({value:item})
+			// 	// return {
+			// 	// 	value: item2,
+			// 	// 	text: item,
+			// 	// }
+			// })
+			// this.userListSelectwei=tt
+			console.log(this.userListSelectwei,'t')
+			// xiebanpeo.map(item =>{
+			// 	this.userListSelectwei.push({text:item})
+			// 	// return {
+			// 	// 	value: item2,
+			// 	// 	text: item,
+			// 	// }
+			// })
+			// this.userListSelectwei=xiebanpeo.map(item =>{
+			// 	return {
+			// 		value: item,
+			// 	}
+			// })
+			// this.userListSelectwei.push(xieban,xiebanpeo)
+			console.log(this.userListSelectwei,'p')
 		},
 		methods: {
 			 change(e) {
 			  console.log("e:", e);
 			},
+			//主办人
+			onnodeclick(data) {
+				console.log(data);
+				this.userListSelect1 = data
+				// this.getPeople()
+			},
+			onpopupopened(e) {
+				console.log('popupopened');
+			},
+			onpopupclosed(e) {
+				console.log('popupclosed');
+			},
+			onchange(e) {
+				console.log('---------onchange:', e);
+				var acc=e.detail.value[0].text
+				this.getPeople(acc)
+			},
+			//协办人
+			clearTagAdmin(value){
+				this.userListSelect = this.userListSelect.filter(item => item != value);
+			},
+			clearTagAdminwei(value){
+				this.userListSelectwei = this.userListSelectwei.filter(item => item != value);
+			},
+			onnodeclick2(data) {
+				console.log(data);
+				if(data.parent_value){//存在父级
+				  let dataId = data.value;
+				  this.userListSelect.push(data);
+				  this.userListSelect = [...new Set(this.userListSelect)]//es6数组去重
+				  this.userListSelectwei=[]
+				}
+				console.log(this.userListSelectwei,'多选',this.userListSelect)
+			
+			},
+			onpopupopened2(e) {
+				console.log('popupopened');
+			},
+			onpopupclosed2(e) {
+				console.log('popupclosed');
+			},
+			onchange2(e) {
+				console.log('---------onchange:', e);
+			},
+			//评分人选择
+			changeScore(e){
+				console.log(this.peoplescore)
+				this.scorePeople22=[]
+				this.scoreValuePeople=[]
+				console.log('e:', e);
+				e.map(item =>{
+					this.scorePeople22.push(item.label)
+					this.scoreValuePeople.push(item.value)
+				})
+			},
 			//新增任务
 			addRen(){
+				var shuzu=[
+					{userName:'',department:'',id:''}
+				]
+				var xieban=[]
+				var xiebanpeo=[]
+				var tt=[]
+				var xiebanV=[]
+				var a1=this.data.sposonerName+','+this.data.coSposonerName
+				var a2=this.data.organize+','+this.data.coOrganize
+				var a3=this.data.sposoner+','+this.data.coSposoner
+				xieban=a1.split(',')
+				xiebanpeo=a2.split(',')
+				xiebanV=a3.split(',')
+				shuzu=xieban.map(item =>{
+					console.log(item)
+					return {
+						userName: item,
+					}
+				})
+				shuzu.forEach((item,index) => {
+					console.log(item);
+					this.$set(item,"department",xiebanpeo[index])
+					this.$set(item,"id",xiebanV[index])
+				})
+				let t2=JSON.stringify(shuzu)
+				//这里———————————————————————————
+				let query2 = encodeURIComponent(t2)
 				uni.navigateTo({
-					url:'/pages/project/addRenwu?proId='+this.data.id
+					url:'/pages/project/addRenwu?proId='+this.data.id+'&people='+query2
 				})
 			},
 			//编辑任务
 			bianjiRenwu(item){
+				var shuzu=[
+					{userName:'',department:'',id:''}
+				]
+				var xieban=[]
+				var xiebanpeo=[]
+				var tt=[]
+				var xiebanV=[]
+				var a1=this.data.sposonerName+','+this.data.coSposonerName
+				var a2=this.data.organize+','+this.data.coOrganize
+				var a3=this.data.sposoner+','+this.data.coSposoner
+				xieban=a1.split(',')
+				xiebanpeo=a2.split(',')
+				xiebanV=a3.split(',')
+				shuzu=xieban.map(item =>{
+					console.log(item)
+					return {
+						userName: item,
+					}
+				})
+				shuzu.forEach((item,index) => {
+					console.log(item);
+					this.$set(item,"department",xiebanpeo[index])
+					this.$set(item,"id",xiebanV[index])
+				})
+				let t2=JSON.stringify(shuzu)
+				//这里———————————————————————————
+				let query2 = encodeURIComponent(t2)
+				
 				//传参对象,使用encodeURIComponent编码
 				let str = JSON.stringify(item)
 				//注意这里——————————————————————
@@ -209,7 +421,7 @@
 				//这里———————————————————————————
 				let query = encodeURIComponent(str)
 				uni.navigateTo({
-					url:'/pages/project/changeRenwu?data='+query
+					url:'/pages/project/changeRenwu?data='+query+'&people='+query2
 				})
 			},
 			//删除任务
@@ -257,6 +469,34 @@
 			},
 			//任务详情
 			clickRenwu(item){
+				var shuzu=[
+					{userName:'',department:'',id:''}
+				]
+				var xieban=[]
+				var xiebanpeo=[]
+				var tt=[]
+				var xiebanV=[]
+				var a1=this.data.sposonerName+','+this.data.coSposonerName
+				var a2=this.data.organize+','+this.data.coOrganize
+				var a3=this.data.sposoner+','+this.data.coSposoner
+				xieban=a1.split(',')
+				xiebanpeo=a2.split(',')
+				xiebanV=a3.split(',')
+				shuzu=xieban.map(item =>{
+					console.log(item)
+					return {
+						userName: item,
+					}
+				})
+				shuzu.forEach((item,index) => {
+					console.log(item);
+					this.$set(item,"department",xiebanpeo[index])
+					this.$set(item,"id",xiebanV[index])
+				})
+				let t2=JSON.stringify(shuzu)
+				//这里———————————————————————————
+				let query2 = encodeURIComponent(t2)
+				
 				//传参对象,使用encodeURIComponent编码
 				let str = JSON.stringify(item)
 				//注意这里——————————————————————
@@ -264,7 +504,7 @@
 				//这里———————————————————————————
 				let query = encodeURIComponent(str)
 				uni.navigateTo({
-					url:'/pages/project/renwuX?data='+query
+					url:'/pages/project/renwuX?data='+query+'&people='+query2
 				})
 			},
 			//更新进度
@@ -280,7 +520,7 @@
 				})
 			},
 			//催办任务
-			cuirenwu(item){
+			cuirenwu2(item){
 				let that = this
 				uni.showModal({
 					title: '提示',
@@ -358,6 +598,93 @@
 						// }
 					}
 					uni.hideLoading();
+					
+				});
+			},
+			//获取主办协办人
+			getPeopleZhu(){
+				this.range=[]
+				this.rangePeople=[]
+				uni.showLoading({
+					title: '加载中',
+					mask: true, // 是否显示透明蒙层,防止触摸穿透
+				});
+				this.$Request.postJson('/api/sysProject/queryCoUsers',{}).then(res => {
+					if (res.code==200) {
+						var lianji=[]
+						for(var i=0;i<res.data.length;i++){
+							if(res.data[i].userList.length>0){
+								lianji.push(res.data[i])
+							}
+						}
+						this.range =lianji.map(item =>{
+							return {
+								value: item,
+								text: item.organize,
+								children:item.userList.map(item =>{
+									return{
+										value: item.id,
+										text: item.userName,
+									}
+								})
+							}
+						})
+						
+						console.log(this.range,'人')
+						this.value=parseInt(this.data.sposoner)//25
+						this.userListSelect1={
+							parent_value:{
+								organize:this.data.organize
+							}
+						}
+					}else{
+						var ii=JSON.stringify(res)
+						console.log(res,res.data)
+						console.log(JSON.parse(res))
+						console.log(JSON.parse(ii))
+					}
+					uni.hideLoading();
+				});
+			},
+			//根据单位获取人员(评分人)
+			getPeople(acc){
+				console.log(this.userListSelect1)
+				this.scorePeople=[]
+				uni.showLoading({
+					title: '加载中',
+					mask: true, // 是否显示透明蒙层,防止触摸穿透
+				});
+				this.$Request.postT('/api/sysUser/queryScorer',{
+					organizes:acc
+				}).then(res => {
+					if (res.code==200) {
+						console.log(res,'评分')
+						this.scorePeople =res.data.map(item =>{
+							return {
+								value: item.id,
+								label: item.userName,
+							}
+						})
+						console.log(this.scorePeople,'人')
+						
+						var people=[]
+						people=this.data.scorerName.split(',')
+						for(var j=0;j<this.scorePeople.length;j++){
+							for(var i=0;i<people.length;i++){
+								console.log(this.scorePeople[j].label,'ll',people[i])
+								if(this.scorePeople[j].label==people[i]){
+									this.peoplescore.push(this.scorePeople[j].value)
+									this.scoreValuePeople.push(this.scorePeople[j].value)
+								}
+							}
+						}
+					}else{
+						var ii=JSON.stringify(res)
+						console.log(res,res.data)
+						console.log(JSON.parse(res))
+						console.log(JSON.parse(ii))
+					}
+					uni.hideLoading();
 				});
 			},
 			// 查找任务
@@ -388,6 +715,21 @@
 			},
 			//保存编辑项目
 			updatePro(){
+				console.log(this.userListSelectwei)
+				var xieban=[]
+				var xiebanValue=[]
+				if(this.userListSelectwei.length>0){
+					this.userListSelectwei.map(item =>{
+						xieban.push(item.value)
+						xiebanValue.push(item.id[0])
+					})
+				}else{
+					this.userListSelect.map(item =>{
+						xieban.push(item.parent_value.organize)
+						xiebanValue.push(item.value)
+					})
+				}
+				console.log(this.userListSelect1.parent_value.organize,this.value)
 				let that = this
 				if (!that.data.projectName) {
 					that.$queue.showToast("请输入项目标题");
@@ -395,8 +737,6 @@
 					that.$queue.showToast("请输入项目描述");
 				} else if (!that.value) {
 					that.$queue.showToast("请选择主办单位");
-				} else if (!that.value2) {
-					that.$queue.showToast("请选择协办单位");
 				}else {
 					uni.showLoading({
 						title: '加载中',
@@ -409,10 +749,11 @@
 						"projectLevel": that.jibie[that.jibieValue].text,    // 项目等级
 						"projectContent": that.data.projectContent,    // 项目描述
 						"fileUrl": that.fileList22,   // 附件
-						"organize": that.range[that.value].text,   // 主办单位-单选
-						"sposoner": "25",   // 主办人ID-单选
-						"coOrganize": "产教融合处,信息与控制技术研究所",   // 协办单位-多选
-						"coSposoner": "20,23"    // 协办人ID-多选
+						"organize": that.userListSelect1.parent_value.organize,   // 主办单位-单选
+						"sposoner": that.value,   // 主办人ID-单选
+						"coOrganize": xieban.join(","),   // 协办单位-多选
+						"coSposoner": xiebanValue.join(",")    ,// 协办人ID-多选
+						"scorer": that.scoreValuePeople.join(",")   // 评分人ID-多选
 					}).then(res => {
 						if (res.code == 200) {
 							uni.showToast({
@@ -545,7 +886,11 @@
 		border: 1rpx solid rgba(229, 229, 229, 1);
 		font-size: 28rpx;
 		line-height: 90rpx;
-		color: rgba(179, 179, 179, 1);
+		/* 自动换行 */
+		word-wrap: break-word;
+		word-break: break-all;
+		white-space: pre-line;
+		/* color: rgba(179, 179, 179, 1); */
 	}
 	.proIMi{
 		height: 315rpx;

+ 250 - 12
pages/project/projectX.vue

@@ -23,37 +23,48 @@
 			</view> -->
 			<view class="proMiao">主办单位</view>
 			<view class="prolittle">{{data.organize}}</view>
+			<view class="proMiao">主办人</view>
+			<view class="prolittle">{{data.sposonerName}}</view>
 			<view class="proMiao">协办单位</view>
 			<view class="prolittle">{{data.coOrganize}}</view>
+			<view class="proMiao">协办人</view>
+			<view class="prolittle">{{data.coSposonerName}}</view>
+			<view class="proMiao">评分人</view>
+			<view class="prolittle">{{data.scorerName}}</view>
 			
 			<view class="proMiao">项目级别</view>
 			<view class="prolittle">{{data.projectLevel}}</view>
 			<view class="proMiao">项目来源</view>
 			<view class="prolittle">{{data.projectFrom}}</view>
 			<view class="proMiao jindu">完成进度</view>
-			<view class="weidu">维度权重40%</view>
-			<view class="addRen" @click="addRen">新增任务</view>
+			<view class="weidu">维度权重{{weidu}}%</view>
+			<view class="addRen" @click="addRen" v-if="crerenwu==1&& (select==5 || select==3)">新增任务</view>
 			<!-- 任务列表 -->
 			<view style="width: 100%;margin: 50rpx 0 0 20rpx;">
-				<view class="renwu" v-for="(item,index) in renwu" :key="index">
+				<view class="renwu" v-for="(item,index) in renwu" :key="index" @click="clickRenwu(item)">
 					<view>{{item.taskName}}</view>
 					<view>{{item.createTime}}</view>
+					<view v-if="item.finishTime!=null">{{item.finishRemark}}</view>
+					<view v-if="gengrenwu==1">{{item.weight}}</view>
+					<view v-if="item.state==1">已完成</view>
+					<view style="color: rgba(0, 97, 255, 1);" @click.stop="updateJin(item)" v-if="gengrenwu==1&& (select==5 || select==3|| select==4)">更新进度</view>
+					<view style="color: rgba(0, 97, 255, 1);" @click.stop="cuirenwu2(item)" v-if="cuirenwu==1">催办</view>
 					<view style="display: flex;">
-						<view class="renwu-bu bianji">编辑</view>
-						<view class="renwu-bu delete">删除</view>
+						<view class="renwu-bu bianji" v-if="item.finishTime==null&&uprenwu==1&& (select==5 || select==3)" @click.stop="bianjiRenwu(item)">编辑</view>
+						<view class="renwu-bu delete" @click.stop="deleteRenwu(item)" v-if="delerenwu==1&& (select==5 || select==3)">删除</view>
 					</view>
 				</view>
 			</view>
 			
-			<view style="width: 100%;margin: 50rpx 0 0 20rpx;">
+			<!-- <view style="width: 100%;margin: 50rpx 0 0 20rpx;">
 				<view class="renwu" v-for="(item,index) in renwu" :key="index">
 					<view>{{item.taskName}}</view>
 					<view>{{item.createTime}}</view>
-					<view>30%</view>
+					<view>{{item.weight}}</view>
 					<view>{{item.scoreLimit}}</view>
 					<view style="color: rgba(0, 97, 255, 1);">更新进度</view>
 				</view>
-			</view>
+			</view> -->
 			<view class="proMiao jindu" v-if="data.progress>0">进度详情</view>
 			<!-- 进度 -->
 			<view style="margin: 33rpx 0 0 19rpx;">
@@ -63,7 +74,7 @@
 						<view>
 							<view style="width: 600rpx;display: flex;justify-content: space-between;margin-top: 20rpx;">
 								<view style="display: flex;">
-									<view style="margin-left: 28rpx;">{{item.createBy}}</view>
+									<view style="margin-left: 28rpx;">{{item.createName}}</view>
 									<view class="jindu-type lixiang">{{item.content}}</view>
 								</view>
 								<!-- <view class="jindu-type cuiban">已催办</view>
@@ -76,7 +87,7 @@
 							<view style="margin:7rpx 0 0 28rpx;">任务指派:xxx,xxx,xxx</view> -->
 						</view>
 					</view>
-					<view class="jindu-line" v-if="index<(rizhi.length-1)"></view>
+					<!-- <view class="jindu-line" v-if="index<(rizhi.length-1)"></view> -->
 					
 				</view>
 			</view>
@@ -101,11 +112,29 @@
 				},
 				renwu:[],
 				rizhi:[],//日志
+				weidu:'',
+				
+				crerenwu:1,//添加任务
+				uprenwu:1,//修改任务
+				delerenwu:1,//是否删除任务
+				cuirenwu:1,//催办任务
+				gengrenwu:1,//是否更新任务
+				select:0,//状态
 			}
 		},
 		onLoad(option) {
+			this.crerenwu=uni.getStorageSync('crerenwu')
+			this.uprenwu=uni.getStorageSync('uprenwu')
+			this.delerenwu=uni.getStorageSync('delerenwu')
+			this.cuirenwu=uni.getStorageSync('cuirenwu')
+			this.gengrenwu=uni.getStorageSync('gengrenwu')
+			this.select=option.select
+			
 			console.log(JSON.parse(decodeURIComponent(option.data)))
+			console.log(JSON.parse(decodeURIComponent(option.weidu)))
+			var wei=JSON.parse(decodeURIComponent(option.weidu))
 			this.data=JSON.parse(decodeURIComponent(option.data))
+			this.weidu=(wei[2].configValue)
 			var image=[]
 			image=this.data.fileUrl.split(',')
 			this.fileList2 =image.map(item =>{
@@ -128,8 +157,213 @@
 			},
 			//新增任务
 			addRen(){
+				var shuzu=[
+					{userName:'',department:'',id:''}
+				]
+				var xieban=[]
+				var xiebanpeo=[]
+				var tt=[]
+				var xiebanV=[]
+				var a1=this.data.sposonerName+','+this.data.coSposonerName
+				var a2=this.data.organize+','+this.data.coOrganize
+				var a3=this.data.sposoner+','+this.data.coSposoner
+				xieban=a1.split(',')
+				xiebanpeo=a2.split(',')
+				xiebanV=a3.split(',')
+				shuzu=xieban.map(item =>{
+					console.log(item)
+					return {
+						userName: item,
+					}
+				})
+				shuzu.forEach((item,index) => {
+					console.log(item);
+					this.$set(item,"department",xiebanpeo[index])
+					this.$set(item,"id",xiebanV[index])
+				})
+				let t2=JSON.stringify(shuzu)
+				//这里———————————————————————————
+				let query2 = encodeURIComponent(t2)
 				uni.navigateTo({
-					url:'/pages/project/addRenwu?proId='+this.data.id
+					url:'/pages/project/addRenwu?proId='+this.data.id+'&people='+query2
+				})
+			},
+			//编辑任务
+			bianjiRenwu(item){
+				var shuzu=[
+					{userName:'',department:'',id:''}
+				]
+				var xieban=[]
+				var xiebanpeo=[]
+				var tt=[]
+				var xiebanV=[]
+				var a1=this.data.sposonerName+','+this.data.coSposonerName
+				var a2=this.data.organize+','+this.data.coOrganize
+				var a3=this.data.sposoner+','+this.data.coSposoner
+				xieban=a1.split(',')
+				xiebanpeo=a2.split(',')
+				xiebanV=a3.split(',')
+				shuzu=xieban.map(item =>{
+					console.log(item)
+					return {
+						userName: item,
+					}
+				})
+				shuzu.forEach((item,index) => {
+					console.log(item);
+					this.$set(item,"department",xiebanpeo[index])
+					this.$set(item,"id",xiebanV[index])
+				})
+				let t2=JSON.stringify(shuzu)
+				//这里———————————————————————————
+				let query2 = encodeURIComponent(t2)
+				
+				//传参对象,使用encodeURIComponent编码
+				let str = JSON.stringify(item)
+				//注意这里——————————————————————
+				str = str.replace(/%/g, '%25')
+				//这里———————————————————————————
+				let query = encodeURIComponent(str)
+				uni.navigateTo({
+					url:'/pages/project/changeRenwu?data='+query+'&people='+query2
+				})
+			},
+			//删除任务
+			deleteRenwu(item){
+				let that = this
+				uni.showModal({
+					title: '提示',
+					content: '确定删除任务吗?',
+					success: function(res) {
+						if (res.confirm) {
+							console.log('用户点击确定');
+							uni.showLoading({
+								title: '加载中',
+								mask: true, // 是否显示透明蒙层,防止触摸穿透
+							});
+							let data={
+								id:item.id,
+							}
+							that.$Request.postT('/api/sysTask/del',data).then(res => {
+								if (res.code==200) {
+									uni.showToast({
+										title: '删除成功',
+										icon: 'none',
+										duration:800
+									});
+									uni.hideLoading()
+													
+									setTimeout(function() {
+										that.getRenwu()
+									}, 1000)
+								} else {
+									uni.hideLoading();
+									uni.showToast({
+										title: res.message,
+										icon: 'none',
+										duration:800
+									});
+								}
+							});
+						} else if (res.cancel) {
+							console.log('用户点击取消');
+						}
+					}
+				})
+			},
+			//任务详情
+			clickRenwu(item){
+				var shuzu=[
+					{userName:'',department:'',id:''}
+				]
+				var xieban=[]
+				var xiebanpeo=[]
+				var tt=[]
+				var xiebanV=[]
+				var a1=this.data.sposonerName+','+this.data.coSposonerName
+				var a2=this.data.organize+','+this.data.coOrganize
+				var a3=this.data.sposoner+','+this.data.coSposoner
+				xieban=a1.split(',')
+				xiebanpeo=a2.split(',')
+				xiebanV=a3.split(',')
+				shuzu=xieban.map(item =>{
+					console.log(item)
+					return {
+						userName: item,
+					}
+				})
+				shuzu.forEach((item,index) => {
+					console.log(item);
+					this.$set(item,"department",xiebanpeo[index])
+					this.$set(item,"id",xiebanV[index])
+				})
+				let t2=JSON.stringify(shuzu)
+				//这里———————————————————————————
+				let query2 = encodeURIComponent(t2)
+				
+				//传参对象,使用encodeURIComponent编码
+				let str = JSON.stringify(item)
+				//注意这里——————————————————————
+				str = str.replace(/%/g, '%25')
+				//这里———————————————————————————
+				let query = encodeURIComponent(str)
+				uni.navigateTo({
+					url:'/pages/project/renwuX?data='+query+'&people='+query2
+				})
+			},
+			//更新进度
+			updateJin(item){
+				//传参对象,使用encodeURIComponent编码
+				let str = JSON.stringify(item)
+				//注意这里——————————————————————
+				str = str.replace(/%/g, '%25')
+				//这里———————————————————————————
+				let query = encodeURIComponent(str)
+				uni.navigateTo({
+					url:'/pages/project/renwuUpdateJin?data='+query
+				})
+			},
+			//催办任务
+			cuirenwu2(item){
+				let that = this
+				uni.showModal({
+					title: '提示',
+					content: '确定催办任务吗?',
+					success: function(res) {
+						if (res.confirm) {
+							console.log('用户点击确定');
+							uni.showLoading({
+								title: '加载中',
+								mask: true, // 是否显示透明蒙层,防止触摸穿透
+							});
+							let data={
+								taskId:item.id,
+							}
+							that.$Request.postT('/api/sysTask/urge',data).then(res => {
+								if (res.code==200) {
+									uni.showToast({
+										title: '催办成功',
+										icon: 'none',
+										duration:800
+									});
+									uni.hideLoading()
+													
+									setTimeout(function() {
+										that.getRenwu()
+									}, 1000)
+								} else {
+									uni.hideLoading();
+									uni.showToast({
+										title: res.message,
+										icon: 'none',
+										duration:800
+									});
+								}
+							});
+						} else if (res.cancel) {
+							console.log('用户点击取消');
+						}
+					}
 				})
 			},
 			// 查找任务
@@ -196,6 +430,10 @@
 	.prolittle{
 		margin: 5rpx 0 0 20rpx;
 		width: 710rpx;
+		/* 自动换行 */
+		word-wrap: break-word;
+		word-break: break-all;
+		white-space: pre-line;
 	}
 	.proINname{
 		margin: 25rpx 0 0 21rpx;
@@ -206,7 +444,7 @@
 		border: 1rpx solid rgba(229, 229, 229, 1);
 		font-size: 28rpx;
 		line-height: 90rpx;
-		color: rgba(179, 179, 179, 1);
+		/* color: rgba(179, 179, 179, 1); */
 	}
 	.proIMi{
 		height: 315rpx;

+ 6 - 1
pages/project/renwuUpdateJin.vue

@@ -4,6 +4,8 @@
 			<view class="proMiao mingchen">{{data.taskName}}</view>
 			<view class="proMiao title">评分标准</view>
 			<view class="prolittle">{{data.scoreStandard}}</view>
+			<view class="proMiao title">任务负责人</view>
+			<view class="prolittle">{{data.headerName}}</view>
 			<view class="proMiao title">评分上限</view>
 			<view class="prolittle">{{data.scoreLimit}}</view>
 			<view class="proMiao">附件</view>
@@ -255,6 +257,9 @@
 	.prolittle{
 		margin: 5rpx 0 0 20rpx;
 		width: 710rpx;
+		word-wrap: break-word;
+		word-break: break-all;
+		white-space: pre-line;
 	}
 	.proINname{
 		margin: 25rpx 0 0 21rpx;
@@ -265,7 +270,7 @@
 		border: 1rpx solid rgba(229, 229, 229, 1);
 		font-size: 28rpx;
 		line-height: 90rpx;
-		color: rgba(179, 179, 179, 1);
+		/* color: rgba(179, 179, 179, 1); */
 	}
 	.proIMi{
 		height: 315rpx;

+ 29 - 12
pages/project/renwuX.vue

@@ -1,25 +1,29 @@
 <template>
 	<view class="content">
 		<view class="param">
-			<view class="proMiao mingchen">xxxx任务</view>
+			<view class="proMiao mingchen">{{data.taskName}}</view>
 			<view class="proMiao title">评分标准</view>
-			<view class="prolittle">生死狙击睡觉睡觉睡觉睡觉睡觉死狙击睡觉睡觉睡觉睡觉睡觉死狙击睡觉睡觉睡觉睡觉睡觉死狙击睡觉睡觉睡觉睡觉睡觉死狙击睡觉睡觉睡觉睡觉睡觉</view>
+			<view class="prolittle">{{data.scoreStandard}}</view>
+			<view class="proMiao title">任务负责人</view>
+			<view class="prolittle">{{data.headerName}}</view>
 			<view class="proMiao title">评分上限</view>
-			<view class="prolittle">80</view>
+			<view class="prolittle">{{data.scoreLimit}}</view>
 			<view class="proMiao title">权重</view>
-			<view class="prolittle">80</view>
+			<view class="prolittle">{{data.weight}}</view>
 			<view class="proMiao title">提醒时间</view>
-			<view class="prolittle">2024-01-22 14:22:22</view>
+			<view class="prolittle">{{data.remindTime}}</view>
 			<view class="proMiao title">预警时间</view>
-			<view class="prolittle">2024-01-22 14:22:22</view>
+			<view class="prolittle">{{data.warnTime}}</view>
 			<view class="proMiao title">任务周期</view>
-			<view class="prolittle">2024-01-22 14:22:22  -  2024-09-11 14:22:22</view>
+			<view class="prolittle">{{data.startTime}}  -  {{data.endTime}}</view>
 			<view class="proMiao title">完成说明</view>
 			<view class="prolittle">这里是完成说明</view>
 			<view class="proMiao title">附件</view>
-			<view class="prolittle" style="color: rgba(54, 111, 255, 1);">附件1</view>
-			<view class="proMiao title">系统</view>
-			<view class="prolittle">100</view>
+			<view class="prolittle" v-for="(item,index) in fileList3">
+				<view style="color: rgba(0, 97, 255, 1);" @click="navigateToTU(item.name)">{{item.name}}</view>
+			</view>
+			<!-- <view class="proMiao title">系统</view>
+			<view class="prolittle">100</view> -->
 		</view>
 	</view>
 </template>
@@ -28,10 +32,20 @@
 	export default {
 		data() {
 			return {
+				data:{},
+				fileList3: [],
 			}
 		},
-		onLoad() {
-	
+		onLoad(option) {
+			console.log(JSON.parse(decodeURIComponent(option.data)))
+			this.data=JSON.parse(decodeURIComponent(option.data))
+			var image=[]
+			image=this.data.fileUrl.split(',')
+			this.fileList3 =image.map(item =>{
+				return {
+					name: item
+				}
+			})
 		},
 		methods: {
 		}
@@ -61,6 +75,9 @@
 	.prolittle{
 		margin: 5rpx 0 0 20rpx;
 		width: 710rpx;
+		word-wrap: break-word;
+		word-break: break-all;
+		white-space: pre-line;
 	}
 	.mingchen{
 		font-size: 32rpx;

+ 4 - 4
pages/project/sorce.vue

@@ -46,9 +46,9 @@
 						mask: true, // 是否显示透明蒙层,防止触摸穿透
 					});
 					var data={
-						"projectId": that.projectId,  
-						"evaluate": that.evaluate,
-						"score":that.score
+						projectId: that.projectId,  
+						evaluate: that.evaluate,
+						score:that.score
 					}
 					that.$Request.postT('/api/sysProject/evaluate',data).then(res => {
 						if (res.code==200) {
@@ -107,7 +107,7 @@
 		border: 1rpx solid rgba(229, 229, 229, 1);
 		font-size: 28rpx;
 		line-height: 90rpx;
-		color: rgba(179, 179, 179, 1);
+		/* color: rgba(179, 179, 179, 1); */
 	}
 	.proIMi{
 		height: 315rpx;

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

@@ -0,0 +1,79 @@
+## 2.0.1(2024-08-22)
+- 修复 uni-app-x v-model 没有更新传入值的 bug
+## 2.0.0(2023-12-11)
+- 新增 支持 uni-app-x
+## 1.1.2(2023-04-11)
+- 修复 更改 modelValue 报错的 bug
+- 修复 v-for 未使用 key 值控制台 warning
+## 1.1.1(2023-02-21)
+- 修复代码合并时引发 value 属性为空时不渲染数据的问题
+## 1.1.0(2023-02-15)
+- 修复 localdata 不支持动态更新的bug
+## 1.0.9(2023-02-15)
+- 修复 localdata 不支持动态更新的bug
+## 1.0.8(2022-09-16)
+- 可以使用 uni-scss 控制主题色
+## 1.0.7(2022-07-06)
+- 优化 pc端图标位置不正确的问题
+## 1.0.6(2022-07-05)
+- 优化 显示样式
+## 1.0.5(2022-07-04)
+- 修复 uni-data-picker 在 uni-forms-item 中宽度不正确的bug
+## 1.0.4(2022-04-19)
+- 修复 字节小程序 本地数据无法选择下一级的Bug
+## 1.0.3(2022-02-25)
+- 修复 nvue 不支持的 v-show 的 bug
+## 1.0.2(2022-02-25)
+- 修复 条件编译 nvue 不支持的 css 样式
+## 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

+ 381 - 0
uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.uvue

@@ -0,0 +1,381 @@
+<template>
+  <view class="uni-data-tree">
+    <view class="uni-data-tree-input" @click="handleInput">
+      <slot :data="selectedPaths" :error="error">
+        <view class="input-value" :class="{'input-value-border': border}">
+          <text v-if="error!=null" class="error-text">{{error!.errMsg}}</text>
+          <scroll-view v-if="selectedPaths.length" class="selected-path" scroll-x="true">
+            <view class="selected-list">
+              <template v-for="(item, index) in selectedPaths">
+                <text class="text-color">{{item[mappingTextName]}}</text>
+                <text v-if="index<selectedPaths.length-1" class="input-split-line">{{split}}</text>
+              </template>
+            </view>
+          </scroll-view>
+          <text v-else-if="error==null&&!loading" class="placeholder">{{placeholder}}</text>
+          <view v-if="!readonly" class="arrow-area">
+            <view class="input-arrow"></view>
+          </view>
+        </view>
+      </slot>
+      <view v-if="loading && !isOpened" class="selected-loading">
+        <slot name="picker-loading" :loading="loading"></slot>
+      </view>
+    </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="dialog-title-view">
+          <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>
+      <view ref="pickerView" class="uni-data-pickerview">
+        <view v-if="error!=null" class="error">
+          <text class="error-text">{{error!.errMsg}}</text>
+        </view>
+        <scroll-view v-if="!isCloudDataList" :scroll-x="true">
+          <view class="selected-node-list">
+            <template v-for="(item, index) in selectedNodes">
+              <text class="selected-node-item" :class="{'selected-node-item-active':index==selectedIndex}"
+                @click="onTabSelect(index)">
+                {{item[mappingTextName]}}
+              </text>
+            </template>
+          </view>
+        </scroll-view>
+        <list-view class="list-view" :scroll-y="true">
+          <list-item class="list-item" v-for="(item, _) in currentDataList" @click="onNodeClick(item)">
+            <text class="item-text" :class="{'item-text-disabled': item['disable']}">{{item[mappingTextName]}}</text>
+            <text class="check" v-if="item[mappingValueName] == selectedNodes[selectedIndex][mappingValueName]"></text>
+          </list-item>
+        </list-view>
+        <view class="loading-cover" v-if="loading">
+          <slot name="pickerview-loading" :loading="loading"></slot>
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+
+<script>
+  import { dataPicker } from "../uni-data-pickerview/uni-data-picker.uts"
+
+  /**
+   * 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', 'change', 'input', 'update:modelValue', 'inputclick'],
+    mixins: [dataPicker],
+    props: {
+      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
+      }
+    },
+    computed: {
+      isShowClearIcon() : boolean {
+        if (this.readonly) {
+          return false
+        }
+
+        if (this.clearIcon && this.selectedPaths.length > 0) {
+          return true
+        }
+
+        return false
+      }
+    },
+    created() {
+      this.load()
+    },
+    methods: {
+      clear() {
+      },
+      load() {
+        if (this.isLocalData) {
+          this.loadLocalData()
+        } else if (this.isCloudDataList || this.isCloudDataTree) {
+          this.loadCloudDataPath()
+        }
+      },
+      show() {
+        this.isOpened = true
+        this.$emit('popupopened')
+        if (!this.hasCloudTreeData) {
+          this.loadData()
+        }
+      },
+      hide() {
+        this.isOpened = false
+        this.$emit('popupclosed')
+      },
+      handleInput() {
+        if (this.readonly) {
+          this.$emit('inputclick')
+        } else {
+          this.show()
+        }
+      },
+      handleClose() {
+        this.hide()
+      },
+      onFinish() {
+        this.selectedPaths = this.getChangeNodes()
+        this.$emit('update:modelValue', this.selectedPaths)
+        this.$emit('change', this.selectedPaths)
+        this.hide()
+      }
+    }
+  }
+</script>
+
+<style>
+  @import url("../uni-data-pickerview/uni-data-pickerview.css");
+
+  .uni-data-tree {
+    position: relative;
+  }
+
+  .uni-data-tree-input {
+    position: relative;
+  }
+
+  .selected-loading {
+    display: flex;
+    justify-content: center;
+    position: absolute;
+    left: 0;
+    top: 0;
+    right: 0;
+    bottom: 0;
+  }
+
+  .error-text {
+    flex: 1;
+    font-size: 12px;
+    color: #DD524D;
+  }
+
+  .input-value {
+    flex-direction: row;
+    align-items: center;
+    flex-wrap: nowrap;
+    padding: 5px 5px;
+    padding-right: 5px;
+    overflow: hidden;
+    min-height: 28px;
+  }
+
+  .input-value-border {
+    border: 1px solid #e5e5e5;
+    border-radius: 5px;
+  }
+
+  .selected-path {
+    flex: 1;
+    flex-direction: row;
+    overflow: hidden;
+  }
+
+  .load-more {
+    width: 40px;
+  }
+
+  .selected-list {
+    flex-direction: row;
+    flex-wrap: nowrap;
+  }
+
+  .selected-item {
+    flex-direction: row;
+    flex-wrap: nowrap;
+  }
+
+  .text-color {
+    font-size: 14px;
+    color: #333;
+  }
+
+  .placeholder {
+    color: grey;
+    font-size: 14px;
+  }
+
+  .input-split-line {
+    opacity: .5;
+    margin-left: 1px;
+    margin-right: 1px;
+  }
+
+  .arrow-area {
+    position: relative;
+    padding: 0 12px;
+    margin-left: auto;
+    justify-content: center;
+    transform: rotate(-45deg);
+    transform-origin: center;
+  }
+
+  .input-arrow {
+    width: 8px;
+    height: 8px;
+    border-left: 2px solid #999;
+    border-bottom: 2px solid #999;
+  }
+
+  .uni-data-tree-cover {
+    position: fixed;
+    left: 0;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    background-color: rgba(0, 0, 0, .4);
+    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;
+    flex-direction: column;
+    z-index: 102;
+    overflow: hidden;
+  }
+
+  .dialog-caption {
+    position: relative;
+    flex-direction: row;
+  }
+
+  .dialog-title-view {
+    flex: 1;
+  }
+
+  .dialog-title {
+    align-self: center;
+    padding: 0 10px;
+    line-height: 44px;
+  }
+
+  .dialog-close {
+    position: absolute;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    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);
+  }
+
+  .uni-data-pickerview {
+    flex: 1;
+  }
+
+  .icon-clear {
+    display: flex;
+    align-items: center;
+  }
+
+  /* #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;
+    }
+  }
+  /* #endif */
+</style>

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

@@ -0,0 +1,554 @@
+<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-if="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" :showSearch="showSearch" :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
+			},
+			showSearch: {
+				type: Boolean,
+				default: false
+			},
+		},
+		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 >
+	.uni-data-tree {
+		/* position: relative;
+		font-size: 14px;
+		min-width:150px;
+		max-width:220px; */
+		margin: 25rpx 0 0 21rpx;
+		width: 709rpx;
+		height: 90rpx;
+		border-radius: 13rpx;
+		background: rgba(245, 248, 252, 1);
+		border: 1rpx solid rgba(229, 229, 229, 1);
+		font-size: 28rpx;
+		line-height: 90rpx;
+	}
+
+	.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: 0px 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:扩展至上下左右方向定位 */
+	/* #ifndef APP-NVUE */
+	.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;
+	}
+	/* #endif */
+	</style>
+

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

@@ -0,0 +1,564 @@
+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)
+    }
+  }
+}
+

+ 692 - 0
uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-picker.uts

@@ -0,0 +1,692 @@
+export type PaginationType = {
+  current : number,
+  size : number,
+  count : number
+}
+
+export type LoadMoreType = {
+  contentdown : string,
+  contentrefresh : string,
+  contentnomore : string
+}
+
+export type SelectedItemType = {
+  name : string,
+  value : string,
+}
+
+export type GetCommandOptions = {
+  collection ?: UTSJSONObject,
+  field ?: string,
+  orderby ?: string,
+  where ?: any,
+  pageData ?: string,
+  pageCurrent ?: number,
+  pageSize ?: number,
+  getCount ?: boolean,
+  getTree ?: any,
+  getTreePath ?: UTSJSONObject,
+  startwith ?: string,
+  limitlevel ?: number,
+  groupby ?: string,
+  groupField ?: string,
+  distinct ?: boolean,
+  pageIndistinct ?: boolean,
+  foreignKey ?: string,
+  loadtime ?: string,
+  manual ?: boolean
+}
+
+const DefaultSelectedNode = {
+  text: '请选择',
+  value: ''
+}
+
+export const dataPicker = defineMixin({
+  props: {
+    localdata: {
+      type: Array as PropType<Array<UTSJSONObject>>,
+      default: [] as Array<UTSJSONObject>
+    },
+    collection: {
+      type: Object,
+      default: ''
+    },
+    field: {
+      type: String,
+      default: ''
+    },
+    orderby: {
+      type: String,
+      default: ''
+    },
+    where: {
+      type: Object,
+      default: ''
+    },
+    pageData: {
+      type: String,
+      default: 'add'
+    },
+    pageCurrent: {
+      type: Number,
+      default: 1
+    },
+    pageSize: {
+      type: Number,
+      default: 20
+    },
+    getcount: {
+      type: Boolean,
+      default: false
+    },
+    gettree: {
+      type: Object,
+      default: ''
+    },
+    gettreepath: {
+      type: Object,
+      default: ''
+    },
+    startwith: {
+      type: String,
+      default: ''
+    },
+    limitlevel: {
+      type: Number,
+      default: 10
+    },
+    groupby: {
+      type: String,
+      default: ''
+    },
+    groupField: {
+      type: String,
+      default: ''
+    },
+    distinct: {
+      type: Boolean,
+      default: false
+    },
+    pageIndistinct: {
+      type: Boolean,
+      default: false
+    },
+    foreignKey: {
+      type: String,
+      default: ''
+    },
+    loadtime: {
+      type: String,
+      default: 'auto'
+    },
+    manual: {
+      type: Boolean,
+      default: false
+    },
+    preload: {
+      type: Boolean,
+      default: false
+    },
+    stepSearh: {
+      type: Boolean,
+      default: true
+    },
+    selfField: {
+      type: String,
+      default: ''
+    },
+    parentField: {
+      type: String,
+      default: ''
+    },
+    multiple: {
+      type: Boolean,
+      default: false
+    },
+    value: {
+      type: Object,
+      default: ''
+    },
+    modelValue: {
+      type: Object,
+      default: ''
+    },
+    defaultProps: {
+      type: Object as PropType<UTSJSONObject>,
+    }
+  },
+  data() {
+    return {
+      loading: false,
+      error: null as UniCloudError | null,
+      treeData: [] as Array<UTSJSONObject>,
+      selectedIndex: 0,
+      selectedNodes: [] as Array<UTSJSONObject>,
+      selectedPages: [] as Array<UTSJSONObject>[],
+      selectedValue: '',
+      selectedPaths: [] as Array<UTSJSONObject>,
+      pagination: {
+        current: 1,
+        size: 20,
+        count: 0
+      } as PaginationType
+    }
+  },
+  computed: {
+    mappingTextName() : string {
+      // TODO
+      return (this.defaultProps != null) ? this.defaultProps!.getString('text', 'text') : 'text'
+    },
+    mappingValueName() : string {
+      // TODO
+      return (this.defaultProps != null) ? this.defaultProps!.getString('value', 'value') : 'value'
+    },
+    currentDataList() : Array<UTSJSONObject> {
+      if (this.selectedIndex > this.selectedPages.length - 1) {
+        return [] as Array<UTSJSONObject>
+      }
+      return this.selectedPages[this.selectedIndex]
+    },
+    isLocalData() : boolean {
+      return this.localdata.length > 0
+    },
+    isCloudData() : boolean {
+      return this._checkIsNotNull(this.collection)
+    },
+    isCloudDataList() : boolean {
+      return (this.isCloudData && (this.parentField.length == 0 && this.selfField.length == 0))
+    },
+    isCloudDataTree() : boolean {
+      return (this.isCloudData && this.parentField.length > 0 && this.selfField.length > 0)
+    },
+    dataValue() : any {
+      return this.hasModelValue ? this.modelValue : this.value
+    },
+    hasCloudTreeData() : boolean {
+      return this.treeData.length > 0
+    },
+    hasModelValue() : boolean {
+      if (typeof this.modelValue == 'string') {
+        const valueString = this.modelValue as string
+        return (valueString.length > 0)
+      } else if (Array.isArray(this.modelValue)) {
+        const valueArray = this.modelValue as Array<string>
+        return (valueArray.length > 0)
+      }
+      return false
+    },
+    hasCloudDataValue() : boolean {
+      if (typeof this.dataValue == 'string') {
+        const valueString = this.dataValue as string
+        return (valueString.length > 0)
+      }
+      return false
+    }
+  },
+  created() {
+    this.pagination.current = this.pageCurrent
+    this.pagination.size = this.pageSize
+
+    this.$watch(
+      () : any => [
+        this.pageCurrent,
+        this.pageSize,
+        this.localdata,
+        this.value,
+        this.collection,
+        this.field,
+        this.getcount,
+        this.orderby,
+        this.where,
+        this.groupby,
+        this.groupField,
+        this.distinct
+      ],
+      (newValue : Array<any>, oldValue : Array<any>) => {
+        this.pagination.size = this.pageSize
+        if (newValue[0] !== oldValue[0]) {
+          this.pagination.current = this.pageCurrent
+        }
+
+        this.onPropsChange()
+      }
+    )
+  },
+  methods: {
+    onPropsChange() {
+      this.selectedIndex = 0
+      this.selectedNodes.length = 0
+      this.selectedPages.length = 0
+      this.selectedPaths.length = 0
+
+      // 加载数据
+      this.$nextTick(() => {
+        this.loadData()
+      })
+    },
+
+    onTabSelect(index : number) {
+      this.selectedIndex = index
+    },
+
+    onNodeClick(nodeData : UTSJSONObject) {
+      if (nodeData.getBoolean('disable', false)) {
+        return
+      }
+
+      const isLeaf = this._checkIsLeafNode(nodeData)
+
+      this._trimSelectedNodes(nodeData)
+
+      this.$emit('nodeclick', nodeData)
+
+      if (this.isLocalData) {
+        if (isLeaf || !this._checkHasChildren(nodeData)) {
+          this.onFinish()
+        }
+      } else if (this.isCloudDataList) {
+        this.onFinish()
+      } else if (this.isCloudDataTree) {
+        if (isLeaf) {
+          this.onFinish()
+        } else if (!this._checkHasChildren(nodeData)) {
+          // 尝试请求一次,如果没有返回数据标记为叶子节点
+          this.loadCloudDataNode(nodeData)
+        }
+      }
+    },
+
+    getChangeNodes(): Array<UTSJSONObject> {
+      const nodes: Array<UTSJSONObject> = []
+      this.selectedNodes.forEach((node : UTSJSONObject) => {
+        const newNode: UTSJSONObject = {}
+        newNode[this.mappingTextName] = node.getString(this.mappingTextName)
+        newNode[this.mappingValueName] = node.getString(this.mappingValueName)
+        nodes.push(newNode)
+      })
+      return nodes
+    },
+
+    onFinish() { },
+
+    // 加载数据(自动判定环境)
+    loadData() {
+      if (this.isLocalData) {
+        this.loadLocalData()
+      } else if (this.isCloudDataList) {
+        this.loadCloudDataList()
+      } else if (this.isCloudDataTree) {
+        this.loadCloudDataTree()
+      }
+    },
+
+    // 加载本地数据
+    loadLocalData() {
+      this.treeData = this.localdata
+      if (Array.isArray(this.dataValue)) {
+        const value = this.dataValue as Array<UTSJSONObject>
+        this.selectedPaths = value.slice(0)
+        this._pushSelectedTreeNodes(value, this.localdata)
+      } else {
+        this._pushSelectedNodes(this.localdata)
+      }
+    },
+
+    // 加载 Cloud 数据 (单列)
+    loadCloudDataList() {
+      this._loadCloudData(null, (data : Array<UTSJSONObject>) => {
+        this.treeData = data
+        this._pushSelectedNodes(data)
+      })
+    },
+
+    // 加载 Cloud 数据 (树形)
+    loadCloudDataTree() {
+      let commandOptions = {
+        field: this._cloudDataPostField(),
+        where: this._cloudDataTreeWhere(),
+        getTree: true
+      } as GetCommandOptions
+      if (this._checkIsNotNull(this.gettree)) {
+        commandOptions.startwith = `${this.selfField}=='${this.dataValue as string}'`
+      }
+      this._loadCloudData(commandOptions, (data : Array<UTSJSONObject>) => {
+        this.treeData = data
+        if (this.selectedPaths.length > 0) {
+          this._pushSelectedTreeNodes(this.selectedPaths, data)
+        } else {
+          this._pushSelectedNodes(data)
+        }
+      })
+    },
+
+    // 加载 Cloud 数据 (节点)
+    loadCloudDataNode(nodeData : UTSJSONObject) {
+      const commandOptions = {
+        field: this._cloudDataPostField(),
+        where: this._cloudDataNodeWhere()
+      } as GetCommandOptions
+      this._loadCloudData(commandOptions, (data : Array<UTSJSONObject>) => {
+        nodeData['children'] = data
+        if (data.length == 0) {
+          nodeData['isleaf'] = true
+          this.onFinish()
+        } else {
+          this._pushSelectedNodes(data)
+        }
+      })
+    },
+
+    // 回显 Cloud Tree Path
+    loadCloudDataPath() {
+      if (!this.hasCloudDataValue) {
+        return
+      }
+
+      const command : GetCommandOptions = {}
+
+      // 单列
+      if (this.isCloudDataList) {
+        // 根据 field's as value标识匹配 where 条件
+        let where : Array<string> = [];
+        let whereField = this._getForeignKeyByField();
+        if (whereField.length > 0) {
+          where.push(`${whereField} == '${this.dataValue as string}'`)
+        }
+
+        let whereString = where.join(' || ')
+        if (this._checkIsNotNull(this.where)) {
+          whereString = `(${this.where}) && (${whereString})`
+        }
+
+        command.field = this._cloudDataPostField()
+        command.where = whereString
+      }
+
+      // 树形
+      if (this.isCloudDataTree) {
+        command.field = this._cloudDataPostField()
+        command.getTreePath = {
+          startWith: `${this.selfField}=='${this.dataValue as string}'`
+        }
+      }
+
+      this._loadCloudData(command, (data : Array<UTSJSONObject>) => {
+        this._extractTreePath(data, this.selectedPaths)
+      })
+    },
+
+    _loadCloudData(options ?: GetCommandOptions, callback ?: ((data : Array<UTSJSONObject>) => void)) {
+      if (this.loading) {
+        return
+      }
+      this.loading = true
+
+      this.error = null
+
+      this._getCommand(options).then((response : UniCloudDBGetResult) => {
+        callback?.(response.data)
+      }).catch((err : any | null) => {
+        this.error = err as UniCloudError
+      }).finally(() => {
+        this.loading = false
+      })
+    },
+
+    _cloudDataPostField() : string {
+      let fields = [this.field];
+      if (this.parentField.length > 0) {
+        fields.push(`${this.parentField} as parent_value`)
+      }
+      return fields.join(',')
+    },
+
+    _cloudDataTreeWhere() : string {
+      let result : Array<string> = []
+      let selectedNodes = this.selectedNodes.length > 0 ? this.selectedNodes : this.selectedPaths
+      let parentField = this.parentField
+      if (parentField.length > 0) {
+        result.push(`${parentField} == null || ${parentField} == ""`)
+      }
+      if (selectedNodes.length > 0) {
+        for (var i = 0; i < selectedNodes.length - 1; i++) {
+          const parentFieldValue = selectedNodes[i].getString('value', '')
+          result.push(`${parentField} == '${parentFieldValue}'`)
+        }
+      }
+
+      let where : Array<string> = []
+      if (this._checkIsNotNull(this.where)) {
+        where.push(`(${this.where as string})`)
+      }
+
+      if (result.length > 0) {
+        where.push(`(${result.join(' || ')})`)
+      }
+
+      return where.join(' && ')
+    },
+
+    _cloudDataNodeWhere() : string {
+      const where : Array<string> = []
+      if (this.selectedNodes.length > 0) {
+        const value = this.selectedNodes[this.selectedNodes.length - 1].getString('value', '')
+        where.push(`${this.parentField} == '${value}'`)
+      }
+
+      let whereString = where.join(' || ')
+      if (this._checkIsNotNull(this.where)) {
+        return `(${this.where as string}) && (${whereString})`
+      }
+
+      return whereString
+    },
+
+    _getWhereByForeignKey() : string {
+      let result : Array<string> = []
+      let whereField = this._getForeignKeyByField();
+      if (whereField.length > 0) {
+        result.push(`${whereField} == '${this.dataValue as string}'`)
+      }
+
+      if (this._checkIsNotNull(this.where)) {
+        return `(${this.where}) && (${result.join(' || ')})`
+      }
+
+      return result.join(' || ')
+    },
+
+    _getForeignKeyByField() : string {
+      const fields = this.field.split(',')
+      let whereField = ''
+      for (let i = 0; i < fields.length; i++) {
+        const items = fields[i].split('as')
+        if (items.length < 2) {
+          continue
+        }
+        if (items[1].trim() === 'value') {
+          whereField = items[0].trim()
+          break
+        }
+      }
+      return whereField
+    },
+
+    _getCommand(options ?: GetCommandOptions) : Promise<UniCloudDBGetResult> {
+      let db = uniCloud.databaseForJQL()
+
+      let collection = Array.isArray(this.collection) ? db.collection(...(this.collection as Array<any>)) : db.collection(this.collection)
+
+      let filter : UniCloudDBFilter | null = null
+      if (this.foreignKey.length > 0) {
+        filter = collection.foreignKey(this.foreignKey)
+      }
+
+      const where : any = options?.where ?? this.where
+      if (typeof where == 'string') {
+        const whereString = where as string
+        if (whereString.length > 0) {
+          filter = (filter != null) ? filter.where(where) : collection.where(where)
+        }
+      } else {
+        filter = (filter != null) ? filter.where(where) : collection.where(where)
+      }
+
+      let query : UniCloudDBQuery | null = null
+      if (this.field.length > 0) {
+        query = (filter != null) ? filter.field(this.field) : collection.field(this.field)
+      }
+      if (this.groupby.length > 0) {
+        if (query != null) {
+          query = query.groupBy(this.groupby)
+        } else if (filter != null) {
+          query = filter.groupBy(this.groupby)
+        }
+      }
+      if (this.groupField.length > 0) {
+        if (query != null) {
+          query = query.groupField(this.groupField)
+        } else if (filter != null) {
+          query = filter.groupField(this.groupField)
+        }
+      }
+      if (this.distinct == true) {
+        if (query != null) {
+          query = query.distinct(this.field)
+        } else if (filter != null) {
+          query = filter.distinct(this.field)
+        }
+      }
+      if (this.orderby.length > 0) {
+        if (query != null) {
+          query = query.orderBy(this.orderby)
+        } else if (filter != null) {
+          query = filter.orderBy(this.orderby)
+        }
+      }
+
+      const size = this.pagination.size
+      const current = this.pagination.current
+      if (query != null) {
+        query = query.skip(size * (current - 1)).limit(size)
+      } else if (filter != null) {
+        query = filter.skip(size * (current - 1)).limit(size)
+      } else {
+        query = collection.skip(size * (current - 1)).limit(size)
+      }
+
+      const getOptions = {}
+      const treeOptions = {
+        limitLevel: this.limitlevel,
+        startWith: this.startwith
+      }
+      if (this.getcount == true) {
+        getOptions['getCount'] = this.getcount
+      }
+
+      const getTree : any = options?.getTree ?? this.gettree
+      if (typeof getTree == 'string') {
+        const getTreeString = getTree as string
+        if (getTreeString.length > 0) {
+          getOptions['getTree'] = treeOptions
+        }
+      } else if (typeof getTree == 'object') {
+        getOptions['getTree'] = treeOptions
+      } else {
+        getOptions['getTree'] = getTree
+      }
+
+      const getTreePath = options?.getTreePath ?? this.gettreepath
+      if (typeof getTreePath == 'string') {
+        const getTreePathString = getTreePath as string
+        if (getTreePathString.length > 0) {
+          getOptions['getTreePath'] = getTreePath
+        }
+      } else {
+        getOptions['getTreePath'] = getTreePath
+      }
+
+      return query.get(getOptions)
+    },
+
+    _checkIsNotNull(value : any) : boolean {
+      if (typeof value == 'string') {
+        const valueString = value as string
+        return (valueString.length > 0)
+      } else if (value instanceof UTSJSONObject) {
+        return true
+      }
+      return false
+    },
+
+    _checkIsLeafNode(nodeData : UTSJSONObject) : boolean {
+      if (this.selectedIndex >= this.limitlevel) {
+        return true
+      }
+
+      if (nodeData.getBoolean('isleaf', false)) {
+        return true
+      }
+
+      return false
+    },
+
+    _checkHasChildren(nodeData : UTSJSONObject) : boolean {
+      const children = nodeData.getArray('children') ?? ([] as Array<any>)
+      return children.length > 0
+    },
+
+    _pushSelectedNodes(nodes : Array<UTSJSONObject>) {
+      this.selectedNodes.push(DefaultSelectedNode)
+      this.selectedPages.push(nodes)
+      this.selectedIndex = this.selectedPages.length - 1
+    },
+
+    _trimSelectedNodes(nodeData : UTSJSONObject) {
+      this.selectedNodes.splice(this.selectedIndex)
+      this.selectedNodes.push(nodeData)
+
+      if (this.selectedPages.length > 0) {
+        this.selectedPages.splice(this.selectedIndex + 1)
+      }
+
+      const children = nodeData.getArray<UTSJSONObject>('children') ?? ([] as Array<UTSJSONObject>)
+      if (children.length > 0) {
+        this.selectedNodes.push(DefaultSelectedNode)
+        this.selectedPages.push(children)
+      }
+
+      this.selectedIndex = this.selectedPages.length - 1
+    },
+
+    _pushSelectedTreeNodes(paths : Array<UTSJSONObject>, nodes : Array<UTSJSONObject>) {
+      let children : Array<UTSJSONObject> = nodes
+      paths.forEach((node : UTSJSONObject) => {
+        const findNode = children.find((item : UTSJSONObject) : boolean => {
+          return (item.getString(this.mappingValueName) == node.getString(this.mappingValueName))
+        })
+        if (findNode != null) {
+          this.selectedPages.push(children)
+          this.selectedNodes.push(node)
+          children = findNode.getArray<UTSJSONObject>('children') ?? ([] as Array<UTSJSONObject>)
+        }
+      })
+      this.selectedIndex = this.selectedPages.length - 1
+    },
+
+    _extractTreePath(nodes : Array<UTSJSONObject>, result : Array<UTSJSONObject>) {
+      if (nodes.length == 0) {
+        return
+      }
+
+      const node = nodes[0]
+      result.push(node)
+
+      const children = node.getArray<UTSJSONObject>('children')
+      if (Array.isArray(children) && children!.length > 0) {
+        this._extractTreePath(children, result)
+      }
+    }
+  }
+})

+ 76 - 0
uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.css

@@ -0,0 +1,76 @@
+.uni-data-pickerview {
+  position: relative;
+  flex-direction: column;
+  overflow: hidden;
+}
+
+.loading-cover {
+  position: absolute;
+  left: 0;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  align-items: center;
+  justify-content: center;
+  background-color: rgba(150, 150, 150, .1);
+}
+
+.error {
+  background-color: #fff;
+  padding: 15px;
+}
+
+.error-text {
+  color: #DD524D;
+}
+
+.selected-node-list {
+  flex-direction: row;
+  flex-wrap: nowrap;
+}
+
+.selected-node-item {
+  margin-left: 10px;
+  margin-right: 10px;
+  padding: 8px 10px 8px 10px;
+  border-bottom: 2px solid transparent;
+}
+
+.selected-node-item-active {
+  color: #007aff;
+  border-bottom-color: #007aff;
+}
+
+.list-view {
+  flex: 1;
+}
+
+.list-item {
+  flex-direction: row;
+  justify-content: space-between;
+  padding: 12px 15px;
+  border-bottom: 1px solid #f0f0f0;
+}
+
+.item-text {
+  color: #333333;
+}
+
+.item-text-disabled {
+  opacity: .5;
+}
+
+.item-text-overflow {
+  overflow: hidden;
+}
+
+.check {
+  margin-right: 5px;
+  border: 2px solid #007aff;
+  border-left: 0;
+  border-top: 0;
+  height: 12px;
+  width: 6px;
+  transform-origin: center;
+  transform: rotate(45deg);
+}

+ 69 - 0
uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.uvue

@@ -0,0 +1,69 @@
+<template>
+  <view class="uni-data-pickerview">
+    <view v-if="error!=null" class="error">
+      <text class="error-text">{{error!.errMsg}}</text>
+    </view>
+    <scroll-view v-if="!isCloudDataList" :scroll-x="true">
+      <view class="selected-node-list">
+        <template v-for="(item, index) in selectedNodes">
+          <text class="selected-node-item" :class="{'selected-node-item-active':index==selectedIndex}"
+            @click="onTabSelect(index)">
+            {{item[mappingTextName]}}
+          </text>
+        </template>
+      </view>
+    </scroll-view>
+    <list-view class="list-view" :scroll-y="true">
+      <list-item class="list-item" v-for="(item, _) in currentDataList" @click="onNodeClick(item)">
+        <text class="item-text" :class="{'item-text-disabled': item['disable']}">{{item[mappingTextName]}}</text>
+        <text class="check" v-if="item[mappingValueName] == selectedNodes[selectedIndex][mappingValueName]"></text>
+      </list-item>
+    </list-view>
+    <view class="loading-cover" v-if="loading">
+      <slot name="pickerview-loading" :loading="loading"></slot>
+    </view>
+  </view>
+</template>
+
+<script>
+  import { dataPicker } from "./uni-data-picker.uts"
+
+  /**
+   * 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', 'update:modelValue'],
+    mixins: [dataPicker],
+    props: {
+      ellipsis: {
+        type: Boolean,
+        default: true
+      }
+    },
+    created() {
+      this.loadData()
+    },
+    methods: {
+      onFinish() {
+        this.$emit('change', this.getChangeNodes())
+      }
+    }
+  }
+</script>
+
+<style>
+  @import url("uni-data-pickerview.css");
+</style>

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

@@ -0,0 +1,376 @@
+<template>
+	<view class="uni-data-pickerview">
+		<uni-combox v-if="showSearch" :candidates="candidates" placeholder="输入搜索内容"  @input="handleInput"></uni-combox>
+		<!-- <input placeholder="请输入搜索内容" style="border:1px solid #ddd;width:80%;margin:0 auto;border-radius:5px;padding:5px;" @input="handleInput"/> -->
+		<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"
+						>
+						<checkbox  @click ="handleClick(item)"  v-if="showSearch && i==0" :checked=" selected.length > j && item[map.value] == selected[j].value"/>
+						<text @click="handleNodeClick(item, i, j)" class="item-text item-text-overflow">{{item[map.text]}}</text>
+						<view class="check" v-if="i == 1 && 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
+			},
+			showSearch: {
+				type: Boolean,
+				default: false
+			},
+		},
+		data() {
+			return {
+				candidates:[],
+				nodeList:[],
+			}
+		},
+		created() {
+			if (this.managedMode) {
+				return
+			}
+			this.$nextTick(() => {
+				this.load()
+			})
+		},
+		methods: {
+			//搜索框选择员工
+			handleInput(e){
+				if(this.candidates.indexOf(e) != -1){
+					let index = this.candidates.indexOf(e);
+					let node = this.nodeList[index];
+					console.log(this.candidates.indexOf(e));
+					console.log(node);
+					this._dispatchEvent()
+					this.$emit('nodeclick', node)
+				}
+				//console.log(this.loadData());
+			},
+			//点击选择组别
+			handleClick(item){
+				let text = item.text;
+				for(let i in this.nodeList){
+					if(this.nodeList[i].parent_value == text){
+						this.$emit('nodeclick', this.nodeList[i])
+					}
+				}
+				this._dispatchEvent()
+			},
+			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
+					})
+					console.log(this.selected);
+				} else if (i === this.selected.length - 1) {
+					this.selected.splice(i, 1, {
+						text,
+						value
+					})
+					console.log(this.selected);
+				}
+
+				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) {
+				//新增筛选用户功能ld
+				let curTreeData=data.treeData;
+				this.candidates = [];
+				this.nodeList =[];
+				for(let i in curTreeData){
+					if(curTreeData[i].parent_value){
+						this.candidates.push(curTreeData[i].text);
+						this.nodeList.push(curTreeData[i])
+					}
+				}
+				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 >
+	.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>

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

@@ -0,0 +1,91 @@
+{
+  "id": "uni-data-picker",
+  "displayName": "uni-data-picker 数据驱动的picker选择器",
+  "version": "2.0.1",
+  "description": "单列、多列级联选择器,常用于省市区城市选择、公司部门选择、多级分类等场景",
+  "keywords": [
+    "uni-ui",
+    "uniui",
+    "picker",
+    "级联",
+    "省市区",
+    ""
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": ""
+  },
+  "directories": {
+    "example": "../../temps/example_temps"
+  },
+"dcloudext": {
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "无",
+      "permissions": "无"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+    "type": "component-vue"
+  },
+  "uni_modules": {
+    "dependencies": [
+      "uni-load-more",
+			"uni-icons",
+			"uni-scss"
+    ],
+    "encrypt": [],
+    "platforms": {
+      "cloud": {
+        "tcb": "y",
+        "aliyun": "y",
+        "alipay": "n"
+      },
+      "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",
+          "联盟": "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

+ 23 - 0
uni_modules/uni-tag/changelog.md

@@ -0,0 +1,23 @@
+## 2.1.1(2024-03-20)
+- 优化 app下边框过窄导致不显示的bug
+## 2.1.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-tag](https://uniapp.dcloud.io/component/uniui/uni-tag)
+## 2.0.0(2021-11-09)
+- 新增 提供组件设计资源,组件样式调整
+- 移除 插槽
+- 移除 type 属性的 royal 选项
+## 1.1.1(2021-08-11)
+- type 不是 default 时,size 为 small 字体大小显示不正确
+## 1.1.0(2021-07-30)
+- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834)
+## 1.0.7(2021-06-18)
+- 修复 uni-tag 在字节跳动小程序上 css 类名编译错误的 bug
+## 1.0.6(2021-06-04)
+- 修复 未定义 sass 变量 "$uni-color-royal" 的bug
+## 1.0.5(2021-05-10)
+- 修复 royal 类型无效的bug
+- 修复 uni-tag 宽度不自适应的bug
+- 新增 uni-tag 支持属性 custom-style 自定义样式
+## 1.0.4(2021-02-05)
+- 调整为uni_modules目录规范

+ 252 - 0
uni_modules/uni-tag/components/uni-tag/uni-tag.vue

@@ -0,0 +1,252 @@
+<template>
+	<text class="uni-tag" v-if="text" :class="classes" :style="customStyle" @click="onClick">{{text}}</text>
+</template>
+
+<script>
+	/**
+	 * Tag 标签
+	 * @description 用于展示1个或多个文字标签,可点击切换选中、不选中的状态
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=35
+	 * @property {String} text 标签内容
+	 * @property {String} size = [default|small|mini] 大小尺寸
+	 * 	@value default 正常
+	 * 	@value small 小尺寸
+	 * 	@value mini 迷你尺寸
+	 * @property {String} type = [default|primary|success|warning|error]  颜色类型
+	 * 	@value default 灰色
+	 * 	@value primary 蓝色
+	 * 	@value success 绿色
+	 * 	@value warning 黄色
+	 * 	@value error 红色
+	 * @property {Boolean} disabled = [true|false] 是否为禁用状态
+	 * @property {Boolean} inverted = [true|false] 是否无需背景颜色(空心标签)
+	 * @property {Boolean} circle = [true|false] 是否为圆角
+	 * @event {Function} click 点击 Tag 触发事件
+	 */
+
+	export default {
+		name: "UniTag",
+		emits: ['click'],
+		props: {
+			type: {
+				// 标签类型default、primary、success、warning、error、royal
+				type: String,
+				default: "default"
+			},
+			size: {
+				// 标签大小 normal, small
+				type: String,
+				default: "normal"
+			},
+			// 标签内容
+			text: {
+				type: String,
+				default: ""
+			},
+			disabled: {
+				// 是否为禁用状态
+				type: [Boolean, String],
+				default: false
+			},
+			inverted: {
+				// 是否为空心
+				type: [Boolean, String],
+				default: false
+			},
+			circle: {
+				// 是否为圆角样式
+				type: [Boolean, String],
+				default: false
+			},
+			mark: {
+				// 是否为标记样式
+				type: [Boolean, String],
+				default: false
+			},
+			customStyle: {
+				type: String,
+				default: ''
+			}
+		},
+		computed: {
+			classes() {
+				const {
+					type,
+					disabled,
+					inverted,
+					circle,
+					mark,
+					size,
+					isTrue
+				} = this
+				const classArr = [
+					'uni-tag--' + type,
+					'uni-tag--' + size,
+					isTrue(disabled) ? 'uni-tag--disabled' : '',
+					isTrue(inverted) ? 'uni-tag--' + type + '--inverted' : '',
+					isTrue(circle) ? 'uni-tag--circle' : '',
+					isTrue(mark) ? 'uni-tag--mark' : '',
+					// type === 'default' ? 'uni-tag--default' : 'uni-tag-text',
+					isTrue(inverted) ? 'uni-tag--inverted uni-tag-text--' + type : '',
+					size === 'small' ? 'uni-tag-text--small' : ''
+				]
+				// 返回类的字符串,兼容字节小程序
+				return classArr.join(' ')
+			}
+		},
+		methods: {
+			isTrue(value) {
+				return value === true || value === 'true'
+			},
+			onClick() {
+				if (this.isTrue(this.disabled)) return
+				this.$emit("click");
+			}
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	$uni-primary: #2979ff !default;
+	$uni-success: #18bc37 !default;
+	$uni-warning: #f3a73f !default;
+	$uni-error: #e43d33 !default;
+	$uni-info: #8f939c !default;
+
+
+	$tag-default-pd: 4px 7px;
+	$tag-small-pd: 2px 5px;
+	$tag-mini-pd: 1px 3px;
+
+	.uni-tag {
+		line-height: 14px;
+		font-size: 12px;
+		font-weight: 200;
+		padding: $tag-default-pd;
+		color: #fff;
+		border-radius: 3px;
+		background-color: $uni-info;
+		border-width: 1px;
+		border-style: solid;
+		border-color: $uni-info;
+		/* #ifdef H5 */
+		cursor: pointer;
+		/* #endif */
+
+		// size attr
+		&--default {
+			font-size: 12px;
+		}
+
+		&--default--inverted {
+			color: $uni-info;
+			border-color: $uni-info;
+		}
+
+		&--small {
+			padding: $tag-small-pd;
+			font-size: 12px;
+			border-radius: 2px;
+		}
+
+		&--mini {
+			padding: $tag-mini-pd;
+			font-size: 12px;
+			border-radius: 2px;
+		}
+
+		// type attr
+		&--primary {
+			background-color: $uni-primary;
+			border-color: $uni-primary;
+			color: #fff;
+		}
+
+		&--success {
+			color: #fff;
+			background-color: $uni-success;
+			border-color: $uni-success;
+		}
+
+		&--warning {
+			color: #fff;
+			background-color: $uni-warning;
+			border-color: $uni-warning;
+		}
+
+		&--error {
+			color: #fff;
+			background-color: $uni-error;
+			border-color: $uni-error;
+		}
+
+		&--primary--inverted {
+			color: $uni-primary;
+			border-color: $uni-primary;
+		}
+
+		&--success--inverted {
+			color: $uni-success;
+			border-color: $uni-success;
+		}
+
+		&--warning--inverted {
+			color: $uni-warning;
+			border-color: $uni-warning;
+		}
+
+		&--error--inverted {
+			color: $uni-error;
+			border-color: $uni-error;
+		}
+
+		&--inverted {
+			background-color: #fff;
+		}
+
+		// other attr
+		&--circle {
+			border-radius: 15px;
+		}
+
+		&--mark {
+			border-top-left-radius: 0;
+			border-bottom-left-radius: 0;
+			border-top-right-radius: 15px;
+			border-bottom-right-radius: 15px;
+		}
+
+		&--disabled {
+			opacity: 0.5;
+			/* #ifdef H5 */
+			cursor: not-allowed;
+			/* #endif */
+		}
+	}
+
+
+	.uni-tag-text {
+		color: #fff;
+		font-size: 14px;
+
+		&--primary {
+			color: $uni-primary;
+		}
+
+		&--success {
+			color: $uni-success;
+		}
+
+		&--warning {
+			color: $uni-warning;
+		}
+
+		&--error {
+			color: $uni-error;
+		}
+
+		&--small {
+			font-size: 12px;
+		}
+	}
+</style>

+ 84 - 0
uni_modules/uni-tag/package.json

@@ -0,0 +1,84 @@
+{
+  "id": "uni-tag",
+  "displayName": "uni-tag 标签",
+  "version": "2.1.1",
+  "description": "Tag 组件,用于展示1个或多个文字标签,可点击切换选中、不选中的状态。",
+  "keywords": [
+    "uni-ui",
+    "uniui",
+    "",
+    "tag",
+    "标签"
+],
+  "repository": "https://github.com/dcloudio/uni-ui",
+  "engines": {
+    "HBuilderX": ""
+  },
+  "directories": {
+    "example": "../../temps/example_temps"
+  },
+"dcloudext": {
+    "sale": {
+      "regular": {
+        "price": "0.00"
+      },
+      "sourcecode": {
+        "price": "0.00"
+      }
+    },
+    "contact": {
+      "qq": ""
+    },
+    "declaration": {
+      "ads": "无",
+      "data": "无",
+      "permissions": "无"
+    },
+    "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui",
+    "type": "component-vue"
+  },
+  "uni_modules": {
+    "dependencies": ["uni-scss"],
+    "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"
+        }
+      }
+    }
+  }
+}

+ 13 - 0
uni_modules/uni-tag/readme.md

@@ -0,0 +1,13 @@
+
+
+## Tag 标签
+> **组件名:uni-tag**
+> 代码块: `uTag`
+
+
+用于展示1个或多个文字标签,可点击切换选中、不选中的状态 。
+
+### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-tag)
+#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 
+
+

BIN
unpackage/dist/build/web.zip


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 1
unpackage/dist/build/web/index.html


BIN
unpackage/dist/build/web/static/img/404.png


BIN
unpackage/dist/build/web/static/img/quesheng.png


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 1
unpackage/dist/build/web/static/js/chunk-vendors.bd2ecca4.js


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/build/web/static/js/index.91f1b726.js


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 1
unpackage/dist/build/web/static/js/index.c2d1491d.js


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/build/web/static/js/pages-404-404.a1eb1360.js


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 1
unpackage/dist/build/web/static/js/pages-404-404.fda069c1.js


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/build/web/static/js/pages-404-quesheng.5e4ec825.js


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 1
unpackage/dist/build/web/static/js/pages-index-index.51fc21ae.js


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/build/web/static/js/pages-index-index.99a72c99.js


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/build/web/static/js/pages-index-index~pages-project-addProject~pages-project-addRenwu~pages-project-changeRenwu~pages-pr~6e77bd7c.331dbe54.js


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 1
unpackage/dist/build/web/static/js/pages-index-index~pages-project-addProject~pages-project-addRenwu~pages-project-projectChange.dc36a4fb.js


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 1
unpackage/dist/build/web/static/js/pages-index-index~pages-project-addRenwu.bda623e5.js


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/build/web/static/js/pages-index-index~pages-project-addRenwu~pages-project-changeRenwu.7e6d0a2d.js


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 1
unpackage/dist/build/web/static/js/pages-project-addProject.6f343f56.js


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/build/web/static/js/pages-project-addProject.f02bb866.js


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/build/web/static/js/pages-project-addProject~pages-project-addRenwu~pages-project-changeRenwu~pages-project-index~pages-~51e77e82.ce00d599.js


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/build/web/static/js/pages-project-addProject~pages-project-addRenwu~pages-project-changeRenwu~pages-project-projectChang~dce6e7d1.1f88f1e7.js


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 1
unpackage/dist/build/web/static/js/pages-project-addProject~pages-project-addRenwu~pages-project-projectChange.43a63999.js


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/build/web/static/js/pages-project-addProject~pages-project-projectChange.f28e1406.js


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 1
unpackage/dist/build/web/static/js/pages-project-addRenwu.2d635c86.js


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/build/web/static/js/pages-project-addRenwu.3949b179.js


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/build/web/static/js/pages-project-changeRenwu.da8a5335.js


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 1
unpackage/dist/build/web/static/js/pages-project-index.64cff839.js


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/build/web/static/js/pages-project-index.98ddc2b0.js


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/build/web/static/js/pages-project-projectChange.1eee929c.js


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 1
unpackage/dist/build/web/static/js/pages-project-projectChange.575cc14f.js


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/build/web/static/js/pages-project-projectX.4c73c17f.js


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/build/web/static/js/pages-project-renwuUpdateJin.c89897cf.js


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/build/web/static/js/pages-project-renwuX.68f1bbaf.js


Fichier diff supprimé car celui-ci est trop grand
+ 0 - 1
unpackage/dist/build/web/static/js/pages-project-renwuX.e9f8f85b.js


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/build/web/static/js/pages-project-sorce.82abbf17.js


BIN
unpackage/dist/build/web/static/project/select.png


+ 0 - 0
unpackage/dist/dev/.automator/mp-weixin/.automator.json


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/common/main.js.map


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/common/runtime.js.map


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/common/vendor.js.map


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/components/my-selectCheckbox.js.map


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/404/404.js.map


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/404/quesheng.js.map


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/index/index.js.map


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/project/addProject.js.map


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/project/addRenwu.js.map


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/project/changeRenwu.js.map


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/project/index.js.map


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/project/projectChange.js.map


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/project/projectX.js.map


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/project/renwuUpdateJin.js.map


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/project/renwuX.js.map


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/pages/project/sorce.js.map


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-data-picker/components/uni-data-picker/uni-data-picker.js.map


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-data-picker/components/uni-data-pickerview/uni-data-pickerview.js.map


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-data-select/components/uni-data-select/uni-data-select.js.map


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar-item.js.map


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-datetime-picker/components/uni-datetime-picker/calendar.js.map


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-datetime-picker/components/uni-datetime-picker/time-picker.js.map


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-datetime-picker/components/uni-datetime-picker/uni-datetime-picker.js.map


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-file-picker/components/uni-file-picker/uni-file-picker.js.map


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-file-picker/components/uni-file-picker/upload-file.js.map


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-file-picker/components/uni-file-picker/upload-image.js.map


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-icons/components/uni-icons/uni-icons.js.map


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-load-more/components/uni-load-more/uni-load-more.js.map


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-popup/components/uni-popup/uni-popup.js.map


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-table/components/uni-table/uni-table.js.map


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-table/components/uni-td/uni-td.js.map


Fichier diff supprimé car celui-ci est trop grand
+ 1 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-table/components/uni-th/uni-th.js.map


+ 0 - 0
unpackage/dist/dev/.sourcemap/mp-weixin/uni_modules/uni-table/components/uni-tr/table-checkbox.js.map


Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff