zouling 4 ヶ月 前
コミット
5359fcaddd
100 ファイル変更11718 行追加318 行削除
  1. 16 0
      property_ui/.hbuilderx/launch.json
  2. 95 0
      property_ui/components/box/list.vue
  3. 1 1
      property_ui/components/footer/footer.vue
  4. 1 1
      property_ui/components/nodata/nodata.vue
  5. 229 0
      property_ui/health/components/box/list.vue
  6. 337 0
      property_ui/health/pages/health/detail.vue
  7. 152 0
      property_ui/health/pages/health/index.vue
  8. BIN
      property_ui/health/static/health/adr.png
  9. BIN
      property_ui/health/static/health/car.png
  10. BIN
      property_ui/health/static/health/heada.png
  11. BIN
      property_ui/health/static/health/headb.png
  12. BIN
      property_ui/health/static/health/headc.png
  13. BIN
      property_ui/health/static/health/headd.png
  14. BIN
      property_ui/health/static/health/heade.png
  15. BIN
      property_ui/health/static/health/headf.png
  16. BIN
      property_ui/health/static/health/hicoa.png
  17. BIN
      property_ui/health/static/health/hicob.png
  18. BIN
      property_ui/health/static/health/icon.png
  19. BIN
      property_ui/health/static/health/search.png
  20. 705 0
      property_ui/manage/components/car/list.vue
  21. 225 0
      property_ui/manage/components/editor/editor.vue
  22. 39 0
      property_ui/manage/components/nodata/nodata.vue
  23. 24 0
      property_ui/manage/components/zb-table/all.js
  24. 180 0
      property_ui/manage/components/zb-table/components/table-checkbox.vue
  25. 78 0
      property_ui/manage/components/zb-table/components/table-h5-summary.vue
  26. 59 0
      property_ui/manage/components/zb-table/components/table-side-summary.vue
  27. 77 0
      property_ui/manage/components/zb-table/components/table-summary.vue
  28. 50 0
      property_ui/manage/components/zb-table/components/zb-load-more.vue
  29. 88 0
      property_ui/manage/components/zb-table/js/summary.js
  30. 51 0
      property_ui/manage/components/zb-table/js/util.js
  31. 1255 0
      property_ui/manage/components/zb-table/zb-table.vue
  32. 1308 0
      property_ui/manage/components/zb-table/zb-tables.vue
  33. 113 0
      property_ui/manage/pages/community/newsadd.vue
  34. 113 0
      property_ui/manage/pages/community/newsadddj.vue
  35. 113 0
      property_ui/manage/pages/community/newsaddsq.vue
  36. 109 0
      property_ui/manage/pages/community/newsaddvideo.vue
  37. 132 0
      property_ui/manage/pages/community/newsdj.vue
  38. 134 0
      property_ui/manage/pages/community/newssq.vue
  39. 144 0
      property_ui/manage/pages/community/newsyg.vue
  40. 188 0
      property_ui/manage/pages/community/readcount.vue
  41. 168 0
      property_ui/manage/pages/community/readlist.vue
  42. 286 0
      property_ui/manage/pages/community/sqmoney.vue
  43. 207 0
      property_ui/manage/pages/community/sqmoneyadd.vue
  44. BIN
      property_ui/manage/static/community/all.png
  45. BIN
      property_ui/manage/static/community/code.png
  46. BIN
      property_ui/manage/static/community/djtop.png
  47. BIN
      property_ui/manage/static/community/down.png
  48. BIN
      property_ui/manage/static/community/downa.png
  49. BIN
      property_ui/manage/static/community/eye.png
  50. BIN
      property_ui/manage/static/community/star.png
  51. BIN
      property_ui/manage/static/community/stara.png
  52. BIN
      property_ui/manage/static/community/up.png
  53. BIN
      property_ui/manage/static/community/upa.png
  54. BIN
      property_ui/manage/static/community/video.png
  55. 2 2
      property_ui/manifest.json
  56. 168 6
      property_ui/pages.json
  57. 415 0
      property_ui/pages/health/index.vue
  58. 20 5
      property_ui/pages/index.vue
  59. 380 0
      property_ui/pages/index/index.vue
  60. 2 2
      property_ui/pages/login.vue
  61. 384 296
      property_ui/pages/mine/index.vue
  62. 1 1
      property_ui/pages/mine/setting/index.vue
  63. 1 1
      property_ui/pages/tlogin.vue
  64. 1 1
      property_ui/permission.js
  65. 2 0
      property_ui/static/editor-icon.css
  66. BIN
      property_ui/static/images/banner/banner01.jpg
  67. BIN
      property_ui/static/images/banner/banner02.jpg
  68. BIN
      property_ui/static/images/banner/banner03.jpg
  69. BIN
      property_ui/static/images/eye.png
  70. BIN
      property_ui/static/images/health/hbg.png
  71. BIN
      property_ui/static/images/health/heabox.png
  72. BIN
      property_ui/static/images/health/more.png
  73. BIN
      property_ui/static/images/health/rimg.png
  74. BIN
      property_ui/static/images/mine/head.png
  75. BIN
      property_ui/static/images/mine/mbg.png
  76. BIN
      property_ui/static/images/mine/mtaba.png
  77. BIN
      property_ui/static/images/mine/mtabb.png
  78. BIN
      property_ui/static/images/mine/mtabc.png
  79. BIN
      property_ui/static/images/mine/mtabd.png
  80. BIN
      property_ui/static/images/mine/mtabe.png
  81. BIN
      property_ui/static/images/mine/mtabf.png
  82. BIN
      property_ui/static/images/mine/mtabg.png
  83. BIN
      property_ui/static/images/mine/mtabh.png
  84. BIN
      property_ui/static/images/mine/mtabi.png
  85. 0 0
      property_ui/static/images/mine/neye.png
  86. BIN
      property_ui/static/images/mine/wrimg.png
  87. BIN
      property_ui/static/images/mine/wy.png
  88. BIN
      property_ui/static/nodata.png
  89. 14 2
      property_ui/static/style.css
  90. 108 0
      property_ui/uni_modules/lsj-upload/changelog.md
  91. 442 0
      property_ui/uni_modules/lsj-upload/components/lsj-upload/LsjFile.js
  92. 329 0
      property_ui/uni_modules/lsj-upload/components/lsj-upload/lsj-upload.vue
  93. 5 0
      property_ui/uni_modules/lsj-upload/hybrid/html/js/vue.min.js
  94. 193 0
      property_ui/uni_modules/lsj-upload/hybrid/html/uploadFile.html
  95. 79 0
      property_ui/uni_modules/lsj-upload/package.json
  96. 353 0
      property_ui/uni_modules/lsj-upload/readme.md
  97. 320 0
      property_ui/uni_modules/qiun-data-charts/changelog.md
  98. 1618 0
      property_ui/uni_modules/qiun-data-charts/components/qiun-data-charts/qiun-data-charts.vue
  99. 42 0
      property_ui/uni_modules/qiun-data-charts/components/qiun-error/qiun-error.vue
  100. 162 0
      property_ui/uni_modules/qiun-data-charts/components/qiun-loading/loading1.vue

+ 16 - 0
property_ui/.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"
+     }
+    ]
+}

+ 95 - 0
property_ui/components/box/list.vue

@@ -0,0 +1,95 @@
+<template>
+<view>
+	<block v-if="datainfo.length>0">
+		<!-- 车辆管控 -->
+		<block v-if="type=='health'">
+			<view class="healthlist flexc" v-for="(ite,idx) in datainfo" :key="idx">
+				<view class="hlbox flex1">
+					<view class="tit overtwo">吃粗粮能够降血脂吗?这三种吃法让血糖不降反增</view>
+					<view class="flexc">
+						<view class="txt">2024-11-14</view>
+						<view class="flexc">
+							<image :src="eye" class="eyeimg"></image>
+							<view class="txt">1361</view>
+						</view>
+					</view>
+				</view>
+				<image :src="noiconpimg" class="hrimg"></image>
+			</view>
+		</block>
+		<view class="shax">{{wtdt}}</view>
+	</block>
+	
+	<!-- 无数据 -->
+	<view class="nodata" v-else>
+		<image :src="noiconpimg"></image>
+		<view>
+			暂无数据
+		</view>
+	</view>
+</view>
+</template>
+
+<script>
+	import { checkPermi, checkRole } from "@/utils/permission"; // 权限判断函数
+	import config from '@/config'
+	export default{
+		props:{
+			datainfo: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			wtdt:{
+				type:String,
+				default () {
+					return ''
+				}
+			},
+			type:{
+				type:String,
+				default () {
+					return 0
+				}
+			},
+		},
+		data(){
+			return{
+				noiconpimg:require("@/static/nodata.png"),
+				eye:require('@/static/images/eye.png'),
+			}
+		},
+		mounted() {
+			
+		},
+		methods:{
+			checkPermi, checkRole,
+			getDetail(e){
+				this.$emit('getDetail',e)
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+.flex{display: flex;}
+.flexc{display: flex;align-items: center;}
+.mb10{margin-bottom: 20rpx;}
+.healthlist{
+	padding:26rpx 22rpx;border-bottom: 2rpx solid #E5E5E5;
+	.hlbox{
+		.tit{font-weight: bold;font-size: 28rpx;color: #272727;line-height:48rpx;margin-bottom: 10rpx;}
+		.txt{font-weight: 500;line-height: 36rpx;font-size: 22rpx;color: #AAAAAA;}
+		.eyeimg{width: 24rpx;height: 18rpx;margin-right: 10rpx;margin-left: 34rpx;}
+		
+	}
+	.hrimg{width: 210rpx;height: 138rpx;flex: 0 0 auto;margin-left: 36rpx;}
+}
+
+// 无数据
+.nodata{display: flex;flex-direction: column;align-items: center;
+	image{width: 440rpx;height: 440rpx;}
+	view{font-size: 30rpx;color: #666666;font-weight: bold;}
+}
+</style>

+ 1 - 1
property_ui/components/footer/footer.vue

@@ -52,7 +52,7 @@
 				if(module == 'home'){
 					this.$tab.reLaunch('/pages/index/index')
 				}else if(module == 'health'){
-					this.$tab.reLaunch('/pages/video/index')
+					this.$tab.reLaunch('/pages/health/index')
 				}else if(module == 'store'){
 					this.$tab.reLaunch('/pages/video/index')
 				}else if(module == 'mine'){

+ 1 - 1
property_ui/components/nodata/nodata.vue

@@ -23,7 +23,7 @@
 		},
 		data(){
 			return{
-				noiconpimg:require("@/static/images/noiconp.png"),
+				noiconpimg:require("@/static/nodata.png"),
 			}
 		}
 	}

+ 229 - 0
property_ui/health/components/box/list.vue

@@ -0,0 +1,229 @@
+<template>
+<view>
+	<!-- 第一种样式  人员管理-->
+	<block v-if="datainfo.length>0">
+		<!-- 人员管理 -->
+		<block v-if="type=='people'">
+			<view class="carlist" v-for="(ite,idx) in datainfo" :key="idx" @click="getDetail">
+				<view class="ctop flexc">
+					<image :src="hicoa" class="imgs" v-if="ite.type==1"></image>
+					<image :src="hicob" class="imgs" v-if="ite.type==2"></image>
+					<view class="tit">一号楼3单元1101</view>
+					<view class="flex1"></view>
+					<view class="txt ca" v-if="ite.type==1">业主</view>
+					<view class="txt cb" v-if="ite.type==2">租户</view>
+				</view>
+				<view class="plists">
+					<view class="plist">
+						<image :src="man" class="head" v-if="ite.sex==0"></image>
+						<image :src="woman" class="head" v-else></image>
+						<view class="flex1">
+							<view class="ptit">张伟<view class="btn btnc ml10" v-if="ite.hzflag">户主</view></view>
+							<view class="ptxt">身份证号 | 41072719880603022X</view>
+							<view class="flexc">
+								<view class="ptxt">性别 | {{ite.sex==0?'男':'女'}}</view>
+								<view class="ptxt">年龄 | 36岁</view>
+							</view>
+							<view class="flexc">
+								<view class="ptxt">身高 | 165cm</view>
+								<view class="ptxt">体重 | 67kg</view>
+							</view>
+						</view>
+					</view>
+					<view class="plist" v-if="ite.zhanflag">
+						<image :src="man" class="head" v-if="ite.sex==0"></image>
+						<image :src="woman" class="head" v-else></image>
+						<view class="flex1">
+							<view class="ptit">张伟<view class="btn btnc ml10" v-if="ite.hzflag">户主</view></view>
+							<view class="ptxt">身份证号 | 41072719880603022X</view>
+							<view class="flexc">
+								<view class="ptxt">性别 | {{ite.sex==0?'男':'女'}}</view>
+								<view class="ptxt">年龄 | 36岁</view>
+							</view>
+							<view class="flexc">
+								<view class="ptxt">身高 | 165cm</view>
+								<view class="ptxt">体重 | 67kg</view>
+							</view>
+						</view>
+					</view>
+					<image :src="upimg" :class="ite.zhanflag?'act':''" class="upimg" @click="getZhan(idx)"></image>
+				</view>
+			</view>
+		</block>
+		<view class="shax">{{wtdt}}</view>
+	</block>
+	
+	<!-- 无数据 -->
+	<view class="nodata" v-else>
+		<image :src="noiconpimg"></image>
+		<view>
+			暂无数据
+		</view>
+	</view>
+</view>
+</template>
+
+<script>
+	import { checkPermi, checkRole } from "@/utils/permission"; // 权限判断函数
+	import config from '@/config'
+	export default{
+		props:{
+			datainfo: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			wtdt:{
+				type:String,
+				default () {
+					return ''
+				}
+			},
+			type:{
+				type:String,
+				default () {
+					return 0
+				}
+			},
+			topval:{
+				type:String,
+				default () {
+					return ''
+				}
+			}
+		},
+		data(){
+			return{
+				noiconpimg:require("@/static/nodata.png"),
+				hicoa:require("@/health/static/health/hicoa.png"),
+				hicob:require("@/health/static/health/hicob.png"),
+				man:require("@/work/static/people/man.png"),
+				woman:require("@/work/static/people/woman.png"),
+				upimg:require("@/static/images/home/up.png"),
+				
+				baseUrl:config.baseUrl,
+				delBtnWidth:66,//左滑默认宽度
+			}
+		},
+		mounted() {
+			
+		},
+		methods:{
+			checkPermi, checkRole,
+			getDetail(e){
+				this.$emit('getDetail',e)
+			},
+			getAddFn(e){
+				this.$emit('getAddFn',e)
+			},
+			getReadlist(e){
+				this.$emit('getReadlist',e)
+			},
+			getZhan(idx){
+				// var obj=JSON.parse(JSON.stringify(this.datainfo))[idx]
+				// obj.zhanflag=!obj.zhanflag;
+				// this.datainfo.splice(idx,1,obj);
+				this.datainfo[idx].zhanflag=!this.datainfo[idx].zhanflag
+			},
+			getPreview(idx,arr) {
+				var newArr=[];
+				arr.forEach(ite=>{
+					var ds=this.baseUrl+ite
+					newArr.push(ds)
+				})
+				uni.previewImage({
+					urls: newArr,
+					current:idx,
+					success: function(data) {},
+					fail: function(err) {}
+				});
+			},
+			//开始触摸滑动
+			drawStart(e) {
+				// console.log("开始触发");
+				var touch = e.touches[0];
+				this.startX = touch.clientX;
+			},
+			//触摸滑动
+			drawMove(e) {
+				// console.log("滑动");
+				for (var index in this.datainfo) {
+					// this.csListArrl[index].right=0
+					this.$set(this.datainfo[index],'right',0);
+				}
+				var idx=e.currentTarget.dataset.idx
+				var touch = e.touches[0];
+				var item = this.datainfo[idx];
+				var disX = this.startX - touch.clientX;
+				if (disX >= 20) {
+				        if (disX > this.delBtnWidth) {
+					    disX = this.delBtnWidth;
+				        }
+						// this.csListArrl[idx].right=disX
+				        this.$set(this.datainfo[idx],'right',disX);
+				} else {
+					// this.csListArrl[idx].right=0
+					this.$set(this.datainfo[idx],'right',0);
+				}
+			},
+			//触摸滑动结束
+			drawEnd(e) {
+				// console.log("滑动结束");
+				var idx=e.currentTarget.dataset.idx
+				var item = this.datainfo[idx];
+				if (item.right >= this.delBtnWidth / 2) {
+					// this.datainfo[idx].right=this.delBtnWidth
+					this.$set(this.datainfo[idx],'right',this.delBtnWidth);
+				} else {
+					this.datainfo[idx].right=0
+				}
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+.flex{display: flex;}
+.flexc{display: flex;align-items: center;}
+.mb10{margin-bottom: 20rpx;}
+.carlist{background: #FFFFFF;border-radius: 20rpx;margin-bottom: 24rpx;
+	.ctop{border-bottom: 2rpx solid #E5E5E5;padding: 24rpx 24rpx 22rpx;
+		.imgs{width: 40rpx;height: 42rpx;margin-right: 32rpx;}
+		.tit{font-size: 30rpx;color: #272727;font-weight: bold;margin-right: 20rpx;}
+		.txt{font-weight: 500;font-size: 26rpx;
+			&.ca{color: #3565ED;}
+			&.cb{color: #FE5A0E;}	
+			&.cc{color: #28C529;}	
+		}
+		.txta{font-weight: 500;font-size: 24rpx;color: #AAAAAA;}
+		.num{font-size: 24rpx;color: #AAAAAA;}
+	}
+	.plists{padding: 30rpx 24rpx 6rpx;
+		.plist{background: linear-gradient(-90deg, #F2F5FF 0%, #FBFDFF 100%);border-radius: 20rpx;border: 2rpx solid #E6E6E6;margin-bottom: 24rpx;padding: 18rpx 26rpx 4rpx;display: flex;
+		.head{width: 96rpx;height: 98rpx;margin-right: 32rpx;flex: 0 0 auto;margin-top: 36rpx;}
+		.ptit{font-weight: bold;font-size: 30rpx;color: #272727;display: flex;align-items: center;margin-bottom: 14rpx;}	
+		.ptxt{font-weight: 500;font-size: 26rpx;color: #666666;line-height: 36rpx;margin-bottom: 14rpx;min-width: 176rpx;}
+		}
+	}
+	.upimg{width: 26rpx;height: 22rpx;display: block;transform: rotate(180deg);transition: all 0.3s;margin: 0 auto 18rpx;
+		&.act{transform: rotate(0deg);}
+	}
+	.btn{height: 34rpx;border-radius: 18rpx;display: flex;align-items: center;justify-content: center;padding: 0 10rpx;font-size: 22rpx;margin-right: 24rpx;
+		&.btna{border: 2rpx solid #06C770;color: #06C770;}
+		&.btnb{border: 2rpx solid #3565ED;color: #3565ED;}
+		&.btnc{border: 2rpx solid #FE5A0E;color: #FE5A0E;}
+		&.btnbga{border: 1px solid #0156FE;color: #3565ED;background: #DFEAFF;height: 36rpx;}
+		&.btnbgb{border: 1px solid #C1C1C1;color: #666666;background: #F1F1F1;height: 36rpx;}
+		&.btnbgc{border: 1px solid #FE5A0E;color:#FE5A0E;background:#FFEEE6;height: 36rpx;}
+	}
+}
+
+
+
+// 无数据
+.nodata{display: flex;flex-direction: column;align-items: center;
+	image{width: 440rpx;height: 440rpx;}
+	view{font-size: 30rpx;color: #666666;font-weight: bold;}
+}
+</style>

+ 337 - 0
property_ui/health/pages/health/detail.vue

@@ -0,0 +1,337 @@
+<template>
+  <view class="hdetail" :style="'padding-top:'+nvaHeight+'px;'">
+		<view class="navbox">
+			<uni-nav-bar  color="#ffffff" title="健康档案"  :background-color="backgroundColor" :border="false" statusBar='true' fixed="true" @clickLeft="getBackFn">
+			</uni-nav-bar>
+			<!-- 家人 -->
+			<view class="headbox flexc" :style="'backgroundColor:'+backgroundColor">
+				<view class="htop" :class="tabval==idx?'act':''" v-for="(ite,idx) in list" :key="idx" @click="getTabFn(idx)">
+					<view class="img"><image :src="heada" class="imaga"></image></view>
+					<view class="tit">{{ite.tit}}</view>
+				</view>
+			</view>
+		</view>
+		<!-- 主体 -->
+		<view class="wymain" >
+			<view class="headbox flexc" style="opacity: 0;">
+				<view class="htop">
+					<view class="img"><image :src="heada" class="imaga"></image></view>
+					<view class="tit">户主</view>
+				</view>
+			</view>
+			<view class="hmain">
+				<view class="hmtop mb20">
+					<image :src="heada" class="head"></image>
+					<view class="hmtopa flex1">
+						<view class="flex mb14">
+							<view class="tit">袁玥</view>
+							<view class="btn btna">本人</view>
+							<view class="btn btnb">党员</view>
+							<view class="btn btnc">五保户</view>
+						</view>
+						<view class="hmtopb flexc mb10">
+							<image :src="car" class="limg"></image>
+							<view >
+								<view class="hmtit">身份证号</view>
+								<view class="hmtxt flexc">
+									<view class="hmtxts">{{lookfalg?cartit:carpass}}</view>
+								<image :src="eye" v-if="lookfalg" @click="lookfalg=false"></image>
+								<image :src="neye" v-else @click="lookfalg=true"></image>
+								
+								</view>
+							</view>
+						</view>
+						<view class="hmtopb flexc ">
+							<image :src="adr" class="limg"></image>
+							<view >
+								<view class="hmtit">家庭住址</view>
+								<view class="hmtxt">幸福小区1号楼3单元1101</view>
+							</view>
+						</view>
+					</view>
+					<view class="code">
+						<image :src="headb"></image>
+						<view>点击放大二维码</view>
+					</view>
+				</view>
+				<view class="hline mb18 flexc">
+					<view class="tit">MORE</view>
+					<view class="line"></view>
+				</view>
+				<view class="detail mb24">
+					<view class="detop mb14">
+						<image :src="icon"></image>
+						<view class="flexcj detit">基础信息<view class="detxt">更新时间:2024-10-24</view></view>
+					</view>
+					<view class="dlists">
+						<view class="lists">
+							<view class="ltit">性别</view><view class="ltxt">女</view>
+						</view>
+						<view class="lists">
+							<view class="ltit">年龄</view><view class="ltxt">38岁</view>
+						</view>
+						<view class="lists">
+							<view class="ltit">血型</view><view class="ltxt">B型</view>
+						</view>
+						<view class="lists">
+							<view class="ltit">血压</view><view class="ltxt">65/120mmHg</view>
+						</view>
+						<block v-if="zhanList[0].zhanflag">
+							<view class="lists">
+								<view class="ltit">身高</view><view class="ltxt">165cm</view>
+							</view>
+							<view class="lists">
+								<view class="ltit">体重</view><view class="ltxt">67kg</view>
+							</view>
+							<view class="lists">
+								<view class="ltit">腰围</view><view class="ltxt">85cm</view>
+							</view>
+							<view class="lists">
+								<view class="ltit">体质指数</view><view class="ltxt">142kg/m2</view>
+							</view>
+							<view class="lists">
+								<view class="ltit">脉搏</view><view class="ltxt">90bpm</view>
+							</view>
+							<view class="lists">
+								<view class="ltit">体温</view><view class="ltxt">36.4℃</view>
+							</view>
+							<view class="lists">
+								<view class="ltit">呼吸频率</view><view class="ltxt">50次/分钟</view>
+							</view>
+						</block>
+					</view>
+					<view class="upbox" @click="getZhanFn(0)">
+						<view>{{zhanList[0].zhanflag?'折叠':'展开'}}</view>
+						<image :src="upimg" :class="zhanList[0].zhanflag?'':'zhe'"></image>
+					</view>
+				</view>
+				<view class="detail mb24">
+					<view class="detop mb14">
+						<image :src="icon"></image>
+						<view class="flexcj detit">健康病史<view class="detxt">更新时间:2024-10-24</view></view>
+					</view>
+					<view class="dlists">
+						<view class="lists w100">
+							<view class="ltit">基础疾病</view><view class="ltxt">慢性支气管炎</view>
+						</view>
+						<view class="lists w100">
+							<view class="ltit">病史</view><view class="ltxt">高血压、高血糖、甲状腺结节 拷贝</view>
+						</view>
+						<block v-if="zhanList[1].zhanflag">
+							<view class="lists">
+								<view class="ltit">近视/远视</view><view class="ltxt">近视</view>
+							</view>
+							<view class="lists">
+								<view class="ltit">近视/远视度数</view><view class="ltxt">左:375 右:400</view>
+							</view>
+						</block>
+					</view>
+					<view class="upbox" @click="getZhanFn(1)">
+						<view>{{zhanList[1].zhanflag?'折叠':'展开'}}</view>
+						<image :src="upimg" :class="zhanList[1].zhanflag?'':'zhe'"></image>
+					</view>
+				</view>
+				<view class="detail">
+					<view class="detop mb14">
+						<image :src="icon"></image>
+						<view class="flexcj detit">兴趣爱好<view class="detxt">更新时间:2024-10-24</view></view>
+					</view>
+					<view class="dlists">
+						<view class="lists w100">
+							<view class="ltit">兴趣爱好</view>
+							<view class="ltxt">喜欢运动,经常参加马拉松比赛</view>
+							<view class="ltxt">平时也好书法,参加书法展</view>
+						</view>
+					</view>
+				</view>
+				<view class="dbtns flexcj mt55">
+					<view class="btna">删除档案</view>
+					<view class="btnb">修改档案</view>
+				</view>
+			</view>
+		</view>
+	<loading></loading>
+  </view>
+</template>
+
+<script>
+  export default {
+	components:{},
+	data(){
+		return{
+			nvaHeight:44,
+			// activeColor:'#A7CDF9',
+			// nactiveColor:'#DADADA',
+			backgroundColor: "transparent",
+			heada:require("@/health/static/health/heada.png"),
+			headb:require("@/health/static/health/headb.png"),
+			headc:require("@/health/static/health/headc.png"),
+			headd:require("@/health/static/health/headd.png"),
+			heade:require("@/health/static/health/heade.png"),
+			headf:require("@/health/static/health/headf.png"),
+			adr:require("@/health/static/health/adr.png"),
+			car:require("@/health/static/health/car.png"),
+			icon:require("@/health/static/health/icon.png"),
+			eye:require("@/static/images/eye.png"),
+			neye:require("@/static/images/mine/neye.png"),
+			upimg:require("@/static/images/home/up.png"),
+			lookfalg:false,	
+			tabval:0,
+			cartit:'378554199010206016',
+			carpass:'3********6',
+			list:[{tit:'户主'},{tit:'丈夫'},{tit:'儿子'},{tit:'女儿'},{tit:'婆婆'},{tit:'公公'},],
+			datainfo:{
+				
+			},
+			zhanList:[{zhanflag:true},{zhanflag:true},{zhanflag:true},{zhanflag:true}],
+		}
+	},
+	watch:{
+		lookfalg(val){
+			if(val){
+				
+			}
+		}
+	},
+	onPageScroll(e) {
+		var scrollTop = Number(e.scrollTop);
+		if (scrollTop > 0) {
+			this.backgroundColor = '#48CC9A'
+		} else {
+			this.backgroundColor = 'transparent'
+		}
+	},
+    onLoad: function() {
+		uni.getSystemInfo({
+			success: (e) => {
+				this.nvaHeight = Number(e.statusBarHeight)+44;
+			}
+		})
+    },
+	methods:{
+		getZhanFn(idx){
+			this.zhanList[idx].zhanflag=!this.zhanList[idx].zhanflag
+		},
+		getBackFn(){
+			uni.navigateBack({
+				delta:1
+			})
+		},
+		getCode(code){
+			var idCard='123456789'
+			const firstPart = idCard.slice(0, 1);  
+			  // 生成中间8位的星号  
+			  const middlePart = '*'.repeat(idCard.length-2);  
+			  // 获取后4位  
+			  const lastPart = idCard.slice(idCard.length-1); 
+			  var s= firstPart + middlePart + lastPart;
+			  console.log(s)
+			  // return firstPart + middlePart + lastPart;
+		},
+		getTabFn(val){
+			this.tabval=val;
+		},
+		getDataFn(){
+			var params={
+				pageSize:this.pageSize,
+				pageNum: this.pageNum,
+			}
+			params.noticeType=this.tabidx
+			getNoticeList(params).then(res=>{
+				if(res.code==200){
+					
+				}else{
+					this.$toast(res.msg)
+				}
+			})
+			
+		},
+		
+	}
+  }
+</script>
+<style>
+	page{background:#F4F6F8;}
+</style>
+<style lang="scss" scoped>
+.w100{width: 100%;}
+.hdetail{
+	background: linear-gradient(180deg, #45CB99 0%, rgba(238,227,197,0) 100%) no-repeat;background-size: 100% 782rpx;min-height: 100vh;box-sizing: border-box;
+}
+.headbox{padding: 14rpx 20rpx 20rpx;overflow: auto;
+	.htop{display: flex;flex-direction: column;align-items: center;margin: 0 16rpx;
+		.img{width: 88rpx;height: 88rpx;border-radius: 50%;border: 8rpx solid #D4F6E5;margin-bottom: 16rpx;display: flex;align-items: center;justify-content: center;box-sizing: border-box;
+			image{border-radius: 50%;}
+			.imaga{width: 70rpx;height: 74rpx;}
+			.imagb{width: 70rpx;height: 72rpx;}
+			.imagc{width: 70rpx;height: 76rpx;}
+			.imagd{width: 70rpx;height: 70rpx;}
+			.image{width: 70rpx;height: 74rpx;}
+		}
+		.tit{font-weight: 500;font-size: 22rpx;color: #3FA47D;}
+		&.act{
+			.tit{font-weight: bold;color: #FFFFFF;}
+		}
+	}
+}
+.navbox{position: fixed;left: 0;right: 0;top: 0;z-index: 4;	}
+.wymain{z-index: 2;position: relative;padding: 0 24rpx 24rpx;}
+.hmain{background: #FFFFFF;border-radius: 20rpx;padding: 32rpx 24rpx 44rpx;
+	.hmtop{display: flex;
+		.head{width: 60rpx;height: 60rpx;border-radius: 8rpx;flex: 0 0 auto;margin-right: 28rpx;}
+		.hmtopa{
+			.tit{font-weight: bold;font-size: 32rpx;
+color: #272727;}
+			.btn{font-weight: bold;font-size: 22rpx;min-width: 64rpx;height: 30rpx;padding: 0 10rpx;box-sizing: border-box;margin-left: 14rpx;border-radius: 16rpx;display: flex;align-items: center;justify-content: center;margin-top: 6rpx;color: #FFFFFF;
+			&.btna{border: 2rpx solid #2589FF;color: #2589FF;}
+			&.btnb{background:#FF6969;}
+			&.btnc{background:#F6C576;}
+			}
+		}
+		.hmtopb{
+			image{flex: 0 0 auto;}
+			.limg{width: 46rpx;height: 46rpx;margin-right: 22rpx;}
+			.hmtit{font-size: 26rpx;color: #AAAAAA;font-weight: 500;margin-bottom: 4rpx;}
+			.hmtxt{font-size: 26rpx;color: #272727;font-weight: 500;
+				.hmtxts{min-width: 270rpx;}
+			 image{width: 26rpx;height: 18rpx;margin-left: 16rpx;
+				// image{width: 100%;height: 100%;}
+			 }
+			}
+		}
+		.code{flex:0 0 auto;
+			view{font-weight: 500;font-size: 20rpx;color: #AAAAAA;}
+			image{width: 132rpx;height: 132rpx;margin-bottom: 10rpx;}
+		}
+	}
+	.hline{
+		.tit{font-weight: bold;font-size: 20rpx;color: #48CB9B;font-style: italic;margin-right: 22rpx;flex: 0 0 auto;}
+		.line{flex: 1;border-bottom: 2rpx solid #E6E6E6;}
+	}	
+	.detail{
+		.detop{position: relative;
+			image{width: 30rpx;height: 30rpx;position: absolute;left: 0;top: 7rpx;z-index: 0;}
+			.detit{font-size: 16px;color: #272727;font-weight: bold;line-height: 44rpx;padding-left: 10rpx;position: relative;z-index: 2;}
+			.detxt{font-weight: 500;font-size: 22rpx;color: #666666;line-height: 36rpx;}
+		}
+	}
+	.dlists{display: flex;align-items: center;flex-wrap: wrap;
+		.lists{line-height: 36rpx;padding: 12rpx 0 12rpx 12rpx;min-width: 23%;box-sizing: border-box;
+			.ltit{font-weight: 500;font-size: 26rpx;color: #AAAAAA;margin-bottom: 4rpx;}
+			.ltxt{font-weight: 500;font-size: 26rpx;color: #272727;}
+		}
+	}
+}
+.upbox{display: flex;align-items: center;justify-content: center;margin-top: 8rpx;padding: 10rpx 0;
+		image{width: 24rpx;height: 20rpx;transition: all 0.3s;margin-left: 14rpx;
+			&.zhe{transform: rotate(-180deg);}
+		}
+		view{font-weight: 500;font-size: 22rpx;color: #AAAAAA;}
+	}
+.dbtns{
+	view{width: 314rpx;box-sizing: border-box;display: flex;align-items: center;justify-content: center;font-weight: bold;font-size: 26rpx;height: 88rpx;border-radius: 10px;
+	&.btna{border: 1px solid #FF6969;background: #FFEEEE;color: #FF6969;}
+	&.btnb{background: #46CB99;color: #FFFFFF;}
+	}
+}
+</style>

+ 152 - 0
property_ui/health/pages/health/index.vue

@@ -0,0 +1,152 @@
+<template>
+	<view class="car">
+		<view class="cartop">
+			<view class="topa flexc">
+				<!-- <image :src="reset" class="resetimg" @click="getReset"></image>
+				<picker range-key='dictLabel' 	:range="jclxlist"    @change='bindDateChangea'>
+					<view class="chekt flexc">
+						<view class="over">{{sfxx|| "选择身份"}}</view>
+						<image :src="up"></image>
+					</view>
+				</picker> -->
+				<view class="search flexc">
+					<image :src="search"></image>
+					<!-- confirm-type="search" @confirm="getConfirm" -->
+					<input placeholder="请输入房号或人员姓名进行搜索"  v-model="text"/>
+					<view class="btn" @click="getConfirm">搜索</view>
+				</view>
+			</view>
+		</view>
+		<!-- 列表 -->
+		<view class="carlists">
+			<box-list :datainfo="list" :wtdt="wtdt" type='people' @getDetail="getDetail"></box-list>
+		</view>
+		<view class="rfbtn bg45">添加</view>
+		<loading></loading>
+	</view>
+</template>
+
+<script>
+	import config from '@/config'
+	const baseUrl = config.baseUrl
+	import boxList from "@/health/components/box/list.vue"
+	import { checkPermi, checkRole } from "@/utils/permission"; // 权限判断函数
+	export default{
+		components:{boxList},
+		data(){
+			return{
+				// reset:require('@/work/static/car/reset.png'),
+				// up:require('@/work/static/car/up.png'),
+				// car:require('@/work/static/car/car.png'),
+				// cara:require('@/work/static/car/cara.png'),
+				// carb:require('@/work/static/car/carb.png'),
+				search:require('@/health/static/health/search.png'),
+				sfxx:"",
+				text:'',
+				jclxlist:[{dictLabel:'党员',dictValue:'0'}],
+				list:[{tit:'皖A IC520',type:1,hzflag:true,sex:1,zhanflag:false},{tit:'晋E KD783',type:2,hzflag:false,sex:0,zhanflag:false},],
+				pageSize: 10,
+				pageNum: 1,
+				reachflag: true,
+				wtdt:'',
+			}
+		},
+		onLoad: function() {
+		
+		},
+		// 上拉触底加载更多触发事件
+		onReachBottom() {
+			if (this.reachflag) {
+				this.pageNum++
+				this.getDataFn()
+			}
+		},
+		methods:{
+			checkPermi, checkRole,
+			getDetail(){
+				this.$tab.navigateTo("/health/pages/health/detail")
+			},
+			getTabtop(val){
+				this.ttopval=val
+			},
+			getConfirm(){
+				this.getrefreshData()
+			},
+			getReset(){
+				this.sfxx='';
+				this.text='';
+				this.getrefreshData()
+			},
+			getrefreshData(){
+				this.pageNum=1;
+				this.list=[];
+				this.reachflag=true;
+				this.getDataFn()
+			},
+			getTabFn(val){
+				this.tabval=val
+			},
+			bindDateChangea(e){
+				var val=e.detail.value;
+				this.sfxx=this.jclxlist[val].dictLabel;
+				// this.orderFoodType=this.jclxlist[val].dictValue;
+			},
+			getDataFn(){
+				var params={
+					pageSize:this.pageSize,
+					pageNum: this.pageNum,
+				}
+				params.noticeType=this.tabidx
+				getNoticeList(params).then(res=>{
+					if(res.code==200){
+						if (res.rows.length < this.pageSize) {
+							this.reachflag = false
+							this.wtdt = '到底了~';
+						} else {
+							var num = parseInt(res.rows.length) + parseInt(this.pageSize) * parseInt(this.pageNum -	1)
+							if (num < res.total) {
+								this.reachflag = true
+								this.wtdt = ''
+							} else {
+								this.reachflag = false
+								this.wtdt = '到底了~';
+							}
+						}
+						if (this.pageNum == 1) {
+							this.list = res.rows;
+						} else {
+							this.list = this.list.concat(res.rows)
+						}
+					}else{
+						this.$toast(res.msg)
+					}
+				})
+				
+			},
+		}
+	}
+</script>
+<style>
+	page{background: #F3F3F0;}
+</style>
+<style lang="scss" scoped>
+.car{padding-top: 140rpx;}
+.cartop{position: fixed;left: 0;right: 0;top: 0;background-color: #ffffff;z-index: 2;
+	.topa{padding: 20rpx 20rpx 32rpx;
+		.resetimg{width: 36rpx;height: 36rpx;margin-right: 24rpx;flex: 0 0 auto;}
+		.chekt{width: 150rpx;overflow: hidden;
+			view{font-weight: 500;font-size: 26rpx;color: #272727;flex: 1;}
+			image{width: 24rpx;height: 16rpx;margin-left: 18rpx;flex: 0 0 auto;}
+		}
+		.search{flex: 1;margin-left: 16rpx;height: 64rpx;background: #EEEEEE;border-radius: 32rpx;border: 2rpx solid #E6E6E6;padding-left: 24rpx;box-sizing: border-box;
+		image{width: 32rpx;height: 34rpx;margin-right: 22rpx;flex: 0 0 auto;}
+		input{flex: 1;font-size: 26rpx;color: #272727;}
+		.btn{width: 100rpx;height: 64rpx;background: #45CB99;border-radius: 32rpx;flex: 0 0 auto;font-weight: bold;text-align: center;line-height: 64rpx;
+font-size: 26rpx;
+color: #FFFFFF;}
+		}
+	}
+
+}
+.carlists{padding: 0 18rpx;}
+</style>

BIN
property_ui/health/static/health/adr.png


BIN
property_ui/health/static/health/car.png


BIN
property_ui/health/static/health/heada.png


BIN
property_ui/health/static/health/headb.png


BIN
property_ui/health/static/health/headc.png


BIN
property_ui/health/static/health/headd.png


BIN
property_ui/health/static/health/heade.png


BIN
property_ui/health/static/health/headf.png


BIN
property_ui/health/static/health/hicoa.png


BIN
property_ui/health/static/health/hicob.png


BIN
property_ui/health/static/health/icon.png


BIN
property_ui/health/static/health/search.png


+ 705 - 0
property_ui/manage/components/car/list.vue

@@ -0,0 +1,705 @@
+<template>
+<view>
+	<!-- 第一种样式  人员管理-->
+	<block v-if="datainfo.length>0">
+		<!-- 车辆管控 -->
+		<block v-if="type=='car'">
+			<view class="carlist" v-for="(ite,idx) in datainfo" :key="idx">
+				<view class="ctop flexc">
+					<image :src="cara" class="imgs" v-if="ite.type==1"></image>
+					<image :src="carb" class="imgs" v-if="ite.type==2"></image>
+					<view class="tit">皖A IC520</view>
+					<view class="btn btna">新能源</view>
+					<view class="btn btnb">小型车</view>
+					<view class="flex1"></view>
+					<view class="txt ca" v-if="ite.type==1">小区车辆</view>
+					<view class="txt cb" v-if="ite.type==2">外来车辆</view>
+				</view>
+				<view class="clists">
+					<view class="clist"><view class="tit">车库名称</view>地下停车场</view>
+					<view class="clist"><view class="tit">进入时间</view>2024-11-27 16:27:48</view>
+					<block v-if="topval=='sl'">
+						<view class="clist"><view class="tit">驶离时间</view>2024-11-27 16:27:48</view>
+						<view class="clist"><view class="tit">停车时长</view>3小时19分钟</view>
+					</block>
+					<view class="clist"><view class="tit">{{ite.type==1?'门户号 ':'来访门户'}}</view>8#303</view>
+					<view class="clist"><view class="tit">手机号码</view>13656788668</view>
+				</view>
+			</view>
+		</block>
+		<!-- 车辆违规 -->
+		<block v-if="type=='carpark'">
+			<view class="carlist" v-for="(ite,idx) in datainfo" :key="idx" @click="getDetail">
+				<view class="ctop flexc">
+					<image :src="cara" class="imgs" v-if="ite.type==1"></image>
+					<image :src="carb" class="imgs" v-if="ite.type==2"></image>
+					<view class="tit">皖A IC520</view>
+					<view class="num" :class="ite.heiflag?'coff':''">(本年度2次)</view>
+					<view class="flex1"></view>
+					<view class="txt ca" v-if="ite.type==1">小区车辆</view>
+					<view class="txt cb" v-if="ite.type==2">外来车辆</view>
+				</view>
+				<view class="clists">
+					<view class="clist"><view class="tit">关联房号</view>12#1403</view>
+					<view class="clist"><view class="tit">手机号码</view>13656788668</view>
+					<view class="clist"><view class="tit">登记时间</view>2024-11-27 17:30:55</view>
+					<view class="clist"><view class="tit">违停拍照</view>
+						<view class="imgas">
+							<image :src="cara" @click="getPreview(idx,cara)"></image>
+							<image :src="cara"></image>
+							<image :src="cara"></image>
+							<image :src="cara"></image>
+						</view>
+					</view>
+				</view>
+			</view>
+		</block>
+		<!-- 人员管理 -->
+		<block v-if="type=='people'">
+			<view class="carlist peolist" v-for="(ite,idx) in datainfo" :key="idx" @click="getDetail">
+				<view class="ctop flexc">
+					<image :src="hicoa" class="imgs" v-if="ite.type==1"></image>
+					<image :src="hicob" class="imgs" v-if="ite.type==2"></image>
+					<view class="tit">一号楼3单元1101</view>
+					<view class="flex1"></view>
+					<view class="txt ca" v-if="ite.type==1">业主</view>
+					<view class="txt cb" v-if="ite.type==2">租户</view>
+				</view>
+				<view class="plists">
+					<view class="plist flexc">
+						<image :src="man" class="head" v-if="ite.sex==0"></image>
+						<image :src="woman" class="head" v-else></image>
+						<view class="flex1">
+							<view class="ptit">张伟<view class="btn btnc ml10" v-if="ite.hzflag">户主</view></view>
+							<view class="ptxt">身份证号 | 41072719880603022X</view>
+							<view class="flexc">
+								<view class="ptxt">性别 | {{ite.sex==0?'男':'女'}}</view>
+								<view class="ptxt">年龄 | 36岁</view>
+							</view>
+						</view>
+					</view>
+					<view class="plist flexc" v-if="ite.zhanflag">
+						<image :src="man" class="head" v-if="ite.sex==0"></image>
+						<image :src="woman" class="head" v-else></image>
+						<view class="flex1">
+							<view class="ptit">张伟<view class="btn btnc ml10" v-if="ite.hzflag">户主</view></view>
+							<view class="ptxt">身份证号 | 41072719880603022X</view>
+							<view class="flexc">
+								<view class="ptxt">性别 | {{ite.sex==0?'男':'女'}}</view>
+								<view class="ptxt">年龄 | 36岁</view>
+							</view>
+						</view>
+					</view>
+					<image :src="upimg" :class="ite.zhanflag?'act':''" class="upimg" @click="getZhan(idx)"></image>
+				</view>
+			</view>
+		</block>
+		<!-- 维修人员管理 -->
+		<view v-if="type=='staff'" class="flecw">
+			<view class="stafflist" v-for="(ite,idx) in datainfo" :key="idx" @click="getDetail">
+				<view class="statop">
+					<image class="head" :src="man" v-if="ite.sex==0"></image>
+					<image class="head" :src="woman" v-else></image>
+					<view class="flex1">
+						<view class="statit">张伟</view>
+						<view class="statxt flexc co06" v-if="ite.hzflag"><text class="cir bga"></text>空闲中</view>
+						<view class="statxt flexc cof6" v-else><text class="cir bgb"></text>指派中</view>
+					</view>
+					<image :src="pdel" class="stadel"></image>
+				</view>
+				<view class="stalist">
+					<view class="imgs"><image :src="gzlx" class="gzlximg"></image></view>电梯维修
+				</view>
+				<view class="stalist">
+					<view class="imgs"><image :src="mphone" class="mphone"></image></view>158****0088
+				</view>
+			</view>
+		</view>
+		<!-- 来访管理 -->
+		<block v-if="type=='comepeo'">
+			<view class="carlist peolist" v-for="(ite,idx) in datainfo" :key="idx">
+				<view class="ctop flexc">
+					<image :src="hicoa" class="imgs"></image>
+					<!-- <image :src="hicob" class="imgs" v-if="ite.type==2"></image> -->
+					<view class="tit">幸福小区12#301</view>
+					<view class="btn btnbga">预约</view>
+					<view class="btn btnbgb">已来访</view>
+					<view class="btn btnbgc">待来访</view>
+					<view class="flex1"></view>
+					<view class="txt cc" v-if="ite.type==1">驾车</view>
+				</view>
+				<view class="clists">
+					<view class="clist"><view class="tit">预约时间</view>2024-11-25  10:00:00</view>
+					<view class="clist"><view class="tit">来访时间</view>2024-11-27 16:27:48</view>
+					<view class="w50 flexc">
+						<view class="clist"><view class="tit">访客姓名</view>刘女士</view>
+						<view class="clist"><view class="tit">来访人数</view>1人</view>
+					</view>
+					<view class="w50 flexc">
+						<view class="clist"><view class="tit">来访事由</view>亲友</view>
+						<view class="clist"><view class="tit">车牌号码</view>皖A 86KY2</view>
+					</view>
+					<view class="clist"><view class="tit">手机号码</view>13656788668</view>
+				</view>
+			</view>
+		</block>
+		<!-- 房屋管理 -->
+		<block v-if="type=='comehouse'">
+			<view class="carlist houselist" v-for="(ite,idx) in datainfo" :key="idx">
+				<view class="ctop flexc">
+					<image :src="house" class="imgs" v-if="ite.type==1"></image>
+					<image :src="housea" class="imgs" v-if="ite.type==2"></image>
+					<view class="tit">幸福小区12#1101室</view>
+					<!-- view class="btn btnbga">预约</view>
+					<view class="btn btnbgb">已来访</view>
+					<view class="btn btnbgc">待来访</view> -->
+					<view class="flex1"></view>
+					<view class="txt ca" v-if="ite.type==1">业主</view>
+					<view class="txt cb" v-if="ite.type==2">租户</view>
+				</view>
+				<view class="clists">
+					<view class="w50 flexc">
+						<view class="clist"><view class="tit">房屋所属</view>袁玥</view>
+						<view class="clist"><view class="tit">建筑面积</view>121.3m²</view>
+					</view>
+					<view class="w50 flexc">
+						<view class="clist"><view class="tit">房型</view>3室1厅</view>
+						<view class="clist"><view class="tit">居住人口</view>3口人</view>
+					</view>
+					<view class="w50 flexc">
+						<view class="clist"><view class="tit">有无车位  </view>有</view>
+					</view>
+					<!-- <view class="clist"><view class="tit">手机号码</view>13656788668</view> -->
+				</view>
+			</view>
+		</block>
+		<!-- 物业费管理 -->
+		<block v-if="type=='money'">
+			<view class="carlist peolist" v-for="(ite,idx) in datainfo" :key="idx" @click="getDetail">
+				<view class="ctop flexc" style="padding: 26rpx 24rpx 24rpx;">
+					<image :src="hicoa" class="imgs"></image>
+					<view class="tit">幸福小区12#301</view>
+					<view class="flex1"></view>
+					<view class="txta">2024/01 -2024/12</view>
+				</view>
+				<view class="clists flexc">
+					<view class="mlistl">
+						<view class="mltit">应缴总额 /元</view>
+						<view class="mltxt">4307.20</view>
+					</view>
+					<view class="mlistr">
+						<view class="clist"><view class="tit">物业费用:</view>3247.20元</view>
+						<view class="clist"><view class="tit">车位费用:</view>960.00元</view>
+						<view class="clist"><view class="tit">能耗费用:</view>100.00元</view>
+					</view>
+				</view>
+			</view>
+		</block>
+		<!-- 历史账单 -->
+		<block v-if="type=='moneybill'">
+			<view class="carlist peolist" v-for="(ite,idx) in datainfo" :key="idx">
+				<view class="ctop flexc" style="padding: 26rpx 24rpx 24rpx;">
+					<image :src="time" class="imgs"></image>
+					<view class="tit">2024/01 -2024/12</view>
+					<view class="btn btnbgb" v-if="ite.type==1">已缴费</view>
+					<view class="btn btnbgc" v-else>未缴费</view>
+					<view class="flex1"></view>
+					<view class="txta">1号楼3单元1102</view>
+				</view>
+				<view class="clists flexc">
+					<view class="mlistl">
+						<view class="mltit">应缴总额 /元</view>
+						<view class="mltxt">4307.20</view>
+					</view>
+					<view class="mlistr">
+						<view class="clist"><view class="tit">物业费用:</view>3247.20元</view>
+						<view class="clist"><view class="tit">车位费用:</view>960.00元</view>
+						<view class="clist"><view class="tit">能耗费用:</view>100.00元</view>
+					</view>
+				</view>
+			</view>
+		</block>
+		<!-- 巡更地点patrol -->
+		<block v-if="type=='patrol'">
+			<view class="patlist" v-for="(ite,idx) in datainfo" :key="idx" @click="getDetail">
+				<view class="pattop flexc">
+					<image :src="home" class="imgs"></image>
+					<view class="tit">幸福小区1栋2单元电梯间</view>
+					<view class="flex1"></view>
+					<view class="txt cd" v-if="ite.type==1">未巡更</view>
+					<view class="txt cc" v-if="ite.type==2">已巡更</view>
+				</view>
+				<view class="patlistr">
+					<view class="clist"><view class="tit">巡检类型</view>:设备维修</view>
+					<view class="clist"><view class="tit">巡检时间</view>:2024-11-27 10:00</view>
+					<view class="clist"><view class="tit">巡检人</view>:刘兵琦</view>
+				</view>
+				<view class="patbtns">
+					<view class="btna" @click.stop="getDetail">查看</view>
+					<view  class="btnb" @click.stop="getAddFn">去巡更</view>
+				</view>
+			</view>
+		</block>
+		<!-- 报修管理 -->
+		<block v-if="type=='warranty'">
+			<view class="walists" v-for="(ite,idx) in datainfo" :key="idx" @click="getDetail">
+				<view class="watop ">
+					<view class="watit">
+						<view class="tit">一号楼3单元12楼楼梯间灯不亮</view>
+						<view class="txt co01" v-if="ite.type==1">待分派</view>
+						<view class="txt coa" v-if="ite.type==3">已完成</view>
+						<view class="txt co28" v-if="ite.type==2">处理中</view>
+					</view>
+					<view class="walist"><view class="tit">小区名称</view>:幸福小区</view>
+					<view class="walist"><view class="tit">报修门户</view>:3号楼1单元406</view>
+					<view class="walist"><view class="tit">报修时间</view>:2024-11-14 17:16:31</view>
+					<view class="walist" v-if="ite.type==3"><view class="tit" >完成时间</view>:2024-11-14 18:16:31</view>
+				</view>
+				<view class="wabtn">
+					<view>查看详情</view>
+					<image :src="rimg"></image>
+				</view>
+			</view>
+		</block>
+		<!-- 投诉建议 -->
+		<block v-if="type=='complaint'">
+			<view class="walists" v-for="(ite,idx) in datainfo" :key="idx" @click="getDetail"
+				:data-idx="idx"
+				@touchstart="drawStart" @touchmove="drawMove" @touchend="drawEnd" :style="'right:'+ite.right+'px'"
+			>
+				<view class="watop watopcom">
+					<view class="watit">
+						<view class="tit">小区电梯老化</view>
+						<view class="txt co01" v-if="ite.type==1">待回复</view>
+						<view class="txt coa" v-if="ite.type==2">已回复</view>
+					</view>
+					<view class="watopcoma overtwo">小区电梯时常发生问题,请物业派维修人员进行安全检 查,若无法排除问题,建议更换小区的电梯设备,避…</view>
+					<view class="watopcomb">2024-11-18 08:16:54</view>
+				</view>
+				<!--  -->
+				<view class="spdel" v-if="ite.right>0" @click.stop="getDelFn()">删除</view>
+			</view>
+			<!-- checkPermi(['system:menuFood:remove'])&& -->
+			
+		</block>
+		<!-- 党建资讯 -->
+		<block v-if="type=='newsdj'">
+			<view class="newlists" v-for="(ite,idx) in datainfo" :key="idx" @click="getDetail" 
+			>
+				<view class="tit">潜山:多举措建优非公党建工作指导员队伍</view>
+				<view class="txt overtwo">如何不断激发非公企业和社会组织党建工作新活力?潜山市委社 会工作部发挥考核的指挥棒作用,“三点发力”推动党建工作部…</view>
+				<view class="stabox flexc">
+					<view class="time flex1">2024-11-18 08:16:54</view>
+					<view class="btns">
+						<!-- <image :src="star" class="imga"></image>42 -->
+						<image :src="stara" class="imga"></image>42
+					</view>
+					<view class="btns">
+						<image :src="eye" class="imgb"></image>1361
+					</view>
+				</view>
+
+			</view>
+			<!-- checkPermi(['system:menuFood:remove'])&& -->
+		</block>
+		<!-- 社区资讯 -->
+		<block v-if="type=='newssq'">
+			<view class="walists" v-for="(ite,idx) in datainfo" :key="idx" @click="getDetail">
+				<view class="watop watopcom">
+					<view class="watit">
+						<view class="tit">物业服务费缴费公告<text class="cir"></text></view>
+					</view>
+					<view class="watopcoma overtwo">尊敬的各位业主:为更好地提供优质小区环境,保障小区 公共区域设施设备正常的运行,现收取2024年度物业…</view>
+					<view class="watopcomb">2024-11-18 08:16:54</view>
+				</view>
+				<view class="wabtn">
+					<view>查看详情</view>
+					<image :src="rimg"></image>
+				</view>
+			</view>
+		</block>
+		<!-- 员工图文 -->
+		<block v-if="type=='ystv'">
+			<view class="walists" v-for="(ite,idx) in datainfo" :key="idx" @click="getDetail">
+				<view class="watop watopcom" style="padding-bottom: 22rpx !important;">
+					<view class="watit">
+						<view class="tit">1.3 业务流程与工作规范</view>
+					</view>
+					<view class="watopcoma overtwo">业主入住与退房流程、维修报修流程、安全防范措施与应
+急处理、公共区域维护与清洁、物业费收缴与开支管理…</view>
+						
+						<view class="flexcj">
+							<view class="watopcomb">2024-11-18 08:16:54</view>
+							<!-- 管理员 -->
+							<view class="f12 cofe fw5" @click="getReadlist">已读名单</view>
+							<!-- 员工 -->
+							<view class="f12 co27 fw5" >进度:100%</view>
+						</view>
+					
+				</view>
+			</view>
+		</block>
+		<!-- 员工视频 -->
+		<block v-if="type=='ygsp'">
+			<view class="videolists flex" v-for="(ite,idx) in datainfo" :key="idx" @click="getDetail">
+				<view class="flex0 mr12">
+					<video class="videos" id="myVideo" src="https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/2minute-demo.mp4"
+					      @error="videoErrorCallback" :danmu-list="danmuList" enable-danmu danmu-btn controls></video>
+				</view>
+				<view class="flex1 over	titbox">
+					<view class="tit over">1.3 业务流程与工作规范</view>
+					<view class="flexcj">
+						<view class="num">03:41</view>
+						<!-- 管理员 -->
+						<view class="f12 cofe fw5" @click="getReadlist">已读名单</view>
+						<!-- 员工 -->
+						<view class="f12 co27 fw5" >进度:100%</view>
+					</view>
+					<view class="time">2024-11-18 08:16:54</view>
+				</view>
+			</view>
+		</block>
+		<!-- 阅读名单 -->
+		<block v-if="type=='readlist'" >
+			<view class="readlist" v-for="(ite,idx) in datainfo" :key="idx" @click="getDetail">
+				<image class="head" :src="man" v-if="ite.sex==0"></image>
+				<image class="head" :src="woman" v-else></image>
+				<view class="flex1">
+					<view class="tit">袁玥</view>
+					<view class="time"><text>阅读时间 |</text> 2024-12-01   18:37:56</view>
+				</view>
+			</view>
+		</block>
+		<block v-if="type=='readcount'" >
+			<view class="readlist" v-for="(ite,idx) in datainfo" :key="idx" @click="getDetail">
+				<image class="head" :src="man" v-if="ite.sex==0"></image>
+				<image class="head" :src="woman" v-else></image>
+				<view class="flex1">
+					<view class="tit">袁玥</view>
+					<view class="time"><text>阅读总时长 |</text> 8小时54分31秒</view>
+				</view>
+			</view>
+		</block>
+		<view class="shax">{{wtdt}}</view>
+	</block>
+	
+	<!-- 无数据 -->
+	<view class="nodata" v-else>
+		<image :src="noiconpimg"></image>
+		<view>
+			暂无数据
+		</view>
+	</view>
+</view>
+</template>
+
+<script>
+	import { checkPermi, checkRole } from "@/utils/permission"; // 权限判断函数
+	import config from '@/config'
+	export default{
+		props:{
+			datainfo: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			wtdt:{
+				type:String,
+				default () {
+					return ''
+				}
+			},
+			type:{
+				type:String,
+				default () {
+					return 0
+				}
+			},
+			topval:{
+				type:String,
+				default () {
+					return ''
+				}
+			}
+		},
+		data(){
+			return{
+				noiconpimg:require("@/static/nodata.png"),
+				car:require("@/work/static/car/car.png"),
+				cara:require("@/work/static/car/cara.png"),
+				carb:require("@/work/static/car/carb.png"),
+				hicoa:require("@/work/static/people/hicoa.png"),
+				hicob:require("@/work/static/people/hicob.png"),
+				man:require("@/work/static/people/man.png"),
+				woman:require("@/work/static/people/woman.png"),
+				rimg:require("@/work/static/people/rimg.png"),
+				pdel:require("@/work/static/people/pdel.png"),
+				gzlx:require("@/work/static/people/gzlx.png"),
+				mphone:require("@/work/static/people/mphone.png"),
+				time:require("@/work/static/manage/time.png"),
+				house:require("@/work/static/manage/house.png"),
+				housea:require("@/work/static/manage/housea.png"),
+				home:require("@/work/static/service/home.png"),
+				upimg:require("@/static/images/home/up.png"),
+				star:require('@/manage/static/community/star.png'),
+				stara:require('@/manage/static/community/stara.png'),
+				eye:require('@/manage/static/community/eye.png'),
+				baseUrl:config.baseUrl,
+				delBtnWidth:66,//左滑默认宽度
+			}
+		},
+		mounted() {
+			
+		},
+		methods:{
+			checkPermi, checkRole,
+			getDetail(e){
+				this.$emit('getDetail',e)
+			},
+			getAddFn(e){
+				this.$emit('getAddFn',e)
+			},
+			getReadlist(e){
+				this.$emit('getReadlist',e)
+			},
+			getZhan(idx){
+				// var obj=JSON.parse(JSON.stringify(this.datainfo))[idx]
+				// obj.zhanflag=!obj.zhanflag;
+				// this.datainfo.splice(idx,1,obj);
+				this.datainfo[idx].zhanflag=!this.datainfo[idx].zhanflag
+			},
+			getPreview(idx,arr) {
+				var newArr=[];
+				arr.forEach(ite=>{
+					var ds=this.baseUrl+ite
+					newArr.push(ds)
+				})
+				uni.previewImage({
+					urls: newArr,
+					current:idx,
+					success: function(data) {},
+					fail: function(err) {}
+				});
+			},
+			//开始触摸滑动
+			drawStart(e) {
+				// console.log("开始触发");
+				var touch = e.touches[0];
+				this.startX = touch.clientX;
+			},
+			//触摸滑动
+			drawMove(e) {
+				// console.log("滑动");
+				for (var index in this.datainfo) {
+					// this.csListArrl[index].right=0
+					this.$set(this.datainfo[index],'right',0);
+				}
+				var idx=e.currentTarget.dataset.idx
+				var touch = e.touches[0];
+				var item = this.datainfo[idx];
+				var disX = this.startX - touch.clientX;
+				if (disX >= 20) {
+				        if (disX > this.delBtnWidth) {
+					    disX = this.delBtnWidth;
+				        }
+						// this.csListArrl[idx].right=disX
+				        this.$set(this.datainfo[idx],'right',disX);
+				} else {
+					// this.csListArrl[idx].right=0
+					this.$set(this.datainfo[idx],'right',0);
+				}
+			},
+			//触摸滑动结束
+			drawEnd(e) {
+				// console.log("滑动结束");
+				var idx=e.currentTarget.dataset.idx
+				var item = this.datainfo[idx];
+				if (item.right >= this.delBtnWidth / 2) {
+					// this.datainfo[idx].right=this.delBtnWidth
+					this.$set(this.datainfo[idx],'right',this.delBtnWidth);
+				} else {
+					this.datainfo[idx].right=0
+				}
+			},
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+.flex{display: flex;}
+.flexc{display: flex;align-items: center;}
+.mb10{margin-bottom: 20rpx;}
+.carlist{background: #FFFFFF;border-radius: 20rpx;margin-bottom: 24rpx;
+	.ctop{border-bottom: 2rpx solid #E5E5E5;padding:26rpx 24rpx;
+		.imgs{width: 40rpx;height: 42rpx;margin-right: 30rpx;}
+		.tit{font-size: 32rpx;color: #272727;font-weight: bold;margin-right: 14rpx;}
+		.txt{font-weight: 500;font-size: 26rpx;
+			&.ca{color: #3565ED;}
+			&.cb{color: #FE5A0E;}	
+			&.cc{color: #28C529;}	
+		}
+		.txta{font-weight: 500;font-size: 24rpx;color: #AAAAAA;}
+		.num{font-size: 24rpx;color: #AAAAAA;}
+	}
+	.btn{height: 34rpx;border-radius: 18rpx;display: flex;align-items: center;justify-content: center;padding: 0 10rpx;font-size: 22rpx;margin-right: 24rpx;
+		&.btna{border: 2rpx solid #06C770;color: #06C770;}
+		&.btnb{border: 2rpx solid #3565ED;color: #3565ED;}
+		&.btnc{border: 2rpx solid #FE5A0E;color: #FE5A0E;}
+		&.btnbga{border: 1px solid #0156FE;color: #3565ED;background: #DFEAFF;height: 36rpx;}
+		&.btnbgb{border: 1px solid #C1C1C1;color: #666666;background: #F1F1F1;height: 36rpx;}
+		&.btnbgc{border: 1px solid #FE5A0E;color:#FE5A0E;background:#FFEEE6;height: 36rpx;}
+	}
+	.clists{padding: 24rpx 24rpx 8rpx;
+		.clist{font-weight: 500;margin-bottom: 16rpx;
+font-size: 26rpx;color: #272727;display: flex;line-height: 34rpx;
+			.tit{font-size: 26rpx;color: #AAAAAA;flex: 0 0 auto;margin-right: 16rpx;min-width: 108rpx;text-align-last: justify;}
+			.imgas{display: flex;align-items: center;flex-wrap: wrap;
+				image{width: 142rpx;height: 142rpx;margin-right: 30rpx;margin-top: 8rpx;}
+			}	
+		}
+		.w50{
+			.clist{width: 50%;}
+		}
+	}
+}
+// 人员
+.peolist{
+	.ctop{padding: 24rpx 24rpx 22rpx;}
+	.imgs{margin-right: 16rpx !important;}
+	.tit{font-size: 28rpx !important;}
+	.plists{padding: 30rpx 24rpx 6rpx;
+		.plist{background: linear-gradient(-90deg, #F2F5FF 0%, #FBFDFF 100%);border-radius: 20rpx;border: 2rpx solid #E6E6E6;margin-bottom: 24rpx;padding: 18rpx 26rpx 4rpx;
+		.head{width: 96rpx;height: 98rpx;margin-right: 32rpx;flex: 0 0 auto;}
+		.ptit{font-weight: bold;font-size: 30rpx;color: #272727;display: flex;align-items: center;margin-bottom: 14rpx;}	
+		.ptxt{font-weight: 500;font-size: 26rpx;color: #666666;line-height: 36rpx;margin-bottom: 14rpx;min-width: 176rpx;}
+		}
+	}
+	.upimg{width: 26rpx;height: 22rpx;display: block;transform: rotate(180deg);transition: all 0.3s;margin: 0 auto 18rpx;
+		&.act{transform: rotate(0deg);}
+	}
+}
+// 物业费
+.mlistl{width: 40%;display: flex;flex-direction: column;align-items: center;flex: 0 0 auto;
+	.mltit{font-weight: 500;font-size: 26rpx;color: #666666;margin-bottom: 18rpx;}
+	.mltxt{font-weight: bold;font-size: 32rpx;color: #0156FE;}
+}
+.houselist{
+	.clists{padding-bottom: 2rpx !important;}
+	.clist{margin-bottom: 22rpx !important;}
+}
+// 巡更地点
+.patlist{background: #FFFFFF;border-radius: 20rpx;margin-bottom: 24rpx;padding: 0 24rpx 30rpx;
+	.pattop{padding:22rpx 30rpx;margin-bottom: 2rpx;
+		.imgs{width: 28rpx;height: 28rpx;margin-right: 12rpx;}
+		.tit{font-size: 30rpx;color: #272727;font-weight: bold;margin-right: 14rpx;}
+		.txt{font-weight: 500;font-size:24rpx;
+			&.ca{color: #3565ED;}
+			&.cb{color: #FE5A0E;}	
+			&.cc{color: #28C529;}	
+			&.cd{color: #FF6969;}	
+		}
+	}
+	.patlistr{background: #EFF4FF;border-radius: 20rpx;padding: 20rpx 32rpx;
+		.clist{font-weight: 500;font-size: 26rpx;color: #272727;display: flex;line-height: 50rpx;
+			.tit{font-size: 26rpx;flex: 0 0 auto;min-width: 108rpx;text-align-last: justify;font-weight: bold;}
+		}
+	}
+	.patbtns{display: flex;justify-content: flex-end;align-items: center;flex-wrap: wrap;
+		view{min-width: 156rpx;height: 52rpx;font-weight: 500;font-size: 26rpx;background: #FFFFFF;border-radius: 20rpx;box-sizing: border-box;display: flex;align-items: center;justify-content: center;padding: 0 10rpx;margin-left: 24rpx;margin-top: 24rpx;
+		&.btna{border: 2rpx solid #0256FD;color: #0256FD;}
+		&.btnb{background: #0256FD;color: #ffffff;}
+		
+}
+	}
+}
+// 报修
+.walists{background: #FFFFFF;border-radius: 20rpx;margin-bottom: 24rpx;    position: relative;
+	.watop{
+		padding: 0 36rpx 8rpx 38rpx;
+		.watit{padding: 24rpx 0;margin-bottom: 4rpx;display: flex;
+			.tit{font-weight: bold;font-size: 28rpx;color: #272727;flex: 1;
+				.cir{width: 14rpx;margin-left: 8rpx;margin-bottom: 10rpx;height: 14rpx;display: inline-block;background: #FF6969;border-radius: 8rpx;}
+			}
+			.txt{font-weight: bold;font-size: 26rpx;flex: 0 0 auto;
+			}
+		}
+	}
+	.walist{display: flex;font-weight: 500;font-size: 24rpx;color: #666666;margin-bottom: 16rpx;
+		.tit{min-width: 100rpx;text-align-last: justify}
+	}
+	.wabtn{display: flex;align-items: center;justify-content: space-between;border-top: 2rpx solid #E5E5E5;height: 80rpx;padding: 0 38rpx;
+		view{font-weight: 500;font-size: 24rpx;color: #666666;}
+		image{width: 16rpx;height: 28rpx;}
+	}
+}
+// 维修人员
+.stafflist{width: 344rpx;min-height: 256rpx;background: #FFFFFF;border-radius: 20rpx;margin:0 12rpx 24rpx 12rpx;padding-bottom: 20rpx;box-sizing: border-box;
+	// &:nth-of-type(2n){margin-right: 0;}
+	.statop{border-bottom: 2rpx solid #E5E5E5;display: flex;padding: 24rpx 24rpx 22rpx;
+		.head{width: 80rpx;height: 82rpx;margin-right: 24rpx;flex: 0 0 auto;}
+		.stadel{width: 30rpx;height: 30rpx;flex: 0 0 auto;margin-left: 12rpx;}
+		.statit{font-weight: bold;font-size: 30rpx;color: #272727;margin-bottom: 4rpx;}
+		.statxt{font-weight: 500;font-size: 26rpx;
+			.cir{width: 10rpx;height: 10rpx;border-radius: 50%;margin-right: 14rpx;display: inline-block;
+				&.bga{background: #06C770;}
+				&.bgb{background: #FF6969;}
+			}
+		}
+	}
+	.stalist{font-weight: 500;font-size: 26rpx;color: #272727;display: flex;align-items: center;padding: 20rpx 24rpx 0;
+		.imgs{width: 24rpx;height: 30rpx;margin-right: 22rpx;flex: 0 0 auto;display: flex;align-items: center;justify-content: center;
+			.gzlximg{width: 24rpx;height: 28rpx;}
+			.mphone{width: 18rpx;height: 30rpx;}
+		}
+		
+	}
+}
+.watopcom{background-color: #ffffff;border-radius: 20rpx;position: relative;z-index: 1;padding-bottom: 30rpx !important;
+	.watopcoma{font-weight: 500;font-size: 26rpx;color: #666666;line-height: 36rpx;margin-bottom: 24rpx;}
+	.watopcomb{font-weight: 500;font-size: 24rpx;color: #AAAAAA;}
+	
+}
+//资讯
+.newlists{
+	background: #FFFFFF;padding: 22rpx 24rpx;margin-bottom: 24rpx;
+	border-radius: 20rpx;
+	.tit{font-size: 32rpx;font-weight: bold;color: #272727;line-height: 48rpx;margin-bottom:16rpx;}
+	.txt{font-size: 24rpx;color: #666666;line-height: 36rpx;margin-bottom: 32rpx;}
+	.stabox{
+		.time{font-weight: 500;font-size: 24rpx;color: #AAAAAA;line-height: 36rpx;}
+		.btns{font-weight: 500;font-size: 22rpx;color: #666666;line-height: 36rpx;min-width: 100rpx;box-sizing: border-box;margin-left: 20rpx;
+		.imga{width: 24rpx;height: 22rpx;margin-right: 8rpx;}
+		.imgb{width: 24rpx;height: 18rpx;margin-right: 10rpx;}
+		}
+		
+	}
+}
+// 视频
+.videolists{
+	background: #FFFFFF;margin-bottom: 24rpx;border-radius: 20rpx;
+	.titbox{padding-top: 16rpx;padding-right: 38rpx;}
+	.videos{width: 260rpx;height: 180rpx;}
+	.tit{font-weight: bold;font-size: 14px;color: #272727;text-align: left;margin-bottom: 10rpx;}
+	.num{font-weight: 500;font-size: 20rpx;color: #666666;min-width: 68rpx;padding: 0 8rpx;box-sizing: border-box;
+height: 28rpx;background: #E6E6E6;border-radius: 14rpx;line-height: 28rpx;text-align: center;}
+	.time{font-weight: 500;font-size: 24rpx;color: #AAAAAA;margin-top: 44rpx;}
+
+}
+
+// 名单
+.readlist{background: #FFFFFF;border-radius: 20rpx;border: 2rpx solid #E6E6E6;margin-bottom: 24rpx;padding: 24rpx;display: flex;align-items: center;box-sizing: border-box;
+	.head{width: 96rpx;height: 96rpx;margin-right: 28rpx;flex: 0 0 auto;}
+	.tit{font-weight: bold;font-size: 30rpx;color: #272727;margin-bottom: 12rpx;}
+	.time{font-weight: 500;font-size: 26rpx;color: #666666;line-height: 36rpx;
+		text{margin-right: 12rpx;display: inline-block;}
+	}
+}
+.spdel{width: 164rpx;background: #EA2D2D;font-weight: bold;font-size: 26rpx;color: #FFFFFF;display: flex;align-items: center;justify-content: center;position: absolute;right: -146rpx;top: 0;bottom: 0;padding-left: 14rpx;}
+
+// 无数据
+.nodata{display: flex;flex-direction: column;align-items: center;
+	image{width: 440rpx;height: 440rpx;}
+	view{font-size: 30rpx;color: #666666;font-weight: bold;}
+}
+</style>

+ 225 - 0
property_ui/manage/components/editor/editor.vue

@@ -0,0 +1,225 @@
+<template>
+	<view class="container">
+		<view class="page-body">
+			<view class='wrapper'>
+				<view class='toolbar' @tap="format" style="height: 120px;overflow-y: auto;">
+					<view :class="formats.bold ? 'ql-active' : ''" class="iconfont icon-zitijiacu" data-name="bold">
+					</view>
+					<view :class="formats.italic ? 'ql-active' : ''" class="iconfont icon-zitixieti" data-name="italic">
+					</view>
+					<view :class="formats.underline ? 'ql-active' : ''" class="iconfont icon-zitixiahuaxian"
+						data-name="underline"></view>
+					<view :class="formats.strike ? 'ql-active' : ''" class="iconfont icon-zitishanchuxian"
+						data-name="strike"></view>
+					<!-- #ifndef MP-BAIDU -->
+					<view :class="formats.align === 'left' ? 'ql-active' : ''" class="iconfont icon-zuoduiqi"
+						data-name="align" data-value="left"></view>
+					<!-- #endif -->
+					<view :class="formats.align === 'center' ? 'ql-active' : ''" class="iconfont icon-juzhongduiqi"
+						data-name="align" data-value="center"></view>
+					<view :class="formats.align === 'right' ? 'ql-active' : ''" class="iconfont icon-youduiqi"
+						data-name="align" data-value="right"></view>
+					<view :class="formats.align === 'justify' ? 'ql-active' : ''" class="iconfont icon-zuoyouduiqi"
+						data-name="align" data-value="justify"></view>
+					<!-- #ifndef MP-BAIDU -->
+					<view :class="formats.lineHeight ? 'ql-active' : ''" class="iconfont icon-line-height"
+						data-name="lineHeight" data-value="2"></view>
+					<view :class="formats.letterSpacing ? 'ql-active' : ''" class="iconfont icon-Character-Spacing"
+						data-name="letterSpacing" data-value="2em"></view>
+					<view :class="formats.marginTop ? 'ql-active' : ''" class="iconfont icon-722bianjiqi_duanqianju"
+						data-name="marginTop" data-value="20px"></view>
+					<view :class="formats.marginBottom ? 'ql-active' : ''" class="iconfont icon-723bianjiqi_duanhouju"
+						data-name="marginBottom" data-value="20px"></view>
+					<!-- #endif -->
+
+					<view class="iconfont icon-clearedformat" @tap="removeFormat"></view>
+
+					<!-- #ifndef MP-BAIDU -->
+					<view :class="formats.fontFamily ? 'ql-active' : ''" class="iconfont icon-font"
+						data-name="fontFamily" data-value="Pacifico"></view>
+					<view :class="formats.fontSize === '24px' ? 'ql-active' : ''" class="iconfont icon-fontsize"
+						data-name="fontSize" data-value="24px"></view>
+					<!-- #endif -->
+					<view :class="formats.color === '#0000ff' ? 'ql-active' : ''" class="iconfont icon-text_color"
+						data-name="color" data-value="#0000ff"></view>
+					<view :class="formats.backgroundColor === '#00ff00' ? 'ql-active' : ''"
+						class="iconfont icon-fontbgcolor" data-name="backgroundColor" data-value="#00ff00"></view>
+					<view class="iconfont icon-date" @tap="insertDate"></view>
+					<view class="iconfont icon--checklist" data-name="list" data-value="check"></view>
+					<view :class="formats.list === 'ordered' ? 'ql-active' : ''" class="iconfont icon-youxupailie"
+						data-name="list" data-value="ordered"></view>
+					<view :class="formats.list === 'bullet' ? 'ql-active' : ''" class="iconfont icon-wuxupailie"
+						data-name="list" data-value="bullet"></view>
+
+					<view class="iconfont icon-undo" @tap="undo"></view>
+					<view class="iconfont icon-redo" @tap="redo"></view>
+
+					<view class="iconfont icon-outdent" data-name="indent" data-value="-1"></view>
+					<view class="iconfont icon-indent" data-name="indent" data-value="+1"></view>
+					<view class="iconfont icon-fengexian" @tap="insertDivider"></view>
+					<view class="iconfont icon-charutupian" @tap="insertImage"></view>
+					<view :class="formats.header === 1 ? 'ql-active' : ''" class="iconfont icon-format-header-1"
+						data-name="header" :data-value="1"></view>
+					<view :class="formats.script === 'sub' ? 'ql-active' : ''" class="iconfont icon-zitixiabiao"
+						data-name="script" data-value="sub"></view>
+					<view :class="formats.script === 'super' ? 'ql-active' : ''" class="iconfont icon-zitishangbiao"
+						data-name="script" data-value="super"></view>
+
+					<view class="iconfont icon-shanchu" @tap="clear"></view>
+
+					<view :class="formats.direction === 'rtl' ? 'ql-active' : ''" class="iconfont icon-direction-rtl"
+						data-name="direction" data-value="rtl"></view>
+				</view>
+
+				<view class="editor-wrapper">
+					<editor id="editor" class="ql-container" placeholder="开始输入..." show-img-size show-img-toolbar
+						show-img-resize @statuschange="onStatusChange" :read-only="readOnly" @ready="onEditorReady">
+					</editor>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+<script>
+	export default {
+		data() {
+			return {
+				readOnly: false,
+				formats: {}
+			}
+		},
+		onLoad() {
+			// #ifndef MP-BAIDU
+			uni.loadFontFace({
+				family: 'Pacifico',
+				source: 'url("https://sungd.github.io/Pacifico.ttf")'
+			})
+			// #endif
+		},
+		methods: {
+			readOnlyChange() {
+				this.readOnly = !this.readOnly
+			},
+			onEditorReady() {
+				// #ifdef MP-BAIDU
+				this.editorCtx = requireDynamicLib('editorLib').createEditorContext('editor');
+				// #endif
+
+				// #ifdef APP-PLUS || MP-WEIXIN || H5
+				uni.createSelectorQuery().select('#editor').context((res) => {
+					this.editorCtx = res.context
+				}).exec()
+				// #endif
+			},
+			undo() {
+				this.editorCtx.undo()
+			},
+			redo() {
+				this.editorCtx.redo()
+			},
+			format(e) {
+				let {
+					name,
+					value
+				} = e.target.dataset
+				if (!name) return
+				// console.log('format', name, value)
+				this.editorCtx.format(name, value)
+			},
+			onStatusChange(e) {
+				const formats = e.detail
+				this.formats = formats
+			},
+			insertDivider() {
+				this.editorCtx.insertDivider({
+					success: function() {
+						console.log('insert divider success')
+					}
+				})
+			},
+			clear() {
+				uni.showModal({
+					title: '清空编辑器',
+					content: '确定清空编辑器全部内容?',
+					success: res => {
+						if (res.confirm) {
+							this.editorCtx.clear({
+								success: function(res) {
+									console.log("clear success")
+								}
+							})
+						}
+					}
+				})
+			},
+			removeFormat() {
+				this.editorCtx.removeFormat()
+			},
+			insertDate() {
+				const date = new Date()
+				const formatDate = `${date.getFullYear()}/${date.getMonth() + 1}/${date.getDate()}`
+				this.editorCtx.insertText({
+					text: formatDate
+				})
+			},
+			insertImage() {
+				uni.chooseImage({
+					count: 1,
+					success: (res) => {
+						this.editorCtx.insertImage({
+							src: res.tempFilePaths[0],
+							alt: '图像',
+							success: function() {
+								console.log('insert image success')
+							}
+						})
+					}
+				})
+			}
+		}
+	}
+</script>
+<style>
+	@import "@/static/editor-icon.css";
+
+	.page-body {
+		height: calc(100vh - var(--window-top) - var(--status-bar-height));
+	}
+
+	.wrapper {
+		height: 100%;
+	}
+
+	.editor-wrapper {
+		height: calc(100vh - var(--window-top) - var(--status-bar-height) - 140px);
+		background: #fff;
+	}
+
+	.iconfont {
+		display: inline-block;
+		padding: 8px 8px;
+		width: 24px;
+		height: 24px;
+		cursor: pointer;
+		font-size: 20px;
+	}
+
+	.toolbar {
+		box-sizing: border-box;
+		border-bottom: 0;
+		font-family: 'Helvetica Neue', 'Helvetica', 'Arial', sans-serif;
+	}
+
+	.ql-container {
+		box-sizing: border-box;
+		width: 100%;
+		min-height: 30vh;
+		height: 100%;
+		font-size: 16px;
+		line-height: 1.5;
+	}
+
+	.ql-active {
+		color: #06c;
+	}
+</style>

+ 39 - 0
property_ui/manage/components/nodata/nodata.vue

@@ -0,0 +1,39 @@
+<template>
+	<view class="nodata" :style="'padding-top:'+padtop+'rpx'">
+		<image :src="noiconpimg"></image>
+		<view>{{notxt}}</view>
+	</view>
+</template>
+
+<script>
+	export default{
+		props:{
+			notxt:{
+				type: String,
+				default () {
+					return '暂无数据'
+				}
+			},
+			padtop:{
+				type: Number,
+				default () {
+					return 100
+				}
+			}
+		},
+		data(){
+			return{
+				noiconpimg:require("@/static/nodata.png"),
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+// 无数据
+.nodata{
+	display: flex;flex-direction: column;align-items: center;box-sizing: border-box;padding-bottom: 100rpx;
+	image{width: 456rpx;height: 178rpx;margin-bottom: 28rpx;}
+	view{font-size: 30rpx;color: #AAAAAA;font-weight: bold;}
+}	
+</style>

+ 24 - 0
property_ui/manage/components/zb-table/all.js

@@ -0,0 +1,24 @@
+export const column1 = [
+    // { type:'index', label: '序号',align:'center',fixed:true,},
+    { name: 'entranceGuardName', label: '门禁名称',align:'center',align:'center',emptyString:'--' },
+    { name: 'type', label: '开门类型',align:'center',type:"format",key:"kgmlist"},
+    { name: 'controlsTime', label: '开/关门时间',align:'center',},
+    { name: 'pictureUrl', label: '抓拍图片',align:'center',type:"img",},
+    // { name: 'sex', label: '性别',filters:{0:'男',1:'女'}},
+ //    { name: 'sx', label: '数学',sorter:true },
+ //    { name: 'yy', label: '英语',sorter:true },
+	// { name: 'operation', type:'operation',label: '操作',renders:[
+	// 	{
+	// 	    name:'编辑',
+	// 	    func:'edit' // func 代表子元素点击的事件 父元素接收的事件 父元素 @edit
+	// 	  },
+	// 	  {
+	// 	    name:'删除',
+	// 	    type:'warn',
+	// 	    func:"dele"
+	// 	  },
+	// ]},
+
+]
+
+

+ 180 - 0
property_ui/manage/components/zb-table/components/table-checkbox.vue

@@ -0,0 +1,180 @@
+<template>
+	<view class="uni-table-checkbox" @click.stop="selected">
+		<view v-if="!indeterminate" class="checkbox__inner" :class="{'is-checked':isChecked,'is-disable':isDisabled}">
+			<view class="checkbox__inner-icon"></view>
+		</view>
+		<view v-else class="checkbox__inner checkbox--indeterminate">
+			<view class="checkbox__inner-icon"></view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'TableCheckbox',
+		emits:['checkboxSelected'],
+		props: {
+			indeterminate: {
+				type: Boolean,
+				default: false
+			},
+			checked: {
+				type: [Boolean,String],
+				default: false
+			},
+			disabled: {
+				type: Boolean,
+				default: false
+			},
+			index: {
+				type: Number,
+				default: -1
+			},
+			cellData: {
+				type: Object,
+				default () {
+					return {}
+				}
+			}
+		},
+		watch:{
+			checked(newVal){
+				if(typeof this.checked === 'boolean'){
+					this.isChecked = newVal
+				}else{
+					this.isChecked = true
+				}
+			},
+			indeterminate(newVal){
+				this.isIndeterminate = newVal
+			}
+		},
+		data() {
+			return {
+				isChecked: false,
+				isDisabled: false,
+				isIndeterminate:false
+			}
+		},
+		created() {
+			if(typeof this.checked === 'boolean'){
+				this.isChecked = this.checked
+			}
+			this.isDisabled = this.disabled
+		},
+		methods: {
+			selected() {
+				if (this.isDisabled) return
+				this.isIndeterminate = false
+				this.isChecked = !this.isChecked
+        console.log('===',this.indeterminate,this.isChecked)
+				this.$emit('checkboxSelected', {
+					checked: this.isChecked,
+					data: this.cellData
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	$checked-color: #007aff;
+	$border-color: #DCDFE6;
+	$disable:0.4;
+
+	.uni-table-checkbox {
+		display: flex;
+		flex-direction: row;
+		align-items: center;
+		justify-content: center;
+		position: relative;
+		margin: 10rpx 0;
+		cursor: pointer;
+
+		// 多选样式
+		.checkbox__inner {
+			/* #ifndef APP-NVUE */
+			flex-shrink: 0;
+			box-sizing: border-box;
+			/* #endif */
+			position: relative;
+			width: 32rpx;
+			height: 32rpx;
+			border: 2rpx solid $border-color;
+			border-radius: 4rpx;
+			background-color: #fff;
+			z-index: 1;
+
+			.checkbox__inner-icon {
+				position: absolute;
+				/* #ifdef APP-NVUE */
+				top: 4rpx;
+				/* #endif */
+				/* #ifndef APP-NVUE */
+				top: 4rpx;
+				/* #endif */
+				left: 10rpx;
+				height: 14rpx;
+				width: 6rpx;
+				border: 2rpx solid #fff;
+				border-left: 0;
+				border-top: 0;
+				opacity: 0;
+				transform-origin: center;
+				transform: rotate(45deg);
+				box-sizing: content-box;
+			}
+
+			&.checkbox--indeterminate {
+				border-color: $checked-color;
+				background-color: $checked-color;
+
+				.checkbox__inner-icon {
+					position: absolute;
+					opacity: 1;
+					transform: rotate(0deg);
+					height: 4rpx;
+					top: 0;
+					bottom: 0;
+					margin: auto;
+					left: 0px;
+					right: 0px;
+					bottom: 0;
+					width: auto;
+					border: none;
+					border-radius: 4rpx;
+					transform: scale(0.5);
+					background-color: #fff;
+				}
+			}
+			&:hover{
+				border-color: $checked-color;
+			}
+			// 禁用
+			&.is-disable {
+				/* #ifdef H5 */
+				cursor: not-allowed;
+				/* #endif */
+				background-color: #F2F6FC;
+				border-color: $border-color;
+			}
+
+			// 选中
+			&.is-checked {
+				border-color: $checked-color;
+				background-color: $checked-color;
+
+				.checkbox__inner-icon {
+					opacity: 1;
+					transform: rotate(45deg);
+				}
+
+				// 选中禁用
+				&.is-disable {
+					opacity: $disable;
+				}
+			}
+
+		}
+	}
+</style>

+ 78 - 0
property_ui/manage/components/zb-table/components/table-h5-summary.vue

@@ -0,0 +1,78 @@
+<template>
+  <view class="table-h5-footer top-header-uni" :style="{paddingRight:`${scrollbarSize}rpx`}">
+    <scroll-view class="zb-table-headers"
+                 @scroll="handleFooterTableScrollLeft"
+                 scroll-x="true"
+                 scroll-y="false"
+                 id="tableFooterHeaders"
+                 scroll-anchoring="true"
+                 :scroll-left="headerFooterTableLeft"
+                 style="padding-bottom: 0px;
+						background: #fafafa;height: 100%">
+      <view class="zb-table-fixed" >
+        <view class="zb-table-thead" style="position: relative;" >
+          <view class="item-tr">
+            <view
+                class="item-th"
+                :style="{
+	                              width:`${item.width?item.width:'200'}rpx`,
+															  flex:index===transColumns.length-1?1:'none',
+															  minWidth:`${item.width?item.width:'200'}rpx`,
+															  borderRight:`${border?'2rpx solid #e8e8e8':''}`,
+															  borderTop:`${border?'2rpx solid #e8e8e8':''}`,
+															  textAlign:item.align||'left'
+														  }"
+                v-for="(item,index) in transColumns" :key="index">
+              {{ sums[index] }}
+            </view>
+          </view>
+        </view>
+      </view>
+    </scroll-view>
+  </view>
+</template>
+<script>
+import summary from '../js/summary.js'
+export default {
+  name:'table-footer',
+  mixins:[summary],
+}
+</script>
+<style lang="scss" scoped>
+.table-h5-footer {
+  background: #fafafa;
+  /*每个页面公共css */
+  scroll-view ::-webkit-scrollbar {
+    display: none !important;
+    width: 0 !important;
+    height: 0 !important;
+    -webkit-appearance: none;
+    background: transparent;
+  }
+  //第二种
+  ::-webkit-scrollbar{
+    display: none;
+  }
+  .item-tr{
+    display: flex;
+  }
+  .item-th{
+    padding-left: 8rpx;
+    line-height: 78rpx;
+    height: 80rpx;
+    //display: flex;
+    //align-items: center;
+    box-sizing: border-box;
+    flex-shrink: 0;
+    width: 200rpx;
+    padding-right: 8rpx;
+    word-break: keep-all;
+    white-space: nowrap;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    overflow-wrap: break-word;
+    border-bottom: 2rpx solid #e8e8e8;
+  }
+
+}
+</style>

+ 59 - 0
property_ui/manage/components/zb-table/components/table-side-summary.vue

@@ -0,0 +1,59 @@
+<template>
+  <view class="zb-table-header" style="display: flex;" >
+    <view class="item-tr" >
+      <view class='item-td'
+            :style="{
+	                       width:`${item.width?item.width:'200'}rpx`,
+	                       borderRight:`${border?'2rpx solid #e8e8e8':''}`,
+	                       textAlign:item.align||'left'
+	                      }"
+            :key="`${index}`"
+            v-for="(item,index) in fixedLeftColumns">
+        <template >
+          {{sums[index]}}
+        </template>
+      </view>
+    </view>
+  </view>
+
+</template>
+<script>
+import summary from '../js/summary.js'
+export default {
+  mixins:[summary]
+}
+</script>
+<style lang="scss" scoped>
+.zb-table-header {
+  overflow: hidden;
+  background: #fafafa;
+  .item-th{
+    padding-left: 8rpx;
+    line-height: 78rpx;
+    height: 80rpx;
+    //display: flex;
+    //align-items: center;
+    box-sizing: border-box;
+  }
+}
+.item-tr{
+  display: flex;
+  box-sizing: border-box;
+}
+.item-td{
+  flex-shrink: 0;
+  width: 200rpx;
+  padding-left:8rpx;
+  height: 80rpx;
+  line-height: 80rpx;
+  padding-right: 8rpx;
+  box-sizing: border-box;
+  word-break: keep-all;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  overflow-wrap: break-word;
+  border-bottom: 2rpx solid #e8e8e8;
+  background: rgb(250, 250, 250);
+}
+</style>

+ 77 - 0
property_ui/manage/components/zb-table/components/table-summary.vue

@@ -0,0 +1,77 @@
+<template>
+  <view class="zb-table-footer" style="height: 80rpx;">
+    <view class="zb-table-fixed" >
+      <view class="zb-table-thead" style="position: relative;" >
+        <view class="item-tr">
+          <view
+              :class="['item-th',index <fixedLeftColumns.length&&'zb-stick-side']"
+              :style="{
+	                              left:`${item.left}rpx`,
+	                              width:`${item.width?item.width:'200'}rpx`,
+															  flex:index===transColumns.length-1?1:'none',
+															  minWidth:`${item.width?item.width:'200'}rpx`,
+															   borderRight:`${border?'2rpx solid #e8e8e8':''}`,
+															  borderTop:`${border?'2rpx solid #e8e8e8':''}`,
+															   textAlign:item.align||'left'
+														  }"
+              v-for="(item,index) in transColumns" :key="index">
+            <template>
+              {{ sums[index]||item.emptyString }}
+            </template>
+          </view>
+        </view>
+      </view>
+    </view>
+  </view>
+</template>
+<script>
+  import summary from '../js/summary.js'
+  export default {
+    mixins:[summary]
+  }
+</script>
+<style lang="scss" scoped>
+  .zb-table-footer {
+    background: #fafafa;
+    width: fit-content;
+    min-width: 100%;
+    position: sticky;
+    bottom: 0;
+    z-index: 2;
+    .item-tr{
+      display: flex;
+      min-width: 100%;
+    }
+    .item-th{
+      padding-left: 8rpx;
+      line-height: 78rpx;
+      height: 80rpx;
+      //display: flex;
+      //align-items: center;
+      box-sizing: border-box;
+      flex-shrink: 0;
+      width: 200rpx;
+      padding-right: 8rpx;
+      word-break: keep-all;
+      white-space: nowrap;
+      overflow: hidden;
+      text-overflow: ellipsis;
+      overflow-wrap: break-word;
+      border-bottom: 2rpx solid #e8e8e8;
+    }
+    .zb-table-fixed{
+      min-width: 100%;
+
+    }
+    .zb-stick-side{
+      position: sticky;
+      bottom:0 ;
+      left: 0;
+      z-index: 2;
+      //border-right: solid 1rpx #dbdbdb;
+      box-sizing: border-box;
+      background: #fafafa;
+      //box-shadow: 6px 0 6px -4px #ccc;
+    }
+  }
+</style>

+ 50 - 0
property_ui/manage/components/zb-table/components/zb-load-more.vue

@@ -0,0 +1,50 @@
+<template >
+  <view class="zb-load-more">
+    <image :src="base64Flower" style="" class="loading-custom-image"></image>
+    <text>正在加载中...</text>
+  </view>
+</template>
+<script>
+const base64Flower = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkBAMAAACCzIhnAAAAKlBMVEVHcEzDw8Ovr6+pqamUlJTCwsKenp61tbWxsbGysrLNzc2bm5u5ubmjo6MpovhuAAAACnRSTlMA/P79/sHDhiZS0DxZowAABBBJREFUWMPtl89rE0EUx7ctTXatB3MI1SWnDbUKPUgXqh4ED8Uf7KUVSm3ooVSpSii0Fn/gD4j4o+APiEoVmos9FO2celiqZVgwgaKHPQiCCkv+F99kM7Ozm5kxq1dfD91k9pPve9/3ZjbRNHHok/mKli4eIPNgSuRObuN9SqSEzM20iGnm0yIbqCuV7NSSSIV7uyPM6JMBYdeTOanh/QihJYZsUCSby+VkMj2AvOt0rAeQAwqE3lfKMZVlQCZk1QOCKkkVPadITCfIRNKxfoJI5+0OIFtJx14CMSg1mRSDko7VAfksRQzEbGYqxOJcVTWMCH2I1/IACNW0PWU2M8cmAVHtnH5mM1VRWtwKZjOd5JbF6s1IbaYqaotjNlPHgDAnlAizubTR6ovMYn052g/U5qcmOpi0WL8xTS/3IfSet5m8MEr5ajjF5le6dq/OJpobrdY0t3i9QgefWrxW9/1BLhk0E9m8FeUMhhXal499iD0eQRfDF+ts/tttORRerfp+oV7f4xJj82iUYm1Yzod+ZQEAlS/8mMBwKebVmCVp1f0JLS6zKd17+iwRKTARVg2SHtz3iEbBH+Q+U28zW2Jiza8Tjb1YFoYZMsJyjDqp3M9XBQdSdPLFdxEpvOB37JrHcmR/y9+LgoTlCFGZEa2sc6d4PGlweEa2JSVPoVm+IfGG3ZL037iV9oH+P+Jxc4HGVflNq1M0pivao/EopO4b/ojVCP9GjmiXOeS0DOn1o/iiccT4ORnyvBGF3yUywkQajW4Ti0SGuiy/wVSg/L8w+X/8Q+hvUx8Xd90z4oV5a1i88MbFWHz0WZZ1UrTwBGPX3Rat9AFiXRMRjoMdIdJLEOt2h7jrYOzgOamKZSWSNspOS0X8SAqRYmxRL7sg4eLzYmNehcxh3uoyud/BH2Udux4ywxFTc1xC7Mgf4vMhc5S+kSH3Y7yj+qpwIWSoPTVCOOPVthGx9FbGqrwFw6wSFxJr+17zeKcztt3u+2roAEVgUjDd+AHGuxHy2rZHaa8JMkTHEeyi85ANPO9j9BVuBRD2FY5LDMo/Sz/2hReqGIs/KiFin+CsPsYO/yvM3jL2vE8EbX7/Bf8ejtr2GLN65bioAdgLd8Bis/mD5GmP2qeqyo2ZwQEOtAjRIDH7mBKpUcMoApbZJ5UIxkEwxyMZyMxW/uKFvHCFR3SSmerHyDNQ2dF4JG6zIMpBgLfjSF9x1D6smFcYnGApjmSLICO3ecCDWrQ48geba9DI3STy2i7ax6WIB62fSyIZIiO3GFQqSURp8wCo7GhJBGwuSovJBNjb7kT6FPVnIa9qJ2Ko+l9mefGIdinaMp0yC1URYiwsdfNE45EuA5Cx9EhalfvN5s+UyItm81vaB3p4joniN+SCP7Qc1hblAAAAAElFTkSuQmCC';
+export default {
+  data(){
+    return{
+      base64Flower
+    }
+  }
+}
+</script>
+<style lang="scss" scoped>
+.zb-load-more {
+  width: 100%;
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  z-index: 999;
+  background: white;
+  display: flex;
+  height: 80rpx;
+  flex-shrink: 0;
+  align-items: center;
+  justify-content: center;
+  .loading-custom-image{
+    color: #a4a4a4;
+    margin-right: 8rpx;
+    width: 48rpx;
+    height: 48rpx;
+    /* #ifndef APP-NVUE */
+    animation: loading-circle 1s linear infinite;
+    /* #endif */
+  }
+  @keyframes loading-circle {
+    0% {
+      -webkit-transform: rotate(0deg);
+      transform: rotate(0deg);
+    }
+    100% {
+      -webkit-transform: rotate(360deg);
+      transform: rotate(360deg);
+    }
+  }
+}
+</style>

+ 88 - 0
property_ui/manage/components/zb-table/js/summary.js

@@ -0,0 +1,88 @@
+export default {
+    props:{
+        scrollbarSize:{
+            type:Number,
+            default:0
+        },
+        fixedLeftColumns:{
+            type:Array,
+            default:()=>[]
+        },
+        data:{
+            type:Array,
+            default:()=>[]
+        },
+        transColumns:{
+            type:Array,
+            default:()=>[]
+        },
+        border:{
+            type:Boolean,
+            default:false
+        },
+        showSummary:{
+            type:Boolean,
+            default:false
+        },
+        summaryMethod:{
+            type:Function
+        },
+        sumText:{
+            type:String,
+            default:'合计'
+        },
+        headerFooterTableLeft:{
+            type:Number,
+            default:0
+        },
+        handleFooterTableScrollLeft:Function,
+    },
+    data(){
+        return{
+            sums:[]
+        }
+    },
+    watch:{
+        'data':{
+            deep:true,
+            immediate:true,
+            handler(newValue,oldValue){
+                let sums = [];
+                if (this.summaryMethod) {
+                    sums = this.summaryMethod({ columns: this.transColumns, data: this.data });
+                } else {
+                    this.transColumns.forEach((column, index) => {
+                        if (index === 0) {
+                            sums[index] = this.sumText;
+                            return;
+                        }
+                        const values = this.data.map(item => Number(item[column.name]));
+                        const precisions = [];
+                        let notNumber = true;
+                        values.forEach(value => {
+                            if (!isNaN(value)) {
+                                notNumber = false;
+                                let decimal = ('' + value).split('.')[1];
+                                precisions.push(decimal ? decimal.length : 0);
+                            }
+                        });
+                        const precision = Math.max.apply(null, precisions);
+                        if (!notNumber) {
+                            sums[index] = values.reduce((prev, curr) => {
+                                const value = Number(curr);
+                                if (!isNaN(value)) {
+                                    return parseFloat((prev + curr).toFixed(Math.min(precision, 20)));
+                                } else {
+                                    return prev;
+                                }
+                            }, 0);
+                        } else {
+                            sums[index] = '';
+                        }
+                    });
+                }
+                this.sums = sums
+            },
+        }
+    }
+}

+ 51 - 0
property_ui/manage/components/zb-table/js/util.js

@@ -0,0 +1,51 @@
+/**
+ * 获取滚动条宽度
+ */
+let cached = undefined;
+
+export const getScrollbarSize = fresh => {
+	// #ifdef H5
+	
+    if (fresh || cached === undefined) {
+        let inner = document.createElement("div");
+        let innerStyle = inner.style;
+
+        innerStyle.width = "100%";
+        innerStyle.height = "200px";
+
+        let outer = document.createElement("div");
+        let outerStyle = outer.style;
+
+        outerStyle.position = "absolute";
+        outerStyle.top = 0;
+        outerStyle.left = 0;
+        outerStyle.pointerEvents = "none";
+        outerStyle.width = "200px";
+        outerStyle.height = "150px";
+        outerStyle.visibility = "hidden";
+
+        outer.appendChild(inner);
+        document.body.appendChild(outer);
+
+        // 设置子元素超出部分隐藏
+        outerStyle.overflow = "hidden";
+
+        let width1 = inner.offsetWidth;
+
+        // 设置子元素超出部分滚动
+        outer.style.overflow = "scroll";
+
+        let width2 = inner.offsetWidth;
+
+        if (width1 === width2) {
+            width2 = outer.clientWidth;
+        }
+
+        document.body.removeChild(outer);
+
+        cached = width1 - width2;
+    }
+	//#endif
+
+    return cached;
+};

+ 1255 - 0
property_ui/manage/components/zb-table/zb-table.vue

@@ -0,0 +1,1255 @@
+<template>
+	<!-- #ifdef H5 || APP-PLUS -->
+	<view :class="['zb-table','zb-table-fixed-header',!border&&(bodyTableLeft>50||headerTableLeft>50)&&'scroll-left-fixed']">
+	  <view class="zb-table-content" style="flex: 1">
+	    <view class="zb-table-scroll" style="height: 100%;">
+	      <template v-if="showHeader">
+	        <view class="zb-table-header top-header-uni" :style="{paddingRight:`${scrollbarSize}px`}"
+          >
+	          <scroll-view class="zb-table-headers"
+							@touchmove.stop="getMove"
+	                       @scroll="handleTableScrollLeft"
+	                       scroll-x="true"
+	                       scroll-y="false"
+	                       id="tableHeaders"
+	                       scroll-anchoring="true"
+	                       :scroll-left="headerTableLeft"
+	                       style="
+						height: 100%">
+	            <view class="zb-table-fixed" >
+	              <view class="zb-table-thead" style="position: relative;" >
+	                <view class="item-tr">
+	                  <view
+	                      @click.stop="sortAction(item,index)"
+	                      class="item-th"
+	                      :style="[{
+	                              width:`${item.width?item.width:'100'}px`,
+															  flex:index===transColumns.length-1?1:'none',
+															  minWidth:`${item.width?item.width:'100'}px`,
+															  borderRight:`${border?'1px solid #e8e8e8':''}`,
+															  borderRight:`${(scrollbarSize&&index===transColumns.length-1)?'':border?'1px solid #e8e8e8':''}`,
+															  borderTop:`${border?'1px solid #e8e8e8':''}`,
+															  textAlign:item.align||'left'
+														  },getHeaderCellStyle(item,index)]"
+	                      v-for="(item,index) in transColumns" :key="index">
+                      <template v-if="item.type==='selection'">
+                        <view class="checkbox-item">
+                          <tableCheckbox
+                              :indeterminate="indeterminate" :checked="checkedAll" @checkboxSelected="checkboxSelectedAll"></tableCheckbox>
+                        </view>
+                      </template>
+                      <template v-else>
+                        {{ item.label }}
+                        <view class="sorter-table" v-if="item.sorter">
+                          <view :class="['sorter-table-icon',item.sorterMode==='_asc'&&`sorting${item.sorterMode||''}`]"></view>
+                          <view :class="['sorter-table-icon',item.sorterMode==='_desc'&&`sorting${item.sorterMode||''}`]"></view>
+                        </view>
+                      </template>
+                    </view>
+	                </view>
+	              </view>
+	            </view>
+	          </scroll-view>
+	        </view>
+	      </template>
+	      <template v-if="!data.length">
+	        <view class="no-data">暂无数据~~</view>
+	      </template>
+	      <scroll-view
+            class="zb-table-body" ref="tableBody"	scroll-x="true"	scroll-y="true"	id="tableBody"
+	                   :lower-threshold="40"
+	                   :upper-threshold="10"
+					   @touchmove.stop="getMove"
+                     @scrolltolower="scrolltolower"
+	                   @scrolltoupper="(e)=>debounce(scrollToLeft)(e)"
+                     @scroll="handleBodyScroll"	:scroll-left="bodyTableLeft"	:scroll-top="bodyScrollTop"
+                     :style=" `height: calc(100% - ${showSummary?80:40}px)`" >
+	          <view class="zb-table-fixed">
+	            <view class="zb-table-tbody">
+	              <view  :class="['item-tr',highlight&&isHighlight(item,index)?'current-row':'']"
+                       @click.stop="rowClick(item,index)"
+	                     v-for="(item,index) in transData" :key="item.key" >
+	                <view
+	                    :style="[{
+									              width:`${ite.width?ite.width:'100'}px`,
+															  flex:i===transColumns.length-1?1:'none',
+															  minWidth:`${ite.width?ite.width:'100'}px`,
+															  borderRight:`${border?'1px solid #e8e8e8':''}`,
+                                textAlign:ite.align||'left',
+														  },cellStyle&&getCellStyle(item,ite,index,i)]"
+
+	                    :class="['item-td',stripe?(index % 2) != 0?'odd':'even':'']"
+	                    v-for="(ite,i) in transColumns" :key="i">
+	                  <template  v-if="ite.type==='operation'">
+	                    <view style="display: flex;align-items: center;height: 100%">
+	                      <view
+                            v-for="ren,ind in permission(item,ite.renders,index)"
+	                          :key="ind"
+	                          @click.stop="$emit(ren.func,item,index)"
+	                          :style="{
+	                          display:'flex',
+	                          alignItems: 'center',
+	                          marginRight:ite.renders.length>1?'8px':'0'
+	                        }">
+                          <template v-if="ren.type==='custom'">
+                            <view :class="ren.class||''" style="cursor: pointer">
+                              {{ren.name}}
+                            </view>
+                          </template>
+                          <template v-else>
+                            <button
+                                :class="ren.class||''"
+                                :type="ren.type||'primary'" :size="ren.size||'mini'">{{ren.name}}</button>
+                          </template>
+	                      </view>
+	                    </view>
+	                  </template>
+                    <template v-else-if="ite.type==='selection'">
+                      <view class="checkbox-item">
+                        <tableCheckbox @checkboxSelected="(e)=>checkboxSelected(e,item)" :cellData="item" :checked="item.checked"/>
+                      </view>
+                    </template>
+                    <template v-else-if="ite.type==='index'">
+                      {{index+1}}
+                    </template>
+                  <template v-else-if="ite.type==='img'">
+                    <view class="checkbox-item">
+                      <image
+                    @click.stop="previewImage(item,item[ite.name],index)"
+                    v-if="item[ite.name]"
+                    :show-menu-by-longpress="false"
+                    :src="item[ite.name]" style="width: 40px;height:30px; " mode="aspectFit"></image>
+                    <text v-else>{{ite.emptyString}}</text>
+                    </view>
+                  </template>
+	                  <template  v-else>
+<!--                      {{ ite.filters?itemFilter(item,ite):(item[ite.name]==null||item[ite.name]==='')?ite.emptyString:item[ite.name] }}-->
+                      {{ ite.filters?itemFilter(item,ite):formatterAction(item,ite,index,i) }}
+	                  </template>
+	                </view>
+	              </view>
+	            </view>
+	          </view>
+	        </scroll-view>
+       <table-h5-summary
+           :scrollbarSize="scrollbarSize"
+           :data="data"
+           :handleFooterTableScrollLeft="handleFooterTableScrollLeft"
+           :headerFooterTableLeft="headerFooterTableLeft"
+           v-if="showSummary"
+           :showSummary="showSummary"
+           :transColumns="transColumns"
+           :border="border"
+           :summary-method="summaryMethod"
+           :sumText="sumText"
+           :fixedLeftColumns="fixedLeftColumns"/>
+	    </view>
+	    <view class="zb-table-fixed-left"
+            v-if="isFixedLeft"
+            :style=" {height:  `calc(100% - ${scrollbarSize}px)`}"
+      >
+	      <template v-if="showHeader">
+	        <view class="zb-table-header" style="display: flex">
+	          <view class="item-tr"
+                  style=""
+                  @click.stop="rowClick(item,index)"
+                  v-for="(item,index) in fixedLeftColumns" :key="index">
+	            <view
+	                :style="{
+	               width:`${item.width?item.width:'100'}px`,
+	               borderRight:`${border?'1px solid #e8e8e8':''}`,
+	               borderTop:`${border?'1px solid #e8e8e8':''}`,
+                textAlign:item.align||'left'
+	            }"
+	                @click.stop="sortAction(item,index)"
+	                class="item-th"
+	            >
+                <template v-if="item.type==='selection'">
+                  <view class="checkbox-item">
+                    <tableCheckbox
+                        :indeterminate="indeterminate" :checked="checkedAll" @checkboxSelected="checkboxSelectedAll"></tableCheckbox>
+                  </view>
+                </template>
+                <template v-else>
+                  {{ item.label }}
+                  <view class="sorter-table" v-if="item.sorter">
+                    <view :class="['sorter-table-icon',item.sorterMode==='_asc'&&`sorting${item.sorterMode||''}`]"></view>
+                    <view :class="['sorter-table-icon',item.sorterMode==='_desc'&&`sorting${item.sorterMode||''}`]"></view>
+                  </view>
+                </template>
+              </view>
+	          </view>
+
+	        </view>
+	      </template>
+        <scroll-view
+            scroll-y="true"
+            id="leftTableFixed"
+            :upper-threshold="15"
+            @scrolltoupper="(e)=>scrollToFixedLeft(e)"
+            @scroll="leftFixedScrollAction"
+            :scroll-top="leftFiexScrollTop"
+            class="zb-table-body-inner"
+            :style=" `height: calc(100% - ${showSummary?80:40}px)`">
+          <view class="zb-table-fixed">
+            <view class="zb-table-tbody">
+              <view
+                  :class="['item-tr',stripe?(i % 2) != 0?'odd':'even':'',highlight&&isHighlight(ite,i)?'current-row':'']"
+                    v-for="(ite,i) in transData"
+                    @click.stop="rowClick(ite,i)"
+                    :key="ite.key"
+                    style="">
+                <view class='item-td'
+                      :style="[{
+	                       width:`${item.width?item.width:'100'}px`,
+	                       borderRight:`${border?'1px solid #e8e8e8':''}`,
+	                       textAlign:item.align||'left'
+	                      },cellStyle&&getCellStyle(ite,item,i,index)]"
+                      :key="index"
+                      v-for="(item,index) in fixedLeftColumns">
+                  <template v-if="item.type==='selection'">
+                    <view class="checkbox-item">
+                      <tableCheckbox @checkboxSelected="(e)=>checkboxSelected(e,ite)" :cellData="ite" :checked="ite.checked"/>
+                    </view>
+                  </template>
+                  <template v-else-if="item.type==='index'">
+                    {{i+1}}
+                  </template>
+                  <template v-else>
+                    {{ite[item.name]||item.emptyString}}
+                  </template>
+                </view>
+              </view>
+            </view>
+          </view>
+        </scroll-view>
+        <table-side-summary
+            :scrollbarSize="scrollbarSize"
+            v-if="showSummary&&!(scrollbarSize>0)"
+            :data="data"
+            :showSummary="showSummary"
+            :transColumns="transColumns"
+            :border="border"
+            :summary-method="summaryMethod"
+            :sumText="sumText"
+            :fixedLeftColumns="fixedLeftColumns"/>
+	    </view>
+	  </view>
+    <zb-load-more v-if="isLoadMore&&!completeLoading"/>
+	</view>
+	<!-- #endif -->
+	<!-- #ifndef H5 || APP-PLUS -->
+	<view class="zb-table-applet">
+	  <view class="zb-table-content">
+      <scroll-view
+		<!-- #ifdef MP-ALIPAY -->
+		@scroll="scrollAlipay"
+		<!-- #endif  -->
+
+          @scrolltolower="scrolltolower"
+					<!-- #ifdef MP-ALIPAY -->
+                   style=" height: 100%;overflow-x:scroll"
+				   <!-- #endif  -->
+				   <!-- #ifndef MP-ALIPAY -->
+				   style=" height: 100%"
+				   <!-- #endif  -->
+                   scroll-y="true"
+				   scroll-x="true">
+	    <view class="zb-table-scroll" >
+	      <template v-if="showHeader">
+	        <view class="zb-table-header top-header-uni" style="">
+	            <view class="zb-table-fixed" >
+	              <view class="zb-table-thead" style="position: relative;" >
+	                <view class="item-tr">
+	                  <view
+	                      @click.stop="sortAction(item,index)"
+	                      :class="['item-th',index <fixedLeftColumns.length&&'zb-stick-side']"
+	                      :style="{
+	                              left:`${item.left}px`,
+	                              width:`${item.width?item.width:'100'}px`,
+															  flex:index===transColumns.length-1?1:'none',
+															  minWidth:`${item.width?item.width:'100'}px`,
+															   borderRight:`${border?'1px solid #e8e8e8':''}`,
+															  borderTop:`${border?'1px solid #e8e8e8':''}`,
+															   textAlign:item.align||'left'
+														  }"
+	                      v-for="(item,index) in transColumns" :key="index">
+                      <template v-if="item.type==='selection'">
+                        <view class="checkbox-item">
+                          <tableCheckbox
+                              :indeterminate="indeterminate" :checked="checkedAll" @checkboxSelected="checkboxSelectedAll"></tableCheckbox>
+                        </view>
+                      </template>
+                      <template v-else>
+                        {{ item.label||'' }}
+                        <view class="sorter-table" v-if="item.sorter">
+                          <view :class="['sorter-table-icon',item.sorterMode==='_asc'&&`sorting${item.sorterMode||''}`]"></view>
+                          <view :class="['sorter-table-icon',item.sorterMode==='_desc'&&`sorting${item.sorterMode||''}`]"></view>
+                        </view>
+                      </template>
+                    </view>
+	                </view>
+	              </view>
+	            </view>
+	        </view>
+	      </template>
+	      <template v-if="!data.length">
+	        <view class="no-data">暂无数据~~</view>
+	      </template>
+          <view class="zb-table-fixed">
+            <view class="zb-table-tbody">
+              <view  :class="['item-tr',highlight&&isHighlight(item,index)?'current-row':'']"
+                     @click.stop="rowClick(item,index)"
+                     v-for="(item,index) in transData" :key="item.key" >
+                <view
+                    :style="[{
+                      left:`${ite.left}px`,
+                      width:`${ite.width?ite.width:'100'}px`,
+                      flex:i===transColumns.length-1?1:'none',
+                      minWidth:`${ite.width?ite.width:'100'}px`,
+                      borderRight:`${border?'1px solid #e8e8e8':''}`,
+                      textAlign:ite.align||'left',
+                    },getCellStyle(item,ite,index,i)]"
+                    :class="['item-td', i <fixedLeftColumns.length&&'zb-stick-side',stripe?(index % 2) != 0?'odd':'even':'']"
+                    v-for="(ite,i) in transColumns" :key="i">
+                  <template  v-if="ite.type==='operation'">
+                    <view style="display: flex;align-items: center;height: 100%">
+                      <view
+                          v-for="ren,ind in permission(item,ite.renders,index)"
+                          :key="ind"
+                          @click.stop="$emit(ren.func,item,index)"
+                          :style="{
+	                          display:'flex',
+	                          alignItems: 'center',
+	                          marginRight:ite.renders.length>1?'8px':'0'
+	                        }">
+                        <template v-if="ren.type==='custom'">
+                          <view :class="ren.class||''" style="cursor: pointer">
+                            {{ren.name}}
+                          </view>
+                        </template>
+                        <template v-else>
+                          <button
+                              :class="ren.class||''"
+                              :type="ren.type||'primary'" :size="ren.size||'mini'">{{ren.name}}</button>
+                        </template>
+                      </view>
+                    </view>
+                  </template>
+                  <template v-else-if="ite.type==='selection'">
+                    <view class="checkbox-item">
+                      <tableCheckbox @checkboxSelected="(e)=>checkboxSelected(e,item)" :cellData="item" :checked="item.checked"/>
+                    </view>
+                  </template>
+                  <template v-else-if="ite.type==='img'">
+                    <image
+                        @click.stop="previewImage(item,item[ite.name],index)"
+                        v-if="item[ite.name]"
+                        :show-menu-by-longpress="false"
+                        :src="item[ite.name]" style="width: 40px;height:30px; " mode="aspectFit"></image>
+                    <text v-else>{{ite.emptyString}}</text>
+                  </template>
+                  <template v-else-if="ite.type==='index'">
+                    {{index+1}}
+                  </template>
+                  <template  v-else>
+<!--                    {{ ite.filters?itemFilter(item,ite):(item[ite.name]==null||item[ite.name]==='')?ite.emptyString:item[ite.name] }}-->
+                    {{ ite.filters?itemFilter(item,ite):formatterAction(item,ite,index,i) }}
+                  </template>
+                </view>
+              </view>
+            </view>
+          </view>
+        <table-summary
+            v-if="showSummary"
+            :data="data"
+            :showSummary="showSummary"
+            :fixedLeftColumns="fixedLeftColumns"
+            :transColumns="transColumns"
+            :border="border"
+            :summary-method="summaryMethod"
+            :sumText="sumText"
+        />
+	    </view>
+      </scroll-view>
+	  </view>
+    <zb-load-more v-if="isLoadMore&&!completeLoading"/>
+	</view>
+	<!-- #endif -->
+</template>
+<script>
+import TableCheckbox from './components/table-checkbox.vue'
+import TableSummary from "./components/table-summary.vue";
+import TableSideSummary from "./components/table-side-summary.vue";
+import TableH5Summary from './components/table-h5-summary'
+import ZbLoadMore from './components/zb-load-more'
+
+import {getScrollbarSize} from "./js/util";
+export default {
+  components:{
+    TableCheckbox,
+    TableSummary,
+    TableSideSummary,
+    TableH5Summary,
+    ZbLoadMore
+  },
+  props:{
+    highlight:{
+      type:Boolean,
+      default:false
+    },
+    itemDate:{
+      type:Object,
+      default:()=>{}
+    },
+    columns:{
+      type:Array,
+      default:()=>[]
+    },
+    showSummary:{
+      type:Boolean,
+      default:false
+    },
+    isShowLoadMore:{
+      type:Boolean,
+      default:false
+    },
+    data:{
+      type:[Object,Array],
+      default:()=>[]
+    },
+    sumText:{
+      type:String,
+      default:'合计'
+    },
+    showHeader:{
+      type:Boolean,
+      default:true
+    },
+    border:{
+      type:Boolean,
+      default:false
+    },
+    stripe:{
+      type:Boolean,
+      default:true
+    },
+    fit:{
+      type:Boolean,
+      default:false
+    },
+    rowKey:[String, Function],
+    summaryMethod:Function,
+    pullUpLoading:Function,
+    formatter:Function,
+    cellStyle:Function,
+    cellHeaderStyle:Function,
+    permissionBtn:Function,
+  },
+  computed:{
+    loadMoreHeight(){
+      return this.isLoadMore?40:0
+    },
+    fixedLeftColumns(){
+      let arr = []
+      for(let i=0;i<this.columns.length;i++){
+        let item = this.columns[i]
+        if(item.fixed){
+          arr.push(item)
+        }else {
+          break
+        }
+      }
+      return arr
+    },
+    itemfilters(){
+      return(item,ite)=>{
+        if(item[ite.name]==null){
+          return ite.emptyString
+        }
+        return item[ite.name]
+      }
+    },
+    scrollbarSize(){
+		// #ifdef H5
+      return getScrollbarSize()
+	  // #endif
+
+	  // #ifndef H5
+	  return 0
+	  // #endif
+    },
+    isFixedLeft(){
+      if(!this.columns.length){
+        return false
+      }
+      if(!this.data.length){
+        return false
+      }
+      let [firstArr] = this.columns
+      return !!firstArr.fixed;
+    },
+    transColumns(){
+      if(this.fit){
+        this.columns.forEach(column=>{
+          if(column.type==="operation"&&column.renders){
+			      let str = ''
+            column.renders.map((item)=>{
+              str+=item.name
+            })
+            column.width = this.getTextWidth(str)+column.renders.length*40
+          }else if(column.type==="img"){
+			   }else if(column.type==="selection"){
+			}else{
+			let arr = [this.getTextWidth(column.label)]
+            this.data.forEach(data=>{
+              let str = (data[column.name]+'')
+			  if(str==='undefined'){
+				   arr.push(30)
+			  }else{
+				   let width = this.getTextWidth(str)
+				   arr.push(width)
+			  }
+            })
+			      column.width = Math.max(...arr)+20
+          }
+        })
+      }
+      let number = 0
+      this.columns.forEach((item,index)=>{
+        if(item.type==="operation"&&item.renders&&!item.width){
+          let str = ''
+          item.renders.map((item)=>{
+            str+=item.name
+          })
+          item.width = this.getTextWidth(str)+item.renders.length*40
+        }
+        if(item.fixed){
+          if(index===0){
+            item.left = 0
+            number+=item.width
+          }else {
+            item.left = number
+            number+=item.width
+          }
+        }
+        item.emptyString = item.emptyString||'--'
+      })
+      return this.columns
+    },
+    transData(){
+      let flag = this.columns.some(item=>item.type==='selection')
+      this.data.forEach((item,index)=>{
+        if(flag){
+          if(item.checked){
+            if(!this.selectArr.length){
+              this.selectArr.push(item)
+            }
+          }
+        }
+        if(this.rowKey){
+          if(typeof this.rowKey==='function'){
+            item.key = Object.freeze(this.rowKey(item))||Date.now()
+          }else {
+            item.key = Object.freeze(item[this.rowKey])||Date.now()
+          }
+        }else {
+          item.key = index
+        }
+      })
+      if(flag&&this.data.length){
+        let le = this.data.filter(item=>item.checked).length
+        if(le){
+          if(le===this.data.length){
+            this.checkedAll = true
+          }else {
+            this.indeterminate = true
+          }
+        }
+      }
+      return this.data
+    },
+    isHighlight(){
+      return (item,index)=>{
+        if(this.rowKey){
+          return item.key === this.currentRow['key']
+        }else{
+          return index === this.currentRowIndex
+        }
+      }
+    },
+    getHeaderCellStyle() {
+      return (column,  columnIndex,childIndex)=>{
+        const cellStyle = this.cellHeaderStyle;
+        if(typeof cellStyle==='function'){
+          return cellStyle({ column, columnIndex})
+        }
+        return {}
+      }
+    },
+    getCellStyle() {
+     return (row, column, rowIndex, columnIndex)=>{
+       const cellStyle = this.cellStyle;
+       if(typeof cellStyle==='function'){
+         return cellStyle({row, column, rowIndex, columnIndex})
+       }
+       return {}
+     }
+    },
+  },
+  data() {
+    return {
+      button:[],
+	    alipayScrollTop:0,
+      alipayScrollOldTop:0,
+      alipayFlag:false,
+      bodyTableLeft:0,
+      headerTableLeft:0,
+      lastScrollLeft:0,
+      isLoadMore:false,
+      headerFooterTableLeft:0,
+      leftFiexScrollTop:0,
+      bodyScrollTop:0,
+      currentDriver:null,
+      currentDriver1:null,
+      bodyTime:null,
+      currentRowIndex:null,
+      currentRow: {},
+      bodyTime1:null,
+      headerTime:null,
+      debounceTime:null,
+      operation:{},
+      completedFlag:false,
+      selectArr:[],
+      indeterminate:false,
+      checkedAll:false,
+      completeLoading:false,
+      aliTime:null,
+    }
+  },
+  created(){
+  },
+  mounted(){
+  },
+  methods: {
+getMove(){
+	
+},
+    formatterAction(row,column,rowIndex,columnIndex){
+      if(column.formatter&&typeof this.formatter==='function'){
+        return this.formatter(row,column,rowIndex,columnIndex)
+      }
+      return (row[column.name]==null||row[column.name]==='')?column.emptyString:row[column.name]
+    },
+    permission(item,renders,index){
+      if(this.permissionBtn&&typeof this.permissionBtn==='function'){
+        return this.permissionBtn(item,renders,index)
+      }
+      return renders
+    },
+    pullUpCompleteLoading(type){
+      this.isLoadMore = false
+      if(type==='ok'){
+        this.completeLoading = true
+      }
+    },
+    scrollAlipay(e){
+
+      if(!this.alipayScrollOldTop){
+        this.alipayScrollOldTop = e.detail.scrollTop
+      }
+      this.aliTime&&clearTimeout(this.aliTime)
+      this.aliTime = setTimeout(()=>{
+
+        if(this.alipayFlag&&e.detail.scrollTop>this.alipayScrollOldTop){
+          this.pullLoad()
+        }
+        this.alipayFlag = false
+        this.alipayScrollOldTop = null
+      },500)
+    },
+    pullLoad(){
+      if(this.isShowLoadMore){
+        this.isLoadMore = true
+        this.$emit('pullUpLoading')
+        let that = this
+        this.pullUpLoading&&this.pullUpLoading.call(this.$parent.$parent, (type)=>{
+          that.isLoadMore = false
+          if(type==='ok'){
+            that.completeLoading=true
+          }
+        })
+      }
+
+    },
+    scrolltolower(e){
+      this.alipayFlag = true
+      if(e.detail.direction==='bottom'){
+        this.pullLoad()
+      }
+
+      // this.pullUpLoading.call(this.$parent)
+    },
+	  previewImage(item,url,current){
+		  uni.previewImage({
+			  current,
+			  urls:[url]
+		  })
+	  },
+    resetHighlight(){
+      this.currentRowIndex = null
+      this.currentRow = {}
+    },
+    rowClick(row,index){
+      if(this.highlight){
+        this.currentRowIndex = index
+        this.currentRow = row
+        this.$emit('currentChange',row,index)
+      }
+      this.$emit('rowClick',row,index)
+    },
+    checkboxSelectedAll(e){
+      this.indeterminate = false
+      if(e.checked){
+        this.selectArr = []
+        this.checkedAll = true
+        this.data.forEach(item=>{
+          // this.$set(item,'checked',true)
+          item.checked = true
+          this.selectArr.push(item)
+        })
+      }else{
+        this.checkedAll = false
+        this.data.forEach(item=>{
+          this.$set(item,'checked',false)
+        })
+        this.selectArr = []
+      }
+      // #ifndef H5 || APP-PLUS
+      this.$forceUpdate()
+      // #endif
+      this.$emit('toggleAllSelection',e.checked,this.selectArr)
+    },
+    checkboxSelected(e,item){
+      // #ifdef H5 || APP-PLUS
+      this.$set(item,'checked',e.checked)
+      // #endif
+      // #ifndef H5 || APP-PLUS
+      this.data.forEach(item=>{
+        if(item.key===e.data.key){
+          item.checked = e.checked
+        }
+      })
+      // #endif
+      item.checked = e.checked
+      e.data.checked = e.checked
+      if(e.checked){
+        this.selectArr.push(e.data)
+      }else{
+        this.selectArr = this.selectArr.filter(item=>item.key!==e.data.key)
+      }
+      if(this.selectArr.length===this.transData.length){
+        this.indeterminate = false
+        this.checkedAll = true
+      }else{
+        this.indeterminate = true
+        this.checkedAll = false
+      }
+      if(!this.selectArr.length){
+        this.checkedAll = false
+        this.indeterminate = false
+      }
+      // #ifndef H5 || APP-PLUS
+      this.$forceUpdate()
+      // #endif
+      this.$emit('toggleRowSelection',e.checked,this.selectArr)
+    },
+    itemFilter(item,ite){
+      if(ite.filters&&ite.name){
+        let key = item[ite.name]
+        return ite.filters[key]||''
+      }
+      return item[ite.name]||ite.emptyString
+    },
+    // 默认字体为微软雅黑 Microsoft YaHei,字体大小为 14px
+    getTextWidth(str) {
+      if(str.length<3){
+        return 40
+      }
+      let regx = /^[0-9]+.?[0-9]*$/
+      let flexWidth = 0
+      for (const char of str) {
+        if ((char >= 'A' && char <= 'Z') || (char >= 'a' && char <= 'z')) {
+          // 如果是英文字符,为字符分配8个单位宽度
+          flexWidth += 10
+        } else if (char >= '\u4e00' && char <= '\u9fa5') {
+          // 如果是中文字符,为字符分配15个单位宽度
+          flexWidth += 15
+        } else if(regx.test(char)){
+          flexWidth += 9
+        }else {
+          // 其他种类字符,为字符分配8个单位宽度
+          flexWidth += 7
+        }
+      }
+      return flexWidth
+    },
+    width(item){
+      return `${item.width?item.width:'100'}px`
+    },
+    showStripe(index){
+      if(this.currentDriver)return
+      if(this.stripe){
+        return (index % 2) != 0?'odd':'even'
+      }else{
+        return ''
+      }
+    },
+    //验证字符串是否是数字
+    checkNumber(theObj) {
+      var reg = /^[0-9]+.?[0-9]*$/;
+      if (reg.test(theObj)) {
+        return true;
+      }
+      return false;
+    },
+    isDate(data){
+      if(isNaN(data)&&!isNaN(Date.parse(data))){
+        return true
+      }
+      return false
+    },
+    sortAction(item,index){
+      if(!item.sorter){return false}
+      this.$set(item,'sorterMode',item.sorterMode==='_asc'?'_desc':'_asc')
+      if(item.sorter==='custom'){
+        this.$emit('sort-change',item,item.sorterMode.replace('_',''),index)
+      }else {
+        this.sortData(item)
+      }
+      // #ifndef H5 || APP-PLUS
+      this.$forceUpdate()
+      // #endif
+    },
+    sortData(item){
+      let key = item.name
+
+      if(item.sorterMode==='_asc'){
+        this.data.sort((a,b)=>{
+          if(this.checkNumber(a[key])){
+            return a[key]-b[key]
+          }
+          if(this.isDate(a[key])){
+            let a1 = new Date(a[key]).getTime()
+            let b1 = new Date(b[key]).getTime()
+            return a1-b1
+          }
+        })
+      }else {
+        this.data.sort((a,b)=>{
+          if(this.checkNumber(a[key])){
+            return b[key]-a[key]
+          }
+          if(this.isDate(a[key])){
+            let a1 = new Date(a[key]).getTime()
+            let b1 = new Date(b[key]).getTime()
+            return b1-a1
+          }
+        })
+      }
+    },
+    throttle(method,delay=60){
+      let time = null
+      return (...args)=>{
+        if(!time){
+          time = setTimeout(()=>{
+            method(...args)
+            time = null;
+          },delay)
+        }
+      }
+    },
+    debounce(method,delay=1000){
+      return (...args)=>{
+        this.debounceTime&&clearTimeout(this.debounceTime)
+        this.debounceTime = setTimeout(()=>{
+          method(...args)
+        },delay)
+      }
+    },
+    handleBodyScroll(e){
+      if(this.currentDriver&&this.currentDriver!==e.currentTarget.id)return
+      this.currentDriver = e.currentTarget.id
+      this.headerTableLeft = e.detail.scrollLeft
+      this.headerFooterTableLeft = e.detail.scrollLeft
+      this.leftFiexScrollTop = e.detail.scrollTop
+      this.bodyTime&&clearTimeout(this.bodyTime)
+      this.bodyTime = setTimeout(()=>{
+        this.currentDriver=null
+      },200)
+
+    },
+    leftFixedScrollAction(e){
+      if(this.currentDriver&&this.currentDriver!==e.currentTarget.id)return
+      this.currentDriver = e.currentTarget.id
+      this.bodyScrollTop = e.detail.scrollTop
+      this.bodyTime&&clearTimeout(this.bodyTime)
+      this.bodyTime = setTimeout(()=>{
+        this.currentDriver=null
+      },200)
+    },
+    scrollToLeft(e){
+      if(this.currentDriver1&&this.currentDriver1!==e.currentTarget.id)return
+      this.currentDriver1 = e.currentTarget.id
+      if(e.detail.direction==='left'&&this.headerTableLeft<10){
+        this.headerTableLeft = 0
+      }else if(e.detail.direction==='top'&&this.leftFiexScrollTop<10){
+        this.leftFiexScrollTop = 0
+      }
+      this.bodyTime&&clearTimeout(this.bodyTime)
+      this.bodyTime = setTimeout(()=>{
+        this.currentDriver1=null
+      },200)
+    },
+    scrollToFixedLeft(e){
+      if(this.currentDriver1&&this.currentDriver1!==e.currentTarget.id)return
+      this.currentDriver1 = e.currentTarget.id
+      if(e.detail.direction==='top'&&this.bodyScrollTop<10){
+        this.bodyScrollTop = 0
+      }
+      this.bodyTime&&clearTimeout(this.bodyTime)
+      this.bodyTime = setTimeout(()=>{
+        this.currentDriver1=null
+      },200)
+    },
+    handleTableScrollLeft(e,type){
+      if(this.currentDriver&&this.currentDriver!==e.currentTarget.id)return
+      this.currentDriver = e.currentTarget.id
+      this.bodyTableLeft = e.detail.scrollLeft
+      this.headerFooterTableLeft = e.detail.scrollLeft
+      this.bodyTime&&clearTimeout(this.bodyTime)
+      this.bodyTime = setTimeout(()=>{
+        this.currentDriver=null
+      },200)
+    },
+    handleFooterTableScrollLeft(e){
+      if(this.currentDriver&&this.currentDriver!==e.currentTarget.id)return
+      this.currentDriver = e.currentTarget.id
+      this.bodyTableLeft = e.detail.scrollLeft
+      this.headerTableLeft = e.detail.scrollLeft
+      this.bodyTime&&clearTimeout(this.bodyTime)
+      this.bodyTime = setTimeout(()=>{
+        this.currentDriver=null
+      },200)
+    }
+  }
+}
+</script>
+<style lang="scss">
+.zb-table-fixed-left{
+  /*去除左边滚动条 */
+  scroll-view ::-webkit-scrollbar {
+    display: none !important;
+    width: 0 !important;
+    height: 0 !important;
+    -webkit-appearance: none;
+    background: transparent;
+  }
+}
+.zb-table-header{
+  ///*去除头部滚动条 */
+  scroll-view ::-webkit-scrollbar {
+    display: none !important;
+    width: 0 !important;
+    height: 0 !important;
+    -webkit-appearance: none;
+    background: transparent;
+  }
+}
+
+</style>
+<style lang="scss" scoped>
+.sorter-table{
+  position: absolute;
+  right: 6px;
+  top:50%;
+  transform:translateY(-50%);
+  .sorter-table-icon{
+    width: 0;
+    height: 0;
+    color: #dcdcdc;
+    border-right: 4px solid transparent;
+    border-left: 4px solid transparent;
+  }
+  .sorter-table-icon:first-child{
+    border-bottom: 5px solid currentColor;
+  }
+  .sorter-table-icon:last-child{
+    margin-top: 1.5px;
+    border-top: 5px solid currentColor;
+  }
+  .sorting_desc{
+    color: #2979ff;
+  }
+  .sorting_asc{
+    color: #2979ff;
+  }
+}
+.checkbox-item{
+  display: flex;align-items: center;justify-content: center;width: 100%;height: 100%
+}
+.no-data{
+  width: 100%;
+  height: 80rpx;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  border-bottom: 1px solid #e8e8e8;
+}
+.item-th{
+  position: relative;
+  flex-shrink: 0;
+  width: 100px;
+  overflow-wrap: break-word;
+  border-bottom: 1px solid #e8e8e8;
+  transition: background 0.3s;
+  padding-right: 4px;
+  word-break:keep-all;           /* 不换行 */
+  white-space:nowrap;          /* 不换行 */
+  overflow:hidden;               /* 内容超出宽度时隐藏超出部分的内容 */
+  text-overflow:ellipsis;         /* 当对象内文本溢出时显示省略标记(...) ;需与overflow:hidden;一起使用。*/
+  overflow-wrap: break-word;
+}
+.zb-table{
+  height: 100%;
+  overflow: hidden;
+  width: 100%;
+  display: flex;
+  flex-direction: column;
+  font-size: 12px;
+  position: relative;
+  .zb-table-content{
+    //height: 100%;
+    //flex: 1;
+    position: relative;
+    overflow: hidden;
+  }
+  .zb-table-fixed{
+    min-width: 100%;
+  }
+  .zb-table-body{
+    position: relative;
+    background: #fff;
+    transition: opacity 0.3s;
+  }
+  .item-tr{
+    display: flex;
+    //height: 41px;
+  }
+  .item-td{
+    flex-shrink: 0;
+    width: 100px;
+    padding-left: 4px;
+    height: 40px;
+    line-height: 40px;
+	padding-right: 4px;
+    box-sizing: border-box;
+    word-break:keep-all;           /* 不换行 */
+    white-space:nowrap;          /* 不换行 */
+    overflow:hidden;               /* 内容超出宽度时隐藏超出部分的内容 */
+    text-overflow:ellipsis;         /* 当对象内文本溢出时显示省略标记(...) ;需与overflow:hidden;一起使用。*/
+    overflow-wrap: break-word;
+    border-bottom: 1px solid #e8e8e8;
+    //transition: background 0.3s;
+  }
+
+  .zb-table-fixed-left .zb-table-header{
+    overflow-y: hidden;
+  }
+  .zb-table-header {
+    overflow: hidden;
+    background: #fafafa;
+    .item-th{
+      padding-left: 4px;
+      line-height: 39px;
+      height: 40px;
+      //display: flex;
+      //align-items: center;
+      box-sizing: border-box;
+    }
+  }
+  .zb-table-fixed-left .zb-table-fixed{
+    background: #fff;
+  }
+  .zb-table-fixed-right .zb-table-fixed{
+    background: #fff;
+  }
+  .zb-table-body-inner{
+    height: 100%;
+    // overflow: scroll;
+  }
+  .zb-table-fixed-left{
+    position: absolute;
+    top: 0;
+    z-index: 1;
+    overflow: hidden;
+    border-radius: 0;
+    height: 100%;
+    //transition: box-shadow 0.3s ease;
+  }
+  .odd{
+    background-color:rgba(249,249,249,0.6);
+    //height: 100%;
+    width: 100%;
+  }
+  .even{
+    background-color:white ;
+    //height: 100%;
+    width: 100%;
+  }
+}
+.scroll-left-fixed{
+  .zb-table-fixed-left {
+    left: 0;
+    box-shadow: 6px 0 6px -4px #ccc;
+  }
+}
+.zb-table-applet{
+  height: 100%;
+  //overflow: hidden;
+  width: 100%;
+  position: relative;
+  display: flex;
+  flex-direction: column;
+  font-size: 12px;
+  .zb-table-content{
+    //height: 100%;
+    flex: 1;
+    overflow: hidden;
+    position: relative;
+
+  }
+  .zb-table-fixed{
+    min-width: 100%;
+    width: fit-content;
+  }
+
+  .zb-table-body{
+    position: relative;
+    background: #fff;
+    transition: opacity 0.3s;
+  }
+  .item-tr{
+    display: flex;
+    //height: 41px;
+  }
+  .item-td{
+    flex-shrink: 0;
+    width: 100px;
+    padding-left: 4px;
+    height: 40px;
+    line-height: 40px;
+	padding-right:4px;
+    box-sizing: border-box;
+    word-break:keep-all;           /* 不换行 */
+    white-space:nowrap;          /* 不换行 */
+    overflow:hidden;               /* 内容超出宽度时隐藏超出部分的内容 */
+    text-overflow:ellipsis;         /* 当对象内文本溢出时显示省略标记(...) ;需与overflow:hidden;一起使用。*/
+    overflow-wrap: break-word;
+    border-bottom: 1px solid #e8e8e8;
+    //transition: background 0.3s;
+  }
+  .zb-table-header {
+    //overflow: hidden;
+    position: sticky;
+    top: 0;
+    z-index: 2;
+    //width: fit-content;
+    .item-th{
+      padding-left: 4px;
+      line-height: 39px;
+      height: 40px;
+      box-sizing: border-box;
+      background: #fafafa;
+    }
+    .zb-stick-side{
+      position: sticky;
+      top: 0;
+      left: 0;
+      z-index: 2;
+      //border-right: solid 1rpx #dbdbdb;
+      box-sizing: border-box;
+      background: #fafafa;
+      //box-shadow: 6px 0 6px -4px #ccc;
+    }
+  }
+  .zb-table-fixed-left .zb-table-fixed{
+    background: #fff;
+  }
+  .zb-table-fixed-right .zb-table-fixed{
+    background: #fff;
+  }
+  .zb-table-fixed-header .zb-table-body-inner{
+    height: 100%;
+    // overflow: scroll;
+  }
+  .zb-table-fixed-left{
+    position: absolute;
+    top: 0;
+    z-index: 1;
+    overflow: hidden;
+    border-radius: 0;
+    height: 100%;
+    //transition: box-shadow 0.3s ease;
+  }
+  .scroll-left-fixed{
+    .zb-table-fixed-left {
+      left: 0;
+      box-shadow: 6px 0 6px -4px #ccc;
+    }
+  }
+  .odd{
+    background-color:rgba(249,249,249,0.6);
+    //height: 100%;
+    width: 100%;
+  }
+  .even{
+    background-color:white ;
+    //height: 100%;
+    width: 100%;
+  }
+  .zb-table-tbody {
+    .zb-stick-side{
+      position: sticky;
+      left: 0;
+      z-index: 1;
+      box-sizing: border-box;
+      background:white;
+      //box-shadow: 6px 0 6px -2px #ccc;
+    }
+    .odd{
+      background:#f9f9f9;
+      //height: 100%;
+      width: 100%;
+    }
+    .even{
+      background:white ;
+      //height: 100%;
+      width: 100%;
+    }
+  }
+  .current-row{
+    .item-td{
+      background-color: #ecf5ff;
+    }
+  }
+}
+.current-row{
+  .item-td{
+    background-color: #ecf5ff;
+  }
+}
+.zb-table-header{
+  height: 40px;
+}
+</style>

+ 1308 - 0
property_ui/manage/components/zb-table/zb-tables.vue

@@ -0,0 +1,1308 @@
+<template>
+	<!-- #ifdef H5 || APP-PLUS -->
+	<view :class="['zb-table','zb-table-fixed-header',!border&&(bodyTableLeft>50||headerTableLeft>50)&&'scroll-left-fixed']">
+	  <view class="zb-table-content" style="flex: 1">
+	    <view class="zb-table-scroll" style="height: 100%;">
+	      <template v-if="showHeader">
+	        <view class="zb-table-header top-header-uni" :style="{paddingRight:`${scrollbarSize}rpx`}"
+          >
+	          <scroll-view class="zb-table-headers"
+							@touchmove.stop="getMove"
+	                       @scroll="handleTableScrollLeft"
+	                       scroll-x="true"
+	                       scroll-y="false"
+	                       id="tableHeaders"
+	                       scroll-anchoring="true"
+	                       :scroll-left="headerTableLeft"
+	                       style="
+						height: 100%">
+	            <view class="zb-table-fixed" >
+	              <view class="zb-table-thead" style="position: relative;" >
+	                <view class="item-tr">
+	                  <view
+	                      @click.stop="sortAction(item,index)"
+	                      class="item-th"
+	                      :style="[{
+	                              width:`${item.width?item.width:'200'}rpx`,
+															  flex:index===transColumns.length-1?1:'none',
+															  minWidth:`${item.width?item.width:'200'}rpx`,
+															  borderRight:`${border?'2rpx solid #e8e8e8':''}`,
+															  borderRight:`${(scrollbarSize&&index===transColumns.length-1)?'':border?'2rpx solid #e8e8e8':''}`,
+															  borderTop:`${border?'2rpx solid #e8e8e8':''}`,
+															  textAlign:item.align||'left',
+															  paddingRight:`${item.paddingRight?item.paddingRight:'8'}rpx`,
+														  },getHeaderCellStyle(item,index)]"
+	                      v-for="(item,index) in transColumns" :key="index">
+                      <template v-if="item.type==='selection'">
+                        <view class="checkbox-item">
+                          <tableCheckbox
+                              :indeterminate="indeterminate" :checked="checkedAll" @checkboxSelected="checkboxSelectedAll"></tableCheckbox>
+                        </view>
+                      </template>
+                      <template v-else>
+						  {{ item.label }}
+						  <block v-if="item.manfen">/{{item.manfen}}</block>
+                        <view class="sorter-table" v-if="item.sorter">
+                          <view :class="['sorter-table-icon',item.sorterMode==='_asc'&&`sorting${item.sorterMode||''}`]"></view>
+                          <view :class="['sorter-table-icon',item.sorterMode==='_desc'&&`sorting${item.sorterMode||''}`]"></view>
+                        </view>
+                      </template>
+                    </view>
+	                </view>
+	              </view>
+	            </view>
+	          </scroll-view>
+	        </view>
+	      </template>
+	      <template v-if="!data.length">
+	        <view class="no-data">暂无数据~~</view>
+	      </template>
+	      <scroll-view
+            class="zb-table-body" ref="tableBody"	scroll-x="true"	scroll-y="true"	id="tableBody"
+	                   :lower-threshold="40"
+	                   :upper-threshold="10"
+					   @touchmove.stop="getMove"
+                     @scrolltolower="scrolltolower"
+	                   @scrolltoupper="(e)=>debounce(scrollToLeft)(e)"
+                     @scroll="handleBodyScroll"	:scroll-left="bodyTableLeft"	:scroll-top="bodyScrollTop"
+                     :style=" `height: calc(100% - ${showSummary?160:80}rpx)`" >
+	          <view class="zb-table-fixed">
+	            <view class="zb-table-tbody">
+	              <view  :class="['item-tr',highlight&&isHighlight(item,index)?'current-row':'']"
+                       @click.stop="rowClick(item,index)"
+	                     v-for="(item,index) in transData" :key="item.key" >
+	                <view
+	                    :style="[{
+									              width:`${ite.width?ite.width:'200'}rpx`,
+															  flex:i===transColumns.length-1?1:'none',
+															  minWidth:`${ite.width?ite.width:'200'}rpx`,
+															  borderRight:`${border?'2rpx solid #e8e8e8':''}`,
+                                textAlign:ite.align||'left',
+														  },cellStyle&&getCellStyle(item,ite,index,i)]"
+
+	                    :class="['item-td',stripe?(index % 2) != 0?'odd':'even':'']"
+	                    v-for="(ite,i) in transColumns" :key="i">
+	                  <template  v-if="ite.type==='operation'">
+	                    <view style="display: flex;align-items: center;height: 100%">
+	                      <view
+                            v-for="ren,ind in permission(item,ite.renders,index)"
+	                          :key="ind"
+	                          @click.stop="$emit(ren.func,item,index)"
+	                          :style="{
+	                          display:'flex',
+	                          alignItems: 'center',
+	                          marginRight:ite.renders.length>1?'16rpx':'0'
+	                        }">
+                          <template v-if="ren.type==='custom'">
+                            <view :class="ren.class||''" style="cursor: pointer">
+                              {{ren.name}}
+                            </view>
+                          </template>
+                          <template v-else>
+                            <button
+                                :class="ren.class||''"
+                                :type="ren.type||'primary'" :size="ren.size||'mini'">{{ren.name}}</button>
+                          </template>
+	                      </view>
+	                    </view>
+	                  </template>
+					<!-- 格式化处理 -->
+					<template v-else-if="ite.type==='format'">
+						<view>{{kayType(itemFilter(item,ite),parameter[ite.key])}}</view>
+					</template>
+                    <template v-else-if="ite.type==='selection'">
+                      <view class="checkbox-item">
+                        <tableCheckbox @checkboxSelected="(e)=>checkboxSelected(e,item)" :cellData="item" :checked="item.checked"/>
+                      </view>
+                    </template>
+                    <template v-else-if="ite.type==='index'">
+                      {{index+1}}
+                    </template>
+                  <template v-else-if="ite.type==='img'">
+                    <view class="checkbox-item">
+						<block v-if="item[ite.name]" >
+							<image v-for="(pite,pidx) in getPhotoFn(item[ite.name])" :key="pidx"
+							    @click.stop="previewImage(getPhotoFn(item[ite.name]),pite,pidx)"
+							    :show-menu-by-longpress="false"
+							    :src="pite" style="width: 80rpx;height:60rpx; " mode="aspectFit"></image>
+						</block>
+                      <!-- <image
+                    @click.stop="previewImage(item,item[ite.name],index)"
+                    v-if="item[ite.name]"
+                    :show-menu-by-longpress="false"
+                    :src="item[ite.name]" style="width: 80rpx;height:60rpx; " mode="aspectFit"></image> -->
+                    <text v-else>{{ite.emptyString}}</text>
+                    </view>
+                  </template>
+	                  <template  v-else>
+<!--                      {{ ite.filters?itemFilter(item,ite):(item[ite.name]==null||item[ite.name]==='')?ite.emptyString:item[ite.name] }}-->
+                      {{ ite.filters?itemFilter(item,ite):formatterAction(item,ite,index,i) }}
+	                  </template>
+	                </view>
+	              </view>
+	            </view>
+	          </view>
+	        </scroll-view>
+       <table-h5-summary
+           :scrollbarSize="scrollbarSize"
+           :data="data"
+           :handleFooterTableScrollLeft="handleFooterTableScrollLeft"
+           :headerFooterTableLeft="headerFooterTableLeft"
+           v-if="showSummary"
+           :showSummary="showSummary"
+           :transColumns="transColumns"
+           :border="border"
+           :summary-method="summaryMethod"
+           :sumText="sumText"
+           :fixedLeftColumns="fixedLeftColumns"/>
+	    </view>
+	    <view class="zb-table-fixed-left"
+            v-if="isFixedLeft"
+            :style=" {height:  `calc(100% - ${scrollbarSize}rpx)`}"
+      >
+	      <template v-if="showHeader">
+	        <view class="zb-table-header" style="display: flex">
+	          <view class="item-tr"
+                  style=""
+                  @click.stop="rowClick(item,index)"
+                  v-for="(item,index) in fixedLeftColumns" :key="index">
+	            <view
+	                :style="{
+	               width:`${item.width?item.width:'200'}rpx`,
+	               borderRight:`${border?'2rpx solid #e8e8e8':''}`,
+	               borderTop:`${border?'2rpx solid #e8e8e8':''}`,
+                textAlign:item.align||'left'
+	            }"
+	                @click.stop="sortAction(item,index)"
+	                class="item-th"
+	            >
+                <template v-if="item.type==='selection'">
+                  <view class="checkbox-item">
+                    <tableCheckbox
+                        :indeterminate="indeterminate" :checked="checkedAll" @checkboxSelected="checkboxSelectedAll"></tableCheckbox>
+                  </view>
+                </template>
+                <template v-else>
+                  {{ item.label }}
+				  <block v-if="item.manfen">/{{item.manfen}}</block>
+                  <view class="sorter-table" v-if="item.sorter">
+                    <view :class="['sorter-table-icon',item.sorterMode==='_asc'&&`sorting${item.sorterMode||''}`]"></view>
+                    <view :class="['sorter-table-icon',item.sorterMode==='_desc'&&`sorting${item.sorterMode||''}`]"></view>
+                  </view>
+                </template>
+              </view>
+	          </view>
+
+	        </view>
+	      </template>
+        <scroll-view
+            scroll-y="true"
+            id="leftTableFixed"
+            :upper-threshold="15"
+            @scrolltoupper="(e)=>scrollToFixedLeft(e)"
+            @scroll="leftFixedScrollAction"
+            :scroll-top="leftFiexScrollTop"
+            class="zb-table-body-inner"
+            :style=" `height: calc(100% - ${showSummary?160:80}rpx)`">
+          <view class="zb-table-fixed">
+            <view class="zb-table-tbody">
+              <view
+                  :class="['item-tr',stripe?(i % 2) != 0?'odd':'even':'',highlight&&isHighlight(ite,i)?'current-row':'']"
+                    v-for="(ite,i) in transData"
+                    @click.stop="rowClick(ite,i)"
+                    :key="ite.key"
+                    style="">
+                <view class='item-td'
+                      :style="[{
+	                       width:`${item.width?item.width:'200'}rpx`,
+	                       borderRight:`${border?'2rpx solid #e8e8e8':''}`,
+	                       textAlign:item.align||'left'
+	                      },cellStyle&&getCellStyle(ite,item,i,index)]"
+                      :key="index"
+                      v-for="(item,index) in fixedLeftColumns">
+                  <template v-if="item.type==='selection'">
+                    <view class="checkbox-item">
+                      <tableCheckbox @checkboxSelected="(e)=>checkboxSelected(e,ite)" :cellData="ite" :checked="ite.checked"/>
+                    </view>
+                  </template>
+                  <template v-else-if="item.type==='index'">
+                    {{i+1}}
+                  </template>
+                  <template v-else>
+                    {{ite[item.name]||item.emptyString}}
+                  </template>
+                </view>
+              </view>
+            </view>
+          </view>
+        </scroll-view>
+        <table-side-summary
+            :scrollbarSize="scrollbarSize"
+            v-if="showSummary&&!(scrollbarSize>0)"
+            :data="data"
+            :showSummary="showSummary"
+            :transColumns="transColumns"
+            :border="border"
+            :summary-method="summaryMethod"
+            :sumText="sumText"
+            :fixedLeftColumns="fixedLeftColumns"/>
+	    </view>
+	  </view>
+    <zb-load-more v-if="isLoadMore&&!completeLoading"/>
+	</view>
+	<!-- #endif -->
+	<!-- #ifndef H5 || APP-PLUS -->
+	<view class="zb-table-applet">
+	  <view class="zb-table-content">
+      <scroll-view
+		<!-- #ifdef MP-ALIPAY -->
+		@scroll="scrollAlipay"
+		<!-- #endif  -->
+
+          @scrolltolower="scrolltolower"
+					<!-- #ifdef MP-ALIPAY -->
+                   style=" height: 100%;overflow-x:scroll"
+				   <!-- #endif  -->
+				   <!-- #ifndef MP-ALIPAY -->
+				   style=" height: 100%"
+				   <!-- #endif  -->
+                   scroll-y="true"
+				   scroll-x="true">
+	    <view class="zb-table-scroll" >
+	      <template v-if="showHeader">
+	        <view class="zb-table-header top-header-uni" style="">
+	            <view class="zb-table-fixed" >
+	              <view class="zb-table-thead" style="position: relative;" >
+	                <view class="item-tr">
+	                  <view
+	                      @click.stop="sortAction(item,index)"
+	                      :class="['item-th',index <fixedLeftColumns.length&&'zb-stick-side']"
+	                      :style="{
+	                              left:`${item.left}rpx`,
+	                              width:`${item.width?item.width:'200'}rpx`,
+															  flex:index===transColumns.length-1?1:'none',
+															  minWidth:`${item.width?item.width:'200'}rpx`,
+															   borderRight:`${border?'2rpx solid #e8e8e8':''}`,
+															  borderTop:`${border?'2rpx solid #e8e8e8':''}`,
+															   textAlign:item.align||'left'
+														  }"
+	                      v-for="(item,index) in transColumns" :key="index">
+                      <template v-if="item.type==='selection'">
+                        <view class="checkbox-item">
+                          <tableCheckbox
+                              :indeterminate="indeterminate" :checked="checkedAll" @checkboxSelected="checkboxSelectedAll"></tableCheckbox>
+                        </view>
+                      </template>
+                      <template v-else>
+                        {{ item.label||'' }}
+						<block v-if="item.manfen">/{{item.manfen}}</block>
+                        <view class="sorter-table" v-if="item.sorter">
+                          <view :class="['sorter-table-icon',item.sorterMode==='_asc'&&`sorting${item.sorterMode||''}`]"></view>
+                          <view :class="['sorter-table-icon',item.sorterMode==='_desc'&&`sorting${item.sorterMode||''}`]"></view>
+                        </view>
+                      </template>
+                    </view>
+	                </view>
+	              </view>
+	            </view>
+	        </view>
+	      </template>
+	      <template v-if="!data.length">
+	        <view class="no-data">暂无数据~~</view>
+	      </template>
+          <view class="zb-table-fixed">
+            <view class="zb-table-tbody">
+              <view  :class="['item-tr',highlight&&isHighlight(item,index)?'current-row':'']"
+                     @click.stop="rowClick(item,index)"
+                     v-for="(item,index) in transData" :key="item.key" >
+                <view
+                    :style="[{
+                      left:`${ite.left}rpx`,
+                      width:`${ite.width?ite.width:'200'}rpx`,
+                      flex:i===transColumns.length-1?1:'none',
+                      minWidth:`${ite.width?ite.width:'200'}rpx`,
+                      borderRight:`${border?'2rpx solid #e8e8e8':''}`,
+                      textAlign:ite.align||'left',
+                    },getCellStyle(item,ite,index,i)]"
+                    :class="['item-td', i <fixedLeftColumns.length&&'zb-stick-side',stripe?(index % 2) != 0?'odd':'even':'']"
+                    v-for="(ite,i) in transColumns" :key="i">
+                  <template  v-if="ite.type==='operation'">
+                    <view style="display: flex;align-items: center;height: 100%">
+                      <view
+                          v-for="ren,ind in permission(item,ite.renders,index)"
+                          :key="ind"
+                          @click.stop="$emit(ren.func,item,index)"
+                          :style="{
+	                          display:'flex',
+	                          alignItems: 'center',
+	                          marginRight:ite.renders.length>1?'16rpx':'0'
+	                        }">
+                        <template v-if="ren.type==='custom'">
+                          <view :class="ren.class||''" style="cursor: pointer">
+                            {{ren.name}}
+                          </view>
+                        </template>
+                        <template v-else>
+                          <button
+                              :class="ren.class||''"
+                              :type="ren.type||'primary'" :size="ren.size||'mini'">{{ren.name}}</button>
+                        </template>
+                      </view>
+                    </view>
+                  </template>
+				  <!-- 格式化处理 -->
+				  <template v-else-if="ite.type==='format'">
+				  	<view>{{kayType(itemFilter(item,ite),parameter[ite.key])}}</view>
+				  </template>
+                  <template v-else-if="ite.type==='selection'">
+                    <view class="checkbox-item">
+                      <tableCheckbox @checkboxSelected="(e)=>checkboxSelected(e,item)" :cellData="item" :checked="item.checked"/>
+                    </view>
+                  </template>
+                  <template v-else-if="ite.type==='img'">
+					<block v-if="item[ite.name]" >
+						<image v-for="(pite,pidx) in getPhotoFn(item[ite.name])" :key="pidx"
+						    @click.stop="previewImage(getPhotoFn(item[ite.name]),pite,pidx)"
+						    :show-menu-by-longpress="false"
+						    :src="pite" style="width: 80rpx;height:60rpx; " mode="aspectFit"></image>
+					</block>
+                    <text v-else>{{ite.emptyString}}</text>
+                  </template>
+                  <template v-else-if="ite.type==='index'">
+                    {{index+1}}
+                  </template>
+                  <template  v-else>
+<!--                    {{ ite.filters?itemFilter(item,ite):(item[ite.name]==null||item[ite.name]==='')?ite.emptyString:item[ite.name] }}-->
+                    {{ ite.filters?itemFilter(item,ite):formatterAction(item,ite,index,i) }}
+                  </template>
+                </view>
+              </view>
+            </view>
+          </view>
+        <table-summary
+            v-if="showSummary"
+            :data="data"
+            :showSummary="showSummary"
+            :fixedLeftColumns="fixedLeftColumns"
+            :transColumns="transColumns"
+            :border="border"
+            :summary-method="summaryMethod"
+            :sumText="sumText"
+        />
+	    </view>
+      </scroll-view>
+	  </view>
+    <zb-load-more v-if="isLoadMore&&!completeLoading"/>
+	</view>
+	<!-- #endif -->
+</template>
+<script>
+import TableCheckbox from './components/table-checkbox.vue'
+import TableSummary from "./components/table-summary.vue";
+import TableSideSummary from "./components/table-side-summary.vue";
+import TableH5Summary from './components/table-h5-summary'
+import ZbLoadMore from './components/zb-load-more'
+import config from '@/config'
+const baseUrl = config.baseUrl
+import {getScrollbarSize} from "./js/util";
+// fit 列的宽度是否自撑开
+// column 显示的列数据
+// stripe 是否为斑马纹 table
+// show-header 是否显示表头
+// parameter 格式化数据总对象
+export default {
+  components:{
+    TableCheckbox,
+    TableSummary,
+    TableSideSummary,
+    TableH5Summary,
+    ZbLoadMore
+  },
+  props:{
+	parameter:{
+		type:Object,
+		default:null
+	},
+    highlight:{
+      type:Boolean,
+      default:false
+    },
+    itemDate:{
+      type:Object,
+      default:()=>{}
+    },
+    columns:{
+      type:Array,
+      default:()=>[]
+    },
+    showSummary:{
+      type:Boolean,
+      default:false
+    },
+    isShowLoadMore:{
+      type:Boolean,
+      default:false
+    },
+    data:{
+      type:[Object,Array],
+      default:()=>[]
+    },
+    sumText:{
+      type:String,
+      default:'合计'
+    },
+    showHeader:{
+      type:Boolean,
+      default:true
+    },
+    border:{
+      type:Boolean,
+      default:false
+    },
+    stripe:{
+      type:Boolean,
+      default:true
+    },
+    fit:{
+      type:Boolean,
+      default:false
+    },
+    rowKey:[String, Function],
+    summaryMethod:Function,
+    pullUpLoading:Function,
+    formatter:Function,
+    cellStyle:Function,
+    cellHeaderStyle:Function,
+    permissionBtn:Function,
+  },
+  computed:{
+    loadMoreHeight(){
+      return this.isLoadMore?40:0
+    },
+    fixedLeftColumns(){
+      let arr = []
+      for(let i=0;i<this.columns.length;i++){
+        let item = this.columns[i]
+        if(item.fixed){
+          arr.push(item)
+        }else {
+          break
+        }
+      }
+      return arr
+    },
+    itemfilters(){
+      return(item,ite)=>{
+        if(item[ite.name]==null){
+          return ite.emptyString
+        }
+        return item[ite.name]
+      }
+    },
+    scrollbarSize(){
+		// #ifdef H5
+      return getScrollbarSize()
+	  // #endif
+
+	  // #ifndef H5
+	  return 0
+	  // #endif
+    },
+    isFixedLeft(){
+      if(!this.columns.length){
+        return false
+      }
+      if(!this.data.length){
+        return false
+      }
+      let [firstArr] = this.columns
+      return !!firstArr.fixed;
+    },
+    transColumns(){
+      if(this.fit){
+        this.columns.forEach(column=>{
+          if(column.type==="operation"&&column.renders){
+			      let str = ''
+            column.renders.map((item)=>{
+              str+=item.name
+            })
+            column.width = this.getTextWidth(str)+column.renders.length*40
+          }else if(column.type==="img"){
+			   }else if(column.type==="selection"){
+			}else{
+			let arr = [this.getTextWidth(column.label)]
+            this.data.forEach(data=>{
+              let str = (data[column.name]+'')
+			  if(str==='undefined'){
+				   arr.push(60)
+			  }else{
+				   let width = this.getTextWidth(str)
+				   arr.push(width)
+			  }
+            })
+			      column.width = Math.max(...arr)+40
+          }
+        })
+      }
+      let number = 0
+      this.columns.forEach((item,index)=>{
+        if(item.type==="operation"&&item.renders&&!item.width){
+          let str = ''
+          item.renders.map((item)=>{
+            str+=item.name
+          })
+          item.width = this.getTextWidth(str)+item.renders.length*40
+        }
+        if(item.fixed){
+          if(index===0){
+            item.left = 0
+            number+=item.width
+          }else {
+            item.left = number
+            number+=item.width
+          }
+        }
+        item.emptyString = item.emptyString||'--'
+      })
+      return this.columns
+    },
+    transData(){
+      let flag = this.columns.some(item=>item.type==='selection')
+      this.data.forEach((item,index)=>{
+        if(flag){
+          if(item.checked){
+            if(!this.selectArr.length){
+              this.selectArr.push(item)
+            }
+          }
+        }
+        if(this.rowKey){
+          if(typeof this.rowKey==='function'){
+            item.key = Object.freeze(this.rowKey(item))||Date.now()
+          }else {
+            item.key = Object.freeze(item[this.rowKey])||Date.now()
+          }
+        }else {
+          item.key = index
+        }
+      })
+      if(flag&&this.data.length){
+        let le = this.data.filter(item=>item.checked).length
+        if(le){
+          if(le===this.data.length){
+            this.checkedAll = true
+          }else {
+            this.indeterminate = true
+          }
+        }
+      }
+      return this.data
+    },
+    isHighlight(){
+      return (item,index)=>{
+        if(this.rowKey){
+          return item.key === this.currentRow['key']
+        }else{
+          return index === this.currentRowIndex
+        }
+      }
+    },
+    getHeaderCellStyle() {
+      return (column,  columnIndex,childIndex)=>{
+        const cellStyle = this.cellHeaderStyle;
+        if(typeof cellStyle==='function'){
+          return cellStyle({ column, columnIndex})
+        }
+        return {}
+      }
+    },
+    getCellStyle() {
+     return (row, column, rowIndex, columnIndex)=>{
+       const cellStyle = this.cellStyle;
+       if(typeof cellStyle==='function'){
+         return cellStyle({row, column, rowIndex, columnIndex})
+       }
+       return {}
+     }
+    },
+  },
+  data() {
+    return {
+      button:[],
+	    alipayScrollTop:0,
+      alipayScrollOldTop:0,
+      alipayFlag:false,
+      bodyTableLeft:0,
+      headerTableLeft:0,
+      lastScrollLeft:0,
+      isLoadMore:false,
+      headerFooterTableLeft:0,
+      leftFiexScrollTop:0,
+      bodyScrollTop:0,
+      currentDriver:null,
+      currentDriver1:null,
+      bodyTime:null,
+      currentRowIndex:null,
+      currentRow: {},
+      bodyTime1:null,
+      headerTime:null,
+      debounceTime:null,
+      operation:{},
+      completedFlag:false,
+      selectArr:[],
+      indeterminate:false,
+      checkedAll:false,
+      completeLoading:false,
+      aliTime:null,
+    }
+  },
+  created(){
+  },
+  mounted(){
+  },
+  methods: {
+	  kayType(value,datas){
+	  		var actions = [];
+	  		var idx=0;
+	  		Object.keys(datas).some((key) => {
+	  			if (datas[key].value == ('' + value)) {
+	  				actions.push(datas[key].label);
+	  				return true;
+	  			}
+	  		})
+	  		return actions.join('')  
+	  },
+getMove(){
+	
+},
+    formatterAction(row,column,rowIndex,columnIndex){
+      if(column.formatter&&typeof this.formatter==='function'){
+        return this.formatter(row,column,rowIndex,columnIndex)
+      }
+      return (row[column.name]==null||row[column.name]==='')?column.emptyString:row[column.name]
+    },
+    permission(item,renders,index){
+      if(this.permissionBtn&&typeof this.permissionBtn==='function'){
+        return this.permissionBtn(item,renders,index)
+      }
+      return renders
+    },
+    pullUpCompleteLoading(type){
+      this.isLoadMore = false
+      if(type==='ok'){
+        this.completeLoading = true
+      }
+    },
+    scrollAlipay(e){
+
+      if(!this.alipayScrollOldTop){
+        this.alipayScrollOldTop = e.detail.scrollTop
+      }
+      this.aliTime&&clearTimeout(this.aliTime)
+      this.aliTime = setTimeout(()=>{
+
+        if(this.alipayFlag&&e.detail.scrollTop>this.alipayScrollOldTop){
+          this.pullLoad()
+        }
+        this.alipayFlag = false
+        this.alipayScrollOldTop = null
+      },500)
+    },
+    pullLoad(){
+      if(this.isShowLoadMore){
+        this.isLoadMore = true
+        this.$emit('pullUpLoading')
+        let that = this
+        this.pullUpLoading&&this.pullUpLoading.call(this.$parent.$parent, (type)=>{
+          that.isLoadMore = false
+          if(type==='ok'){
+            that.completeLoading=true
+          }
+        })
+      }
+
+    },
+    scrolltolower(e){
+      this.alipayFlag = true
+      if(e.detail.direction==='bottom'){
+        this.pullLoad()
+      }
+
+      // this.pullUpLoading.call(this.$parent)
+    },
+	// 多张图片处理
+	getPhotoFn(url){
+		var list=url.split(',')
+		var newArr=[];
+		list.forEach(ite=>{
+			var s=baseUrl+ite;
+			newArr.push(s)
+		})
+		return newArr
+	},
+	  previewImage(item,url,current){
+		  uni.previewImage({
+			  current,
+			  urls:item
+		  })
+	  },
+    resetHighlight(){
+      this.currentRowIndex = null
+      this.currentRow = {}
+    },
+    rowClick(row,index){
+      if(this.highlight){
+        this.currentRowIndex = index
+        this.currentRow = row
+        this.$emit('currentChange',row,index)
+      }
+      this.$emit('rowClick',row,index)
+    },
+    checkboxSelectedAll(e){
+      this.indeterminate = false
+      if(e.checked){
+        this.selectArr = []
+        this.checkedAll = true
+        this.data.forEach(item=>{
+          // this.$set(item,'checked',true)
+          item.checked = true
+          this.selectArr.push(item)
+        })
+      }else{
+        this.checkedAll = false
+        this.data.forEach(item=>{
+          this.$set(item,'checked',false)
+        })
+        this.selectArr = []
+      }
+      // #ifndef H5 || APP-PLUS
+      this.$forceUpdate()
+      // #endif
+      this.$emit('toggleAllSelection',e.checked,this.selectArr)
+    },
+    checkboxSelected(e,item){
+      // #ifdef H5 || APP-PLUS
+      this.$set(item,'checked',e.checked)
+      // #endif
+      // #ifndef H5 || APP-PLUS
+      this.data.forEach(item=>{
+        if(item.key===e.data.key){
+          item.checked = e.checked
+        }
+      })
+      // #endif
+      item.checked = e.checked
+      e.data.checked = e.checked
+      if(e.checked){
+        this.selectArr.push(e.data)
+      }else{
+        this.selectArr = this.selectArr.filter(item=>item.key!==e.data.key)
+      }
+      if(this.selectArr.length===this.transData.length){
+        this.indeterminate = false
+        this.checkedAll = true
+      }else{
+        this.indeterminate = true
+        this.checkedAll = false
+      }
+      if(!this.selectArr.length){
+        this.checkedAll = false
+        this.indeterminate = false
+      }
+      // #ifndef H5 || APP-PLUS
+      this.$forceUpdate()
+      // #endif
+      this.$emit('toggleRowSelection',e.checked,this.selectArr)
+    },
+    itemFilter(item,ite){
+      if(ite.filters&&ite.name){
+        let key = item[ite.name]
+        return ite.filters[key]||''
+      }
+      return item[ite.name]||ite.emptyString
+    },
+    // 默认字体为微软雅黑 Microsoft YaHei,字体大小为 14px
+    getTextWidth(str) {
+      if(str.length<3){
+        return 80
+      }
+      let regx = /^[0-9]+.?[0-9]*$/
+      let flexWidth = 0
+      for (const char of str) {
+        if ((char >= 'A' && char <= 'Z') || (char >= 'a' && char <= 'z')) {
+          // 如果是英文字符,为字符分配8个单位宽度
+          flexWidth += 20
+        } else if (char >= '\u4e00' && char <= '\u9fa5') {
+          // 如果是中文字符,为字符分配15个单位宽度
+          flexWidth += 30
+        } else if(regx.test(char)){
+          flexWidth += 18
+        }else {
+          // 其他种类字符,为字符分配8个单位宽度
+          flexWidth += 14
+        }
+      }
+      return flexWidth
+    },
+    width(item){
+      return `${item.width?item.width:'200'}rpx`
+    },
+    showStripe(index){
+      if(this.currentDriver)return
+      if(this.stripe){
+        return (index % 2) != 0?'odd':'even'
+      }else{
+        return ''
+      }
+    },
+    //验证字符串是否是数字
+    checkNumber(theObj) {
+      var reg = /^[0-9]+.?[0-9]*$/;
+      if (reg.test(theObj)) {
+        return true;
+      }
+      return false;
+    },
+    isDate(data){
+      if(isNaN(data)&&!isNaN(Date.parse(data))){
+        return true
+      }
+      return false
+    },
+    sortAction(item,index){
+      if(!item.sorter){return false}
+      this.$set(item,'sorterMode',item.sorterMode==='_asc'?'_desc':'_asc')
+      if(item.sorter==='custom'){
+        this.$emit('sort-change',item,item.sorterMode.replace('_',''),index)
+      }else {
+        this.sortData(item)
+      }
+      // #ifndef H5 || APP-PLUS
+      this.$forceUpdate()
+      // #endif
+    },
+    sortData(item){
+      let key = item.name
+
+      if(item.sorterMode==='_asc'){
+        this.data.sort((a,b)=>{
+          if(this.checkNumber(a[key])){
+            return a[key]-b[key]
+          }
+          if(this.isDate(a[key])){
+            let a1 = new Date(a[key]).getTime()
+            let b1 = new Date(b[key]).getTime()
+            return a1-b1
+          }
+        })
+      }else {
+        this.data.sort((a,b)=>{
+          if(this.checkNumber(a[key])){
+            return b[key]-a[key]
+          }
+          if(this.isDate(a[key])){
+            let a1 = new Date(a[key]).getTime()
+            let b1 = new Date(b[key]).getTime()
+            return b1-a1
+          }
+        })
+      }
+    },
+    throttle(method,delay=60){
+      let time = null
+      return (...args)=>{
+        if(!time){
+          time = setTimeout(()=>{
+            method(...args)
+            time = null;
+          },delay)
+        }
+      }
+    },
+    debounce(method,delay=1000){
+      return (...args)=>{
+        this.debounceTime&&clearTimeout(this.debounceTime)
+        this.debounceTime = setTimeout(()=>{
+          method(...args)
+        },delay)
+      }
+    },
+    handleBodyScroll(e){
+      if(this.currentDriver&&this.currentDriver!==e.currentTarget.id)return
+      this.currentDriver = e.currentTarget.id
+      this.headerTableLeft = e.detail.scrollLeft
+      this.headerFooterTableLeft = e.detail.scrollLeft
+      this.leftFiexScrollTop = e.detail.scrollTop
+      this.bodyTime&&clearTimeout(this.bodyTime)
+      this.bodyTime = setTimeout(()=>{
+        this.currentDriver=null
+      },200)
+
+    },
+    leftFixedScrollAction(e){
+      if(this.currentDriver&&this.currentDriver!==e.currentTarget.id)return
+      this.currentDriver = e.currentTarget.id
+      this.bodyScrollTop = e.detail.scrollTop
+      this.bodyTime&&clearTimeout(this.bodyTime)
+      this.bodyTime = setTimeout(()=>{
+        this.currentDriver=null
+      },200)
+    },
+    scrollToLeft(e){
+      if(this.currentDriver1&&this.currentDriver1!==e.currentTarget.id)return
+      this.currentDriver1 = e.currentTarget.id
+      if(e.detail.direction==='left'&&this.headerTableLeft<10){
+        this.headerTableLeft = 0
+      }else if(e.detail.direction==='top'&&this.leftFiexScrollTop<10){
+        this.leftFiexScrollTop = 0
+      }
+      this.bodyTime&&clearTimeout(this.bodyTime)
+      this.bodyTime = setTimeout(()=>{
+        this.currentDriver1=null
+      },200)
+    },
+    scrollToFixedLeft(e){
+      if(this.currentDriver1&&this.currentDriver1!==e.currentTarget.id)return
+      this.currentDriver1 = e.currentTarget.id
+      if(e.detail.direction==='top'&&this.bodyScrollTop<10){
+        this.bodyScrollTop = 0
+      }
+      this.bodyTime&&clearTimeout(this.bodyTime)
+      this.bodyTime = setTimeout(()=>{
+        this.currentDriver1=null
+      },200)
+    },
+    handleTableScrollLeft(e,type){
+      if(this.currentDriver&&this.currentDriver!==e.currentTarget.id)return
+      this.currentDriver = e.currentTarget.id
+      this.bodyTableLeft = e.detail.scrollLeft
+      this.headerFooterTableLeft = e.detail.scrollLeft
+      this.bodyTime&&clearTimeout(this.bodyTime)
+      this.bodyTime = setTimeout(()=>{
+        this.currentDriver=null
+      },200)
+    },
+    handleFooterTableScrollLeft(e){
+      if(this.currentDriver&&this.currentDriver!==e.currentTarget.id)return
+      this.currentDriver = e.currentTarget.id
+      this.bodyTableLeft = e.detail.scrollLeft
+      this.headerTableLeft = e.detail.scrollLeft
+      this.bodyTime&&clearTimeout(this.bodyTime)
+      this.bodyTime = setTimeout(()=>{
+        this.currentDriver=null
+      },200)
+    }
+  }
+}
+</script>
+<style lang="scss">
+.zb-table-fixed-left{
+  /*去除左边滚动条 */
+  scroll-view ::-webkit-scrollbar {
+    display: none !important;
+    width: 0 !important;
+    height: 0 !important;
+    -webkit-appearance: none;
+    background: transparent;
+  }
+}
+.zb-table-header{
+  ///*去除头部滚动条 */
+  scroll-view ::-webkit-scrollbar {
+    display: none !important;
+    width: 0 !important;
+    height: 0 !important;
+    -webkit-appearance: none;
+    background: transparent;
+  }
+}
+
+</style>
+<style lang="scss" scoped>
+.sorter-table{
+  position: absolute;
+  right: 2rpx;
+  top:50%;
+  transform:translateY(-50%);
+  .sorter-table-icon{
+    width: 0;
+    height: 0;
+    color: #dcdcdc;
+    border-right: 8rpx solid transparent;
+    border-left: 8rpx solid transparent;
+  }
+  .sorter-table-icon:first-child{
+    border-bottom: 14rpx solid currentColor;
+  }
+  .sorter-table-icon:last-child{
+    margin-top: 3rpx;
+    border-top: 14rpx solid currentColor;
+  }
+  .sorting_desc{
+    color: #2979ff;
+  }
+  .sorting_asc{
+    color: #2979ff;
+  }
+}
+.checkbox-item{
+  display: flex;align-items: center;justify-content: center;width: 100%;height: 100%
+}
+.no-data{
+  width: 100%;
+  height: 80rpx;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  // border-bottom: 1px solid #e8e8e8;
+}
+.item-th{
+  position: relative;
+  flex-shrink: 0;
+  width: 200rpx;
+  overflow-wrap: break-word;
+  border-bottom: 2rpx solid #e8e8e8;
+  transition: background 0.3s;
+  padding-right: 8rpx;
+  word-break:keep-all;           /* 不换行 */
+  white-space:nowrap;          /* 不换行 */
+  overflow:hidden;               /* 内容超出宽度时隐藏超出部分的内容 */
+  text-overflow:ellipsis;         /* 当对象内文本溢出时显示省略标记(...) ;需与overflow:hidden;一起使用。*/
+  overflow-wrap: break-word;
+  font-weight: bold;
+  font-size: 26rpx;
+  color: #161616;
+}
+.zb-table{
+  height: 100%;
+  overflow: hidden;
+  width: 100%;
+  display: flex;
+  flex-direction: column;
+  font-size: 28rpx;
+  position: relative;
+  .zb-table-content{
+    //height: 100%;
+    //flex: 1;
+    position: relative;
+    overflow: hidden;
+  }
+  .zb-table-fixed{
+    min-width: 100%;
+  }
+  .zb-table-body{
+    position: relative;
+    background: #fff;
+    transition: opacity 0.3s;
+  }
+  .item-tr{
+    display: flex;
+    //height: 41px;
+  }
+  .item-td{
+    flex-shrink: 0;
+    width:200rpx;
+    padding-left: 8rpx;
+    height: 80rpx;
+    line-height: 80rpx;
+	padding-right: 8rpx;
+    box-sizing: border-box;
+    word-break:keep-all;           /* 不换行 */
+    white-space:nowrap;          /* 不换行 */
+    overflow:hidden;               /* 内容超出宽度时隐藏超出部分的内容 */
+    text-overflow:ellipsis;         /* 当对象内文本溢出时显示省略标记(...) ;需与overflow:hidden;一起使用。*/
+    overflow-wrap: break-word;
+    border-bottom: 2rpx solid #e8e8e8;
+    //transition: background 0.3s;
+  }
+
+  .zb-table-fixed-left .zb-table-header{
+    overflow-y: hidden;
+  }
+  .zb-table-header {
+    overflow: hidden;
+    background: #F4F9FC;
+    .item-th{
+      padding-left: 8rpx;
+      line-height: 78rpx;
+      height: 80rpx;
+      //display: flex;
+      //align-items: center;
+      box-sizing: border-box;
+    }
+  }
+  .zb-table-fixed-left .zb-table-fixed{
+    background: #fff;
+  }
+  .zb-table-fixed-right .zb-table-fixed{
+    background: #fff;
+  }
+  .zb-table-body-inner{
+    height: 100%;
+    // overflow: scroll;
+  }
+  .zb-table-fixed-left{
+    position: absolute;
+    top: 0;
+    z-index: 1;
+    overflow: hidden;
+    border-radius: 0;
+    height: 100%;
+    //transition: box-shadow 0.3s ease;
+  }
+  .odd{
+    background: #F4F9FC;
+    //height: 100%;
+    width: 100%;
+  }
+  .even{
+    background-color:white ;
+    //height: 100%;
+    width: 100%;
+  }
+}
+.scroll-left-fixed{
+  .zb-table-fixed-left {
+    left: 0;
+    box-shadow: 12rpx 0 12rpx -8rpx #ccc;
+  }
+}
+.zb-table-applet{
+  height: 100%;
+  //overflow: hidden;
+  width: 100%;
+  position: relative;
+  display: flex;
+  flex-direction: column;
+  font-size: 28rpx;
+  .zb-table-content{
+    //height: 100%;
+    flex: 1;
+    overflow: hidden;
+    position: relative;
+
+  }
+  .zb-table-fixed{
+    min-width: 100%;
+    width: fit-content;
+  }
+
+  .zb-table-body{
+    position: relative;
+    background: #fff;
+    transition: opacity 0.3s;
+  }
+  .item-tr{
+    display: flex;
+    //height: 41px;
+  }
+  .item-td{
+    flex-shrink: 0;
+    width: 200rpx;
+    padding-left: 8rpx;
+    height: 80rpx;
+    line-height: 80rpx;
+	padding-right:8rpx;
+    box-sizing: border-box;
+    word-break:keep-all;           /* 不换行 */
+    white-space:nowrap;          /* 不换行 */
+    overflow:hidden;               /* 内容超出宽度时隐藏超出部分的内容 */
+    text-overflow:ellipsis;         /* 当对象内文本溢出时显示省略标记(...) ;需与overflow:hidden;一起使用。*/
+    overflow-wrap: break-word;
+    border-bottom: 2rpx solid #e8e8e8;
+    //transition: background 0.3s;
+  }
+  .zb-table-header {
+    //overflow: hidden;
+    position: sticky;
+    top: 0;
+    z-index: 2;
+    //width: fit-content;
+    .item-th{
+      padding-left: 8rpx;
+      line-height: 78rpx;
+      height: 80rpx;
+      box-sizing: border-box;
+      background: #fafafa;
+    }
+    .zb-stick-side{
+      position: sticky;
+      top: 0;
+      left: 0;
+      z-index: 2;
+      //border-right: solid 1rpx #dbdbdb;
+      box-sizing: border-box;
+      background: #fafafa;
+      //box-shadow: 6px 0 6px -4px #ccc;
+    }
+  }
+  .zb-table-fixed-left .zb-table-fixed{
+    background: #fff;
+  }
+  .zb-table-fixed-right .zb-table-fixed{
+    background: #fff;
+  }
+  .zb-table-fixed-header .zb-table-body-inner{
+    height: 100%;
+    // overflow: scroll;
+  }
+  .zb-table-fixed-left{
+    position: absolute;
+    top: 0;
+    z-index: 1;
+    overflow: hidden;
+    border-radius: 0;
+    height: 100%;
+    //transition: box-shadow 0.3s ease;
+  }
+  .scroll-left-fixed{
+    .zb-table-fixed-left {
+      left: 0;
+      box-shadow: 12rpx 0 12rpx -8rpx #ccc;
+    }
+  }
+  .odd{
+    background-color:rgba(249,249,249,0.6);
+    //height: 100%;
+    width: 100%;
+  }
+  .even{
+    background-color:white ;
+    //height: 100%;
+    width: 100%;
+  }
+  .zb-table-tbody {
+    .zb-stick-side{
+      position: sticky;
+      left: 0;
+      z-index: 1;
+      box-sizing: border-box;
+      background:white;
+      //box-shadow: 6px 0 6px -2px #ccc;
+    }
+    .odd{
+      background:#f9f9f9;
+      //height: 100%;
+      width: 100%;
+    }
+    .even{
+      background:white ;
+      //height: 100%;
+      width: 100%;
+    }
+  }
+  .current-row{
+    .item-td{
+      background-color: #ecf5ff;
+    }
+  }
+}
+.current-row{
+  .item-td{
+    background-color: #ecf5ff;
+  }
+}
+.zb-table-header{
+  height: 80rpx;
+}
+</style>

+ 113 - 0
property_ui/manage/pages/community/newsadd.vue

@@ -0,0 +1,113 @@
+<template>
+	<view class="check">
+		<uni-forms ref="form" :model="datainfo">
+			<!-- <view class="cbox">
+				<view class="chmain">
+					<uni-forms-item label="文章类型" name="phonenumber">
+						<picker range-key='text' :value="syqxidx" :range="sexs"   @change='bindDateChange'>
+							<view class="flexc">
+								<view class="flex1 txr f13" :class="datainfo.iszc?'co27':'coa'">{{datainfo.iszc?'是':'请选择文章类型'}}</view>
+								<view class="rimg"><image :src="rimg"></image></view>
+							</view>
+						</picker>
+					</uni-forms-item>
+				</view>
+			</view> -->
+			<view class="cbox">
+				<view class="chmain">
+					<uni-forms-item label-width='0'  name="phonenumber">
+						<uni-easyinput type="textarea" autoHeight v-model="datainfo.phonenumber" :inputBorder='false' placeholder="输入标题" />
+					</uni-forms-item>
+					<view>
+						<editor-box></editor-box>
+					</view>
+					<!-- <uni-forms-item label="文章类型" name="phonenumber">
+						<view class="flexc">
+							
+							<picker range-key='text' :value="syqxidx" :range="sexs"   @change='bindDateChange'>
+								<view class="rimg"><image :src="rimg"></image></view>
+							</picker>
+						</view>
+					</uni-forms-item> -->
+				</view>
+			</view>
+		</uni-forms>
+		<view class="rfbtn">发布</view>
+		<loading></loading>
+	</view>
+</template>
+
+<script>
+	import config from '@/config'
+	import editorBox from "@/manage/components/editor/editor.vue"
+	import {checkPermi,checkRole} from "@/utils/permission"; // 权限判断函数
+	export default {
+		components: {editorBox},
+		data() {
+			return {
+				rimg: require('@/work/static/people/rimg.png'),
+				baseUrl: config.baseUrl,
+				checkflag:true,
+				datainfo: {
+					sex:0,
+					realName: '',
+					idCard: '',
+					address: '',
+					expirationDate: '',
+					phonenumber: '',
+					front: '',
+					back: '',
+				},
+				syqxidx:'',
+				sexs: [{
+					text: '男',
+					value: 0
+				}, {
+					text: '女',
+					value: 1
+				}],
+			}
+		},
+		onLoad: function() {
+
+		},
+		methods: {
+			checkPermi,
+			checkRole,
+			bindDateChange(e){
+				var val=e.detail.value;
+				// this.datainfo.applicationBank=this.sdyhlist[val].value;
+				// this.applicationBank=this.sdyhlist[val].label;
+			},
+		}
+	}
+</script>
+<style>
+	page{background: #F3F3F0;}
+</style>
+<style lang="scss" scoped>
+.check /deep/ .uni-forms-item{min-height: 106rpx;box-sizing: border-box;display: flex;align-items: center;margin-bottom: 0;border-bottom: 2rpx solid #E6E6E6;padding:10rpx 0;}
+.check .cbox /deep/ .uni-forms-item:last-child{border: none;}
+.check /deep/ .uni-forms-item__label{font-weight: bold;font-size: 26rpx;color: #222327;flex: 0 0 auto;width: auto !important;}
+.check /deep/ .uni-easyinput{flex: 1;text-align: left;font-size: 26rpx;color: #222327;}
+.check /deep/ .uni-easyinput__content-textarea{min-height: 40rpx;font-size: 26rpx;}
+.check /deep/ .uni-easyinput__placeholder-class{font-size: 26rpx;color: #AAAAAA;}
+.check /deep/ .uni-easyinput__content-input{padding-left: 0 !important;}
+.check /deep/ .uni-input-input{font-size: 26rpx;}
+.check /deep/ .uni-textarea-textarea{font-size: 26rpx;}
+.check /deep/ .is-disabled{color: #222327;background-color: #ffffff !important;}
+.check /deep/ .uni-data-checklist .checklist-group .checklist-box{margin:10rpx 8rpx 10rpx 16rpx;}
+.check /deep/ .uni-data-checklist{flex: 0 0 auto;}
+.check{min-height: 100vh;padding: 20rpx 18rpx 110rpx;box-sizing: border-box;}
+.cbox{background: #FFFFFF;border-radius: 20rpx;flex: 1;margin-bottom: 24rpx;
+
+	.chmain{
+		padding: 0 32rpx;
+		.rimg{width: 16rpx;height: 28rpx;flex: 0 0 auto;margin-left: 20rpx;
+			image{width: 100%;height: 100%;}
+		}
+		.checkimg{width: 80rpx;height: 40rpx;margin-right: 8rpx;}
+	}
+	
+}
+</style>

+ 113 - 0
property_ui/manage/pages/community/newsadddj.vue

@@ -0,0 +1,113 @@
+<template>
+	<view class="check">
+		<uni-forms ref="form" :model="datainfo">
+			<view class="cbox">
+				<view class="chmain">
+					<uni-forms-item label="文章类型" name="phonenumber">
+						<picker range-key='text' :value="syqxidx" :range="sexs"   @change='bindDateChange'>
+							<view class="flexc">
+								<view class="flex1 txr f13" :class="datainfo.iszc?'co27':'coa'">{{datainfo.iszc?'是':'请选择文章类型'}}</view>
+								<view class="rimg"><image :src="rimg"></image></view>
+							</view>
+						</picker>
+					</uni-forms-item>
+				</view>
+			</view>
+			<view class="cbox">
+				<view class="chmain">
+					<uni-forms-item label-width='0'  name="phonenumber">
+						<uni-easyinput type="textarea" autoHeight v-model="datainfo.phonenumber" :inputBorder='false' placeholder="输入标题" />
+					</uni-forms-item>
+					<view>
+						<editor-box></editor-box>
+					</view>
+					<!-- <uni-forms-item label="文章类型" name="phonenumber">
+						<view class="flexc">
+							
+							<picker range-key='text' :value="syqxidx" :range="sexs"   @change='bindDateChange'>
+								<view class="rimg"><image :src="rimg"></image></view>
+							</picker>
+						</view>
+					</uni-forms-item> -->
+				</view>
+			</view>
+		</uni-forms>
+		<view class="rfbtn">发布</view>
+		<loading></loading>
+	</view>
+</template>
+
+<script>
+	import config from '@/config'
+	import editorBox from "@/manage/components/editor/editor.vue"
+	import {checkPermi,checkRole} from "@/utils/permission"; // 权限判断函数
+	export default {
+		components: {editorBox},
+		data() {
+			return {
+				rimg: require('@/work/static/people/rimg.png'),
+				baseUrl: config.baseUrl,
+				checkflag:true,
+				datainfo: {
+					sex:0,
+					realName: '',
+					idCard: '',
+					address: '',
+					expirationDate: '',
+					phonenumber: '',
+					front: '',
+					back: '',
+				},
+				syqxidx:'',
+				sexs: [{
+					text: '男',
+					value: 0
+				}, {
+					text: '女',
+					value: 1
+				}],
+			}
+		},
+		onLoad: function() {
+
+		},
+		methods: {
+			checkPermi,
+			checkRole,
+			bindDateChange(e){
+				var val=e.detail.value;
+				// this.datainfo.applicationBank=this.sdyhlist[val].value;
+				// this.applicationBank=this.sdyhlist[val].label;
+			},
+		}
+	}
+</script>
+<style>
+	page{background: #F3F3F0;}
+</style>
+<style lang="scss" scoped>
+.check /deep/ .uni-forms-item{min-height: 106rpx;box-sizing: border-box;display: flex;align-items: center;margin-bottom: 0;border-bottom: 2rpx solid #E6E6E6;padding:10rpx 0;}
+.check .cbox /deep/ .uni-forms-item:last-child{border: none;}
+.check /deep/ .uni-forms-item__label{font-weight: bold;font-size: 26rpx;color: #222327;flex: 0 0 auto;width: auto !important;}
+.check /deep/ .uni-easyinput{flex: 1;text-align: left;font-size: 26rpx;color: #222327;}
+.check /deep/ .uni-easyinput__content-textarea{min-height: 40rpx;font-size: 26rpx;}
+.check /deep/ .uni-easyinput__placeholder-class{font-size: 26rpx;color: #AAAAAA;}
+.check /deep/ .uni-easyinput__content-input{padding-left: 0 !important;}
+.check /deep/ .uni-input-input{font-size: 26rpx;}
+.check /deep/ .uni-textarea-textarea{font-size: 26rpx;}
+.check /deep/ .is-disabled{color: #222327;background-color: #ffffff !important;}
+.check /deep/ .uni-data-checklist .checklist-group .checklist-box{margin:10rpx 8rpx 10rpx 16rpx;}
+.check /deep/ .uni-data-checklist{flex: 0 0 auto;}
+.check{min-height: 100vh;padding: 20rpx 18rpx 110rpx;box-sizing: border-box;}
+.cbox{background: #FFFFFF;border-radius: 20rpx;flex: 1;margin-bottom: 24rpx;
+
+	.chmain{
+		padding: 0 32rpx;
+		.rimg{width: 16rpx;height: 28rpx;flex: 0 0 auto;margin-left: 20rpx;
+			image{width: 100%;height: 100%;}
+		}
+		.checkimg{width: 80rpx;height: 40rpx;margin-right: 8rpx;}
+	}
+	
+}
+</style>

+ 113 - 0
property_ui/manage/pages/community/newsaddsq.vue

@@ -0,0 +1,113 @@
+<template>
+	<view class="check">
+		<uni-forms ref="form" :model="datainfo">
+			<view class="cbox">
+				<view class="chmain">
+					<uni-forms-item label="资讯类型" name="phonenumber">
+						<picker range-key='text' :value="syqxidx" :range="sexs"   @change='bindDateChange'>
+							<view class="flexc">
+								<view class="flex1 txr f13" :class="datainfo.iszc?'co27':'coa'">{{datainfo.iszc?'是':'请选择资讯类型'}}</view>
+								<view class="rimg"><image :src="rimg"></image></view>
+							</view>
+						</picker>
+					</uni-forms-item>
+				</view>
+			</view>
+			<view class="cbox">
+				<view class="chmain">
+					<uni-forms-item label-width='0'  name="phonenumber">
+						<uni-easyinput type="textarea" autoHeight v-model="datainfo.phonenumber" :inputBorder='false' placeholder="输入标题" />
+					</uni-forms-item>
+					<view>
+						<editor-box></editor-box>
+					</view>
+					<!-- <uni-forms-item label="文章类型" name="phonenumber">
+						<view class="flexc">
+							
+							<picker range-key='text' :value="syqxidx" :range="sexs"   @change='bindDateChange'>
+								<view class="rimg"><image :src="rimg"></image></view>
+							</picker>
+						</view>
+					</uni-forms-item> -->
+				</view>
+			</view>
+		</uni-forms>
+		<view class="rfbtn">发布</view>
+		<loading></loading>
+	</view>
+</template>
+
+<script>
+	import config from '@/config'
+	import editorBox from "@/manage/components/editor/editor.vue"
+	import {checkPermi,checkRole} from "@/utils/permission"; // 权限判断函数
+	export default {
+		components: {editorBox},
+		data() {
+			return {
+				rimg: require('@/work/static/people/rimg.png'),
+				baseUrl: config.baseUrl,
+				checkflag:true,
+				datainfo: {
+					sex:0,
+					realName: '',
+					idCard: '',
+					address: '',
+					expirationDate: '',
+					phonenumber: '',
+					front: '',
+					back: '',
+				},
+				syqxidx:'',
+				sexs: [{
+					text: '男',
+					value: 0
+				}, {
+					text: '女',
+					value: 1
+				}],
+			}
+		},
+		onLoad: function() {
+
+		},
+		methods: {
+			checkPermi,
+			checkRole,
+			bindDateChange(e){
+				var val=e.detail.value;
+				// this.datainfo.applicationBank=this.sdyhlist[val].value;
+				// this.applicationBank=this.sdyhlist[val].label;
+			},
+		}
+	}
+</script>
+<style>
+	page{background: #F3F3F0;}
+</style>
+<style lang="scss" scoped>
+.check /deep/ .uni-forms-item{min-height: 106rpx;box-sizing: border-box;display: flex;align-items: center;margin-bottom: 0;border-bottom: 2rpx solid #E6E6E6;padding:10rpx 0;}
+.check .cbox /deep/ .uni-forms-item:last-child{border: none;}
+.check /deep/ .uni-forms-item__label{font-weight: bold;font-size: 26rpx;color: #222327;flex: 0 0 auto;width: auto !important;}
+.check /deep/ .uni-easyinput{flex: 1;text-align: left;font-size: 26rpx;color: #222327;}
+.check /deep/ .uni-easyinput__content-textarea{min-height: 40rpx;font-size: 26rpx;}
+.check /deep/ .uni-easyinput__placeholder-class{font-size: 26rpx;color: #AAAAAA;}
+.check /deep/ .uni-easyinput__content-input{padding-left: 0 !important;}
+.check /deep/ .uni-input-input{font-size: 26rpx;}
+.check /deep/ .uni-textarea-textarea{font-size: 26rpx;}
+.check /deep/ .is-disabled{color: #222327;background-color: #ffffff !important;}
+.check /deep/ .uni-data-checklist .checklist-group .checklist-box{margin:10rpx 8rpx 10rpx 16rpx;}
+.check /deep/ .uni-data-checklist{flex: 0 0 auto;}
+.check{min-height: 100vh;padding: 20rpx 18rpx 110rpx;box-sizing: border-box;}
+.cbox{background: #FFFFFF;border-radius: 20rpx;flex: 1;margin-bottom: 24rpx;
+
+	.chmain{
+		padding: 0 32rpx;
+		.rimg{width: 16rpx;height: 28rpx;flex: 0 0 auto;margin-left: 20rpx;
+			image{width: 100%;height: 100%;}
+		}
+		.checkimg{width: 80rpx;height: 40rpx;margin-right: 8rpx;}
+	}
+	
+}
+</style>

+ 109 - 0
property_ui/manage/pages/community/newsaddvideo.vue

@@ -0,0 +1,109 @@
+<template>
+	<view class="check">
+		<uni-forms ref="form" :model="datainfo">
+			<!-- <view class="cbox">
+				<view class="chmain">
+					<uni-forms-item label="文章类型" name="phonenumber">
+						<picker range-key='text' :value="syqxidx" :range="sexs"   @change='bindDateChange'>
+							<view class="flexc">
+								<view class="flex1 txr f13" :class="datainfo.iszc?'co27':'coa'">{{datainfo.iszc?'是':'请选择文章类型'}}</view>
+								<view class="rimg"><image :src="rimg"></image></view>
+							</view>
+						</picker>
+					</uni-forms-item>
+				</view>
+			</view> -->
+			<view class="cbox">
+				<view class="chmain">
+					<uni-forms-item label-width='0'  name="phonenumber">
+						<uni-easyinput type="textarea" autoHeight v-model="datainfo.phonenumber" :inputBorder='false' placeholder="输入标题" />
+					</uni-forms-item>
+					<view class="addbox flexdcc">
+						<image :src="video"></image>
+						<view>添加视频</view>
+					</view>
+					<view class="flexcw">
+						<view class="imgs">
+							<video class="img" id="myVideo" src="https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/2minute-demo.mp4"
+							      @error="videoErrorCallback" :danmu-list="danmuList" enable-danmu danmu-btn controls></video>
+							<image :src="del" class="del"></image>
+						</view>
+					</view>
+				</view>
+			</view>
+		</uni-forms>
+		<view class="rfbtn">发布</view>
+		<loading></loading>
+	</view>
+</template>
+
+<script>
+	import config from '@/config'
+	import {checkPermi,checkRole} from "@/utils/permission"; // 权限判断函数
+	export default {
+		components: {},
+		data() {
+			return {
+				video: require('@/manage/static/community/video.png'),
+				del: require('@/work/static/car/del.png'),
+				baseUrl: config.baseUrl,
+				checkflag:true,
+				datainfo: {
+					sex:0,
+					realName: '',
+					idCard: '',
+					address: '',
+					expirationDate: '',
+					phonenumber: '',
+					front: '',
+					back: '',
+				},
+			}
+		},
+		onLoad: function() {
+
+		},
+		methods: {
+			checkPermi,
+			checkRole,
+		}
+	}
+</script>
+<style>
+	page{background: #F3F3F0;}
+</style>
+<style lang="scss" scoped>
+.check /deep/ .uni-forms-item{min-height: 106rpx;box-sizing: border-box;display: flex;align-items: center;margin-bottom: 0;border-bottom: 2rpx solid #E6E6E6;padding:10rpx 0;}
+.check .cbox /deep/ .uni-forms-item:last-child{border: none;}
+.check /deep/ .uni-forms-item__label{font-weight: bold;font-size: 26rpx;color: #222327;flex: 0 0 auto;width: auto !important;}
+.check /deep/ .uni-easyinput{flex: 1;text-align: left;font-size: 26rpx;color: #222327;}
+.check /deep/ .uni-easyinput__content-textarea{min-height: 40rpx;font-size: 26rpx;}
+.check /deep/ .uni-easyinput__placeholder-class{font-size: 26rpx;color: #AAAAAA;}
+.check /deep/ .uni-easyinput__content-input{padding-left: 0 !important;}
+.check /deep/ .uni-input-input{font-size: 26rpx;}
+.check /deep/ .uni-textarea-textarea{font-size: 26rpx;}
+.check /deep/ .is-disabled{color: #222327;background-color: #ffffff !important;}
+.check /deep/ .uni-data-checklist .checklist-group .checklist-box{margin:10rpx 8rpx 10rpx 16rpx;}
+.check /deep/ .uni-data-checklist{flex: 0 0 auto;}
+.check{min-height: 100vh;padding: 20rpx 18rpx 110rpx;box-sizing: border-box;}
+.cbox{background: #FFFFFF;border-radius: 20rpx;flex: 1;margin-bottom: 24rpx;
+
+	.chmain{
+		padding: 0 32rpx 10rpx;min-height: calc(100vh - 146rpx);box-sizing: border-box;
+		.rimg{width: 16rpx;height: 28rpx;flex: 0 0 auto;margin-left: 20rpx;
+			image{width: 100%;height: 100%;}
+		}
+		.checkimg{width: 80rpx;height: 40rpx;margin-right: 8rpx;}
+	}
+	
+}
+.addbox{height: 190rpx;background: #FFFFFF;border-radius: 10rpx;border: 2rpx dashed #A7A7A7;margin: 48rpx 0 56rpx;
+	image{width: 54rpx;height: 46rpx;margin-bottom: 16rpx;}
+	view{font-weight: bold;font-size: 26rpx;color: #272727;}
+}
+.imgs{
+	width: 310rpx;height: 186rpx;position: relative;margin: 0 10rpx 10rpx 0;
+	.img{width: 100%;height: 100%;}
+	.del{width: 24rpx;height: 24rpx;position: absolute;right: 0;top: 0;z-index: 2;}
+}
+</style>

+ 132 - 0
property_ui/manage/pages/community/newsdj.vue

@@ -0,0 +1,132 @@
+<template>
+	<view class="car">
+		<view class="cartop">
+			<view class="toptit">
+				<image :src="djtop"></image>本社区党员共<text>367</text>人
+			</view>
+			<view class="tabtop flexc">
+				<view class="tabt" :class="ttopval==ite.val?'act':''" v-for="(ite,idx) in ttoplist" :key="idx" @click="getTabtop(ite.val)">{{ite.tit}}</view>
+			</view>
+		</view>
+		<!-- 列表 -->
+		<view class="carlists">
+			<car-list :datainfo="list" :topval="ttopval" :wtdt="wtdt" type='newsdj' @getDetail="getDetail"></car-list>
+		</view>
+		<view class="rfbtn" @click="getAddFn">发布</view>
+		<loading></loading>
+	</view>
+</template>
+
+<script>
+	import config from '@/config'
+	const baseUrl = config.baseUrl
+	import carList from "@/manage/components/car/list.vue"
+	import { checkPermi, checkRole } from "@/utils/permission"; // 权限判断函数
+	export default{
+		components:{carList},
+		data(){
+			return{
+				djtop:require('@/manage/static/community/djtop.png'),
+				cxrq:"",
+				text:'',
+				list:[{tit:'皖A IC520',type:1,right:0},{tit:'晋E KD783',type:2,right:0},],
+				pageSize: 10,
+				pageNum: 1,
+				reachflag: true,
+				wtdt:'',
+				ttopval:'0',
+				ttoplist:[{tit:'党建活动',val:0},{tit:'党建学习',val:1},{tit:'党建知识',val:2}]
+			}
+		},
+		onLoad: function() {
+		
+		},
+		// 上拉触底加载更多触发事件
+		onReachBottom() {
+			if (this.reachflag) {
+				this.pageNum++
+				this.getDataFn()
+			}
+		},
+		methods:{
+			checkPermi, checkRole,
+			getAddFn(){
+				this.$tab.navigateTo("/manage/pages/community/newsadddj")
+			},
+			getTabtop(val){
+				this.ttopval=val
+			},
+			getrefreshData(){
+				this.pageNum=1;
+				this.list=[];
+				this.reachflag=true;
+				this.getDataFn()
+			},
+			getTabFn(val){
+				this.tabval=val
+			},
+			bindDateChangea(e){
+				var val=e.detail.value;
+				this.cxrq=val;
+			},
+			getDataFn(){
+				var params={
+					pageSize:this.pageSize,
+					pageNum: this.pageNum,
+				}
+				params.noticeType=this.tabidx
+				getNoticeList(params).then(res=>{
+					if(res.code==200){
+						if (res.rows.length < this.pageSize) {
+							this.reachflag = false
+							this.wtdt = '到底了~';
+						} else {
+							var num = parseInt(res.rows.length) + parseInt(this.pageSize) * parseInt(this.pageNum -	1)
+							if (num < res.total) {
+								this.reachflag = true
+								this.wtdt = ''
+							} else {
+								this.reachflag = false
+								this.wtdt = '到底了~';
+							}
+						}
+						var newArr=JSON.parse(JSON.stringify(res.rows))
+						newArr.forEach(ite=>{
+							ite.right=0;
+						})
+						// console.log(newArr,555)
+						if (this.pageNum == 1) {
+							this.list = newArr;
+						} else {
+							this.list = this.list.concat(newArr)
+						}
+					}else{
+						this.$toast(res.msg)
+					}
+				})
+				
+			},
+		}
+	}
+</script>
+<style>
+	page{background: #F3F3F0;}
+</style>
+<style lang="scss" scoped>
+.car{padding: 200rpx 0 110rpx;}
+.cartop{position: fixed;left: 0;right: 0;top: 0;background-color: #ffffff;z-index: 2;
+	.toptit{display: flex;justify-content: center;font-weight: 500;font-size: 26rpx;color: #8592AA;height: 70rpx;align-items: center;
+background: #E4EDFF;
+		text{font-size: 32rpx;color: #0156FE;padding: 0 10rpx;}
+		image{width: 28rpx;height: 26rpx;flex: 0 0 auto;margin-right: 12rpx;}
+	}
+	.tabtop{padding-bottom: 40rpx;padding-top: 14rpx;
+		.tabt{font-weight: 500;font-size: 32rpx;color: #666666;position: relative;line-height: 56rpx;padding: 0 40rpx;
+			&.act{font-weight: bold;font-size: 32rpx;color: #272727;
+			&::after{content: '';width: 40rpx;height: 10rpx;background: #0156FE;border-radius: 6rpx;position: absolute;left: 50%;margin-left: -20rpx;bottom: -10rpx;}
+			}
+		}
+	}
+}
+.carlists{padding: 0 18rpx;}
+</style>

+ 134 - 0
property_ui/manage/pages/community/newssq.vue

@@ -0,0 +1,134 @@
+<template>
+	<view class="car">
+		<view class="cartop">
+			<view class="tabtop flexc">
+				<view class="tabt" :class="ttopval==ite.val?'act':''" v-for="(ite,idx) in ttoplist" :key="idx" @click="getTabtop(ite.val)">{{ite.tit}}</view>
+				<view class="numbox">
+					未读互动<text>27</text>
+				</view>
+			</view>
+		</view>
+		<!-- 列表 -->
+		<view class="carlists">
+			<car-list :datainfo="list" :topval="ttopval" :wtdt="wtdt" type='newssq' @getDetail="getDetail"></car-list>
+		</view>
+		<view class="rfbtn" @click="getAddFn">发布</view>
+		<loading></loading>
+	</view>
+</template>
+
+<script>
+	import config from '@/config'
+	const baseUrl = config.baseUrl
+	import carList from "@/manage/components/car/list.vue"
+	import { checkPermi, checkRole } from "@/utils/permission"; // 权限判断函数
+	export default{
+		components:{carList},
+		data(){
+			return{
+				cxrq:"",
+				text:'',
+				list:[{tit:'皖A IC520',type:1,right:0},{tit:'晋E KD783',type:2,right:0},],
+				pageSize: 10,
+				pageNum: 1,
+				reachflag: true,
+				wtdt:'',
+				ttopval:'0',
+				ttoplist:[{tit:'公告',val:0},{tit:'通知',val:1},{tit:'资讯',val:2}]
+			}
+		},
+		onLoad: function() {
+		
+		},
+		// 上拉触底加载更多触发事件
+		onReachBottom() {
+			if (this.reachflag) {
+				this.pageNum++
+				this.getDataFn()
+			}
+		},
+		methods:{
+			checkPermi, checkRole,
+			getAddFn(){
+				this.$tab.navigateTo("/manage/pages/community/newsaddsq")
+			},
+			getTabtop(val){
+				this.ttopval=val
+			},
+			getrefreshData(){
+				this.pageNum=1;
+				this.list=[];
+				this.reachflag=true;
+				this.getDataFn()
+			},
+			getTabFn(val){
+				this.tabval=val
+			},
+			bindDateChangea(e){
+				var val=e.detail.value;
+				this.cxrq=val;
+			},
+			getDataFn(){
+				var params={
+					pageSize:this.pageSize,
+					pageNum: this.pageNum,
+				}
+				params.noticeType=this.tabidx
+				getNoticeList(params).then(res=>{
+					if(res.code==200){
+						if (res.rows.length < this.pageSize) {
+							this.reachflag = false
+							this.wtdt = '到底了~';
+						} else {
+							var num = parseInt(res.rows.length) + parseInt(this.pageSize) * parseInt(this.pageNum -	1)
+							if (num < res.total) {
+								this.reachflag = true
+								this.wtdt = ''
+							} else {
+								this.reachflag = false
+								this.wtdt = '到底了~';
+							}
+						}
+						var newArr=JSON.parse(JSON.stringify(res.rows))
+						newArr.forEach(ite=>{
+							ite.right=0;
+						})
+						// console.log(newArr,555)
+						if (this.pageNum == 1) {
+							this.list = newArr;
+						} else {
+							this.list = this.list.concat(newArr)
+						}
+					}else{
+						this.$toast(res.msg)
+					}
+				})
+				
+			},
+		}
+	}
+</script>
+<style>
+	page{background: #F3F3F0;}
+</style>
+<style lang="scss" scoped>
+.car{padding: 148rpx 0 110rpx;}
+.cartop{position: fixed;left: 0;right: 0;top: 0;background-color: #ffffff;z-index: 2;
+	.tabtop{padding:28rpx 200rpx 40rpx 0;position: relative;
+		.tabt{font-weight: 500;font-size: 32rpx;color: #666666;position: relative;line-height: 56rpx;padding: 0 40rpx;
+			&.act{font-weight: bold;font-size: 32rpx;color: #272727;
+			&::after{content: '';width: 40rpx;height: 10rpx;background: #0156FE;border-radius: 6rpx;position: absolute;left: 50%;margin-left: -20rpx;bottom: -10rpx;}
+			}
+		}
+		.numbox{width: 188rpx;height: 58rpx;background-color: #E6E6E6;border-radius: 29rpx 0 0 29rpx;font-weight: 500;font-size: 26rpx;color: #0156FE;display: flex;align-items: center;justify-content: center;position: absolute;right: 0;
+			text{height: 20rpx;min-width: 20rpx;padding: 0 8rpx;box-sizing: border-box;line-height: 20rpx;margin-left: 10rpx;font-weight: bold;
+font-size:16rpx;
+color: #FCF9F1;
+
+background: #D32C26;
+border-radius: 5px;}
+		}
+	}
+}
+.carlists{padding: 0 18rpx;}
+</style>

+ 144 - 0
property_ui/manage/pages/community/newsyg.vue

@@ -0,0 +1,144 @@
+<template>
+	<view class="car">
+		<view class="cartop">
+			<view class="tabtop flexc">
+				<view class="tabt" :class="ttopval==ite.val?'act':''" v-for="(ite,idx) in ttoplist" :key="idx" @click="getTabtop(ite.val)">{{ite.tit}}</view>
+				<view class="numbox" @click="getCount">
+					阅读统计
+				</view>
+			</view>
+		</view>
+		<!-- 列表 -->
+		<view class="carlists">
+			<car-list :datainfo="list" :wtdt="wtdt" :type='ttopval' @getDetail="getDetail" @getReadlist="getReadlist"></car-list>
+		</view>
+		<view class="rfbtn" @click="getAddFn" v-if="ttopval=='ystv'">发布图文</view>
+		<view class="rfbtn" @click="getAddvideoFn" v-else>发布视频</view>
+		<loading></loading>
+	</view>
+</template>
+
+<script>
+	import config from '@/config'
+	const baseUrl = config.baseUrl
+	import carList from "@/manage/components/car/list.vue"
+	import { checkPermi, checkRole } from "@/utils/permission"; // 权限判断函数
+	export default{
+		components:{carList},
+		data(){
+			return{
+				cxrq:"",
+				text:'',
+				list:[{tit:'皖A IC520',type:1,right:0},{tit:'晋E KD783',type:2,right:0},],
+				pageSize: 10,
+				pageNum: 1,
+				reachflag: true,
+				wtdt:'',
+				ttopval:'ystv',
+				ttoplist:[{tit:'图文',val:'ystv'},{tit:'视频',val:'ygsp'}]
+			}
+		},
+		onLoad: function() {
+		
+		},
+		// 上拉触底加载更多触发事件
+		onReachBottom() {
+			if (this.reachflag) {
+				this.pageNum++
+				this.getDataFn()
+			}
+		},
+		methods:{
+			checkPermi, checkRole,
+			getAddFn(){
+				this.$tab.navigateTo("/manage/pages/community/newsadd")
+			},
+			getAddvideoFn(){
+				this.$tab.navigateTo("/manage/pages/community/newsaddvideo")
+			},
+			getReadlist(){
+				this.$tab.navigateTo("/manage/pages/community/readlist")
+			},
+			getCount(){
+				this.$tab.navigateTo("/manage/pages/community/readcount")
+			},
+			getTabtop(val){
+				this.ttopval=val
+			},
+			getrefreshData(){
+				this.pageNum=1;
+				this.list=[];
+				this.reachflag=true;
+				this.getDataFn()
+			},
+			getTabFn(val){
+				this.tabval=val
+			},
+			bindDateChangea(e){
+				var val=e.detail.value;
+				this.cxrq=val;
+			},
+			getDataFn(){
+				var params={
+					pageSize:this.pageSize,
+					pageNum: this.pageNum,
+				}
+				params.noticeType=this.tabidx
+				getNoticeList(params).then(res=>{
+					if(res.code==200){
+						if (res.rows.length < this.pageSize) {
+							this.reachflag = false
+							this.wtdt = '到底了~';
+						} else {
+							var num = parseInt(res.rows.length) + parseInt(this.pageSize) * parseInt(this.pageNum -	1)
+							if (num < res.total) {
+								this.reachflag = true
+								this.wtdt = ''
+							} else {
+								this.reachflag = false
+								this.wtdt = '到底了~';
+							}
+						}
+						var newArr=JSON.parse(JSON.stringify(res.rows))
+						newArr.forEach(ite=>{
+							ite.right=0;
+						})
+						// console.log(newArr,555)
+						if (this.pageNum == 1) {
+							this.list = newArr;
+						} else {
+							this.list = this.list.concat(newArr)
+						}
+					}else{
+						this.$toast(res.msg)
+					}
+				})
+				
+			},
+		}
+	}
+</script>
+<style>
+	page{background: #F3F3F0;}
+</style>
+<style lang="scss" scoped>
+.car{padding: 148rpx 0 110rpx;}
+.cartop{position: fixed;left: 0;right: 0;top: 0;background-color: #ffffff;z-index: 2;
+	.tabtop{padding:28rpx 200rpx 40rpx 0;position: relative;
+		.tabt{font-weight: 500;font-size: 32rpx;color: #666666;position: relative;line-height: 56rpx;padding: 0 40rpx;
+			&.act{font-weight: bold;font-size: 32rpx;color: #272727;
+			&::after{content: '';width: 40rpx;height: 10rpx;background: #0156FE;border-radius: 6rpx;position: absolute;left: 50%;margin-left: -20rpx;bottom: -10rpx;}
+			}
+		}
+		.numbox{width: 152rpx;height: 58rpx;background-color: #FFD5C1;border-radius: 29rpx 0 0 29rpx;font-weight: 500;font-size: 26rpx;color: #FE5A0E;display: flex;align-items: center;justify-content: center;position: absolute;right: 0;
+			text{height: 20rpx;min-width: 20rpx;padding: 0 8rpx;box-sizing: border-box;line-height: 20rpx;margin-left: 10rpx;font-weight: bold;
+font-size:16rpx;
+color: #FCF9F1;
+
+background: #D32C26;
+border-radius: 5px;}
+		}
+	}
+}
+.carlists{padding: 0 18rpx;}
+</style>

+ 188 - 0
property_ui/manage/pages/community/readcount.vue

@@ -0,0 +1,188 @@
+<template>
+	<view class="car">
+		<view class="cartop">
+			<view class="topa flexc">
+				<!-- <image :src="reset" class="resetimg" @click="getReset"></image>
+				<picker mode="date"   @change='bindDateChangea'>
+					<view class="chekt flexc">
+						<view>{{cxrq|| "选择日期"}}</view>
+						<image :src="up"></image>
+					</view>
+				</picker> -->
+				<view class="search flexc">
+					<image :src="search"></image>
+					<input placeholder="请输入姓名进行搜索"  v-model="text"/>
+					<view class="btn" @click="getConfirm">搜索</view>
+				</view>
+			</view>
+			<view class="flexcj conttips">
+				<view class="toptip">当前统计人数共<text>274</text>人</view>
+				<view class="topsort" @click="tallflag=!tallflag">
+					{{tallflag?"从高到低":"从低到高"}}
+					<view class="imgs" v-if="tallflag">
+						<image :src="up"></image><image :src="downa"></image>
+					</view>
+					<view class="imgs" v-else>
+						<image :src="upa"></image><image :src="down"></image>
+					</view>
+				</view>
+			</view>
+			
+			<!-- <view class="tabtop flexc">
+				<view class="tabt" :class="ttopval==ite.val?'act':''" v-for="(ite,idx) in ttoplist" :key="idx" @click="getTabtop(ite.val)">{{ite.tit}}</view>
+			</view> -->
+		</view>
+		<!-- 列表 -->
+		<view class="carlists">
+			<car-list :datainfo="list" :topval="ttopval" :wtdt="wtdt" type='readcount' @getDetail="getDetail"></car-list>
+		</view>
+		<loading></loading>
+	</view>
+</template>
+
+<script>
+	import config from '@/config'
+	const baseUrl = config.baseUrl
+	import carList from "@/manage/components/car/list.vue"
+	import { checkPermi, checkRole } from "@/utils/permission"; // 权限判断函数
+	export default{
+		components:{carList},
+		data(){
+			return{
+				reset:require('@/work/static/car/reset.png'),
+				search:require('@/work/static/car/search.png'),
+				up:require('@/manage/static/community/up.png'),
+				upa:require('@/manage/static/community/upa.png'),
+				down:require('@/manage/static/community/down.png'),
+				downa:require('@/manage/static/community/downa.png'),
+				cxrq:"",
+				text:'',
+				list:[{tit:'皖A IC520',type:1,right:0},{tit:'晋E KD783',type:2,right:0},],
+				pageSize: 10,
+				pageNum: 1,
+				reachflag: true,
+				wtdt:'',
+				tallflag:true,
+				ttopval:'0',
+				ttoplist:[{tit:'全部',val:0},{tit:'待回复',val:1},{tit:'已回复',val:2},{tit:'已完成',val:2}]
+			}
+		},
+		onLoad: function() {
+		
+		},
+		// 上拉触底加载更多触发事件
+		onReachBottom() {
+			if (this.reachflag) {
+				this.pageNum++
+				this.getDataFn()
+			}
+		},
+		methods:{
+			checkPermi, checkRole,
+			getDetail(){
+				this.$tab.navigateTo("/work/pages/service/complaintdetail")
+			},
+			getTabtop(val){
+				this.ttopval=val
+			},
+			getConfirm(){
+				this.getrefreshData()
+			},
+			getReset(){
+				this.cxrq='';
+				this.text='';
+				this.getrefreshData()
+			},
+			getrefreshData(){
+				this.pageNum=1;
+				this.list=[];
+				this.reachflag=true;
+				this.getDataFn()
+			},
+			getTabFn(val){
+				this.tabval=val
+			},
+			bindDateChangea(e){
+				var val=e.detail.value;
+				this.cxrq=val;
+			},
+			getDataFn(){
+				var params={
+					pageSize:this.pageSize,
+					pageNum: this.pageNum,
+				}
+				params.noticeType=this.tabidx
+				getNoticeList(params).then(res=>{
+					if(res.code==200){
+						if (res.rows.length < this.pageSize) {
+							this.reachflag = false
+							this.wtdt = '到底了~';
+						} else {
+							var num = parseInt(res.rows.length) + parseInt(this.pageSize) * parseInt(this.pageNum -	1)
+							if (num < res.total) {
+								this.reachflag = true
+								this.wtdt = ''
+							} else {
+								this.reachflag = false
+								this.wtdt = '到底了~';
+							}
+						}
+						var newArr=JSON.parse(JSON.stringify(res.rows))
+						newArr.forEach(ite=>{
+							ite.right=0;
+						})
+						// console.log(newArr,555)
+						if (this.pageNum == 1) {
+							this.list = newArr;
+						} else {
+							this.list = this.list.concat(newArr)
+						}
+					}else{
+						this.$toast(res.msg)
+					}
+				})
+				
+			},
+		}
+	}
+</script>
+<style>
+	page{background: #F3F3F0;}
+</style>
+<style lang="scss" scoped>
+.car{padding: 172rpx 0 0rpx;}
+.cartop{position: fixed;left: 0;right: 0;top: 0;background-color: #ffffff;z-index: 2;
+	.topa{padding: 20rpx;padding-bottom: 30rpx;
+		.resetimg{width: 36rpx;height: 36rpx;margin-right: 24rpx;flex: 0 0 auto;}
+		.chekt{min-width: 180rpx;
+			view{font-weight: 500;font-size: 26rpx;color: #272727;flex: 1;}
+			image{width: 24rpx;height: 16rpx;margin-left: 18rpx;flex: 0 0 auto;}
+		}
+		.search{flex: 1;margin-left: 16rpx;height: 64rpx;background: #EEEEEE;border-radius: 32rpx;border: 2rpx solid #E6E6E6;padding-left: 24rpx;box-sizing: border-box;
+		image{width: 32rpx;height: 34rpx;margin-right: 22rpx;flex: 0 0 auto;}
+		input{flex: 1;font-size: 26rpx;color: #272727;}
+		.btn{width: 100rpx;height: 64rpx;background: #3565ED;border-radius: 32rpx;flex: 0 0 auto;font-weight: bold;text-align: center;line-height: 64rpx;
+font-size: 26rpx;
+color: #FFFFFF;}
+		}
+	}
+	.tabtop{padding-bottom: 40rpx;padding-top: 24rpx;
+		.tabt{font-weight: 500;font-size: 32rpx;color: #666666;position: relative;line-height: 56rpx;padding: 0 40rpx;
+			&.act{font-weight: bold;font-size: 32rpx;color: #272727;
+			&::after{content: '';width: 40rpx;height: 10rpx;background: #0156FE;border-radius: 6rpx;position: absolute;left: 50%;margin-left: -20rpx;bottom: -10rpx;}
+			}
+		}
+	}
+}
+.conttips{padding: 18rpx 32rpx;background: #F3F3F0;}
+.toptip{font-weight: 500;font-size:26rpx;color: #666666; line-height: 36rpx;
+	text{color: #4671ED;display: inline-block;font-weight: bold;padding: 0 6rpx;}
+}
+.topsort{font-size: 26rpx;color: #FE5A0E;display: flex;align-items: center;
+	.imgs{margin-left: 8rpx;height: 34rpx;display: flex;align-items: center;
+		image{width: 12rpx;height: 20rpx;margin-left: 4rpx;}
+	}
+	
+}
+.carlists{padding: 0 18rpx;}
+</style>

+ 168 - 0
property_ui/manage/pages/community/readlist.vue

@@ -0,0 +1,168 @@
+<template>
+	<view class="car">
+		<view class="cartop">
+			<view class="topa flexc">
+				<image :src="reset" class="resetimg" @click="getReset"></image>
+				<picker mode="date"   @change='bindDateChangea'>
+					<view class="chekt flexc">
+						<view>{{cxrq|| "选择日期"}}</view>
+						<image :src="up"></image>
+					</view>
+				</picker>
+				<view class="search flexc">
+					<image :src="search"></image>
+					<input placeholder="请输入姓名进行搜索"  v-model="text"/>
+					<view class="btn" @click="getConfirm">搜索</view>
+				</view>
+			</view>
+			<view class="conttips">
+				<view class="toptip">当前已读人数共 <text>274</text>人</view>
+			</view>
+			<!-- <view class="tabtop flexc">
+				<view class="tabt" :class="ttopval==ite.val?'act':''" v-for="(ite,idx) in ttoplist" :key="idx" @click="getTabtop(ite.val)">{{ite.tit}}</view>
+			</view> -->
+		</view>
+		<!-- 列表 -->
+		<view class="carlists">
+			<car-list :datainfo="list" :topval="ttopval" :wtdt="wtdt" type='readlist' @getDetail="getDetail"></car-list>
+		</view>
+		<loading></loading>
+	</view>
+</template>
+
+<script>
+	import config from '@/config'
+	const baseUrl = config.baseUrl
+	import carList from "@/manage/components/car/list.vue"
+	import { checkPermi, checkRole } from "@/utils/permission"; // 权限判断函数
+	export default{
+		components:{carList},
+		data(){
+			return{
+				reset:require('@/work/static/car/reset.png'),
+				search:require('@/work/static/car/search.png'),
+				up:require('@/work/static/car/up.png'),
+				cxrq:"",
+				text:'',
+				list:[{tit:'皖A IC520',type:1,right:0},{tit:'晋E KD783',type:2,right:0},],
+				pageSize: 10,
+				pageNum: 1,
+				reachflag: true,
+				wtdt:'',
+				ttopval:'0',
+				ttoplist:[{tit:'全部',val:0},{tit:'待回复',val:1},{tit:'已回复',val:2},{tit:'已完成',val:2}]
+			}
+		},
+		onLoad: function() {
+		
+		},
+		// 上拉触底加载更多触发事件
+		onReachBottom() {
+			if (this.reachflag) {
+				this.pageNum++
+				this.getDataFn()
+			}
+		},
+		methods:{
+			checkPermi, checkRole,
+			getDetail(){
+				this.$tab.navigateTo("/work/pages/service/complaintdetail")
+			},
+			getTabtop(val){
+				this.ttopval=val
+			},
+			getConfirm(){
+				this.getrefreshData()
+			},
+			getReset(){
+				this.cxrq='';
+				this.text='';
+				this.getrefreshData()
+			},
+			getrefreshData(){
+				this.pageNum=1;
+				this.list=[];
+				this.reachflag=true;
+				this.getDataFn()
+			},
+			getTabFn(val){
+				this.tabval=val
+			},
+			bindDateChangea(e){
+				var val=e.detail.value;
+				this.cxrq=val;
+			},
+			getDataFn(){
+				var params={
+					pageSize:this.pageSize,
+					pageNum: this.pageNum,
+				}
+				params.noticeType=this.tabidx
+				getNoticeList(params).then(res=>{
+					if(res.code==200){
+						if (res.rows.length < this.pageSize) {
+							this.reachflag = false
+							this.wtdt = '到底了~';
+						} else {
+							var num = parseInt(res.rows.length) + parseInt(this.pageSize) * parseInt(this.pageNum -	1)
+							if (num < res.total) {
+								this.reachflag = true
+								this.wtdt = ''
+							} else {
+								this.reachflag = false
+								this.wtdt = '到底了~';
+							}
+						}
+						var newArr=JSON.parse(JSON.stringify(res.rows))
+						newArr.forEach(ite=>{
+							ite.right=0;
+						})
+						// console.log(newArr,555)
+						if (this.pageNum == 1) {
+							this.list = newArr;
+						} else {
+							this.list = this.list.concat(newArr)
+						}
+					}else{
+						this.$toast(res.msg)
+					}
+				})
+				
+			},
+		}
+	}
+</script>
+<style>
+	page{background: #F3F3F0;}
+</style>
+<style lang="scss" scoped>
+.car{padding: 172rpx 0 0rpx;}
+.cartop{position: fixed;left: 0;right: 0;top: 0;background-color: #ffffff;z-index: 2;
+	.topa{padding: 20rpx ;padding-bottom: 30rpx;
+		.resetimg{width: 36rpx;height: 36rpx;margin-right: 24rpx;flex: 0 0 auto;}
+		.chekt{min-width: 180rpx;
+			view{font-weight: 500;font-size: 26rpx;color: #272727;flex: 1;}
+			image{width: 24rpx;height: 16rpx;margin-left: 18rpx;flex: 0 0 auto;}
+		}
+		.search{flex: 1;margin-left: 16rpx;height: 64rpx;background: #EEEEEE;border-radius: 32rpx;border: 2rpx solid #E6E6E6;padding-left: 24rpx;box-sizing: border-box;
+		image{width: 32rpx;height: 34rpx;margin-right: 22rpx;flex: 0 0 auto;}
+		input{flex: 1;font-size: 26rpx;color: #272727;}
+		.btn{width: 100rpx;height: 64rpx;background: #3565ED;border-radius: 32rpx;flex: 0 0 auto;font-weight: bold;text-align: center;line-height: 64rpx;
+font-size: 26rpx;
+color: #FFFFFF;}
+		}
+	}
+	.tabtop{padding-bottom: 40rpx;padding-top: 24rpx;
+		.tabt{font-weight: 500;font-size: 32rpx;color: #666666;position: relative;line-height: 56rpx;padding: 0 40rpx;
+			&.act{font-weight: bold;font-size: 32rpx;color: #272727;
+			&::after{content: '';width: 40rpx;height: 10rpx;background: #0156FE;border-radius: 6rpx;position: absolute;left: 50%;margin-left: -20rpx;bottom: -10rpx;}
+			}
+		}
+	}
+}
+.conttips{padding: 18rpx 32rpx;background: #F3F3F0;}
+.toptip{font-weight: 500;font-size:26rpx;color: #666666; line-height: 36rpx;
+	text{color: #4671ED;display: inline-block;font-weight: bold;padding: 0 6rpx;}
+}
+.carlists{padding: 0 18rpx;}
+</style>

+ 286 - 0
property_ui/manage/pages/community/sqmoney.vue

@@ -0,0 +1,286 @@
+<template>
+	<view class="car">
+		<view class="cartop">
+			<view class="topa flexc">
+				<view class="allbox flexc" @click="showDrawer('showLeft')">
+					<image :src="allimg" class="resetimg" @click="getReset"></image>
+					<view class="over">全部资产</view>
+				</view>
+				<view class="search flexc">
+					<image :src="search"></image>
+					<!-- confirm-type="search" @confirm="getConfirm" -->
+					<input placeholder="请输入关键字进行搜索"  v-model="text"/>
+					<view class="btn" @click="getConfirm">搜索</view>
+				</view>
+			</view>
+			<view class="tabtop flexc">
+				<view class="tabt" :class="ttopval==ite.val?'act':''" v-for="(ite,idx) in ttoplist" :key="idx" @click="getTabtop(ite.val)">{{ite.tit}}</view>
+			</view>
+			<view class="tablst flexc">
+				<view class="tabs" :class="tabval==ite.val?'act':''" v-for="(ite,idx) in tablist" :key="idx" @click="getTabFn(ite.val)">{{ite.tit}}</view>
+			</view>
+		</view>
+		<!-- 左侧展示 -->
+		<uni-drawer ref="showLeft" mode="left" :width="320" @change="change($event,'showLeft')">
+			<view class="drwbox">
+				<view class="leftbox">
+					<view class="tit">房屋资产</view>
+					<view class="txts">
+						<view class="txt">住宅(1036)</view>
+						<view class="txt">商业(47</view>
+						<view class="txt">办公(72)</view>
+						<view class="txt">厂房(21)</view>
+					</view>
+				</view>
+				<view class="leftbox">
+					<view class="tit">房屋资产</view>
+					<view class="txts">
+						<view class="txt">住宅(1036)</view>
+						<view class="txt">商业(47</view>
+						<view class="txt">办公(72)</view>
+						<view class="txt">厂房(21)</view>
+					</view>
+				</view>
+			</view>
+		</uni-drawer>
+		<!-- 列表 -->
+		<view class="carlists">
+			<view class="listbox" :style="tabflag?'height:calc(100vh - '+tabscheight+'rpx)':''">
+				<block v-if="list&&list.length">
+				<zb-table
+				  :show-header="true"
+				  :columns="columns"
+				  :stripe="true"
+				  :fit="true"
+				  :isShowLoadMore="reachflag"
+				  :parameter="parameter"
+				  @pullUpLoading="pullUpLoading"
+				  :data="list"></zb-table>
+				</block>
+				<block v-else>
+					<no-data padtop="0" padbottom="20"></no-data>
+				</block>
+			</view>
+			
+			<!-- <car-list :datainfo="list" :wtdt="wtdt" type='sqmoney'></car-list> -->
+		</view>
+		<view class="rfbtn" @click="getAddFn">录入资产</view>
+		<loading></loading>
+	</view>
+</template>
+
+<script>
+	import config from '@/config'
+	const baseUrl = config.baseUrl
+	// import {column1} from '@/manage/components/zb-table/all.js'
+	import zbTable from "@/manage/components/zb-table/zb-table.vue"
+	import noData from "@/manage/components/nodata/nodata.vue"
+	import carList from "@/manage/components/car/list.vue"
+	import { checkPermi, checkRole } from "@/utils/permission"; // 权限判断函数
+	export default{
+		components:{carList,zbTable,noData},
+		data(){
+			return{
+				// column1,
+				allimg:require('@/manage/static/community/all.png'),
+				// up:require('@/work/static/car/up.png'),
+				// car:require('@/work/static/car/car.png'),
+				// cara:require('@/work/static/car/cara.png'),
+				// carb:require('@/work/static/car/carb.png'),
+				search:require('@/work/static/car/search.png'),
+				tabscheight:0,//减去的部
+				sfxx:"",
+				text:'',
+				jclxlist:[{dictLabel:'党员',dictValue:'0'}],
+				list:[{tit:'皖A IC520',num:1,code:true,yy:1},{tit:'晋E KD783',num:2,code:false,yy:2,},],
+				pageSize: 10,
+				pageNum: 1,
+				reachflag: true,
+				wtdt:'',
+				ttopval:'0',
+				tabflag:true,
+				columns: [
+					{ name: 'tit', label: '设备名称',fixed:true,width:160,align:'center',},
+					{ name: 'num', label: '设备编码',align:'center',},
+					// { name: 'sex', label: '性别',filters:{0:'男',1:'女'}},
+					// { name: 'code', label: '设备二维码',align:'center',type:'img', },
+					{ name: 'code', label: '设备二维码',align:'center' },
+					{ name: 'yy', label: '状态',align:'center',type:"format",key:"sflalist"},
+					
+				 //    { name: 'sqmyNumber', label: '编号',width:230,align:'center', },
+				 //    { name: 'title', label: '信息标题 ',width:230,align:'center', },
+				 //    { name: 'topicType', label: '主题类型',align:'center',type:"format",key:"ztlxlist"},
+					// { name: 'isRecord', label: '是否采用',align:'center',type:"format",key:"sflalist"},
+					// { name: 'sqmyProgress', label: '社情进度',align:'center',type:"format",key:"sqjdlist"},
+				],
+				parameter:{
+					sflalist:[ {label: '正常',value:'1'},{label: '停用',value:'2'},]
+				},
+				ttoplist:[{tit:'房屋',val:0},{tit:'设备',val:1},{tit:'车辆',val:2},{tit:'办公',val:0},{tit:'工具',val:1},{tit:'消防',val:2},{tit:'其他',val:0}],
+				tabval:'0',
+				tablist:[{tit:'电梯(32)',val:0},{tit:'门禁(18)',val:1},{tit:'供暖(14)',val:2},{tit:'空调(618)',val:2},{tit:'供暖(14)',val:2},],
+				showRight: false,
+				showLeft: false
+			}
+		},
+		onLoad: function() {
+		
+		},
+		// 上拉触底加载更多触发事件
+		onReachBottom() {
+			if (this.reachflag) {
+				this.pageNum++
+				this.getDataFn()
+			}
+		},
+		mounted() {
+			var that=this;
+			setTimeout(function(){
+				that.getHeightFn()
+			},200)
+		},
+		methods:{
+			checkPermi, checkRole,
+			confirm() {},
+			pullUpLoading(e){
+				
+			},
+			getHeightFn(){
+				let query = uni.createSelectorQuery().in(this);
+				var that=this;
+				//需要给黄色区域设置一个id标识,在这里是demo
+				query.select('.cartop').boundingClientRect(data => {
+					var height=Number(data.height)+60;
+					that.tabscheight=Number(height)*2
+					console.log(that.tabscheight)
+				}).exec();
+			},
+			// 打开窗口
+			showDrawer(e) {
+				this.$refs[e].open()
+			},
+			// 关闭窗口
+			closeDrawer(e) {
+				this.$refs[e].close()
+			},
+			// 抽屉状态发生变化触发
+			change(e, type) {
+				console.log((type === 'showLeft' ? '左窗口' : '右窗口') + (e ? '打开' : '关闭'));
+				this[type] = e
+			},
+			getDetailhd(){
+				
+			},
+			getAddFn(){
+				this.$tab.navigateTo("/manage/pages/community/sqmoneyadd")
+			},
+			getTabtop(val){
+				this.ttopval=val
+			},
+			getConfirm(){
+				this.getrefreshData()
+			},
+			getReset(){
+				this.sfxx='';
+				this.text='';
+				this.getrefreshData()
+			},
+			getrefreshData(){
+				this.pageNum=1;
+				this.list=[];
+				this.reachflag=true;
+				this.getDataFn()
+			},
+			getTabFn(val){
+				this.tabval=val
+			},
+			bindDateChangea(e){
+				var val=e.detail.value;
+				this.sfxx=this.jclxlist[val].dictLabel;
+				// this.orderFoodType=this.jclxlist[val].dictValue;
+			},
+			getDataFn(){
+				console.log(14)
+				return
+				var params={
+					pageSize:this.pageSize,
+					pageNum: this.pageNum,
+				}
+				params.noticeType=this.tabidx
+				getNoticeList(params).then(res=>{
+					if(res.code==200){
+						if (res.rows.length < this.pageSize) {
+							this.reachflag = false
+							this.wtdt = '到底了~';
+						} else {
+							var num = parseInt(res.rows.length) + parseInt(this.pageSize) * parseInt(this.pageNum -	1)
+							if (num < res.total) {
+								this.reachflag = true
+								this.wtdt = ''
+							} else {
+								this.reachflag = false
+								this.wtdt = '到底了~';
+							}
+						}
+						if (this.pageNum == 1) {
+							this.list = res.rows;
+						} else {
+							this.list = this.list.concat(res.rows)
+						}
+					}else{
+						this.$toast(res.msg)
+					}
+				})
+				
+			},
+		}
+	}
+</script>
+<style>
+	page{background: #F3F3F0;}
+</style>
+<style lang="scss" scoped>
+.car{padding: 310rpx 0 110rpx;}
+.cartop{position: fixed;left: 0;right: 0;top: 0;background-color: #ffffff;z-index: 2;
+	.topa{padding: 20rpx 20rpx 32rpx;
+		
+		.allbox{width: 180rpx;overflow: hidden;
+			view{font-weight: 500;font-size: 26rpx;color: #272727;flex: 1;}
+			image{width: 30rpx;height: 24rpx;margin-right: 20rpx;flex: 0 0 auto;}
+		}
+		.search{flex: 1;margin-left: 16rpx;height: 64rpx;background: #EEEEEE;border-radius: 32rpx;border: 2rpx solid #E6E6E6;padding-left: 24rpx;box-sizing: border-box;
+		image{width: 32rpx;height: 34rpx;margin-right: 22rpx;flex: 0 0 auto;}
+		input{flex: 1;font-size: 26rpx;color: #272727;}
+		.btn{width: 100rpx;height: 64rpx;background: #3565ED;border-radius: 32rpx;flex: 0 0 auto;font-weight: bold;text-align: center;line-height: 64rpx;
+font-size: 26rpx;
+color: #FFFFFF;}
+		}
+	}
+	.tabtop{padding-bottom: 30rpx;overflow: auto;
+		.tabt{font-weight: 500;font-size: 32rpx;color: #666666;position: relative;line-height: 56rpx;padding: 0 20rpx;
+			&.act{font-weight: bold;font-size: 32rpx;color: #272727;
+			&::after{content: '';width: 40rpx;height: 10rpx;background: #0156FE;border-radius: 6rpx;position: absolute;left: 50%;margin-left: -20rpx;bottom: -10rpx;}
+			}
+		}
+	}
+	.tablst{background: #F3F3F0;padding:30rpx 12rpx;overflow: auto;
+			.tabs{height: 48rpx;background: #DADADA;border-radius: 24rpx;font-weight: 500;display: flex;align-items: center;justify-content: center;padding: 0 24rpx;margin: 0 18rpx;
+	font-size: 26rpx;box-sizing: border-box;flex: 0 0 auto;color: #666666;
+				&.act{border: 2rpx solid #0256FD;background: #FFFFFF;color: #0256FD;}
+			}
+		}
+
+}
+.drwbox{width: 100%;height: 100%;overflow: auto;
+	.leftbox{padding:20rpx 30rpx 20rpx;
+		.tit{font-weight: bold;font-size: 30rpx;color: #272727;margin-bottom: 20rpx;}
+		.txts{padding-left: 38rpx;}
+		.txt{font-weight: 500;font-size: 26rpx;color: #666666;line-height: 60rpx;}
+	}
+}
+.listbox{
+	background: #FFFFFF;
+	border-radius: 20rpx;
+}
+.carlists{padding: 0 19rpx;}
+</style>

+ 207 - 0
property_ui/manage/pages/community/sqmoneyadd.vue

@@ -0,0 +1,207 @@
+<template>
+	<view >
+		<uni-forms ref="form"  :model="datainfo">
+			<view class="check">
+			<view class="cbox">
+				<view class="chmain">
+					<uni-forms-item label="资讯类型" name="phonenumber">
+						<picker range-key='text' :value="syqxidx" :range="sexs"   @change='bindDateChange'>
+							<view class="flexc">
+								<view class="flex1 txr f13" :class="datainfo.iszc?'co27':'coa'">{{datainfo.iszc?'是':'请选择资讯类型'}}</view>
+								<view class="rimg"><image :src="rimg"></image></view>
+							</view>
+						</picker>
+					</uni-forms-item>
+				</view>
+			</view>
+			<view class="cbox" style="flex: 1;">
+				<view class="chmain">
+					<uni-forms-item label-width='0' name="realName">
+						<uni-easyinput type="textarea" autoHeight v-model="datainfo.realName" disabled :inputBorder='false' placeholder="车牌号" />
+					</uni-forms-item>
+					<uni-forms-item label-width='0' name="realName">
+						<uni-easyinput type="textarea" autoHeight v-model="datainfo.realName" disabled :inputBorder='false' placeholder="用途" />
+					</uni-forms-item>
+					<uni-forms-item label-width='0' name="realName">
+						<uni-easyinput type="textarea" autoHeight v-model="datainfo.realName" disabled :inputBorder='false' placeholder="状态" />
+					</uni-forms-item>
+					<view class="imgs">
+						<view class="img" @click="getPreview">
+							<image :src="car" class="pimg"></image>
+							<image :src="del" class="del" @click="getDelFn"></image>
+						</view>
+						<view class="addbox" @click="getaddImage">
+							<image :src="photo"></image>
+							<view>添加图片</view>
+						</view>
+					</view>
+				</view>
+			</view>
+			<view class="rfbtn">确定</view>
+			<loading></loading>
+			</view>
+		</uni-forms>
+	</view>
+</template>
+
+<script>
+	import config from '@/config'
+	import editorBox from "@/manage/components/editor/editor.vue"
+	import {checkPermi,checkRole} from "@/utils/permission"; // 权限判断函数
+	import {uploadIdentify} from '@/utils/common.js'
+	export default {
+		components: {editorBox},
+		data() {
+			return {
+				rimg: require('@/work/static/people/rimg.png'),
+				photo:require("@/work/static/service/photo.png"),
+				car:require('@/work/static/car/carico.png'),
+				del:require('@/work/static/service/rdel.png'),
+				baseUrl: config.baseUrl,
+				checkflag:true,
+				datainfo: {
+					sex:0,
+					realName: '',
+					idCard: '',
+					address: '',
+					expirationDate: '',
+					phonenumber: '',
+					front: '',
+					back: '',
+				},
+				syqxidx:'',
+				sexs: [{
+					text: '男',
+					value: 0
+				}, {
+					text: '女',
+					value: 1
+				}],
+			}
+		},
+		onLoad: function() {
+
+		},
+		methods: {
+			checkPermi,
+			checkRole,
+			bindDateChange(e){
+				var val=e.detail.value;
+				// this.datainfo.applicationBank=this.sdyhlist[val].value;
+				// this.applicationBank=this.sdyhlist[val].label;
+			},
+			getPreview(idx,arr) {
+				var newArr=[];
+				arr.forEach(ite=>{
+					var ds=this.baseUrl+ite
+					newArr.push(ds)
+				})
+				uni.previewImage({
+					urls: newArr,
+					current:idx,
+					success: function(data) {},
+					fail: function(err) {}
+				});
+			},
+			getDelFn(){
+				var that=this;
+				uni.showModal({
+					title: '确认删除',
+					content: "是否确认删除",
+					cancelText: '取消',
+					confirmText: '确认',
+					success: function(res) {
+						if (res.confirm) {
+							// that.filelist.splice(idx,1)
+						} else if (res.cancel) {
+						}
+					}
+				});
+			},
+			getaddImage(e){
+				let that = this;
+				// var rs=['D:\\idcard.png']
+				// if(rs&&rs.length>0){
+				// 	var obj={
+				// 		type:e,
+				// 		// url:baseUrl+rs.join(',')
+				// 		url:rs.join(',')
+				// 	}
+				// 	that.getOcrIdCard(obj)
+				// }
+				// return
+				let file =[],count=9
+				uni.chooseImage({
+					count: 1,
+					success:function(res){
+						let img= res.tempFilePaths;
+						if(img.length + file.length > count){
+							uni.showToast({
+								title: '最多上传'+count+'张图片',
+								icon: 'none',
+								duration: 2000
+							})
+						}else{
+							let imglen = res.tempFilePaths.length;
+							var fuwufile = [];
+							uploadIdentify('/common/upload',img,0,0,0,imglen,fuwufile,function(rs){
+								var resurl=rs[0];
+								if(e=='front'){
+									that.datainfo.front=resurl.fileName;
+								}else{
+									that.datainfo.back=resurl.fileName;
+								}
+								if(rs&&rs.length>0){
+									var obj={
+										type:e,
+										url:resurl.urlOnline
+									}
+									that.getOcrIdCard(obj)
+								}
+							})	
+						}
+					}
+				});
+			},
+		}
+	}
+</script>
+<style>
+	page{background: #F3F3F0;}
+</style>
+<style lang="scss" scoped>
+.check /deep/ .uni-forms-item{min-height: 106rpx;box-sizing: border-box;display: flex;align-items: center;margin-bottom: 0;border-bottom: 2rpx solid #E6E6E6;padding:10rpx 0;}
+.check .cbox /deep/ .uni-forms-item:last-child{border: none;}
+.check /deep/ .uni-forms-item__label{font-weight: bold;font-size: 26rpx;color: #222327;flex: 0 0 auto;width: auto !important;}
+.check /deep/ .uni-easyinput{flex: 1;text-align: left;font-size: 26rpx;color: #222327;}
+.check /deep/ .uni-easyinput__content-textarea{min-height: 40rpx;font-size: 26rpx;}
+.check /deep/ .uni-easyinput__placeholder-class{font-size: 26rpx;color: #AAAAAA;}
+.check /deep/ .uni-easyinput__content-input{padding-left: 0 !important;}
+.check /deep/ .uni-input-input{font-size: 26rpx;}
+.check /deep/ .uni-textarea-textarea{font-size: 26rpx;}
+.check /deep/ .is-disabled{color: #222327;background-color: #ffffff !important;}
+.check /deep/ .uni-data-checklist .checklist-group .checklist-box{margin:10rpx 8rpx 10rpx 16rpx;}
+.check /deep/ .uni-data-checklist{flex: 0 0 auto;}
+.check{min-height: 100vh;padding: 20rpx 18rpx 110rpx;box-sizing: border-box;box-sizing: border-box;display: flex;flex-direction: column;}
+.cbox{background: #FFFFFF;border-radius: 20rpx;flex: 1;margin-bottom: 24rpx;display: flex;flex-direction: column;flex:0 0 auto;
+	.chmain{
+		padding: 0 32rpx;
+		.rimg{width: 16rpx;height: 28rpx;flex: 0 0 auto;margin-left: 20rpx;
+			image{width: 100%;height: 100%;}
+		}
+		.checkimg{width: 80rpx;height: 40rpx;margin-right: 8rpx;}
+		.imgs{display: flex;align-items: center;flex-wrap: wrap;margin-top: 60rpx;
+			.img{width: 142rpx;height:142rpx;border-radius: 20rpx;margin: 0 28rpx 20rpx 0;position: relative;
+			&:nth-of-type(4n){margin-right: 0;}
+			}
+			.pimg{width: 100%;height: 100%;border-radius: 20rpx;}
+			.del{width: 24rpx;height: 24rpx;position: absolute;right: 0;top: 0;}
+		}
+		.addbox{background: #F0F0F0;border-radius: 20rpx;display: flex;align-items: center;flex-direction: column;width: 142rpx;height:142rpx;justify-content: center;margin-bottom: 20rpx;
+			image{width: 48rpx;height: 42rpx;margin-bottom: 12rpx;}
+			view{font-weight: 500;font-size: 24rpx;color: #666666;}
+		}
+	}
+	
+}
+</style>

BIN
property_ui/manage/static/community/all.png


BIN
property_ui/manage/static/community/code.png


BIN
property_ui/manage/static/community/djtop.png


BIN
property_ui/manage/static/community/down.png


BIN
property_ui/manage/static/community/downa.png


BIN
property_ui/manage/static/community/eye.png


BIN
property_ui/manage/static/community/star.png


BIN
property_ui/manage/static/community/stara.png


BIN
property_ui/manage/static/community/up.png


BIN
property_ui/manage/static/community/upa.png


BIN
property_ui/manage/static/community/video.png


+ 2 - 2
property_ui/manifest.json

@@ -1,6 +1,6 @@
 {
     "name" : "若依移动端",
-    "appid" : "__UNI__25A9D80",
+    "appid" : "__UNI__35B39A9",
     "description" : "",
     "versionName" : "1.1.0",
     "versionCode" : "100",
@@ -42,7 +42,7 @@
     },
     "quickapp" : {},
     "mp-weixin" : {
-        "appid" : "wxccd7e2a0911b3397",
+        "appid" : "wx694b1ba10320b8bc",
         "setting" : {
             "urlCheck" : false,
             "es6" : false,

+ 168 - 6
property_ui/pages.json

@@ -1,13 +1,20 @@
 {
   "pages": [
 	  {
-	    "path": "pages/index",
+	    "path": "pages/index/index",
 	    "style": {
 	      "navigationBarTitleText": "若依移动端框架",
 	      "navigationStyle": "custom"
 	    }
 	  },
 	  {
+	    "path": "pages/health/index",
+	    "style": {
+	      "navigationBarTitleText": "康养",
+	      "navigationStyle": "custom"
+	    }
+	  },
+	  {
     "path": "pages/login",
     "style": {
       "navigationBarTitleText": "登录",
@@ -43,7 +50,8 @@
   }, {
     "path": "pages/mine/index",
     "style": {
-      "navigationBarTitleText": "我的"
+      "navigationBarTitleText": "我的",
+	   "navigationStyle": "custom"
     }
   }, {
     "path": "pages/mine/avatar/index",
@@ -221,6 +229,24 @@
 					}
 				}
 			},
+			{
+				"path": "pages/manage/house",
+				"style": {
+					"navigationBarTitleText": "房屋管理",
+					"h5":{
+						"titleNView":false
+					}
+				}
+			},
+			{
+				"path": "pages/manage/houseadd",
+				"style": {
+					"navigationBarTitleText": "添加房屋",
+					"h5":{
+						"titleNView":false
+					}
+				}
+			},
 			{
 				"path": "pages/service/patrol",
 				"style": {
@@ -294,18 +320,154 @@
 						"titleNView":false
 					}
 				}
+			},
+			{
+				"path": "pages/service/complaintdetail",
+				"style": {
+					"navigationBarTitleText": "投诉建议",
+					"h5":{
+						"titleNView":false
+					}
+				}
 			}
 		]
-  	}
+  	},
+	{"root": "manage",
+		"pages": [
+			{
+				"path": "pages/community/newsdj",
+				"style": {
+					"navigationBarTitleText": "党建资讯",
+					"h5":{
+						"titleNView":false
+					}
+				}
+			},
+			{
+				"path": "pages/community/newssq",
+				"style": {
+					"navigationBarTitleText": "社区资讯",
+					"h5":{
+						"titleNView":false
+					}
+				}
+			},
+			{
+				"path": "pages/community/newsyg",
+				"style": {
+					"navigationBarTitleText": "员工培训",
+					"h5":{
+						"titleNView":false
+					}
+				}
+			},
+			{
+				"path": "pages/community/newsadd",
+				"style": {
+					"navigationBarTitleText": "发布图文",
+					"h5":{
+						"titleNView":false
+					}
+				}
+			},
+			{
+				"path": "pages/community/newsaddvideo",
+				"style": {
+					"navigationBarTitleText": "发布视频",
+					"h5":{
+						"titleNView":false
+					}
+				}
+			},
+			{
+				"path": "pages/community/newsaddsq",
+				"style": {
+					"navigationBarTitleText": "发布",
+					"h5":{
+						"titleNView":false
+					}
+				}
+			},
+			{
+				"path": "pages/community/newsadddj",
+				"style": {
+					"navigationBarTitleText": "发布",
+					"h5":{
+						"titleNView":false
+					}
+				}
+			},
+			{
+				"path": "pages/community/readlist",
+				"style": {
+					"navigationBarTitleText": "已读名单",
+					"h5":{
+						"titleNView":false
+					}
+				}
+			},
+			{
+				"path": "pages/community/readcount",
+				"style": {
+					"navigationBarTitleText": "阅读统计",
+					"h5":{
+						"titleNView":false
+					}
+				}
+			},
+			{
+				"path": "pages/community/sqmoney",
+				"style": {
+					"navigationBarTitleText": "社区资产",
+					"h5":{
+						"titleNView":false
+					}
+				}
+			},
+			{
+				"path": "pages/community/sqmoneyadd",
+				"style": {
+					"navigationBarTitleText": "录入资产",
+					"h5":{
+						"titleNView":false
+					}
+				}
+			}
+		]
+	},
+	{
+		"root": "health",
+		"pages": [
+			{
+				"path": "pages/health/index",
+				"style": {
+					"navigationBarTitleText": "居民健康档案",
+					"h5":{
+						"titleNView":false
+					}
+				}
+			},
+			{
+				"path": "pages/health/detail",
+				"style": {
+					"navigationBarTitleText": "健康档案",
+					 "navigationStyle": "custom",
+					"h5":{
+						"titleNView":false
+					}
+				}
+			}
+		]
+	}
   ],
   "preloadRule":{
-	"pages/index": {
+	"pages/index/index": {
 		"network": "all",
-		"packages": ["work"]
+		"packages": ["work","health","manage"]
 	}, 
 	"pages/login": {
 	 	"network": "all",
-	 	"packages": ["work"]
+	 	"packages": ["work","health","manage"]
 	}
   },
   "globalStyle": {

+ 415 - 0
property_ui/pages/health/index.vue

@@ -0,0 +1,415 @@
+<template>
+	<view :style="'padding-top:'+nvaHeight+'px;'">
+		<view class="navbox">
+			<uni-nav-bar color="#ffffff" :background-color="backgroundColor" :border="false" statusBar='true'
+				fixed="true">
+			</uni-nav-bar>
+		</view>
+		<!-- 主体 -->
+		<image :src="navbg" class="navbg"></image>
+		<view class="wymain">
+			<view class="pdlr12">
+				<view class="topbox flexc mb12" @click="getBookFn">
+					<image :src="heabox" class="heabox flex0"></image>
+					<view class="tit flex1">居民健康档案</view>
+					<image :src="rimg" class="rimg flex0"></image>
+				</view>
+				<view class="counts mb12">
+					<view class="tit mb5">居民年龄段分布(人)</view>
+					<view class="txt mb10">更新时间:2024-11-25</view>
+					<!-- 数据图 -->
+					<view>
+						<qiun-data-charts type="ring" :chartData="chartDataa" :opts='optsa'></qiun-data-charts>
+					</view>
+				</view>
+				<view class="counts mb12">
+					<view class="tit mb5">居民各年龄段性别分布</view>
+					<view class="txt mb10">更新时间:2024-11-25</view>
+					<!-- 数据图 -->
+					<view>
+						<qiun-data-charts type="area" :chartData="chartDatab" :opts='optsb'></qiun-data-charts>
+					</view>
+				</view>
+				<view class="counts mb12">
+					<view class="tit mb5">居民血型分布</view>
+					<view class="txt mb10">更新时间:2024-11-25</view>
+					<!-- 数据图 -->
+					<view >
+						<!-- <l-echart ref="chartc"></l-echart> -->
+						<qiun-data-charts type="rose" :chartData="chartDatac" :opts='optsc'></qiun-data-charts>
+					</view>
+				</view>
+			</view>
+			<view class="contbox">
+				<view class="cont flexc mb9">
+					<view class="line"></view>
+					<view class="flex1 tit">健康资讯</view>
+					<view class="morebox">
+						<view>更多<image :src="more"></image>
+						</view>
+					</view>
+				</view>
+				<view class="hlists">
+					<box-list :datainfo="list" :wtdt="wtdt" type='health'></box-list>
+				</view>
+			</view>
+		</view>
+		<loading></loading>
+		<footers v-if="isfootflag" :footerindex="footerindex"></footers>
+	</view>
+</template>
+
+<script>
+	import footers from '@/components/footer/footer.vue'
+	import boxList from "@/components/box/list.vue"
+	export default {
+		components: {
+			footers,
+			boxList
+		},
+		data() {
+			return {
+				footerindex: 'health',
+				isfootflag: true,
+				nvaHeight: 44,
+				// activeColor:'#A7CDF9',
+				// nactiveColor:'#DADADA',
+				backgroundColor: "transparent",
+				navbg: require("@/static/images/health/hbg.png"),
+				heabox: require("@/static/images/health/heabox.png"),
+				rimg: require("@/static/images/health/rimg.png"),
+				more: require("@/static/images/health/more.png"),
+				zhanflag: true,
+				pageSize: 10,
+				pageNum: 1,
+				reachflag: true,
+				wtdt: '',
+				chartDataa: {
+					"categories": [],
+					series: [{
+						data: [{
+								"name": "01~10",
+								"value": 50,
+								labelShow: false
+							},
+							{
+								"name": "11~20",
+								"value": 30,
+								labelShow: false
+							},
+							{
+								"name": "21~30",
+								"value": 20,
+								labelShow: false
+							},
+							{
+								"name": "31~40",
+								"value": 18,
+								labelShow: false
+							},
+							{
+								"name": "41~50",
+								"value": 50,
+								labelShow: false
+							},
+							{
+								"name": "51~60",
+								"value": 30,
+								labelShow: false
+							},
+							{
+								"name": "61~70",
+								"value": 20,
+								labelShow: false
+							},
+							{
+								"name": "71~80",
+								"value": 18,
+								labelShow: false
+							},
+							{
+								"name": "81~90",
+								"value": 50,
+								labelShow: false
+							},
+							{
+								"name": "91~100",
+								"value": 30,
+								labelShow: false
+							},
+							{
+								"name": "100以上",
+								"value": 20,
+								labelShow: false
+							},
+						]
+					}],
+					"enableScroll": false
+				},
+				optsa: {
+					padding: [0, 0, 0, 0],
+					color: ["#5989F8", "#B7DE5A", "#FAC858", "#EE6666", "#73C0DE", "#3BA272", "#FF8045", "#9A60B4",
+						"#ea7ccc", "#5470C6", "#45CB99"
+					],
+					title: {
+						name: "总计",
+						fontSize: 12,
+						color: "#666666",
+					},
+					legend: {
+						// show: false,
+						position: "bottom",
+						padding: 0,
+						margin: 0,
+				 },
+					// 副标题
+					subtitle: {
+						name: "5884",
+						fontSize: 22,
+						color: "#46CB99"
+					},
+					extra: {
+						ring: {
+							ringWidth: 20,
+							borderWidth:1,
+							borderRadius:30
+						},
+					}
+				},
+				chartDatab: {
+					categories: ["1-10", "11-20", "21-30", "31-40", "41-50", "51-60", "61-70", "71-80", "81-90", "91-100",
+						"100以上"
+					],
+					series: [{
+							name: "女性",
+							data: [35, 8, 25, 37, 4, 20]
+						},
+						{
+							name: "男性",
+							data: [70, 40, 65, 100, 44, 68]
+						},
+					]
+				},
+				optsb: {
+					color: ["#5169CF", "#92CE78", ],
+					padding: [0, 0, 0, 0],
+					enableScroll: false,
+					legend: {
+						float:'right',
+						position: "top",
+						padding: 0,
+						margin: 20,
+					},
+					xAxis: {
+						disableGrid: true,
+						fontSize:10
+					},
+					yAxis: {
+						gridType:'dash',
+						gridColor:'#CCCCCC',
+						dashLength:8,
+						splitNumber:5,
+						min:10,
+						max:180,
+						data:[{
+							axisLine:false
+						}]
+					},
+					extra: {
+						area: {
+							type: "straight",
+							opacity: 0.2,
+							addLine: true,
+							width: 2,
+							gradient: false,
+							activeType: "hollow"
+						}
+					}
+				},
+				chartDatac: {
+					series: [{
+						data: [{
+							"name": "A型","labelText":"A型","value": 50,	
+						}, {
+							"name": "B型","labelText":"B型","value": 30,
+						}, {
+							"name": "AB型","labelText":"AB型","value": 20
+						}, {
+							"name": "O型","labelText":"O型","value": 18
+						}, {
+							"name": "RH阴性","labelText":"RH阴性","value": 8
+						}, {
+							"name": "RH阳性","labelText":"RH阳性","value": 8
+						}]
+					}]
+				},
+				optsc: {
+					color: ["#73C0DE", "#FC8452", "#9A60B4", "#EA7CCC", "#5470C6", "#91CC75", ],
+					padding: [0, 0, 0, 0],
+					enableScroll: false,
+					legend: {
+						show: true,
+						position: "left",
+						lineHeight: 25
+					},
+					extra: {
+						rose: {
+							type: "area",
+							minRadius: 50,
+							activeOpacity: 0.5,
+							activeRadius: 10,
+							offsetAngle: 0,
+							labelWidth: 15,
+							border: false,
+							borderWidth: 2,
+							borderColor: "#FFFFFF"
+						}
+					}
+				},
+				optionc: {
+					legend: {
+						top: 'bottom'
+					},
+					series: [{
+						name: '居民血型分布',
+						type: 'area',
+						radius: [15, 100],
+						center: ['50%', '50%'],
+						roseType: 'area',
+						itemStyle: {
+							borderRadius: 8
+						},
+						data: [{
+								value: 40,
+								name: 'A型'
+							},
+							{
+								value: 38,
+								name: 'B型'
+							},
+							{
+								value: 32,
+								name: 'O型'
+							},
+							{
+								value: 30,
+								name: 'RH阴性'
+							},
+							{
+								value: 28,
+								name: 'RH阳性'
+							},
+						]
+					}]
+				},
+				list: [{
+					noticeTitle: "您有1条报修信息,请及时查看处理!",
+					num: '4'
+				}, {
+					noticeTitle: "您有1条报修信息,请及时查看处理!",
+					num: '12'
+				}],
+			}
+		},
+		onPageScroll(e) {
+			var scrollTop = Number(e.scrollTop);
+			if (scrollTop > 0) {
+				this.backgroundColor = '#48CC9A'
+			} else {
+				this.backgroundColor = 'transparent'
+			}
+		},
+		// 上拉触底加载更多触发事件
+		onReachBottom() {
+			if (this.reachflag) {
+				this.pageNum++
+				this.getDataFn()
+			}
+		},
+		onLoad: function() {
+			uni.getSystemInfo({
+				success: (e) => {
+					this.nvaHeight = Number(e.statusBarHeight) + 44;
+				}
+			})
+		},
+		methods: {
+			getBookFn() {
+				this.$tab.navigateTo(`/health/pages/health/index`)
+			},
+			getDataFn() {
+				return
+				var params = {
+					pageSize: this.pageSize,
+					pageNum: this.pageNum,
+				}
+				params.noticeType = this.tabidx
+				getNoticeList(params).then(res => {
+					if (res.code == 200) {
+						if (res.rows.length < this.pageSize) {
+							this.reachflag = false
+							this.wtdt = '到底了~';
+						} else {
+							var num = parseInt(res.rows.length) + parseInt(this.pageSize) * parseInt(this.pageNum -
+								1)
+							if (num < res.total) {
+								this.reachflag = true
+								this.wtdt = ''
+							} else {
+								this.reachflag = false
+								this.wtdt = '到底了~';
+							}
+						}
+						if (this.pageNum == 1) {
+							this.list = res.rows;
+						} else {
+							this.list = this.list.concat(res.rows)
+						}
+					} else {
+						this.$toast(res.msg)
+					}
+				})
+
+			},
+
+		}
+	}
+</script>
+<style>
+	page {
+		background: #F4F6F8;
+	}
+</style>
+<style lang="scss" scoped>
+.navbox{position: fixed;left: 0;right: 0;top: 0;z-index: 4;	}
+.navbg{width: 100%;height: 688rpx;}
+.wymain{z-index: 2;position: relative;padding-top: 244rpx;}
+.topl{overflow: hidden;padding-left: 16rpx;
+	image{width: 18rpx;height: 22rpx;margin-right: 14rpx;flex: 0 0 auto;}
+	view{font-weight: bold;font-size: 26rpx;color: #272727;}
+}
+.topbox{height: 112rpx;background: #FFFFFF;border-radius: 20rpx;padding: 26rpx 18rpx;box-sizing: border-box;
+	.heabox{width: 72rpx;height: 70rpx;margin-right: 10rpx;}
+	.tit{font-weight: bold;font-size: 28rpx;color: #272727;}
+	.rimg{width: 14rpx;height: 24rpx;}
+}
+.counts{
+	background: #FFFFFF;padding: 24rpx;border-radius: 20rpx;
+	.tit{font-weight: bold;font-size: 32rpx;color: #272727;}
+	.txt{font-weight: 500;font-size: 22rpx;color: #AAAAAA;}
+}
+.hlists{margin: 0 24rpx 20rpx;
+	background: #FFFFFF;padding: 0 12rpx;border-radius: 20rpx;
+}
+.contbox{padding-top: 6rpx;
+	.cont{margin-bottom: 12rpx;position: relative;
+		.line{width: 14rpx;height: 48rpx;margin-right: 22rpx;border-radius: 0 24rpx 24rpx 0;background-color: #45CB99;}
+		.tit{font-size: 15px;color: #272727;font-weight: bold;}
+		.morebox{padding-right: 24rpx;
+			image{width: 18rpx;height: 16rpx;margin-left: 16rpx;}
+			view{font-size: 24rpx;color: #AAAAAA;}
+		}
+	}
+
+}
+</style>

+ 20 - 5
property_ui/pages/index.vue

@@ -140,7 +140,7 @@
 						<view class="imgs"><image :src="htabg" class="imgd"></image></view>
 						<view class="txt">物业费管理</view>
 					</view>
-					<view class="list bimga">
+					<view class="list bimga" @click="getHouseFn">
 						<view class="imgs"><image :src="htabh" class="imgd"></image></view>
 						<view class="txt">房屋管理</view>
 					</view>
@@ -177,19 +177,19 @@
 					<view>社区管理</view>
 				</view>
 				<view class="lists">
-					<view class="list bimga">
+					<view class="list bimga" @click="getNewsdjFn">
 						<view class="imgs"><image :src="htabm" class="imgh"></image></view>
 						<view class="txt">党建信息</view>
 					</view>
-					<view class="list bimga">
+					<view class="list bimga" @click="getNewssqFn">
 						<view class="imgs"><image :src="htabn" class="imgi"></image><view class="tips">27</view></view>
 						<view class="txt">社区资讯</view>
 					</view>
-					<view class="list bimga">
+					<view class="list bimga" @click="getNewsYgFn">
 						<view class="imgs"><image :src="htabo" class="imgf"></image></view>
 						<view class="txt">员工培训</view>
 					</view>
-					<view class="list bimga">
+					<view class="list bimga" @click="getSqmoneyFn">
 						<view class="imgs"><image :src="htabp" class="imgi"></image></view>
 						<view class="txt">社区资产</view>
 					</view>
@@ -297,9 +297,24 @@ import notice from '@/components/swiper/notice.vue'
 		getStaffFn(){//维修人员管理
 			this.$tab.navigateTo(`/work/pages/people/staff`)
 		},
+		getHouseFn(){//房屋管理
+			this.$tab.navigateTo(`/work/pages/manage/house`)
+		},
 		getComplaintFn(){//投诉建议
 			this.$tab.navigateTo(`/work/pages/service/complaint`)
 		},
+		getNewsdjFn(){//党建资讯
+			this.$tab.navigateTo(`/manage/pages/community/newsdj`)
+		},
+		getNewssqFn(){//党建资讯
+			this.$tab.navigateTo(`/manage/pages/community/newssq`)
+		},
+		getNewsYgFn(){//员工培训
+			this.$tab.navigateTo(`/manage/pages/community/newsyg`)
+		},
+		getSqmoneyFn(){//社区资产
+			this.$tab.navigateTo(`/manage/pages/community/sqmoney`)
+		},
 	}
   }
 </script>

+ 380 - 0
property_ui/pages/index/index.vue

@@ -0,0 +1,380 @@
+<template>
+  <view :style="'padding-top:'+nvaHeight+'px;'">
+		<view class="navbox">
+			<uni-nav-bar  color="#ffffff" leftWidth='400rpx'  :background-color="backgroundColor" :border="false" statusBar='true' fixed="true">
+				<block slot="left">
+					<view class="topl flexc">
+						<image :src="adrimg" ></image>
+						<view class="over">{{city}}</view>
+					</view>
+				</block>
+			</uni-nav-bar>
+		</view>
+		<!-- 主体 -->
+		<image :src="navbg" class="navbg"></image>
+		<view class="wymain" >
+			<view class="adrbox">
+				<view class="flexc mb14">
+					<image :src="adraimg" class="adr"></image>
+					<view class="adrtit">智慧<text>社区</text></view>
+				</view>
+				<view class="adrtxt flexc mb4">
+					<view class="over">嗨~刘源禧!</view><text>经理</text>
+				</view>
+				<view class="adrtip">幸福小区物业办公室</view>
+				<image :src="adrbgimg" class="adrbgimg"></image>
+			</view>
+			<view class="mb22">
+				<notice :noticelist="noticelist"  :autoplay='autoplay' @getNoticeDet="getNoticeDet"></notice>
+			</view>
+			<!-- 统计 -->
+			<view class="contbox">
+				<view class="cont flexc">
+					<image :src="conta"></image>
+					<view>今日数据统计</view>
+				</view>
+				<view class="lists">
+					<view class="list">
+						<view class="tit">21</view>
+						<view class="txt">空闲车位</view>
+					</view>
+					<view class="list">
+						<view class="tit">21</view>
+						<view class="txt">空闲充电桩</view>
+					</view>
+					<view class="list">
+						<view class="tit">21</view>
+						<view class="txt">进入车辆</view>
+					</view>
+					<view class="list">
+						<view class="tit">21</view>
+						<view class="txt">离开车辆</view>
+					</view>
+					<view class="list">
+						<view class="tit">21</view>
+						<view class="txt">外来车辆</view>
+					</view>
+					<view class="list">
+						<view class="tit">21</view>
+						<view class="txt">违停登记</view>
+					</view>
+					<view class="list">
+						<view class="tit">21</view>
+						<view class="txt">外来人员</view>
+					</view>
+					<view class="list">
+						<view class="tit">21</view>
+						<view class="txt">进入人员</view>
+					</view>
+					<block v-if="zhanflag">
+						<view class="list">
+							<view class="tit ca">21</view>
+							<view class="txt">已巡更</view>
+						</view>
+						<view class="list">
+							<view class="tit ca">21</view>
+							<view class="txt">未巡更</view>
+						</view>
+						<view class="list">
+							<view class="tit cb">21</view>
+							<view class="txt">家政订单</view>
+						</view>
+						<view class="list">
+							<view class="tit cb">21</view>
+							<view class="txt">完成订单</view>
+						</view>
+						<view class="list">
+							<view class="tit cc">21</view>
+							<view class="txt">今日报修</view>
+						</view>
+						<view class="list">
+							<view class="tit cc">21</view>
+							<view class="txt">已派报修</view>
+						</view>
+						<view class="list">
+							<view class="tit cc">21</view>
+							<view class="txt">投诉建议</view>
+						</view>
+						<view class="list">
+							<view class="tit cc">21</view>
+							<view class="txt">已回投诉</view>
+						</view>
+					</block>
+				</view>
+				<view class="upbox" @click="getZhanFn">
+					<image :src="upimg" :class="zhanflag?'':'zhe'"></image>
+					<view>{{zhanflag?'收起':'展开'}}</view>
+				</view>
+			</view>
+			<view class="contbox mb16">
+				<view class="cont flexc mb9">
+					<image :src="contb"></image>
+					<view>物业管理</view>
+				</view>
+				<view class="lists">
+					<view class="list bimga" @click="getCarFn">
+						<view class="imgs"><image :src="htaba" class="imga"></image></view>
+						<view class="txt">车辆管控</view>
+					</view>
+					<view class="list bimga" @click="getCarKuFn">
+						<view class="imgs"><image :src="htabb" class="imgb"></image></view>
+						<view class="txt">车库管理</view>
+					</view>
+					<view class="list bimga" @click="getCarCheckFn">
+						<view class="imgs"><image :src="htabc" class="imgc"></image></view>
+						<view class="txt">外来车辆登记</view>
+					</view>
+					<view class="list bimga" @click="getillegalParkFn">
+						<view class="imgs"><image :src="htabd" class="imgd"></image></view>
+						<view class="txt">违停管理</view>
+					</view>
+					<view class="list bimga" @click="getPeopleFn">
+						<view class="imgs"><image :src="htabe" class="imge"></image></view>
+						<view class="txt">人员管理</view>
+					</view>
+					<view class="list bimga" @click="getComeglFn">
+						<view class="imgs"><image :src="htabf" class="imgf"></image></view>
+						<view class="txt">来访管理</view>
+					</view>
+					<view class="list bimga" @click="getMoneyFn">
+						<view class="imgs"><image :src="htabg" class="imgd"></image></view>
+						<view class="txt">物业费管理</view>
+					</view>
+					<view class="list bimga" @click="getHouseFn">
+						<view class="imgs"><image :src="htabh" class="imgd"></image></view>
+						<view class="txt">房屋管理</view>
+					</view>
+				</view>
+			</view>
+			<view class="contbox mb16">
+				<view class="cont flexc mb9">
+					<image :src="contc"></image>
+					<view>物业服务</view>
+				</view>
+				<view class="lists">
+					<view class="list bimga" @click="getPatrolFn">
+						<view class="imgs"><image :src="htabi" class="imgg"></image></view>
+						<view class="txt">今日巡更</view>
+					</view>
+					<view class="list bimga" @click="getWarrantyFn">
+						<view class="imgs"><image :src="htabj" class="imgb"></image><view class="tips">3</view>
+						</view>
+						<view class="txt">物业报修</view>
+					</view>
+					<view class="list bimga" @click="getStaffFn">
+						<view class="imgs"><image :src="htabk" class="imgb"></image></view>
+						<view class="txt">维修人员管理</view>
+					</view>
+					<view class="list bimga" @click="getComplaintFn">
+						<view class="imgs"><image :src="htabl" class="imga"></image><view class="tips">1</view></view>
+						<view class="txt">投诉建议</view>
+					</view>
+				</view>
+			</view>
+			<view class="contbox mb16">
+				<view class="cont flexc mb9">
+					<image :src="contd"></image>
+					<view>社区管理</view>
+				</view>
+				<view class="lists">
+					<view class="list bimga" @click="getNewsdjFn">
+						<view class="imgs"><image :src="htabm" class="imgh"></image></view>
+						<view class="txt">党建信息</view>
+					</view>
+					<view class="list bimga" @click="getNewssqFn">
+						<view class="imgs"><image :src="htabn" class="imgi"></image><view class="tips">27</view></view>
+						<view class="txt">社区资讯</view>
+					</view>
+					<view class="list bimga" @click="getNewsYgFn">
+						<view class="imgs"><image :src="htabo" class="imgf"></image></view>
+						<view class="txt">员工培训</view>
+					</view>
+					<view class="list bimga" @click="getSqmoneyFn">
+						<view class="imgs"><image :src="htabp" class="imgi"></image></view>
+						<view class="txt">社区资产</view>
+					</view>
+				</view>
+			</view>
+		</view>
+	<loading></loading>
+	 <footers v-if="isfootflag"  :footerindex="footerindex"></footers>
+  </view>
+</template>
+
+<script>
+import footers from '@/components/footer/footer.vue'
+import notice from '@/components/swiper/notice.vue'
+  export default {
+	components:{footers,notice},
+	data(){
+		return{
+			footerindex:'home',
+			isfootflag:true,
+			nvaHeight:44,
+			// activeColor:'#A7CDF9',
+			// nactiveColor:'#DADADA',
+			backgroundColor: "transparent",
+			navbg:require("@/static/images/navbg.png"),
+			adrimg:require("@/static/images/home/adr.png"),
+			adraimg:require("@/static/images/home/adra.png"),
+			adrbgimg:require("@/static/images/home/adrbg.png"),
+			conta:require("@/static/images/home/conta.png"),
+			contb:require("@/static/images/home/contb.png"),
+			contc:require("@/static/images/home/contc.png"),
+			contd:require("@/static/images/home/contd.png"),
+			htaba:require("@/static/images/home/htaba.png"),
+			htabb:require("@/static/images/home/htabb.png"),
+			htabc:require("@/static/images/home/htabc.png"),
+			htabd:require("@/static/images/home/htabd.png"),
+			htabe:require("@/static/images/home/htabe.png"),
+			htabf:require("@/static/images/home/htabf.png"),
+			htabg:require("@/static/images/home/htabg.png"),
+			htabh:require("@/static/images/home/htabh.png"),
+			htabi:require("@/static/images/home/htabi.png"),
+			htabj:require("@/static/images/home/htabj.png"),
+			htabk:require("@/static/images/home/htabk.png"),
+			htabl:require("@/static/images/home/htabl.png"),
+			htabm:require("@/static/images/home/htabm.png"),
+			htabn:require("@/static/images/home/htabn.png"),
+			htabo:require("@/static/images/home/htabo.png"),
+			htabp:require("@/static/images/home/htabp.png"),
+			upimg:require("@/static/images/home/up.png"),
+			city:'幸福大街',
+			autoplay:false,
+			zhanflag:true,
+			noticelist:[{noticeTitle:"您有1条报修信息,请及时查看处理!",num:'4'},{noticeTitle:"您有1条报修信息,请及时查看处理!",num:'12'}]
+		}
+	},
+	onPageScroll(e) {
+		var scrollTop = Number(e.scrollTop);
+		if (scrollTop > 0) {
+			this.backgroundColor = '#C3EDFF'
+		} else {
+			this.backgroundColor = 'transparent'
+		}
+	},
+    onLoad: function() {
+		uni.getSystemInfo({
+			success: (e) => {
+				this.nvaHeight = Number(e.statusBarHeight)+44;
+			}
+		})
+    },
+	methods:{
+		getNoticeDet(){
+			
+		},
+		getZhanFn(){
+			this.zhanflag=!this.zhanflag
+		},
+		getCarFn(){//车辆管控
+			this.$tab.navigateTo(`/work/pages/car/index`) 
+		},
+		getCarKuFn(){//车库管理
+			this.$tab.navigateTo(`/work/pages/car/carku`) 
+		},
+		getCarCheckFn(){//外来车辆登记
+			this.$tab.navigateTo(`/work/pages/car/carcheck`) 
+		},
+		getillegalParkFn(){//违停管理
+			this.$tab.navigateTo(`/work/pages/car/illegalParking`) 
+		},
+		getPeopleFn(){//人员管理
+			this.$tab.navigateTo(`/work/pages/people/index`) 
+		},
+		getComeglFn(){//来访管理
+			this.$tab.navigateTo(`/work/pages/people/comegl`) 
+		},
+		getMoneyFn(){//物业费管理
+			this.$tab.navigateTo(`/work/pages/manage/money`) 
+		},
+		getPatrolFn(){//今日巡更
+			this.$tab.navigateTo(`/work/pages/service/patrol`) 
+		},
+		getWarrantyFn(){//报修管理
+			this.$tab.navigateTo(`/work/pages/service/warranty`) 
+		},
+		getStaffFn(){//维修人员管理
+			this.$tab.navigateTo(`/work/pages/people/staff`)
+		},
+		getHouseFn(){//房屋管理
+			this.$tab.navigateTo(`/work/pages/manage/house`)
+		},
+		getComplaintFn(){//投诉建议
+			this.$tab.navigateTo(`/work/pages/service/complaint`)
+		},
+		getNewsdjFn(){//党建资讯
+			this.$tab.navigateTo(`/manage/pages/community/newsdj`)
+		},
+		getNewssqFn(){//党建资讯
+			this.$tab.navigateTo(`/manage/pages/community/newssq`)
+		},
+		getNewsYgFn(){//员工培训
+			this.$tab.navigateTo(`/manage/pages/community/newsyg`)
+		},
+		getSqmoneyFn(){//社区资产
+			this.$tab.navigateTo(`/manage/pages/community/sqmoney`)
+		},
+	}
+  }
+</script>
+<style lang="scss" scoped>
+.navbox{position: fixed;left: 0;right: 0;top: 0;z-index: 4;	}
+.navbg{width: 100%;height: 782rpx;}
+.wymain{z-index: 2;position: relative;padding: 0 24rpx;}
+.topl{overflow: hidden;padding-left: 16rpx;
+	image{width: 18rpx;height: 22rpx;margin-right: 14rpx;flex: 0 0 auto;}
+	view{font-weight: bold;font-size: 26rpx;color: #272727;}
+}
+.adrbox{position: relative;padding:8rpx 240rpx 16rpx 36rpx;margin-bottom: 14rpx;
+	.adr{width: 36rpx;height: 34rpx;margin-right: 14rpx;}
+	.adrtit{font-size: 17px;color: #272727;font-weight: bold;
+		text{color: #0256FD;}
+	}
+	.adrtxt{font-size: 16px;color: #272727;font-weight: bold;
+		text{font-size: 10px;color: #3F7EFD;display: inline-flex;background: rgba(119, 171, 184, 0.3);margin-left: 22rpx;min-width: 66rpx;height: 30rpx;padding: 0 14rpx;box-sizing: border-box;flex: 0 0 auto;border-radius: 8px;align-items: center;justify-content: center;}
+	}
+	.adrtip{font-weight: 500;font-size: 24rpx;color: #828282;}
+
+	.adrbgimg{width: 212rpx;height: 236rpx;position: absolute;right: 20rpx;top: -70rpx;}
+}
+.contbox{
+	.cont{padding-left: 24rpx;margin-bottom: 12rpx;
+		image{width: 32rpx;height: 32rpx;margin-right: 16rpx;}
+		view{font-size: 15px;color: #272727;font-weight: bold;}
+	}
+	.lists{
+		display: flex;align-items: center;flex-wrap: wrap;
+		.list{padding: 8rpx 0;
+			width: 25%;display: flex;flex-direction: column;align-items: center;
+			.tit{font-weight: bold;font-size: 30rpx;color: #3565ED;line-height: 60rpx;font-style: italic;margin-bottom: 8rpx;
+				&.ca{color: #FF7E00;}
+				&.cb{color: #28C529;}
+				&.cc{color: #FF3737;}
+			}
+			.txt{font-weight: 500;font-size: 26rpx;color: #272727;}
+			&.bimga{padding: 16rpx 0;}
+			.imgs{display: flex;align-items: center;justify-content: center;width: 48rpx;height: 48rpx;margin-bottom: 18rpx;position: relative;
+				.imga{width: 48rpx;height: 38rpx;}
+				.imgb{width: 48rpx;height: 46rpx;}
+				.imgc{width: 44rpx;height: 48rpx;}
+				.imgd{width: 48rpx;height: 42rpx;}
+				.imge{width: 46rpx;height: 46rpx;}
+				.imgf{width: 48rpx;height: 48rpx;}
+				.imgg{width: 42rpx;height: 48rpx;}
+				.imgh{width: 44rpx;height: 44rpx;}
+				.imgi{width: 48rpx;height: 44rpx;}
+				.tips{position: absolute;min-width: 20rpx;top: -4rpx;left: 36rpx;box-sizing: border-box;
+height: 20rpx;padding: 0 4rpx;display: flex;align-items: center;justify-content: center;font-weight: bold;font-size: 16rpx;color: #FCF9F1;background: #D32C26;border-radius: 10rpx;
+				}
+			}
+		}
+	}
+	.upbox{display: flex;align-items: center;justify-content: center;flex-direction: column;margin-top: 8rpx;padding-top: 8rpx;margin-bottom: 6rpx;
+		image{width: 24rpx;height: 20rpx;margin-bottom: 8rpx;transition: all 0.3s;
+			&.zhe{transform: rotate(-180deg);}
+		}
+		view{font-weight: 500;font-size: 22rpx;color: #AAAAAA;}
+	}
+}
+</style>

+ 2 - 2
property_ui/pages/login.vue

@@ -119,14 +119,14 @@
 				// 设置用户信息
 				var that = this;
 				this.$store.dispatch('GetInfo').then(res => {
-					this.$tab.reLaunch('/pages/index')
+					this.$tab.reLaunch('/pages/index/index')
 				})
 			},
 		},
 
 		onLoad: function() {
 			if (getToken()) {
-				this.$tab.reLaunch('/pages/index')
+				this.$tab.reLaunch('/pages/index/index')
 				// 判断有什么角色
 			} else {
 				this.loginflag = true;

+ 384 - 296
property_ui/pages/mine/index.vue

@@ -1,308 +1,396 @@
 <template>
-  <view class="mine-container" :style="{height: `${windowHeight}px`}">
-    <!--顶部个人信息栏-->
-    <view class="header-section">
-      <view class="flex padding justify-between">
-        <view class="flex align-center">
-          <view v-if="!avatar" class="cu-avatar xl round bg-white">
-            <view class="iconfont icon-people text-gray icon"></view>
-          </view>
-          <image v-if="avatar" @click="handleToAvatar" :src="avatar" class="cu-avatar xl round" mode="widthFix">
-          </image>
-          <view v-if="!name" @click="handleToLogin" class="login-tip">
-            点击登录
-          </view>
-          <view v-if="name" @click="handleToInfo" class="user-info">
-            <view class="u_title">
-              用户名:{{ name }}
-            </view>
-          </view>
-        </view>
-        <view @click="handleToInfo" class="flex align-center">
-          <text>个人信息</text>
-          <view class="iconfont icon-right"></view>
-        </view>
-      </view>
-    </view>
-
-    <view class="content-section">
-      <view class="mine-actions grid col-4 text-center">
-        <view class="action-item" @click="handleJiaoLiuQun">
-          <view class="iconfont icon-friendfill text-pink icon"></view>
-          <text class="text">交流群</text>
-        </view>
-        <view class="action-item" @click="handleBuilding">
-          <view class="iconfont icon-service text-blue icon"></view>
-          <text class="text">在线客服</text>
-        </view>
-        <view class="action-item" @click="handleBuilding">
-          <view class="iconfont icon-community text-mauve icon"></view>
-          <text class="text">反馈社区</text>
-        </view>
-        <view class="action-item" @click="handleBuilding">
-          <view class="iconfont icon-dianzan text-green icon"></view>
-          <text class="text">点赞我们</text>
-        </view>
-      </view>
-
-      <view class="menu-list">
-        <view class="list-cell list-cell-arrow" @click="handleToEditInfo">
-          <view class="menu-item-box">
-            <view class="iconfont icon-user menu-icon"></view>
-            <view>编辑资料</view>
-          </view>
-        </view>
-        <view class="list-cell list-cell-arrow" @click="handleHelp">
-          <view class="menu-item-box">
-            <view class="iconfont icon-help menu-icon"></view>
-            <view>常见问题</view>
-          </view>
-        </view>
-        <view class="list-cell list-cell-arrow" @click="handleAbout">
-          <view class="menu-item-box">
-            <view class="iconfont icon-aixin menu-icon"></view>
-            <view>关于我们</view>
-          </view>
-        </view>
-        <view class="list-cell list-cell-arrow" @click="handleToSetting">
-          <view class="menu-item-box">
-            <view class="iconfont icon-setting menu-icon"></view>
-            <view>应用设置</view>
-          </view>
-        </view>
-		<!-- #ifdef APP-PLUS -->
-		
-		<!-- #endif -->
-		<view class="list-cell list-cell-arrow" @click="onlineWgt">
-		  <view class="menu-item-box">
-		    <view class="iconfont icon-setting menu-icon"></view>
-		    <view>版本号{{wgtcode}}</view>
-		  </view>
+	<view class="zxbox">
+		<view class="navbox">
+			<uni-nav-bar color="#ffffff"  :background-color="backgroundColor" :border="false"
+				statusBar='true' fixed="true">
+			</uni-nav-bar>
 		</view>
-      </view>
+		<image :src="bgimg" class="navbg"></image>
+		<view class="mbox">
+			<view class="infobox flexc" @click="handleToInfo">
+				<image  @click.stop="handleToAvatar" :src="avatarimg" class="limg" mode="aspectFill"></image>
+				<view class="cbox">
+					<view class="tit flexc">{{name?name:'登录账号'}}
+					
+						<view class="deptbox">
+							<image :src="wyimg"></image>
+							<view>物业</view>
+						</view>
+					</view>
+					<view class="txt">点击详情 享受更多精彩信息</view>
+					<!-- <view class="flexc pr" v-if="deptName">
+						<image :src="headl"></image>
+							<view class="txt">{{deptName}}点击登录 享受更多精彩信息</view>
+						<image :src="headr"></image>
+					</view> -->
+				</view>
+				<image :src="wrimg" class="wrimg"></image>
+				<!-- 登录 -->
+			<!-- 	<image v-if="avatar" @click.stop="handleToAvatar" :src="avatar" class="limg" mode="aspectFill"></image>
+				<image v-else @click.stop="handleToAvatar" :src="avatarimg" class="limg" mode="aspectFill"></image> -->
+				<!-- 未登录 -->
+				
+			</view>
+			<view class="conts flexc">
+				<view class="contn" v-if="checkPermi([''])" @click="handleToYy">
+					<view class="img">
+						<image :src="listimga" class="imga"></image>
+					</view>
+					<view class="ctit">党建发布</view>
+				</view>
+				<view class="contn" v-if="checkPermi([''])" @click="handleToYy">
+					<view class="img">
+						<image :src="listimgb" class="imgb"></image>
+					</view>
+					<view class="ctit">健康资讯发布</view>
+				</view>
+				<view class="contn">
+					<view class="img">
+						<image :src="listimgc" class="imga"></image>
+					</view>
+					<view class="ctit">商品发布</view>	
+				</view>
+				<view class="contn">
+					<view class="img">
+						<image :src="listimgd" class="imgc"></image>
+					</view>
+					<view class="ctit">投诉回复</view>	
+				</view>
+			</view>
+			<view class="mbgbox">
+				<view class="flexc mine_list" @click="getClockcontFn" v-if="checkPermi([''])">
+					<view class="limg">
+						<image :src="listimge" class="imga"></image>
+					</view>
+					<view class="tit flex1">报修管理</view>
+					<image :src="rimg" class="rimg"></image>
+				</view>
+				<view class="flexc mine_list" @click="getYqMeetFn">
+					<view class="limg">
+						<image :src="listimgf" class="imgb"></image>
+					</view>
+					<view class="tit flex1">物业费催缴</view>
+					<image :src="rimg" class="rimg"></image>
+				</view>
+				<view class="flexc mine_list" @click="handleUpassword">
+					<view class="limg">
+						<image :src="listimgg" class="imgc"></image>
+					</view>
+					<view class="tit flex1">修改密码</view>
+					<image :src="rimg" class="rimg"></image>
+				</view>
+				<!-- <view class="flexc mine_list" @click="handleToSetting">
+					<view class="limg">
+						<image :src="listimgg" class="imga"></image>
+					</view>
+					<view class="tit flex1">设置</view>
+					<image :src="rimg" class="rimg"></image>
+				</view> -->
+				<!-- #ifdef APP-PLUS -->
+				<view class="flexc mine_list"@click="onlineWgt">
+					<view class="limg">
+						<image :src="listimgh" class="imga"></image>
+					</view>
+					<view class="tit flex1">版本号</view>
+					 <view  class="txt">{{wgtcode}}</view>
+					 <image :src="rimg" class="rimg"></image>
+				</view>
+				<!-- #endif -->
+				<view class="flexc mine_list" @click="handleLogout">
+					<view class="limg">
+						<image :src="listimgi" class="imgd"></image>
+					</view>
+					<view class="tit flex1">退出登录</view>
+					<image :src="rimg" class="rimg"></image>
+				</view>
+				<!-- <view class="flexc mine_list" @click="handleUpassword">
+					<view class="limg">
+						<image :src="listimgh" class="imga"></image>
+					</view>
+					<view class="tit flex1">修改密码</view>
+					<image :src="rimg" class="rimg"></image>
+				</view> -->
+			</view>
+		</view>
+		<view class="ztit">安徽中新云计算有限公司提供支持</view>
+		<footers v-if="isfootflag" :footerindex="footerindex" :isHomeIndex="false"></footers>
 
-    </view>
-	<footers v-if="isfootflag" :footerindex="footerindex" :isHomeIndex="false"></footers>
-  </view>
+	</view>
 </template>
 
 <script>
-  import storage from '@/utils/storage'
-  import footers from '@/components/footer/footer.vue'
-  import {findVersion} from "@/api/system/user.js"
-  import {checkPermi,checkRole} from "@/utils/permission"; // 权限判断函数
-  import config from '@/config'
-  const baseUrl = config.baseUrl
-  export default {
-    data() {
-      return {
-        name: this.$store.state.user.name,
-        version: getApp().globalData.config.appInfo.version,
-		footerindex: 'mine',
-		isfootflag: true,
-		wgtcode: this.$store.state.user.wgtcode,
-		platform: 'Android',
-      }
-    },
-	components: {
-		footers
-	},
-    computed: {
-      avatar() {
-        return this.$store.state.user.avatar
-      },
-      windowHeight() {
-        return uni.getSystemInfoSync().windowHeight - 50
-      }
-    },
-	onLoad() {
-		var that=this;
-		this.nvaHeight=uni.getSystemInfoSync().statusBarHeight+44;
-		// #ifdef APP-PLUS
-		plus.runtime.getProperty(plus.runtime.appid, function(widgetInfo) {
-			that.$store.dispatch('SetwgtFn', widgetInfo.version).then(() => {
-				that.wgtcode=widgetInfo.version
-			})
-		});
-		// #endif
-	},
-    methods: {
-		checkPermi,checkRole,
-      handleToInfo() {
-        this.$tab.navigateTo('/pages/mine/info/index')
-      },
-      handleToEditInfo() {
-        this.$tab.navigateTo('/pages/mine/info/edit')
-      },
-      handleToSetting() {
-        this.$tab.navigateTo('/pages/mine/setting/index')
-      },
-      handleToLogin() {
-        this.$tab.reLaunch('/pages/login')
-      },
-      handleToAvatar() {
-        this.$tab.navigateTo('/pages/mine/avatar/index')
-      },
-      handleLogout() {
-        this.$modal.confirm('确定注销并退出系统吗?').then(() => {
-          this.$store.dispatch('LogOut').then(() => {
-            this.$tab.reLaunch('/pages/index')
-          })
-        })
-      },
-      handleHelp() {
-        this.$tab.navigateTo('/pages/mine/help/index')
-      },
-      handleAbout() {
-        this.$tab.navigateTo('/pages/mine/about/index')
-      },
-      handleJiaoLiuQun() {
-        this.$modal.showToast('QQ群:①133713780(满)、②146013835(满)、③189091635')
-      },
-      handleBuilding() {
-        this.$modal.showToast('模块建设中~')
-      },
-	  onlineWgt() {
-	  	let that = this;
-	  	plus.runtime.getProperty(plus.runtime.appid, function(widgetInfo) {
-	  		that.$store.dispatch('SetwgtFn', widgetInfo.version).then(() => {
-	  			that.wgtcode=widgetInfo.version
-	  		})
-	  		that.comparisonVersionNo(widgetInfo.versionCode);
-	  	});
-	  	// that.comparisonVersionNo()
-	  },
-	  comparisonVersionNo(versionCode) {
-	  	let that = this;
-	  	// console.log("aaaaaaa===versionCode", versionCode);
-	  	const parmas = {
-	  		model: that.platform
-	  	}
-	  	findVersion(parmas).then(res => {
-	  		if (res.code == "200") {
-	  			let versionNos = res.data.code;
-	  			console.log(versionNos, 'versionNos')
-	  			// console.log(res.data.path);
-	  			let filePath = res.data.path;
-	  			if (Number(versionNos) > Number(versionCode)) { //服务器返回1更新,0则不更新
-	  				uni.showModal({
-	  					title: '提示',
-	  					content: '发现新版本,是否升级',
-	  					success: function(res) {
-	  						// console.log(widgetInfo.version);
-	  						if (res.confirm) {
-	  							console.log('用户点击确定');
-	  							that.getProperty(filePath);
-	  						} else if (res.cancel) {
-	  							console.log('用户点击取消');
-	  						}
-	  					}
-	  				});
-	  			} else {
-	  				this.$toast('该版本已是最新版')
-	  			}
-	  		}
-	  	}).catch(error => {
-	  		uni.hideLoading()
-	  		console.log(error)
-	  	})
-	  },
-	  getProperty(getProperty) {
-	  	// console.log("bbbbbbbbb----------->", getProperty)
-	  	let that = this;
-	  	// 在线升级app/热更新
-	  	that.showwri = true;
-	  	const downloadTask = uni.downloadFile({ //下载文件
-	  		url: baseUrl + getProperty,
-	  		success: (downloadResult) => {
-	  			// console.log(downloadResult);
-	  			if (downloadResult.statusCode == 200) {
-	  				// 更新升级
-	  				plus.runtime.install(downloadResult.tempFilePath, {
-	  					force: true
-	  				}, function() {
-	  					// console.log('install success...');
-	  					that.showwri = false;
-	  					plus.nativeUI.alert("应用资源更新完成!", function() {
-	  						plus.runtime.restart();
-	  					});
-	  				}, function(e) {
-	  					that.showwri = false;
-	  					plus.nativeUI.alert("更新失败,请稍后再试");
-	  				});
-	  			}
-	  		}
-	  	});
-	  	downloadTask.onProgressUpdate((res) => { //下载文件的进度
-	  		that.totalBytesWritten = res.totalBytesWritten; //当前下载大小
-	  		that.progress = res.progress; //当前下载比例
-	  		that.totalBytesExpectedToWrite = res.totalBytesExpectedToWrite; //
-	  	});
-	  },
-    }
-  }
-</script>
-
-<style lang="scss">
-  page {
-    background-color: #f5f6f7;
-  }
-
-  .mine-container {
-    width: 100%;
-    height: 100%;
-
+	import storage from '@/utils/storage'
+	import footers from '@/components/footer/footer.vue'
+	import {findVersion} from "@/api/system/user.js"
+	import {checkPermi,checkRole} from "@/utils/permission"; // 权限判断函数
+	import config from '@/config'
+	const baseUrl = config.baseUrl
+	const webUrl=config.webUrl
+	export default {
+		data() {
+			return {
+				bgimg: require("@/static/images/mine/mbg.png"),
+				avatarimg:require("@/static/images/mine/head.png"),
+				listimga: require('@/static/images/mine/mtaba.png'),
+				listimgb: require('@/static/images/mine/mtabb.png'),
+				listimgc: require('@/static/images/mine/mtabc.png'),
+				listimgd: require('@/static/images/mine/mtabd.png'),
+				listimge: require('@/static/images/mine/mtabe.png'),
+				listimgf: require('@/static/images/mine/mtabf.png'),
+				listimgg: require('@/static/images/mine/mtabg.png'),
+				listimgh: require('@/static/images/mine/mtabh.png'),
+				listimgi: require('@/static/images/mine/mtabi.png'),
+				// listimgj: require('@/static/images/mine/minej.png'),
+				// listimgk: require('@/static/images/mine/minek.png'),
+				// listimgl: require('@/static/images/mine/minel.png'),
+				// listimgm: require('@/static/images/mine/minem.png'),
 
-    .header-section {
-      padding: 15px 15px 45px 15px;
-      background-color: #3c96f3;
-      color: white;
+				head:require('@/static/images/mine/head.png'),
+				wrimg:require("@/static/images/mine/wrimg.png"),
+				rimg:require("@/static/images/home/rimg.png"),
+				wyimg:require("@/static/images/mine/wy.png"),
+				border: false,
+				backgroundColor: 'transparent',
 
-      .login-tip {
-        font-size: 18px;
-        margin-left: 10px;
-      }
-
-      .cu-avatar {
-        border: 2px solid #eaeaea;
-
-        .icon {
-          font-size: 40px;
-        }
-      }
-
-      .user-info {
-        margin-left: 15px;
-
-        .u_title {
-          font-size: 18px;
-          line-height: 30px;
-        }
-      }
-    }
-
-    .content-section {
-      position: relative;
-      top: -50px;
+				name: this.$store.state.user.nickName,
+				deptName:this.$store.state.user.deptName,
+				// version: getApp().globalData.config.appInfo.version,
+				footerindex: 'mine',
+				isfootflag: true,
+				noticenum: 0,
+				deptId: this.$store.state.user.deptId,
+				wgtcode: this.$store.state.user.wgtcode,
+				platform: 'Android',
+				nvaHeight:44,
+			}
+		},
+		components: {
+			footers
+		},
+		computed: {
+			avatar() {
+				return this.$store.state.user.avatar
+			},
+			windowHeight() {
+				return uni.getSystemInfoSync().windowHeight - 50
+			}
+		},
+		onPageScroll(e) {
+			// var scrollTop = Number(e.scrollTop);
+			// var listTop=Number(this.listTop)-Number(this.nvaHeight)
+			// if (scrollTop <=this.nvaHeight) {
+			// 	const opacity = scrollTop / 100 // 计算透明度值
+			// 	const color = `rgba(29, 100, 226, ${opacity})`
+			// 	this.backgroundColor = color // 更新盒子背景颜色
+			// } else {
+			// 	// this.backgroundColor = '#00A9F0'
+			// }
+		}, 
+		onLoad() {
+			var that=this;
+			this.nvaHeight=uni.getSystemInfoSync().statusBarHeight+44;
+			// #ifdef APP-PLUS
+			plus.runtime.getProperty(plus.runtime.appid, function(widgetInfo) {
+				that.$store.dispatch('SetwgtFn', widgetInfo.version).then(() => {
+					that.wgtcode=widgetInfo.version
+				})
+			});
+			// #endif
+		},
+		mounted() {
+		}, 
+		
+		methods: {
+			checkPermi,checkRole,
+			// 待我审批
+			handleToYy(){
+				this.$tab.navigateTo("/pages/order/list")
+			},
+			//访客预约
+			handleToAddYy(){
+				this.$tab.navigateTo("/pages/order/come")
+			},
+			//在线会议
+			getYqMeetFn(){
+				// var url='https://www.baidu.com'
+				this.$tab.navigateTo("/pages/common/webview/index?url="+webUrl)
+			},
+			//我的会议
+			handleToMyhy(){
+				this.$tab.navigateTo("/work/pages/yyorder/meetlist")
+			},
+			//我的就餐
+			handleToMyjc(){
+				this.$tab.navigateTo("/work/pages/yyorder/eatlist")
+			},
+			//我的申报
+			handleToMysb(){
+				// this.$tab.navigateTo("/work/pages/business/list?from=my&type=0")
+			},
+			// 考勤设置
+			handleToKq(){
+				this.$tab.navigateTo('/work/pages/clock/kaorules')
+			},
+			// 考勤记录
+			getClockjlFn(){
+				this.$tab.navigateTo("/work/pages/record/clockin")
+			},
+			// 考勤统计
+			getClockcontFn(){
+				this.$tab.navigateTo("/work/pages/clock/personnel")
+			},
+			// 设置
+			handleToSetting() {
+			  this.$tab.navigateTo('/pages/mine/setting/index')
+			},
+			// 修改密码
+			handleUpassword(){
+				this.$tab.navigateTo(`/pages/mine/pwd/index`)  
+			},
+			// 账号信息
+			handleToInfo() {
+				this.$tab.navigateTo('/pages/mine/info/index')
+			},
+			handleToLogin() {
+				this.$tab.reLaunch('/pages/login')
+			},
+			handleToAvatar() {
+				this.$tab.navigateTo('/pages/mine/avatar/index')
+			},
+			handleLogout() {
+				this.$modal.confirm('确定注销并退出系统吗?').then(() => {
+					this.$store.dispatch('LogOut').then(() => {
+						this.$tab.reLaunch('/pages/index')
+					})
+				})
+			},
+			onlineWgt() {
+				let that = this;
+				plus.runtime.getProperty(plus.runtime.appid, function(widgetInfo) {
+					that.$store.dispatch('SetwgtFn', widgetInfo.version).then(() => {
+						that.wgtcode=widgetInfo.version
+					})
+					that.comparisonVersionNo(widgetInfo.versionCode);
+				});
+				// that.comparisonVersionNo()
+			},
+			comparisonVersionNo(versionCode) {
+				let that = this;
+				// console.log("aaaaaaa===versionCode", versionCode);
+				const parmas = {
+					model: that.platform
+				}
+				findVersion(parmas).then(res => {
+					if (res.code == "200") {
+						let versionNos = res.data.code;
+						console.log(versionNos, 'versionNos')
+						// console.log(res.data.path);
+						let filePath = res.data.path;
+						if (Number(versionNos) > Number(versionCode)) { //服务器返回1更新,0则不更新
+							uni.showModal({
+								title: '提示',
+								content: '发现新版本,是否升级',
+								success: function(res) {
+									// console.log(widgetInfo.version);
+									if (res.confirm) {
+										console.log('用户点击确定');
+										that.getProperty(filePath);
+									} else if (res.cancel) {
+										console.log('用户点击取消');
+									}
+								}
+							});
+						} else {
+							this.$toast('该版本已是最新版')
+						}
+					}
+				}).catch(error => {
+					uni.hideLoading()
+					console.log(error)
+				})
+			},
+			getProperty(getProperty) {
+				// console.log("bbbbbbbbb----------->", getProperty)
+				let that = this;
+				// 在线升级app/热更新
+				that.showwri = true;
+				const downloadTask = uni.downloadFile({ //下载文件
+					url: baseUrl + getProperty,
+					success: (downloadResult) => {
+						// console.log(downloadResult);
+						if (downloadResult.statusCode == 200) {
+							// 更新升级
+							plus.runtime.install(downloadResult.tempFilePath, {
+								force: true
+							}, function() {
+								// console.log('install success...');
+								that.showwri = false;
+								plus.nativeUI.alert("应用资源更新完成!", function() {
+									plus.runtime.restart();
+								});
+							}, function(e) {
+								that.showwri = false;
+								plus.nativeUI.alert("更新失败,请稍后再试");
+							});
+						}
+					}
+				});
+				downloadTask.onProgressUpdate((res) => { //下载文件的进度
+					that.totalBytesWritten = res.totalBytesWritten; //当前下载大小
+					that.progress = res.progress; //当前下载比例
+					that.totalBytesExpectedToWrite = res.totalBytesExpectedToWrite; //
+				});
+			},
+		}
+	}
+</script>
 
-      .mine-actions {
-        margin: 15px 15px;
-        padding: 20px 0px;
-        border-radius: 8px;
-        background-color: white;
+<style lang="scss">
+page{background-color: #ffffff;}
+.navbox{position: fixed;left: 0;right: 0;top: 0;z-index: 4;	}
+.deptbox{height: 34rpx;position: relative;margin-left: 16rpx;padding-left: 40rpx;box-sizing: border-box;padding-top: 4rpx;
+	image{width: 102rpx;height: 34rpx;position: absolute;left: 0;top: 0;}
+	view{font-weight: bold;font-size: 22rpx;color: #FFFFFF;position: relative;z-index: 2;height: 30rpx;min-width: 60rpx;background: linear-gradient(90deg, #FFB54D, #FE5B0E);border-radius: 0 15rpx 15rpx 0;}
+}
+.zxbox{ 
+	.navbg{width: 100%;height: 782rpx;}
+	.mbox{padding: 148rpx 24rpx 0;z-index: 1;position: relative;
+		.infobox{margin-bottom: 48rpx;padding: 0 20rpx;
+			.limg{width: 98rpx;height: 98rpx;flex: 0 0 auto;margin-right: 24rpx;border-radius: 50%;box-sizing: border-box;}
+			.cbox{flex: 1;z-index: 1;
+				.tit{font-weight: bold;font-size: 36rpx;color: #161616;margin-bottom: 10rpx;}
+				.txt{font-weight: bold;font-size: 26rpx;color: #76829B;}
+			}
+			.wrimg{width: 14rpx;height: 26rpx;flex: 0 0 auo;}
+		}
+		.conts{box-sizing: border-box;background: #FFFFFF;box-shadow: 0px 0px 10rpx 0px #C4DEE8;border-radius: 20rpx;
+			.contn{padding: 32rpx 0 30rpx;
+				display: flex;align-items: center;flex: 0 0 auto;width: 25%;flex-direction: column;
+				.img{width: 40rpx;height: 40rpx;display: flex;align-items: center;justify-content: center;margin-bottom: 24rpx;flex: 0 0 auto;
+					.imga{width: 36rpx;height: 36rpx;}
+					.imgb{width: 40rpx;height: 38rpx;}
+					.imgc{width: 40rpx;height: 40rpx;}
+				}
+				.ctit{font-weight: bold;font-size: 26rpx;color: #272727;}
+			}
+		}
+		.mbgbox{width: 100%;margin-bottom: 24rpx;padding-top: 32rpx;
+			.mine_list{
+				padding: 28rpx 20rpx;
+				.limg{flex: 0 0 auto;width: 32rpx;height: 32rpx;margin-right: 26rpx;display: flex;align-items: center;justify-content: center;
+					.imga{width: 32rpx;height: 32rpx;}
+					.imgb{width: 32rpx;height: 30rpx;}
+					.imgc{width: 30rpx;height: 32rpx;}
+					.imgd{width: 26rpx;height: 32rpx;}
+				}
+				.tit{font-weight: bold;font-size: 26rpx;color: #272727;}
+				.txt{font-weight: 500;font-size: 26rpx;color: #666666;margin-left: 20rpx;flex: 0 0 auto;}
+				.rimg{width: 14rpx;height: 26rpx;margin-left: 20rpx;flex: 0 0 auto;}
+			}
+		}
+	}
+}
 
-        .action-item {
-          .icon {
-            font-size: 28px;
-          }
+.ztit{font-size: 24rpx;color:#c6c6c9;text-align: center;flex:0 0 auto;margin-bottom: 28rpx;margin-top: 40rpx;}
 
-          .text {
-            display: block;
-            font-size: 13px;
-            margin: 8px 0px;
-          }
-        }
-      }
-    }
-  }
 </style>

+ 1 - 1
property_ui/pages/mine/setting/index.vue

@@ -50,7 +50,7 @@
       handleLogout() {
         this.$modal.confirm('确定注销并退出系统吗?').then(() => {
           this.$store.dispatch('LogOut').then(() => {
-            this.$tab.reLaunch('/pages/index')
+            this.$tab.reLaunch('/pages/index/index')
           })
         })
       }

+ 1 - 1
property_ui/pages/tlogin.vue

@@ -235,7 +235,7 @@
 		   // 设置用户信息
 		   var that=this;
 		   this.$store.dispatch('GetInfo').then(res => {
-			   this.$tab.reLaunch('/pages/index') 
+			   this.$tab.reLaunch('/pages/index/index') 
 		   })
 		 },
 		 

+ 1 - 1
property_ui/permission.js

@@ -4,7 +4,7 @@ import { getToken } from '@/utils/auth'
 const loginPage = "/pages/login"
   
 // 页面白名单
-const whiteList = ['/pages/index','/pages/agreement',
+const whiteList = ['/pages/index/index','/pages/agreement',
   '/pages/login','/pages/tlogin', '/pages/register', '/pages/common/webview/index'
 ]
 

ファイルの差分が大きいため隠しています
+ 2 - 0
property_ui/static/editor-icon.css


BIN
property_ui/static/images/banner/banner01.jpg


BIN
property_ui/static/images/banner/banner02.jpg


BIN
property_ui/static/images/banner/banner03.jpg


BIN
property_ui/static/images/eye.png


BIN
property_ui/static/images/health/hbg.png


BIN
property_ui/static/images/health/heabox.png


BIN
property_ui/static/images/health/more.png


BIN
property_ui/static/images/health/rimg.png


BIN
property_ui/static/images/mine/head.png


BIN
property_ui/static/images/mine/mbg.png


BIN
property_ui/static/images/mine/mtaba.png


BIN
property_ui/static/images/mine/mtabb.png


BIN
property_ui/static/images/mine/mtabc.png


BIN
property_ui/static/images/mine/mtabd.png


BIN
property_ui/static/images/mine/mtabe.png


BIN
property_ui/static/images/mine/mtabf.png


BIN
property_ui/static/images/mine/mtabg.png


BIN
property_ui/static/images/mine/mtabh.png


BIN
property_ui/static/images/mine/mtabi.png


+ 0 - 0
property_ui/static/images/mine/icon_dl_yc.png → property_ui/static/images/mine/neye.png


BIN
property_ui/static/images/mine/wrimg.png


BIN
property_ui/static/images/mine/wy.png


BIN
property_ui/static/nodata.png


+ 14 - 2
property_ui/static/style.css

@@ -5,8 +5,11 @@
 .flex0{flex: 0 0 auto;}
 .flex01{flex: 0 1 auto;}
 .flexcj{display: flex;align-items: center;justify-content: space-between;}
+.flexdcc{display: flex;align-items: center;justify-content: center;flex-direction: column;}
 .flexdc{display: flex;flex-direction: column;}
 .flecw{display: flex;flex-wrap: wrap;}
+.flext{display: flex;align-items: flex-start;}
+.flexjd{display: flex;justify-content: flex-end;}
 .bgbox{background-color: rgba(0, 0, 0, 0.5);position: fixed;left: 0;right: 0;top: 0;bottom: 0;z-index: 5;}
 .clearf::after {
   content: "";
@@ -17,13 +20,17 @@
 .overa{overflow: auto;}
 .over{overflow: hidden;white-space: nowrap;text-overflow: ellipsis;}
 .overtwo{word-break: break-all;text-overflow: ellipsis;overflow: hidden;display: -webkit-box;-webkit-line-clamp: 2;-webkit-box-orient: vertical;white-space: normal;}
-.navbg{width: 100%;position: absolute;left: 0;right: 0;top: 0;z-index: -1;}
+.navbg{width: 100%;position: absolute;left: 0;right: 0;top: 0;z-index: 0;}
 .shax {font-size: 30rpx;color: #666;text-align: center;padding: 20rpx 0;}
 .rhbtn{width: 100%;height: 88rpx;display: flex;align-items: center;justify-content: center;
 font-weight: bold;font-size: 26rpx;color: #FFFFFF;background: #0256FD;border-radius: 20rpx;}
 .rfbtn{height: 98rpx;display: flex;align-items: center;justify-content: center;font-weight: bold;position: fixed;left: 0;right: 0;bottom: 0;z-index: 2;font-size: 26rpx;color: #FFFFFF;background: #0156FE;}
+.bg45{background: #45CB99 !important;}
+.fjbtns{font-weight: 500;font-size: 26rpx;margin-left: 36rpx;}
+.fjtxt{font-weight: bold;font-size: 26rpx;color: #222327;}
 .txr{text-align: right;}
 
+.fw5{font-weight: 500;}
 .f12{font-size: 24rpx;}
 .f13{font-size: 26rpx;}
 .coa{color: #aaaaaa;}
@@ -37,21 +44,26 @@ font-weight: bold;font-size: 26rpx;color: #FFFFFF;background: #0256FD;border-rad
 .cof6{color: #FF6161;}
 .co06{color: #06C770;}
 
-
 .pdlr12{padding: 0 24rpx;}
 
 .ml10{margin-left: 20rpx;}
 .mr6{margin-right: 12rpx;}
+.mr12{margin-right: 24rpx;}
 
 .mb4{margin-bottom: 8rpx;}
+.mb5{margin-bottom: 10rpx;}
 .mb6{margin-bottom: 12rpx;}
 .mb9{margin-bottom: 18rpx !important;}
 .mb10{margin-bottom: 20rpx;}
+.mb12{margin-bottom: 24rpx;}
 .mb14{margin-bottom: 28rpx;}
 .mb16{margin-bottom: 32rpx;}
+.mb18{margin-bottom: 36rpx;}
 .mb20{margin-bottom: 40rpx;}
 .mb22{margin-bottom: 44rpx;}
+.mb24{margin-bottom: 48rpx;}
 .mt6{margin-top: 12rpx;}
 .mt12{margin-top: 24rpx;}
+.mt40{margin-top: 80rpx;}
 .mt55{margin-top: 110rpx;}
 .mt63{margin-top: 126rpx;}

+ 108 - 0
property_ui/uni_modules/lsj-upload/changelog.md

@@ -0,0 +1,108 @@
+## 2.2.6(2023-02-09)
+修复多个文件同时选择时返回多次change回调的问题
+## 2.2.5(2022-12-27)
+1.修复多选文件时未能正常校验数量的问题;
+2.app端与H5端支持单选或多选文件,通过count数量控制,超过1开启多选。
+## 2.2.4(2022-12-27)
+1.修复多选文件时未能正常校验数量的问题;
+2.app端修复多选只取到第一个文件的问题。
+## 2.2.3(2022-12-06)
+修复手动调用show()导致count失效的问题
+## 2.2.2(2022-12-01)
+Vue3自行修改兼容
+## 2.2.1(2022-10-19)
+修复childId警告提示
+## 2.2.0(2022-10-10)
+更新app端webview窗口参数clidId,默认值添加时间戳保证唯一性
+## 2.1.9(2022-07-13)
+[修复] app端选择文件后初始化设置的文件列表被清空问题
+## 2.1.8(2022-07-13)
+[新增] ref方法初始化文件列表,用于已提交后再次编辑时需带入已上传文件:setFiles(files),可传入数组或Map对象,传入格式请与组件选择返回格式保持一致,且name为必须属性。
+## 2.1.7(2022-07-12)
+修复ios端偶现创建webview初始化参数未生效的问题
+## 2.1.6(2022-07-11)
+[修复]:修复上个版本更新导致nvue窗口组件不能选择文件的问题;
+[新增]:
+1.应群友建议(填写禁止格式太多)格式限制formats由原来填写禁止选择的格式改为填写允许被选择的格式;
+2.应群友建议(增加上传结束回调事件),上传结束回调事件@uploadEnd
+3.如能帮到你请留下你的免费好评,组件使用过程中有问题可以加QQ群交流,至于Map对象怎么使用这类前端基础问题请自行百度
+## 2.1.5(2022-07-01)
+app端组件销毁时添加自动销毁webview功能,避免v-if销毁组件的情况控件还能被点击的问题
+## 2.1.4(2022-07-01)
+修复小程序端回显问题
+## 2.1.3(2022-06-30)
+回调事件返回参数新增path字段(文件临时地址),用于回显
+## 2.1.2(2022-06-16)
+修复APP端Tabbar窗口无法选择文件的问题
+## 2.1.1(2022-06-16)
+优化:
+1.组件优化为允许在v-if中使用;
+2.允许option直接在data赋值,不再强制在onRead中初始化;
+## 2.1.0(2022-06-13)
+h5 pc端更改为单次可多选
+## 2.0.9(2022-06-10)
+更新演示内容,部分同学不知道怎么获取服务端返回的数据
+## 2.0.8(2022-06-09)
+优化动态更新上传参数函数,具体查看下方说明:动态更新参数演示
+## 2.0.7(2022-06-07)
+新增wxFileType属性,用于小程序端选择附件时可选文件类型
+## 2.0.6(2022-06-07)
+修复小程序端真机选择文件提示失败的问题
+## 2.0.5(2022-06-02)
+优化小程序端调用hide()后未阻止触发文件选择问题
+## 2.0.4(2022-06-01)
+优化APP端选择器初始定位
+## 2.0.3(2022-05-31)
+修复nvue窗口选择文件报错问题 
+## 2.0.2(2022-05-20)
+修复ios端opiton设置过早未传入webview导致不自动上传问题
+## 2.0.1(2022-05-19)
+修复APP端子窗口点击选择文件不响应问题
+## 2.0.0(2022-05-18)
+此次组件更新至2.0版本,与1.0版本使用上略有差异,已使用1.0的同学请自行斟酌是否需要升级!
+部分差异:
+一、 2.0新增异步触发上传功能;
+二、2.0新增文件批量上传功能;
+三、2.0优化option,剔除属性,只保留上传接口所需字段,且允许异步更改option的值;
+四、组件增加size(文件大小限制)、count(文件个数限制)、formats(文件后缀限制)、accept(文件类型限制)、instantly(是否立即自动上传)、debug(日志打印)等属性;
+五、回调事件取消input事件、callback事件,新增change事件和progress事件;
+六、ref事件新增upload事件、clear事件;
+七、优化组件代码,show和hide函数改为显示隐藏,不再重复开关webview;
+
+## 1.2.3(2022-03-22)
+修复Demo里传入待完善功能[手动上传属性manual=true]导致不自动上传的问题,手动提交上传待下个版本更新
+## 1.2.2(2022-02-21)
+修复上版本APP优化导致H5和小程序端不自动初始化的问题,此次更新仅修复此问题。异步提交功能下个版本更新~
+## 1.2.1(2022-01-25)
+QQ1群已满,已开放2群:469580165
+## 1.2.0(2021-12-09)
+优化APP端页面中DOM重排后每次需要重新定位的问题
+## 1.1.1(2021-12-09)
+优化,与上版本使用方式有改变,请检查后确认是否需要更新,create更名为show,  close更名为hide,取消初始化时手动create, 传参方式改为props=>option
+## 1.1.0(2021-12-09)
+新增refresh方法,用于DOM发生重排时重新定位控件(APP端)
+## 1.0.9(2021-07-15)
+修复上传进度未同步渲染,直接返回100%的BUG
+## 1.0.8(2021-07-12)
+修复H5端传入height和width未生效的bug
+## 1.0.7(2021-07-07)
+修复h5和小程序端上传完成callback未返回fileName字段问题
+## 1.0.6(2021-07-07)
+修复h5端提示信息debug
+## 1.0.5(2021-06-29)
+感谢小伙伴找出bug,上传成功回调success未置为true,已修复
+## 1.0.4(2021-06-28)
+新增兼容APP,H5,小程序手动关闭控件,关闭后不再弹出文件选择框,需要重新create再次开启
+## 1.0.3(2021-06-28)
+close增加条件编译,除app端外不需要close
+## 1.0.2(2021-06-28)
+1.修复页面滚动位置后再create控件导致控件位置不正确的问题;
+2.修复nvue无法create控件;
+3.示例项目新增nvue使用案例;
+## 1.0.1(2021-06-28)
+因为有的朋友不清楚app端切换tab时应该怎么处理webview,现重新上传一版示例项目,需要做tab切换的朋友可以导入示例项目查看
+## 1.0.0(2021-06-25)
+此插件为l-file插件中上传功能改版,更新内容为:
+1. 按钮内嵌入页面,不再强制固定底部,可跟随页面滚动
+2.无需再单独弹框点击上传,减去中间层
+3.通过slot自定义按钮样式

+ 442 - 0
property_ui/uni_modules/lsj-upload/components/lsj-upload/LsjFile.js

@@ -0,0 +1,442 @@
+export class LsjFile {
+	constructor(data) {
+		this.dom = null;
+		// files.type = waiting(等待上传)|| loading(上传中)|| success(成功) || fail(失败)
+		this.files = new Map();
+		this.debug = data.debug || false;
+		this.id = data.id;
+		this.width = data.width;
+		this.height = data.height;
+		this.option = data.option;
+		this.instantly = data.instantly;
+		this.prohibited = data.prohibited;
+		this.onchange = data.onchange;
+		this.onprogress = data.onprogress;
+		this.uploadHandle = this._uploadHandle;
+		this.fileName=data.fileName;
+		this.bigType=data.bigType;
+		// this.loanApplicationNumber=data.loanApplicationNumber
+		// #ifdef MP-WEIXIN
+		this.uploadHandle = this._uploadHandleWX;
+		// #endif
+	}
+	
+	
+	/**
+	 * 创建File节点
+	 * @param {string}path webview地址
+	 */
+	create(path) {
+		if (!this.dom) {
+			// #ifdef H5
+				let dom = document.createElement('input');
+				dom.type = 'file'
+				dom.value = ''
+				dom.style.height = this.height
+				dom.style.width = this.width
+				dom.style.position = 'absolute'
+				dom.style.top = 0
+				dom.style.left = 0
+				dom.style.right = 0
+				dom.style.bottom = 0
+				dom.style.opacity = 0
+				dom.style.zIndex = 2
+				dom.accept = this.prohibited.accept;
+				if (this.prohibited.count > 1) {
+				dom.multiple = 'multiple';
+				}
+				dom.onchange = event => {
+					for (let file of event.target.files) {
+						// if (this.files.size >= this.prohibited.count) {
+						// 	this.toast(`只允许上传${this.prohibited.count}个文件`);
+						// 	this.dom.value = '';
+						// 	break;
+						// }
+						this.addFile(file);
+					}
+					
+					this._uploadAfter();
+					
+					this.dom.value = '';
+				};
+				this.dom = dom;
+			// #endif
+		
+			// #ifdef APP-PLUS
+				let styles = {
+					top: '-200px',
+					left: 0,
+					width: '1px',
+					height: '200px',
+					background: 'transparent' 
+				};
+				let extras = {
+					debug: this.debug,
+					instantly: this.instantly,
+					prohibited: this.prohibited,
+				}
+				this.dom = plus.webview.create(path, this.id, styles,extras);
+				this.setData(this.option); 
+				this._overrideUrlLoading();
+			// #endif
+			return this.dom;
+		}
+	}
+	
+	
+	/**
+	 * 设置上传参数
+	 * @param {object|string}name 上传参数,支持a.b 和 a[b]
+	 */
+	setData() {
+		let [name,value = ''] = arguments;
+		if (typeof name === 'object') {
+			Object.assign(this.option,name);
+		}
+		else {
+			this._setValue(this.option,name,value);
+		}
+		
+		this.debug&&console.log(JSON.stringify(this.option));
+		
+		// #ifdef APP-PLUS
+			this.dom.evalJS(`vm.setData('${JSON.stringify(this.option)}')`);
+		// #endif
+	}
+	
+	/**
+	 * 上传
+	 * @param {string}name 文件名称
+	 */
+	async upload(name='') {
+		if (!this.option.url) {
+			throw Error('未设置上传地址');
+		}
+		
+		// #ifndef APP-PLUS
+			if (name && this.files.has(name)) {
+				await this.uploadHandle(this.files.get(name));
+			}
+			else {
+				for (let item of this.files.values()) {
+					if (item.type === 'waiting' || item.type === 'fail') {
+						await this.uploadHandle(item);
+					}
+				}
+			}
+		// #endif
+		
+		// #ifdef APP-PLUS
+			this.dom&&this.dom.evalJS(`vm.upload('${name}')`);
+		// #endif
+	}
+	async uploadimp(name,files) {
+		if (!this.option.url) {
+			throw Error('未设置上传地址');
+		}
+		// #ifndef APP-PLUS
+			if (name && files.has(name)) {
+				await this.uploadHandle(files.get(name));
+			}
+			else {
+				for (let item of files.values()) {
+					if (item.type === 'waiting' || item.type === 'fail') {
+						await this.uploadHandle(item);
+					}
+				}
+			}
+		// #endif
+		
+		// #ifdef APP-PLUS
+			this.dom&&this.dom.evalJS(`vm.upload('${name}')`);
+		// #endif
+	}
+	// 选择文件change
+	addFile(file,isCallChange) {
+		
+		let name = file.name;
+		this.debug&&console.log('文件名称',name,'大小',file.size);
+		
+		if (file) {
+			// 限制文件格式
+			let path = '';
+			let suffix = name.substring(name.lastIndexOf(".")+1).toLowerCase();
+			let formats = this.prohibited.formats.toLowerCase();
+			// #ifndef MP-WEIXIN
+				path = URL.createObjectURL(file);
+			// #endif
+			// #ifdef MP-WEIXIN
+				path = file.path;
+			// #endif
+			if (formats&&!formats.includes(suffix)) {
+				this.toast(`不支持上传${suffix.toUpperCase()}格式文件`);
+				return false;
+			}
+			// 限制文件大小
+			if (file.size > 1024 * 1024 * Math.abs(this.prohibited.size)) {
+				this.toast(`附件大小请勿超过${this.prohibited.size}M`)
+				return false;
+			}
+			this.files.set(file.name,{file,path,name: file.name,size: file.size,progress: 0,type: 'waiting'});
+			return true;
+		}
+	}
+	
+	/**
+	 * 移除文件
+	 * @param {string}name 不传name默认移除所有文件,传入name移除指定name的文件
+	 */
+	clear(name='') {
+		// #ifdef APP-PLUS
+		this.dom&&this.dom.evalJS(`vm.clear('${name}')`);
+		// #endif
+		
+		if (!name) {
+			this.files.clear();
+		}
+		else {
+			this.files.delete(name); 
+		}
+		return this.onchange(this.files);
+	}
+	
+	/**
+	 * 提示框
+	 * @param {string}msg 轻提示内容
+	 */
+	toast(msg) {
+		uni.showToast({
+			title: msg,
+			icon: 'none'
+		});
+	}
+	
+	/**
+	 * 微信小程序选择文件
+	 * @param {number}count 可选择文件数量
+	 */
+	chooseMessageFile(type,count) {
+		wx.chooseMessageFile({
+			count: count,
+			type: type,
+			success: ({ tempFiles }) => {
+				for (let file of tempFiles) {
+					this.addFile(file);
+				}
+				this._uploadAfter();
+			},
+			fail: () => {
+				this.toast(`打开失败`);
+			}
+		})
+	}
+	
+	_copyObject(obj) {
+		if (typeof obj !== "undefined") {
+			return JSON.parse(JSON.stringify(obj));
+		} else {
+			return obj;
+		}
+	}
+	
+	/**
+	 * 自动根据字符串路径设置对象中的值 支持.和[]
+	 * @param	{Object} dataObj 数据源
+	 * @param	{String} name 支持a.b 和 a[b]
+	 * @param	{String} value 值
+	 * setValue(dataObj, name, value);
+	 */
+	_setValue(dataObj, name, value) {
+		// 通过正则表达式  查找路径数据
+		let dataValue;
+		if (typeof value === "object") {
+			dataValue = this._copyObject(value);
+		} else {
+			dataValue = value;
+		}
+		let regExp = new RegExp("([\\w$]+)|\\[(:\\d)\\]", "g");
+		const patten = name.match(regExp);
+		// 遍历路径  逐级查找  最后一级用于直接赋值
+		for (let i = 0; i < patten.length - 1; i++) {
+			let keyName = patten[i];
+			if (typeof dataObj[keyName] !== "object") dataObj[keyName] = {};
+			dataObj = dataObj[keyName];
+		}
+		// 最后一级
+		dataObj[patten[patten.length - 1]] = dataValue;
+		this.debug&&console.log('参数更新后',JSON.stringify(this.option));
+	}
+	
+	_uploadAfter() {
+		this.onchange(this.files);
+		this.instantly&&this.upload();
+	}
+	
+	_overrideUrlLoading() {
+		this.dom.overrideUrlLoading({ mode: 'reject' }, e => {
+			let {retype,item,files,end} = this._getRequest(
+				e.url
+			);
+			let _this = this;
+			switch (retype) {
+				case 'updateOption':
+					this.dom.evalJS(`vm.setData('${JSON.stringify(_this.option)}')`);
+					break
+				case 'change':
+					try {
+						_this.files = new Map([..._this.files,...JSON.parse(unescape(files))]);
+					} catch (e) {
+						return console.error('出错了,请检查代码')
+					}
+					_this.onchange(_this.files);
+					break
+				case 'progress':
+					try {
+						item = JSON.parse(unescape(item));
+					} catch (e) {
+						return console.error('出错了,请检查代码')
+					}
+					_this._changeFilesItem(item,end);
+					break
+				default:
+					break
+			}
+		})
+	}
+	
+	_getRequest(url) {
+		let theRequest = new Object()
+		let index = url.indexOf('?')
+		if (index != -1) {
+			let str = url.substring(index + 1)
+			let strs = str.split('&')
+			for (let i = 0; i < strs.length; i++) {
+				theRequest[strs[i].split('=')[0]] = unescape(strs[i].split('=')[1])
+			}
+		}
+		return theRequest
+	}
+	
+	_changeFilesItem(item,end=false) {
+		this.debug&&console.log('onprogress',JSON.stringify(item));
+		this.onprogress(item,end);
+		this.files.set(item.name,item);
+	}
+	
+	_uploadHandle(item) {
+		item.type = 'loading';
+		delete item.responseText;
+		return new Promise((resolve,reject)=>{
+			this.debug&&console.log('option',JSON.stringify(this.option));
+			let {url,name,method='POST',header,formData} = this.option;
+			let form = new FormData(); 
+			for (let keys in formData) {
+				form.append(keys, formData[keys])
+			}
+			// 根据名称传值
+			if(this.fileName){
+				form.append('fileName', this.fileName)
+			}
+			if(this.bigType){
+				form.append('bigType', this.bigType)
+			}
+			// if(this.loanApplicationNumber){
+			// 	form.append('loanApplicationNumber', this.loanApplicationNumber)
+			// }
+			
+			form.append(name, item.file);
+			let xmlRequest = new XMLHttpRequest();
+			xmlRequest.open(method, url, true);
+			for (let keys in header) {
+				xmlRequest.setRequestHeader(keys, header[keys])
+			}
+			xmlRequest.upload.addEventListener(
+				'progress',
+				event => {
+					if (event.lengthComputable) {
+						let progress = Math.ceil((event.loaded * 100) / event.total)
+						if (progress <= 100) {
+							item.progress = progress;
+							this._changeFilesItem(item);
+						}
+					}
+				},
+				false
+			);
+			
+			xmlRequest.ontimeout = () => {
+				console.error('请求超时')
+				item.type = 'fail';
+				this._changeFilesItem(item,true);
+				return resolve(false);
+			}
+			
+			xmlRequest.onreadystatechange = ev => {
+				if (xmlRequest.readyState == 4) {
+					if (xmlRequest.status == 200) {
+						this.debug&&console.log('上传完成:' + xmlRequest.responseText)
+						item['responseText'] = xmlRequest.responseText;
+						item.type = 'success';
+						this._changeFilesItem(item,true);
+						return resolve(true);
+					} else if (xmlRequest.status == 0) {
+						console.error('status = 0 :请检查请求头Content-Type与服务端是否匹配,服务端已正确开启跨域,并且nginx未拦截阻止请求')
+					}
+					console.error('--ERROR--:status = ' + xmlRequest.status)
+					item.type = 'fail';
+					this._changeFilesItem(item,true);
+					return resolve(false);
+				}
+			}
+			xmlRequest.send(form)
+		});
+	}
+	
+	_uploadHandleWX(item) {
+		item.type = 'loading';
+		delete item.responseText;
+		return new Promise((resolve,reject)=>{
+			this.debug&&console.log('option',JSON.stringify(this.option));
+			let form = {filePath: item.file.path,...this.option };
+			let {formData} = this.option;
+			// 根据名称传值
+			if(this.fileName){
+				formData.fileName=this.fileName
+			}
+			if(this.bigType){
+				formData.bigType=this.bigType
+			}
+			// if(this.loanApplicationNumber){
+				// formData.loanApplicationNumber=this.loanApplicationNumber
+			// }
+			formData.name=item.file
+			form.formData=JSON.parse(JSON.stringify(formData))
+			form['fail'] = ({ errMsg = '' }) => {
+				console.error('--ERROR--:' + errMsg)
+				item.type = 'fail';
+				this._changeFilesItem(item,true);
+				return resolve(false);
+			}
+			form['success'] = res => {
+				if (res.statusCode == 200) {
+					this.debug&&console.log('上传完成,微信端返回不一定是字符串,根据接口返回格式判断是否需要JSON.parse:' + res.data)
+					item['responseText'] = res.data;
+					item.type = 'success';
+					this._changeFilesItem(item,true);
+					return resolve(true);
+				}
+				item.type = 'fail';
+				this._changeFilesItem(item,true);
+				return resolve(false);
+			}
+			
+			let xmlRequest = uni.uploadFile(form);
+			xmlRequest.onProgressUpdate(({ progress = 0 }) => {
+				if (progress <= 100) {
+					item.progress = progress;
+					this._changeFilesItem(item);
+				}
+			})
+		});
+	}
+}

+ 329 - 0
property_ui/uni_modules/lsj-upload/components/lsj-upload/lsj-upload.vue

@@ -0,0 +1,329 @@
+<template>
+	<view class="lsj-file" :style="[getStyles]">
+		<view ref="lsj" class="hFile" :style="[getStyles]" @click="onClick">
+			<slot><view class="defview" :style="[getStyles]">附件上传</view></slot>
+		</view>
+	</view>
+</template>
+
+<script>
+// 查看文档:https://ext.dcloud.net.cn/plugin?id=5459
+import {LsjFile} from './LsjFile.js' 
+export default {
+	name: 'Lsj-upload',
+	props: {
+		// 打印日志
+		debug: {type: Boolean,default: false},
+		// 自动上传
+		instantly: {type: Boolean,default: false},
+		// 上传接口参数设置
+		option: {type: Object,default: ()=>{}},
+		// 文件大小上限
+		size: { type: Number, default: 10 },
+		// 文件选择个数上限,超出后不触发点击
+		count: { type: Number, default: 10000 },
+		// 允许上传的文件格式(多个以逗号隔开)
+		formats: { type: String, default:''},
+		// input file选择限制
+		accept: {type: String,default: ''},
+		// 微信选择文件类型 
+		//all=从所有文件选择,
+		//video=只能选择视频文件,
+		//image=只能选择图片文件,
+		//file=可以选择除了图片和视频之外的其它的文件
+		wxFileType: { type: String, default: 'all' },
+		// webviewID需唯一,不同窗口也不要同Id
+		childId: { type: String, default: 'lsjUpload'  },
+		// 文件选择触发面宽度
+		width: { type: String, default: '100%' },
+		// 文件选择触发面高度
+		height: { type: String, default: '80rpx' },
+		fileName: { type: String, default: '' },
+		fileVal:{ type: [String,Number], default: '' },
+		bigType:{ type: [String,Number], default: '' },
+		fjidx:{ type: [String,Number], default: 0 },
+		
+		// top,left,bottom,right仅position=absolute时才需要传入
+		top: { type: [String, Number], default: '' },
+		left: { type: [String, Number], default: '' },
+		bottom: { type: [String, Number], default: '' },
+		right: { type: [String, Number], default: '' },
+		xmtype:{ type: [String, Number], default: '' },
+		// nvue不支持跟随窗口滚动
+		position: { 
+			type: String,
+			// #ifdef APP-NVUE
+			 default: 'absolute',
+			// #endif
+			// #ifndef APP-NVUE
+			default: 'static',
+			// #endif
+		},
+	},
+	data() {
+		return {
+			
+		}
+	},
+	watch: {
+		option(v) {
+			// #ifdef APP-PLUS
+			this.lsjFile&&this.show();
+			// #endif
+		}
+	},
+	updated() {
+		// #ifdef APP-PLUS
+			if (this.isShow) {
+				this.lsjFile&&this.show();
+			}
+		// #endif
+	},
+	computed: {
+		getStyles() {
+			let styles = {
+				width: this.width,
+				height: this.height
+			}
+			if (this.position == 'absolute') {
+				styles['top'] = this.top
+				styles['bottom'] = this.bottom
+				styles['left'] = this.left
+				styles['right'] = this.right
+				styles['position'] = 'fixed'
+			}
+
+			return styles
+		}
+	},
+	mounted() {
+		this._size = 0;
+		let WEBID = this.childId + new Date().getTime();
+		// #ifdef APP-PLUS
+		this.option.formData.fileName=this.fileName;
+		this.option.formData.bigType=this.bigType;
+		// #endif
+		this.lsjFile = new LsjFile({
+			id: WEBID,
+			debug: this.debug,
+			width: this.width,
+			height: this.height,
+			option: this.option,
+			instantly: this.instantly,
+			fileName:this.fileName,
+			bigType:this.bigType,
+			// 限制条件
+			prohibited: {
+				// 大小
+				size: this.size,
+				// 允许上传的格式
+				formats: this.formats,
+				// 限制选择的格式
+				accept: this.accept,
+				count: this.count
+			},
+			onchange: this.onchange,
+			onprogress: this.onprogress,
+		});
+		this.create();
+		
+	},
+	beforeDestroy() {
+		// #ifdef APP-PLUS
+		this.lsjFile.dom.close();
+		// #endif
+	},
+	methods: {
+		setFiles(array) {
+			if (array instanceof Map) {
+				for (let [key, item] of array) {
+					item['progress'] = 100;
+					item['type'] = 'success';
+					this.lsjFile.files.set(key,item);
+				}
+			}
+			else if (Array.isArray(array)) {
+				array.forEach(item=>{
+					if (item.name) { 
+						item['progress'] = 100;
+						item['type'] = 'success';
+						this.lsjFile.files.set(item.name,item);
+					}
+				});
+			}
+			this.onchange(this.lsjFile.files);
+		},
+		setData() {
+			this.lsjFile&&this.lsjFile.setData(...arguments);
+		},
+		getDomStyles(callback) {
+			// #ifndef APP-NVUE
+			let view = uni
+				.createSelectorQuery()
+				.in(this)
+				.select('.lsj-file')
+			view.fields(
+				{
+					size: true,
+					rect: true
+				},
+				({ height, width, top, left, right, bottom }) => {
+					uni.createSelectorQuery()
+					.selectViewport()
+					.scrollOffset(({ scrollTop }) => {
+						return callback({
+							top: parseInt(top) + parseInt(scrollTop) + 'px',
+							left: parseInt(left) + 'px',
+							width: parseInt(width) + 'px',
+							height: parseInt(height) + 'px'
+						})
+					})
+					.exec()
+				}
+			).exec()
+			// #endif
+			// #ifdef APP-NVUE
+			const dom = weex.requireModule('dom')
+			dom.getComponentRect(this.$refs.lsj, ({ size: { height, width, top, left, right, bottom } }) => {
+				return callback({
+					top: parseInt(top) + 'px',
+					left: parseInt(left) + 'px',
+					width: parseInt(width) + 'px',
+					height: parseInt(height) + 'px',
+					right: parseInt(right) + 'px',
+					bottom: parseInt(bottom) + 'px'
+				})
+			})
+			// #endif
+		},
+		show() {
+			if (this._size && (this._size >= this.count)) {
+				return;
+			}
+			this.isShow = true;
+			// #ifdef APP-PLUS
+			this.lsjFile&&this.getDomStyles(styles => {
+				this.lsjFile.dom.setStyle(styles)
+			});
+			// #endif
+			// #ifdef H5
+			this.lsjFile.dom.style.display = 'inline'
+			// #endif
+		},
+		hide() {
+			this.isShow = false;
+			// #ifdef APP-PLUS
+			this.lsjFile&&this.lsjFile.dom.setStyle({
+				top: '-100px',
+				left:'0px',
+				width: '1px',
+				height: '100px',
+			});
+			// #endif
+			// #ifdef H5
+			this.lsjFile.dom.style.display = 'none'
+			// #endif
+		},
+		/**
+		 * 手动提交上传
+		 * @param {string}name 文件名称,不传则上传所有type等于waiting和fail的文件
+		 */
+		upload(name) {
+			this.lsjFile&&this.lsjFile.upload(name);
+		},
+		/**
+		 * @returns {Map} 已选择的文件Map集
+		 */
+		onchange(files) {
+			this.$emit('getFile',this.xmtype)
+			this.$emit('change',files);
+			this._size = files.size;
+			return files.size >= this.count ? this.hide() : this.show();
+		},
+		/**
+		 * @returns {object} 当前上传中的对象
+		 */
+		onprogress(item,end=false) {
+			this.$emit('progress',item);
+			var fileVal=this.fileVal||'';
+			var bigType=this.bigType||'';
+			var fjidx=this.fjidx||0;
+			if (end) {
+				setTimeout(()=>{
+					this.$emit('uploadEnd',item,fileVal,bigType,fjidx);
+				},0);
+			}
+		},
+		/**
+		 * 移除组件内缓存的某条数据
+		 * @param {string}name 文件名称,不指定默认清除所有文件
+		 */
+		clear(name) {
+			this.lsjFile.clear(name);
+		},
+		// 创建选择器
+		create() {
+			// 若iOS端服务端处理不了跨域就将hybrid目录内的html放到服务端去,并将此处path改成服务器上的地址
+			let path = '/uni_modules/lsj-upload/hybrid/html/uploadFile.html';
+			let dom = this.lsjFile.create(path);
+			// #ifdef H5
+			this.$refs.lsj.$el.appendChild(dom);
+			// #endif
+			// #ifndef APP-PLUS
+			this.show();
+			// #endif
+			// #ifdef APP-PLUS
+			dom.setStyle({position: this.position});
+			dom.loadURL(path);
+			setTimeout(()=>{
+				// #ifdef APP-NVUE
+				plus.webview.currentWebview().append(dom);
+				// #endif
+				// #ifndef APP-NVUE
+				this.$root.$scope.$getAppWebview().append(dom);
+				// #endif
+				this.show();
+			},300)
+			// #endif
+		},
+		// 点击选择附件
+		onClick() {
+			// if (this._size >= this.count) {
+			// 	this.toast(`只允许上传${this.count}个文件`);
+			// 	return;
+			// }
+			
+			// #ifdef MP-WEIXIN
+			if (!this.isShow) {return;}
+			let count = this.count - this._size;
+			this.lsjFile.chooseMessageFile(this.wxFileType,count);
+			// #endif
+		},
+		toast(msg) {
+			uni.showToast({
+				title: msg,
+				icon: 'none'
+			});
+		}
+	}
+}
+</script>
+
+<style scoped>
+.lsj-file {
+	display: inline-block;
+}
+.defview {
+	background-color: #007aff;
+	color: #fff;
+	border-radius: 10rpx;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	font-size: 28rpx;
+}
+.hFile {
+	position: relative;
+	overflow: hidden;
+}
+</style>

ファイルの差分が大きいため隠しています
+ 5 - 0
property_ui/uni_modules/lsj-upload/hybrid/html/js/vue.min.js


+ 193 - 0
property_ui/uni_modules/lsj-upload/hybrid/html/uploadFile.html

@@ -0,0 +1,193 @@
+<!DOCTYPE html>
+<html lang="zh-cn">
+
+	<head>
+		<meta charset="UTF-8">
+		<title class="title">[文件管理器]</title>
+		<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
+		<style type="text/css">
+			.content {background: transparent;}
+			.btn {position: relative;top: 0;left: 0;bottom: 0;right: 0;}
+			.btn .file {position: fixed;z-index: 3;left: 0;right: 0;top: 0;bottom: 0;width: 100%;opacity: 0;}
+		</style>
+	</head>
+
+	<body>
+		
+		<div id="content" class="content">
+			<div class="btn">
+				<input :multiple="multiple" @change="onChange" :accept="accept" ref="file" class="file" type="file" />
+			</div>
+		</div>
+		
+		<script type="text/javascript" src="js/vue.min.js"></script>
+		<script type="text/javascript">
+			let _this;
+			var vm = new Vue({
+				el: '#content',
+				data: {
+					accept: '',
+					multiple: true,
+					aoption:{},
+				},
+				mounted() {
+					console.log('加载webview');
+					_this = this;
+					this.files = new Map();
+					document.addEventListener('plusready', (e)=>{
+					let {debug,instantly,prohibited} = plus.webview.currentWebview();
+					this.debug = debug;
+					this.instantly = instantly;
+					this.prohibited = prohibited;
+					this.accept = prohibited.accept; 
+					this.multiple = prohibited.count > 1;
+					this.aoption=this.option;
+					location.href = 'callback?retype=updateOption';
+					}, false);
+				},
+				methods: {
+					toast(msg) {
+						plus.nativeUI.toast(msg);
+					},
+					clear(name) {
+						if (!name) {
+							this.files.clear();
+							return;
+						}
+						this.files.delete(name);
+					},
+					setData(option='{}') {
+						this.debug&&console.log('更新参数:'+option);
+						try{
+							_this.option = JSON.parse(option);
+						}catch(e){
+							console.error('参数设置错误')
+						}
+					},
+					async upload(name=''){
+						if (name && this.files.has(name)) {
+							await this.createUpload(this.files.get(name));
+						}
+						else {
+							for (let item of this.files.values()) {
+								if (item.type === 'waiting' || item.type === 'fail') {
+									await this.createUpload(item);
+								}
+							}
+						}
+					},
+					onChange(e) {
+						let fileDom = this.$refs.file;
+						for (let file of fileDom.files) {
+							// if (this.files.size >= this.prohibited.count) {
+							// 	this.toast(`只允许上传${this.prohibited.count}个文件`);
+							// 	fileDom.value = '';
+							// 	break;
+							// }
+							this.addFile(file);
+						}
+						this.uploadAfter();
+						fileDom.value = '';
+					},
+					addFile(file) {
+						if (file) {
+							let name = file.name;
+							this.debug&&console.log('文件名称',name,'大小',file.size);
+							// 限制文件格式
+							let suffix = name.substring(name.lastIndexOf(".")+1).toLowerCase();
+							let formats = this.prohibited.formats.toLowerCase();
+							if (formats&&!formats.includes(suffix)) {
+								this.toast(`不支持上传${suffix.toUpperCase()}格式文件`);
+								return;
+							}
+							// 限制文件大小
+							if (file.size > 1024 * 1024 * Math.abs(this.prohibited.size)) {
+								this.toast(`附件大小请勿超过${this.prohibited.size}M`)
+								return;
+							}
+							let path = URL.createObjectURL(file);
+							this.files.set(file.name,{file,path,name: file.name,size: file.size,progress: 0,type: 'waiting'});
+						}
+					},
+					/**
+					 * @returns {Map} 已选择的文件Map集
+					 */
+					callChange() {
+						location.href = 'callback?retype=change&files=' + escape(JSON.stringify([...this.files]));
+					},
+					/**
+					 * @returns {object} 正在处理的当前对象
+					 */
+					changeFilesItem(item,end='') {
+						this.files.set(item.name,item);
+						location.href = 'callback?retype=progress&end='+ end +'&item=' + escape(JSON.stringify(item));
+					},
+					uploadAfter() {
+						this.callChange();
+						this.instantly&&this.upload();
+					},
+					createUpload(item) {
+						this.debug&&console.log('准备上传,option=:'+JSON.stringify(this.option));
+						item.type = 'loading';
+						delete item.responseText;
+						return new Promise((resolve,reject)=>{
+							let {url,name,method='POST',header={},formData={}} = this.aoption;
+							let form = new FormData();
+							for (let keys in formData) {
+								form.append(keys, formData[keys])
+							}
+							form.append(name, item.file);
+							let xmlRequest = new XMLHttpRequest();
+							xmlRequest.open(method, url, true);
+							for (let keys in header) {
+								xmlRequest.setRequestHeader(keys, header[keys])
+							}
+							xmlRequest.upload.addEventListener(
+								'progress',
+								event => {
+									if (event.lengthComputable) {
+										let progress = Math.ceil((event.loaded * 100) / event.total)
+										if (progress <= 100) {
+											item.progress = progress;
+											this.changeFilesItem(item);
+										}
+									}
+								},
+								false
+							);
+							
+							xmlRequest.ontimeout = () => {
+								console.error('请求超时')
+								item.type = 'fail';
+								this.changeFilesItem(item,true);
+								return resolve(false);
+							}
+							
+							xmlRequest.onreadystatechange = ev => {
+								if (xmlRequest.readyState == 4) {
+									if (xmlRequest.status == 200) {
+										this.debug && console.log('上传完成:' + xmlRequest.responseText)
+										item['responseText'] = xmlRequest.responseText;
+										item.type = 'success';
+										this.changeFilesItem(item,true);
+										return resolve(true);
+									} else if (xmlRequest.status == 0) {
+										console.error('status = 0 :请检查请求头Content-Type与服务端是否匹配,服务端已正确开启跨域,并且nginx未拦截阻止请求')
+									}
+									console.error('--ERROR--:status = ' + xmlRequest.status) 
+									item.type = 'fail';
+									this.changeFilesItem(item,true);
+									return resolve(false);
+								}
+							}
+							xmlRequest.send(form)
+						});
+						
+					}
+				}
+			});
+			
+		</script>
+	</body>
+
+</html>

+ 79 - 0
property_ui/uni_modules/lsj-upload/package.json

@@ -0,0 +1,79 @@
+{
+    "id": "lsj-upload",
+    "displayName": "全文件上传选择非原生2.0版",
+    "version": "2.2.6",
+    "description": "文件选择上传-支持APP-H5网页-微信小程序",
+    "keywords": [
+        "附件",
+        "file",
+        "upload",
+        "上传",
+        "文件管理器"
+    ],
+    "repository": "",
+    "engines": {
+        "HBuilderX": "^3.3.7"
+    },
+    "dcloudext": {
+        "sale": {
+            "regular": {
+                "price": "0.00"
+            },
+            "sourcecode": {
+                "price": "0.00"
+            }
+        },
+        "contact": {
+            "qq": ""
+        },
+        "declaration": {
+            "ads": "无",
+            "data": "无",
+            "permissions": "无"
+        },
+        "npmurl": "",
+        "type": "component-vue"
+    },
+    "uni_modules": {
+        "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",
+                    "阿里": "u",
+                    "百度": "u",
+                    "字节跳动": "u",
+                    "QQ": "u"
+                },
+                "快应用": {
+                    "华为": "y",
+                    "联盟": "y"
+                },
+                "Vue": {
+                    "vue2": "y",
+                    "vue3": "y"
+                }
+            }
+        }
+    }
+}

+ 353 - 0
property_ui/uni_modules/lsj-upload/readme.md

@@ -0,0 +1,353 @@
+# lsj-upload
+
+### 插件地址:https://ext.dcloud.net.cn/plugin?id=5459
+
+### 不清楚使用方式可点击右侧导入示例项目运行完整示例
+### 此次更新2.0与1.0使用方式略有差异,已使用1.0的同学自行斟酌是否更新到2.0版本!!!
+
+使用插件有任何问题欢迎加入QQ讨论群:
+- 群1:701468256(已满)
+- 群2:469580165(已满)
+- 群3:667530868
+
+若能帮到你请高抬贵手点亮5颗星~
+------
+## 重要提示
+### 组件是窗口级滚动,不要在scroll-view内使用!!
+### 组件是窗口级滚动,不要在scroll-view内使用!!
+### 组件是窗口级滚动,不要在scroll-view内使用!!
+
+### 控件的height高度应与slot自定义内容高度保持一致
+### nvue窗口只能使用固定模式position=absolute
+### show() 当DOM重排后在this.$nextTick内调用show(),控件定位会更加准确
+### hide() APP端webview层级比view高,如不希望触发点击时,应调用hide隐藏控件,反之调用show
+### 若iOS端跨域服务端同学实在配置不好,可把hybrid下html目录放到服务器去,同源则不存在跨域问题。
+### 小程序端因hybrid不能使用本地HTML,所以插件提供的是从微信消息列表拉取文件并选择,请知悉。
+### file对象不是object对象,也不能转json字符串,如果你打印file那就是{},可以打印file.name和file.size。
+### 返回的path是个blob类型,仅供用于文件回显,插件已内置好上传函数,调用上传会自动提交待上传文件,若非要自己拿path去搞上传那你自己处理。
+------
+
+## 使用说明
+| 属性		| 是否必填	|  值类型	| 默认值	| 说明			|
+| --------- | -------- 	| -----: 	| --: 	| :------------:|
+| width		|	否 		| String	|100%	| 容器宽度		|
+| height	|	是 		| String	|80rpx	| 容器高度		|
+| debug		|	否 		| Boolean	|false	| 打印调试日志	|
+| option	|	是 		| Object	|-		| [文件上传接口相关参数](#p1)|
+| instantly	|	否 		| Boolean	|false	| true=自动上传	|
+| count		|	否 		| Number	|10		| 附件选择上限(个)|
+| size		|	否 		| Number	|10		| 附件大小上限(M)|
+| wxFileType	|	否 		| String	|all		| 微信小程序文件选择器格式限制(all=从所有文件选择,video=只能选择视频文件,image=只能选择图片文件,file=可以选择除了图片和视频之外的其它的文件)|
+| accept	|	否 		| String	|-		| 文件选择器input file格式限制(部分机型不兼容,建议使用formats)|
+| formats	|	否 		| String	|-		| 限制允许上传的格式,空串=不限制,默认为空,多个格式以逗号隔开,例如png,jpg,pdf|
+| childId	|	否 		| String	|lsjUpload| 控件的id(仅APP有效,应用内每个控件命名一个唯一Id,不同窗口也不要同名Id)|
+| position	|	否 		| String	|static	| 控件的定位模式(static=控件随页面滚动;absolute=控件在页面中绝对定位,不随窗口内容滚动)|
+| top,left,right,bottom	|	否 		| [Number,String]	|0		| 设置控件绝对位置,position=absolute时有效|
+| @change	|	否 		| Function	|Map	| 选择文件触发,返回所有已选择文件Map集合|
+| @progress	|	否 		| Function	|Object	| 上传过程中发生状态变化的文件对象,需通过set更新至Map集合|
+| @uploadEnd|	否 		| Function	|Object	| 上传结束回调,返回参数与progress一致|
+
+## <a id="p1">option说明</a>
+|参数 | 是否必填 |  说明|
+|---- | ---- | :--: |
+|url  |	是	| 上传接口地址|
+|name| 否	|上传接口文件key,默认为file|
+|header| 否	|上传接口请求头|
+|formData| 否	|上传接口额外参数|
+
+## ref调用
+|作用 | 方法名| 传入参数|  说明|
+|---- | --------- | -------- | :--: |
+|显示控件| show|-| 控件显示状态下可触发点击|
+|隐藏控件| hide|-| 控件隐藏状态下不触发点击|
+|动态设置文件列表| setFiles|[Array,Map] files| 传入格式请与组件选择返回格式保持一致,且name为必须属性,可查看下方演示|
+|动态更新参数| setData|[String] name,[any] value| name支持a.b 和 a[b],可查看下方演示|
+|移除选择的文件| clear|[String] name| 不传参数清空所有文件,传入文件name时删除该name的文件|
+|手动上传| upload|[String] name| 不传参数默认依次上传所有type=waiting的文件,传入文件name时不关心type是否为waiting,单独上传指定name的文件|
+|手动上传 文件| uploadimp|[Object] name| 不传参数默认依次上传所有type=waiting的文件,传入文件name时不关心type是否为waiting,单独上传指定name的文件|
+
+## progress返回对象字段说明
+|字段 |  说明|
+|---- | :--: |
+|file | 文件对象|
+|name |文件名称|
+|size |文件大小|
+|type |文件上传状态:waiting(等待上传)、loading(上传中)、success(成功) 、fail(失败)|
+|responseText|上传成功后服务端返回数据(仅type为success时存在)|
+
+## 以下演示为vue窗口使用方式,nvue使用区别是必须传入控件绝对位置如top,bottom,left,right,且position只能为absolute,如不清楚可点击右侧导入示例项目有详细演示代码。
+
+### vue:
+``` javascript
+<lsj-upload 
+	ref="lsjUpload"
+	childId="upload1"
+	:width="width"
+	:height="height"
+	:option="option"
+	:size="size"
+	:formats="formats"
+	:debug="debug"
+	:instantly="instantly"
+	@progress="onprogress"
+	@change="onChange">
+		<view class="btn" :style="{width: width,height: height}">选择附件</view>
+</lsj-upload>
+
+
+<view class="padding">
+			
+	<view>已选择文件列表:</view>
+	
+	<!-- #ifndef MP-WEIXIN -->
+	<view v-for="(item,index) in files.values()" :key="index">
+		<image style="width: 100rpx;height: 100rpx;" :src="item.path" mode="widthFix"></image>
+		<text>提示:【path主要用于图片视频类文件回显,他用自行处理】:{{item.path}}</text>
+		<text>{{item.name}}</text>
+		<text style="margin-left: 10rpx;">大小:{{item.size}}</text>
+		<text style="margin-left: 10rpx;">状态:{{item.type}}</text>
+		<text style="margin-left: 10rpx;">进度:{{item.progress}}</text>
+		<text style="margin-left: 10rpx;" v-if="item.responseText">服务端返回演示:{{item.responseText}}</text>
+		<text @click="resetUpload(item.name)" v-if="item.type=='fail'" style="margin-left: 10rpx;padding: 0 10rpx;border: 1rpx solid #007AFF;">重新上传</text>
+		<text @click="clear(item.name)" style="margin-left: 10rpx;padding: 0 10rpx;border: 1rpx solid #007AFF;">删除</text>
+	</view>
+	<!-- #endif -->
+	
+	<!-- #ifdef MP-WEIXIN -->
+	<view v-for="(item,index) in wxFiles" :key="index">
+		<text>{{item.name}}</text>
+		<text style="margin-left: 10rpx;">大小:{{item.size}}</text>
+		<text style="margin-left: 10rpx;">状态:{{item.type}}</text>
+		<text style="margin-left: 10rpx;">进度:{{item.progress}}</text>
+		<view>
+			<button @click="resetUpload(item.name)">重新上传</button>
+			<button @click="clear(item.name)">删除</button>
+		</view>
+	</view>
+	<!-- #endif -->
+	
+</view>
+
+
+```
+
+---
+* 函数说明
+
+
+``` javascript
+export default {
+	data() {
+		return {
+			// 上传接口参数
+			option: {
+				// 上传服务器地址,需要替换为你的接口地址
+				url: 'http://hl.j56.com/dropbox/document/upload', // 该地址非真实路径,需替换为你项目自己的接口地址
+				// 上传附件的key
+				name: 'file',
+				// 根据你接口需求自定义请求头,默认不要写content-type,让浏览器自适配
+				header: {
+					// 示例参数可删除
+					'Authorization': 'bearer eyJhbGciOiJSUzI1NiIsI',
+					'uid': '99',
+					'client': 'app',
+					'accountid': 'DP',
+				},
+				// 根据你接口需求自定义body参数
+				formData: {
+					// 'orderId': 1000
+				}
+			},
+			// 选择文件后是否立即自动上传,true=选择后立即上传
+			instantly: true,
+			// 必传宽高且宽高应与slot宽高保持一致
+			width: '180rpx',
+			height: '180rpx',
+			// 限制允许上传的格式,空串=不限制,默认为空
+			formats: '',
+			// 文件上传大小限制
+			size: 30,
+			// 文件数量限制
+			count: 2,
+			// 文件回显列表
+			files: new Map(),
+			// 微信小程序Map对象for循环不显示,所以转成普通数组,不要问为什么,我也不知道
+			wxFiles: [],
+			// 是否打印日志
+			debug: true,
+			
+			
+			// 演示用
+			tabIndex: 0,
+			list:[], 
+		}
+	},
+	onReady() {
+		setTimeout(()=>{
+			console.log('----演示动态更新参数-----');
+			this.$refs['lsjUpload'+this.tabIndex].setData('formData.orderId','动态设置的参数'); 
+			
+			console.log('以下注释内容为-动态更新参数更多演示,放开后可查看演示效果');
+			// 修改option对象的name属性
+			// this.$refs.lsjUpload.setData('name','myFile');
+			
+			// 修改option对象的formData内的属性
+			// this.$refs.lsjUpload.setData('formData.appid','1111');
+			
+			// 替换option对象的formData
+			// this.$refs.lsjUpload.setData('formData',{appid:'222'});
+			
+			// option对象的formData新增属性
+			// this.$refs.lsjUpload.setData('formData.newkey','新插入到formData的属性');
+			
+			
+			// ---------演示初始化值,用于已提交后再次编辑时需带入已上传文件-------
+			// 方式1=传入数组
+			// let files1 = [{name: '1.png'},{name: '2.png',}];
+			
+			// 方式2=传入Map对象
+			// let files2 = new Map();
+			// files2.set('1.png',{name: '1.png'})
+			
+			// 此处调用setFiles设置初始files
+			// this.$refs.lsjUpload.setFiles(files1);
+			
+			// 初始化tab
+			this.onTab(0);
+		},2000)
+	},
+	methods: {
+		// 某文件上传结束回调(成功失败都回调)
+		onuploadEnd(item) {
+			console.log(`${item.name}已上传结束,上传状态=${item.type}`);
+			
+			// 更新当前窗口状态变化的文件
+			this.files.set(item.name,item);
+			
+			// ---可删除--演示上传完成后取服务端数据
+			if (item['responseText']) {
+				console.log('演示服务器返回的字符串JSON转Object对象');
+				this.files.get(item.name).responseText = JSON.parse(item.responseText);
+			}
+			
+			// 微信小程序Map对象for循环不显示,所以转成普通数组,
+			// 如果你用不惯Map对象,也可以像这样转普通数组,组件使用Map主要是避免反复文件去重操作
+			// #ifdef MP-WEIXIN
+			this.wxFiles = [...this.files.values()];
+			// #endif
+			
+			// 强制更新视图
+			this.$forceUpdate();
+			
+			
+			// ---可删除--演示判断是否所有文件均已上传成功
+			let isAll = [...this.files.values()].find(item=>item.type!=='success');
+			if (!isAll) {
+				console.log('已全部上传完毕');
+			}
+			else {
+				console.log(isAll.name+'待上传');
+			}
+			
+		},
+		// 上传进度回调
+		onprogress(item) {
+			// 更新当前状态变化的文件
+			this.files.set(item.name,item);
+			
+			console.log('打印对象',JSON.stringify(this.files.get(item.name)));
+			// 微信小程序Map对象for循环不显示,所以转成普通数组,不要问为什么,我也不知道
+			// #ifdef MP-WEIXIN
+			this.wxFiles = [...this.files.values()];
+			// #endif
+			
+			// 强制更新视图
+			this.$forceUpdate();
+			
+		},
+		// 文件选择回调
+		onChange(files) {
+			console.log('当前选择的文件列表:',JSON.stringify([...files.values()]));
+			// 更新选择的文件 
+			this.files = files;
+			// 强制更新视图
+			this.$forceUpdate();
+			
+			// 微信小程序Map对象for循环不显示,所以转成普通数组,不要问为什么,我也不知道
+			// #ifdef MP-WEIXIN
+			this.wxFiles = [...this.files.values()];
+			// #endif
+			
+			// ---可删除--演示重新定位覆盖层控件
+			this.$nextTick(()=>{
+				console.log('演示重新定位');
+				this.$refs.lsjUpload0.show();
+				this.$refs.lsjUpload1.show();
+				this.$refs.lsjUpload2.show();
+			});
+			
+		},
+		// 手动上传
+		upload() {
+			// name=指定文件名,不指定则上传所有type等于waiting和fail的文件
+			this.$refs['lsjUpload'+this.tabIndex].upload();
+		},
+		// 指定上传某个文件
+		resetUpload(name) {
+			this.$refs['lsjUpload'+this.tabIndex].upload(name);
+		},
+		// 移除某个文件
+		clear(name) {
+			// name=指定文件名,不传name默认移除所有文件
+			this.$refs['lsjUpload'+this.tabIndex].clear(name);
+		},
+		/**
+		 * ---可删除--演示在组件上方添加新内容DOM变化
+		 * DOM重排演示,重排后组件内部updated默认会触发show方法,若特殊情况未能触发updated也可以手动调用一次show()
+		 * 什么是DOM重排?自行百度去
+		 */
+		add() {
+			this.list.push('DOM重排测试');
+		},
+		/**
+		 * ---可删除--演示Tab切换时覆盖层是否能被点击
+		 * APP端因为是webview,层级比view高,此时若不希望点击触发选择文件,需要手动调用hide()
+		 * 手动调用hide后,需要调用show()才能恢复覆盖层的点击
+		 */
+		onTab(tabIndex) {
+			this.$refs.lsjUpload0.hide();
+			this.$refs.lsjUpload1.hide();
+			
+			this.tabIndex = tabIndex;
+			
+			this.$nextTick(()=>{
+				this.$refs['lsjUpload'+this.tabIndex].show();
+			})
+			
+		},
+		/**
+		 * 打开nvue窗口查看非跟随窗口滚动效果
+		 */
+		open() {
+			uni.navigateTo({
+				url: '/pages/nvue-demo/nvue-demo'
+			});
+		}
+	}
+}
+
+```
+
+## 温馨提示
+	
+* 文件上传
+0. 如说明表达还不够清楚,不清楚怎么使用可导入完整示例项目运行体验和查看	
+1. APP端请优先联调Android,上传成功后再运行iOS端,如iOS返回status=0则需要后端开启允许跨域;
+2. header的Content-Type类型需要与服务端要求一致,否则收不到附件(服务端若没有明文规定则可不写,使用默认匹配)
+3. 服务端不清楚怎么配置跨域可加群咨询,具体百度~
+4. 欢迎加入QQ讨论群:701468256(已满)
+5. 欢迎加入QQ讨论群:469580165(已满)
+6. 欢迎加入QQ讨论群:667530868
+7. 若能帮到你还请点亮5颗小星星以作鼓励哈~
+8. 若能帮到你还请点亮5颗小星星以作鼓励哈~
+9. 若能帮到你还请点亮5颗小星星以作鼓励哈~

+ 320 - 0
property_ui/uni_modules/qiun-data-charts/changelog.md

@@ -0,0 +1,320 @@
+## 2.5.0-20230101(2023-01-01)
+- 秋云图表组件 修改条件编译顺序,确保uniapp的cli方式的项目依赖不完整时可以正常显示
+- 秋云图表组件 恢复props属性directory的使用,以修复vue3项目中,开启echarts后,echarts目录识别错误的bug
+- uCharts.js 修复区域图、混合图只有一个数据时图表显示不正确的bug
+- uCharts.js 修复折线图、区域图中时间轴类别图表tooltip指示点显示不正确的bug
+- uCharts.js 修复x轴使用labelCount时,并且boundaryGap = 'justify' 并且关闭Y轴显示的时候,最后一个坐标值不显示的bug
+- uCharts.js 修复折线图只有一组数据时 ios16 渲染颜色不正确的bug
+- uCharts.js 修复玫瑰图半径显示不正确的bug
+- uCharts.js 柱状图、山峰图增加正负图功能,y轴网格如果需要显示0轴则由 min max 及 splitNumber 确定,后续版本优化自动显示0轴
+- uCharts.js 柱状图column增加 opts.extra.column.labelPosition,数据标签位置,有效值为 outside外部, insideTop内顶部, center内中间, bottom内底部
+- uCharts.js 雷达图radar增加 opts.extra.radar.labelShow,否显示各项标识文案是,默认true
+- uCharts.js 提示窗tooltip增加 opts.extra.tooltip.boxPadding,提示窗边框填充距离,默认3px
+- uCharts.js 提示窗tooltip增加 opts.extra.tooltip.fontSize,提示窗字体大小配置,默认13px
+- uCharts.js 提示窗tooltip增加 opts.extra.tooltip.lineHeight,提示窗文字行高,默认20px
+- uCharts.js 提示窗tooltip增加 opts.extra.tooltip.legendShow,是否显示左侧图例,默认true
+- uCharts.js 提示窗tooltip增加 opts.extra.tooltip.legendShape,图例形状,图例标识样式,有效值为 auto自动跟随图例, diamond◆, circle●, triangle▲, square■, rect▬, line-
+- uCharts.js 标记线markLine增加 opts.extra.markLine.labelFontSize,字体大小配置,默认13px
+- uCharts.js 标记线markLine增加 opts.extra.markLine.labelPadding,标签边框内填充距离,默认6px
+- uCharts.js 折线图line增加 opts.extra.line.linearType,渐变色类型,可选值 none关闭渐变色,custom 自定义渐变色。使用自定义渐变色时请赋值serie.linearColor作为颜色值
+- uCharts.js 折线图line增加 serie.linearColor,渐变色数组,格式为2维数组[起始位置,颜色值],例如[[0,'#0EE2F8'],[0.3,'#2BDCA8'],[0.6,'#1890FF'],[1,'#9A60B4']]
+- uCharts.js 折线图line增加 opts.extra.line.onShadow,是否开启折线阴影,开启后请赋值serie.setShadow阴影设置
+- uCharts.js 折线图line增加 serie.setShadow,阴影配置,格式为4位数组:[offsetX,offsetY,blur,color]
+- uCharts.js 折线图line增加 opts.extra.line.animation,动画效果方向,可选值为vertical 垂直动画效果,horizontal 水平动画效果
+- uCharts.js X轴xAxis增加 opts.xAxis.lineHeight,X轴字体行高,默认20px
+- uCharts.js X轴xAxis增加 opts.xAxis.marginTop,X轴文字距离轴线的距离,默认0px
+- uCharts.js X轴xAxis增加 opts.xAxis.title,当前X轴标题
+- uCharts.js X轴xAxis增加 opts.xAxis.titleFontSize,标题字体大小,默认13px
+- uCharts.js X轴xAxis增加 opts.xAxis.titleOffsetY,标题纵向偏移距离,负数为向上偏移,正数向下偏移
+- uCharts.js X轴xAxis增加 opts.xAxis.titleOffsetX,标题横向偏移距离,负数为向左偏移,正数向右偏移
+- uCharts.js X轴xAxis增加 opts.xAxis.titleFontColor,标题字体颜色,默认#666666
+
+## 报错TypeError: Cannot read properties of undefined (reading 'length')
+- 如果是uni-modules版本组件,请先登录HBuilderX账号;
+- 在HBuilderX中的manifest.json,点击重新获取uniapp的appid,或者删除appid重新粘贴,重新运行;
+- 如果是cli项目请使用码云上的非uniCloud版本组件;
+- 或者添加uniCloud的依赖;
+- 或者使用原生uCharts;
+## 2.4.5-20221130(2022-11-30)
+- uCharts.js 优化tooltip当文字很多变为左侧显示时,如果画布仍显显示不下,提示框错位置变为以左侧0位置起画
+- uCharts.js 折线图修复特殊情况下只有单点数据,并改变线宽后点变为圆形的bug
+- uCharts.js 修复Y轴disabled启用后无效并报错的bug
+- uCharts.js 修复仪表盘起始结束角度特殊情况下显示不正确的bug
+- uCharts.js 雷达图新增参数 opts.extra.radar.radius , 自定义雷达图半径
+- uCharts.js 折线图、区域图增加tooltip指示点,opts.extra.line.activeType/opts.extra.area.activeType,可选值"none"不启用激活指示点,"hollow"空心点模式,"solid"实心点模式
+## 2.4.4-20221102(2022-11-02)
+- 秋云图表组件 修复使用echarts时reload、reshow无法调用重新渲染的bug,[详见码云PR](https://gitee.com/uCharts/uCharts/pulls/40)
+- 秋云图表组件 修复使用echarts时,初始化时宽高不正确的bug,[详见码云PR](https://gitee.com/uCharts/uCharts/pulls/42)
+- 秋云图表组件 修复uniapp的h5使用history模式时,无法加载echarts的bug
+- 秋云图表组件 小程序端@complete、@scrollLeft、@scrollRight、@getTouchStart、@getTouchMove、@getTouchEnd事件增加opts参数传出,方便一些特殊需求的交互获取数据。
+
+- uCharts.js 修复calTooltipYAxisData方法内formatter格式化方法未与y轴方法同步的问题,[详见码云PR](https://gitee.com/uCharts/uCharts/pulls/43)
+- uCharts.js 地图新增参数opts.series[i].fillOpacity,以透明度方式来设置颜色过度效果,[详见码云PR](https://gitee.com/uCharts/uCharts/pulls/38)
+- uCharts.js 地图新增参数opts.extra.map.active,是否启用点击激活变色
+- uCharts.js 地图新增参数opts.extra.map.activeTextColor,是否启用点击激活变色
+- uCharts.js 地图新增渲染完成事件renderComplete
+- uCharts.js 漏斗图修复当部分数据相同时tooltip提示窗点击错误的bug
+- uCharts.js 漏斗图新增参数series.data[i].centerText 居中标签文案
+- uCharts.js 漏斗图新增参数series.data[i].centerTextSize 居中标签文案字体大小,默认opts.fontSize
+- uCharts.js 漏斗图新增参数series.data[i].centerTextColor 居中标签文案字体颜色,默认#FFFFFF
+- uCharts.js 漏斗图新增参数opts.extra.funnel.minSize 最小值的最小宽度,默认0
+- uCharts.js 进度条新增参数opts.extra.arcbar.direction,动画方向,可选值为cw顺时针、ccw逆时针
+- uCharts.js 混合图新增参数opts.extra.mix.line.width,折线的宽度,默认2
+- uCharts.js 修复tooltip开启horizentalLine水平横线标注时,图表显示错位的bug
+- uCharts.js 优化tooltip当文字很多变为左侧显示时,如果画布仍显显示不下,提示框错位置变为以左侧0位置起画
+- uCharts.js 修复开启滚动条后X轴文字超出绘图区域后的隐藏逻辑
+- uCharts.js 柱状图、条状图修复堆叠模式不能通过{value,color}赋值单个柱子颜色的问题
+- uCharts.js 气泡图修复不识别series.textSize和series.textColor的bug
+
+## 报错TypeError: Cannot read properties of undefined (reading 'length')
+1. 如果是uni-modules版本组件,请先登录HBuilderX账号;
+2. 在HBuilderX中的manifest.json,点击重新获取uniapp的appid,或者删除appid重新粘贴,重新运行;
+3. 如果是cli项目请使用码云上的非uniCloud版本组件;
+4. 或者添加uniCloud的依赖;
+5. 或者使用原生uCharts;
+## 2.4.3-20220505(2022-05-05)
+- 秋云图表组件 修复开启canvas2d后将series赋值为空数组显示加载图标时,再次赋值后画布闪动的bug
+- 秋云图表组件 修复升级hbx最新版后ECharts的highlight方法报错的bug
+- uCharts.js 雷达图新增参数opts.extra.radar.gridEval,数据点位网格抽希,默认1
+- uCharts.js 雷达图新增参数opts.extra.radar.axisLabel,	是否显示刻度点值,默认false
+- uCharts.js 雷达图新增参数opts.extra.radar.axisLabelTofix,刻度点值小数位数,默认0
+- uCharts.js 雷达图新增参数opts.extra.radar.labelPointShow,是否显示末端刻度圆点,默认false
+- uCharts.js 雷达图新增参数opts.extra.radar.labelPointRadius,刻度圆点的半径,默认3
+- uCharts.js 雷达图新增参数opts.extra.radar.labelPointColor,刻度圆点的颜色,默认#cccccc
+- uCharts.js 雷达图新增参数opts.extra.radar.linearType,渐变色类型,可选值"none"关闭渐变,"custom"开启渐变
+- uCharts.js 雷达图新增参数opts.extra.radar.customColor,自定义渐变颜色,数组类型对应series的数组长度以匹配不同series颜色的不同配色方案,例如["#FA7D8D", "#EB88E2"]
+- uCharts.js 雷达图优化支持series.textColor、series.textSize属性
+- uCharts.js 柱状图中温度计式图标,优化支持全圆角类型,修复边框有缝隙的bug,详见官网【演示】中的温度计图表
+- uCharts.js 柱状图新增参数opts.extra.column.activeWidth,当前点击柱状图的背景宽度,默认一个单元格单位
+- uCharts.js 混合图增加opts.extra.mix.area.gradient 区域图是否开启渐变色
+- uCharts.js 混合图增加opts.extra.mix.area.opacity 区域图透明度,默认0.2
+- uCharts.js 饼图、圆环图、玫瑰图、漏斗图,增加opts.series[0].data[i].labelText,自定义标签文字,避免formatter格式化的繁琐,详见官网【演示】中的饼图
+- uCharts.js 饼图、圆环图、玫瑰图、漏斗图,增加opts.series[0].data[i].labelShow,自定义是否显示某一个指示标签,避免因饼图类别太多导致标签重复或者居多导致图形变形的问题,详见官网【演示】中的饼图
+- uCharts.js 增加opts.series[i].legendText/opts.series[0].data[i].legendText(与series.name同级)自定义图例显示文字的方法
+- uCharts.js 优化X轴、Y轴formatter格式化方法增加形参,统一为fromatter:function(value,index,opts){}
+- uCharts.js 修复横屏模式下无法使用双指缩放方法的bug
+- uCharts.js 修复当只有一条数据或者多条数据值相等的时候Y轴自动计算的最大值错误的bug
+- 【官网模板】增加外部自定义图例与图表交互的例子,[点击跳转](https://www.ucharts.cn/v2/#/layout/info?id=2)
+
+## 注意:非unimodules 版本如因更新 hbx 至 3.4.7 导致报错如下,请到码云更新非 unimodules 版本组件,[点击跳转](https://gitee.com/uCharts/uCharts/tree/master/uni-app/uCharts-%E7%BB%84%E4%BB%B6)
+> Error in callback for immediate watcher "uchartsOpts": "SyntaxError: Unexpected token u in JSON at position 0"
+## 2.4.2-20220421(2022-04-21)
+- 秋云图表组件 修复HBX升级3.4.6.20220420版本后echarts报错的问题
+## 2.4.2-20220420(2022-04-20)
+## 重要!此版本uCharts新增了很多功能,修复了诸多已知问题
+- 秋云图表组件 新增onzoom开启双指缩放功能(仅uCharts),前提需要直角坐标系类图表类型,并且ontouch为true、opts.enableScroll为true,详见实例项目K线图
+- 秋云图表组件 新增optsWatch是否监听opts变化,关闭optsWatch后,动态修改opts不会触发图表重绘
+- 秋云图表组件 修复开启canvas2d功能后,动态更新数据后画布闪动的bug
+- 秋云图表组件 去除directory属性,改为自动获取echarts.min.js路径(升级不受影响)
+- 秋云图表组件 增加getImage()方法及@getImage事件,通过ref调用getImage()方法获,触发@getImage事件获取当前画布的base64图片文件流。
+- 秋云图表组件 支付宝、字节跳动、飞书、快手小程序支持开启canvas2d同层渲染设置。
+- 秋云图表组件 新增加【非uniCloud】版本组件,避免有些不需要uniCloud的使用组件发布至小程序需要提交隐私声明问题,请到码云[【非uniCloud版本】](https://gitee.com/uCharts/uCharts/tree/master/uni-app/uCharts-%E7%BB%84%E4%BB%B6),或npm[【非uniCloud版本】](https://www.npmjs.com/package/@qiun/uni-ucharts)下载使用。
+- uCharts.js 新增dobuleZoom双指缩放功能
+- uCharts.js 新增山峰图type="mount",数据格式为饼图类格式,不需要传入categories,具体详见新版官网在线演示
+- uCharts.js 修复折线图当数据中存在null时tooltip报错的bug
+- uCharts.js 修复饼图类当画布比较小时自动计算的半径是负数报错的bug
+- uCharts.js 统一各图表类型的series.formatter格式化方法的形参为(val, index, series, opts),方便格式化时有更多参数可用
+- uCharts.js 标记线功能增加labelText自定义显示文字,增加labelAlign标签显示位置(左侧或右侧),增加标签显示位置微调labelOffsetX、labelOffsetY
+- uCharts.js 修复条状图当数值很小时开启圆角后样式错误的bug
+- uCharts.js 修复X轴开启disabled后,X轴仍占用空间的bug
+- uCharts.js 修复X轴开启滚动条并且开启rotateLabel后,X轴文字与滚动条重叠的bug
+- uCharts.js 增加X轴rotateAngle文字旋转自定义角度,取值范围(-90至90)
+- uCharts.js 修复地图文字标签层级显示不正确的bug
+- uCharts.js 修复饼图、圆环图、玫瑰图当数据全部为0的时候不显示数据标签的bug
+- uCharts.js 修复当opts.padding上边距为0时,Y轴顶部刻度标签位置不正确的bug
+
+## 另外我们还开发了各大原生小程序组件,已发布至码云和npm
+[https://gitee.com/uCharts/uCharts](https://gitee.com/uCharts/uCharts)
+[https://www.npmjs.com/~qiun](https://www.npmjs.com/~qiun)
+
+## 对于原生uCharts文档我们已上线新版官方网站,详情点击下面链接进入官网
+[https://www.uCharts.cn/v2/](https://www.ucharts.cn/v2/)
+## 2.3.7-20220122(2022-01-22)
+## 重要!使用vue3编译,请使用cli模式并升级至最新依赖,HbuilderX编译需要使用3.3.8以上版本
+- uCharts.js 修复uni-app平台组件模式使用vue3编译到小程序报错的bug。
+## 2.3.7-20220118(2022-01-18)
+## 注意,使用vue3的前提是需要3.3.8.20220114-alpha版本的HBuilder!
+## 2.3.67-20220118(2022-01-18)
+- 秋云图表组件 组件初步支持vue3,全端编译会有些问题,具体详见下面修改:
+1. 小程序端运行时,在uni_modules文件夹的qiun-data-charts.js中搜索 new uni_modules_qiunDataCharts_js_sdk_uCharts_uCharts.uCharts,将.uCharts去掉。
+2. 小程序端发行时,在uni_modules文件夹的qiun-data-charts.js中搜索 new e.uCharts,将.uCharts去掉,变为 new e。
+3. 如果觉得上述步骤比较麻烦,如果您的项目只编译到小程序端,可以修改u-charts.js最后一行导出方式,将 export default uCharts;变更为 export default { uCharts: uCharts }; 这样变更后,H5和App端的renderjs会有问题,请开发者自行选择。(此问题非组件问题,请等待DC官方修复Vue3的小程序端)
+## 2.3.6-20220111(2022-01-11)
+- 秋云图表组件 修改组件 props 属性中的 background 默认值为 rgba(0,0,0,0)
+## 2.3.6-20211201(2021-12-01)
+- uCharts.js 修复bar条状图开启圆角模式时,值很小时圆角渲染错误的bug
+## 2.3.5-20211014(2021-10-15)
+- uCharts.js 增加vue3的编译支持(仅原生uCharts,qiun-data-charts组件后续会支持,请关注更新)
+## 2.3.4-20211012(2021-10-12)
+- 秋云图表组件 修复 mac os x 系统 mouseover 事件丢失的 bug
+## 2.3.3-20210706(2021-07-06)
+- uCharts.js 增加雷达图开启数据点值(opts.dataLabel)的显示
+## 2.3.2-20210627(2021-06-27)
+- 秋云图表组件 修复tooltipCustom个别情况下传值不正确报错TypeError: Cannot read property 'name' of undefined的bug
+## 2.3.1-20210616(2021-06-16)
+- uCharts.js 修复圆角柱状图使用4角圆角时,当数值过大时不正确的bug
+## 2.3.0-20210612(2021-06-12)
+- uCharts.js 【重要】uCharts增加nvue兼容,可在nvue项目中使用gcanvas组件渲染uCharts,[详见码云uCharts-demo-nvue](https://gitee.com/uCharts/uCharts)
+- 秋云图表组件 增加tapLegend属性,是否开启图例点击交互事件
+- 秋云图表组件 getIndex事件中增加返回uCharts实例中的opts参数,以便在页面中调用参数
+- 示例项目 pages/other/other.vue增加app端自定义tooltip的方法,详见showOptsTooltip方法
+## 2.2.1-20210603(2021-06-03)
+- uCharts.js 修复饼图、圆环图、玫瑰图,当起始角度不为0时,tooltip位置不准确的bug
+- uCharts.js 增加温度计式柱状图开启顶部半圆形的配置
+## 2.2.0-20210529(2021-05-29)
+- uCharts.js 增加条状图type="bar"
+- 示例项目 pages/ucharts/ucharts.vue增加条状图的demo
+## 2.1.7-20210524(2021-05-24)
+- uCharts.js 修复大数据量模式下曲线图不平滑的bug
+## 2.1.6-20210523(2021-05-23)
+- 秋云图表组件 修复小程序端开启滚动条更新数据后滚动条位置不符合预期的bug
+## 2.1.5-2021051702(2021-05-17)
+- uCharts.js 修复自定义Y轴min和max值为0时不能正确显示的bug
+## 2.1.5-20210517(2021-05-17)
+- uCharts.js 修复Y轴自定义min和max时,未按指定的最大值最小值显示坐标轴刻度的bug
+## 2.1.4-20210516(2021-05-16)
+- 秋云图表组件 优化onWindowResize防抖方法
+- 秋云图表组件 修复APP端uCharts更新数据时,清空series显示loading图标后再显示图表,图表抖动的bug
+- uCharts.js 修复开启canvas2d后,x轴、y轴、series自定义字体大小未按比例缩放的bug
+- 示例项目 修复format-e.vue拼写错误导致app端使用uCharts渲染图表
+## 2.1.3-20210513(2021-05-13)
+- 秋云图表组件 修改uCharts变更chartData数据为updateData方法,支持带滚动条的数据动态打点
+- 秋云图表组件 增加onWindowResize防抖方法 fix by ど誓言,如尘般染指流年づ 
+- 秋云图表组件 H5或者APP变更chartData数据显示loading图表时,原数据闪现的bug
+- 秋云图表组件 props增加errorReload禁用错误点击重新加载的方法
+- uCharts.js 增加tooltip显示category(x轴对应点位)标题的功能,opts.extra.tooltip.showCategory,默认为false
+- uCharts.js 修复mix混合图只有柱状图时,tooltip的分割线显示位置不正确的bug
+- uCharts.js 修复开启滚动条,图表在拖动中动态打点,滚动条位置不正确的bug
+- uCharts.js 修复饼图类数据格式为echarts数据格式,series为空数组报错的bug
+- 示例项目 修改uCharts.js更新到v2.1.2版本后,@getIndex方法获取索引值变更为e.currentIndex.index
+- 示例项目 pages/updata/updata.vue增加滚动条拖动更新(数据动态打点)的demo
+- 示例项目 pages/other/other.vue增加errorReload禁用错误点击重新加载的demo
+## 2.1.2-20210509(2021-05-09)
+秋云图表组件 修复APP端初始化时就传入chartData或lacaldata不显示图表的bug
+## 2.1.1-20210509(2021-05-09)
+- 秋云图表组件 变更ECharts的eopts配置在renderjs内执行,支持在config-echarts.js配置文件内写function配置。
+- 秋云图表组件 修复APP端报错Prop being mutated: "onmouse"错误的bug。
+- 秋云图表组件 修复APP端报错Error: Not Found:Page[6][-1,27] at view.umd.min.js:1的bug。
+## 2.1.0-20210507(2021-05-07)
+- 秋云图表组件 修复初始化时就有数据或者数据更新的时候loading加载动画闪动的bug
+- uCharts.js 修复x轴format方法categories为字符串类型时返回NaN的bug
+- uCharts.js 修复series.textColor、legend.fontColor未执行全局默认颜色的bug
+## 2.1.0-20210506(2021-05-06)
+- 秋云图表组件 修复极个别情况下报错item.properties undefined的bug
+- 秋云图表组件 修复极个别情况下关闭加载动画reshow不起作用,无法显示图表的bug
+- 示例项目 pages/ucharts/ucharts.vue 增加时间轴折线图(type="tline")、时间轴区域图(type="tarea")、散点图(type="scatter")、气泡图demo(type="bubble")、倒三角形漏斗图(opts.extra.funnel.type="triangle")、金字塔形漏斗图(opts.extra.funnel.type="pyramid")
+- 示例项目 pages/format-u/format-u.vue 增加X轴format格式化示例
+- uCharts.js 升级至v2.1.0版本
+- uCharts.js 修复 玫瑰图面积模式点击tooltip位置不正确的bug
+- uCharts.js 修复 玫瑰图点击图例,只剩一个类别显示空白的bug
+- uCharts.js 修复 饼图类图点击图例,其他图表tooltip位置某些情况下不准的bug
+- uCharts.js 修复 x轴为矢量轴(时间轴)情况下,点击tooltip位置不正确的bug
+- uCharts.js 修复 词云图获取点击索引偶尔不准的bug
+- uCharts.js 增加 直角坐标系图表X轴format格式化方法(原生uCharts.js用法请使用formatter)
+- uCharts.js 增加 漏斗图扩展配置,倒三角形(opts.extra.funnel.type="triangle"),金字塔形(opts.extra.funnel.type="pyramid")
+- uCharts.js 增加 散点图(opts.type="scatter")、气泡图(opts.type="bubble")
+- 后期计划 完善散点图、气泡图,增加markPoints标记点,增加横向条状图。
+## 2.0.0-20210502(2021-05-02)
+- uCharts.js 修复词云图获取点击索引不正确的bug
+## 2.0.0-20210501(2021-05-01)
+- 秋云图表组件 修复QQ小程序、百度小程序在关闭动画效果情况下,v-for循环使用图表,显示不正确的bug
+## 2.0.0-20210426(2021-04-26)
+- 秋云图表组件 修复QQ小程序不支持canvas2d的bug
+- 秋云图表组件 修复钉钉小程序某些情况点击坐标计算错误的bug
+- uCharts.js 增加 extra.column.categoryGap 参数,柱状图类每个category点位(X轴点)柱子组之间的间距
+- uCharts.js 增加 yAxis.data[i].titleOffsetY 参数,标题纵向偏移距离,负数为向上偏移,正数向下偏移
+- uCharts.js 增加 yAxis.data[i].titleOffsetX 参数,标题横向偏移距离,负数为向左偏移,正数向右偏移
+- uCharts.js 增加 extra.gauge.labelOffset 参数,仪表盘标签文字径向便宜距离,默认13px
+## 2.0.0-20210422-2(2021-04-22)
+秋云图表组件 修复 formatterAssign 未判断 args[key] == null 的情况导致栈溢出的 bug
+## 2.0.0-20210422(2021-04-22)
+- 秋云图表组件 修复H5、APP、支付宝小程序、微信小程序canvas2d模式下横屏模式的bug
+## 2.0.0-20210421(2021-04-21)
+- uCharts.js 修复多行图例的情况下,图例在上方或者下方时,图例float为左侧或者右侧时,第二行及以后的图例对齐方式不正确的bug
+## 2.0.0-20210420(2021-04-20)
+- 秋云图表组件 修复微信小程序开启canvas2d模式后,windows版微信小程序不支持canvas2d模式的bug
+- 秋云图表组件 修改非uni_modules版本为v2.0版本qiun-data-charts组件
+## 2.0.0-20210419(2021-04-19)
+## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。
+## 初次使用如果提示未注册&lt;qiun-data-charts&gt;组件,请重启HBuilderX,如仍不好用,请重启电脑;
+## 如果是cli项目,请尝试清理node_modules,重新install,还不行就删除项目,再重新install。
+## 此问题已于DCloud官方确认,HBuilderX下个版本会修复。
+## 其他图表不显示问题详见[常见问题选项卡](https://demo.ucharts.cn)
+## <font color=#FF0000> 新手请先完整阅读帮助文档及常见问题3遍,右侧蓝色按钮示例项目请看2遍! </font> 
+## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn)
+## [图表组件在项目中的应用参见 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) 
+- uCharts.js 修复混合图中柱状图单独设置颜色不生效的bug
+- uCharts.js 修复多Y轴单独设置fontSize时,开启canvas2d后,未对应放大字体的bug
+## 2.0.0-20210418(2021-04-18)
+- 秋云图表组件 增加directory配置,修复H5端history模式下如果发布到二级目录无法正确加载echarts.min.js的bug
+## 2.0.0-20210416(2021-04-16)
+## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。
+## 初次使用如果提示未注册&lt;qiun-data-charts&gt;组件,请重启HBuilderX,如仍不好用,请重启电脑;
+## 如果是cli项目,请尝试清理node_modules,重新install,还不行就删除项目,再重新install。
+## 此问题已于DCloud官方确认,HBuilderX下个版本会修复。
+## 其他图表不显示问题详见[常见问题选项卡](https://demo.ucharts.cn)
+## <font color=#FF0000> 新手请先完整阅读帮助文档及常见问题3遍,右侧蓝色按钮示例项目请看2遍! </font> 
+## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn)
+## [图表组件在项目中的应用参见 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) 
+- 秋云图表组件 修复APP端某些情况下报错`Not Found Page`的bug,fix by 高级bug开发技术员
+- 示例项目 修复APP端v-for循环某些情况下报错`Not Found Page`的bug,fix by 高级bug开发技术员
+- uCharts.js 修复非直角坐标系tooltip提示窗右侧超出未变换方向显示的bug
+## 2.0.0-20210415(2021-04-15)
+- 秋云图表组件 修复H5端发布到二级目录下echarts无法加载的bug
+- 秋云图表组件 修复某些情况下echarts.off('finished')移除监听事件报错的bug
+## 2.0.0-20210414(2021-04-14)
+## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。
+## 初次使用如果提示未注册&lt;qiun-data-charts&gt;组件,请重启HBuilderX,如仍不好用,请重启电脑;
+## 如果是cli项目,请尝试清理node_modules,重新install,还不行就删除项目,再重新install。
+## 此问题已于DCloud官方确认,HBuilderX下个版本会修复。
+## 其他图表不显示问题详见[常见问题选项卡](https://demo.ucharts.cn)
+## <font color=#FF0000> 新手请先完整阅读帮助文档及常见问题3遍,右侧蓝色按钮示例项目请看2遍! </font> 
+## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn)
+## [图表组件在项目中的应用参见 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) 
+- 秋云图表组件 修复H5端在cli项目下ECharts引用地址错误的bug
+- 示例项目 增加ECharts的formatter用法的示例(详见示例项目format-e.vue)
+- uCharts.js 增加圆环图中心背景色的配置extra.ring.centerColor
+- uCharts.js 修复微信小程序安卓端柱状图开启透明色后显示不正确的bug
+## 2.0.0-20210413(2021-04-13)
+- 秋云图表组件 修复百度小程序多个图表真机未能正确获取根元素dom尺寸的bug
+- 秋云图表组件 修复百度小程序横屏模式方向不正确的bug
+- 秋云图表组件 修改ontouch时,@getTouchStart@getTouchMove@getTouchEnd的触发条件
+- uCharts.js 修复饼图类数据格式series属性不生效的bug
+- uCharts.js 增加时序区域图 详见示例项目中ucharts.vue
+## 2.0.0-20210412-2(2021-04-12)
+## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。
+## 初次使用如果提示未注册&lt;qiun-data-charts&gt;组件,请重启HBuilderX。如仍不好用,请重启电脑,此问题已于DCloud官方确认,HBuilderX下个版本会修复。
+## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn)
+## [图表组件在uniCloudAdmin中的应用 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) 
+- 秋云图表组件 修复uCharts在APP端横屏模式下不能正确渲染的bug
+- 示例项目 增加ECharts柱状图渐变色、圆角柱状图、横向柱状图(条状图)的示例
+## 2.0.0-20210412(2021-04-12)
+- 秋云图表组件 修复created中判断echarts导致APP端无法识别,改回mounted中判断echarts初始化
+- uCharts.js 修复2d模式下series.textOffset未乘像素比的bug
+## 2.0.0-20210411(2021-04-11)
+## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧绿色【使用HBuilderX导入插件】即可使用,示例项目请点击右侧蓝色按钮【使用HBuilderX导入示例项目】。
+## 初次使用如果提示未注册<qiun-data-charts>组件,请重启HBuilderX,并清空小程序开发者工具缓存。
+## [DEMO演示及在线生成工具(v2.0文档)https://demo.ucharts.cn](https://demo.ucharts.cn)
+## [图表组件在uniCloudAdmin中的应用 UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) 
+- uCharts.js 折线图区域图增加connectNulls断点续连的功能,详见示例项目中ucharts.vue
+- 秋云图表组件 变更初始化方法为created,变更type2d默认值为true,优化2d模式下组件初始化后dom获取不到的bug
+- 秋云图表组件 修复左右布局时,右侧图表点击坐标错误的bug,修复tooltip柱状图自定义颜色显示object的bug
+## 2.0.0-20210410(2021-04-10)
+- 修复左右布局时,右侧图表点击坐标错误的bug,修复柱状图自定义颜色tooltip显示object的bug
+- 增加标记线及柱状图自定义颜色的demo
+## 2.0.0-20210409(2021-04-08)
+## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧【使用HBuilderX导入插件】即可体验,DEMO演示及在线生成工具(v2.0文档)[https://demo.ucharts.cn](https://demo.ucharts.cn)
+## 图表组件在uniCloudAdmin中的应用 [UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) 
+- uCharts.js 修复钉钉小程序百度小程序measureText不准确的bug,修复2d模式下饼图类activeRadius为按比例放大的bug
+- 修复组件在支付宝小程序端点击位置不准确的bug
+## 2.0.0-20210408(2021-04-07)
+- 修复组件在支付宝小程序端不能显示的bug(目前支付宝小程不能点击交互,后续修复)
+- uCharts.js 修复高分屏下柱状图类,圆弧进度条 自定义宽度不能按比例放大的bug
+## 2.0.0-20210407(2021-04-06)
+## v1.0版本已停更,建议转uni_modules版本组件方式调用,点击右侧【使用HBuilderX导入插件】即可体验,DEMO演示及在线生成工具(v2.0文档)[https://demo.ucharts.cn](https://demo.ucharts.cn)
+## 增加 通过tofix和unit快速格式化y轴的demo add by `howcode`
+## 增加 图表组件在uniCloudAdmin中的应用 [UReport数据报表](https://ext.dcloud.net.cn/plugin?id=4651) 
+## 2.0.0-20210406(2021-04-05)
+# 秋云图表组件+uCharts v2.0版本同步上线,使用方法详见https://demo.ucharts.cn帮助页
+## 2.0.0(2021-04-05)
+# 秋云图表组件+uCharts v2.0版本同步上线,使用方法详见https://demo.ucharts.cn帮助页

+ 1618 - 0
property_ui/uni_modules/qiun-data-charts/components/qiun-data-charts/qiun-data-charts.vue

@@ -0,0 +1,1618 @@
+<!-- 
+ * qiun-data-charts 秋云高性能跨全端图表组件
+ * Copyright (c) 2021 QIUN® 秋云 https://www.ucharts.cn All rights reserved.
+ * Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
+ * 复制使用请保留本段注释,感谢支持开源!
+ * 为方便更多开发者使用,如有更好的建议请提交码云 Pull Requests !
+ *
+ * uCharts®官方网站
+ * https://www.uCharts.cn
+ * 
+ * 开源地址:
+ * https://gitee.com/uCharts/uCharts
+ * 
+ * uni-app插件市场地址:
+ * http://ext.dcloud.net.cn/plugin?id=271
+ * 
+ -->
+<template>
+  <view class="chartsview" :id="'ChartBoxId'+cid">
+    <view v-if="mixinDatacomLoading">
+      <!-- 自定义加载状态,请改这里 -->
+      <qiun-loading :loadingType="loadingType" />
+    </view>
+    <view v-if="mixinDatacomErrorMessage && errorShow" @tap="reloading">
+      <!-- 自定义错误提示,请改这里 -->
+      <qiun-error :errorMessage="errorMessage" />
+    </view>
+    <!-- APP和H5采用renderjs渲染图表 -->
+    <!-- #ifdef APP-VUE || H5 -->
+    <block v-if="echarts">
+      <view
+        :style="{ background: background }"
+        style="width: 100%;height: 100%;"
+        :data-directory="directory"
+        :id="'EC'+cid" 
+        :prop="echartsOpts" 
+        :change:prop="rdcharts.ecinit" 
+        :resize="echartsResize"
+        :change:resize="rdcharts.ecresize"
+        v-show="showchart"
+      />
+    </block>
+    <block v-else>
+      <view
+        v-on:tap="rdcharts.tap"
+        v-on:mousemove="rdcharts.mouseMove"
+        v-on:mousedown="rdcharts.mouseDown"
+        v-on:mouseup="rdcharts.mouseUp"
+        v-on:touchstart="rdcharts.touchStart"
+        v-on:touchmove="rdcharts.touchMove"
+        v-on:touchend="rdcharts.touchEnd"
+        :id="'UC'+cid"
+        :prop="uchartsOpts"
+        :change:prop="rdcharts.ucinit"
+      >
+        <canvas
+          :id="cid"
+          :canvasId="cid"
+          :style="{ width: cWidth + 'px', height: cHeight + 'px', background: background }"
+          :disable-scroll="disableScroll"
+          @error="_error"
+          v-show="showchart"
+        />
+      </view>
+    </block>
+    <!-- #endif -->
+    <!-- 支付宝小程序 -->
+    <!-- #ifdef MP-ALIPAY -->
+    <block v-if="ontouch">
+      <canvas
+        :id="cid"
+        :canvasId="cid"
+        :width="cWidth * pixel"
+        :height="cHeight * pixel"
+        :style="{ width: cWidth + 'px', height: cHeight + 'px', background: background }"
+        :disable-scroll="disScroll"
+        @tap="_tap"
+        @touchstart="_touchStart"
+        @touchmove="_touchMove"
+        @touchend="_touchEnd"
+        @error="_error"
+        v-show="showchart"
+      />
+    </block>
+    <block v-if="!ontouch">
+      <canvas
+        :id="cid"
+        :canvasId="cid"
+        :width="cWidth * pixel"
+        :height="cHeight * pixel"
+        :style="{ width: cWidth + 'px', height: cHeight + 'px', background: background }"
+        :disable-scroll="disScroll"
+        @tap="_tap"
+        @error="_error"
+        v-show="showchart"
+      />
+    </block>
+    <!-- #endif -->
+    <!-- 其他小程序通过vue渲染图表 -->
+    <!-- #ifdef MP-WEIXIN || MP-BAIDU || MP-QQ || MP-TOUTIAO || MP-KUAISHOU || MP-LARK || MP-JD || MP-360 -->
+    <block v-if="type2d">
+      <view v-if="ontouch" @tap="_tap">
+        <canvas
+          :id="cid"
+          :canvasId="cid"
+          :style="{ width: cWidth + 'px', height: cHeight + 'px', background: background }"
+          type="2d"
+          :disable-scroll="disScroll"
+          @touchstart="_touchStart"
+          @touchmove="_touchMove"
+          @touchend="_touchEnd"
+          @error="_error"
+          v-show="showchart"
+        />
+      </view>
+      <view v-if="!ontouch" @tap="_tap">
+        <canvas
+          :id="cid"
+          :canvasId="cid"
+          :style="{ width: cWidth + 'px', height: cHeight + 'px', background: background }"
+          type="2d"
+          :disable-scroll="disScroll"
+          @error="_error"
+          v-show="showchart"
+        />
+      </view>
+    </block>
+    <block v-if="!type2d">
+      <view v-if="ontouch" @tap="_tap">
+        <canvas
+          :id="cid"
+          :canvasId="cid"
+          :style="{ width: cWidth + 'px', height: cHeight + 'px', background: background }"
+          @touchstart="_touchStart"
+          @touchmove="_touchMove"
+          @touchend="_touchEnd"
+          :disable-scroll="disScroll"
+          @error="_error"
+          v-if="showchart"
+        />
+      </view>
+      <view v-if="!ontouch" >
+        <canvas
+          :id="cid"
+          :canvasId="cid"
+          :style="{ width: cWidth + 'px', height: cHeight + 'px', background: background }"
+          :disable-scroll="disScroll"
+          @tap="_tap"
+          @error="_error"
+          v-if="showchart"
+        />
+      </view>
+    </block>
+    <!-- #endif -->
+  </view>
+</template>
+
+<script>
+import uCharts from '../../js_sdk/u-charts/u-charts.js';
+import cfu from '../../js_sdk/u-charts/config-ucharts.js';
+// #ifdef APP-VUE || H5
+import cfe from '../../js_sdk/u-charts/config-echarts.js';
+// #endif
+
+function deepCloneAssign(origin = {}, ...args) {
+  for (let i in args) {
+    for (let key in args[i]) {
+      if (args[i].hasOwnProperty(key)) {
+        origin[key] = args[i][key] && typeof args[i][key] === 'object' ? deepCloneAssign(Array.isArray(args[i][key]) ? [] : {}, origin[key], args[i][key]) : args[i][key];
+      }
+    }
+  }
+  return origin;
+}
+
+function formatterAssign(args,formatter) {
+  for (let key in args) {
+    if(args.hasOwnProperty(key) && args[key] !== null && typeof args[key] === 'object'){
+      formatterAssign(args[key],formatter)
+    }else if(key === 'format' && typeof args[key] === 'string'){
+      args['formatter'] = formatter[args[key]] ? formatter[args[key]] : undefined;
+    }
+  }
+  return args;
+}
+
+// 时间转换函数,为了匹配uniClinetDB读取出的时间与categories不同
+function getFormatDate(date) {
+	var seperator = "-";
+	var year = date.getFullYear();
+	var month = date.getMonth() + 1;
+	var strDate = date.getDate();
+	if (month >= 1 && month <= 9) {
+			month = "0" + month;
+	}
+	if (strDate >= 0 && strDate <= 9) {
+			strDate = "0" + strDate;
+	}
+	var currentdate = year + seperator + month + seperator + strDate;
+	return currentdate;
+}
+
+var lastMoveTime = null;
+/**
+ * 防抖
+ *
+ * @param { Function } fn 要执行的方法
+ * @param { Number } wait  防抖多少毫秒
+ *
+ * 在 vue 中使用(注意:不能使用箭头函数,否则this指向不对,并且不能再次封装如:
+ * move(){  // 错误调用方式
+ *   debounce(function () {
+ *   console.log(this.title);
+ * }, 1000)});
+ * 应该直接使用:// 正确调用方式
+ * move: debounce(function () {
+ *   console.log(this.title);
+ * }, 1000)
+ */
+function debounce(fn, wait) {
+  let timer = false;
+  return function() {
+    clearTimeout(timer);
+    timer && clearTimeout(timer);
+    timer = setTimeout(() => {
+      timer = false;
+      fn.apply(this, arguments); // 把参数传进去
+    }, wait);
+  };
+}
+
+export default {
+  name: 'qiun-data-charts',
+  mixins: [uniCloud.mixinDatacom],
+  props: {
+    type: {
+      type: String,
+      default: null
+    },
+    canvasId: {
+      type: String,
+      default: 'uchartsid'
+    },
+    canvas2d: {
+      type: Boolean,
+      default: false
+    },
+    background: {
+      type: String,
+      default: 'rgba(0,0,0,0)'
+    },
+    animation: {
+      type: Boolean,
+      default: true
+    },
+    chartData: {
+      type: Object,
+      default() {
+        return {
+          categories: [],
+          series: []
+        };
+      }
+    },
+    opts: {
+      type: Object,
+      default() {
+        return {};
+      }
+    },
+    eopts: {
+      type: Object,
+      default() {
+        return {};
+      }
+    },
+    loadingType: {
+      type: Number,
+      default: 2
+    },
+    errorShow: {
+      type: Boolean,
+      default: true
+    },
+    errorReload: {
+      type: Boolean,
+      default: true
+    },
+    errorMessage: {
+      type: String,
+      default: null
+    },
+    inScrollView: {
+      type: Boolean,
+      default: false
+    },
+    reshow: {
+      type: Boolean,
+      default: false
+    },
+    reload: {
+      type: Boolean,
+      default: false
+    },
+    disableScroll: {
+      type: Boolean,
+      default: false
+    },
+    optsWatch: {
+      type: Boolean,
+      default: true
+    },
+    onzoom: {
+      type: Boolean,
+      default: false
+    },
+    ontap: {
+      type: Boolean,
+      default: true
+    },
+    ontouch: {
+      type: Boolean,
+      default: false
+    },
+    onmouse: {
+      type: Boolean,
+      default: true
+    },
+    onmovetip: {
+      type: Boolean,
+      default: false
+    },
+    echartsH5: {
+      type: Boolean,
+      default: false
+    },
+    echartsApp: {
+      type: Boolean,
+      default: false
+    },
+    tooltipShow: {
+      type: Boolean,
+      default: true
+    },
+    tooltipFormat: {
+      type: String,
+      default: undefined
+    },
+    tooltipCustom: {
+      type: Object,
+      default: undefined
+    },
+    startDate: {
+      type: String,
+      default: undefined
+    },
+    endDate: {
+      type: String,
+      default: undefined
+    },
+    textEnum: {
+      type: Array,
+      default () {
+        return []
+      }
+    },
+    groupEnum: {
+      type: Array,
+      default () {
+        return []
+      }
+    },
+    pageScrollTop: {
+      type: Number,
+      default: 0
+    },
+    directory: {
+      type: String,
+      default: '/'
+    },
+    tapLegend: {
+      type: Boolean,
+      default: true
+    },
+    menus: {
+      type: Array,
+      default () {
+        return []
+      }
+    }
+  },
+  data() {
+    return {
+      cid: 'uchartsid',
+      inWx: false,
+      inAli: false,
+      inTt: false,
+      inBd: false,
+      inH5: false,
+      inApp: false,
+      inWin: false,
+      type2d: true,
+      disScroll: false,
+      openmouse: false,
+      pixel: 1,
+      cWidth: 375,
+      cHeight: 250,
+      showchart: false,
+      echarts: false,
+      echartsResize:{
+        state:false
+      },
+      uchartsOpts: {},
+      echartsOpts: {},
+      drawData:{},
+      lastDrawTime:null,
+    };
+  },
+  created(){
+    this.cid = this.canvasId
+    if (this.canvasId == 'uchartsid' || this.canvasId == '') {
+      let t = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
+      let len = t.length
+      let id = ''
+      for (let i = 0; i < 32; i++) {
+        id += t.charAt(Math.floor(Math.random() * len))
+      }
+      this.cid = id
+    }
+    const systemInfo = uni.getSystemInfoSync()
+    if(systemInfo.platform === 'windows' || systemInfo.platform === 'mac'){
+      this.inWin = true;
+    }
+    // #ifdef MP-WEIXIN
+    this.inWx = true;
+    if (this.canvas2d === false || systemInfo.platform === 'windows' || systemInfo.platform === 'mac') {
+      this.type2d = false;
+    }else{
+      this.type2d = true;
+      this.pixel = systemInfo.pixelRatio;
+    }
+    // #endif
+    //非微信小程序端强制关闭canvas2d模式
+    // #ifndef MP-WEIXIN
+    this.type2d = false;
+    // #endif
+    // #ifdef  MP-TOUTIAO || MP-LARK || MP-ALIPAY
+    this.type2d = this.canvas2d;
+    // #endif
+    // #ifdef MP-ALIPAY
+    this.inAli = true;
+    this.pixel = systemInfo.pixelRatio;
+    // #endif
+    // #ifdef MP-BAIDU
+    this.inBd = true;
+    // #endif
+    // #ifdef MP-TOUTIAO
+    this.inTt = true;
+    // #endif
+    this.disScroll = this.disableScroll;
+  },
+  mounted() {
+    // #ifdef APP-VUE
+    this.inApp = true;
+    if (this.echartsApp === true) {
+      this.echarts = true;
+      this.openmouse = false;
+    }
+    // #endif
+    // #ifdef APP-NVUE
+    this.inApp = true;
+    this.mixinDatacomLoading = false
+    this.mixinDatacomErrorMessage = "暂不支持NVUE"
+    // #endif
+    // #ifdef H5
+    this.inH5 = true;
+    if(this.inWin === true){
+      this.openmouse = this.onmouse;
+    }
+    if (this.echartsH5 === true) {
+      this.echarts = true;
+    }
+    // #endif
+    this.$nextTick(()=>{
+      this.beforeInit();
+    })
+    // #ifndef MP-ALIPAY || MP-BAIDU || MP-TOUTIAO || APP-VUE
+    const time = this.inH5 ? 500 : 200;
+    const _this = this;
+    uni.onWindowResize(
+      debounce(function(res) {
+        if (_this.mixinDatacomLoading == true) {
+          return;
+        }
+        let errmsg = _this.mixinDatacomErrorMessage;
+        if (errmsg !== null && errmsg !== 'null' && errmsg !== '') {
+          return;
+        }
+        if (_this.echarts) {
+          _this.echartsResize.state = !_this.echartsResize.state;
+        } else {
+          _this.resizeHandler();
+        }
+      }, time)
+    );
+    // #endif
+  },
+  destroyed(){
+    if(this.echarts === true){
+      delete cfe.option[this.cid]
+      delete cfe.instance[this.cid]
+    }else{
+      delete cfu.option[this.cid]
+      delete cfu.instance[this.cid]
+    }
+    // #ifndef MP-ALIPAY || MP-BAIDU || MP-TOUTIAO
+    uni.offWindowResize(()=>{})
+    // #endif
+  },
+  watch: {
+    chartDataProps: {
+      handler(val, oldval) {
+        if (typeof val === 'object') {
+          if (JSON.stringify(val) !== JSON.stringify(oldval)) {
+            this._clearChart();
+            if (val.series && val.series.length > 0) {
+              this.beforeInit();
+            }else{
+              this.mixinDatacomLoading = true;
+              this.showchart = false;
+              this.mixinDatacomErrorMessage = null;
+            }
+          }
+        } else {
+          this.mixinDatacomLoading = false;
+          this._clearChart();
+          this.showchart = false;
+          this.mixinDatacomErrorMessage = '参数错误:chartData数据类型错误';
+        }
+      },
+      immediate: false,
+      deep: true
+    },
+    localdata:{
+      handler(val, oldval) {
+        if (JSON.stringify(val) !== JSON.stringify(oldval)) {
+          if (val.length > 0) {
+            this.beforeInit();
+          }else{
+            this.mixinDatacomLoading = true;
+            this._clearChart();
+            this.showchart = false;
+            this.mixinDatacomErrorMessage = null;
+          }
+        }
+      },
+      immediate: false,
+      deep: true
+    },
+    optsProps: {
+      handler(val, oldval) {
+        if (typeof val === 'object') {
+          if (JSON.stringify(val) !== JSON.stringify(oldval) && this.echarts === false && this.optsWatch == true) {
+            this.checkData(this.drawData);
+          }
+        } else {
+          this.mixinDatacomLoading = false;
+          this._clearChart();
+          this.showchart = false;
+          this.mixinDatacomErrorMessage = '参数错误:opts数据类型错误';
+        }
+      },
+      immediate: false,
+      deep: true
+    },
+    eoptsProps: {
+      handler(val, oldval) {
+        if (typeof val === 'object') {
+          if (JSON.stringify(val) !== JSON.stringify(oldval) && this.echarts === true) {
+            this.checkData(this.drawData);
+          }
+        } else {
+          this.mixinDatacomLoading = false;
+          this.showchart = false;
+          this.mixinDatacomErrorMessage = '参数错误:eopts数据类型错误';
+        }
+      },
+      immediate: false,
+      deep: true
+    },
+    reshow(val, oldval) {
+      if (val === true && this.mixinDatacomLoading === false) {
+        setTimeout(() => {
+          this.mixinDatacomErrorMessage = null;
+          this.echartsResize.state = !this.echartsResize.state;
+          this.checkData(this.drawData);
+        }, 200);
+      }
+    },
+    reload(val, oldval) {
+      if (val === true) {
+        this.showchart = false;
+        this.mixinDatacomErrorMessage = null;
+        this.reloading();
+      }
+    },
+    mixinDatacomErrorMessage(val, oldval) {
+      if (val) {
+        this.emitMsg({name: 'error', params: {type:"error", errorShow: this.errorShow, msg: val, id: this.cid}});
+        if(this.errorShow){
+          console.log('[秋云图表组件]' + val);
+        }
+      }
+    },
+    errorMessage(val, oldval) {
+      if (val && this.errorShow && val !== null && val !== 'null' && val !== '') {
+        this.showchart = false;
+        this.mixinDatacomLoading = false;
+        this.mixinDatacomErrorMessage = val;
+      } else {
+        this.showchart = false;
+        this.mixinDatacomErrorMessage = null;
+        this.reloading();
+      }
+    }
+  },
+  computed: {
+    optsProps() {
+      return JSON.parse(JSON.stringify(this.opts));
+    },
+    eoptsProps() {
+      return JSON.parse(JSON.stringify(this.eopts));
+    },
+    chartDataProps() {
+      return JSON.parse(JSON.stringify(this.chartData));
+    },
+  },
+  methods: {
+    beforeInit(){
+      this.mixinDatacomErrorMessage = null;
+      if (typeof this.chartData === 'object' && this.chartData != null && this.chartData.series !== undefined && this.chartData.series.length > 0) {
+        //拷贝一下chartData,为了opts变更后统一数据来源
+        this.drawData = deepCloneAssign({}, this.chartData);
+        this.mixinDatacomLoading = false;
+        this.showchart = true;
+        this.checkData(this.chartData);
+      }else if(this.localdata.length>0){
+        this.mixinDatacomLoading = false;
+        this.showchart = true;
+        this.localdataInit(this.localdata);
+      }else if(this.collection !== ''){
+        this.mixinDatacomLoading = false;
+        this.getCloudData();
+      }else{
+        this.mixinDatacomLoading = true;
+      }
+    },
+    localdataInit(resdata){
+      //替换enum类型为正确的描述
+      if(this.groupEnum.length>0){
+        for (let i = 0; i < resdata.length; i++) {
+          for (let j = 0; j < this.groupEnum.length; j++) {
+            if(resdata[i].group === this.groupEnum[j].value){
+              resdata[i].group = this.groupEnum[j].text
+            }
+          }
+        }
+      }
+      if(this.textEnum.length>0){
+        for (let i = 0; i < resdata.length; i++) {
+          for (let j = 0; j < this.textEnum.length; j++) {
+            if(resdata[i].text === this.textEnum[j].value){
+              resdata[i].text = this.textEnum[j].text
+            }
+          }
+        }
+      }
+      let needCategories = false;
+      let tmpData = {categories:[], series:[]}
+      let tmpcategories = []
+      let tmpseries = [];
+      //拼接categories
+      if(this.echarts === true){
+        needCategories = cfe.categories.includes(this.type)
+      }else{
+        needCategories = cfu.categories.includes(this.type)
+      }
+      if(needCategories === true){
+        //如果props中的chartData带有categories,则优先使用chartData的categories
+        if(this.chartData && this.chartData.categories && this.chartData.categories.length>0){
+          tmpcategories = this.chartData.categories
+        }else{
+          //如果是日期类型的数据,不管是本地数据还是云数据,都按起止日期自动拼接categories
+          if(this.startDate && this.endDate){
+            let idate = new Date(this.startDate)
+            let edate = new Date(this.endDate)
+            while (idate <= edate) {
+            	tmpcategories.push(getFormatDate(idate))
+            	idate = idate.setDate(idate.getDate() + 1)
+            	idate = new Date(idate)
+            }
+          //否则从结果中去重并拼接categories
+          }else{
+            let tempckey = {};
+            resdata.map(function(item, index) {
+              if (item.text != undefined && !tempckey[item.text]) {
+                tmpcategories.push(item.text)
+                tempckey[item.text] = true
+              }
+            });
+          }
+        }
+        tmpData.categories = tmpcategories
+      }
+      //拼接series
+      let tempskey = {};
+      resdata.map(function(item, index) {
+        if (item.group != undefined && !tempskey[item.group]) {
+          tmpseries.push({ name: item.group, data: [] });
+          tempskey[item.group] = true;
+        }
+      });
+      //如果没有获取到分组名称(可能是带categories的数据,也可能是不带的饼图类)
+      if (tmpseries.length == 0) {
+        tmpseries = [{ name: '默认分组', data: [] }];
+        //如果是需要categories的图表类型
+        if(needCategories === true){
+          for (let j = 0; j < tmpcategories.length; j++) {
+            let seriesdata = 0;
+            for (let i = 0; i < resdata.length; i++) {
+              if (resdata[i].text == tmpcategories[j]) {
+                seriesdata = resdata[i].value;
+              }
+            }
+            tmpseries[0].data.push(seriesdata);
+          }
+        //如果是饼图类的图表类型
+        }else{
+          for (let i = 0; i < resdata.length; i++) {
+            tmpseries[0].data.push({"name": resdata[i].text,"value": resdata[i].value});
+          }
+        }
+      //如果有分组名
+      } else {
+        for (let k = 0; k < tmpseries.length; k++) {
+          //如果有categories
+          if (tmpcategories.length > 0) {
+            for (let j = 0; j < tmpcategories.length; j++) {
+              let seriesdata = 0;
+              for (let i = 0; i < resdata.length; i++) {
+                if (tmpseries[k].name == resdata[i].group && resdata[i].text == tmpcategories[j]) {
+                  seriesdata = resdata[i].value;
+                }
+              }
+              tmpseries[k].data.push(seriesdata);
+            }
+          //如果传了group而没有传text,即没有categories(正常情况下这种数据是不符合数据要求规范的)
+          } else {
+            for (let i = 0; i < resdata.length; i++) {
+              if (tmpseries[k].name == resdata[i].group) {
+                tmpseries[k].data.push(resdata[i].value);
+              }
+            }
+          }
+        }
+      }
+      tmpData.series = tmpseries
+      //拷贝一下chartData,为了opts变更后统一数据来源
+      this.drawData = deepCloneAssign({}, tmpData);
+      this.checkData(tmpData)
+    },
+    reloading() {
+      if(this.errorReload === false){
+        return;
+      }
+      this.showchart = false;
+      this.mixinDatacomErrorMessage = null;
+      if (this.collection !== '') {
+        this.mixinDatacomLoading = false;
+        this.onMixinDatacomPropsChange(true);
+      } else {
+        this.beforeInit();
+      }
+    },
+    checkData(anyData) {
+      let cid = this.cid
+      //复位opts或eopts
+      if(this.echarts === true){
+        cfe.option[cid] = deepCloneAssign({}, this.eopts);
+        cfe.option[cid].id = cid;
+        cfe.option[cid].type = this.type;
+      }else{
+        if (this.type && cfu.type.includes(this.type)) {
+          cfu.option[cid] = deepCloneAssign({}, cfu[this.type], this.opts);
+          cfu.option[cid].canvasId = cid;
+        } else {
+          this.mixinDatacomLoading = false;
+          this.showchart = false;
+          this.mixinDatacomErrorMessage = '参数错误:props参数中type类型不正确';
+        }
+      }
+      //挂载categories和series
+      let newData = deepCloneAssign({}, anyData);
+      if (newData.series !== undefined && newData.series.length > 0) {
+        this.mixinDatacomErrorMessage = null;
+        if (this.echarts === true) {
+          cfe.option[cid].chartData = newData;
+          this.$nextTick(()=>{
+            this.init()
+          })
+        }else{
+          cfu.option[cid].categories = newData.categories;
+          cfu.option[cid].series = newData.series;
+          this.$nextTick(()=>{
+            this.init()
+          })
+        }
+      }
+    },
+    resizeHandler() {
+      //渲染防抖
+      let currTime = Date.now();
+      let lastDrawTime = this.lastDrawTime?this.lastDrawTime:currTime-3000;
+      let duration = currTime - lastDrawTime;
+      if (duration < 1000) return;
+      let chartdom = uni
+        .createSelectorQuery()
+        // #ifndef MP-ALIPAY
+        .in(this)
+        // #endif
+        .select('#ChartBoxId'+this.cid)
+        .boundingClientRect(data => {
+          this.showchart = true;
+          if (data.width > 0 && data.height > 0) {
+            if (data.width !== this.cWidth || data.height !== this.cHeight) {
+              this.checkData(this.drawData)
+            }
+          }
+        })
+        .exec();
+    },
+    getCloudData() {
+      if (this.mixinDatacomLoading == true) {
+        return;
+      }
+      this.mixinDatacomLoading = true;
+      this.mixinDatacomGet()
+        .then(res => {
+          this.mixinDatacomResData = res.result.data;
+          this.localdataInit(this.mixinDatacomResData);
+        })
+        .catch(err => {
+          this.mixinDatacomLoading = false;
+          this.showchart = false;
+          this.mixinDatacomErrorMessage = '请求错误:' + err;
+        });
+    },
+    onMixinDatacomPropsChange(needReset, changed) {
+      if (needReset == true && this.collection !== '') {
+        this.showchart = false;
+        this.mixinDatacomErrorMessage = null;
+        this._clearChart();
+        this.getCloudData();
+      }
+    },
+    _clearChart() {
+      let cid = this.cid
+      if (this.echarts !== true && cfu.option[cid] && cfu.option[cid].context) {
+        const ctx = cfu.option[cid].context;
+        if(typeof ctx === "object" && !!!cfu.option[cid].update){
+          ctx.clearRect(0, 0, this.cWidth*this.pixel, this.cHeight*this.pixel);
+          ctx.draw();
+        }
+      }
+    },
+    init() {
+      let cid = this.cid
+      let chartdom = uni
+        .createSelectorQuery()
+        // #ifndef MP-ALIPAY
+        .in(this)
+        // #endif
+        .select('#ChartBoxId'+cid)
+        .boundingClientRect(data => {
+          if (data.width > 0 && data.height > 0) {
+            this.mixinDatacomLoading = false;
+            this.showchart = true;
+            this.lastDrawTime = Date.now();
+            this.cWidth = data.width;
+            this.cHeight = data.height;
+            if(this.echarts !== true){
+              cfu.option[cid].background = this.background == 'rgba(0,0,0,0)' ? '#FFFFFF' : this.background;
+              cfu.option[cid].canvas2d = this.type2d;
+              cfu.option[cid].pixelRatio = this.pixel;
+              cfu.option[cid].animation = this.animation;
+              cfu.option[cid].width = data.width * this.pixel;
+              cfu.option[cid].height = data.height * this.pixel;
+              cfu.option[cid].onzoom = this.onzoom;
+              cfu.option[cid].ontap = this.ontap;
+              cfu.option[cid].ontouch = this.ontouch;
+              cfu.option[cid].onmouse = this.openmouse;
+              cfu.option[cid].onmovetip = this.onmovetip;
+              cfu.option[cid].tooltipShow = this.tooltipShow;
+              cfu.option[cid].tooltipFormat = this.tooltipFormat;
+              cfu.option[cid].tooltipCustom = this.tooltipCustom;
+              cfu.option[cid].inScrollView = this.inScrollView;
+              cfu.option[cid].lastDrawTime = this.lastDrawTime;
+              cfu.option[cid].tapLegend = this.tapLegend;
+            }
+            //如果是H5或者App端,采用renderjs渲染图表
+            if (this.inH5 || this.inApp) {
+              if (this.echarts == true) {
+                cfe.option[cid].ontap = this.ontap;
+                cfe.option[cid].onmouse = this.openmouse;
+                cfe.option[cid].tooltipShow = this.tooltipShow;
+                cfe.option[cid].tooltipFormat = this.tooltipFormat;
+                cfe.option[cid].tooltipCustom = this.tooltipCustom;
+                cfe.option[cid].lastDrawTime = this.lastDrawTime;
+                this.echartsOpts = deepCloneAssign({}, cfe.option[cid]);
+              } else {
+                cfu.option[cid].rotateLock = cfu.option[cid].rotate;
+                this.uchartsOpts = deepCloneAssign({}, cfu.option[cid]);
+              }
+            //如果是小程序端,采用uCharts渲染
+            } else {
+              cfu.option[cid] = formatterAssign(cfu.option[cid],cfu.formatter)
+              this.mixinDatacomErrorMessage = null;
+              this.mixinDatacomLoading = false;
+              this.showchart = true;
+              this.$nextTick(()=>{
+                if (this.type2d === true) {
+                  const query = uni.createSelectorQuery().in(this)
+                  query
+                    .select('#' + cid)
+                    .fields({ node: true, size: true })
+                    .exec(res => {
+                      if (res[0]) {
+                        const canvas = res[0].node;
+                        const ctx = canvas.getContext('2d');
+                        cfu.option[cid].context = ctx;
+                        cfu.option[cid].rotateLock = cfu.option[cid].rotate;
+                        if(cfu.instance[cid] && cfu.option[cid] && cfu.option[cid].update === true){
+                          this._updataUChart(cid)
+                        }else{
+                          canvas.width = data.width * this.pixel;
+                          canvas.height = data.height * this.pixel;
+                          canvas._width = data.width * this.pixel;
+                          canvas._height = data.height * this.pixel;
+                          setTimeout(()=>{
+                            cfu.option[cid].context.restore();
+                            cfu.option[cid].context.save();
+                            this._newChart(cid)
+                          },100)
+                        }
+                      } else {
+                        this.showchart = false;
+                        this.mixinDatacomErrorMessage = '参数错误:开启2d模式后,未获取到dom节点,canvas-id:' + cid;
+                      }
+                    });
+                } else {
+                  if(this.inAli){
+                    cfu.option[cid].rotateLock = cfu.option[cid].rotate;
+                  }
+                  cfu.option[cid].context = uni.createCanvasContext(cid, this);
+                  if(cfu.instance[cid] && cfu.option[cid] && cfu.option[cid].update === true){
+                    this._updataUChart(cid)
+                  }else{
+                    setTimeout(()=>{
+                      cfu.option[cid].context.restore();
+                      cfu.option[cid].context.save();
+                      this._newChart(cid)
+                    },100)
+                  }
+                }
+              })
+            }
+          } else {
+            this.mixinDatacomLoading = false;
+            this.showchart = false;
+            if (this.reshow == true) {
+              this.mixinDatacomErrorMessage = '布局错误:未获取到父元素宽高尺寸!canvas-id:' + cid;
+            }
+          }
+        })
+        .exec();
+    },
+    saveImage(){
+    	uni.canvasToTempFilePath({
+    	  canvasId: this.cid,
+    	  success: res=>{
+    	    //#ifdef H5
+    			var a = document.createElement("a");
+    			a.href = res.tempFilePath;
+    			a.download = this.cid;
+    			a.target = '_blank'
+    			a.click();
+    	    //#endif
+    	    //#ifndef H5
+    	      uni.saveImageToPhotosAlbum({
+              filePath: res.tempFilePath,
+              success: function () {
+                uni.showToast({
+                  title: '保存成功',
+                  duration: 2000
+                });
+              }
+    	      });
+    	    //#endif
+    	  } 
+    	},this);
+    },
+    getImage(){
+      if(this.type2d == false){
+        uni.canvasToTempFilePath({
+          canvasId: this.cid,
+          success: res=>{
+            this.emitMsg({name: 'getImage', params: {type:"getImage", base64: res.tempFilePath}});
+          }
+        },this);
+      }else{
+        const query = uni.createSelectorQuery().in(this)
+        query
+          .select('#' + this.cid)
+          .fields({ node: true, size: true })
+          .exec(res => {
+            if (res[0]) {
+              const canvas = res[0].node;
+              this.emitMsg({name: 'getImage', params: {type:"getImage", base64: canvas.toDataURL('image/png')}});
+            }
+          });
+      }
+    },
+    // #ifndef APP-VUE || H5
+    _newChart(cid) {
+      if (this.mixinDatacomLoading == true) {
+        return;
+      }
+      this.showchart = true;
+      cfu.instance[cid] = new uCharts(cfu.option[cid]);
+      cfu.instance[cid].addEventListener('renderComplete', () => {
+        this.emitMsg({name: 'complete', params: {type:"complete", complete: true, id: cid, opts: cfu.instance[cid].opts}});
+        cfu.instance[cid].delEventListener('renderComplete')
+      });
+      cfu.instance[cid].addEventListener('scrollLeft', () => {
+        this.emitMsg({name: 'scrollLeft', params: {type:"scrollLeft", scrollLeft: true, id: cid, opts: cfu.instance[cid].opts}});
+      });
+      cfu.instance[cid].addEventListener('scrollRight', () => {
+        this.emitMsg({name: 'scrollRight', params: {type:"scrollRight", scrollRight: true, id: cid, opts: cfu.instance[cid].opts}});
+      });
+    },
+    _updataUChart(cid) {
+      cfu.instance[cid].updateData(cfu.option[cid])
+    },
+    _tooltipDefault(item, category, index, opts) {
+      if (category) {
+        let data = item.data
+        if(typeof item.data === "object"){
+          data = item.data.value
+        }
+        return category + ' ' + item.name + ':' + data;
+      } else {
+        if (item.properties && item.properties.name) {
+          return item.properties.name;
+        } else {
+          return item.name + ':' + item.data;
+        }
+      }
+    },
+    _showTooltip(e) {
+      let cid = this.cid
+      let tc = cfu.option[cid].tooltipCustom
+      if (tc && tc !== undefined && tc !== null) {
+        let offset = undefined;
+        if (tc.x >= 0 && tc.y >= 0) {
+          offset = { x: tc.x, y: tc.y + 10 };
+        }
+        cfu.instance[cid].showToolTip(e, {
+          index: tc.index,
+          offset: offset,
+          textList: tc.textList,
+          formatter: (item, category, index, opts) => {
+            if (typeof cfu.option[cid].tooltipFormat === 'string' && cfu.formatter[cfu.option[cid].tooltipFormat]) {
+              return cfu.formatter[cfu.option[cid].tooltipFormat](item, category, index, opts);
+            } else {
+              return this._tooltipDefault(item, category, index, opts);
+            }
+          }
+        });
+      } else {
+        cfu.instance[cid].showToolTip(e, {
+          formatter: (item, category, index, opts) => {
+            if (typeof cfu.option[cid].tooltipFormat === 'string' && cfu.formatter[cfu.option[cid].tooltipFormat]) {
+              return cfu.formatter[cfu.option[cid].tooltipFormat](item, category, index, opts);
+            } else {
+              return this._tooltipDefault(item, category, index, opts);
+            }
+          }
+        });
+      }
+    },
+    _tap(e,move) {
+      let cid = this.cid
+      let currentIndex = null;
+      let legendIndex = null;
+      if (this.inScrollView === true || this.inAli) {
+        let chartdom = uni
+          .createSelectorQuery()
+          // #ifndef MP-ALIPAY
+          .in(this)
+          .select('#ChartBoxId'+cid)
+          // #endif
+          // #ifdef MP-ALIPAY
+          .select('#'+this.cid)
+          // #endif
+          .boundingClientRect(data => {
+            e.changedTouches=[];
+            if (this.inAli) {
+              e.changedTouches.unshift({ x: e.detail.clientX - data.left, y: e.detail.clientY - data.top});
+            }else{
+              e.changedTouches.unshift({ x: e.detail.x - data.left, y: e.detail.y - data.top - this.pageScrollTop});
+            }
+            if(move){
+              if (this.tooltipShow === true) {
+                this._showTooltip(e);
+              }
+            }else{
+              currentIndex = cfu.instance[cid].getCurrentDataIndex(e);
+              legendIndex = cfu.instance[cid].getLegendDataIndex(e);
+              if(this.tapLegend === true){
+                cfu.instance[cid].touchLegend(e);
+              }
+              if (this.tooltipShow === true) {
+                this._showTooltip(e);
+              }
+              this.emitMsg({name: 'getIndex', params: { type:"getIndex", event:{ x: e.detail.x - data.left, y: e.detail.y - data.top }, currentIndex: currentIndex, legendIndex: legendIndex, id: cid, opts: cfu.instance[cid].opts}});
+            }
+          })
+          .exec();
+      } else {
+        if(move){
+          if (this.tooltipShow === true) {
+            this._showTooltip(e);
+          }
+        }else{
+          e.changedTouches=[];
+          e.changedTouches.unshift({ x: e.detail.x - e.currentTarget.offsetLeft, y: e.detail.y - e.currentTarget.offsetTop });
+          currentIndex = cfu.instance[cid].getCurrentDataIndex(e);
+          legendIndex = cfu.instance[cid].getLegendDataIndex(e);
+          if(this.tapLegend === true){
+            cfu.instance[cid].touchLegend(e);
+          }
+          if (this.tooltipShow === true) {
+            this._showTooltip(e);
+          }
+          this.emitMsg({name: 'getIndex', params: {type:"getIndex", event:{ x: e.detail.x, y: e.detail.y - e.currentTarget.offsetTop }, currentIndex: currentIndex, legendIndex: legendIndex, id: cid, opts: cfu.instance[cid].opts}});
+        }
+      }
+    },
+    _touchStart(e) {
+      let cid = this.cid
+      lastMoveTime=Date.now();
+      if(cfu.option[cid].enableScroll === true && e.touches.length == 1){
+        cfu.instance[cid].scrollStart(e);
+      }
+      this.emitMsg({name:'getTouchStart', params:{type:"touchStart", event:e.changedTouches[0], id:cid, opts: cfu.instance[cid].opts}});
+    },
+    _touchMove(e) {
+      let cid = this.cid
+      let currMoveTime = Date.now();
+      let duration = currMoveTime - lastMoveTime;
+      let touchMoveLimit = cfu.option[cid].touchMoveLimit || 24;
+      if (duration < Math.floor(1000 / touchMoveLimit)) return;//每秒60帧
+      lastMoveTime = currMoveTime;
+      if(cfu.option[cid].enableScroll === true && e.changedTouches.length == 1){
+        cfu.instance[cid].scroll(e);
+      }
+      if(this.ontap === true && cfu.option[cid].enableScroll === false && this.onmovetip === true){
+        this._tap(e,true)
+      }
+      if(this.ontouch === true && cfu.option[cid].enableScroll === true && this.onzoom === true && e.changedTouches.length == 2){
+        cfu.instance[cid].dobuleZoom(e);
+      }
+      this.emitMsg({name: 'getTouchMove', params: {type:"touchMove", event:e.changedTouches[0], id: cid, opts: cfu.instance[cid].opts}});
+    },
+    _touchEnd(e) {
+      let cid = this.cid
+      if(cfu.option[cid].enableScroll === true && e.touches.length == 0){
+        cfu.instance[cid].scrollEnd(e);
+      }
+      this.emitMsg({name:'getTouchEnd', params:{type:"touchEnd", event:e.changedTouches[0], id:cid, opts: cfu.instance[cid].opts}});
+      if(this.ontap === true && cfu.option[cid].enableScroll === false && this.onmovetip === true){
+        this._tap(e,true)
+      }
+    },
+    // #endif
+    _error(e) {
+      this.mixinDatacomErrorMessage = e.detail.errMsg;
+    },
+    emitMsg(msg) {
+      this.$emit(msg.name, msg.params);
+    },
+    getRenderType() {
+      //防止如果开启echarts且父元素为v-if的情况renderjs监听不到prop变化的问题
+      if(this.echarts===true && this.mixinDatacomLoading===false){
+        this.beforeInit()
+      }
+    },
+    toJSON(){
+      return this
+    }
+  }
+};
+</script>
+
+<!-- #ifdef APP-VUE || H5 -->
+<script module="rdcharts" lang="renderjs">
+import uChartsRD from '../../js_sdk/u-charts/u-charts.js';
+import cfu from '../../js_sdk/u-charts/config-ucharts.js';
+import cfe from '../../js_sdk/u-charts/config-echarts.js';
+
+var that = {};
+var rootdom = null;
+
+function rddeepCloneAssign(origin = {}, ...args) {
+  for (let i in args) {
+    for (let key in args[i]) {
+      if (args[i].hasOwnProperty(key)) {
+        origin[key] = args[i][key] && typeof args[i][key] === 'object' ? rddeepCloneAssign(Array.isArray(args[i][key]) ? [] : {}, origin[key], args[i][key]) : args[i][key];
+      }
+    }
+  }
+  return origin;
+}
+
+function rdformatterAssign(args,formatter) {
+  for (let key in args) {
+    if(args.hasOwnProperty(key) && args[key] !== null && typeof args[key] === 'object'){
+      rdformatterAssign(args[key],formatter)
+    }else if(key === 'format' && typeof args[key] === 'string'){
+      args['formatter'] = formatter[args[key]] ? formatter[args[key]] : undefined;
+    }
+  }
+  return args;
+}
+
+export default {
+  data() {
+    return {
+      rid:null
+    }
+  },
+  mounted() {
+    rootdom = {top:0,left:0}
+    // #ifdef H5
+    let dm = document.querySelectorAll('uni-main')[0]
+    if(dm === undefined){
+      dm = document.querySelectorAll('uni-page-wrapper')[0]
+    }
+    rootdom = {top:dm.offsetTop,left:dm.offsetLeft}
+    // #endif
+    setTimeout(()=>{
+      if(this.rid === null){
+        this.$ownerInstance && this.$ownerInstance.callMethod('getRenderType')
+      }
+    },200)
+  },
+  destroyed(){
+    delete cfu.option[this.rid]
+    delete cfu.instance[this.rid]
+    delete cfe.option[this.rid]
+    delete cfe.instance[this.rid]
+  },
+  methods: {
+    //==============以下是ECharts的方法====================
+    ecinit(newVal, oldVal, owner, instance){
+      let cid = JSON.stringify(newVal.id)
+      this.rid = cid
+      that[cid] = this.$ownerInstance || instance
+      let eopts = JSON.parse(JSON.stringify(newVal))
+      let type = eopts.type;
+      //载入并覆盖默认配置
+      if (type && cfe.type.includes(type)) {
+        cfe.option[cid] = rddeepCloneAssign({}, cfe[type], eopts);
+      }else{
+        cfe.option[cid] = rddeepCloneAssign({}, eopts);
+      }
+      let newData = eopts.chartData;
+      if(newData){
+        //挂载categories和series
+        if(cfe.option[cid].xAxis && cfe.option[cid].xAxis.type && cfe.option[cid].xAxis.type === 'category'){
+          cfe.option[cid].xAxis.data = newData.categories
+        }
+        if(cfe.option[cid].yAxis && cfe.option[cid].yAxis.type && cfe.option[cid].yAxis.type === 'category'){
+          cfe.option[cid].yAxis.data = newData.categories
+        }
+        cfe.option[cid].series = []
+        for (var i = 0; i < newData.series.length; i++) {
+          cfe.option[cid].seriesTemplate = cfe.option[cid].seriesTemplate ? cfe.option[cid].seriesTemplate : {}
+          let Template = rddeepCloneAssign({},cfe.option[cid].seriesTemplate,newData.series[i])
+          cfe.option[cid].series.push(Template)
+        }
+      }
+      
+      if (typeof window.echarts === 'object') {
+          this.newEChart()
+      }else{
+        const script = document.createElement('script')
+        // #ifdef APP-VUE
+        script.src = './uni_modules/qiun-data-charts/static/app-plus/echarts.min.js'
+        // #endif
+        // #ifdef H5
+        const rooturl = window.location.origin
+        const directory = instance.getDataset().directory
+        script.src = rooturl + directory + 'uni_modules/qiun-data-charts/static/h5/echarts.min.js'
+        // #endif
+        script.onload = this.newEChart
+        document.head.appendChild(script)
+      }
+    },
+    ecresize(newVal, oldVal, owner, instance){
+      if(cfe.instance[this.rid]){
+        cfe.instance[this.rid].resize()
+      }
+    },
+    newEChart(){
+      let cid = this.rid
+      if(cfe.instance[cid] === undefined){
+        cfe.instance[cid] = echarts.init(that[cid].$el.children[0])
+        //ontap开启后才触发click事件
+        if(cfe.option[cid].ontap === true){
+          cfe.instance[cid].on('click', resdata => {
+            let event = JSON.parse(JSON.stringify({
+              x:resdata.event.offsetX,y:resdata.event.offsetY
+            }))
+            that[cid].callMethod('emitMsg',{name:"getIndex", params:{type:"getIndex", event:event, currentIndex:resdata.dataIndex, value:resdata.data, seriesName: resdata.seriesName,id:cid}})
+          })
+          // 增加ECharts的highlight消息,实现按下移动返回索引功能。add by onefish 创建于 2021-12-11 09:50
+          cfe.instance[cid].on('highlight', resdata => {
+            that[cid].callMethod('emitMsg',{name:"getHighlight", params:{type:"highlight", res:resdata, id:cid}})
+          })
+        }
+        this.updataEChart(cid,cfe.option[cid])
+      }else{
+        this.updataEChart(cid,cfe.option[cid])
+      }
+    },
+    updataEChart(cid,option){
+      //替换option内format属性为formatter的预定义方法
+      option = rdformatterAssign(option,cfe.formatter)
+      if(option.tooltip){
+        option.tooltip.show = option.tooltipShow?true:false;
+        option.tooltip.position = this.tooltipPosition()
+        //tooltipFormat方法,替换组件的tooltipFormat为config-echarts.js内对应的方法
+        if (typeof option.tooltipFormat === 'string' && cfe.formatter[option.tooltipFormat]) {
+          option.tooltip.formatter = option.tooltip.formatter ? option.tooltip.formatter : cfe.formatter[option.tooltipFormat]
+        }
+      }
+      // 颜色渐变添加的方法
+      if (option.series) {
+      	for (let i in option.series) {
+      		let linearGradient = option.series[i].linearGradient
+      		if (linearGradient) {
+      			option.series[i].color = new echarts.graphic.LinearGradient(linearGradient[0],linearGradient[1],linearGradient[2],linearGradient[3],linearGradient[4])
+      		}
+      	}
+      }
+      cfe.instance[cid].setOption(option, option.notMerge)
+      cfe.instance[cid].on('finished', function(){
+        that[cid].callMethod('emitMsg',{name:"complete",params:{type:"complete",complete:true,id:cid}})
+        if(cfe.instance[cid]){
+          cfe.instance[cid].off('finished')
+        }
+      });
+
+      //修复init初始化实例获取宽高不正确问题
+      if(
+        typeof that[cid].$el.children[0].clientWidth != 'undefined' &&
+          (
+            Math.abs( that[cid].$el.children[0].clientWidth - cfe.instance[cid].getWidth() )>3 ||
+            Math.abs( that[cid].$el.children[0].clientHeight - cfe.instance[cid].getHeight() )>3
+          )
+      ){this.ecresize();}
+    },
+    tooltipPosition(){
+      return (point, params, dom, rect, size) => {
+      	let x = point[0]
+      	let y = point[1]
+      	let viewWidth = size.viewSize[0]
+      	let viewHeight = size.viewSize[1]
+      	let boxWidth = size.contentSize[0]
+      	let boxHeight = size.contentSize[1]
+      	let posX = x + 30 
+      	let posY = y + 30 
+      	if (posX + boxWidth > viewWidth) { 
+      		posX = x - boxWidth - 30
+      	}
+      	if (posY + boxHeight > viewHeight) {
+      		posY = y - boxHeight - 30
+      	}
+      	return [posX, posY]
+      }
+    },
+    //==============以下是uCharts的方法====================
+    ucinit(newVal, oldVal, owner, instance){
+      if(JSON.stringify(newVal) == JSON.stringify(oldVal)){
+        return;
+      }
+      if(!newVal.canvasId){
+        return;
+      }
+      let cid = JSON.parse(JSON.stringify(newVal.canvasId))
+      this.rid = cid
+      that[cid] = this.$ownerInstance || instance
+      cfu.option[cid] = JSON.parse(JSON.stringify(newVal))
+      cfu.option[cid] = rdformatterAssign(cfu.option[cid],cfu.formatter)
+      let canvasdom = document.getElementById(cid)
+      if(canvasdom && canvasdom.children[0]){
+        cfu.option[cid].context = canvasdom.children[0].getContext("2d")
+        if(cfu.instance[cid] && cfu.option[cid] && cfu.option[cid].update === true){
+          this.updataUChart()
+        }else{
+          setTimeout(()=>{
+            cfu.option[cid].context.restore();
+            cfu.option[cid].context.save();
+            this.newUChart()
+          },100)
+        }
+      }
+    },
+    newUChart() {
+      let cid = this.rid
+      cfu.instance[cid] = new uChartsRD(cfu.option[cid])
+      cfu.instance[cid].addEventListener('renderComplete', () => {
+        that[cid].callMethod('emitMsg',{name:"complete",params:{type:"complete",complete:true,id:cid, opts: cfu.instance[cid].opts}})
+        cfu.instance[cid].delEventListener('renderComplete')
+      });
+      cfu.instance[cid].addEventListener('scrollLeft', () => {
+        that[cid].callMethod('emitMsg',{name:"scrollLeft",params:{type:"scrollLeft",scrollLeft:true,id:cid, opts: cfu.instance[cid].opts}})
+      });
+      cfu.instance[cid].addEventListener('scrollRight', () => {
+        that[cid].callMethod('emitMsg',{name:"scrollRight",params:{type:"scrollRight",scrollRight:true,id:cid, opts: cfu.instance[cid].opts}})
+      });
+    },
+    updataUChart() {
+      let cid = this.rid
+      cfu.instance[cid].updateData(cfu.option[cid])
+    },
+    tooltipDefault(item, category, index, opts) {
+      if (category) {
+        let data = item.data
+        if(typeof item.data === "object"){
+          data = item.data.value
+        }
+        return category + ' ' + item.name + ':' + data;
+      } else {
+        if (item.properties && item.properties.name) {
+          return item.properties.name ;
+        } else {
+          return item.name + ':' + item.data;
+        }
+      }
+    },
+    showTooltip(e,cid) {
+      let tc = cfu.option[cid].tooltipCustom
+      if (tc && tc !== undefined && tc !== null) {
+        let offset = undefined;
+        if (tc.x >= 0 && tc.y >= 0) {
+          offset = { x: tc.x, y: tc.y + 10 };
+        }
+        cfu.instance[cid].showToolTip(e, {
+          index: tc.index,
+          offset: offset,
+          textList: tc.textList,
+          formatter: (item, category, index, opts) => {
+            if (typeof cfu.option[cid].tooltipFormat === 'string' && cfu.formatter[cfu.option[cid].tooltipFormat]) {
+              return cfu.formatter[cfu.option[cid].tooltipFormat](item, category, index, opts);
+            } else {
+              return this.tooltipDefault(item, category, index, opts);
+            }
+          }
+        });
+      } else {
+        cfu.instance[cid].showToolTip(e, {
+          formatter: (item, category, index, opts) => {
+            if (typeof cfu.option[cid].tooltipFormat === 'string' && cfu.formatter[cfu.option[cid].tooltipFormat]) {
+              return cfu.formatter[cfu.option[cid].tooltipFormat](item, category, index, opts);
+            } else {
+              return this.tooltipDefault(item, category, index, opts);
+            }
+          }
+        });
+      }
+    },
+    tap(e) {
+      let cid = this.rid
+      let ontap = cfu.option[cid].ontap
+      let tooltipShow = cfu.option[cid].tooltipShow
+      let tapLegend = cfu.option[cid].tapLegend
+      if(ontap == false) return;
+      let currentIndex=null
+      let legendIndex=null
+      let rchartdom = document.getElementById('UC'+cid).getBoundingClientRect()
+      let tmpe = {}
+      if(e.detail.x){//tap或者click的事件
+        tmpe = { x: e.detail.x - rchartdom.left, y:e.detail.y - rchartdom.top + rootdom.top}
+      }else{//mouse的事件
+        tmpe = { x: e.clientX - rchartdom.left, y:e.clientY - rchartdom.top + rootdom.top}
+      }
+      e.changedTouches = [];
+      e.changedTouches.unshift(tmpe)
+      currentIndex=cfu.instance[cid].getCurrentDataIndex(e)
+      legendIndex=cfu.instance[cid].getLegendDataIndex(e)
+      if(tapLegend === true){
+        cfu.instance[cid].touchLegend(e);
+      }
+      if(tooltipShow==true){
+        this.showTooltip(e,cid)
+      }
+      that[cid].callMethod('emitMsg',{name:"getIndex",params:{type:"getIndex",event:tmpe,currentIndex:currentIndex,legendIndex:legendIndex,id:cid, opts: cfu.instance[cid].opts}})
+    },
+    touchStart(e) {
+      let cid = this.rid
+      let ontouch = cfu.option[cid].ontouch
+      if(ontouch == false) return;
+      if(cfu.option[cid].enableScroll === true && e.touches.length == 1){
+        cfu.instance[cid].scrollStart(e);
+      }
+      that[cid].callMethod('emitMsg',{name:"getTouchStart",params:{type:"touchStart",event:e.changedTouches[0],id:cid, opts: cfu.instance[cid].opts}})
+    },
+    touchMove(e) {
+      let cid = this.rid
+      let ontouch = cfu.option[cid].ontouch
+      if(ontouch == false) return;
+      if(cfu.option[cid].enableScroll === true && e.changedTouches.length == 1){
+        cfu.instance[cid].scroll(e);
+      }
+      if(cfu.option[cid].ontap === true && cfu.option[cid].enableScroll === false && cfu.option[cid].onmovetip === true){
+        let rchartdom = document.getElementById('UC'+cid).getBoundingClientRect()
+        let tmpe = { x: e.changedTouches[0].clientX - rchartdom.left, y:e.changedTouches[0].clientY - rchartdom.top + rootdom.top}
+        e.changedTouches.unshift(tmpe)
+        if(cfu.option[cid].tooltipShow === true){
+          this.showTooltip(e,cid)
+        }
+      }
+      if(ontouch === true && cfu.option[cid].enableScroll === true && cfu.option[cid].onzoom === true && e.changedTouches.length == 2){
+        cfu.instance[cid].dobuleZoom(e);
+      }
+      that[cid].callMethod('emitMsg',{name:"getTouchMove",params:{type:"touchMove",event:e.changedTouches[0],id:cid, opts: cfu.instance[cid].opts}})
+    },
+    touchEnd(e) {
+      let cid = this.rid
+      let ontouch = cfu.option[cid].ontouch
+      if(ontouch == false) return;
+      if(cfu.option[cid].enableScroll === true && e.touches.length == 0){
+        cfu.instance[cid].scrollEnd(e);
+      }
+      that[cid].callMethod('emitMsg',{name:"getTouchEnd",params:{type:"touchEnd",event:e.changedTouches[0],id:cid, opts: cfu.instance[cid].opts}})
+    },
+    mouseDown(e) {
+      let cid = this.rid
+      let onmouse = cfu.option[cid].onmouse
+      if(onmouse == false) return;
+      let rchartdom = document.getElementById('UC'+cid).getBoundingClientRect()
+      let tmpe = {}
+      tmpe = { x: e.clientX - rchartdom.left, y:e.clientY - rchartdom.top + rootdom.top}
+      e.changedTouches = [];
+      e.changedTouches.unshift(tmpe)
+      cfu.instance[cid].scrollStart(e)
+      cfu.option[cid].mousedown=true;
+      that[cid].callMethod('emitMsg',{name:"getTouchStart",params:{type:"mouseDown",event:tmpe,id:cid, opts: cfu.instance[cid].opts}})
+    },
+    mouseMove(e) {
+      let cid = this.rid
+      let onmouse = cfu.option[cid].onmouse
+      let tooltipShow = cfu.option[cid].tooltipShow
+      if(onmouse == false) return;
+      let rchartdom = document.getElementById('UC'+cid).getBoundingClientRect()
+      let tmpe = {}
+      tmpe = { x: e.clientX - rchartdom.left, y:e.clientY - rchartdom.top + rootdom.top}
+      e.changedTouches = [];
+      e.changedTouches.unshift(tmpe)
+      if(cfu.option[cid].mousedown){
+        cfu.instance[cid].scroll(e)
+        that[cid].callMethod('emitMsg',{name:"getTouchMove",params:{type:"mouseMove",event:tmpe,id:cid, opts: cfu.instance[cid].opts}})
+      }else if(cfu.instance[cid]){
+        if(tooltipShow==true){
+          this.showTooltip(e,cid)
+        }
+      }
+    },
+    mouseUp(e) {
+      let cid = this.rid
+      let onmouse = cfu.option[cid].onmouse
+      if(onmouse == false) return;
+      let rchartdom = document.getElementById('UC'+cid).getBoundingClientRect()
+      let tmpe = {}
+      tmpe = { x: e.clientX - rchartdom.left, y:e.clientY - rchartdom.top + rootdom.top}
+      e.changedTouches = [];
+      e.changedTouches.unshift(tmpe)
+      cfu.instance[cid].scrollEnd(e)
+      cfu.option[cid].mousedown=false;
+      that[cid].callMethod('emitMsg',{name:"getTouchEnd",params:{type:"mouseUp",event:tmpe,id:cid, opts: cfu.instance[cid].opts}})
+    },
+  }
+}
+</script>
+<!-- #endif -->
+
+<style scoped>
+.chartsview {
+  width: 100%;
+  height: 100%;
+  display: flex;
+  flex: 1;
+  justify-content: center;
+  align-items: center;
+}
+</style>

ファイルの差分が大きいため隠しています
+ 42 - 0
property_ui/uni_modules/qiun-data-charts/components/qiun-error/qiun-error.vue


+ 162 - 0
property_ui/uni_modules/qiun-data-charts/components/qiun-loading/loading1.vue

@@ -0,0 +1,162 @@
+<template>
+	 <view class="container loading1">
+		<view class="shape shape1"></view>
+		<view class="shape shape2"></view>
+		<view class="shape shape3"></view>
+		<view class="shape shape4"></view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'loading1',
+		data() {
+			return {
+				
+			};
+		}
+	}
+</script>
+
+<style scoped="true">
+.container {
+  width: 30px;
+  height: 30px;
+  position: relative;
+}
+.container.loading1 {
+  -webkit-transform: rotate(45deg);
+          transform: rotate(45deg);
+}
+
+.container .shape {
+  position: absolute;
+  width: 10px;
+  height: 10px;
+  border-radius: 1px;
+}
+.container .shape.shape1 {
+  left: 0;
+  background-color: #1890FF;
+}
+.container .shape.shape2 {
+  right: 0;
+  background-color: #91CB74;
+}
+.container .shape.shape3 {
+  bottom: 0;
+  background-color: #FAC858;
+}
+.container .shape.shape4 {
+  bottom: 0;
+  right: 0;
+  background-color: #EE6666;
+}
+
+.loading1 .shape1 {
+  -webkit-animation: animation1shape1 0.5s ease 0s infinite alternate;
+          animation: animation1shape1 0.5s ease 0s infinite alternate;
+}
+
+@-webkit-keyframes animation1shape1 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(16px, 16px);
+            transform: translate(16px, 16px);
+  }
+}
+
+@keyframes animation1shape1 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(16px, 16px);
+            transform: translate(16px, 16px);
+  }
+}
+.loading1 .shape2 {
+  -webkit-animation: animation1shape2 0.5s ease 0s infinite alternate;
+          animation: animation1shape2 0.5s ease 0s infinite alternate;
+}
+
+@-webkit-keyframes animation1shape2 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(-16px, 16px);
+            transform: translate(-16px, 16px);
+  }
+}
+
+@keyframes animation1shape2 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(-16px, 16px);
+            transform: translate(-16px, 16px);
+  }
+}
+.loading1 .shape3 {
+  -webkit-animation: animation1shape3 0.5s ease 0s infinite alternate;
+          animation: animation1shape3 0.5s ease 0s infinite alternate;
+}
+
+@-webkit-keyframes animation1shape3 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(16px, -16px);
+            transform: translate(16px, -16px);
+  }
+}
+
+@keyframes animation1shape3 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(16px, -16px);
+            transform: translate(16px, -16px);
+  }
+}
+.loading1 .shape4 {
+  -webkit-animation: animation1shape4 0.5s ease 0s infinite alternate;
+          animation: animation1shape4 0.5s ease 0s infinite alternate;
+}
+
+@-webkit-keyframes animation1shape4 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(-16px, -16px);
+            transform: translate(-16px, -16px);
+  }
+}
+
+@keyframes animation1shape4 {
+  from {
+    -webkit-transform: translate(0, 0);
+            transform: translate(0, 0);
+  }
+  to {
+    -webkit-transform: translate(-16px, -16px);
+            transform: translate(-16px, -16px);
+  }
+}
+
+
+</style>

この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません