瀏覽代碼

初始化

王晓晨 3 年之前
父節點
當前提交
5516ab0f1e
共有 100 個文件被更改,包括 13272 次插入24443 次删除
  1. 126 115
      App.vue
  2. 0 21
      LICENSE
  3. 0 3
      README.md
  4. 0 262
      common/airport.js
  5. 0 2
      common/bus.js
  6. 0 1204
      common/commonMethod.js
  7. 0 195
      common/commonPageMethod.js
  8. 0 27
      common/css/common.css
  9. 0 179
      common/css/templateCommon.css
  10. 0 398
      common/font/iconfont.css
  11. 0 97
      common/graceChecker.js
  12. 0 352
      common/html-parser.js
  13. 0 90
      common/mixins/concern.js
  14. 0 256
      common/mixins/templateMethod.js
  15. 0 245
      common/permission.js
  16. 0 3
      common/static/crypto-js.min.js
  17. 0 20
      common/static/customicons.css
  18. 二進制
      common/static/customicons.ttf
  19. 0 463
      common/static/im/newIM_init.js
  20. 0 284
      common/static/im/tim-handler.js
  21. 0 1
      common/static/im/tim-wx.js
  22. 0 1
      common/static/json/wow-emoji.json
  23. 0 76
      common/static/lib/intersection-observer.js
  24. 0 10
      common/static/lib/lottie-miniprogram.js
  25. 0 7
      common/static/lib/promisify.js
  26. 0 160
      common/static/lib/report.js
  27. 0 622
      common/static/lib/runtime.js
  28. 0 245
      common/static/templateMethod.js
  29. 0 136
      common/uni-nvue.css
  30. 0 1458
      common/uni.css
  31. 0 73
      common/util.js
  32. 0 181
      components/amap-wx/js/util.js
  33. 0 1
      components/amap-wx/lib/amap-wx.js
  34. 0 156
      components/api-set-tabbar.nvue
  35. 211 0
      components/biaofun-region/biaofun-region.vue
  36. 528 0
      components/bory-datePicker/index.vue
  37. 575 0
      components/charts/blueHorBarChartOne.vue
  38. 485 0
      components/charts/blueHorBarChartThree.vue
  39. 517 0
      components/charts/blueHorBarChartTwo.vue
  40. 352 0
      components/charts/custNewRadoChart.vue
  41. 284 0
      components/charts/custRadarChart.vue
  42. 129 0
      components/charts/customBarChart.vue
  43. 188 0
      components/charts/daskSubCharts/baobeiChart.vue
  44. 188 0
      components/charts/daskSubCharts/chengjiaoChart.vue
  45. 220 0
      components/charts/daskSubCharts/chengjiaoChart2.vue
  46. 188 0
      components/charts/daskSubCharts/daofangChart.vue
  47. 188 0
      components/charts/daskSubCharts/daofangjiluChart.vue
  48. 188 0
      components/charts/daskSubCharts/daofangpingzhengChart.vue
  49. 188 0
      components/charts/daskSubCharts/genjinChart.vue
  50. 188 0
      components/charts/daskSubCharts/huodianChart.vue
  51. 188 0
      components/charts/daskSubCharts/huokeChart.vue
  52. 188 0
      components/charts/daskSubCharts/jieyongpingzhengChart.vue
  53. 188 0
      components/charts/daskSubCharts/jieyongpingzhengChart2.vue
  54. 188 0
      components/charts/daskSubCharts/kehufenpaiChart.vue
  55. 188 0
      components/charts/daskSubCharts/qiangdanChart.vue
  56. 188 0
      components/charts/daskSubCharts/renzhengChart.vue
  57. 190 0
      components/charts/daskSubCharts/renzhengjiluChart.vue
  58. 188 0
      components/charts/daskSubCharts/shibiejieguoChart.vue
  59. 188 0
      components/charts/daskSubCharts/telishenheChart.vue
  60. 188 0
      components/charts/daskSubCharts/yaoyueChart.vue
  61. 358 0
      components/charts/doubleLineChart.vue
  62. 344 0
      components/charts/doubleLineChart2.vue
  63. 231 0
      components/charts/firstAccessPieChart.vue
  64. 226 0
      components/charts/hengxiang.vue
  65. 225 0
      components/charts/homeChartItem.vue
  66. 214 0
      components/charts/mianji.vue
  67. 210 0
      components/charts/totlePrice.vue
  68. 249 0
      components/charts/xingweitongji.vue
  69. 266 0
      components/charts/yipankeChart.vue
  70. 673 0
      components/libs/calendar.js
  71. 0 1
      components/marked/index.js
  72. 0 1573
      components/marked/lib/marked.js
  73. 0 12542
      components/mpvue-citypicker/city-data/area.js
  74. 0 1503
      components/mpvue-citypicker/city-data/city.js
  75. 0 139
      components/mpvue-citypicker/city-data/province.js
  76. 0 230
      components/mpvue-citypicker/mpvueCityPicker.vue
  77. 0 123
      components/mpvue-echarts/src/echarts.vue
  78. 0 73
      components/mpvue-echarts/src/wx-canvas.js
  79. 0 483
      components/mpvue-picker/mpvuePicker.vue
  80. 0 175
      components/mpvueGestureLock/gestureLock.js
  81. 0 138
      components/mpvueGestureLock/index.vue
  82. 0 38
      components/page-foot/page-foot.vue
  83. 0 16
      components/page-head/page-head.vue
  84. 0 66
      components/product.vue
  85. 156 0
      components/subComponents/dmAlterPopView.vue
  86. 284 0
      components/subComponents/dmBaobeiScreenPicker.vue
  87. 112 0
      components/subComponents/dmCalendarPickerView.vue
  88. 92 0
      components/subComponents/dmCalendarView.vue
  89. 159 0
      components/subComponents/dmCheckboxPreView.vue
  90. 223 0
      components/subComponents/dmCheckboxView.vue
  91. 489 0
      components/subComponents/dmChengjiao2Screen.vue
  92. 78 0
      components/subComponents/dmCustLevelDesPicker.vue
  93. 228 0
      components/subComponents/dmDateScreen.vue
  94. 235 0
      components/subComponents/dmDfJyScreenPicker.vue
  95. 139 0
      components/subComponents/dmDfMethod.vue
  96. 118 0
      components/subComponents/dmEditedSuccess.vue
  97. 788 0
      components/subComponents/dmExplainPicker.vue
  98. 104 0
      components/subComponents/dmExportPicker.vue
  99. 446 0
      components/subComponents/dmHexiaoScreenPicker.vue
  100. 0 0
      components/subComponents/dmItemView.vue

+ 126 - 115
App.vue

@@ -1,135 +1,146 @@
 <script>
-	import {
-		mapMutations
-	} from 'vuex'
-	import {
-		version
-	} from './package.json'
-	import checkUpdate from '@/uni_modules/uni-upgrade-center-app/utils/check-update';
-
+	var ekanfang = uni.requireNativePlugin("Ekanfang")
 	export default {
 		onLaunch: function() {
-			// #ifdef H5
-			console.log(
-				`%c hello uniapp %c v${version} `,
-				'background:#35495e ; padding: 1px; border-radius: 3px 0 0 3px;  color: #fff',
-				'background:#007aff ;padding: 1px; border-radius: 0 3px 3px 0;  color: #fff; font-weight: bold;'
-			)
-			// #endif
-			// 线上示例使用
-			// console.log('%c uni-app官方团队诚邀优秀前端工程师加盟,一起打造更卓越的uni-app & uniCloud,欢迎投递简历到 hr2013@dcloud.io', 'color: red');
-			console.log('App Launch');
-			// #ifdef APP-PLUS
-			// App平台检测升级,服务端代码是通过uniCloud的云函数实现的,详情可参考:https://ext.dcloud.net.cn/plugin?id=4542
-			if (plus.runtime.appid !== 'HBuilder') { // 真机运行不需要检查更新,真机运行时appid固定为'HBuilder',这是调试基座的appid
-				checkUpdate()
+			let BASE_URL = "";
+			var env ='';
+			let res = uni.getStorageSync('env')
+			switch(res){
+			   case '1': //dev
+			     BASE_URL = 'http://101.231.166.56:16666' // 开发环境
+				 env = 'dev'
+				  break;
+			   case '2': //test
+			      BASE_URL = 'https://gatewaytest.elab-plus.vip'
+				  env = 'test'
+				  break;
+			   case '3'://test2
+				  BASE_URL = 'http://gatewaytest1.elab-plus.com'
+				  env = 'test2'
+				  break;
+			   case '4'://test3
+				  BASE_URL = 'https://gatewaytest3.skyforestcity.com'
+				  env = 'test3'
+				  break;
+			   case '5'://test4
+				  BASE_URL = 'https://gatewaytest4.skyforestcity.com'
+				  env = 'test4'
+				  break;
+			   case '6'://uat3
+			      BASE_URL = "https://api-uat3.elaber.cn"
+				  env = 'uat3'
+				  break;
+			   case '7': //uat
+			       BASE_URL = "https://api-uat.elaber.cn"
+				   env = 'uat'
+				  break;
+			   case '8':  // 线上 product 
+			   default:
+			       BASE_URL = "https://dm-api.elab-plus.cn"
+				   env = 'production'
+				   break;
+			}
+			this.globalData.BASE_URL = BASE_URL;
+			this.globalData.env = env;
+			
+			let plat = uni.getSystemInfoSync().platform;
+			this.globalData.platform = plat
+			// // console.log('App Launch')
+			// #ifdef APP-VUE
+			var self = this
+			
+			let userInfo = uni.getStorageSync('userInfo');//获得保存在本地的用户信息
+			if(userInfo){//有数据,已登录
+				let roleMenulList = userInfo.roleMenuList
+				this.reloadMeunStatus(roleMenulList);
+			}else{
+				//不存在则跳转登录页
+				uni.reLaunch({
+					url: "/pages/loginPage/index",
+					success: () => {
+						//跳转完页面后再关闭启动页
+						plus.navigator.closeSplashscreen();
+					}
+				})
 			}
-
-			// 一键登录预登陆,可以显著提高登录速度
-			uni.preLogin({
-				provider: 'univerify',
-				success: (res) => {
-					// 成功
-					this.setUniverifyErrorMsg();
-					console.log("preLogin success: ", res);
-				},
-				fail: (res) => {
-					this.setUniverifyLogin(false);
-					this.setUniverifyErrorMsg(res.errMsg);
-					// 失败
-					console.log("preLogin fail res: ", res);
-				}
-			})
 			// #endif
+           
 		},
 		onShow: function() {
-			console.log('App Show')
+			// console.log("App onshow")
+			document.body.style.setProperty("background-color",this.globalData.backgorundThemeColor)
 		},
 		onHide: function() {
-			console.log('App Hide')
-		},
-		globalData: {
-			test: ''
+			// console.log('App Hide')
 		},
 		methods: {
-			...mapMutations(['setUniverifyErrorMsg', 'setUniverifyLogin'])
+			
+			reloadMeunStatus(roleMenulList) {
+				var self = this
+				if(roleMenulList.length>0){
+				  let menuCode = roleMenulList[0].menuCode
+				  if (menuCode == 100){
+					plus.navigator.closeSplashscreen();
+				  }else if (menuCode == 200) {
+					plus.navigator.closeSplashscreen();
+					uni.reLaunch({
+						url:'./pages/loginsuccess/loginSuccess',
+					})
+				  } else if (menuCode == 300) {
+					plus.navigator.closeSplashscreen();
+					uni.reLaunch({
+						url:'./pages/mine/mine',
+					})
+				  }
+				}
+			},
+			getThemeInfo() {
+				// console.log("调用了")
+				let self = this;
+				uni.getStorage({ //获得保存在本地的用户信息
+					key: 'userInfo',
+					success: (res) => {
+						if (res.data) {
+							//存在则关闭启动页进入首页
+							if (res.data.hasOwnProperty('theme') && null != res.data.theme) {
+								let theme = JSON.parse(res.data.theme);
+								self.globalData.themeColor = theme.themeColor;
+								self.globalData.fuzhuColor = theme.fuzhuColor;
+								self.globalData.fuzhuColor15 = theme.fuzhuColor15;
+								self.globalData.themeColor50 = theme.themeColor50;
+								self.globalData.themeColor25 = theme.themeColor25;
+								self.globalData.fuzhuColor50 = theme.fuzhuColor50;
+								self.globalData.backgorundThemeColor = theme.backgorundThemeColor
+							}
+							self.globalData.token = res.data.token;
+						}
+					},
+				});
+
+			}
+		},
+		globalData: {
+			token: "",
+			themeColor: "#3CD9D9",
+			fuzhuColor: "#FEC350",
+			fuzhuColor15: "#FFF6E5",
+			themeColor50: "#9DECEC",
+			themeColor25: "#CEF6F6",
+			fuzhuColor50: "#FEE1A7",
+			backgorundThemeColor:"#F1F5F9",
+			unReadNumTotal:0,
+			BASE_URL:"https://dm-api.elab-plus.cn",//默认环境
 		}
 	}
 </script>
 
 <style>
-	/* #ifndef APP-PLUS-NVUE */
-	/* uni.css - 通用组件、模板样式库,可以当作一套ui库应用 */
-	@import './common/uni.css';
-	@import '@/static/customicons.css';
-	/* H5 兼容 pc 所需 */
-	/* #ifdef H5 */
-	@media screen and (min-width: 768px) {
-		body {
-			overflow-y: scroll;
-		}
-	}
-
-	/* 顶栏通栏样式 */
-	/* .uni-top-window {
-	    left: 0;
-	    right: 0;
-	} */
-
-	uni-page-body {
-		background-color: #F5F5F5 !important;
-		min-height: 100% !important;
-		height: auto !important;
-	}
-
-	.uni-top-window uni-tabbar .uni-tabbar {
-		background-color: #fff !important;
-	}
-
-	.uni-app--showleftwindow .hideOnPc {
-		display: none !important;
-	}
-
-	/* #endif */
-
-	/* 以下样式用于 hello uni-app 演示所需 */
+	/*每个页面公共css */
+	/* #ifndef APP-NVUE */
+	@import url("./static/font/iconfont.css");
 	page {
-		background-color: #efeff4;
-		height: 100%;
-		font-size: 28rpx;
-		/* line-height: 1.8; */
-	}
-
-	.fix-pc-padding {
-		padding: 0 50px;
+		background-color: #F4F7F7;
 	}
 
-	.uni-header-logo {
-		padding: 30rpx;
-		flex-direction: column;
-		justify-content: center;
-		align-items: center;
-		margin-top: 10rpx;
-	}
-
-	.uni-header-image {
-		width: 100px;
-		height: 100px;
-	}
-
-	.uni-hello-text {
-		color: #7A7E83;
-	}
-
-	.uni-hello-addfile {
-		text-align: center;
-		line-height: 300rpx;
-		background: #FFF;
-		padding: 50rpx;
-		margin-top: 10px;
-		font-size: 38rpx;
-		color: #808080;
-	}
-
-	/* #endif*/
+	/* #endif */
 </style>

+ 0 - 21
LICENSE

@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2018 DCloud
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.

+ 0 - 3
README.md

@@ -1,3 +0,0 @@
-# uni-ownerUnion
-
-`uni-app`框架,一套代码,同时发行到iOS、Android、H5、小程序等多个平台,

+ 0 - 262
common/airport.js

@@ -1,262 +0,0 @@
-export default {
-    "list": [{
-        "letter": "A",
-        "data": [
-            "阿克苏机场",
-            "阿拉山口机场",
-            "阿勒泰机场",
-            "阿里昆莎机场",
-            "安庆天柱山机场",
-            "澳门国际机场"
-        ]
-    }, {
-        "letter": "B",
-        "data": [
-            "保山机场",
-            "包头机场",
-            "北海福成机场",
-            "北京南苑机场",
-            "北京首都国际机场"
-        ]
-    }, {
-        "letter": "C",
-        "data": [
-            "长白山机场",
-            "长春龙嘉国际机场",
-            "常德桃花源机场",
-            "昌都邦达机场",
-            "长沙黄花国际机场",
-            "长治王村机场",
-            "常州奔牛机场",
-            "成都双流国际机场",
-            "赤峰机场"
-        ]
-    }, {
-        "letter": "D",
-        "data": [
-            "大理机场",
-            "大连周水子国际机场",
-            "大庆萨尔图机场",
-            "大同东王庄机场",
-            "达州河市机场",
-            "丹东浪头机场",
-            "德宏芒市机场",
-            "迪庆香格里拉机场",
-            "东营机场",
-            "敦煌机场"
-        ]
-    }, {
-        "letter": "E",
-        "data": [
-            "鄂尔多斯机场",
-            "恩施许家坪机场",
-            "二连浩特赛乌苏国际机场"
-        ]
-    }, {
-        "letter": "F",
-        "data": [
-            "阜阳西关机场",
-            "福州长乐国际机场"
-        ]
-    }, {
-        "letter": "G",
-        "data": [
-            "赣州黄金机场",
-            "格尔木机场",
-            "固原六盘山机场",
-            "广元盘龙机场",
-            "广州白云国际机场",
-            "桂林两江国际机场",
-            "贵阳龙洞堡国际机场"
-        ]
-    }, {
-        "letter": "H",
-        "data": [
-            "哈尔滨太平国际机场",
-            "哈密机场",
-            "海口美兰国际机场",
-            "海拉尔东山国际机场",
-            "邯郸机场",
-            "汉中机场",
-            "杭州萧山国际机场",
-            "合肥骆岗国际机场",
-            "和田机场",
-            "黑河机场",
-            "呼和浩特白塔国际机场",
-            "淮安涟水机场",
-            "黄山屯溪国际机场"
-        ]
-    }, {
-        "letter": "I",
-        "data": []
-    }, {
-        "letter": "J",
-        "data": [
-            "济南遥墙国际机场",
-            "济宁曲阜机场",
-            "鸡西兴凯湖机场",
-            "佳木斯东郊机场",
-            "嘉峪关机场",
-            "锦州小岭子机场",
-            "景德镇机场",
-            "井冈山机场",
-            "九江庐山机场",
-            "九寨黄龙机场"
-        ]
-    }, {
-        "letter": "K",
-        "data": [
-            "喀什机场",
-            "克拉玛依机场",
-            "库车龟兹机场",
-            "库尔勒机场",
-            "昆明巫家坝国际机场"
-        ]
-    }, {
-        "letter": "L",
-        "data": [
-            "拉萨贡嘎机场",
-            "兰州中川机场",
-            "丽江三义机场",
-            "黎平机场",
-            "连云港白塔埠机场",
-            "临沧机场",
-            "临沂机场",
-            "林芝米林机场",
-            "柳州白莲机场",
-            "龙岩冠豸山机场",
-            "泸州蓝田机场",
-            "洛阳北郊机场"
-        ]
-    }, {
-        "letter": "M",
-        "data": [
-            "满洲里西郊机场",
-            "绵阳南郊机场",
-            "漠河古莲机场",
-            "牡丹江海浪机场"
-        ]
-    }, {
-        "letter": "N",
-        "data": [
-            "南昌昌北国际机场",
-            "南充高坪机场",
-            "南京禄口国际机场",
-            "南宁吴圩机场",
-            "南通兴东机场",
-            "南阳姜营机场",
-            "宁波栎社国际机场"
-        ]
-    }, {
-        "letter": "O",
-        "data": []
-    }, {
-        "letter": "P",
-        "data": [
-            "普洱思茅机场"
-        ]
-    }, {
-        "letter": "Q",
-        "data": [
-            "齐齐哈尔三家子机场",
-            "秦皇岛山海关机场",
-            "青岛流亭国际机场",
-            "衢州机场",
-            "泉州晋江机场"
-        ]
-    }, {
-        "letter": "R",
-        "data": [
-            "日喀则和平机场"
-        ]
-    }, {
-        "letter": "S",
-        "data": [
-            "三亚凤凰国际机场",
-            "汕头外砂机场",
-            "上海虹桥国际机场",
-            "上海浦东国际机场",
-            "深圳宝安国际机场",
-            "沈阳桃仙国际机场",
-            "石家庄正定国际机场",
-            "苏南硕放国际机场"
-        ]
-    }, {
-        "letter": "T",
-        "data": [
-            "塔城机场",
-            "太原武宿国际机场",
-            "台州路桥机场 (黄岩机场)",
-            "唐山三女河机场",
-            "腾冲驼峰机场",
-            "天津滨海国际机场",
-            "通辽机场",
-            "铜仁凤凰机场"
-        ]
-    }, {
-        "letter": "U",
-        "data": []
-    }, {
-        "letter": "V",
-        "data": []
-    }, {
-        "letter": "W",
-        "data": [
-            "万州五桥机场",
-            "潍坊机场",
-            "威海大水泊机场",
-            "文山普者黑机场",
-            "温州永强国际机场",
-            "乌海机场",
-            "武汉天河国际机场",
-            "乌兰浩特机场",
-            "乌鲁木齐地窝堡国际机场",
-            "武夷山机场",
-            "梧州长洲岛机场"
-        ]
-    }, {
-        "letter": "X",
-        "data": [
-            "西安咸阳国际机场",
-            "西昌青山机场",
-            "锡林浩特机场",
-            "西宁曹家堡机场",
-            "西双版纳嘎洒机场",
-            "厦门高崎国际机场",
-            "香港国际机场",
-            "襄阳刘集机场",
-            "兴义机场",
-            "徐州观音机场"
-        ]
-    }, {
-        "letter": "Y",
-        "data": [
-            "延安二十里堡机场",
-            "盐城机场",
-            "延吉朝阳川机场",
-            "烟台莱山国际机场",
-            "宜宾菜坝机场",
-            "宜昌三峡机场",
-            "伊春林都机场",
-            "伊宁机场",
-            "义乌机场",
-            "银川河东机场",
-            "永州零陵机场",
-            "榆林榆阳机场",
-            "玉树巴塘机场",
-            "运城张孝机场"
-        ]
-    }, {
-        "letter": "Z",
-        "data": [
-            "湛江机场",
-            "昭通机场",
-            "郑州新郑国际机场",
-            "芷江机场",
-            "重庆江北国际机场",
-            "中卫香山机场",
-            "舟山朱家尖机场",
-            "珠海三灶机场"
-        ]
-    }]
-}

+ 0 - 2
common/bus.js

@@ -1,2 +0,0 @@
-import Vue from 'vue';  
-export default new Vue(); 

File diff suppressed because it is too large
+ 0 - 1204
common/commonMethod.js


+ 0 - 195
common/commonPageMethod.js

@@ -1,195 +0,0 @@
-var app = getApp(); //获取应用实例
-const util = require('@/static/utils/util.js');
-const config = require('@/static/config.js');
-import requestConfig from '@/static/lib/requestConfig';
-export default {
-	data() {
-		return {
-			isSendImg: false,	//当前页面是否正在处于选择本地图片的状态-选择图片会触发小程序的隐藏事件,需要单独处理
-			previewFlag: false,	//当前页面是否预览了图片-预览图片会触发小程序的隐藏事件,需要单独处理
-			loadPromise: new Promise((resolve) => {
-				this.loadedCompleteFun = function() {
-					console.log('onload结束');
-					resolve()
-				}
-			}),
-		}
-	},
-	watch: {},
-    async onLoad(options) {
-        let shareCity = ''; //分享携带的城市信息
-        let houseId = '';   //分享携带的项目id
-        let shareUserId = '';   //分享携带的助力发起人id
-        if (!options) { //如果不存在则直接返回
-            this.loadedCompleteFun();//通告加载已经结束
-            return false;
-        }
-        // let lastPage = getCurrentPages()[getCurrentPages().length-2] ? getCurrentPages()[getCurrentPages().length-2].$vm : null;
-        // if(lastPage){
-            // if(lastPage.componentId){
-            //     options.componentId = lastPage.componentId;
-            // }
-            // if(lastPage.componentType){
-            //     options.componentType = lastPage.componentType;
-            // }
-            // if(lastPage.diyArea){
-            //     options.diyArea = lastPage.diyArea;
-            // }
-        // }
-        if(app.globalData.componentId){
-            options.componentId = app.globalData.componentId;
-            options.componentType = app.globalData.componentType;
-            options.diyArea = app.globalData.diyArea;
-            app.globalData.componentId = '';//清空该值
-            app.globalData.componentType = '';//清空该值
-            app.globalData.diyArea = false;//清空该值
-        }
-        this.pvCurPageParams = JSON.stringify(options);
-        
-        if (options.gdt_vid) { //从朋友圈广告进入的带有clickid
-            app.globalData.clickId = options.gdt_vid;
-        }
-        if (options.scene) { //如果存在该参数,则说明是通过数量无限制的小程序码进来的
-            const scene = decodeURIComponent(options.scene); // scene 需要使用 decodeURIComponent 才能获取到生成二维码时传入的 scene
-            options.shareToken = scene;     //说明用户携带分享信息
-            console.log('被scene先覆盖了')
-        }
-        //将渠道存至全局,留电接口需要用
-        if (options.shareToken && options.shareToken != "null" && options.shareToken != "undefined") {
-            app.globalData.fromChannel = options.shareToken;
-            // #ifdef H5
-            var userInfo = uni.getStorageSync('userInfo');
-            if(userInfo){
-                userInfo.fromChannel = options.shareToken;
-                uni.setStorageSync('userInfo', userInfo);
-            }
-            // #endif
-        }
-        // 解密对应的客户来源-同时防止重复解密
-        if (app.globalData.fromChannel && app.globalData.oldFromChannel != app.globalData.fromChannel) {
-            console.log("***开始解密来源信息***", app.globalData.fromChannel);
-            var param = {
-                shareSign: app.globalData.fromChannel
-            };
-            const res = await requestConfig('decryptShareSign', param, true);
-            console.log("***decryptHandle***", res);
-            if (res && res.success) {
-                app.globalData.oldFromChannel = app.globalData.fromChannel;//解密成功后记录
-                console.log("***解密来源信息成功***", res.single);
-                if (res.single) {
-                    // app.globalData.shareId = res.single.customerId;
-                    if (res.single.attrs) {// attrs 是字符串形式存储在数据库服务器上
-                        res.single.attrs = JSON.parse(res.single.attrs);
-                    }
-                    shareCity = res.single.attrs ? res.single.attrs.shareCity : '';//赋值分享者城市
-                    shareUserId = res.single.attrs ? res.single.attrs.shareUserId : '';
-                    houseId = res.single.houseId || options.houseId || '';
-                    app.globalData.exchangedFromChannel = JSON.stringify(res.single);//解密后的明文
-                    app.globalData.isZhuanFaFromProject = houseId;
-                }
-            } else {
-                let trackparam = {
-                    type: 'mini-program-Error', //埋点类型
-                    pvCurPageName: 'app.js-decrypt', //当前页面名称
-                    expand: JSON.stringify(res) + ";brandId=" + config.brandId + ";param=" + JSON.stringify(
-                        param), //扩展字段
-                };
-                util.trackRequest(trackparam);
-            }
-        }
-        //检查如果不触发解密的情况(相邻几次的秘钥是一样的)
-        //或者 不存在解密时 即 fromChannel 和 oldFromChannel 都为空
-        //则比对最新的城市解密记录情况,匹配的上,则取最新解密记录的城市刷新当前城市
-        if (app.globalData.oldFromChannel == app.globalData.fromChannel) {
-            let single = app.globalData.exchangedFromChannel ? JSON.parse(app.globalData.exchangedFromChannel) : {};
-            shareCity = single.attrs ? single.attrs.shareCity : '';
-            shareUserId = single.attrs ? single.attrs.shareUserId : '';
-        }
-        if(options.shareCity){
-            shareCity = options.shareCity;
-        }
-        if(shareCity){//存在分享城市,则更新为分享人所在的城市
-            app.addCustomerCity(shareCity);
-        }
-        if(options.houseId){
-            houseId = options.houseId;
-        }
-        let currPage = getCurrentPages()[getCurrentPages().length - 1] ? getCurrentPages()[getCurrentPages().length - 1].$vm : null;
-        if(currPage){
-            currPage.shareUserId = shareUserId ? shareUserId : '';
-            currPage.houseId = houseId ? houseId : '';
-        }
-        let shareOpenId = options.shareOpenId ? options.shareOpenId : '';
-        if (app.globalData.exchangedFromChannel) {
-            var _t = JSON.parse(app.globalData.exchangedFromChannel);
-            if (_t) {
-                _t.shareOpenId = shareOpenId;
-                app.globalData.exchangedFromChannel = JSON.stringify(_t);
-            }
-        } else {
-            let params = {
-                shareOpenId: shareOpenId
-            };
-            app.globalData.exchangedFromChannel = JSON.stringify(params);
-        }
-        console.warn("---loadedCompleteFun---")
-        this.loadedCompleteFun();//通告加载已经结束
-    },
-	onShow() {
-		// this.isSendImg = false;		//还原默认值-这里不能还原,因为微信在处理拍照选择图片时,是分两个阶段的
-		// 阶段1:拍照,开始时,会把小程序退到后台,会触发onhide;拍照结束后,会回到小程序的当前页面-页面执行onshow
-		// 阶段2:选择图片,会进入选择图片的原生组件-小程序退到后台执行onhide;图片选择完毕后,会执行onshow
-		// 上述两个阶段存在onshow事件,重置的话,会导致阶段2会执行断开socket的方法-详见App.vue 的onhide方法
-	},
-	onUnload() {
-		console.warn("---onUnload---")
-		app.hidePage();
-	},
-	/**
-	 * 生命周期函数--监听页面隐藏
-	 */
-	onHide: function() {
-		console.warn("---onhide---")
-		app.hidePage();
-	},
-	methods: {
-		// 通告加载完成事件
-		loadedCompleteFun() {},
-		/**
-		 * 获取当前页面的数据,为埋点用
-		 */
-		getCurrentPageParam() {
-			return this.pvCurPageParams
-		},
-        // 处理分享路径的公共方法
-        shareInitPath(){
-            let path = '';
-            let shareToken = app.globalData.shareToken || '';//当前用户的openid
-            let shareOpenId = app.globalData.openid || '';//当前用户的openid
-            let houseId = this.houseId || '';//当前用户的openid
-            let pageId = this.pageId || '';//当前页面的pageId
-            let activityId = this.activityId || '';//当前页面的activityId
-            let liveStreams = this.liveStreams || '';//当前页面的直播地址
-            let layoutId = this.layoutId || '';//当前页面的户型id
-            // 当前的分享参数
-            // 为了判断返回是到项目首页 还是集团页面 同时,也具有判断当前用户是来自分享的功能
-            let fromProject = houseId ? app.globalData.projectShare : app.globalData.brandShare;
-            path = "shareToken=" + shareToken 
-            + "&shareOpenId=" + shareOpenId 
-            + "&houseId=" + houseId 
-            + '&fromProject=' + fromProject
-            + "&pageId=" + pageId;
-            if(activityId){
-                path += "&activityId=" + activityId;
-            }
-            if(liveStreams){
-                path += "&liveStreams=" + liveStreams;
-            }
-            if(layoutId){
-                path += "&layoutId=" + layoutId;
-            }
-            console.warn("***shareInitPath***",path);
-            return path;
-        },
-	}
-}

+ 0 - 27
common/css/common.css

@@ -1,27 +0,0 @@
-.rows{
-    display: flex;
-    flex-direction:row;
-    align-items:center;
-}
-.rows-between{
-    justify-content:space-between;
-}
-.columns{
-    display: flex;
-    flex-direction:column;
-    align-items:center;
-    justify-content:space-between;
-}
-.eslipe {
-	overflow: hidden;
-	white-space: nowrap;
-	text-overflow: ellipsis;
-}
-.flex-start{
-	align-items:flex-start;
-}
-::-webkit-scrollbar{
-	width: 0;
-	height: 0;
-	color: transparent;
-}

+ 0 - 179
common/css/templateCommon.css

@@ -1,179 +0,0 @@
-.rows-left {
-	display: flex;
-	flex-direction: row;
-	justify-content: flex-start;
-	align-items: center;
-}
-.rows-between {
-	display: flex;
-	flex-direction: row;
-	justify-content: space-between;
-	align-items: center;
-}
-.column-flex {
-	display: flex;
-	flex-direction: column;
-    justify-content: center;
-    align-items: center;
-}
-.column-between {
-	display: flex;
-	flex-direction: column;
-	justify-content: space-between;
-	align-items: center;
-}
-.eslipe {
-	overflow: hidden;
-	white-space: nowrap;
-	text-overflow: ellipsis;
-	max-width: 330rpx;
-	display: inline-block;
-}
-.style1 {
-	position: absolute;
-	z-index: 10;
-	width: 100%;
-}
-
-.style2 {
-	position: fixed;
-	top: 0rpx;
-	left: 0rpx;
-	width: 100vw;
-	z-index: 999;
-}
-.scrollview {
-	background: #f5f5f5;
-	position: relative;
-}
-
-.searchBox {
-	position: fixed;
-}
-.nav-title {
-	position: absolute;
-	text-align: center;
-	max-width: 400rpx;
-	overflow: hidden;
-	text-overflow: ellipsis;
-	white-space: nowrap;
-	top: 0;
-	left: 0;
-	right: 0;
-	bottom: 0;
-	margin: auto;
-	color: #000;
-	font-size: 32rpx;
-	font-weight: bold;
-}
-.searchBox .searchView {
-    position: absolute;
-	left: 46rpx;
-	top: 50%;
-	-webkit-transform: translateY(-50%);
-	transform: translateY(-50%);
-    font-size: 28rpx;
-}
-.searchBox image {
-	left: 46rpx;
-	width: 105rpx;
-	height: 40rpx;
-	position: absolute;
-	top: 50%;
-	-webkit-transform: translateY(-50%);
-	transform: translateY(-50%);
-}
-.searchView2 {
-    position: absolute;
-	right: 40rpx;
-	top: 392rpx;
-    width: 72rpx;
-    height: 72rpx;
-    line-height: 72rpx;
-    text-align: center;
-    border-radius: 72rpx;
-    font-size: 28rpx;
-    background-color:#FFFFFF;
-    z-index: 9;
-}
-.shareBox {
-	overflow: hidden;
-	position: relative;
-}
-.shareBox .shareboxt {
-    width: 561rpx;
-    height: 126rpx;
-    margin: 0 auto;
-    display: block;
-    margin-top: 123rpx;
-    margin-bottom: 50rpx;
-}
-.shareBox .logo {
-    width: 258rpx;
-    height: 81rpx;
-    margin: 0 auto;
-    display: block;
-    margin-top: 100rpx;
-    margin-bottom: 16rpx;
-}
-.shareBox .groupName {
-    height:40rpx;
-    font-size:28rpx;
-    font-family:Verdana;
-    font-weight:400;
-    line-height:34rpx;
-    color:rgba(186,186,186,1);
-    text-align: center;
-}
-.shareBox .shareIcon{
-	width: 27rpx;
-	height: 38rpx;
-	display:block;
-}
-.shareBox .shareButton {
-	display: flex;
-	flex-direction: row;
-	justify-content: center;
-	align-items: center;
-	border-radius: 40rpx;
-    width: 280rpx;
-    height: 76rpx;
-    margin: 0 auto;
-    margin-top: 50rpx;
-    margin-bottom: 20rpx;
-	font-size: 28rpx;
-	color:#FFFFFF;
-	font-weight: 400;
-	text-align: center;
-}
-.joinGroup{
-	width: 280rpx;
-	height: 76rpx;
-	line-height: 76rpx;
-	background: #ffffff;
-	border: 2rpx solid #f07423;
-	border-radius: 40rpx;
-	text-align: center;
-	margin: 0 auto;
-}
-.share-box-word{
-	width: 260rpx;
-	height: 36rpx;
-	font-size: 20rpx;
-	font-family: Verdana, Verdana-Regular;
-	font-weight: 400;
-	color: #999999;
-	line-height: 36rpx;
-	margin: 0 auto;
-	margin-top: 26rpx;
-	margin-bottom: 400rpx;
-}
-/* 回到顶部按钮 */
-.backTopView{
-    position: fixed;
-    right: 40rpx;
-    bottom: 100rpx;
-    width: 80rpx;
-    height: 80rpx;
-    z-index: 9999999;
-}

+ 0 - 398
common/font/iconfont.css

@@ -1,398 +0,0 @@
-@font-face {
-  font-family: "iconfont"; /* Project id 2438458 */
-  src: url('https://at.alicdn.com/t/font_2438458_79m17d548kb.woff2?t=1643361721881') format('woff2'),
-       url('https://at.alicdn.com/t/font_2438458_79m17d548kb.woff?t=1643361721881') format('woff'),
-       url('https://at.alicdn.com/t/font_2438458_79m17d548kb.ttf?t=1643361721881') format('truetype');
-}
-
-.iconfont {
-  font-family: "iconfont" !important;
-  font-size: 16px;
-  font-style: normal;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-}
-
-.icon-weibiaoti--:before {
-  content: "\e65b";
-}
-
-.icon-jiaotong:before {
-  content: "\e656";
-}
-
-.icon-gouwu:before {
-  content: "\e657";
-}
-
-.icon-jiaoyu:before {
-  content: "\e658";
-}
-
-.icon-shenghuobianli:before {
-  content: "\e659";
-}
-
-.icon-yiliao:before {
-  content: "\e65a";
-}
-
-.icon-live:before {
-  content: "\e655";
-}
-
-.icon-xiaoxi:before {
-  content: "\e653";
-}
-
-.icon-wode:before {
-  content: "\e654";
-}
-
-.icon-a-1949plus:before {
-  content: "\e652";
-}
-
-.icon-ic-fuzhi:before {
-  content: "\e64e";
-}
-
-.icon-ic-huanyihuan:before {
-  content: "\e64f";
-}
-
-.icon-ic-xiazai:before {
-  content: "\e650";
-}
-
-.icon-ic-pengyouquan:before {
-  content: "\e651";
-}
-
-.icon-icon_back-shang:before {
-  content: "\e64c";
-}
-
-.icon-icon_back-xia:before {
-  content: "\e64d";
-}
-
-.icon-fuzhi:before {
-  content: "\e64b";
-}
-
-.icon-fuxuankuang-weixuanzhongzhuangtai:before {
-  content: "\e64a";
-}
-
-.icon-fuxuankuang-xuanzhongzhuangtai:before {
-  content: "\e649";
-}
-
-.icon-zhengzaizhibo:before {
-  content: "\e648";
-}
-
-.icon-yuyueliudian:before {
-  content: "\e647";
-}
-
-.icon-weixin:before {
-  content: "\e646";
-}
-
-.icon-goumai:before {
-  content: "\e645";
-}
-
-.icon-fenxiang1:before {
-  content: "\e644";
-}
-
-.icon-jiarugouwuche:before {
-  content: "\e643";
-}
-
-.icon-shoucang:before {
-  content: "\e642";
-}
-
-.icon-yishoucang:before {
-  content: "\e641";
-}
-
-.icon-liulanliang:before {
-  content: "\e640";
-}
-
-.icon-jiarugouwucheliang:before {
-  content: "\e63f";
-}
-
-.icon-kaipan1:before {
-  content: "\e63e";
-}
-
-.icon-huidaodingbu:before {
-  content: "\e63d";
-}
-
-.icon-quanming:before {
-  content: "\e63c";
-}
-
-.icon-search:before {
-  content: "\e639";
-}
-
-.icon-pin:before {
-  content: "\e63a";
-}
-
-.icon-icon_delete:before {
-  content: "\e63b";
-}
-
-.icon-guanbi1:before {
-  content: "\e638";
-}
-
-.icon-timeSelector:before {
-  content: "\e637";
-}
-
-.icon-sousuo:before {
-  content: "\e636";
-}
-
-.icon-shuliang:before {
-  content: "\e635";
-}
-
-.icon-xiangmu:before {
-  content: "\e629";
-}
-
-.icon-VR2:before {
-  content: "\e634";
-}
-
-.icon-guanbi:before {
-  content: "\e633";
-}
-
-.icon-liebiao:before {
-  content: "\e631";
-}
-
-.icon-bianji:before {
-  content: "\e632";
-}
-
-.icon-shipin:before {
-  content: "\e630";
-}
-
-.icon-jieguodaiqueren:before {
-  content: "\e621";
-}
-
-.icon-baobeichenggong:before {
-  content: "\e623";
-}
-
-.icon-baobeishibai:before {
-  content: "\e624";
-}
-
-.icon-chenggong:before {
-  content: "\e61f";
-}
-
-.icon-baobei:before {
-  content: "\e622";
-}
-
-.icon-shibai:before {
-  content: "\e61c";
-}
-
-.icon-daiqueren:before {
-  content: "\e61b";
-}
-
-.icon-yijiantixingshenhe:before {
-  content: "\e61a";
-}
-
-.icon-shangsheng1:before {
-  content: "\e619";
-}
-
-.icon-weizhibai-1:before {
-  content: "\e61d";
-}
-
-.icon-fenxiangdiseicon1:before {
-  content: "\e61e";
-}
-
-.icon-fenxiang:before {
-  content: "\e625";
-}
-
-.icon-weizhibai1:before {
-  content: "\e627";
-}
-
-.icon-remen2:before {
-  content: "\e628";
-}
-
-.icon-shipin1:before {
-  content: "\e62a";
-}
-
-.icon-shanghua1:before {
-  content: "\e62b";
-}
-
-.icon-gengduo1:before {
-  content: "\e62c";
-}
-
-.icon-xiala1:before {
-  content: "\e62d";
-}
-
-.icon-weizhishense:before {
-  content: "\e62e";
-}
-
-.icon-weizhiqianse1:before {
-  content: "\e62f";
-}
-
-.icon-remen1:before {
-  content: "\e620";
-}
-
-.icon-shangsheng:before {
-  content: "\e626";
-}
-
-.icon-IM:before {
-  content: "\e618";
-}
-
-.icon-gantanhao:before {
-  content: "\e685";
-}
-
-.icon-gougou:before {
-  content: "\e6a3";
-}
-
-.icon-yijianbaobei:before {
-  content: "\e617";
-}
-
-.icon-zhuanfa:before {
-  content: "\e615";
-}
-
-.icon-canyu:before {
-  content: "\e616";
-}
-
-.icon-duoxuanxuanzhong:before {
-  content: "\e613";
-}
-
-.icon-duoxuanchanggui:before {
-  content: "\e614";
-}
-
-.icon-weixuanzhong:before {
-  content: "\e611";
-}
-
-.icon-xuanzhong:before {
-  content: "\e612";
-}
-
-.icon-tabguanzhu:before {
-  content: "\e60a";
-}
-
-.icon-fenxiangxiangmu:before {
-  content: "\e609";
-}
-
-.icon-fenxiangkapian:before {
-  content: "\e60b";
-}
-
-.icon-tabfenxiang:before {
-  content: "\e60c";
-}
-
-.icon-yidingyue:before {
-  content: "\e60d";
-}
-
-.icon-diyfenxiang:before {
-  content: "\e60e";
-}
-
-.icon-xiangmuyiguanzhu:before {
-  content: "\e60f";
-}
-
-.icon-xiangmuguanzhu:before {
-  content: "\e610";
-}
-
-.icon-remen:before {
-  content: "\e608";
-}
-
-.icon-dingwei:before {
-  content: "\e607";
-}
-
-.icon-jisuanqi:before {
-  content: "\e606";
-}
-
-.icon-yuyue1:before {
-  content: "\e6cd";
-}
-
-.icon-VR:before {
-  content: "\e603";
-}
-
-.icon-pic:before {
-  content: "\e604";
-}
-
-.icon-lujing3863:before {
-  content: "\e605";
-}
-
-.icon-bianjia:before {
-  content: "\e601";
-}
-
-.icon-kaipan:before {
-  content: "\e602";
-}
-
-.icon-lujing7708:before {
-  content: "\e600";
-}
-
-.icon-xingxing-copy:before {
-  content: "\e85a";
-}

+ 0 - 97
common/graceChecker.js

@@ -1,97 +0,0 @@
-/**
-数据验证(表单验证)
-来自 grace.hcoder.net 
-作者 hcoder 深海
-*/
-export default {
-	error:'',
-	check : function (data, rule){
-		for(var i = 0; i < rule.length; i++){
-			if (!rule[i].checkType){return true;}
-			if (!rule[i].name) {return true;}
-			if (!rule[i].errorMsg) {return true;}
-			if (!data[rule[i].name]) {this.error = rule[i].errorMsg; return false;}
-			switch (rule[i].checkType){
-				case 'string':
-					var reg = new RegExp('^.{' + rule[i].checkRule + '}$');
-					if(!reg.test(data[rule[i].name])) {this.error = rule[i].errorMsg; return false;}
-				break;
-				case 'int':
-					var reg = new RegExp('^(-[1-9]|[1-9])[0-9]{' + rule[i].checkRule + '}$');
-					if(!reg.test(data[rule[i].name])) {this.error = rule[i].errorMsg; return false;}
-					break;
-				break;
-				case 'between':
-					if (!this.isNumber(data[rule[i].name])){
-						this.error = rule[i].errorMsg;
-						return false;
-					}
-					var minMax = rule[i].checkRule.split(',');
-					minMax[0] = Number(minMax[0]);
-					minMax[1] = Number(minMax[1]);
-					if (data[rule[i].name] > minMax[1] || data[rule[i].name] < minMax[0]) {
-						this.error = rule[i].errorMsg;
-						return false;
-					}
-				break;
-				case 'betweenD':
-					var reg = /^-?[1-9][0-9]?$/;
-					if (!reg.test(data[rule[i].name])) { this.error = rule[i].errorMsg; return false; }
-					var minMax = rule[i].checkRule.split(',');
-					minMax[0] = Number(minMax[0]);
-					minMax[1] = Number(minMax[1]);
-					if (data[rule[i].name] > minMax[1] || data[rule[i].name] < minMax[0]) {
-						this.error = rule[i].errorMsg;
-						return false;
-					}
-				break;
-				case 'betweenF': 
-					var reg = /^-?[0-9][0-9]?.+[0-9]+$/;
-					if (!reg.test(data[rule[i].name])){this.error = rule[i].errorMsg; return false;}
-					var minMax = rule[i].checkRule.split(',');
-					minMax[0] = Number(minMax[0]);
-					minMax[1] = Number(minMax[1]);
-					if (data[rule[i].name] > minMax[1] || data[rule[i].name] < minMax[0]) {
-						this.error = rule[i].errorMsg;
-						return false;
-					}
-				break;
-				case 'same':
-					if (data[rule[i].name] != rule[i].checkRule) { this.error = rule[i].errorMsg; return false;}
-				break;
-				case 'notsame':
-					if (data[rule[i].name] == rule[i].checkRule) { this.error = rule[i].errorMsg; return false; }
-				break;
-				case 'email':
-					var reg = /^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;
-					if (!reg.test(data[rule[i].name])) { this.error = rule[i].errorMsg; return false; }
-				break;
-				case 'phoneno':
-					var reg = /^1[0-9]{10,10}$/;
-					if (!reg.test(data[rule[i].name])) { this.error = rule[i].errorMsg; return false; }
-				break;
-				case 'zipcode':
-					var reg = /^[0-9]{6}$/;
-					if (!reg.test(data[rule[i].name])) { this.error = rule[i].errorMsg; return false; }
-				break;
-				case 'reg':
-					var reg = new RegExp(rule[i].checkRule);
-					if (!reg.test(data[rule[i].name])) { this.error = rule[i].errorMsg; return false; }
-				break;
-				case 'in':
-					if(rule[i].checkRule.indexOf(data[rule[i].name]) == -1){
-						this.error = rule[i].errorMsg; return false;
-					}
-				break;
-				case 'notnull':
-					if(data[rule[i].name] == null || data[rule[i].name].length < 1){this.error = rule[i].errorMsg; return false;}
-				break;
-			}
-		}
-		return true;
-	},
-	isNumber : function (checkVal){
-		var reg = /^-?[1-9][0-9]?.?[0-9]*$/;
-		return reg.test(checkVal);
-	}
-}

+ 0 - 352
common/html-parser.js

@@ -1,352 +0,0 @@
-/*
- * HTML5 Parser By Sam Blowes
- *
- * Designed for HTML5 documents
- *
- * Original code by John Resig (ejohn.org)
- * http://ejohn.org/blog/pure-javascript-html-parser/
- * Original code by Erik Arvidsson, Mozilla Public License
- * http://erik.eae.net/simplehtmlparser/simplehtmlparser.js
- *
- * ----------------------------------------------------------------------------
- * License
- * ----------------------------------------------------------------------------
- *
- * This code is triple licensed using Apache Software License 2.0,
- * Mozilla Public License or GNU Public License
- *
- * ////////////////////////////////////////////////////////////////////////////
- *
- * Licensed under the Apache License, Version 2.0 (the "License"); you may not
- * use this file except in compliance with the License.  You may obtain a copy
- * of the License at http://www.apache.org/licenses/LICENSE-2.0
- *
- * ////////////////////////////////////////////////////////////////////////////
- *
- * The contents of this file are subject to the Mozilla Public License
- * Version 1.1 (the "License"); you may not use this file except in
- * compliance with the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS"
- * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
- * License for the specific language governing rights and limitations
- * under the License.
- *
- * The Original Code is Simple HTML Parser.
- *
- * The Initial Developer of the Original Code is Erik Arvidsson.
- * Portions created by Erik Arvidssson are Copyright (C) 2004. All Rights
- * Reserved.
- *
- * ////////////////////////////////////////////////////////////////////////////
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
- *
- * ----------------------------------------------------------------------------
- * Usage
- * ----------------------------------------------------------------------------
- *
- * // Use like so:
- * HTMLParser(htmlString, {
- *     start: function(tag, attrs, unary) {},
- *     end: function(tag) {},
- *     chars: function(text) {},
- *     comment: function(text) {}
- * });
- *
- * // or to get an XML string:
- * HTMLtoXML(htmlString);
- *
- * // or to get an XML DOM Document
- * HTMLtoDOM(htmlString);
- *
- * // or to inject into an existing document/DOM node
- * HTMLtoDOM(htmlString, document);
- * HTMLtoDOM(htmlString, document.body);
- *
- */
-// Regular Expressions for parsing tags and attributes
-var startTag = /^<([-A-Za-z0-9_]+)((?:\s+[a-zA-Z_:][-a-zA-Z0-9_:.]*(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/;
-var endTag = /^<\/([-A-Za-z0-9_]+)[^>]*>/;
-var attr = /([a-zA-Z_:][-a-zA-Z0-9_:.]*)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g; // Empty Elements - HTML 5
-
-var empty = makeMap('area,base,basefont,br,col,frame,hr,img,input,link,meta,param,embed,command,keygen,source,track,wbr'); // Block Elements - HTML 5
-// fixed by xxx 将 ins 标签从块级名单中移除
-
-var block = makeMap('a,address,article,applet,aside,audio,blockquote,button,canvas,center,dd,del,dir,div,dl,dt,fieldset,figcaption,figure,footer,form,frameset,h1,h2,h3,h4,h5,h6,header,hgroup,hr,iframe,isindex,li,map,menu,noframes,noscript,object,ol,output,p,pre,section,script,table,tbody,td,tfoot,th,thead,tr,ul,video'); // Inline Elements - HTML 5
-
-var inline = makeMap('abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var'); // Elements that you can, intentionally, leave open
-// (and which close themselves)
-
-var closeSelf = makeMap('colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr'); // Attributes that have their values filled in disabled="disabled"
-
-var fillAttrs = makeMap('checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected'); // Special Elements (can contain anything)
-
-var special = makeMap('script,style');
-function HTMLParser(html, handler) {
-  var index;
-  var chars;
-  var match;
-  var stack = [];
-  var last = html;
-
-  stack.last = function () {
-    return this[this.length - 1];
-  };
-
-  while (html) {
-    chars = true; // Make sure we're not in a script or style element
-
-    if (!stack.last() || !special[stack.last()]) {
-      // Comment
-      if (html.indexOf('<!--') == 0) {
-        index = html.indexOf('-->');
-
-        if (index >= 0) {
-          if (handler.comment) {
-            handler.comment(html.substring(4, index));
-          }
-
-          html = html.substring(index + 3);
-          chars = false;
-        } // end tag
-
-      } else if (html.indexOf('</') == 0) {
-        match = html.match(endTag);
-
-        if (match) {
-          html = html.substring(match[0].length);
-          match[0].replace(endTag, parseEndTag);
-          chars = false;
-        } // start tag
-
-      } else if (html.indexOf('<') == 0) {
-        match = html.match(startTag);
-
-        if (match) {
-          html = html.substring(match[0].length);
-          match[0].replace(startTag, parseStartTag);
-          chars = false;
-        }
-      }
-
-      if (chars) {
-        index = html.indexOf('<');
-        var text = index < 0 ? html : html.substring(0, index);
-        html = index < 0 ? '' : html.substring(index);
-
-        if (handler.chars) {
-          handler.chars(text);
-        }
-      }
-    } else {
-      html = html.replace(new RegExp('([\\s\\S]*?)<\/' + stack.last() + '[^>]*>'), function (all, text) {
-        text = text.replace(/<!--([\s\S]*?)-->|<!\[CDATA\[([\s\S]*?)]]>/g, '$1$2');
-
-        if (handler.chars) {
-          handler.chars(text);
-        }
-
-        return '';
-      });
-      parseEndTag('', stack.last());
-    }
-
-    if (html == last) {
-      throw 'Parse Error: ' + html;
-    }
-
-    last = html;
-  } // Clean up any remaining tags
-
-
-  parseEndTag();
-
-  function parseStartTag(tag, tagName, rest, unary) {
-    tagName = tagName.toLowerCase();
-
-    if (block[tagName]) {
-      while (stack.last() && inline[stack.last()]) {
-        parseEndTag('', stack.last());
-      }
-    }
-
-    if (closeSelf[tagName] && stack.last() == tagName) {
-      parseEndTag('', tagName);
-    }
-
-    unary = empty[tagName] || !!unary;
-
-    if (!unary) {
-      stack.push(tagName);
-    }
-
-    if (handler.start) {
-      var attrs = [];
-      rest.replace(attr, function (match, name) {
-        var value = arguments[2] ? arguments[2] : arguments[3] ? arguments[3] : arguments[4] ? arguments[4] : fillAttrs[name] ? name : '';
-        attrs.push({
-          name: name,
-          value: value,
-          escaped: value.replace(/(^|[^\\])"/g, '$1\\\"') // "
-
-        });
-      });
-
-      if (handler.start) {
-        handler.start(tagName, attrs, unary);
-      }
-    }
-  }
-
-  function parseEndTag(tag, tagName) {
-    // If no tag name is provided, clean shop
-    if (!tagName) {
-      var pos = 0;
-    } // Find the closest opened tag of the same type
-    else {
-        for (var pos = stack.length - 1; pos >= 0; pos--) {
-          if (stack[pos] == tagName) {
-            break;
-          }
-        }
-      }
-
-    if (pos >= 0) {
-      // Close all the open elements, up the stack
-      for (var i = stack.length - 1; i >= pos; i--) {
-        if (handler.end) {
-          handler.end(stack[i]);
-        }
-      } // Remove the open elements from the stack
-
-
-      stack.length = pos;
-    }
-  }
-}
-
-function makeMap(str) {
-  var obj = {};
-  var items = str.split(',');
-
-  for (var i = 0; i < items.length; i++) {
-    obj[items[i]] = true;
-  }
-
-  return obj;
-}
-
-function removeDOCTYPE(html) {
-  return html.replace(/<\?xml.*\?>\n/, '').replace(/<!doctype.*>\n/, '').replace(/<!DOCTYPE.*>\n/, '');
-}
-
-function parseAttrs(attrs) {
-  return attrs.reduce(function (pre, attr) {
-    var value = attr.value;
-    var name = attr.name;
-
-    if (pre[name]) {
-			pre[name] = pre[name] + " " + value;
-    } else {
-			pre[name] = value;
-    }
-
-    return pre;
-  }, {});
-}
-
-function parseHtml(html) {
-  html = removeDOCTYPE(html);
-  var stacks = [];
-  var results = {
-    node: 'root',
-    children: []
-  };
-  HTMLParser(html, {
-    start: function start(tag, attrs, unary) {
-      var node = {
-        name: tag
-      };
-
-      if (attrs.length !== 0) {
-        node.attrs = parseAttrs(attrs);
-      }
-
-      if (unary) {
-        var parent = stacks[0] || results;
-
-        if (!parent.children) {
-          parent.children = [];
-        }
-
-        parent.children.push(node);
-      } else {
-        stacks.unshift(node);
-      }
-    },
-    end: function end(tag) {
-      var node = stacks.shift();
-      if (node.name !== tag) console.error('invalid state: mismatch end tag');
-
-      if (stacks.length === 0) {
-        results.children.push(node);
-      } else {
-        var parent = stacks[0];
-
-        if (!parent.children) {
-          parent.children = [];
-        }
-
-        parent.children.push(node);
-      }
-    },
-    chars: function chars(text) {
-      var node = {
-        type: 'text',
-        text: text
-      };
-
-      if (stacks.length === 0) {
-        results.children.push(node);
-      } else {
-        var parent = stacks[0];
-
-        if (!parent.children) {
-          parent.children = [];
-        }
-
-        parent.children.push(node);
-      }
-    },
-    comment: function comment(text) {
-      var node = {
-        node: 'comment',
-        text: text
-      };
-      var parent = stacks[0];
-
-      if (!parent.children) {
-        parent.children = [];
-      }
-
-      parent.children.push(node);
-    }
-  });
-  return results.children;
-}
-
-export default parseHtml;

+ 0 - 90
common/mixins/concern.js

@@ -1,90 +0,0 @@
-const util = require('../../static/utils/util.js');
-const config = require('../../static/config.js');
-var app = getApp(); //获取应用实例
-import requestConfig from '../../static/lib/requestConfig';
-export default {
-    data(){
-        return {
-            showConcernTips:false,
-            haveAlreadyCollectThisProject: false,
-        }
-    },
-    watch:{
-    },
-    methods:{
-        catchTouchMove: function() {
-            return false;
-        },
-        /**
-         * 查询项目的状态
-         */
-        async collectProjectStatus(successBack, failBack) {
-            let requestData = {
-                customerId: app.globalData.single && app.globalData.single.id,
-                houseId: this.houseId,
-            };
-            let checkCollectRes = await requestConfig('collectionStatus', requestData, true);
-            if (checkCollectRes && checkCollectRes.success) {
-                if (successBack) {
-                    successBack();
-                }
-                this.haveAlreadyCollectThisProject = true;
-            } else {
-                this.haveAlreadyCollectThisProject = false;
-                if (failBack) {
-                    failBack();
-                }
-            }
-        },
-        /**
-         * 收藏项目
-         */
-        async collectProject() {
-            let requestData = {
-                customerId: app.globalData.single && app.globalData.single.id,
-                houseId: this.houseId,
-            };
-            let res = await requestConfig('houseCollection', requestData, true);
-            if (res.success) {
-                this.haveAlreadyCollectThisProject = true;
-				this.updateShowConcernTips()
-            }
-        },
-        updateShowConcernTips(){
-            this.showConcernTips = true;
-            setTimeout(() => {
-                this.showConcernTips=false
-            }, 2500);
-        },
-        /**
-         * 关注项目
-         */
-        attendProject(e) {
-            let type = e.currentTarget.dataset.jumptype;
-            if (type == -1) {
-                let param = {
-                    type: 'CLK', //埋点类型
-                    clkName: 'follow', //点击前往的页面名称
-                    clkId: 'clk_2cmina_241', //点击ID
-                    clkParams: {
-                        "houseId": this.houseId,
-                    }
-                };
-                util.trackRequest(param, app);
-                this.collectProjectStatus(() => {
-                    let projectName = app.globalData.houseProject.projectName || '';
-                    let msg = "您已成功关注" + projectName + "项目";
-                    uni.showToast({
-                        title: msg,
-                        icon: "none",
-                        duration: 2000
-                    });
-                }, () => {
-                    this.collectProject();
-                });
-            } else if (type == -2) {
-                this.navigateFuc(e)
-            }
-        },
-    }
-}

+ 0 - 256
common/mixins/templateMethod.js

@@ -1,256 +0,0 @@
-var app = getApp(); //获取应用实例
-const util = require('@/static/utils/util.js');
-const config = require('@/static/config.js');
-import requestConfig from '@/static/lib/requestConfig';
-import Bus from '@/common/bus';
-export default {
-    data(){
-        return {
-            doubleClick:false,
-            height: 0,
-            selfTabbarBottom: '0px',
-            computerHeight: 'calc(100vh - 58px)',
-            statusBarHeight: 0,
-            _scrollDistance: 0, //滑动的距离
-            showShareOptions: false,
-            showOption: true,
-        }
-    },
-    watch:{
-    },
-    methods:{
-        scrollExp(e) {
-            if (e.detail) {
-                this._scrollDistance = e.detail.scrollTop;
-				if(this.old){
-					this.old.scrollTop = e.detail.scrollTop;
-				}
-				if(this._scrollDistance > app.globalData.systemInfo.screenHeight){
-				    this.goTopShow = true;
-				}
-				else{
-				    this.goTopShow = false;
-				}
-                if (this._scrollDistance >= 30) {
-                    this.showNav = true;
-                    if(this.hasOwnProperty('myNavBarData') && this.myNavBarData){
-                        this.myNavBarData.navBarColor = (this.globalCityListConfig && this.globalCityListConfig.backgroundColor) ? this.globalCityListConfig.backgroundColor: '#fff';
-                        if(!this.currentData){
-                            this.pageThemeColor = {
-                                textColor1:'#000'
-                            };
-                        }
-                        this.myNavBarData.titleColor = this.pageThemeColor.textColor1;
-                        this.myNavBarData.title = "城市列表";
-                    }
-                } else {
-                    this.showNav = false;
-                    if(this.hasOwnProperty('myNavBarData') && this.myNavBarData){
-                        this.myNavBarData.navBarColor = 0;
-                        this.myNavBarData.titleColor = '#fff';
-                        this.myNavBarData.title = "";
-                        if(!this.currentData){
-                            this.pageThemeColor = {
-                                textColor1:'#fff'
-                            };
-                        }
-                    }
-                }
-            }
-        },
-        //顶部搜索按钮
-        goToSearch(type=1) {
-            // let url = '/subPackage/pages/searchCondition/searchCondition';
-            let url = "/subPackage/pages/searchNewModule/searchNewModule";
-            if(type==2){//新版的搜索页面
-                url = "/subPackage/pages/searchNewModule/searchNewModule"
-            }
-            uni.navigateTo({
-                url: url,
-                success: () => {},
-            });
-        },
-        //切换城市
-        navigateToCity(e) {
-            uni.navigateTo({
-                url: '/subPackage/pages/addressModule/addressModule'
-            });
-        },
-        //跳转到筛选页面
-        // navigateToSearch(type) {
-        //     var _url = '/pages/screenSearchListModule/screenSearchListModule';
-        //     if (type) {
-        //         _url = _url + "?openType=" + type;
-        //     }
-        //     uni.navigateTo({
-        //         url: _url
-        //     });
-        // },
-        navigateFuc(e) {
-            let eventOption = {};
-            if (e) {
-                // this.$emit("navigateFuc", e, eventOption);
-                // 发送 navigateFucFromNav 主题 的Bus消息
-                Bus.$emit('navigateFucFromNav', e);
-            }
-        },
-        //颜色值转换
-        hexToRgba(color, opacity) {
-            return util.hexToRgba(color, opacity)
-        },
-        /**
-         * 单页模式
-         */
-        showSingleModel() {
-            app = getApp();
-            let _scene = (app.globalData.launchInfo && app.globalData.launchInfo.scene) ? app.globalData.launchInfo
-                .scene : '';
-            if (_scene == '1154') { //单页模式下设置自定义导航栏无效
-                this.specialHeight = (app.globalData.navigateStatusContainerHeight + 'px');
-                this.specialTop = (app.globalData.navigateStatusContainerHeight + 'px');
-                console.log("this.specialTop", this.specialTop);
-            }
-            this.singlePageStatus = app.globalData.singlePageStatus;
-        },
-        showShareOption() {
-            this.showShareOptions = true;
-        },
-        hidenOption() {
-            this.showOption = true;
-        },
-        getRandomArrayElements(arr, count) {
-            var shuffled = arr.slice(0),
-                i = arr.length,
-                min = i - count,
-                temp, index;
-            while (i-- > min) {
-                index = Math.floor((i + 1) * Math.random());
-                temp = shuffled[index];
-                shuffled[index] = shuffled[i];
-                shuffled[i] = temp;
-            }
-            return shuffled.slice(min);
-        },
-        catchTouchMove: function() {
-        	return false;
-        },
-        //跳转到项目
-        async navigateToProject(e) {
-            var self = this;
-            let houseId = e.currentTarget.dataset.houseid || e.currentTarget.dataset.houseId;
-            let brandId = e.currentTarget.dataset.brandid || e.currentTarget.dataset.brandId || "";
-            let requestData = {
-                houseId: houseId,
-                requestCount: 1,
-                componentCount: 1,
-            };
-            if(this.doubleClick){
-                return false;
-            }
-            this.doubleClick = true;
-            const res = await requestConfig('queryXcxPage', requestData, true);``
-            if (res && res.success && res.single && res.single.jsonString != null) {
-                uni.navigateTo({
-                    url: '/pages/index/index?houseId=' + houseId + "&brandId=" + brandId,
-                    success: function() {},
-                    fail: function(res) {
-                        config.brandId = brandId;
-                        console.log(res)
-                    },
-                    complete() {
-                        self.doubleClick = false;
-                    }
-                })
-            } else {
-                uni.showToast({
-                    title: '敬请期待',
-                    icon: 'none',
-                    duration: 1500,
-                })
-                this.doubleClick = false;
-            }
-        },
-        async queryCityNews() {
-            let res = await requestConfig('queryCityNews', {
-                brandId: config.brandId,
-                cityName: this.currentCity
-            })
-            if (res && res.success) {
-                res.list.sort((a, b) => {
-                    return a.orderNumber - b.orderNumber
-                })
-                this.newsList = res.list.splice(0, 2)
-            }
-        },
-        async goNews(e) {
-            const data = e;
-            var _link = "";
-            var _title = "";
-            if (data.type == 3) {
-                _link = data.newsUrl;
-                _title = data.title;
-            } else if (data.type == 1 || !data.type) {
-                _link = data.linkUrl;
-                _title = data.title;
-            } else {
-                let res = await requestConfig('queryNewsById', {
-                    id: data.referNewsId
-                })
-                if (res.success && res.single) {
-                    if (res.single.type == 5) {
-                        _link = res.single.newsUrl;
-                        _title = res.single.title;
-                    } else {
-                        _link = res.single.linkUrl;
-                        _title = res.single.title;
-                    }
-                }
-            }
-            let token = data.linkUrl.split('?newsToken=')[1] || '';
-            app.checkNewsStatus(token, () => {
-                if (data.content && data.content.length > 0) {
-                    let path = '/subPackage/pages/news/newsDetail/newsDetail?newsToken=' + token;
-                    console.log("path", path);
-                    uni.navigateTo({
-                        url: path,
-                        fail: function(res) {
-                            console.log(res)
-                        },
-                    })
-                } else {
-                    if (app.checkWebviewLink(_link)) {
-                        uni.showToast({
-                            title: '敬请期待',
-                            icon: 'none',
-                            duration: 1500,
-                        })
-                    } else {
-                        uni.navigateTo({
-                            url: '/pages/webView/webView?view=' + encodeURIComponent(_link) +
-                                '&title=' + _title,
-                            fail: function(res) {
-                                console.log(res)
-                            },
-                        })
-                    }
-                }
-            }, () => {
-                uni.showToast({
-                    title: '该页面已下线',
-                    icon: 'none',
-                    duration: 1500,
-                })
-            });
-        },
-        getDeviceInfor: function() {
-            const res = uni.getSystemInfoSync();
-            if (res.model.indexOf('iPhone') >= 0) {
-                this.selfTabbarBottom = '0px';
-                this.computerHeight = 'calc(100vh - 58px - 0px)';
-            }
-            this.height = app.globalData.navigateStatusContainerHeight;
-            this.statusBarHeight = app.globalData.statusBarHeight;
-            console.log("getDeviceInfor", res);
-        },
-    }
-}

+ 0 - 245
common/permission.js

@@ -1,245 +0,0 @@
-/// null = 未请求,1 = 已允许,0 = 拒绝|受限, 2 = 系统未开启
-
-var isIOS
-
-function album() {
-    var result = 0;
-    var PHPhotoLibrary = plus.ios.import("PHPhotoLibrary");
-    var authStatus = PHPhotoLibrary.authorizationStatus();
-    if (authStatus === 0) {
-        result = null;
-    } else if (authStatus == 3) {
-        result = 1;
-    } else {
-        result = 0;
-    }
-    plus.ios.deleteObject(PHPhotoLibrary);
-    return result;
-}
-
-function camera() {
-    var result = 0;
-    var AVCaptureDevice = plus.ios.import("AVCaptureDevice");
-    var authStatus = AVCaptureDevice.authorizationStatusForMediaType('vide');
-    if (authStatus === 0) {
-        result = null;
-    } else if (authStatus == 3) {
-        result = 1;
-    } else {
-        result = 0;
-    }
-    plus.ios.deleteObject(AVCaptureDevice);
-    return result;
-}
-
-function location() {
-    var result = 0;
-    var cllocationManger = plus.ios.import("CLLocationManager");
-    var enable = cllocationManger.locationServicesEnabled();
-    var status = cllocationManger.authorizationStatus();
-    if (!enable) {
-        result = 2;
-    } else if (status === 0) {
-        result = null;
-    } else if (status === 3 || status === 4) {
-        result = 1;
-    } else {
-        result = 0;
-    }
-    plus.ios.deleteObject(cllocationManger);
-    return result;
-}
-
-function push() {
-    var result = 0;
-    var UIApplication = plus.ios.import("UIApplication");
-    var app = UIApplication.sharedApplication();
-    var enabledTypes = 0;
-    if (app.currentUserNotificationSettings) {
-        var settings = app.currentUserNotificationSettings();
-        enabledTypes = settings.plusGetAttribute("types");
-        if (enabledTypes == 0) {
-            result = 0;
-            console.log("推送权限没有开启");
-        } else {
-            result = 1;
-            console.log("已经开启推送功能!")
-        }
-        plus.ios.deleteObject(settings);
-    } else {
-        enabledTypes = app.enabledRemoteNotificationTypes();
-        if (enabledTypes == 0) {
-            result = 3;
-            console.log("推送权限没有开启!");
-        } else {
-            result = 4;
-            console.log("已经开启推送功能!")
-        }
-    }
-    plus.ios.deleteObject(app);
-    plus.ios.deleteObject(UIApplication);
-    return result;
-}
-
-function contact() {
-    var result = 0;
-    var CNContactStore = plus.ios.import("CNContactStore");
-    var cnAuthStatus = CNContactStore.authorizationStatusForEntityType(0);
-    if (cnAuthStatus === 0) {
-        result = null;
-    } else if (cnAuthStatus == 3) {
-        result = 1;
-    } else {
-        result = 0;
-    }
-    plus.ios.deleteObject(CNContactStore);
-    return result;
-}
-
-function record() {
-    var result = null;
-    var avaudiosession = plus.ios.import("AVAudioSession");
-    var avaudio = avaudiosession.sharedInstance();
-    var status = avaudio.recordPermission();
-    console.log("permissionStatus:" + status);
-    if (status === 1970168948) {
-        result = null;
-    } else if (status === 1735552628) {
-        result = 1;
-    } else {
-        result = 0;
-    }
-    plus.ios.deleteObject(avaudiosession);
-    return result;
-}
-
-function calendar() {
-    var result = null;
-    var EKEventStore = plus.ios.import("EKEventStore");
-    var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(0);
-    if (ekAuthStatus == 3) {
-        result = 1;
-        console.log("日历权限已经开启");
-    } else {
-        console.log("日历权限没有开启");
-    }
-    plus.ios.deleteObject(EKEventStore);
-    return result;
-}
-
-function memo() {
-    var result = null;
-    var EKEventStore = plus.ios.import("EKEventStore");
-    var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(1);
-    if (ekAuthStatus == 3) {
-        result = 1;
-        console.log("备忘录权限已经开启");
-    } else {
-        console.log("备忘录权限没有开启");
-    }
-    plus.ios.deleteObject(EKEventStore);
-    return result;
-}
-
-
-function requestIOS(permissionID) {
-    return new Promise((resolve, reject) => {
-        switch (permissionID) {
-            case "push":
-                resolve(push());
-                break;
-            case "location":
-                resolve(location());
-                break;
-            case "record":
-                resolve(record());
-                break;
-            case "camera":
-                resolve(camera());
-                break;
-            case "album":
-                resolve(album());
-                break;
-            case "contact":
-                resolve(contact());
-                break;
-            case "calendar":
-                resolve(calendar());
-                break;
-            case "memo":
-                resolve(memo());
-                break;
-            default:
-                resolve(0);
-                break;
-        }
-    });
-}
-
-function requestAndroid(permissionID) {
-    return new Promise((resolve, reject) => {
-        plus.android.requestPermissions(
-            [permissionID],
-            function(resultObj) {
-                var result = 0;
-                for (var i = 0; i < resultObj.granted.length; i++) {
-                    var grantedPermission = resultObj.granted[i];
-                    console.log('已获取的权限:' + grantedPermission);
-                    result = 1
-                }
-                for (var i = 0; i < resultObj.deniedPresent.length; i++) {
-                    var deniedPresentPermission = resultObj.deniedPresent[i];
-                    console.log('拒绝本次申请的权限:' + deniedPresentPermission);
-                    result = 0
-                }
-                for (var i = 0; i < resultObj.deniedAlways.length; i++) {
-                    var deniedAlwaysPermission = resultObj.deniedAlways[i];
-                    console.log('永久拒绝申请的权限:' + deniedAlwaysPermission);
-                    result = -1
-                }
-                resolve(result);
-            },
-            function(error) {
-                console.log('result error: ' + error.message)
-                resolve({
-                    code: error.code,
-                    message: error.message
-                });
-            }
-        );
-    });
-}
-
-function gotoAppPermissionSetting() {
-    if (permission.isIOS) {
-        var UIApplication = plus.ios.import("UIApplication");
-        var application2 = UIApplication.sharedApplication();
-        var NSURL2 = plus.ios.import("NSURL");
-        var setting2 = NSURL2.URLWithString("app-settings:");
-        application2.openURL(setting2);
-        plus.ios.deleteObject(setting2);
-        plus.ios.deleteObject(NSURL2);
-        plus.ios.deleteObject(application2);
-    } else {
-        var Intent = plus.android.importClass("android.content.Intent");
-        var Settings = plus.android.importClass("android.provider.Settings");
-        var Uri = plus.android.importClass("android.net.Uri");
-        var mainActivity = plus.android.runtimeMainActivity();
-        var intent = new Intent();
-        intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
-        var uri = Uri.fromParts("package", mainActivity.getPackageName(), null);
-        intent.setData(uri);
-        mainActivity.startActivity(intent);
-    }
-}
-
-const permission = {
-    get isIOS(){
-        return typeof isIOS === 'boolean' ? isIOS : (isIOS = uni.getSystemInfoSync().platform === 'ios')
-    },
-    requestIOS: requestIOS,
-    requestAndroid: requestAndroid,
-    gotoAppSetting: gotoAppPermissionSetting
-}
-
-export default permission

File diff suppressed because it is too large
+ 0 - 3
common/static/crypto-js.min.js


+ 0 - 20
common/static/customicons.css

@@ -1,20 +0,0 @@
-@font-face {
-  font-family: "customicons"; /* Project id 2878519 */
-  src:url('/static/customicons.ttf') format('truetype');
-}
-
-.customicons {
-  font-family: "customicons" !important;
-}
-
-.youxi:before {
-  content: "\e60e";
-}
-
-.wenjian:before {
-  content: "\e60f";
-}
-
-.zhuanfa:before {
-  content: "\e610";
-}

二進制
common/static/customicons.ttf


+ 0 - 463
common/static/im/newIM_init.js

@@ -1,463 +0,0 @@
-var TIM = require('./tim-wx.js');
-var config = require('@/static/config.js');
-import requestConfig from '@/static/lib/requestConfig.js';
-var app, tim;
-var SDKConfig = {
-    sdkappid: config.sdkAppID,
-    accountType: config.accType,
-    accountMode: 0 //帐号模式,0-表示独立模式,1-表示托管模式
-};
-var event = {
-    onIMReady: function() {
-
-    },
-    onGetPusherList: function() {}, // 初始化成员列表
-    onPusherJoin: function() {}, // 进房通知
-    onPusherQuit: function() {}, // 退房通知
-    onRoomClose: function() {}, // 群解散通知
-    onRecvRoomTextMsg: function() {}, // 消息通知
-    onMsgNotify: function() {}, // 监听新消息(私聊(包括普通消息和全员推送消息),普通群(非直播聊天室)消息)事件,必填
-    onDestoryGroupNotify: function() {}, //群被解散(全员接收) 5
-    onCustomGroupNotify: function() {}, //用户自定义通知(默认全员接收) 255
-    onLoginSuccess: function() {}, //IM 登录成功的回调
-    onBigGroupMsgNotify: function() {}, //监听新消息(大群)事件
-};
-
-function handleUnreadMsg(msg) {
-    console.log('处理全局未读消息')
-    if (msg.from === app.globalData.single.id + '_' + config.brandId + '_1') {
-        return false
-    }
-    var adviserHouseId = msg.from.split("_")[1];
-    if (!adviserHouseId) {
-        return
-    }
-    var unReadMsgs = uni.getStorageSync('unReadMsgs') || {};
-    var currentHouseUnReadMsgs = unReadMsgs[adviserHouseId] || {};//项目下消息数目
-    unReadMsgs.total = unReadMsgs.total ? unReadMsgs.total : 0;
-    currentHouseUnReadMsgs.total = currentHouseUnReadMsgs.total ? currentHouseUnReadMsgs.total : 0;
-    unReadMsgs['total']++;
-    currentHouseUnReadMsgs['total']++;
-    let list = getCurrentPages();
-    if (!currentHouseUnReadMsgs[msg.from]) {//项目未读消息下 对应 具体的顾问
-        currentHouseUnReadMsgs[msg.from] = 1;
-    } else {
-        currentHouseUnReadMsgs[msg.from]++;
-        console.log(unReadMsgs[msg.from], '今天你增加了吗')
-    }
-    console.log('未读计数增加', list)
-    unReadMsgs[adviserHouseId] = currentHouseUnReadMsgs
-    uni.setStorageSync('unReadMsgs', unReadMsgs)
-    list.forEach((item, index) => {
-        console.log(item, 'bpbpbpbpbp')
-        if (item.$vm && item.$vm.refreshNumber && typeof item.$vm.refreshNumber === 'function') {
-            console.log('户型图集增加', unReadMsgs)
-            item.$vm.refreshNumber()
-        }
-    })
-    console.log('全局未读消息处理完毕')
-}
-
-function msgReceived(msg) {
-	// 实例化 对象
-	var myMsg = JSON.parse(JSON.stringify(msg));
-    console.log('接收到最新消息', myMsg)
-    console.log('接收到最新消息', myMsg.data[0].payload)
-    if (myMsg.data instanceof Array) {
-        myMsg.data.forEach((item, index) => {
-            console.log(item.conversationType)
-            if (item.conversationType == 'GROUP') {
-                console.log('收到群消息,进去处理',item)
-                // event.onBigGroupMsgNotify(item)
-                event.onBigGroupMsgNotify(myMsg.data)
-                parseGroupSystemNotice(item.payload)
-            } else if (item.payload && item.payload.data && item.payload.data.includes('InputStatus')) {
-                console.log('对方键盘事件')
-            } else if (item.conversationType == '@TIM#SYSTEM') {
-                console.log('系统通知@_@')
-                parseGroupSystemNotice(item.payload)
-            } else {
-                console.log('传出去了')
-                handleUnreadMsg(item)
-                console.log('开始传回当前页notify')
-                event.onMsgNotify(item)
-
-            }
-        })
-    }
-
-    // 收到推送的单聊、群聊、群提示、群系统通知的新消息,可通过遍历 event.data 获取消息列表数据并渲染到页面
-    // event.name - TIM.EVENT.MESSAGE_RECEIVED
-    // event.data - 存储 Message 对象的数组 - [Message]
-
-}
-
-function parseGroupSystemNotice(payload) {
-    const groupName =
-        payload.groupProfile.groupName || payload.groupProfile.groupID
-    console.log('审判群组消息类型', payload.operationType)
-    switch (payload.operationType) {
-        case 1:
-            return `申请加入群组:${groupName}`
-        case 2:
-            event.onCustomGroupNotify(payload);
-        case 3:
-            return `申请加入群组:${groupName}被拒绝`
-        case 4:
-            return `被管理员${payload.operatorID}踢出群组:${groupName}`
-        case 5:
-            return `成功加入群组:${groupName}`
-        case 6:
-            return `${payload.operatorID}创建群:${groupName}`
-        case 7:
-            return `${payload.operatorID}邀请你加群:${groupName}`
-        case 8:
-            return `你退出群组:${groupName}`
-        case 9:
-            return `你被${payload.operatorID}设置为群:${groupName}的管理员`
-        case 10:
-            return `你被${payload.operatorID}撤销群:${groupName}的管理员身份`
-        case 255:
-            event.onCustomGroupNotify(payload);
-    }
-}
-
-function loginIM(data) {
-    app = getApp();
-    if (app.globalData.globalWebimhandler) {
-        event.onIMReady()
-        event.onLoginSuccess()
-        return
-    }
-    var loginInfo = {
-        'sdkAppID': SDKConfig.sdkappid, //用户所属应用id,必填
-        'appIDAt3rd': SDKConfig.sdkappid, //用户所属应用id,必填
-        'accountType': SDKConfig.accountType, //用户所属应用帐号类型,必填
-        'identifier': app.globalData.identifier, //当前用户ID,必须是否字符串类型,选填
-        'identifierNick': app.globalData.single.nickname || '小程序用户', //当前用户昵称,选填
-        'userSig': app.globalData.userSig, //当前用户身份凭证,必须是字符串类型,选填
-    };
-    console.log('开始创建im')
-    tim = TIM.create({
-        SDKAppID: config.sdkAppID
-    })
-    tim.setLogLevel(0);
-    // 监听事件,例如:
-    tim.on(TIM.EVENT.SDK_READY, function(msg) {
-        console.log('imReady***')
-        event.onIMReady()
-        console.log('%%%%', event.onIMReady)
-        event.onLoginSuccess && event.onLoginSuccess();
-        app.globalData.globalWebimhandler = true
-    });
-
-    tim.on(TIM.EVENT.MESSAGE_RECEIVED, msgReceived);
-
-    tim.on(TIM.EVENT.MESSAGE_REVOKED, function(event) {
-        // 收到消息被撤回的通知
-        // event.name - TIM.EVENT.MESSAGE_REVOKED
-        // event.data - 存储 Message 对象的数组 - [Message] - 每个 Message 对象的 isRevoked 属性值为 true
-    });
-
-    tim.on(TIM.EVENT.MESSAGE_READ_BY_PEER, function(event) {
-        // SDK 收到对端已读消息的通知,即已读回执。使用前需要将 SDK 版本升级至 v2.7.0 或以上。仅支持单聊会话。
-        // event.name - TIM.EVENT.MESSAGE_READ_BY_PEER
-        // event.data - event.data - 存储 Message 对象的数组 - [Message] - 每个 Message 对象的 isPeerRead 属性值为 true
-    });
-
-    tim.on(TIM.EVENT.CONVERSATION_LIST_UPDATED, function(event) {
-        console.log('监听到会话列表更新', event.data)
-        // 收到会话列表更新通知,可通过遍历 event.data 获取会话列表数据并渲染到页面
-        // event.name - TIM.EVENT.CONVERSATION_LIST_UPDATED
-        // event.data - 存储 Conversation 对象的数组 - [Conversation]
-    });
-
-    tim.on(TIM.EVENT.GROUP_LIST_UPDATED, function(event) {
-        // 收到群组列表更新通知,可通过遍历 event.data 获取群组列表数据并渲染到页面
-        // event.name - TIM.EVENT.GROUP_LIST_UPDATED
-        // event.data - 存储 Group 对象的数组 - [Group]
-    });
-
-    tim.on(TIM.EVENT.PROFILE_UPDATED, function(event) {
-        // 收到自己或好友的资料变更通知
-        // event.name - TIM.EVENT.PROFILE_UPDATED
-        // event.data - 存储 Profile 对象的数组 - [Profile]
-    });
-
-    tim.on(TIM.EVENT.BLACKLIST_UPDATED, function(event) {
-        // 收到黑名单列表更新通知
-        // event.name - TIM.EVENT.BLACKLIST_UPDATED
-        // event.data - 存储 userID 的数组 - [userID]
-    });
-
-    tim.on(TIM.EVENT.ERROR, function(event) {
-        console.log('SDKERROR!!', event)
-        // 收到 SDK 发生错误通知,可以获取错误码和错误信息
-        // event.name - TIM.EVENT.ERROR
-        // event.data.code - 错误码
-        // event.data.message - 错误信息
-    });
-
-    tim.on(TIM.EVENT.SDK_NOT_READY, function(event) {
-        console.log('SDK_NOT_READY!!', event)
-        app.globalData.globalWebimhandler = null;
-        // 收到 SDK 进入 not ready 状态通知,此时 SDK 无法正常工作
-        // event.name - TIM.EVENT.SDK_NOT_READY
-    });
-
-    tim.on(TIM.EVENT.KICKED_OUT, function(event) {
-        // 收到被踢下线通知
-        // event.name - TIM.EVENT.KICKED_OUT
-        // event.data.type - 被踢下线的原因,例如:
-        //    - TIM.TYPES.KICKED_OUT_MULT_ACCOUNT 多实例登录被踢
-        //    - TIM.TYPES.KICKED_OUT_MULT_DEVICE 多终端登录被踢
-        //    - TIM.TYPES.KICKED_OUT_USERSIG_EXPIRED 签名过期被踢 (v2.4.0起支持)。
-    });
-
-    tim.on(TIM.EVENT.NET_STATE_CHANGE, function(event) {
-        //  网络状态发生改变(v2.5.0 起支持)。
-        // event.name - TIM.EVENT.NET_STATE_CHANGE
-        // event.data.state 当前网络状态,枚举值及说明如下:
-        //     \- TIM.TYPES.NET_STATE_CONNECTED - 已接入网络
-        //     \- TIM.TYPES.NET_STATE_CONNECTING - 连接中。很可能遇到网络抖动,SDK 在重试。接入侧可根据此状态提示“当前网络不稳定”或“连接中”
-        //    \- TIM.TYPES.NET_STATE_DISCONNECTED - 未接入网络。接入侧可根据此状态提示“当前网络不可用”。SDK 仍会继续重试,若用户网络恢复,SDK 会自动同步消息
-    });
-    // 开始登录
-    let afterLoginIM = tim.login({
-        userID: loginInfo.identifier,
-        userSig: loginInfo.userSig
-    });
-    afterLoginIM.then((imResponse) => {
-        console.log(imResponse.data, 'niubi'); // 登录成功
-        if (imResponse.data.repeatLogin === true) {
-            data.callback && data.callback()
-            // 标识账号已登录,本次登录操作为重复登录。v2.5.1 起支持
-            console.log(imResponse.data.errorInfo);
-        }
-    }).catch((imError) => {
-        console.warn('login error:', imError); // 登录失败的相关信息
-    })
-}
-
-function logout(callback) {
-    app = getApp();
-    // 退出IM登录
-    tim.logout();
-    console.log('imRoom总im退出登录')
-    app.globalData.globalWebimhandler = null;
-    callback && callback()
-}
-
-function sendCustomMsg(data, type, nickname, callback) {
-    let message = tim.createCustomMessage({
-        to: type.myselToID,
-        conversationType: type.TYPE == 'C2C' ? TIM.TYPES.CONV_C2C : TIM.TYPES.GROUP,
-        // 消息优先级,用于群聊(v2.4.2起支持)。如果某个群的消息超过了频率限制,后台会优先下发高优先级的消息,详细请参考 消息优先级与频率控制
-        // 支持的枚举值:TIM.TYPES.MSG_PRIORITY_HIGH, TIM.TYPES.MSG_PRIORITY_NORMAL(默认), TIM.TYPES.MSG_PRIORITY_LOW, TIM.TYPES.MSG_PRIORITY_LOWEST
-        // priority: TIM.TYPES.MSG_PRIORITY_HIGH,
-        payload: {
-            data: '',
-            description: '',
-            extension: data.ext,
-        }
-    });
-    let promise = tim.sendMessage(message, {
-        // 如果接收方不在线,则消息将存入漫游,且进行离线推送(在接收方 App 退后台或者进程被 kill 的情况下)。接入侧可自定义离线推送的标题及内容
-        offlinePushInfo: {
-            disablePush: false,
-            title: '收到一条新消息', // 离线推送标题
-            description: '请进入APP内查看', // 离线推送内容
-            androidOPPOChannelID: '' // 离线推送设置 OPPO 手机 8.0 系统及以上的渠道 ID
-        }
-    });
-    promise.then((imResponse) => {
-        callback && callback(data)
-    })
-}
-
-function getC2CHistoryMsgs(options) {
-    console.log(tim)
-    let promise = tim.getMessageList({
-        conversationID: 'C2C' + options.adviserId,
-        count: 10,
-        nextReqMessageID: options.nextReqMessageID
-    })
-    promise.then((res) => {
-        console.log('拉取到顾问' + options.adviserId + '的历史消息当前第' + options.nextReqMessageID + '页')
-        console.log(res)
-        options.success && options.success(JSON.parse(JSON.stringify(res.data)))
-    }).catch((err) => {
-        options.fail && options.fail(err)
-    })
-}
-
-function onSendMsg(message, type, nickname, callback, fail) {
-    let Cmessage = tim.createTextMessage({
-        to: type.myselToID,
-        conversationType: type.TYPE == 'C2C' ? TIM.TYPES.CONV_C2C : TIM.TYPES.GROUP,
-        // 消息优先级,用于群聊(v2.4.2起支持)。如果某个群的消息超过了频率限制,后台会优先下发高优先级的消息,详细请参考 消息优先级与频率控制
-        // 支持的枚举值:TIM.TYPES.MSG_PRIORITY_HIGH, TIM.TYPES.MSG_PRIORITY_NORMAL(默认), TIM.TYPES.MSG_PRIORITY_LOW, TIM.TYPES.MSG_PRIORITY_LOWEST
-        // priority: TIM.TYPES.MSG_PRIORITY_HIGH,
-        payload: {
-            text: message
-        }
-    });
-    let promise = tim.sendMessage(Cmessage);
-    promise.then((imResponse) => {
-        console.log('发送完毕', imResponse)
-        callback && callback({
-            content: message
-        })
-    }).catch((err) => {})
-}
-
-function getRecentContactList(data, callback) {
-    let promise = tim.getConversationList();
-    promise.then(function(imResponse) {
-        const conversationList = imResponse.data.conversationList; // 会话列表,用该列表覆盖原有的会话列表
-        callback && callback(conversationList.filter((item) => {
-            return item.type !== '@TIM#SYSTEM'
-        }))
-    }).catch(function(imError) {
-        console.warn('getConversationList error:', imError); // 获取会话列表失败的相关信息
-    });
-}
-
-function onBigGroupMsgNotify() {
-
-}
-
-function parseGroupTipContent(payload) {
-
-    switch (payload.operationType) {
-        case this.TIM.TYPES.GRP_TIP_MBR_JOIN:
-            return `群成员:${payload.userIDList.join(',')},加入群组`
-        case this.TIM.TYPES.GRP_TIP_MBR_QUIT:
-            return `群成员:${payload.userIDList.join(',')},退出群组`
-        case this.TIM.TYPES.GRP_TIP_MBR_KICKED_OUT:
-            return `群成员:${payload.userIDList.join(',')},被${payload.operatorID}踢出群组`
-        case this.TIM.TYPES.GRP_TIP_MBR_SET_ADMIN:
-            return `群成员:${payload.userIDList.join(',')},成为管理员`
-        case this.TIM.TYPES.GRP_TIP_MBR_CANCELED_ADMIN:
-            return `群成员:${payload.userIDList.join(',')},被撤销管理员`
-        default:
-            return '[群提示消息]'
-    }
-}
-
-function setListener(options) {
-    if (!options) {
-        console.log('setListener参数错误', options);
-        return;
-    }
-    event.onGetPusherList = options.onGetPusherList || function() {};
-    event.onIMReady = options.onIMReady || function() {};
-    event.onPusherJoin = options.onPusherJoin || function() {};
-    event.onPusherQuit = options.onPusherQuit || function() {};
-    event.onRoomClose = options.onRoomClose || function() {};
-    event.onRecvRoomTextMsg = options.onRecvRoomTextMsg || function() {};
-    event.onMsgNotify = options.onMsgNotify || function() {}; // 监听新消息(私聊(包括普通消息和全员推送消息),普通群(非直播聊天室)消息)事件,必填
-    event.onDestoryGroupNotify = options.onDestoryGroupNotify || function() {}; //群被解散(全员接收) 5
-    event.onCustomGroupNotify = options.onCustomGroupNotify || function() {}; //用户自定义通知(默认全员接收) 255
-    event.onLoginSuccess = options.onLoginSuccess || function() {}; //IM 登录成功的回调
-    event.onBigGroupMsgNotify = options.onBigGroupMsgNotify || function() {}; //监听新消息(大群)事件,必填
-}
-
-function applyJoinBigGroup(roomID, callback, callbackOptions) {
-    let res = tim.joinGroup({
-        groupID: roomID,
-        applyMessage: '视频通话申请加群',
-        type: TIM.TYPES.GRP_AVCHATROOM
-    })
-    res.then((imResponse) => {
-        console.log(imResponse, '群组资料')
-        switch (imResponse.data.status) {
-            case TIM.TYPES.JOIN_STATUS_WAIT_APPROVAL:
-                break; // 等待管理员同意
-            case TIM.TYPES.JOIN_STATUS_SUCCESS: // 加群成功
-                console.log('关键步骤:加群成功!')
-                callback && callback({
-                    errCode: 0,
-                    callback: callbackOptions
-                });
-                console.log(imResponse.data.group, '00000'); // 加入的群组资料
-                break;
-            case TIM.TYPES.JOIN_STATUS_ALREADY_IN_GROUP: // 已经在群中
-                console.log('关键步骤:加群成功2!')
-                callback && callback({
-                    errCode: 0,
-                    callback: callbackOptions
-                });
-                break;
-            default:
-                console.log('关键步骤:加群成功3!')
-                break;
-        }
-    }).catch(function(imError) {
-        console.warn('joinGroup error:', imError); // 申请加群失败的相关信息
-    });
-}
-
-async function createBigGroup(options, cb) {
-	console.log(options.roomID, '为什么要自动id?')
-	// tim.createGroup({
-	//     groupID: options.roomID,
-	//     type: TIM.TYPES.GRP_AVCHATROOM,//直播群
-	//     maxMemberNum: 500,
-	//     name: options.roomName || '',
-	//     memberList: [],
-	// }).then((imResponse) => {
-	//     cb(imResponse)
-	//     console.log(imResponse.data.group, '新版建群成功'); // 创建的群的资料
-	// }).catch(function(imError) {
-	//     console.warn('createGroup error:', imError); // 创建群组失败的相关信息
-	// })
-	// 这里是管理员创建的群,已经不是当前用户创建群的逻辑了
-	var res = await requestConfig('createGroup', {
-		groupID: options.roomID,
-		type: TIM.TYPES.GRP_AVCHATROOM,//直播群
-		maxMemberNum: 500,
-		name: options.roomName || '',
-		memberList: []
-	}, true);
-	if (res && res.success) {
-		cb()
-		console.log(options, '新版建群成功'); // 创建的群的资料
-	}
-	else{
-		console.warn('createGroup error:', res.message); // 创建群组失败的相关信息
-	}
-}
-
-function quitBigGroup(groupID) {
-    tim.quitGroup(groupID).then((res) => {
-        console.log('退出群成功')
-    });
-	// var res = await requestConfig('deleteGroupMember', {
-	// 	groupId: groupID,
-	// }, true);
-}
-
-function destroyGroup(groupID) {
-    // tim.dismissGroup(groupID).then((res) => {
-    //     console.log('解散群成功')
-    // });
-	// 管理员建群,必须是管理员销毁-此处就是调接口,让管理员销毁群
-	requestConfig('destroyGroup', {
-		groupId: groupID,
-	}, true);
-}
-module.exports = {
-    loginIM: loginIM, // 登陆IM
-    setListener: setListener,
-    logout: logout,
-    sendCustomMsg: sendCustomMsg,
-    onSendMsg: onSendMsg,
-    applyJoinBigGroup: applyJoinBigGroup,
-    quitBigGroup: quitBigGroup,
-    destroyGroup: destroyGroup,
-    getRecentContactList: getRecentContactList,
-    onBigGroupMsgNotify: onBigGroupMsgNotify,
-    getC2CHistoryMsgs: getC2CHistoryMsgs,
-    createBigGroup: createBigGroup
-}

+ 0 - 284
common/static/im/tim-handler.js

@@ -1,284 +0,0 @@
-/**
- * tim v2.7.6
- */
-const TIM = require('./tim-wx.js');
-let selToID
-    ,loginInfo
-    ,sdkAppID
-    ,avChatRoomId
-    ,selSess
-    ,tim
-;
-
-function sdkLogin(userInfo,  avChatRoomId, callback, callbackOptions) {
-    tim.login({userID: userInfo.identifier, userSig: userInfo.userSig})
-        .then(()=> {
-            //登录成功 加入大群
-            loginInfo = userInfo;
-            avChatRoomId = avChatRoomId;
-            callback & callback({
-                callback: callbackOptions
-            });
-
-        })
-        .catch((err) => {
-            callback & callback({
-                errCode: err,
-                errMsg: err.ErrorInfo,
-                callback: callbackOptions
-            });
-        });
-}
-
-
-// 创建群
-function createBigGroup(options, callback, callbackOptions) {
-    avChatRoomId = options.roomID;
-    tim.createGroup({
-        groupID: options.roomID,
-        type: TIM.TYPES.GRP_AVCHATROOM,
-        maxMemberNum:500,
-        name: options.roomName || '',
-        memberList: [],
-    })
-        .then(()=> { // 创建成功
-            selToID = options.roomID;
-            tim.joinGroup({ groupID: options.roomID, type: TIM.TYPES.GRP_AVCHATROOM })
-                .then(function(imResponse) {
-                    callback && callback({
-                        errCode: 0,
-                        callback: callbackOptions
-                    });
-                })
-        })
-        .catch((ret) => {
-            callback && callback({
-                errCode: ret.ErrorCode,
-                errMsg: ret.err_msg,
-                callback: callbackOptions
-            });
-        })
-}
-
-//进入群
-function applyJoinBigGroup(groupId, callback, callbackOptions) {
-    selSess = null;
-    tim.joinGroup({ groupID: groupId, type: TIM.TYPES.GRP_AVCHATROOM })
-        .then(function(imResponse) {
-            console.log(imResponse.data,'申请加群核心回调')
-            switch (imResponse.data.status) {
-                case TIM.TYPES.JOIN_STATUS_WAIT_APPROVAL: // 等待管理员同意
-                    break;
-                case TIM.TYPES.JOIN_STATUS_SUCCESS: // 加群成功
-                    selToID = groupId;
-                    callback && callback({
-                        errCode: 0,
-                        callback: callbackOptions
-                    });
-                    console.log(imResponse.data.group); // 加入的群组资料
-                    break;
-                case TIM.TYPES.JOIN_STATUS_ALREADY_IN_GROUP: // 已经在群中
-                    callback && callback({
-                        errCode: 666,
-                        callback: callbackOptions
-                    });
-                    break;
-                default:
-                    break;
-            }
-        }).catch(function(err){
-        console.error('进群请求失败', err.ErrorInfo);
-        callback && callback({
-            errCode: 999,
-            errMsg: err.ErrorInfo || 'IM进群失败',
-            callback: callbackOptions
-        });
-        console.warn('joinGroup error:', err); // 申请加群失败的相关信息
-    });
-}
-
-
-// 连麦发送自定义消息
-function sendC2CCustomMsg(toUserID, msg, callback) {
-    console.log('tim-handler发送自定义',msg,toUserID)
-    let form = {
-        data: msg.data || '',
-        description: msg.desc || '',
-        extension: msg.ext || ''
-    }
-    if (
-        form.data.length === 0 &&
-        form.description.length === 0 &&
-        form.extension.length === 0
-    ) {
-        return
-    }
-    let conversationType = form.data.includes('linkmic') ? TIM.TYPES.CONV_C2C : TIM.TYPES.CONV_GROUP
-    const message = tim.createCustomMessage({
-        to: toUserID,
-        conversationType: conversationType,
-        payload: {
-            data: form.data,
-            description: form.description,
-            extension: form.extension
-        }
-    })
-    tim.sendMessage(message,{
-        // 如果接收方不在线,则消息将存入漫游,且进行离线推送(在接收方 App 退后台或者进程被 kill 的情况下)。接入侧可自定义离线推送的标题及内容
-        offlinePushInfo: {
-            disablePush:false,
-            title: '收到一条新消息', // 离线推送标题
-            description: '请进入APP内查看', // 离线推送内容
-            androidOPPOChannelID: '' // 离线推送设置 OPPO 手机 8.0 系统及以上的渠道 ID
-        }
-    })
-        .then(() => {
-            console.log('发自定义消息成功');
-            callback && callback({
-                errCode: 0,
-                errMsg: ""
-            });
-        })
-        .catch(err => {
-            console.error('发自定义消息失败:', err);
-            callback && callback({
-                errCode: -1,
-                errMsg: '发自定义消息失败:' + err.ErrorInfo
-            });
-        })
-    Object.assign(form, {
-        data: '',
-        description: '',
-        extension: ''
-    })
-}
-
-//发送文本消息
-function sendTextMessage(msg,userInfo,callback) {
-    console.log('tim-handler普通消息',msg)
-    let message = tim.createCustomMessage({
-        to: msg.to,
-        conversationType: TIM.TYPES.CONV_GROUP,
-        // 消息优先级,用于群聊(v2.4.2起支持)。如果某个群的消息超过了频率限制,后台会优先下发高优先级的消息,详细请参考:https://cloud.tencent.com/document/product/269/3663#.E6.B6.88.E6.81.AF.E4.BC.98.E5.85.88.E7.BA.A7.E4.B8.8E.E9.A2.91.E7.8E.87.E6.8E.A7.E5.88.B6)
-        // 支持的枚举值:TIM.TYPES.MSG_PRIORITY_HIGH, TIM.TYPES.MSG_PRIORITY_NORMAL(默认), TIM.TYPES.MSG_PRIORITY_LOW, TIM.TYPES.MSG_PRIORITY_LOWEST
-        // priority: TIM.TYPES.MSG_PRIORITY_NORMAL,
-        payload: {
-            description:msg.text,
-            extension: msg.text,
-            data:'{"cmd":"CustomTextMsg","data":{"nickName":"'+userInfo.userName+'","headPic":"'+userInfo.userAvatar+'"}}'
-        }
-    });
-// 2. 发送消息
-    tim.sendMessage(message,{
-        // 如果接收方不在线,则消息将存入漫游,且进行离线推送(在接收方 App 退后台或者进程被 kill 的情况下)。接入侧可自定义离线推送的标题及内容
-        offlinePushInfo: {
-            disablePush:false,
-            title: '收到一条新消息', // 离线推送标题
-            description: '请进入APP内查看', // 离线推送内容
-            androidOPPOChannelID: '' // 离线推送设置 OPPO 手机 8.0 系统及以上的渠道 ID
-        }
-    })
-        .then(function(imResponse) {
-            // 发送成功
-            console.log(imResponse,'文本消息发送成功');
-            callback && callback();
-        }).catch(function(imError) {
-        // 发送失败
-        console.warn('sendMessage error:', imError);
-    });
-
-}
-//发送文本消息
-function sendTextNewMessage(msg,userInfo,callback) {
-    console.log('tim-handler普通消息',msg)
-    let message = tim.createTextMessage({
-        to: msg.to,
-        conversationType: TIM.TYPES.CONV_GROUP,
-        // 消息优先级,用于群聊(v2.4.2起支持)。如果某个群的消息超过了频率限制,后台会优先下发高优先级的消息,详细请参考:https://cloud.tencent.com/document/product/269/3663#.E6.B6.88.E6.81.AF.E4.BC.98.E5.85.88.E7.BA.A7.E4.B8.8E.E9.A2.91.E7.8E.87.E6.8E.A7.E5.88.B6)
-        // 支持的枚举值:TIM.TYPES.MSG_PRIORITY_HIGH, TIM.TYPES.MSG_PRIORITY_NORMAL(默认), TIM.TYPES.MSG_PRIORITY_LOW, TIM.TYPES.MSG_PRIORITY_LOWEST
-        // priority: TIM.TYPES.MSG_PRIORITY_NORMAL,
-        payload: {
-            text:'{"cmd":"CustomTextMsg","data":{"userName":"'+userInfo.userName+'","nickName":"'+userInfo.userName+'","headPic":"'+userInfo.userAvatar+'","text":"'+msg.text+'"}}'
-        }
-    });
-// 2. 发送消息
-    tim.sendMessage(message,{
-        // 如果接收方不在线,则消息将存入漫游,且进行离线推送(在接收方 App 退后台或者进程被 kill 的情况下)。接入侧可自定义离线推送的标题及内容
-        offlinePushInfo: {
-            disablePush:false,
-            title: '', // 离线推送标题
-            description: '', // 离线推送内容
-            androidOPPOChannelID: '' // 离线推送设置 OPPO 手机 8.0 系统及以上的渠道 ID
-        }
-    })
-        .then(function(imResponse) {
-            // 发送成功
-            console.log(imResponse,'文本消息发送成功');
-            callback && callback();
-        }).catch(function(imError) {
-        // 发送失败
-        console.warn('sendMessage error:', imError);
-    });
-
-}
-
-
-
-// 解散群
-function destroyGroup() {
-    tim.dismissGroup(avChatRoomId)
-        .then(function(imResponse) { // 解散成功
-            avChatRoomId = '';
-            console.log(imResponse.data.groupID,'解散成功'); // 被解散的群组 ID
-        }).catch(function(imError) {
-        console.warn('dismissGroup error:', imError); // 解散群组失败的相关信息
-    });
-}
-
-
-//退出群
-function quitBigGroup() {
-    if(avChatRoomId){
-        tim.quitGroup(avChatRoomId)
-            .then(function(imResponse) {
-                console.log(imResponse.data.groupID, 'IM退群成功'); // 退出成功的群 ID
-            }).catch(function(imError){
-            console.warn('quitGroup error:', imError); // 退出群组失败的相关信息
-        })
-    }
-}
-
-//登出
-function logout() {
-    //登出
-    tim.logout()
-        .then(function(imResponse) {
-            console.log(imResponse.data,'IM登出成功'); // 登出成功
-            if(loginInfo) {
-                loginInfo.identifier = null;
-                loginInfo.userSig = null;
-            }
-        }).catch(function(imError) {
-        console.warn('logout error:', imError);
-    })
-}
-
-function init(opts){
-    sdkAppID = opts.sdkAppID;
-    avChatRoomId = opts.avChatRoomId || 0;
-    selToID = opts.selToID;
-    // 初始化 SDK 实例
-    tim = opts.tim;
-}
-module.exports = {
-    init : init,
-    sdkLogin : sdkLogin,
-    createBigGroup : createBigGroup,
-    applyJoinBigGroup : applyJoinBigGroup,
-    sendC2CCustomMsg : sendC2CCustomMsg,
-    sendTextMessage : sendTextMessage,
-    sendTextNewMessage : sendTextNewMessage,
-    quitBigGroup : quitBigGroup,
-    destroyGroup : destroyGroup,
-    logout : logout,
-};

File diff suppressed because it is too large
+ 0 - 1
common/static/im/tim-wx.js


File diff suppressed because it is too large
+ 0 - 1
common/static/json/wow-emoji.json


+ 0 - 76
common/static/lib/intersection-observer.js

@@ -1,76 +0,0 @@
-export default class BadIntersectionObserver {
-    constructor(options) {
-        this.$options = {
-            context: null,
-            selector: null,
-            onEach: res => res.dataset,
-            onFinal: () => null,
-            relativeTo: null,
-            threshold: 0.5,
-            delay: 200,
-            observeAll: false,
-            initialRatio: 0,
-            ...options,
-        }
-        this.$observer = null
-    }
-
-    connect() {
-        if (this.$observer) return this
-        this.$observer = this._createObserver()
-        return this
-    }
-
-    reconnect() {
-        this.disconnect()
-        this.connect()
-    }
-
-    disconnect() {
-        if (!this.$observer) return
-        const ob = this.$observer
-        if (ob.$timer) clearTimeout(ob.$timer)
-        ob.disconnect()
-        this.$observer = null
-    }
-
-    _createObserver() {
-        const opt = this.$options
-        const observerOptions = {
-            thresholds: [opt.threshold],
-            observeAll: opt.observeAll,
-            initialRatio: opt.initialRatio,
-        }
-
-        // 创建监听器
-        const ob = uni.createIntersectionObserver(opt.context, observerOptions)
-
-        // 相交区域设置
-        if (opt.relativeTo) ob.relativeTo(opt.relativeTo)
-        else ob.relativeToViewport()
-
-        // 开始监听
-        // let finalData = []
-        // let isCollecting = false
-        ob.observe(opt.selector, res => {
-            const {
-                intersectionRatio
-            } = res
-            const visible = intersectionRatio >= opt.threshold
-            if (!visible) return
-
-            const data = opt.onEach(res)
-            // finalData.push(data)
-
-            // if (isCollecting) return
-            // isCollecting = true
-
-            // setTimeout(() => {
-            //     opt.onFinal.call(null, finalData)
-            //     finalData = []
-            //     isCollecting = false
-            // }, opt.delay)
-        })
-        return ob
-    }
-}

File diff suppressed because it is too large
+ 0 - 10
common/static/lib/lottie-miniprogram.js


+ 0 - 7
common/static/lib/promisify.js

@@ -1,7 +0,0 @@
-module.exports = (api) => {
-    return (options, ...params) => {
-        return new Promise((resolve, reject) => {
-            api(Object.assign({}, options, { success: resolve, fail: reject }), ...params);
-        });
-    }
-}

+ 0 - 160
common/static/lib/report.js

@@ -1,160 +0,0 @@
-/**
- * 连通上报js
- */
-var str_appid = 1252463788,
-    str_platform = 'weixin',
-    str_appversion = '1.2.477',
-    str_sdkversion = '',
-    str_common_version = '',
-    str_nickname = '',
-    str_device = '',
-    str_device_type = '',
-    reportData = {
-      str_roomid: '',
-      str_room_creator: '',
-      str_userid: '',
-      str_play_info: '',
-      str_push_info: '',
-      int64_ts_enter_room: -99999,
-      int64_tc_join_group: -99999,
-      int64_tc_get_pushers: -99999,
-      int64_tc_play_stream: -99999,
-      int64_tc_get_pushurl: -99999,
-      int64_tc_push_stream: -99999,
-      int64_tc_add_pusher: -99999,
-      int64_tc_enter_room: -99999
-    },
-    streamData = {
-      int64_ts_add_pusher: 0,
-      int64_ts_play_stream: 0
-    }
-
-// 获取用户信息
-// wx.getUserInfo({
-//   withCredentials: false,
-//   success: function (ret) {
-//     str_nickname = ret.userInfo.nickName;
-//   }
-// });
-// 获取设备信息
-var systemInfo = wx.getSystemInfoSync();
-str_sdkversion = systemInfo.version;
-str_common_version = systemInfo.SDKVersion;
-str_device = systemInfo.model;
-str_device_type = systemInfo.system;
-
-
-/**
- * 设置参数
- */
-function setReportData(options) {
-  // 第一次进来重置数据
-  if (options.int64_ts_enter_room) {
-    console.log('第一次进来重置数据');
-    clearData();
-  }
-  for(var item in reportData) {
-    if(options[item]) {
-      reportData[item] = options[item];
-    }
-  }
-  for (var item in streamData) {
-    if (options[item]) {
-      streamData[item] = options[item];
-    }
-  }
-  // console.warn('上报数据: ', reportData, streamData);
-  // 连通率上报前做负值判断
-  for (var item in reportData) {
-    if (!isNaN(reportData[item]) && item != 'int64_tc_enter_room' && reportData[item] < 0)
-      return;
-  } 
-  if (streamData.int64_ts_add_pusher && streamData.int64_ts_play_stream) {
-    reportData.int64_tc_enter_room = Math.max(streamData.int64_ts_add_pusher, streamData.int64_ts_play_stream) - reportData.int64_ts_enter_room;
-    // 上报:只对进房进行上报
-    // console.log('走完所有流程上报');
-    reportData.str_room_creator && reportData.str_userid && reportData.str_room_creator != reportData.str_userid && report();
-  }
-}
-
-/**
- * 上报cgi
- */
-function report() {
-  // 有房间id与用户id才上报
-  if (!reportData.str_roomid || !reportData.str_userid) {
-    clearData();
-    return;
-  }
-  // 创建房间不加入上报
-  if (reportData.str_room_creator == reportData.str_userid) {
-    clearData();
-    return;
-  } 
-  var data = reportData;
-  data.str_appid = str_appid;
-  data.str_platform = str_platform;
-  data.str_appversion = str_appversion;
-  data.str_sdkversion = str_sdkversion;
-  data.str_common_version = str_common_version;
-  data.str_nickname = str_nickname;
-  data.str_device = str_device;
-  data.str_device_type = str_device_type;
-  console.log('真正上报数据: ', data);
-  wx.request({
-    url: 'https://roomtest.qcloud.com/weapp/utils/report',
-    data: {
-      reportID: 1,
-      data: data
-    },
-    method: 'POST',
-    header: {
-      'content-type': 'application/json' // 默认值
-    },
-    success: function (ret) { 
-      if(ret.data.code) {
-        console.log('上报失败:' + ret.data.code + ret.data.message);
-      } else {
-        console.log('上报成功');
-      }
-    },
-    fail: function () { console.log('report error') },
-    complete: function () {}
-  });
-  clearData();
-}
-
-/**
- * 重置参数
- */
-function clearData() {
-  reportData = {
-    str_roomid: '',
-    str_room_creator: '',
-    str_userid: '',
-    str_play_info: '',
-    str_push_info: '',
-    int64_ts_enter_room: -99999,
-    int64_tc_join_group: -99999,
-    int64_tc_get_pushers: -99999,
-    int64_tc_play_stream: -99999,
-    int64_tc_get_pushurl: -99999,
-    int64_tc_push_stream: -99999,
-    int64_tc_add_pusher: -99999,
-    int64_tc_enter_room: -99999
-  };
-  streamData = {
-    int64_ts_add_pusher: 0,
-    int64_ts_play_stream: 0
-  };
-}
-
-/**
- * 对外暴露函数
- * @type {Object}
- */
-module.exports = {
-  setReportData: setReportData,
-  report: report,
-  clearData: clearData
-}

+ 0 - 622
common/static/lib/runtime.js

@@ -1,622 +0,0 @@
-/**
- * Copyright (c) 2014-present, Facebook, Inc.
- *
- * This source code is licensed under the MIT license found in the
- * LICENSE file in the root directory of this source tree.
- */
-
-var regeneratorRuntime = (function (exports) {
-    "use strict";
-
-    var Op = Object.prototype;
-    var hasOwn = Op.hasOwnProperty;
-    var undefined; // More compressible than void 0.
-    var $Symbol = typeof Symbol === "function" ? Symbol : {};
-    var iteratorSymbol = $Symbol.iterator || "@@iterator";
-    var asyncIteratorSymbol = $Symbol.asyncIterator || "@@asyncIterator";
-    var toStringTagSymbol = $Symbol.toStringTag || "@@toStringTag";
-
-    function wrap(innerFn, outerFn, self, tryLocsList) {
-        // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.
-        var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;
-        var generator = Object.create(protoGenerator.prototype);
-        var context = new Context(tryLocsList || []);
-
-        // The ._invoke method unifies the implementations of the .next,
-        // .throw, and .return methods.
-        generator._invoke = makeInvokeMethod(innerFn, self, context);
-
-        return generator;
-    }
-    exports.wrap = wrap;
-
-    function tryCatch(fn, obj, arg) {
-        try {
-            return { type: "normal", arg: fn.call(obj, arg) };
-        } catch (err) {
-            return { type: "throw", arg: err };
-        }
-    }
-
-    var GenStateSuspendedStart = "suspendedStart";
-    var GenStateSuspendedYield = "suspendedYield";
-    var GenStateExecuting = "executing";
-    var GenStateCompleted = "completed";
-
-    var ContinueSentinel = {};
-
-    function Generator() {}
-    function GeneratorFunction() {}
-    function GeneratorFunctionPrototype() {}
-
-    // This is a polyfill for %IteratorPrototype% for environments that
-    // don't natively support it.
-    var IteratorPrototype = {};
-    IteratorPrototype[iteratorSymbol] = function () {
-        return this;
-    };
-
-    var getProto = Object.getPrototypeOf;
-    var NativeIteratorPrototype = getProto && getProto(getProto(values([])));
-    if (NativeIteratorPrototype &&
-        NativeIteratorPrototype !== Op &&
-        hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {
-        // This environment has a native %IteratorPrototype%; use it instead
-        // of the polyfill.
-        IteratorPrototype = NativeIteratorPrototype;
-    }
-
-    var Gp = GeneratorFunctionPrototype.prototype =
-        Generator.prototype = Object.create(IteratorPrototype);
-    GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;
-    GeneratorFunctionPrototype.constructor = GeneratorFunction;
-    GeneratorFunctionPrototype[toStringTagSymbol] =
-        GeneratorFunction.displayName = "GeneratorFunction";
-
-    // Helper for defining the .next, .throw, and .return methods of the
-    // Iterator interface in terms of a single ._invoke method.
-    function defineIteratorMethods(prototype) {
-        ["next", "throw", "return"].forEach(function(method) {
-            prototype[method] = function(arg) {
-                return this._invoke(method, arg);
-            };
-        });
-    }
-
-    exports.isGeneratorFunction = function(genFun) {
-        var ctor = typeof genFun === "function" && genFun.constructor;
-        return ctor
-            ? ctor === GeneratorFunction ||
-            // For the native GeneratorFunction constructor, the best we can
-            // do is to check its .name property.
-            (ctor.displayName || ctor.name) === "GeneratorFunction"
-            : false;
-    };
-
-    exports.mark = function(genFun) {
-        if (Object.setPrototypeOf) {
-            Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);
-        } else {
-            genFun.__proto__ = GeneratorFunctionPrototype;
-            if (!(toStringTagSymbol in genFun)) {
-                genFun[toStringTagSymbol] = "GeneratorFunction";
-            }
-        }
-        genFun.prototype = Object.create(Gp);
-        return genFun;
-    };
-
-    // Within the body of any async function, `await x` is transformed to
-    // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test
-    // `hasOwn.call(value, "__await")` to determine if the yielded value is
-    // meant to be awaited.
-    exports.awrap = function(arg) {
-        return { __await: arg };
-    };
-
-    function AsyncIterator(generator) {
-        function invoke(method, arg, resolve, reject) {
-            var record = tryCatch(generator[method], generator, arg);
-            if (record.type === "throw") {
-                reject(record.arg);
-            } else {
-                var result = record.arg;
-                var value = result.value;
-                if (value &&
-                    typeof value === "object" &&
-                    hasOwn.call(value, "__await")) {
-                    return Promise.resolve(value.__await).then(function(value) {
-                        invoke("next", value, resolve, reject);
-                    }, function(err) {
-                        invoke("throw", err, resolve, reject);
-                    });
-                }
-
-                return Promise.resolve(value).then(function(unwrapped) {
-                    // When a yielded Promise is resolved, its final value becomes
-                    // the .value of the Promise<{value,done}> result for the
-                    // current iteration.
-                    result.value = unwrapped;
-                    resolve(result);
-                }, function(error) {
-                    // If a rejected Promise was yielded, throw the rejection back
-                    // into the async generator function so it can be handled there.
-                    return invoke("throw", error, resolve, reject);
-                });
-            }
-        }
-
-        var previousPromise;
-
-        function enqueue(method, arg) {
-            function callInvokeWithMethodAndArg() {
-                return new Promise(function(resolve, reject) {
-                    invoke(method, arg, resolve, reject);
-                });
-            }
-
-            return previousPromise =
-                previousPromise ? previousPromise.then(
-                    callInvokeWithMethodAndArg,
-                    callInvokeWithMethodAndArg
-                ) : callInvokeWithMethodAndArg();
-        }
-        this._invoke = enqueue;
-    }
-
-    defineIteratorMethods(AsyncIterator.prototype);
-    AsyncIterator.prototype[asyncIteratorSymbol] = function () {
-        return this;
-    };
-    exports.AsyncIterator = AsyncIterator;
-
-    // Note that simple async functions are implemented on top of
-    // AsyncIterator objects; they just return a Promise for the value of
-    // the final result produced by the iterator.
-    exports.async = function(innerFn, outerFn, self, tryLocsList) {
-        var iter = new AsyncIterator(
-            wrap(innerFn, outerFn, self, tryLocsList)
-        );
-
-        return exports.isGeneratorFunction(outerFn)
-            ? iter // If outerFn is a generator, return the full iterator.
-            : iter.next().then(function(result) {
-                return result.done ? result.value : iter.next();
-            });
-    };
-
-    function makeInvokeMethod(innerFn, self, context) {
-        var state = GenStateSuspendedStart;
-
-        return function invoke(method, arg) {
-            if (state === GenStateExecuting) {
-                throw new Error("Generator is already running");
-            }
-
-            if (state === GenStateCompleted) {
-                if (method === "throw") {
-                    throw arg;
-                }
-
-                // Be forgiving, per 25.3.3.3.3 of the spec:
-                // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume
-                return doneResult();
-            }
-
-            context.method = method;
-            context.arg = arg;
-
-            while (true) {
-                var delegate = context.delegate;
-                if (delegate) {
-                    var delegateResult = maybeInvokeDelegate(delegate, context);
-                    if (delegateResult) {
-                        if (delegateResult === ContinueSentinel) continue;
-                        return delegateResult;
-                    }
-                }
-
-                if (context.method === "next") {
-                    // Setting context._sent for legacy support of Babel's
-                    // function.sent implementation.
-                    context.sent = context._sent = context.arg;
-
-                } else if (context.method === "throw") {
-                    if (state === GenStateSuspendedStart) {
-                        state = GenStateCompleted;
-                        throw context.arg;
-                    }
-
-                    context.dispatchException(context.arg);
-
-                } else if (context.method === "return") {
-                    context.abrupt("return", context.arg);
-                }
-
-                state = GenStateExecuting;
-
-                var record = tryCatch(innerFn, self, context);
-                if (record.type === "normal") {
-                    // If an exception is thrown from innerFn, we leave state ===
-                    // GenStateExecuting and loop back for another invocation.
-                    state = context.done
-                        ? GenStateCompleted
-                        : GenStateSuspendedYield;
-
-                    if (record.arg === ContinueSentinel) {
-                        continue;
-                    }
-
-                    return {
-                        value: record.arg,
-                        done: context.done
-                    };
-
-                } else if (record.type === "throw") {
-                    state = GenStateCompleted;
-                    context.method = "throw";
-                    context.arg = record.arg;
-                }
-            }
-        };
-    }
-
-    function maybeInvokeDelegate(delegate, context) {
-        var method = delegate.iterator[context.method];
-        if (method === undefined) {
-            context.delegate = null;
-
-            if (context.method === "throw") {
-                if (delegate.iterator.return) {
-                    context.method = "return";
-                    context.arg = undefined;
-                    maybeInvokeDelegate(delegate, context);
-
-                    if (context.method === "throw") {
-                        return ContinueSentinel;
-                    }
-                }
-
-                context.method = "throw";
-                context.arg = new TypeError(
-                    "The iterator does not provide a 'throw' method");
-            }
-
-            return ContinueSentinel;
-        }
-
-        var record = tryCatch(method, delegate.iterator, context.arg);
-
-        if (record.type === "throw") {
-            context.method = "throw";
-            context.arg = record.arg;
-            context.delegate = null;
-            return ContinueSentinel;
-        }
-
-        var info = record.arg;
-
-        if (! info) {
-            context.method = "throw";
-            context.arg = new TypeError("iterator result is not an object");
-            context.delegate = null;
-            return ContinueSentinel;
-        }
-
-        if (info.done) {
-            context[delegate.resultName] = info.value;
-
-            context.next = delegate.nextLoc;
-
-            if (context.method !== "return") {
-                context.method = "next";
-                context.arg = undefined;
-            }
-
-        } else {
-            // Re-yield the result returned by the delegate method.
-            return info;
-        }
-
-        // The delegate iterator is finished, so forget it and continue with
-        // the outer generator.
-        context.delegate = null;
-        return ContinueSentinel;
-    }
-
-    // Define Generator.prototype.{next,throw,return} in terms of the
-    // unified ._invoke helper method.
-    defineIteratorMethods(Gp);
-
-    Gp[toStringTagSymbol] = "Generator";
-    Gp[iteratorSymbol] = function() {
-        return this;
-    };
-
-    Gp.toString = function() {
-        return "[object Generator]";
-    };
-
-    function pushTryEntry(locs) {
-        var entry = { tryLoc: locs[0] };
-
-        if (1 in locs) {
-            entry.catchLoc = locs[1];
-        }
-
-        if (2 in locs) {
-            entry.finallyLoc = locs[2];
-            entry.afterLoc = locs[3];
-        }
-
-        this.tryEntries.push(entry);
-    }
-
-    function resetTryEntry(entry) {
-        var record = entry.completion || {};
-        record.type = "normal";
-        delete record.arg;
-        entry.completion = record;
-    }
-
-    function Context(tryLocsList) {
-        this.tryEntries = [{ tryLoc: "root" }];
-        tryLocsList.forEach(pushTryEntry, this);
-        this.reset(true);
-    }
-
-    exports.keys = function(object) {
-        var keys = [];
-        for (var key in object) {
-            keys.push(key);
-        }
-        keys.reverse();
-        return function next() {
-            while (keys.length) {
-                var key = keys.pop();
-                if (key in object) {
-                    next.value = key;
-                    next.done = false;
-                    return next;
-                }
-            }
-
-            next.done = true;
-            return next;
-        };
-    };
-
-    function values(iterable) {
-        if (iterable) {
-            var iteratorMethod = iterable[iteratorSymbol];
-            if (iteratorMethod) {
-                return iteratorMethod.call(iterable);
-            }
-
-            if (typeof iterable.next === "function") {
-                return iterable;
-            }
-
-            if (!isNaN(iterable.length)) {
-                var i = -1, next = function next() {
-                    while (++i < iterable.length) {
-                        if (hasOwn.call(iterable, i)) {
-                            next.value = iterable[i];
-                            next.done = false;
-                            return next;
-                        }
-                    }
-
-                    next.value = undefined;
-                    next.done = true;
-
-                    return next;
-                };
-
-                return next.next = next;
-            }
-        }
-
-        // Return an iterator with no values.
-        return { next: doneResult };
-    }
-    exports.values = values;
-
-    function doneResult() {
-        return { value: undefined, done: true };
-    }
-
-    Context.prototype = {
-        constructor: Context,
-
-        reset: function(skipTempReset) {
-            this.prev = 0;
-            this.next = 0;
-            this.sent = this._sent = undefined;
-            this.done = false;
-            this.delegate = null;
-
-            this.method = "next";
-            this.arg = undefined;
-
-            this.tryEntries.forEach(resetTryEntry);
-
-            if (!skipTempReset) {
-                for (var name in this) {
-                    // Not sure about the optimal order of these conditions:
-                    if (name.charAt(0) === "t" &&
-                        hasOwn.call(this, name) &&
-                        !isNaN(+name.slice(1))) {
-                        this[name] = undefined;
-                    }
-                }
-            }
-        },
-
-        stop: function() {
-            this.done = true;
-
-            var rootEntry = this.tryEntries[0];
-            var rootRecord = rootEntry.completion;
-            if (rootRecord.type === "throw") {
-                throw rootRecord.arg;
-            }
-
-            return this.rval;
-        },
-
-        dispatchException: function(exception) {
-            if (this.done) {
-                throw exception;
-            }
-
-            var context = this;
-            function handle(loc, caught) {
-                record.type = "throw";
-                record.arg = exception;
-                context.next = loc;
-
-                if (caught) {
-                    context.method = "next";
-                    context.arg = undefined;
-                }
-
-                return !! caught;
-            }
-
-            for (var i = this.tryEntries.length - 1; i >= 0; --i) {
-                var entry = this.tryEntries[i];
-                var record = entry.completion;
-
-                if (entry.tryLoc === "root") {
-                    return handle("end");
-                }
-
-                if (entry.tryLoc <= this.prev) {
-                    var hasCatch = hasOwn.call(entry, "catchLoc");
-                    var hasFinally = hasOwn.call(entry, "finallyLoc");
-
-                    if (hasCatch && hasFinally) {
-                        if (this.prev < entry.catchLoc) {
-                            return handle(entry.catchLoc, true);
-                        } else if (this.prev < entry.finallyLoc) {
-                            return handle(entry.finallyLoc);
-                        }
-
-                    } else if (hasCatch) {
-                        if (this.prev < entry.catchLoc) {
-                            return handle(entry.catchLoc, true);
-                        }
-
-                    } else if (hasFinally) {
-                        if (this.prev < entry.finallyLoc) {
-                            return handle(entry.finallyLoc);
-                        }
-
-                    } else {
-                        throw new Error("try statement without catch or finally");
-                    }
-                }
-            }
-        },
-
-        abrupt: function(type, arg) {
-            for (var i = this.tryEntries.length - 1; i >= 0; --i) {
-                var entry = this.tryEntries[i];
-                if (entry.tryLoc <= this.prev &&
-                    hasOwn.call(entry, "finallyLoc") &&
-                    this.prev < entry.finallyLoc) {
-                    var finallyEntry = entry;
-                    break;
-                }
-            }
-
-            if (finallyEntry &&
-                (type === "break" ||
-                    type === "continue") &&
-                finallyEntry.tryLoc <= arg &&
-                arg <= finallyEntry.finallyLoc) {
-                finallyEntry = null;
-            }
-
-            var record = finallyEntry ? finallyEntry.completion : {};
-            record.type = type;
-            record.arg = arg;
-
-            if (finallyEntry) {
-                this.method = "next";
-                this.next = finallyEntry.finallyLoc;
-                return ContinueSentinel;
-            }
-
-            return this.complete(record);
-        },
-
-        complete: function(record, afterLoc) {
-            if (record.type === "throw") {
-                throw record.arg;
-            }
-
-            if (record.type === "break" ||
-                record.type === "continue") {
-                this.next = record.arg;
-            } else if (record.type === "return") {
-                this.rval = this.arg = record.arg;
-                this.method = "return";
-                this.next = "end";
-            } else if (record.type === "normal" && afterLoc) {
-                this.next = afterLoc;
-            }
-
-            return ContinueSentinel;
-        },
-
-        finish: function(finallyLoc) {
-            for (var i = this.tryEntries.length - 1; i >= 0; --i) {
-                var entry = this.tryEntries[i];
-                if (entry.finallyLoc === finallyLoc) {
-                    this.complete(entry.completion, entry.afterLoc);
-                    resetTryEntry(entry);
-                    return ContinueSentinel;
-                }
-            }
-        },
-
-        "catch": function(tryLoc) {
-            for (var i = this.tryEntries.length - 1; i >= 0; --i) {
-                var entry = this.tryEntries[i];
-                if (entry.tryLoc === tryLoc) {
-                    var record = entry.completion;
-                    if (record.type === "throw") {
-                        var thrown = record.arg;
-                        resetTryEntry(entry);
-                    }
-                    return thrown;
-                }
-            }
-
-            throw new Error("illegal catch attempt");
-        },
-
-        delegateYield: function(iterable, resultName, nextLoc) {
-            this.delegate = {
-                iterator: values(iterable),
-                resultName: resultName,
-                nextLoc: nextLoc
-            };
-
-            if (this.method === "next") {
-                // Deliberately forget the last sent value so that we don't
-                // accidentally pass it on to the delegate.
-                this.arg = undefined;
-            }
-
-            return ContinueSentinel;
-        }
-    };
-
-    return exports;
-
-}(
-    typeof module === "object" ? module.exports : {}
-));

+ 0 - 245
common/static/templateMethod.js

@@ -1,245 +0,0 @@
-var app = getApp(); //获取应用实例
-const util = require('@/static/utils/util.js');
-const config = require('@/static/config.js');
-import requestConfig from '@/static/lib/requestConfig';
-import Bus from '@/common/bus';
-export default {
-    data(){
-        return {
-            doubleClick:false,
-            height: 0,
-            selfTabbarBottom: '0px',
-            computerHeight: 'calc(100vh - 58px)',
-            statusBarHeight: 0,
-            _scrollDistance: 0, //滑动的距离
-            showShareOptions: false,
-            showOption: true,
-        }
-    },
-    watch:{
-    },
-    methods:{
-        scrollExp(e) {
-            if (e.detail) {
-                this._scrollDistance = e.detail.scrollTop;
-                if (this._scrollDistance >= 30) {
-                    this.showNav = true;
-                    if(this.hasOwnProperty('myNavBarData') && this.myNavBarData){
-                        this.myNavBarData.navBarColor = (this.globalCityListConfig && this.globalCityListConfig.backgroundColor) ? this.globalCityListConfig.backgroundColor: '#fff';
-                        if(!this.currentData){
-                            this.pageThemeColor = {
-                                textColor1:'#000'
-                            };
-                        }
-                        this.myNavBarData.titleColor = this.pageThemeColor.textColor1;
-                        this.myNavBarData.title = "城市列表";
-                    }
-                } else {
-                    this.showNav = false;
-                    if(this.hasOwnProperty('myNavBarData') && this.myNavBarData){
-                        this.myNavBarData.navBarColor = 0;
-                        this.myNavBarData.titleColor = '#fff';
-                        this.myNavBarData.title = "";
-                        if(!this.currentData){
-                            this.pageThemeColor = {
-                                textColor1:'#fff'
-                            };
-                        }
-                    }
-                }
-            }
-        },
-        //顶部搜索按钮
-        goToSearch(type=1) {
-            // let url = '/subPackage/pages/searchCondition/searchCondition';
-            let url = "/subPackage/pages/searchNewModule/searchNewModule";
-            if(type==2){//新版的搜索页面
-                url = "/subPackage/pages/searchNewModule/searchNewModule"
-            }
-            uni.navigateTo({
-                url: url,
-                success: () => {},
-            });
-        },
-        //切换城市
-        navigateToCity(e) {
-            uni.navigateTo({
-                url: '/subPackage/pages/addressModule/addressModule'
-            });
-        },
-        //跳转到筛选页面
-        // navigateToSearch(type) {
-        //     var _url = '/pages/screenSearchListModule/screenSearchListModule';
-        //     if (type) {
-        //         _url = _url + "?openType=" + type;
-        //     }
-        //     uni.navigateTo({
-        //         url: _url
-        //     });
-        // },
-        navigateFuc(e) {
-            let eventOption = {};
-            if (e) {
-                // this.$emit("navigateFuc", e, eventOption);
-                // 发送 navigateFucFromNav 主题 的Bus消息
-                Bus.$emit('navigateFucFromNav', e);
-            }
-        },
-        //颜色值转换
-        hexToRgba(color, opacity) {
-            return util.hexToRgba(color, opacity)
-        },
-        /**
-         * 单页模式
-         */
-        showSingleModel() {
-            app = getApp();
-            let _scene = (app.globalData.launchInfo && app.globalData.launchInfo.scene) ? app.globalData.launchInfo
-                .scene : '';
-            if (_scene == '1154') { //单页模式下设置自定义导航栏无效
-                this.specialHeight = (app.globalData.navigateStatusContainerHeight + 'px');
-                this.specialTop = (app.globalData.navigateStatusContainerHeight + 'px');
-                console.log("this.specialTop", this.specialTop);
-            }
-            this.singlePageStatus = app.globalData.singlePageStatus;
-        },
-        showShareOption() {
-            this.showShareOptions = true;
-        },
-        hidenOption() {
-            this.showOption = true;
-        },
-        getRandomArrayElements(arr, count) {
-            var shuffled = arr.slice(0),
-                i = arr.length,
-                min = i - count,
-                temp, index;
-            while (i-- > min) {
-                index = Math.floor((i + 1) * Math.random());
-                temp = shuffled[index];
-                shuffled[index] = shuffled[i];
-                shuffled[i] = temp;
-            }
-            return shuffled.slice(min);
-        },
-        catchTouchMove: function() {
-        	return false;
-        },
-        //跳转到项目
-        async navigateToProject(e) {
-            var self = this;
-            let houseId = e.currentTarget.dataset.houseid || e.currentTarget.dataset.houseid;
-            let requestData = {
-                houseId: houseId,
-                requestCount: 1,
-                componentCount: 1,
-            };
-            if(this.doubleClick){
-                return false;
-            }
-            this.doubleClick = true;
-            const res = await requestConfig('queryXcxPage', requestData, true);
-            if (res && res.success && res.single && res.single.jsonString != null) {
-                uni.navigateTo({
-                    url: '/pages/index/index?houseId=' + houseId,
-                    success: function() {},
-                    fail: function(res) {
-                        console.log(res)
-                    },
-                    complete() {
-                        self.doubleClick = false;
-                    }
-                })
-            } else {
-                uni.showToast({
-                    title: '敬请期待',
-                    icon: 'none',
-                    duration: 1500,
-                })
-                this.doubleClick = false;
-            }
-        },
-        async queryCityNews() {
-            let res = await requestConfig('queryCityNews', {
-                brandId: config.brandId,
-                cityName: this.currentCity
-            })
-            if (res && res.success) {
-                res.list.sort((a, b) => {
-                    return a.orderNumber - b.orderNumber
-                })
-                this.newsList = res.list.splice(0, 2)
-            }
-        },
-        async goNews(e) {
-            const data = e;
-            var _link = "";
-            var _title = "";
-            if (data.type == 3) {
-                _link = data.newsUrl;
-                _title = data.title;
-            } else if (data.type == 1 || !data.type) {
-                _link = data.linkUrl;
-                _title = data.title;
-            } else {
-                let res = await requestConfig('queryNewsById', {
-                    id: data.referNewsId
-                })
-                if (res.success && res.single) {
-                    if (res.single.type == 5) {
-                        _link = res.single.newsUrl;
-                        _title = res.single.title;
-                    } else {
-                        _link = res.single.linkUrl;
-                        _title = res.single.title;
-                    }
-                }
-            }
-            let token = data.linkUrl.split('?newsToken=')[1] || '';
-            app.checkNewsStatus(token, () => {
-                if (data.content && data.content.length > 0) {
-                    let path = '/subPackage/pages/news/newsDetail/newsDetail?newsToken=' + token;
-                    console.log("path", path);
-                    uni.navigateTo({
-                        url: path,
-                        fail: function(res) {
-                            console.log(res)
-                        },
-                    })
-                } else {
-                    if (app.checkWebviewLink(_link)) {
-                        uni.showToast({
-                            title: '敬请期待',
-                            icon: 'none',
-                            duration: 1500,
-                        })
-                    } else {
-                        uni.navigateTo({
-                            url: '/pages/webView/webView?view=' + encodeURIComponent(_link) +
-                                '&title=' + _title,
-                            fail: function(res) {
-                                console.log(res)
-                            },
-                        })
-                    }
-                }
-            }, () => {
-                uni.showToast({
-                    title: '该页面已下线',
-                    icon: 'none',
-                    duration: 1500,
-                })
-            });
-        },
-        getDeviceInfor: function() {
-            const res = uni.getSystemInfoSync();
-            if (res.model.indexOf('iPhone') >= 0) {
-                this.selfTabbarBottom = '0px';
-                this.computerHeight = 'calc(100vh - 58px - 0px)';
-            }
-            this.height = app.globalData.navigateStatusContainerHeight;
-            this.statusBarHeight = app.globalData.statusBarHeight;
-            console.log("getDeviceInfor", res);
-        },
-    }
-}

+ 0 - 136
common/uni-nvue.css

@@ -1,136 +0,0 @@
-/* #ifndef APP-PLUS-NVUE */
-page {
-    min-height: 100%;
-    height: auto;
-}
-/* #endif */
-
-/* 解决头条小程序字体图标不显示问题,因为头条运行时自动插入了span标签,且有全局字体 */
-/* #ifdef MP-TOUTIAO */
-/* text :not(view) {
-    font-family: uniicons;
-} */
-/* #endif */
-
-.uni-icon {
-    font-family: uniicons;
-    font-weight: normal;
-}
-
-.uni-container {
-    padding: 15px;
-    background-color: #f8f8f8;
-}
-
-.uni-header-logo {
-	/* #ifdef H5 */
-	display: flex;
-	/* #endif */
-    padding: 15px 15px;
-    flex-direction: column;
-    justify-content: center;
-    align-items: center;
-    margin-top: 10rpx;
-}
-
-.uni-header-image {
-    width: 80px;
-    height: 80px;
-}
-
-.uni-hello-text {
-    margin-bottom: 20px;
-}
-
-.hello-text {
-    color: #7A7E83;
-    font-size: 14px;
-    line-height: 20px;
-}
-
-.hello-link {
-    color: #7A7E83;
-    font-size: 14px;
-    line-height: 20px;
-}
-
-.uni-panel {
-    margin-bottom: 12px;
-}
-
-.uni-panel-h {
-	/* #ifdef H5 */
-	display: flex;
-	/* #endif */
-    background-color: #ffffff;
-    flex-direction: row !important;
-	/* justify-content: space-between !important; */
-    align-items: center !important;
-    padding: 12px;
-	/* #ifdef H5 */
-	cursor: pointer;
-	/* #endif */
-}
-/*
-.uni-panel-h:active {
-    background-color: #f8f8f8;
-}
- */
-.uni-panel-h-on {
-    background-color: #f0f0f0;
-}
-
-.uni-panel-text {
-    flex: 1;
-    color: #000000;
-    font-size: 14px;
-    font-weight: normal;
-}
-
-.uni-panel-icon {
-    margin-left: 15px;
-    color: #999999;
-    font-size: 14px;
-    font-weight: normal;
-    transform: rotate(0deg);
-    transition-duration: 0s;
-    transition-property: transform;
-}
-
-.uni-panel-icon-on {
-    transform: rotate(180deg);
-}
-
-.uni-navigate-item {
-	/* #ifdef H5 */
-	display: flex;
-	/* #endif */
-    flex-direction: row;
-    align-items: center;
-    background-color: #FFFFFF;
-    border-top-style: solid;
-    border-top-color: #f0f0f0;
-    border-top-width: 1px;
-    padding: 12px;
-	/* #ifdef H5 */
-	cursor: pointer;
-	/* #endif */
-}
-
-.uni-navigate-item:active {
-    background-color: #f8f8f8;
-}
-
-.uni-navigate-text {
-    flex: 1;
-    color: #000000;
-    font-size: 14px;
-    font-weight: normal;
-}
-
-.uni-navigate-icon {
-    margin-left: 15px;
-    color: #999999;
-    font-size: 14px;
-    font-weight: normal;
-}

File diff suppressed because it is too large
+ 0 - 1458
common/uni.css


+ 0 - 73
common/util.js

@@ -1,73 +0,0 @@
-function formatTime(time) {
-	if (typeof time !== 'number' || time < 0) {
-		return time
-	}
-
-	var hour = parseInt(time / 3600)
-	time = time % 3600
-	var minute = parseInt(time / 60)
-	time = time % 60
-	var second = time
-
-	return ([hour, minute, second]).map(function(n) {
-		n = n.toString()
-		return n[1] ? n : '0' + n
-	}).join(':')
-}
-
-function formatLocation(longitude, latitude) {
-	if (typeof longitude === 'string' && typeof latitude === 'string') {
-		longitude = parseFloat(longitude)
-		latitude = parseFloat(latitude)
-	}
-
-	longitude = longitude.toFixed(2)
-	latitude = latitude.toFixed(2)
-
-	return {
-		longitude: longitude.toString().split('.'),
-		latitude: latitude.toString().split('.')
-	}
-}
-var dateUtils = {
-	UNITS: {
-		'年': 31557600000,
-		'月': 2629800000,
-		'天': 86400000,
-		'小时': 3600000,
-		'分钟': 60000,
-		'秒': 1000
-	},
-	humanize: function(milliseconds) {
-		var humanize = '';
-		for (var key in this.UNITS) {
-			if (milliseconds >= this.UNITS[key]) {
-				humanize = Math.floor(milliseconds / this.UNITS[key]) + key + '前';
-				break;
-			}
-		}
-		return humanize || '刚刚';
-	},
-	format: function(dateStr) {
-		var date = this.parse(dateStr)
-		var diff = Date.now() - date.getTime();
-		if (diff < this.UNITS['天']) {
-			return this.humanize(diff);
-		}
-		var _format = function(number) {
-			return (number < 10 ? ('0' + number) : number);
-		};
-		return date.getFullYear() + '/' + _format(date.getMonth() + 1) + '/' + _format(date.getDate()) + '-' +
-			_format(date.getHours()) + ':' + _format(date.getMinutes());
-	},
-	parse: function(str) { //将"yyyy-mm-dd HH:MM:ss"格式的字符串,转化为一个Date对象
-		var a = str.split(/[^0-9]/);
-		return new Date(a[0], a[1] - 1, a[2], a[3], a[4], a[5]);
-	}
-};
-
-export {
-	formatTime,
-	formatLocation,
-	dateUtils
-}

+ 0 - 181
components/amap-wx/js/util.js

@@ -1,181 +0,0 @@
-import amap from '@/components/amap-wx/lib/amap-wx.js';
-// 地铁颜色图
-const line = {
-	'1号线': '#C43B33',
-	'2号线': '#016299',
-	'4号线/大兴线': '#008E9C',
-	'5号线': '#A42380',
-	'6号线': '#D09900',
-	'7号线': '#F2C172',
-	'8号线': '#009D6A',
-	'9号线': '#8FC41E',
-	'10号线': '#009DBE',
-	'13号线': '#F9E701',
-	'14号线东段': '#D4A7A2',
-	'14号线西段': '#D4A7A2',
-	'15号线': '#5D2D69',
-	'八通线': '#C33A32',
-	'昌平线': '#DE82B1',
-	'亦庄线': '#E40177',
-	'房山线': '#E66021',
-	'机场线': '#A29BBC',
-}
-
-// 150500:地铁站 ,150700:公交站 , 190700:地名地址
-const typecode = [{
-	id: '150500',
-	icon: 'icon-ditie'
-}, {
-	id: '150700',
-	icon: 'icon-gongjiao'
-}, {
-	id: '190700',
-	icon: 'icon-gonglu'
-}];
-
-const util = {
-	key:'b526b09b86cd2996e7732be8ab8c4430',
-	/**
-	 * 初始化高德地图api
-	 */
-	mapInit() {
-		return new amap.AMapWX({
-			key: this.key
-		});
-	},
-	// 服务状态吗
-	typecode,
-	/**
-	 * 获取地图颜色
-	 */
-	lineColor(name) {
-		if (line[name]) {
-			return line[name];
-		} else {
-			return '#ccc';
-		}
-	},
-	/**
-	 * 关键字颜色变化
-	 */
-	serachNmme(val, name) {
-		let namestr = new RegExp(val);
-		let nameresult =
-			`<div style="font-size: 14px;color: #333;line-height: 1.5;">
-		    ${name.replace(namestr, "<span style='color:#66ccff;'>" + val + '</span>')}
-		    </div>`
-			.trim();
-
-		return nameresult;
-	},
-	/**
-	 *  地址转地铁线路
-	 */
-	addressToLine(address, type) {
-		let addr = address.split(';');
-		let dt = '';
-		addr.forEach(elm => {
-			let color = '#cccccc';
-			if (type === typecode[0].id) {
-				color = this.lineColor(elm)
-			} else if (type === typecode[1].id) {
-				color = '#4075cb'
-			}
-			let style = 'margin:5px 0;margin-right:5px;padding:0 5px;background:' + color +
-				';font-size:12px;color:#fff;border-radius:3px;';
-			dt += `<div style=\'${style}\'>${elm}</div>`;
-
-		});
-		return `<div style="display:flex;flex-wrap: wrap;">${dt}</div>`;
-	},
-	/**
-	 * 数据处理
-	 */
-	dataHandle(item, val) {
-		// 改变字体颜色
-		if (val) {
-			item.nameNodes = util.serachNmme(val, item.name);
-		} else {
-			item.nameNodes = `<div style="font-size: 14px;color: #333;line-height: 1.5;">${item.name}</div>`;
-
-		}
-		// 地址解析 地铁
-		if (
-			item.typecode === util.typecode[0].id ||
-			item.typecode === util.typecode[1].id
-		) {
-			item.addressNodes = util.addressToLine(item.address, item.typecode);
-			if (item.typecode === util.typecode[0].id) {
-				item.icon = util.typecode[0].icon;
-			} else if (item.typecode === util.typecode[1].id) {
-				item.icon = util.typecode[1].icon;
-			}
-		} else {
-			item.addressNodes = `<span>${item.district}${
-				item.address.length > 0 ? '·' + item.address : ''
-			}</span>`.trim();
-			item.icon = 'icon-weizhi';
-		}
-
-		if (item.location && item.location.length === 0) {
-			item.icon = 'icon-sousuo';
-		}
-
-		return item;
-	},
-	/**
-	 * 存储历史数据
-	 * val [string | object]需要存储的内容
-	 */
-	setHistory(val) {
-		let searchHistory = uni.getStorageSync('search:history');
-		if (!searchHistory) searchHistory = [];
-		let serachData = {};
-		if (typeof(val) === 'string') {
-			serachData = {
-				adcode: [],
-				address: [],
-				city: [],
-				district: [],
-				id: [],
-				location: [],
-				name: val,
-				typecode: []
-			};
-		} else {
-			serachData = val
-		}
-
-		// 判断数组是否存在,如果存在,那么将放到最前面
-		for (var i = 0; i < searchHistory.length; i++) {
-			if (searchHistory[i].name === serachData.name) {
-				searchHistory.splice(i, 1);
-				break;
-			}
-		}
-
-		searchHistory.unshift(util.dataHandle(serachData));
-		uni.setStorage({
-			key: 'search:history',
-			data: searchHistory,
-			success: function() {
-				// console.log('success');
-			}
-		});
-	},
-	getHistory() {
-
-	},
-	removeHistory() {
-		uni.removeStorage({
-			key: 'search:history',
-			success: function(res) {
-				console.log('success');
-			}
-		});
-		return []
-	}
-
-}
-
-export default util;

File diff suppressed because it is too large
+ 0 - 1
components/amap-wx/lib/amap-wx.js


+ 0 - 156
components/api-set-tabbar.nvue

@@ -1,156 +0,0 @@
-<template>
-	<view class="uni-padding-wrap">
-		<page-head :title="title"></page-head>
-		<button class="button" @click="setTabBarBadge">{{ !hasSetTabBarBadge ? '设置tab徽标' : '移除tab徽标' }}</button>
-		<button class="button" @click="showTabBarRedDot">{{ !hasShownTabBarRedDot ?  '显示红点' : '移除红点'}}</button>
-		<button class="button" @click="customStyle">{{ !hasCustomedStyle ? '自定义Tab样式' : '移除自定义样式'}}</button>
-		<button class="button" @click="customItem">{{ !hasCustomedItem ? '自定义Tab信息' : '移除自定义信息' }}</button>
-		<button class="button" @click="hideTabBar">{{ !hasHiddenTabBar ? '隐藏TabBar' : '显示TabBar' }}</button>
-		<view class="btn-area">
-			<button class="button" type="primary" @click="navigateBack">返回上一级</button>
-		</view>
-	</view>
-</template>
-
-<script>
-	export default {
-		data() {
-			return {
-				title: 'tababr',
-				hasSetTabBarBadge: false,
-				hasShownTabBarRedDot: false,
-				hasCustomedStyle: false,
-				hasCustomedItem: false,
-				hasHiddenTabBar: false
-			}
-		},
-		destroyed() {
-			if (this.hasSetTabBarBadge) {
-				uni.removeTabBarBadge({
-					index: 1
-				})
-			}
-			if (this.hasShownTabBarRedDot) {
-				uni.hideTabBarRedDot({
-					index: 1
-				})
-			}
-			if (this.hasHiddenTabBar) {
-				uni.showTabBar()
-			}
-			if (this.hasCustomedStyle) {
-				uni.setTabBarStyle({
-					color: '#7A7E83',
-					selectedColor: '#007AFF',
-					backgroundColor: '#F8F8F8',
-					borderStyle: 'black'
-				})
-			}
-
-			if (this.hasCustomedItem) {
-				let tabBarOptions = {
-					index: 1,
-					text: '接口',
-					iconPath: '/static/api.png',
-					selectedIconPath: '/static/apiHL.png'
-				}
-				uni.setTabBarItem(tabBarOptions)
-			}
-		},
-		methods: {
-			navigateBack() {
-				this.$emit('unmount')
-			},
-			setTabBarBadge() {
-				if(this.hasShownTabBarRedDot){
-					uni.hideTabBarRedDot({
-						index: 1
-					})
-					this.hasShownTabBarRedDot = !this.hasShownTabBarRedDot
-				}
-				if (!this.hasSetTabBarBadge) {
-					uni.setTabBarBadge({
-						index: 1,
-						text: '1'
-					})
-				} else {
-					uni.removeTabBarBadge({
-						index: 1
-					})
-				}
-				this.hasSetTabBarBadge = !this.hasSetTabBarBadge
-			},
-			showTabBarRedDot() {
-				if(this.hasSetTabBarBadge) {
-					uni.removeTabBarBadge({
-						index: 1
-					})
-					this.hasSetTabBarBadge = !this.hasSetTabBarBadge
-				}
-				if (!this.hasShownTabBarRedDot) {
-					uni.showTabBarRedDot({
-						index: 1
-					})
-				} else {
-					uni.hideTabBarRedDot({
-						index: 1
-					})
-				}
-				this.hasShownTabBarRedDot = !this.hasShownTabBarRedDot
-			},
-			hideTabBar() {
-				if (!this.hasHiddenTabBar) {
-					uni.hideTabBar()
-				} else {
-					uni.showTabBar()
-				}
-				this.hasHiddenTabBar = !this.hasHiddenTabBar
-			},
-			customStyle() {
-				if (this.hasCustomedStyle) {
-					uni.setTabBarStyle({
-						color: '#7A7E83',
-						selectedColor: '#007AFF',
-						backgroundColor: '#F8F8F8',
-						borderStyle: 'black'
-					})
-				} else {
-					uni.setTabBarStyle({
-						color: '#FFF',
-						selectedColor: '#007AFF',
-						backgroundColor: '#000000',
-						borderStyle: 'black'
-					})
-				}
-				this.hasCustomedStyle = !this.hasCustomedStyle
-			},
-			customItem() {
-				let tabBarOptions = {
-					index: 1,
-					text: '接口',
-					iconPath: '/static/api.png',
-					selectedIconPath: '/static/apiHL.png'
-				}
-				if (this.hasCustomedItem) {
-					uni.setTabBarItem(tabBarOptions)
-				} else {
-					tabBarOptions.text = 'API'
-					uni.setTabBarItem(tabBarOptions)
-				}
-				this.hasCustomedItem = !this.hasCustomedItem
-			}
-		}
-	}
-</script>
-
-<style>
-	.button {
-		margin-top: 30rpx;
-        margin-left: 0;
-        margin-right: 0;
-	}
-
-	.btn-area {
-		padding-top: 30rpx;
-	}
-</style>

+ 211 - 0
components/biaofun-region/biaofun-region.vue

@@ -0,0 +1,211 @@
+<!-- 
+ * 省市区选择器
+ * @作者:陈万照
+ * @公司:山东标梵互动信息技术有限公司
+ * @官网:http://biaofun.com/
+ * @微信:C207668802
+ * @QQ:207668802
+ * @邮箱:cwz@biaofun.com || 207668802@qq.com
+ * @版本:v1.0.8
+ -->
+<template>
+	<view class="region">
+		<picker mode="multiSelector" :range="range" range-key="name" @change="change" @columnchange="columnchange" :value="value" :disabled="disabled">
+			<view class="content" :class="{ placeholder: !regionStr }">
+				<text class="ellipsis-1">{{ regionStr ? regionStr : placeholder }}</text>
+			</view>
+		</picker>
+	</view>
+</template>
+
+<script>
+const regionData = require('@/static/region.json');
+export default {
+	/**
+	 * 数据
+	 */
+	props: {
+		// 是否禁用
+		disabled: {
+			type: Boolean,
+			default: false
+		},
+
+		// placeholder
+		placeholder: {
+			type: String,
+			default: '请选择省/市/区'
+		},
+
+		// 默认值
+		defaultValue: {
+			type: Array,
+			default() {
+				return null;
+			}
+		}
+	},
+
+	/**
+	 * 数据
+	 */
+	data() {
+		return {
+			range: [[], [], []], // 省/市/区
+			value: [0, 0, 0], // value 的值表示选择了 range 中的第几个(下标从 0 开始),默认为 [0, 0, 0],即 range 为 ['第一个省', '第一个省的第一个市', '第一个省的第一个市的第一个区']
+			regionStr: '' // 选中的省市区字符串
+		};
+	},
+
+	/**
+	 * 监听数据
+	 */
+
+	watch: {
+		// 默认值
+		defaultValue() {
+			// 设置/更新省市区数据
+			this.defaultValue ? this.setDefaultValue() : this.setRange();
+		}
+	},
+
+	/**
+	 * 组件初次加载完成
+	 */
+	mounted() {
+		// 设置/更新省市区数据
+		this.defaultValue ? this.setDefaultValue() : this.setRange();
+	},
+
+	/**
+	 * 函数
+	 */
+	methods: {
+		/**
+		 * 设置/更新省市区数据
+		 */
+		setRange() {
+			// 省市区数据
+			let range = [[], [], []];
+
+			// 省
+			regionData.forEach(el => {
+				range[0].push({
+					id: el.id,
+					level: el.level,
+					name: el.name,
+					pid: el.pid
+				});
+			});
+
+			// 市
+			regionData[this.value[0]].children.forEach(el => {
+				range[1].push({
+					id: el.id,
+					level: el.level,
+					name: el.name,
+					pid: el.pid
+				});
+			});
+
+			// 区
+			regionData[this.value[0]].children[this.value[1]].children.forEach(el => {
+				range[2].push({
+					id: el.id,
+					level: el.level,
+					name: el.name,
+					pid: el.pid
+				});
+			});
+
+			// 更新省市区数据
+			this.range = range;
+		},
+
+		/**
+		 * 设置默认值
+		 */
+		setDefaultValue() {
+			// 查找省
+			let provinceIndex = regionData.findIndex(el => {
+				return el.name == this.defaultValue[0];
+			});
+			if(provinceIndex < 0) provinceIndex = 0;
+
+			// 查找市
+			let cityIndex = regionData[provinceIndex].children.findIndex(el => {
+				return el.name == this.defaultValue[1];
+			});
+			if(cityIndex < 0) cityIndex = 0;
+
+			// 查找区
+			let areaIndex = regionData[provinceIndex].children[cityIndex].children.findIndex(el => {
+				return el.name == this.defaultValue[2];
+			});
+			if(areaIndex < 0) areaIndex = 0;
+
+			// 更新 value 的值
+			this.value = [provinceIndex, cityIndex, areaIndex];
+
+			// 设置/更新省市区数据
+			this.setRange();
+
+			// 更新选中的省市区字符串
+			this.regionStr =
+				regionData[provinceIndex].name + '·' + regionData[provinceIndex].children[cityIndex].name + '·' + regionData[provinceIndex].children[cityIndex].children[areaIndex].name;
+		},
+
+		/**
+		 * 某一列的值改变时触发
+		 * @param {Number} event.detail.column 表示改变了第几列(下标从0开始)
+		 * @param {Number} event.detail.value 表示变更值的下标
+		 */
+		columnchange(event) {
+			// 改变的是省
+			if (event.detail.column == 0) {
+				this.value = [event.detail.value, 0, 0];
+			}
+			// 改变的是市
+			if (event.detail.column == 1) {
+				this.value.splice(1, 1, event.detail.value);
+				this.value.splice(2, 1, 0);
+			}
+			// 改变的是区
+			if (event.detail.column == 2) {
+				this.value.splice(2, 1, event.detail.value);
+			}
+
+			// 设置/更新省市区数据
+			this.setRange();
+		},
+
+		/**
+		 * 确认选择
+		 */
+		change(event) {
+			// 更新选中的省市区字符串
+			this.regionStr = this.range[0][this.value[0]].name + '·' + this.range[1][this.value[1]].name + '·' + this.range[2][this.value[2]].name;
+
+			// 传递事件
+			this.$emit('change', [this.range[0][this.value[0]], this.range[1][this.value[1]], this.range[2][this.value[2]]]);
+		}
+	}
+};
+</script>
+
+<style lang="scss" scoped>
+.ellipsis-1 {
+	display: -webkit-box;
+	-webkit-box-orient: vertical;
+	-webkit-line-clamp: 1;
+	overflow: hidden;
+}
+
+.content {
+	text-align: right;
+}
+
+.placeholder {
+	color: #949596;
+}
+</style>

+ 528 - 0
components/bory-datePicker/index.vue

@@ -0,0 +1,528 @@
+<template>
+	<view class="calendar" v-if="visible">
+		<view class="calendar-mask" @click.stop='maskEvent'></view>
+		<view class="calendar-container" @click.stop='handleClickOutSide'>
+			<view class="calendar-header" :style="{backgroundColor: headerBgColor}">
+				<view class="txt solar" :style="{color: (isLunar ?  defaultColor : activeColor)}" @click="changeCalendar(0)">
+					{{solarText}}
+				</view>
+				<view class="txt lunar" :style="{color: (!isLunar ?  defaultColor : activeColor)}" @click="changeCalendar(1)">
+					{{lunarText}}
+				</view>
+				<view class="txt confirm" :style="{color: confirmColor}" @click="changeCalendar(2)">
+					{{confirmText}}
+				</view>
+			</view>
+			<view class="calendar-body">
+				<picker-view @change="timeChange" data-index='0' data-id='year' :value='[multiIndex[0]]' indicator-style="height: 40px;"
+				 class='calendar-body-wrap' v-if="level > 0 ">
+					<picker-view-column>
+						<view v-for="item in yearData" :key='item' style="line-height: 40px;text-align:center;">{{item}}</view>
+					</picker-view-column>
+				</picker-view>
+				<picker-view @change="timeChange" data-index='1' data-id='month' :value='[multiIndex[1]]' indicator-style="height: 40px;"
+				 class='calendar-body-wrap' v-if="level> 1">
+					<picker-view-column>
+						<view v-for="item in monthData" :key='item' style="line-height: 40px;text-align:center;">{{item}}</view>
+					</picker-view-column>
+				</picker-view>
+				<picker-view @change="timeChange" data-index='2' data-id='day' :value='[multiIndex[2]]' indicator-style="height: 40px;"
+				 class='calendar-body-wrap' v-if="level > 2 ">
+					<picker-view-column>
+						<view v-for="item in dayData" :key='item' style="line-height: 40px;text-align:center;">{{item}}</view>
+					</picker-view-column>
+				</picker-view>
+				<picker-view @change="timeChange" data-index='3' data-id='hour' :value='[multiIndex[3]]' indicator-style="height: 40px;"
+				 class='calendar-body-wrap' v-if="level > 3 && (!isLunar || isLunar && !isShowChinaTime)">
+					<picker-view-column>
+						<view v-for="item in hours" :key='item' style="line-height: 40px;text-align:center;">{{item}}时</view>
+					</picker-view-column>
+				</picker-view>
+				<picker-view @change="timeChange" data-index='4' data-id='minus' :value='[multiIndex[4]]' indicator-style="height: 40px;"
+				 class='calendar-body-wrap' v-if="level > 4 && (!isLunar || isLunar && !isShowChinaTime)">
+					<picker-view-column>
+						<view v-for="item in minutes" :key='item' style="line-height: 40px;text-align:center;">{{item}}分</view>
+					</picker-view-column>
+				</picker-view>
+				<picker-view @change="timeChange" data-index='5' data-id='second' :value='[multiIndex[5]]' indicator-style="height: 40px;"
+				 class='calendar-body-wrap' v-if="level > 5 && (!isLunar || isLunar && !isShowChinaTime)">
+					<picker-view-column>
+						<view v-for="item in seconds" :key='item' style="line-height: 40px;text-align:center;">{{item}}秒</view>
+					</picker-view-column>
+				</picker-view>
+				<picker-view @change="timeChange" data-index='6' data-id='china' :value='[multiIndex[6]]' indicator-style="height: 40px;"
+				 class='calendar-body-wrap' v-if="isLunar && isShowChinaTime">
+					<picker-view-column>
+						<view v-for="item in chinaHours" :key='item.startTime' style="line-height: 40px;text-align:center;">{{item.name}}</view>
+					</picker-view-column>
+				</picker-view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import clickoutside from '../directives/clickoutside.js';
+	import {
+		calendar
+	} from '../libs/calendar.js'
+	import {
+		getYears,
+		getMonths,
+		getDays,
+		getHours,
+		getMinutes,
+		getSeconds,
+		getDateTime,
+		formateTime,
+		addZero,
+		createArray,
+		getDateStringTime,
+		chinaHours,
+		getChinaTime
+	} from '../utils/util.js';
+	export default {
+		name: 'CalendarPicker',
+		props: {
+			level: {
+				type: String,
+				default: '5'
+			},
+			isShowChinaTime: {
+				type: Boolean,
+				default: false
+			},
+			currentTime: {
+				type: String,
+				default: ''
+			},
+			startYear: {
+				type: Number,
+				default: 1900
+			},
+			endYear: {
+				type: Number,
+				default: 2100
+			},
+			isLunar: {
+				type: Boolean,
+				default: false
+			},
+			headerBgColor: {
+				type: String,
+				default: '#e9e9e9'
+			},
+			solarText: {
+				type: String,
+				default: '阳历'
+			},
+			lunarText: {
+				type: String,
+				default: '阴历'
+			},
+			activeColor: {
+				type: String,
+				default: '#912222'
+			},
+			defaultColor: {
+				type: String,
+				default: '#000000'
+			},
+			confirmText: {
+				type: String,
+				default: '确定'
+			},
+			confirmColor: {
+				type: String,
+				default: '#912222'
+			}
+		},
+		computed:{
+			yearData(){
+				return this.isLunar ? this.ganZhiYears : this.years;
+			},
+			monthData(){
+				return this.isLunar ? this.ganZhiMonths : this.months;
+			},
+			dayData(){
+				return this.isLunar ? this.ganZhiDays : this.days;
+			}
+		},
+		watch: {
+			currentTime: {
+				handler(value) {
+					if (value != '') {
+						this.years = getYears(this.startYear, this.endYear);
+						this.months = getMonths();
+						this.hours = getHours();
+						this.minutes = getMinutes();
+						this.seconds = getSeconds();
+						const selectTime = value.split(' ')[1];
+						const timeArray = selectTime.split(':');
+						const dateArray = value.split(' ')[0].split('-');
+						this.days = getDays(dateArray[0], dateArray[1]);
+						const dateTimeArray = dateArray.concat(timeArray);
+						this.$nextTick(() => {
+							this.selectYear = dateArray[0];
+							this.selectMonth = dateArray[1];
+							this.selectDay = dateArray[2];
+							const names = ['year', 'month', 'day', 'hour', 'minute', 'second', 'china'];
+							let multiIndex = [];
+							names.forEach((name, i) => {
+								if (name == 'china') {
+									multiIndex.push(0);
+								} else {
+									const index = this[name + 's'].findIndex(item => item == dateTimeArray[i]);
+									multiIndex.push(index);
+								}
+								this.multiIndex = multiIndex;
+							})
+							if (this.isLunar) {
+								if (this.isShowChinaTime) {
+									const time =
+										`${this.hours[this.multiIndex[3]]}:${this.minutes[this.multiIndex[4]]}:${this.seconds[this.multiIndex[5]]}`;
+									const {
+										name
+									} = getChinaTime(time);
+
+									const index = this.chinaHours.findIndex(item => item.name == name);
+									this.multiIndex.splice(this.multiIndex.length - 1, 1, index)
+								}
+
+								this.getLunarDate()
+							}
+
+						})
+
+
+					}
+				},
+				immediate: true
+			}
+		},
+		data() {
+			return {
+				chinaHours,
+				multiIndex: [],
+				selectYear: '',
+				selectMonth: '',
+				selectDay: '',
+				selectTime: '',
+				isLeap: false,
+				visible: false,
+				years: [],
+				months: [],
+				days: [],
+				hours: [],
+				minutes: [],
+				seconds: [],
+				ganZhiYears: [],
+				ganZhiMonths: [],
+				ganZhiDays: []
+			}
+		},
+		methods: {
+			handleClickOutSide() {
+				return;
+			},
+			maskEvent() {
+				this.hide()
+			},
+			show() {
+				this.visible = true;
+			},
+			hide() {
+				this.visible = false;
+			},
+			getLunarDate() {
+				const lunarData = calendar.solar2lunar(this.selectYear, this.selectMonth, this.selectDay);
+				console.log('lunarData:', lunarData);
+				const {
+					lYear,
+					lMonth,
+					lDay,
+					isLeap,
+					IMonthCn,
+					IDayCn
+				} = lunarData;
+				this.selectYear = lYear;
+				this.selectMonth = lMonth;
+				this.selectDay = lDay;
+				this.isLeap = isLeap;
+				this.ganZhiYears = this.years.map(year => `${year}${calendar.getGanZhiYear(year)}`);
+				const yearIndex = this.ganZhiYears.findIndex(item => item.indexOf(lYear) > -1);
+				this.multiIndex.splice(0, 1, yearIndex);
+				const leapMonth = calendar.leapMonth(lYear);
+				console.log('leapMonth:', leapMonth)
+				this.ganZhiMonths = this.months.map(month => calendar.toChinaMonth(month));
+				let monthCount;
+				if (leapMonth > 0) { //所选的年有闰年
+					this.ganZhiMonths.splice(leapMonth, 0, `闰${calendar.toChinaMonth(leapMonth)}`);
+					monthCount = calendar.leapDays(lYear);
+				} else {
+					monthCount = calendar.monthDays(lYear, lMonth)
+				}
+				const monthIndex = this.ganZhiMonths.findIndex(item => item == IMonthCn);
+				this.multiIndex.splice(1, 1, monthIndex);
+
+				const ganZhiDays = [];
+				for (let i = 1; i <= monthCount; i++) {
+					ganZhiDays.push(calendar.toChinaDay(i));
+				}
+				this.ganZhiDays = ganZhiDays;
+				const dayIndex = this.ganZhiDays.findIndex(item => item == IDayCn);
+				this.multiIndex.splice(2, 1, dayIndex);
+				if (this.isShowChinaTime) {
+					const time =
+						`${this.hours[this.multiIndex[3]]}:${this.minutes[this.multiIndex[4]]}:${this.seconds[this.multiIndex[5]]}`;
+					const {
+						name
+					} = getChinaTime(time);
+				
+					const index = this.chinaHours.findIndex(item => item.name == name);
+					this.multiIndex.splice(this.multiIndex.length - 1, 1, index)
+				}
+				
+			},
+			getSolarDate() {
+				const solarData = calendar.lunar2solar(this.selectYear, this.selectMonth, this.selectDay, this.isLeap);
+				console.log('solarData:', solarData);
+				const {
+					cYear,
+					cMonth,
+					cDay,
+					lYear,
+					lMonth,
+					lDay,
+					isLeap,
+					IMonthCn,
+					IDayCn
+				} = solarData;
+				this.selectYear = cYear;
+				this.selectMonth = cMonth;
+				this.selectDay = cDay;
+				this.isLeap = isLeap;
+				const yearIndex = this.years.findIndex(item => item == cYear);
+				const monthIndex = this.months.findIndex(item => item == cMonth);
+				const dayIndex = this.days.findIndex(item => item == cDay);
+				this.multiIndex.splice(0, 1, yearIndex);
+				this.multiIndex.splice(1, 1, monthIndex);
+				this.multiIndex.splice(2, 1, dayIndex);
+			},
+			timeChange(e) {
+				const {
+					id,
+					index
+				} = e.target.dataset;
+				console.log('++++++',id,index)
+				const scrollIndex = e.detail.value[0];
+				this.multiIndex.splice(index, 1, scrollIndex);
+				const names = ['Year', 'Month', 'Day'];
+				if (!this.isLunar) {
+					if (index == 1) {
+						this.selectMonth = addZero(scrollIndex + 1) + '';
+						this.days = getDays(this.selectYear, this.selectMonth);
+						if (this.multiIndex[index + 1] + 1 > this.days.length) {
+							this.multiIndex.splice(index + 1, 1, this.days.length - 1);
+							this.selectDay = addZero(this.days.length);
+						}
+					} else if (index == 0) {
+						this.selectYear = this.years[scrollIndex];
+					} else {
+						this['select' + names[index]] = addZero(scrollIndex + 1) + '';
+					}
+					this.selectTime = `${addZero(this.multiIndex[3]+1)}:${addZero(this.multiIndex[4]+1)}:${addZero(this.multiIndex[5]+1)}`;
+					this.$nextTick(() => {
+						this.selectDate = `${this.selectYear}-${this.selectMonth}-${this.selectDay} ${this.selectTime}`;
+						console.log('selectDate', this.selectDate)
+					})
+				} else {
+					if (index == 0) {
+						this.selectYear = Number(this.ganZhiYears[this.multiIndex[0]].slice(0, 4));
+						const leapMonth = calendar.leapMonth(this.selectYear);
+						console.log('leapMonth:', leapMonth)
+						this.ganZhiMonths = this.months.map(month => calendar.toChinaMonth(month));
+						let monthCount, monthIndex;
+						if (leapMonth > 0) { //所选的年有闰年
+							this.ganZhiMonths.splice(leapMonth, 0, `闰${calendar.toChinaMonth(leapMonth)}`);
+						}
+						if (this.multiIndex[1] + 1 > this.ganZhiMonths.length) {
+							this.multiIndex.splice(1, 1, this.ganZhiMonths.length - 1);
+						}
+						const month = this.ganZhiMonths[this.multiIndex[1]];
+						monthIndex = this.ganZhiMonths.findIndex(item => item == month);
+						if (leapMonth > 0) {
+							console.log('======', )
+							if (monthIndex == leapMonth) {
+								this.selectMonth = monthIndex;
+								this.isLeap = true;
+								monthCount = calendar.leapDays(this.selectYear);
+							} else {
+								if (monthIndex > leapMonth) {
+									this.selectMonth = monthIndex
+								} else {
+									this.selectMonth = monthIndex + 1;
+								}
+								this.isLeap = false;
+								monthCount = calendar.monthDays(this.selectYear, this.selectMonth)
+							}
+						} else {
+							this.selectMonth = monthIndex + 1;
+							this.isLeap = false;
+							monthCount = calendar.monthDays(this.selectYear, this.selectMonth)
+						}
+						const ganZhiDays = [];
+						for (let i = 1; i <= monthCount; i++) {
+							ganZhiDays.push(calendar.toChinaDay(i));
+						}
+						this.ganZhiDays = ganZhiDays;
+						if (this.multiIndex[2] + 1 > this.ganZhiDays.length) {
+							this.multiIndex.splice(2, 1, this.ganZhiDays.length - 1);
+						}
+					} else if (index == 1) {
+						const leapMonth = calendar.leapMonth(this.selectYear);
+						console.log('leapMonth:', leapMonth)
+						let monthCount, monthIndex;
+						const month = this.ganZhiMonths[this.multiIndex[1]];
+						monthIndex = this.ganZhiMonths.findIndex(item => item == month);
+						if (leapMonth > 0) {
+							if (monthIndex == leapMonth) {
+								this.selectMonth = monthIndex;
+								this.isLeap = true;
+								monthCount = calendar.leapDays(this.selectYear);
+							} else {
+								if (monthIndex > leapMonth) {
+									this.selectMonth = monthIndex
+								} else {
+									this.selectMonth = monthIndex + 1;
+								}
+								this.isLeap = false;
+								monthCount = calendar.monthDays(this.selectYear, this.selectMonth)
+							}
+						} else {
+							this.selectMonth = monthIndex + 1;
+							this.isLeap = false;
+							monthCount = calendar.monthDays(this.selectYear, this.selectMonth)
+						}
+						const ganZhiDays = [];
+						for (let i = 1; i <= monthCount; i++) {
+							ganZhiDays.push(calendar.toChinaDay(i));
+						}
+						this.ganZhiDays = ganZhiDays;
+						if (this.multiIndex[2] + 1 > this.ganZhiDays.length) {
+							this.multiIndex.splice(2, 1, this.ganZhiDays.length - 1);
+						}
+					} else if (index == 2) {
+						this.selectDay = this.multiIndex[2] + 1;
+					}else if(index == 6){
+						const { startTime } = this.chinaHours[scrollIndex];
+						this.selectTime = startTime;
+					}
+				}
+			},
+
+			changeCalendar(index) {
+				if (index == 0) { //阳历
+					this.$emit('changecalendar', false);
+					this.getSolarDate();
+				} else if (index == 1) { //阴历
+					this.$emit('changecalendar', true);
+					this.getLunarDate()
+				} else if (index == 2) { //确定
+					let selectDate;
+					if (this.isLunar) {
+						selectDate = calendar.lunar2solar(this.selectYear, this.selectMonth, this.selectDay, this.isLeap);
+					} else {
+						selectDate = calendar.solar2lunar(this.selectYear, this.selectMonth, this.selectDay);
+					}
+					this.hide();
+					selectDate['date'] = getDateStringTime(selectDate['date']);
+					selectDate['lunarDate'] = getDateStringTime(selectDate['lunarDate']);
+					let time;
+					if(this.isShowChinaTime){
+						const { startTime,name } = this.chinaHours[this.multiIndex[6]];
+						selectDate['chinaTime'] = name;
+						time = startTime;
+					}else{
+						time =
+							`${this.hours[this.multiIndex[3]]}:${this.minutes[this.multiIndex[4]]}:${this.seconds[this.multiIndex[5]]}`;
+						selectDate['chinaTime'] = getChinaTime(time) && getChinaTime(time)['name'];
+					}
+					this.$emit('confirm', { ...selectDate,
+						time
+					})
+				}
+
+			}
+		},
+		mounted() {
+
+		}
+
+	}
+</script>
+
+<style lang="scss" scoped>
+	$zIndex: 1000;
+
+	.calendar {
+		.calendar-mask {
+			position: fixed;
+			top: 0;
+			left: 0;
+			right: 0;
+			bottom: 0;
+			background-color: rgba(0, 0, 0, .5);
+			z-index: $zIndex;
+		}
+
+		.calendar-container {
+			position: absolute;
+			bottom: 0;
+			left: 0;
+			right: 0;
+			height: 500rpx;
+			background-color: #fff;
+			z-index: $zIndex+1;
+			display: flex;
+			flex-direction: column;
+
+			.calendar-header {
+				display: flex;
+				justify-content: space-between;
+				align-items: center;
+				height: 80rpx;
+				box-sizing: border-box;
+				padding: 0 32rpx;
+
+				.txt {
+					flex: 1;
+					font-size: 32rpx;
+
+					&.solar {
+						text-align: left;
+					}
+
+					&.lunar {
+						text-align: center;
+					}
+
+					&.confirm {
+						text-align: right;
+						cursor: pointer;
+					}
+				}
+			}
+
+			.calendar-body {
+				flex: 1;
+				display: flex;
+
+				.calendar-body-wrap {
+					flex: 1;
+					font-size: 26rpx;
+				}
+			}
+		}
+	}
+</style>

+ 575 - 0
components/charts/blueHorBarChartOne.vue

@@ -0,0 +1,575 @@
+<template>
+	<view class="content">
+		<!-- #ifdef APP-PLUS || H5 -->
+		<view class="top-Section">
+			<view class="title" v-if="type=='default'">{{title}}</view>
+			<view class="leftBtn" v-if="type=='type1'" @click='leftBtnAction'>
+				<view class="btnName">
+					{{title}}
+				</view>
+				<image class="btnIcon" src="../../static/icons/icon_drop_black@2x.png" mode=""></image>
+			</view>
+			<view class="explainBtn" @click="explainAction" v-if="title!='识别类别'&&title!='项目排名'&&title!='到访类别'&&title!='认证方式' && title!='成交业态' && title!='活动统计'">
+				<image class="explainImg" src="../../static/icons/icon_introduce@2x.png" mode=""></image>
+			</view>
+			<view class="rightBtn" @click="rightBtnAction" v-if="rightTitle.length > 0">
+				<view class="btnName">
+					{{rightTitle}}
+				</view>
+				<image class="btnIcon" v-if="rightType == 'default'" src="../../static/icons/icon_dropDown@2x.png" mode=""></image>
+				<view class="btnIcon" v-else></view>
+			</view>
+		</view>
+		<view style="position: relative;">
+			<view style="width: 100%; height: 260rpx; min-height: 260rpx;display: flex;flex-direction: column;align-items: center; margin-top: 0;margin-left: 0;"
+			 v-if="dataList.length==0">
+				<image src="../../static/icons/empty_bb.png" mode="" style="width: 283rpx;height: 227rpx;"></image>
+				<text style="opacity: 0.35;font-size: 28rpx;font-family: PingFang SC, PingFang SC-Medium;font-weight: 500;text-align: center;color: #202638;">暂时没有{{emptyDesc}}</text>
+			</view>
+			<view>
+				<view v-if="dataList.length>0" class="lineView" :style="`background-color: ${isThemeColor ? themeColor: fuzhuColor}; height: ${(nameList.length * 60 - 40) + 'rpx'} `"></view>
+				<view @click="echarts.onClick" :prop="option" :change:prop="echarts.updateEcharts" ref="chartId" :id="chartId"
+				 class="echarts" v-if="fuzhuColor50!=null" :style="`height: ${(nameList.length * 60) + 'rpx'}`"></view>
+
+				<view class="clickDiv">
+					<view class="clickDiv-item" v-for="(item, index) in nameList" :key="index" style="height: 70px" @click="showAllName(item)"></view>
+				</view>
+			</view>
+		</view>
+
+		<view class="goMoreData" @click="getMoreDataAction" v-if="isShowMore">查看更多></view>
+		<!-- #endif -->
+		<view class="toastDiv" v-show="isShowToast">
+			<view class="toast">{{toastStr}}</view>
+		</view>
+		<dm-explain-picker :title="explainTitle" :chartId="chartId" :isJiTuanCeng="isJiTuanCeng" :brandSelected="brandSelected" ref="dmExplainPicker"></dm-explain-picker>
+	</view>
+</template>
+
+<script>
+	import echarts from '../../static/echarts.js'
+	import dmExplainPicker from '../subComponents/dmExplainPicker.vue'
+
+	export default {
+		props: {
+			themeColor: null,
+			fuzhuColor: null,
+			themeColor50: null,
+			themeColor25: null,
+			fuzhuColor50: null,
+			chartId: String,
+			title: String,
+			rightTitle: String,
+			isThemeColor: {
+				type: Boolean,
+				default: true
+			},
+			unit: {
+				type: String,
+				default: '%'
+			},
+			dataList: Array,
+			yDataList: Array,
+			isShowMore: {
+				type: Boolean,
+				default: false
+			},
+			dataCount: {
+				type: Number,
+				default: 6
+			},
+			emptyDesc: {
+				type: String,
+				default: "数据"
+			},
+			type: {
+				type: String,
+				default: 'default'
+			},
+			rightType: {
+				type: String,
+				default: 'default'
+			},
+			isJiTuanCeng:{
+				type: Boolean,
+				default: false
+			},
+			brandSelected: {
+				type: Boolean,
+				default: false
+			}
+		},
+		data() {
+			return {
+				y2DataList: [],
+				explainTitle: '',
+				nameList: [],
+				option: {
+					// tooltip: {
+					// 	formatter: '{b}',
+					// 	// trigger: 'item',
+					// 	// align: 'auto',
+					// 	extraCssText: 'z-index:50',
+					// 	// hideDelay: 2000,
+					// 	// formatter: function(e) {
+					// 	// 	// // console.log('tooltip打印:', e)
+					// 	// 	return e.name
+					// 	// }
+					// },
+					grid: {
+						left: '36%',
+						right: '20%',
+						top: '0%',
+						bottom: '0%',
+						containLabel: false
+					},
+					xAxis: {
+						type: 'value',
+						show: false
+					},
+					yAxis: [{
+							type: 'category',
+							data: [],
+							triggerEvent: true,
+							inverse: true,
+							axisLabel: { //坐标轴刻度标签的相关设置。
+								margin: 115,
+								align: 'left',
+								// backgroundColor: '#FEE1A7',
+								interval: 0,
+								textStyle: {
+									color: '#393939',
+									fontFamily: 'Verdana',
+									fontSize: 14,
+									// lineHeight: 7,
+								}
+							},
+							axisTick: { //坐标轴刻度相关设置。
+								show: false,
+							},
+							axisLine: { //坐标轴轴线相关设置
+								show: false
+							},
+						},
+						{
+							type: 'category',
+							data: [],
+							inverse: true,
+							axisLabel: { //坐标轴刻度标签的相关设置。
+								margin: 60,
+								align: 'right',
+								textStyle: {
+									color: '',
+									fontFamily: 'Verdana',
+									fontSize: 14,
+								},
+								// formatter: (a) => {
+								// 	return a + '%'
+								// },
+							},
+							axisTick: { //坐标轴刻度相关设置。
+								show: false,
+							},
+							axisLine: { //坐标轴轴线相关设置
+								show: false
+							}
+						},
+					],
+					series: {
+						name: '',
+						type: 'bar',
+						barWidth: 6,
+						data: [],
+						itemStyle: { //图形样式
+							normal: {
+								barBorderRadius: 3,
+								color: ''
+							},
+						}
+					}
+				},
+				isShowToast: false,
+				toastStr: ''
+			}
+		},
+
+		mounted() {},
+
+		methods: {
+			getDataAction() {
+				this.option.series.data = []
+				this.option.yAxis[0].data = []
+				this.option.yAxis[1].data
+
+				this.option.series.data = this.dataList
+				// // console.log("getDataAction -> this.dataList", this.chartId, this.dataList)
+				var yTempDataList = JSON.parse(JSON.stringify(this.yDataList.length > 6 ? this.yDataList.slice(0, 6) : this.yDataList))
+				this.nameList = JSON.parse(JSON.stringify(this.yDataList.length > 6 ? this.yDataList.slice(0, 6) : this.yDataList))
+				for (var i = 0; i < yTempDataList.length; i++) {
+					let item = yTempDataList[i]
+					if (item.length > 7) {
+						yTempDataList[i] = item.slice(0, 7) + "..."
+					}
+				}
+				// for (var i = 0; i < yTempDataList.length; i++) {
+				// 	let item = yTempDataList[i]
+				// 	// if (item.length > 5) {
+				// 	// 	yTempDataList[i] = item.slice(0, 5) + "..."
+				// 	// 	// yTempDataList[i] = item.join()
+				// 	// 	// yTempDataList[i] = this.insertStr()
+				// 	// }
+
+				// 	var newParamsName = ""; // 最终拼接成的字符串
+				// 	var paramsNameNumber = item.length; // 实际标签的个数
+				// 	var provideNumber = 6; // 每行能显示的字的个数
+				// 	var rowNumber = Math.ceil(paramsNameNumber / provideNumber); // 换行的话,需要显示几行,向上取整
+				// 	/**
+				// 	 * 判断标签的个数是否大于规定的个数, 如果大于,则进行换行处理 如果不大于,即等于或小于,就返回原标签
+				// 	 */
+				// 	// 条件等同于rowNumber>1
+				// 	if (paramsNameNumber > provideNumber) {
+				// 		/** 循环每一行,p表示行 */
+				// 		for (var p = 0; p < rowNumber; p++) {
+				// 			var tempStr = ""; // 表示每一次截取的字符串
+				// 			var start = p * provideNumber; // 开始截取的位置
+				// 			var end = start + provideNumber; // 结束截取的位置
+				// 			// 此处特殊处理最后一行的索引值
+				// 			if (p == rowNumber - 1) {
+				// 				// 最后一次不换行
+				// 				tempStr = item.substring(start, paramsNameNumber);
+				// 			} else {
+				// 				// 每一次拼接字符串并换行
+				// 				tempStr = item.substring(start, end) + "\n";
+				// 			}
+				// 			newParamsName += tempStr; // 最终拼成的字符串
+				// 		}
+
+				// 	} else {
+				// 		// 将旧标签的值赋给新标签
+				// 		newParamsName = item;
+				// 	}
+				// 	//将最终的字符串返回
+				// 	yTempDataList[i] = newParamsName
+
+				// 	if (yTempDataList[i].length > 12) {
+				// 		yTempDataList[i] = yTempDataList[i].slice(0, 12) + '...'
+				// 	}
+
+				// }
+
+				// console.log("当前数,--+pp", yTempDataList)
+				this.option.yAxis[0].data = yTempDataList
+				this.y2DataList = []
+				var self = this
+				this.dataList.forEach((item, index) => {
+					self.y2DataList.push((item + self.unit))
+				})
+				var y2TempDataList = this.y2DataList.length > 6 ? this.y2DataList.slice(0, 6) : this.y2DataList
+				this.option.yAxis[1].data = y2TempDataList
+				// this.reloadColor()
+				// console.log('柱状图A数据刷新', this.option)
+                uni.$emit('onchanged')
+			},
+			// insertStr(soure, start, newStr){   
+			//    return soure.slice(0, start) + newStr + soure.slice(start);
+			// }
+			reloadColor() {
+				this.option.series.itemStyle.normal.color = new echarts.graphic.LinearGradient(0, 0, 1, 0, [{
+					offset: 0,
+					color: this.isThemeColor ? this.themeColor : this.fuzhuColor
+				}, {
+					offset: 1,
+					color: this.isThemeColor ? this.themeColor50 : this.fuzhuColor50
+				}])
+				this.option.yAxis[1].axisLabel.textStyle.color = this.isThemeColor ? this.themeColor : this.fuzhuColor
+			},
+			onViewClick(options) {
+				// console.log(options)
+				if (options && options.test) {
+					uni.showToast({
+						icon: 'none',
+						title: options.test
+					})
+				}
+			},
+			rightBtnAction() {
+				this.$emit('chartRightBtnAction', this.chartId)
+			},
+			leftBtnAction() {
+				this.$emit('chartLeftBtnAction', this.chartId)
+			},
+			getMoreDataAction() {
+				this.$emit('chartGetMoreDataAction', this.chartId)
+			},
+			explainAction() {
+				this.$refs.dmExplainPicker.show()
+			},
+			showAllName(e) {
+				// console.log('名字打印:', e)
+				// uni.showToast({
+				// 	icon: 'none',
+				// 	title: e,
+				// 	duration: 1000
+				// })
+				this.toastStr = e
+				this.isShowToast = true
+				var self = this
+				var timer = setTimeout(function() {
+					self.isShowToast = false
+					clearTimeout(timer)
+				}, 2000);
+			}
+		},
+		components: {
+			dmExplainPicker
+		},
+		watch: {
+			// chartId: {
+			// 	handler(e) {
+			// 		this.getDataAction()
+			// 	},
+			// 	immediate: true
+			// },
+			dataList: {
+				handler(e) {
+					this.getDataAction()
+				},
+				immediate: true
+			},
+			yDataList: {
+				handler(e) {
+					this.getDataAction()
+				},
+				immediate: true
+			},
+			themeColor: {
+				handler(e) {
+					this.reloadColor()
+				},
+				immediate: true
+			},
+			title: {
+				handler(e) {
+					this.explainTitle = e
+				},
+				immediate: true
+			}
+		}
+
+	}
+</script>
+
+<script module="echarts" lang="renderjs">
+	let myChart
+	export default {
+		mounted() {
+			this.initAction();
+		},
+		methods: {
+			initAction() {
+				if (typeof window.echarts === 'function') {
+					this.initEcharts();
+				} else {
+					// 动态引入较大类库避免影响页面展示
+					const script = document.createElement('script')
+					// view 层的页面运行在 www 根目录,其相对路径相对于 www 计算
+					script.src = 'static/echarts.js'
+					script.onload = this.initEcharts.bind(this)
+					document.head.appendChild(script)
+				}
+			},
+			initEcharts() {
+				// console.log("initEcharts -> this.$refs", this.$refs.chartId.$el.id)
+				myChart = echarts.init(document.getElementById(this.$refs.chartId.$el.id))
+				// 观测更新的数据在 view 层可以直接访问到
+				if (myChart) {
+					myChart.setOption(this.option)
+					myChart.resize();
+					var self = this
+					myChart.on('mousemove', function(params) {
+						// console.log('parmas mouseover 打印:', params)
+						if (params.componentType == "yAxis") {
+							// alert(params.value)
+							// var offsetX = params.event.offsetX + 10;
+							// var offsetY = params.event.offsetY + 10;
+							// myChart.dispatchAction({
+							// 	type: 'showTip',
+							// 	// seriesIndex: params.seriesIndex,
+							// 	// dataIndex: params.dataIndex,
+							// 	position: [offsetX, offsetY]
+							// });
+
+						} else {
+							// alert(params.name)
+							// var offsetX = params.event.offsetX + 10;
+							// var offsetY = params.event.offsetY + 10;
+							// myChart.dispatchAction({
+							// 	type: 'showTip',
+							// 	// seriesIndex: params.seriesIndex,
+							// 	// dataIndex: params.dataIndex,
+							// 	position: [offsetX, offsetY]
+							// });
+						}
+					});
+				}
+			},
+			updateEcharts(newValue, oldValue, ownerInstance, instance) {
+				// 监听 service 层数据变更
+				if (myChart) {
+					myChart.setOption(newValue)
+					myChart.resize();
+				}
+			},
+			onClick(event, ownerInstance) {
+				// 调用 service 层的方法
+				// // console.log('onClick交互:', event, ownerInstance)
+				// ownerInstance.callMethod('onViewClick', {
+				// 	test: 'test'
+				// })
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.content {
+		width: 100%;
+		height: 100%;
+		// background-color: #FFFFFF;
+		position: relative;
+		// padding: 20rpx;
+		padding-bottom: 20rpx;
+		margin-bottom: 40rpx;
+
+		.top-Section {
+			padding: 0 20rpx;
+			display: flex;
+			flex-direction: row;
+			justify-content: flex-start;
+			font-family: Verdana;
+			position: relative;
+			margin-bottom: 20rpx;
+
+			.title {
+				font-size: 32rpx;
+				font-weight: bold;
+				color: #383838;
+				display: block;
+			}
+
+			.leftBtn {
+				display: flex;
+
+				.btnName {
+					font-size: 32rpx;
+					font-weight: bold;
+					color: #383838;
+				}
+
+				.btnIcon {
+					color: #000000;
+					margin-left: 10rpx;
+					margin-top: 7rpx;
+					width: 30rpx;
+					height: 30rpx;
+				}
+			}
+
+			.explainBtn {
+				width: 30rpx;
+				height: 30rpx;
+				margin-left: 10rpx;
+
+				.explainImg {
+					width: 30rpx;
+					height: 30rpx;
+				}
+			}
+
+			.rightBtn {
+				font-size: 24rpx;
+				margin-top: 5rpx;
+				display: flex;
+				flex-direction: row;
+				position: absolute;
+				right: 20rpx;
+
+				.btnName {
+					color: #546074;
+				}
+
+				.btnIcon {
+					color: #000000;
+					margin-left: 10rpx;
+					margin-top: 2rpx;
+					width: 30rpx;
+					height: 30rpx;
+				}
+			}
+		}
+
+		.echarts {
+			width: 100%;
+			margin-top: 0;
+		}
+
+		.goMoreData {
+			font-family: Verdana;
+			color: #546074;
+			font-size: 24rpx;
+			text-align: center;
+			margin-top: 30rpx;
+		}
+
+		.lineView {
+			position: absolute;
+			left: 26rpx;
+			width: 4rpx;
+			border-radius: 2rpx;
+			top: 18rpx;
+		}
+
+		.clickDiv {
+			width: 100%;
+			height: 90%;
+			// background-color: #4CD964;
+			// opacity: 0.5;
+			z-index: 100;
+			top: 10%;
+			left: 0;
+			position: absolute;
+			display: flex;
+			flex-direction: column;
+
+			.clickDiv-item {
+				width: 100%;
+				margin-left: 0;
+				// background-color: #007AFF;
+				// opacity: 0.5;
+				margin-bottom: 5px;
+			}
+		}
+		
+		.toastDiv {
+			position: absolute;
+			top: 0;
+			left: 0;
+			width: 100%;
+			height: 100%;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			.toast {
+				border-radius: 10rpx;
+				background-color: rgba($color: #333, $alpha: 0.42);
+				font-size: 28rpx;
+				text-align: center;
+				padding: 20rpx;
+				max-width: 90%;
+				line-height: 60rpx;
+				color: #FFFFFF;
+				font-family: Verdana;
+			}
+		}
+	}
+</style>

+ 485 - 0
components/charts/blueHorBarChartThree.vue

@@ -0,0 +1,485 @@
+<template>
+	<view class="content">
+		<!-- #ifdef APP-PLUS || H5 -->
+		<view class="top-Section">
+			<view class="title">{{title}}</view>
+			<view  class="rightBtn">
+				<view style="display: flex;"   @click="exportAction" v-if="isShowExport" >
+					<view class="btnName" style="margin-right: 2rpx;cursor: pointer;">导出</view>
+					<image class="icon_export" src="../../static/icons/icon_export@2x.png" mode=""></image>
+				</view>
+				<view  style="display: flex;margin-left: 10rpx;"  @click="rightBtnAction" v-if="rightTitle.length > 0 && rightShowMore">
+					<view class="btnName">
+						{{rightTitle}}
+					</view>
+					<image v-if="rightShowMore" class="btnIcon" src="../../static/icons/icon_dropDown@2x.png" mode="aspectFit"></image>
+				</view>
+			</view>
+				
+		</view>
+		<view style="position: relative;">
+			<view style="width: 100%; height: 260rpx; min-height: 260rpx;display: flex;flex-direction: column;align-items: center; margin-top: 0;margin-left: 0;"
+			 v-if="dataList.length==0">
+				<image src="../../static/icons/empty_bb.png" mode="" style="width: 283rpx;height: 227rpx;"></image>
+				<text style="opacity: 0.35;font-size: 28rpx;font-family: PingFang SC, PingFang SC-Medium;font-weight: 500;text-align: center;color: #202638;">暂时没有{{emptyDesc}}</text>
+			</view>
+			<view>
+				<view v-if="dataList.length>0" class="lineView" :style="`background-color: ${isThemeColor ? themeColor: fuzhuColor}; height: ${(nameList.length * 60 - 40) + 'rpx'} `"></view>
+				<view @click="echarts.onClick" :prop="option" :change:prop="echarts.updateEcharts" ref="chartId" :id="chartId"
+				 class="echarts" v-if="fuzhuColor50!=null" :style="`height: ${(nameList.length * 60) + 'rpx'}`"></view>
+
+				<view class="clickDiv">
+					<view class="clickDiv-item" v-for="(item, index) in nameList" :key="index" style="height: 70px" @click="showAllName(item)"></view>
+				</view>
+			</view>
+		</view>
+		<view class="toastDiv" v-show="isShowToast">
+			<view class="toast">{{toastStr}}</view>
+		</view>
+		<view class="goMoreData" @click="getMoreDataAction" v-if="isShowMore">查看更多></view>
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+	import echarts from '../../static/echarts.js'
+
+	export default {
+		props: {
+			themeColor: null,
+			fuzhuColor: null,
+			themeColor50: null,
+			themeColor25: null,
+			fuzhuColor50: null,
+			chartId: String,
+			title: String,
+			rightTitle: String,
+			rightShowMore: {
+				type: Boolean,
+				default: true
+			},
+			isThemeColor: {
+				type: Boolean,
+				default: true
+			},
+			isShowExport: {
+				type: Boolean,
+				default: false
+			},
+			unit: {
+				type: String,
+				default: '%'
+			},
+			dataCount: {
+				type: Number,
+				default: 6
+			},
+			dataList: Array,
+			yDataList: Array,
+			isShowMore: {
+				type: Boolean,
+				default: false
+			},
+			emptyDesc: {
+				type: String,
+				default: "数据"
+			}
+		},
+		data() {
+			return {
+				y2DataList: [],
+				nameList: [],
+				option: {
+					// tooltip: {
+					// 	// trigger: 'item',
+					// 	// align: 'auto',
+					// 	formatter: '{b}',
+					// 	extraCssText: 'z-index:50'
+					// },
+					grid: {
+						// left: '10%',
+						// right: '5%',
+						left: '36%',
+						right: '20%',
+						top: '0%',
+						bottom: '0%',
+						containLabel: false
+					},
+					xAxis: {
+						type: 'value',
+						show: false
+					},
+					yAxis: [{
+							type: 'category',
+							inverse: true,
+							data: [],
+							axisLabel: { //坐标轴刻度标签的相关设置。
+								margin: 115,
+								align: 'left',
+								interval: 0,
+								textStyle: {
+									color: '#393939',
+									fontFamily: 'Verdana',
+									fontSize: 14,
+									// lineHeight: 20,
+								}
+
+							},
+							axisTick: { //坐标轴刻度相关设置。
+								show: false,
+							},
+							axisLine: { //坐标轴轴线相关设置
+								show: false
+							},
+						},
+						{
+							type: 'category',
+							data: [],
+							inverse: true,
+							axisLabel: { //坐标轴刻度标签的相关设置。
+								margin: 60,
+								align: 'right',
+								textStyle: {
+									color: '',
+									fontFamily: 'Verdana',
+									fontSize: 14
+								},
+								// formatter: (a) => {
+								// 	return a + '%'
+								// },
+							},
+							axisTick: { //坐标轴刻度相关设置。
+								show: false,
+							},
+							axisLine: { //坐标轴轴线相关设置
+								show: false
+							}
+						}
+					],
+					series: {
+						name: '',
+						type: 'bar',
+						barWidth: 6,
+						data: [],
+						itemStyle: { //图形样式
+							normal: {
+								barBorderRadius: 3,
+								color: ''
+							},
+						}
+					}
+				},
+
+				isShowToast: false,
+				toastStr: ''
+			}
+		},
+
+		mounted() {
+
+		},
+
+		methods: {
+			getDataAction() {
+				this.option.series.data = []
+				this.option.yAxis[0].data = []
+				this.option.yAxis[1].data
+
+				this.option.series.data = this.dataList
+				// // console.log("getDataAction -> this.dataList", this.chartId, this.dataList)
+				var yTempDataList = JSON.parse(JSON.stringify(this.yDataList.length > 6 ? this.yDataList.slice(0, 6) : this.yDataList))
+				this.nameList = JSON.parse(JSON.stringify(this.yDataList.length > 6 ? this.yDataList.slice(0, 6) : this.yDataList))
+
+				for (var i = 0; i < yTempDataList.length; i++) {
+					let item = yTempDataList[i]
+					if (item.length > 7) {
+						yTempDataList[i] = item.slice(0, 7) + "..."
+					}
+				}
+				// for (var i = 0; i < yTempDataList.length; i++) {
+				// 	// let item = yTempDataList[i]
+				// 	// if(item.length>5){
+				// 	// 	yTempDataList[i] = item.slice(0,5)+"..."
+				// 	// }
+
+				// 	let item = yTempDataList[i]
+				// 	// if (item.length > 5) {
+				// 	// 	yTempDataList[i] = item.slice(0, 5) + "..."
+				// 	// 	// yTempDataList[i] = item.join()
+				// 	// 	// yTempDataList[i] = this.insertStr()
+				// 	// }
+
+				// 	var newParamsName = ""; // 最终拼接成的字符串
+				// 	var paramsNameNumber = item.length; // 实际标签的个数
+				// 	var provideNumber = 6; // 每行能显示的字的个数
+				// 	var rowNumber = Math.ceil(paramsNameNumber / provideNumber); // 换行的话,需要显示几行,向上取整
+				// 	/**
+				// 	 * 判断标签的个数是否大于规定的个数, 如果大于,则进行换行处理 如果不大于,即等于或小于,就返回原标签
+				// 	 */
+				// 	// 条件等同于rowNumber>1
+				// 	if (paramsNameNumber > provideNumber) {
+				// 		/** 循环每一行,p表示行 */
+				// 		for (var p = 0; p < rowNumber; p++) {
+				// 			var tempStr = ""; // 表示每一次截取的字符串
+				// 			var start = p * provideNumber; // 开始截取的位置
+				// 			var end = start + provideNumber; // 结束截取的位置
+				// 			// 此处特殊处理最后一行的索引值
+				// 			if (p == rowNumber - 1) {
+				// 				// 最后一次不换行
+				// 				tempStr = item.substring(start, paramsNameNumber);
+				// 			} else {
+				// 				// 每一次拼接字符串并换行
+				// 				tempStr = item.substring(start, end) + "\n";
+				// 			}
+				// 			newParamsName += tempStr; // 最终拼成的字符串
+				// 		}
+
+				// 	} else {
+				// 		// 将旧标签的值赋给新标签
+				// 		newParamsName = item;
+				// 	}
+				// 	//将最终的字符串返回
+				// 	yTempDataList[i] = newParamsName
+				// 	if (yTempDataList[i].length > 12) {
+				// 		yTempDataList[i] = yTempDataList[i].slice(0, 12) + '...'
+				// 	}
+				// }
+
+				// console.log("当前数,--+pp", yTempDataList)
+				this.option.yAxis[0].data = yTempDataList
+				this.y2DataList = []
+				var self = this
+				this.dataList.forEach((item, index) => {
+					self.y2DataList.push((item + self.unit))
+				})
+				var y2TempDataList = this.y2DataList.length > 6 ? this.y2DataList.slice(0, 6) : this.y2DataList
+				this.option.yAxis[1].data = y2TempDataList
+				// this.reloadColor()
+				// console.log('柱状图A数据刷新', this.option)
+				uni.$emit('onchanged')
+			},
+			reloadColor() {
+				this.option.series.itemStyle.normal.color = new echarts.graphic.LinearGradient(0, 0, 1, 0, [{
+					offset: 0,
+					color: this.isThemeColor ? this.themeColor : this.fuzhuColor
+				}, {
+					offset: 1,
+					color: this.isThemeColor ? this.themeColor50 : this.fuzhuColor50
+				}])
+				this.option.yAxis[1].axisLabel.textStyle.color = this.isThemeColor ? this.themeColor : this.fuzhuColor
+			},
+			onViewClick(options) {
+				// console.log(options)
+			},
+			rightBtnAction() {
+				this.$emit('chartRightBtnAction', this.chartId)
+			},
+			getMoreDataAction() {
+				this.$emit('chartGetMoreDataAction', this.chartId)
+			},
+			exportAction(){
+				this.$emit('exportAction',this.chartId)
+			},
+			showAllName(e) {
+				// console.log('名字打印:', e)
+				this.toastStr = e
+				this.isShowToast = true
+				var self = this
+				var timer = setTimeout(function() {
+					self.isShowToast = false
+					clearTimeout(timer)
+				}, 2000);
+			}
+		},
+		watch: {
+			chartId: {
+				handler(e) {
+					this.getDataAction()
+				},
+				immediate: true
+			},
+			dataList: {
+				handler(e) {
+					this.getDataAction()
+				},
+				immediate: true
+			},
+			yDataList: {
+				handler(e) {
+					this.getDataAction()
+				},
+				immediate: true
+			},
+			themeColor: {
+				handler(e) {
+					this.reloadColor()
+				},
+				immediate: true
+			}
+		}
+
+	}
+</script>
+
+<script module="echarts" lang="renderjs">
+	let myChart
+	export default {
+		mounted() {
+			this.initAction();
+		},
+		methods: {
+			initAction() {
+				if (typeof window.echarts === 'function') {
+					this.initEcharts()
+				} else {
+					// 动态引入较大类库避免影响页面展示
+					const script = document.createElement('script')
+					// view 层的页面运行在 www 根目录,其相对路径相对于 www 计算
+					script.src = 'static/echarts.js'
+					script.onload = this.initEcharts.bind(this)
+					document.head.appendChild(script)
+				}
+			},
+			initEcharts() {
+				// console.log("initEcharts -> this.$refs", this.$refs.chartId.$el.id)
+				myChart = echarts.init(document.getElementById(this.$refs.chartId.$el.id))
+				// 观测更新的数据在 view 层可以直接访问到
+				if (myChart) {
+					myChart.setOption(this.option)
+					myChart.resize();
+				}
+			},
+			updateEcharts(newValue, oldValue, ownerInstance, instance) {
+				// 监听 service 层数据变更
+				if (myChart) {
+					myChart.setOption(newValue)
+					myChart.resize();
+				}
+			},
+			onClick(event, ownerInstance) {
+				// 调用 service 层的方法
+				ownerInstance.callMethod('onViewClick', {
+					test: 'test'
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.content {
+		width: 100%;
+		height: 100%;
+		// background-color: #FFFFFF;
+		position: relative;
+		// padding: 20rpx;
+		padding-bottom: 20rpx;
+		margin-bottom: 40rpx;
+		// background-color: #4CD964;
+
+		.top-Section {
+			padding: 0 20rpx;
+			display: flex;
+			flex-direction: row;
+			justify-content: space-between;
+			font-family: Verdana;
+			margin-bottom: 20rpx;
+
+			.title {
+				font-size: 32rpx;
+				font-weight: bold;
+				color: #383838;
+			}
+
+			.rightBtn {
+				font-size: 24rpx;
+				margin-top: 5rpx;
+				display: flex;
+				flex-direction: row;
+
+				.btnName {
+					color: #546074;
+				}
+
+				.btnIcon {
+					color: #000000;
+					margin-left: 10rpx;
+					margin-top: 0rpx;
+					width: 30rpx;
+					height: 30rpx;
+				}
+				.icon_export{
+					width: 28rpx;
+					height: 25rpx;
+					margin-top: 5rpx;
+					margin-left: 6rpx;
+				}
+			}
+		}
+
+		.echarts {
+			width: 100%;
+			margin-top: 0;
+		}
+
+		.goMoreData {
+			font-family: Verdana;
+			color: #546074;
+			font-size: 24rpx;
+			text-align: center;
+			margin-top: 30rpx;
+		}
+
+		.lineView {
+			position: absolute;
+			left: 26rpx;
+			width: 4rpx;
+			border-radius: 2rpx;
+		    top: 18rpx;
+		}
+
+		.clickDiv {
+			width: 100%;
+			height: 90%;
+			// background-color: #4CD964;
+			// opacity: 0.5;
+			z-index: 100;
+			top: 10%;
+			left: 0;
+			position: absolute;
+			display: flex;
+			flex-direction: column;
+
+			.clickDiv-item {
+				width: 100%;
+				margin-left: 0;
+				// background-color: #007AFF;
+				// opacity: 0.5;
+				margin-bottom: 5px;
+			}
+		}
+		
+		.toastDiv {
+			position: absolute;
+			top: 0;
+			left: 0;
+			width: 100%;
+			height: 100%;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			.toast {
+				border-radius: 10rpx;
+				background-color: rgba($color: #333, $alpha: 0.42);
+				font-size: 28rpx;
+				text-align: center;
+				padding: 20rpx;
+				max-width: 90%;
+				line-height: 60rpx;
+				color: #FFFFFF;
+				font-family: Verdana;
+			}
+		}
+		
+	}
+</style>

+ 517 - 0
components/charts/blueHorBarChartTwo.vue

@@ -0,0 +1,517 @@
+<template>
+	<view class="content">
+		<!-- #ifdef APP-PLUS || H5 -->
+		<view class="top-Section">
+			<!-- <view class="title">{{title}}</view> -->
+			<view class="title" v-if="type=='default'">{{title}}</view>
+			<view class="leftBtn" v-if="type=='type1'" @click='leftBtnAction'>
+				<view class="btnName">
+					{{title}}
+				</view>
+				<image class="btnIcon" src="../../static/icons/icon_drop_black@2x.png" mode=""></image>
+			</view>
+			<view  class="rightBtn">
+				<view style="display: flex;"   @click="exportAction" v-if="isShowExport" >
+					<view class="btnName" style="margin-right: 1px;cursor: pointer;">导出</view>
+					<image class="icon_export" src="../../static/icons/icon_export@2x.png" mode=""></image>
+				</view>
+				
+				<view style="display: flex;margin-left: 0rpx;"  @click="rightBtnAction" v-if="rightTitle.length > 0">
+					<view class="btnName">
+						{{rightTitle}}
+					</view>
+					<image class="btnIcon" src="../../static/icons/icon_dropDown@2x.png" mode=""></image>
+				</view>
+			</view>
+			
+		</view>
+		<view style="position: relative;">
+			<view style="width: 100%; height: 260rpx; min-height: 260rpx;display: flex;flex-direction: column;align-items: center; margin-top: 0;margin-left: 0;"
+			 v-if="dataList.length==0">
+				<image src="../../static/icons/empty_bb.png" mode="" style="width: 283rpx;height: 227rpx;"></image>
+				<text style="opacity: 0.35;font-size: 28rpx;font-family: PingFang SC, PingFang SC-Medium;font-weight: 500;text-align: center;color: #202638;">暂时没有{{emptyDesc}}</text>
+			</view>
+			<view>
+				<view v-if="dataList.length>0" class="lineView" :style="`background-color: ${isThemeColor ? themeColor: fuzhuColor}; height: ${(nameList.length * 60 - 40) + 'rpx'} `"></view>
+				<view @click="echarts.onClick" :prop="option" :change:prop="echarts.updateEcharts" ref="chartId" :id="chartId"
+				 class="echarts" v-if="fuzhuColor50!=null" :style="`height: ${(nameList.length * 60) + 'rpx'}`"></view>
+
+				<view class="clickDiv">
+					<view class="clickDiv-item" v-for="(item, index) in nameList" :key="index" style="height: 70px" @click="showAllName(item)"></view>
+				</view>
+			</view>
+		</view>
+		<view class="toastDiv" v-show="isShowToast">
+			<view class="toast">{{toastStr}}</view>
+		</view>
+		<view class="goMoreData" @click="getMoreDataAction" v-if="isShowMore">查看更多></view>
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+	import echarts from '../../static/echarts.js'
+
+	export default {
+		props: {
+			themeColor: null,
+			fuzhuColor: null,
+			themeColor50: null,
+			themeColor25: null,
+			fuzhuColor50: null,
+			chartId: String,
+			title: String,
+			rightTitle: String,
+			isThemeColor: {
+				type: Boolean,
+				default: true
+			},
+			dataCount: {
+				type: Number,
+				default: 6
+			},
+			unit: {
+				type: String,
+				default: '%'
+			},
+			dataList: Array,
+			yDataList: Array,
+			isShowMore: {
+				type: Boolean,
+				default: false
+			},
+			isShowExport: {
+				type: Boolean,
+				default: false
+			},
+			emptyDesc: {
+				type: String,
+				default: "数据"
+			},
+			type: {
+				type: String,
+				default: 'default'
+			}
+		},
+		data() {
+			return {
+				y2DataList: [],
+				nameList: [],
+				option: {
+					// tooltip: {
+					// 	// trigger: 'item',
+					// 	// align: 'auto',
+					// 	formatter: '{b}',
+					// 	extraCssText: 'z-index:50'
+					// },
+					grid: {
+						left: '36%',
+						right: '20%',
+						top: '0%',
+						bottom: '0%',
+						containLabel: false
+					},
+					xAxis: {
+						type: 'value',
+						show: false
+					},
+					yAxis: [{
+							type: 'category',
+							data: [],
+							inverse: true,
+							axisLabel: { //坐标轴刻度标签的相关设置。
+								margin: 115,
+								align: 'left',
+								interval: 0,
+								textStyle: {
+									color: '#393939',
+									fontFamily: 'Verdana',
+									fontSize: 14,
+									// rowNumber: 2
+									// lineHeight: 20,
+								}
+
+							},
+							axisTick: { //坐标轴刻度相关设置。
+								show: false,
+							},
+							axisLine: { //坐标轴轴线相关设置
+								show: false
+							},
+						},
+						{
+							type: 'category',
+							data: [],
+							inverse: true,
+							axisLabel: { //坐标轴刻度标签的相关设置。
+								margin: 60,
+								align: 'right',
+								textStyle: {
+									color: '',
+									fontFamily: 'Verdana',
+									fontSize: 14
+								},
+								// formatter: (a) => {
+								// 	return a + '%'
+								// },
+							},
+							axisTick: { //坐标轴刻度相关设置。
+								show: false,
+							},
+							axisLine: { //坐标轴轴线相关设置
+								show: false
+							}
+						}
+					],
+					series: {
+						name: '',
+						type: 'bar',
+						barWidth: 6,
+						data: [],
+						itemStyle: { //图形样式
+							normal: {
+								barBorderRadius: 3,
+								color: ''
+							},
+						}
+					}
+				},
+				
+				isShowToast: false,
+				toastStr: ''
+				
+			}
+		},
+
+		mounted() {
+
+		},
+
+		methods: {
+			getDataAction() {
+				this.option.series.data = []
+				this.option.yAxis[0].data = []
+				this.option.yAxis[1].data
+
+				this.option.series.data = this.dataList
+				// // console.log("getDataAction -> this.dataList", this.chartId, this.dataList)
+				var yTempDataList = JSON.parse(JSON.stringify(this.yDataList.length > 6 ? this.yDataList.slice(0, 6) : this.yDataList))
+				this.nameList = JSON.parse(JSON.stringify(this.yDataList.length > 6 ? this.yDataList.slice(0, 6) : this.yDataList))
+
+				for (var i = 0; i < yTempDataList.length; i++) {
+					let item = yTempDataList[i]
+					if (item.length > 7) {
+						yTempDataList[i] = item.slice(0, 7) + "..."
+					}
+				}
+				// for (var i = 0; i < yTempDataList.length; i++) {
+				// 	// let item = yTempDataList[i]
+				// 	// if(item.length>5){
+				// 	// 	yTempDataList[i] = item.slice(0,5)+"..."
+				// 	// }
+
+				// 	let item = yTempDataList[i]
+				// 	// if (item.length > 5) {
+				// 	// 	yTempDataList[i] = item.slice(0, 5) + "..."
+				// 	// 	// yTempDataList[i] = item.join()
+				// 	// 	// yTempDataList[i] = this.insertStr()
+				// 	// }
+
+				// 	var newParamsName = ""; // 最终拼接成的字符串
+				// 	var paramsNameNumber = item.length; // 实际标签的个数
+				// 	var provideNumber = 6; // 每行能显示的字的个数
+				// 	var rowNumber = Math.ceil(paramsNameNumber / provideNumber); // 换行的话,需要显示几行,向上取整
+				// 	/**
+				// 	 * 判断标签的个数是否大于规定的个数, 如果大于,则进行换行处理 如果不大于,即等于或小于,就返回原标签
+				// 	 */
+				// 	// 条件等同于rowNumber>1
+				// 	if (paramsNameNumber > provideNumber) {
+				// 		/** 循环每一行,p表示行 */
+				// 		for (var p = 0; p < rowNumber; p++) {
+				// 			var tempStr = ""; // 表示每一次截取的字符串
+				// 			var start = p * provideNumber; // 开始截取的位置
+				// 			var end = start + provideNumber; // 结束截取的位置
+				// 			// 此处特殊处理最后一行的索引值
+				// 			if (p == rowNumber - 1) {
+				// 				// 最后一次不换行
+				// 				tempStr = item.substring(start, paramsNameNumber);
+				// 			} else {
+				// 				// 每一次拼接字符串并换行
+				// 				tempStr = item.substring(start, end) + "\n";
+				// 			}
+				// 			newParamsName += tempStr; // 最终拼成的字符串
+				// 		}
+
+				// 	} else {
+				// 		// 将旧标签的值赋给新标签
+				// 		newParamsName = item;
+				// 	}
+				// 	//将最终的字符串返回
+				// 	yTempDataList[i] = newParamsName
+				// 	if (yTempDataList[i].length > 12) {
+				// 		yTempDataList[i] = yTempDataList[i].slice(0, 12) + '...'
+				// 	}
+				// }
+
+				// console.log("当前数,--+pp", yTempDataList)
+				this.option.yAxis[0].data = yTempDataList
+				this.y2DataList = []
+				var self = this
+				this.dataList.forEach((item, index) => {
+					self.y2DataList.push((item + self.unit))
+				})
+				var y2TempDataList = this.y2DataList.length > 6 ? this.y2DataList.slice(0, 6) : this.y2DataList
+				this.option.yAxis[1].data = y2TempDataList
+				// this.reloadColor()
+				// console.log('柱状图A数据刷新', this.option)
+				uni.$emit('onchanged')
+			},
+			reloadColor() {
+				this.option.series.itemStyle.normal.color = new echarts.graphic.LinearGradient(0, 0, 1, 0, [{
+					offset: 0,
+					color: this.isThemeColor ? this.themeColor : this.fuzhuColor
+				}, {
+					offset: 1,
+					color: this.isThemeColor ? this.themeColor50 : this.fuzhuColor50
+				}])
+				this.option.yAxis[1].axisLabel.textStyle.color = this.isThemeColor ? this.themeColor : this.fuzhuColor
+			},
+			onViewClick(options) {
+				// console.log(options)
+			},
+			rightBtnAction() {
+				this.$emit('chartRightBtnAction', this.chartId)
+			},
+			getMoreDataAction() {
+				this.$emit('chartGetMoreDataAction', this.chartId)
+			},
+			leftBtnAction() {
+				this.$emit('chartLeftBtnAction', this.chartId)
+			},
+			exportAction(){
+				this.$emit('exportAction',this.chartId)
+			},
+			showAllName(e) {
+				// console.log('名字打印:', e)
+				this.toastStr = e
+				this.isShowToast = true
+				var self = this
+				var timer = setTimeout(function() {
+					self.isShowToast = false
+					clearTimeout(timer)
+				}, 2000);
+			}
+		},
+		watch: {
+			chartId: {
+				handler(e) {
+					this.getDataAction()
+				},
+				immediate: true
+			},
+			dataList: {
+				handler(e) {
+					this.getDataAction()
+				},
+				immediate: true
+			},
+			yDataList: {
+				handler(e) {
+					this.getDataAction()
+				},
+				immediate: true
+			},
+			themeColor: {
+				handler(e) {
+					this.reloadColor()
+				},
+				immediate: true
+			}
+		}
+
+	}
+</script>
+
+<script module="echarts" lang="renderjs">
+	let myChart
+	export default {
+		mounted() {
+			this.initAction();
+		},
+		methods: {
+			initAction() {
+				if (typeof window.echarts === 'function') {
+					this.initEcharts()
+				} else {
+					// 动态引入较大类库避免影响页面展示
+					const script = document.createElement('script')
+					// view 层的页面运行在 www 根目录,其相对路径相对于 www 计算
+					script.src = 'static/echarts.js'
+					script.onload = this.initEcharts.bind(this)
+					document.head.appendChild(script)
+				}
+			},
+			initEcharts() {
+				// console.log("initEcharts -> this.$refs", this.$refs.chartId.$el.id)
+				myChart = echarts.init(document.getElementById(this.$refs.chartId.$el.id))
+				// 观测更新的数据在 view 层可以直接访问到
+				if (myChart) {
+					myChart.setOption(this.option)
+					myChart.resize();
+				}
+			},
+			updateEcharts(newValue, oldValue, ownerInstance, instance) {
+				// 监听 service 层数据变更
+				if (myChart) {
+					myChart.setOption(newValue)
+					myChart.resize();
+				}
+			},
+			onClick(event, ownerInstance) {
+				// 调用 service 层的方法
+				ownerInstance.callMethod('onViewClick', {
+					test: 'test'
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.content {
+		width: 100%;
+		height: 100%;
+		// background-color: #FFFFFF;
+		position: relative;
+		// padding: 20rpx;
+		padding-bottom: 20rpx;
+		margin-bottom: 40rpx;
+		// background-color: #4CD964;
+
+		.top-Section {
+			padding: 0 20rpx;
+			display: flex;
+			flex-direction: row;
+			justify-content: space-between;
+			font-family: Verdana;
+			margin-bottom: 20rpx;
+
+			.title {
+				font-size: 32rpx;
+				font-weight: bold;
+				color: #383838;
+				display: block;
+			}
+
+			.leftBtn {
+				display: flex;
+
+				.btnName {
+					font-size: 32rpx;
+					font-weight: bold;
+					color: #383838;
+				}
+
+				.btnIcon {
+					color: #000000;
+					margin-left: 10rpx;
+					margin-top: 7rpx;
+					width: 30rpx;
+					height: 30rpx;
+				}
+			}
+
+			.rightBtn {
+				font-size: 24rpx;
+				margin-top: 5rpx;
+				display: flex;
+				flex-direction: row;
+
+				.btnName {
+					color: #546074;
+				}
+
+				.btnIcon {
+					color: #000000;
+					margin-left: 10rpx;
+					margin-top: 2rpx;
+					width: 30rpx;
+					height: 30rpx;
+				}
+				.icon_export {
+					color: #000000;
+					margin-right: 20rpx;
+					margin-left: 10rpx;
+					margin-top: 2rpx;
+					width: 26rpx;
+					height: 25rpx;
+				}
+			}
+		}
+
+		.echarts {
+			width: 100%;
+			margin-top: 0;
+		}
+
+		.goMoreData {
+			font-family: Verdana;
+			color: #546074;
+			font-size: 24rpx;
+			text-align: center;
+			margin-top: 30rpx;
+		}
+
+		.lineView {
+			position: absolute;
+			left: 26rpx;
+			width: 4rpx;
+			border-radius: 2rpx;
+			top: 18rpx;
+		}
+
+		.clickDiv {
+			width: 100%;
+			height: 90%;
+			// background-color: #4CD964;
+			// opacity: 0.5;
+			z-index: 100;
+			top: 10%;
+			left: 0;
+			position: absolute;
+			display: flex;
+			flex-direction: column;
+
+			.clickDiv-item {
+				width: 100%;
+				margin-left: 0;
+				// background-color: #007AFF;
+				// opacity: 0.5;
+				margin-bottom: 5px;
+			}
+		}
+		
+		.toastDiv {
+			position: absolute;
+			top: 0;
+			left: 0;
+			width: 100%;
+			height: 100%;
+			display: flex;
+			align-items: center;
+			justify-content: center;
+			.toast {
+				border-radius: 10rpx;
+				background-color: rgba($color: #333, $alpha: 0.42);
+				font-size: 28rpx;
+				text-align: center;
+				padding: 20rpx;
+				max-width: 90%;
+				line-height: 60rpx;
+				color: #FFFFFF;
+				font-family: Verdana;
+			}
+		}
+		
+	}
+</style>

+ 352 - 0
components/charts/custNewRadoChart.vue

@@ -0,0 +1,352 @@
+<template>
+	<view class="radoContent">
+		<!-- #ifdef APP-PLUS || H5 -->
+		<view @click="echarts.onClick" :prop="option" :change:prop="echarts.updateEcharts" id="custRadoChart" class="echarts"></view>
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+	import echarts from '../../static/echarts.js'
+	import icons from '../uni-icons/icons.js'
+	export default {
+		props: {
+			chartId: String,
+			dataInfo: null,
+			isShowIcon: {
+				type: Boolean,
+				default: () => {
+					return false
+				}
+			},
+			themeColor: {
+				type: String,
+				default: '#3CD9D9'
+			},
+			themeColor50: {
+				type: String,
+				default: '#AAEFEF'
+			},
+			themeColor25: {
+				type: String,
+				default: '#D4F7F7'
+			},
+			fuzhuColor: {
+				type: String,
+				default: '#FEC350'
+			},
+			fuzhuColor50: {
+				type: String,
+				default: '#FEE1A7'
+			},
+			fuzhuColor15: {
+				type: String,
+				default: '#FFF6E4'
+			}
+		},
+		data() {
+			return {
+				option: {
+					radar: [{
+						indicator: [{
+								name: '关注意愿',
+								max: 100,
+								min: 0
+							},
+							{
+								name: '浏览意愿',
+								max: 100,
+								min: 0
+							},
+							{
+								name: '分享意愿',
+								max: 100,
+								min: 0
+							}
+						],
+						center: ['50%', '65%'],
+						radius: 90,
+						startAngle: 90,
+						splitNumber: 2,
+						shape: 'polygon',
+						name: {
+							formatter: '{value}',
+							textStyle: {
+								color: '#333',
+								opacity: 0.7
+							}
+						},
+						splitArea: {
+							areaStyle: {
+								// color: ['rgba(114, 172, 209, 0.2)',
+								//     'rgba(114, 172, 209, 0.4)', 'rgba(114, 172, 209, 0.6)',
+								//     'rgba(114, 172, 209, 0.8)', 'rgba(114, 172, 209, 1)'],
+								color: [
+									// '#333'
+									'rgba(115,227,227,0.3)'
+									// '#88F4F4'
+									// 'rgba(254,195,80,0.5)',
+									// 'rgba(254,195,80,0.4)',
+									// 'rgba(254,195,80,0.3)',
+									// 'rgba(254,195,80,0.2)',
+									// 'rgba(254,195,80,0.1)'
+								],
+								shadowColor: 'rgba(0, 0, 0, 0)',
+								// shadowBlur: 10
+							}
+						},
+						axisLine: {
+							lineStyle: {
+								// color: 'rgba(255, 255, 255, 0.5)'
+								color: 'rgba(84,222,222,1)'
+							}
+						},
+						splitLine: {
+							lineStyle: {
+								// color: 'rgba(255, 255, 255, 0.5)'
+								color: 'rgba(84,222,222,1)'
+							}
+						}
+					}],
+					series: [{
+						name: '雷达图',
+						type: 'radar',
+						emphasis: {
+							lineStyle: {
+								width: 4
+							}
+						},
+						data: [{
+							value: [],
+							name: '图一',
+							symbol: 'circle',
+							symbolSize: 6,
+							itemStyle: {
+								color: '#fff',
+								borderWidth: 2,
+								// borderColor: '#202638'
+								borderColor: 'rgba(118,228,228,0.7)'
+							},
+							lineStyle: {
+								type: 'solid',
+								borderWidth: 4,
+								// color: '#202638'
+								color: 'rgba(118,228,228,1)'
+							},
+							areaStyle: {
+								// color: 'rgba(255, 255, 255, 0.7)'
+								color: 'rgba(118,228,228,0.6)'
+							}
+						}]
+					}]
+				}
+			
+			}
+		},
+		
+		mounted() {
+			this.getDataAction()
+		},
+		filters: {
+			userLevelFilter(val) {
+				if (val) {
+					switch (val){
+						case 1:
+							return 'A'
+							break;
+						case 2:
+							return 'B'
+							break;
+						default:
+							return 'C'
+							break;
+					}
+				}
+				return '-'
+			}
+		},
+		methods: {
+			
+			getDataAction() {
+				this.option.radar[0].splitArea.areaStyle.color = [this.themeColor25]
+				this.option.radar[0].axisLine.lineStyle.color = this.themeColor
+				this.option.radar[0].splitLine.lineStyle.color = this.themeColor
+				
+				this.option.series[0].data[0].itemStyle.borderColor = this.themeColor
+				this.option.series[0].data[0].lineStyle.color = this.themeColor
+				this.option.series[0].data[0].areaStyle.color = this.themeColor
+				// 关注意愿、浏览意愿、分享意愿
+				this.option.series[0].data[0].value = [this.dataFilter(this.dataInfo.followIntention), this.dataFilter(this.dataInfo.scanIntention), this.dataFilter(this.dataInfo.shareIntention)]	
+				this.option.radar[0].indicator[0].name = '关注意愿' + ':' + this.levelFilter(this.dataInfo.followIntention)
+				this.option.radar[0].indicator[1].name = '浏览意愿' + ':' + this.levelFilter(this.dataInfo.scanIntention)
+				this.option.radar[0].indicator[2].name = '分享意愿' + ':' + this.levelFilter(this.dataInfo.shareIntention)
+			},
+			
+			dataFilter(val) {
+				if (val) {
+					switch (val){
+						case 'A':
+							return 100
+							break;
+						case 'B':
+							return 50
+							break;
+						default:
+							return 10
+							break;
+					}
+				}
+				return 10
+			},
+			
+			levelFilter(val) {
+				if (val) {
+					switch (val){
+						case 'A':
+							return '高'
+							break;
+						case 'B':
+							return '中'
+							break;
+						default:
+							return '低'
+							break;
+					}
+				}
+				return '-'
+			},
+			
+			onViewClick(options) {
+				// console.log(options)
+			}
+		},
+		watch: {
+			dataInfo: {
+				handler(e) {
+					this.getDataAction()
+				},
+				deep: true
+			},
+			fuzhuColor15: {
+				handler(e) {
+					this.getDataAction()
+				},
+				immediate: true
+			}
+		},
+		components: {
+			icons
+		}
+
+	}
+</script>
+
+<script module="echarts" lang="renderjs">
+	let myChart
+	export default {
+		mounted() {
+			this.initAction()
+		},
+		methods: {
+			initAction() {
+				if (typeof window.echarts === 'function') {
+					this.initEcharts()
+				} else {
+					// 动态引入较大类库避免影响页面展示
+					const script = document.createElement('script')
+					// view 层的页面运行在 www 根目录,其相对路径相对于 www 计算
+					script.src = 'static/echarts.js'
+					script.onload = this.initEcharts.bind(this)
+					document.head.appendChild(script)
+				}
+			},
+			initEcharts() {
+				myChart = echarts.init(document.getElementById('custRadoChart'))
+				// 观测更新的数据在 view 层可以直接访问到
+				if (myChart) {
+					myChart.setOption(this.option)
+				}
+			},
+			updateEcharts(newValue, oldValue, ownerInstance, instance) {
+				// 监听 service 层数据变更
+				if (myChart) {
+					myChart.setOption(newValue)
+				}
+			},
+			onClick(event, ownerInstance) {
+				// 调用 service 层的方法
+				ownerInstance.callMethod('onViewClick', {
+					test: 'test'
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.radoContent {
+		width: 100%;
+		height: 100%;
+		position: relative;
+		font-size: 60rpx;
+		font-family: DIN Alternate;
+		font-weight: bold;
+		background-color: #4CD964;
+
+		.echarts {
+			width: 100%;
+			margin-top: 0rpx;
+			height: 100%;
+		}
+		
+		.topSection {
+			position: absolute;
+			top: 0;
+			left: 0;
+			width: 100%;
+			display: flex;
+			align-items: center;
+			justify-content: space-between;
+			padding: 50rpx 48rpx;
+			box-sizing: border-box;
+			
+			.leftDiv {
+				display: flex;
+				flex-direction: column;
+				
+				.levelDiv {
+					display: flex;
+					align-items: center;
+					
+					.des {
+						margin-top: 10rpx;
+						font-size: 12rpx;
+						font-family: Verdana, Verdana-Regular;
+						font-weight: 400;
+						color: #999999;
+					}
+					.levelImg {
+						width: 144rpx;
+						height: 22rpx;
+						margin-top: 20rpx;
+					}
+				}
+			}
+			
+			.level {
+				font-size: 60rpx;
+				font-family: DIN Alternate, DIN Alternate-Bold;
+				font-weight: 700;
+				text-align: center;
+			}
+			
+			.levelDes {
+				font-size: 20rpx;
+				font-family: Verdana, Verdana-Regular;
+				font-weight: 400;
+				color: #999999;
+			}
+			
+		}
+	}
+</style>

+ 284 - 0
components/charts/custRadarChart.vue

@@ -0,0 +1,284 @@
+<template>
+	<view class="content">
+		<!-- #ifdef APP-PLUS || H5 -->
+		<view @click="echarts.onClick" :prop="option" :change:prop="echarts.updateEcharts" ref="chartId" :id="chartId" class="echarts"></view>
+		<view class="chengjiaoLab">
+			<view class="name">
+				{{dataInfo.dealRate}}
+			</view>
+			<view class="valueDes">成交几率</view>
+		</view>
+		<view class="yixiangLab" @click="desClickAction('left')">
+			<view class="name" style="min-height: 70rpx;">
+				{{dataInfo.yxLevel}}
+			</view>
+			<view class="valueDes">意向度</view>
+			<view class="icon" v-if="isShowIcon">
+				?
+			</view>
+		</view>
+		<view class="bakongLab" @click="desClickAction('right')">
+			<view class="name"  style="min-height: 70rpx;">
+				{{bakongNum}}
+			</view>
+			<view class="valueDes">把控值</view>
+			<view class="icon" v-if="isShowIcon">
+				?
+			</view>
+		</view>
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+	import echarts from '../../static/echarts.js'
+	export default {
+		props: {
+			chartId: String,
+			dataInfo: null,
+			isShowIcon: {
+				type: Boolean,
+				default: () => {
+					return false
+				}
+			}
+		},
+		data() {
+			return {
+				chengjiaoNum: 0,
+				yixiangNum: 0,
+				bakongNum: 0,
+				option: {
+					radar: [{
+						indicator: [{
+								name: '成交几率',
+								max: 100,
+								min: 0
+							},
+							{
+								name: '意向度',
+								max: 100,
+								min: 0
+							},
+							{
+								name: '把控值',
+								max: 100,
+								min: 0
+							}
+						],
+						center: ['50%', '55%'],
+						radius: 110,
+						startAngle: 90,
+						splitNumber: 4,
+						shape: 'circle',
+						// name: {
+						// 	formatter: '{value}',
+						// 	textStyle: {
+						// 		color: '#606060',
+						// 		opacity: 0.7
+						// 	}
+						// },
+						splitArea: {
+							areaStyle: {
+								// color: ['rgba(114, 172, 209, 0.2)',
+								//     'rgba(114, 172, 209, 0.4)', 'rgba(114, 172, 209, 0.6)',
+								//     'rgba(114, 172, 209, 0.8)', 'rgba(114, 172, 209, 1)'],
+								color: [
+									'rgba(254,195,80,0.5)',
+									'rgba(254,195,80,0.4)',
+									'rgba(254,195,80,0.3)',
+									'rgba(254,195,80,0.2)',
+									'rgba(254,195,80,0.1)'
+								],
+								shadowColor: 'rgba(0, 0, 0, 0)',
+								// shadowBlur: 10
+							}
+						},
+						axisLine: {
+							lineStyle: {
+								color: 'rgba(255, 255, 255, 0.5)'
+							}
+						},
+						splitLine: {
+							lineStyle: {
+								color: 'rgba(255, 255, 255, 0.5)'
+							}
+						}
+					}],
+					series: [{
+						name: '雷达图',
+						type: 'radar',
+						emphasis: {
+							lineStyle: {
+								width: 4
+							}
+						},
+						data: [{
+							value: [],
+							name: '图一',
+							symbol: 'circle',
+							symbolSize: 6,
+							itemStyle: {
+								color: '#fff',
+								borderWidth: 2,
+								borderColor: '#202638'
+							},
+							lineStyle: {
+								type: 'solid',
+								color: '#202638'
+							},
+							areaStyle: {
+								color: 'rgba(255, 255, 255, 0.7)'
+							}
+						}]
+					}]
+				}
+			}
+		},
+
+		methods: {
+			getDataAction() {
+				this.chengjiaoNum = this.dataInfo.dealRateScore
+				this.yixiangNum = this.dataInfo.yxScore
+				this.bakongNum = this.dataInfo.bkScore
+				// this.chengjiaoNum = Math.ceil(Math.random() * 100)
+				// this.yixiangNum = Math.ceil(Math.random() * 100)
+				// this.bakongNum = Math.ceil(Math.random() * 100)
+				this.option.series[0].data[0].value = [this.chengjiaoNum, this.yixiangNum, this.bakongNum]
+				// // console.log('数据刷新', this.option.series[0].data[0].value)
+			},
+			
+			desClickAction(e) {
+				this.$emit('desClickAction', e)
+			},
+			
+			onViewClick(options) {
+				// console.log(options)
+			}
+		},
+		watch: {
+			chartId: {
+				handler(e) {
+					// // console.log('走没走!!!!', e)
+					this.getDataAction()
+				},
+				immediate: true
+			},
+			dataInfo: {
+				handler(e) {
+					this.getDataAction()
+				},
+				deep: true
+			}
+			
+			
+		}
+
+	}
+</script>
+
+<script module="echarts" lang="renderjs">
+	let myChart
+	export default {
+		mounted() {
+			this.initAction()
+		},
+		methods: {
+			initAction() {
+				if (typeof window.echarts === 'function') {
+					this.initEcharts()
+				} else {
+					// 动态引入较大类库避免影响页面展示
+					const script = document.createElement('script')
+					// view 层的页面运行在 www 根目录,其相对路径相对于 www 计算
+					script.src = 'static/echarts.js'
+					script.onload = this.initEcharts.bind(this)
+					document.head.appendChild(script)
+				}
+			},
+			initEcharts() {
+				// console.log("initEcharts -> this.$refs", this.$refs.chartId.$el.id)
+				myChart = echarts.init(document.getElementById(this.$refs.chartId.$el.id))
+				// 观测更新的数据在 view 层可以直接访问到
+				if (myChart) {
+					myChart.setOption(this.option)
+				}
+			},
+			updateEcharts(newValue, oldValue, ownerInstance, instance) {
+				// 监听 service 层数据变更
+				if (myChart) {
+					myChart.setOption(newValue)
+				}
+			},
+			onClick(event, ownerInstance) {
+				// 调用 service 层的方法
+				ownerInstance.callMethod('onViewClick', {
+					test: 'test'
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.content {
+		width: 100%;
+		height: 100%;
+		position: relative;
+		font-size: 60rpx;
+		font-family: DIN Alternate;
+		font-weight: bold;
+
+		.chengjiaoLab {
+			position: absolute;
+			top: 30rpx;
+			left: 0;
+			width: 100%;
+			text-align: center;
+			color: #FFA74E;
+		}
+
+		.yixiangLab {
+			position: absolute;
+			color: #546074;
+			left: 60rpx;
+			top: 435rpx;
+			width: 80rpx;
+			text-align: center;
+		}
+
+		.bakongLab {
+			position: absolute;
+			color: #546074;
+			right: 60rpx;
+			top: 435rpx;
+			width: 80rpx;
+			text-align: center;
+		}
+		
+		.valueDes {
+			color: rgba($color: #606060, $alpha: 0.7);
+			font-size: 20rpx;
+			text-align: center;
+		}
+		
+		.icon {
+			margin-left: 27rpx;
+			margin-top: 35rpx;
+			width: 26rpx;
+			height: 26rpx;
+			border-radius: 13rpx;
+			font-size: 10rpx;
+			text-align: center;
+			line-height: 26rpx;
+			background-color: #FEC350;
+			color: #FFFFFF;
+		}
+
+		.echarts {
+			width: 100%;
+			margin-top: 0rpx;
+			height: 100%;
+		}
+	}
+</style>

+ 129 - 0
components/charts/customBarChart.vue

@@ -0,0 +1,129 @@
+<template>
+	<view class="barContent">
+		<view class="bar-list">
+			<view class="bar-list-item" v-for="(item, index) in dataList" :key="index">
+				<view class="left">
+					{{item.left}}
+				</view>
+				<!--  :style="`backgroundImage: linear-gradient(${themeColor}, ${themeColor50})};`" -->
+				<view class="mid">
+					<view class="mid-line" v-if="isThemeColor" :style="`width: ${item.percent + '%'};`"></view>
+					<view class="mid-line" v-else :style="`width: ${item.percent + '%'}`"></view>
+				</view>
+				<view class="right">
+					{{item.right}}
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		props: {
+			isThemeColor: {
+				type: Boolean,
+				default: true
+			},
+			orginalList: Array
+		},
+		data() {
+			return {
+				dataList: [],
+				themeColor: null,
+				fuzhuColor: null,
+				themeColor50: null,
+				themeColor25: null,
+				fuzhuColor50: null,
+				fuzhuColor15: null
+			}
+		},
+		mounted() {
+			let globalData = getApp().globalData
+			this.themeColor = globalData.themeColor
+			this.themeColor50 = globalData.themeColor50
+			this.themeColor25 = globalData.themeColor25
+			this.fuzhuColor = globalData.fuzhuColor
+			this.fuzhuColor50 = globalData.fuzhuColor50
+			this.fuzhuColor15 = globalData.fuzhuColor15
+		},
+		methods: {
+			reloadList() {
+				if (this.orginalList.length > 0) {
+					var tempList = JSON.parse(JSON.stringify(this.orginalList || []))
+					tempList = tempList.sort((item1, item2) => {
+						return item1.value - item2.value > 0
+					})
+					// debugger
+					var maxValue = tempList[0].value
+					tempList.forEach((item, index) => {
+						item['percent'] = (item.value / maxValue * 100).toFixed(2)
+					})
+					this.dataList = tempList
+					// // console.log('数据打印111111:', this.dataList)
+				}
+			}
+		},
+		watch: {
+			orginalList: {
+				handler(e) {
+					this.reloadList()
+				}
+			},
+			immediate: true
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.barContent {
+		width: 100%;
+
+		.bar-list {
+			width: 100%;
+
+			.bar-list-item {
+				display: flex;
+				flex-direction: row;
+				justify-content: space-between;
+				font-size: 14rpx;
+				font-family: Verdana;
+				white-space: nowrap;
+				height: 60rpx;
+				// line-height: 60rpx;
+				padding: 0 20rpx 0 52rpx;
+				box-sizing: border-box;
+				min-height: 60rpx;
+
+				.left {
+					color: #393939;
+					width: 25%;
+					align-self: center;
+				}
+
+				.right {
+					color: #3CD9D9;
+					width: 20%;
+					text-align: right;
+					align-self: center;
+				}
+
+				.mid {
+					margin-top: -10rpx;
+					width: 50%;
+					position: relative;
+					align-self: center;
+
+					.mid-line {
+						position: absolute;
+						background-color: #DD524D;
+						height: 12rpx;
+						border-radius: 6rpx;
+						top: 0;
+					}
+				}
+
+			}
+		}
+	}
+</style>

+ 188 - 0
components/charts/daskSubCharts/baobeiChart.vue

@@ -0,0 +1,188 @@
+<template>
+	<view class="content">
+		<!-- #ifdef APP-PLUS || H5 -->
+		<view class="title" 
+		:style="`background-color: ${isYellow ? fuzhuColor50 : themeColor50};`">
+			{{title}}
+		</view>
+		<view class="count">
+			{{count}}
+		</view>
+		<view :prop="option" :change:prop="echarts.updateEcharts" id="baobeiChart" class="echarts" v-show="fuzhuColor50!=null && dataList.length > 0"></view>
+		<!-- #endif -->
+		<!-- #ifndef APP-PLUS || H5 -->
+		<view>非 APP、H5 环境不支持</view>
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+	import echarts from '../../../static/echarts.js'
+	
+	export default {
+		props: {
+			title: String,
+			count: Number,
+			dataList: {
+				type: Array,
+				default: () => {
+					return []
+				}
+			},
+			isYellow: Boolean,
+			themeColor50: String,
+			fuzhuColor50: String,
+		},
+		data() {
+			return {
+				option: {
+					grid: {
+						left: '10%',
+						right: '10%',
+						top: '0%',
+						bottom: '10%',
+						containLabel: false
+					},
+					xAxis: {
+						show: false,
+						type: 'category',
+						boundaryGap: ['20%', '20%']
+					},
+					yAxis: {
+						show: false,
+						type: 'value',
+						boundaryGap: ['70%', '70%']
+					},
+					series: [
+						{
+							type: 'line',
+							smooth: 0.5,
+							symbol: 'none',
+							lineStyle: {
+								color: null,
+								width: 3
+							},
+							data: []
+						}
+					]
+				}
+			}
+		},
+		
+		created() {
+			// this.option.series[0].data = []
+		},
+		
+		methods: {
+			getDataAction() {
+				this.option.series[0].data = this.dataList
+				this.option.series[0].lineStyle.color = this.isYellow ? this.fuzhuColor50 : this.themeColor50
+				// console.log('数据刷新', this.option.series)
+			},
+		},
+		watch: {
+			dataList: {
+				handler(e1, e2) {
+					var e1Str = JSON.stringify(e1)
+					var e2Str = JSON.stringify(e2)
+					if (e1Str && e1Str != e2Str) {
+						this.getDataAction()
+					}
+				},
+				deep: true,
+				immediate: true
+			},
+			themeColor50: {
+				handler(e) {
+					if (e) {
+						this.option.series[0].lineStyle.color = this.isYellow ? this.fuzhuColor50 : this.themeColor50
+					}
+				},
+				immediate: true
+			}
+		}
+		
+	}
+</script>
+
+<script module="echarts" lang="renderjs">
+	let myChart
+	export default {
+		mounted() {
+			this.initAction()
+		},
+		methods: {
+			initAction() {
+				if (typeof window.echarts === 'function') {
+					this.initEcharts()
+				} else {
+					// 动态引入较大类库避免影响页面展示
+					const script = document.createElement('script')
+					// view 层的页面运行在 www 根目录,其相对路径相对于 www 计算
+					script.src = 'static/echarts.js'
+					script.onload = this.initEcharts.bind(this)
+					document.head.appendChild(script)
+				}
+			},
+			initEcharts() {
+				myChart = echarts.init(document.getElementById("baobeiChart"))
+				// 观测更新的数据在 view 层可以直接访问到
+				myChart.setOption(this.option)
+			},
+			updateEcharts(newValue, oldValue, ownerInstance, instance) {
+				if (myChart) {
+					// 监听 service 层数据变更
+					myChart.setOption(newValue)
+				}
+				else {
+					// console.log("无chart11111 -> this.$refs", this.$refs.chartId.$el.id)
+					this.initAction()
+				}
+			},
+			onClick(event, ownerInstance) {
+				// 调用 service 层的方法
+				ownerInstance.callMethod('onViewClick', {
+					test: 'test'
+				})
+			}
+		}
+	}
+</script>
+
+<style>
+	.content {
+		width: 100%;
+		height: 100%;
+	}
+	
+	.title {
+		font-size: 32rpx;
+		font-family: Verdana;
+		text-align: center;
+		width: 176rpx;
+		margin-left: calc((100% - 176rpx) / 2);
+		line-height: 46rpx;
+		/* background-color: #E1F4F4; */
+		color: rgba(0, 0, 0, 0.65);
+		margin-top: 28rpx;
+		margin-left: 20rpx;
+		border-radius: 8rpx;
+	}
+	
+	.count {
+		width: 100%;
+		margin-top: 24rpx;
+		height: 48rpx;
+		line-height: 48rpx;
+		text-align: center;
+		font-family: Verdana;
+		font-size: 40rpx;
+		color: rgba(32, 38, 56, 1);
+	}
+	
+	.echarts {
+		margin-top: 10rpx;
+		width: 100%;
+		height: 80rpx;
+	}
+</style>

+ 188 - 0
components/charts/daskSubCharts/chengjiaoChart.vue

@@ -0,0 +1,188 @@
+<template>
+	<view class="content">
+		<!-- #ifdef APP-PLUS || H5 -->
+		<view class="title" 
+		:style="`background-color: ${isYellow ? fuzhuColor50 : themeColor50};`">
+			{{title}}
+		</view>
+		<view class="count">
+			{{count}}
+		</view>
+		<view :prop="option" :change:prop="echarts.updateEcharts" id="chengjiaoChart" class="echarts" v-show="fuzhuColor50!=null && dataList.length > 0"></view>
+		<!-- #endif -->
+		<!-- #ifndef APP-PLUS || H5 -->
+		<view>非 APP、H5 环境不支持</view>
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+	import echarts from '../../../static/echarts.js'
+	
+	export default {
+		props: {
+			title: String,
+			count: Number,
+			dataList: {
+				type: Array,
+				default: () => {
+					return []
+				}
+			},
+			isYellow: Boolean,
+			themeColor50: String,
+			fuzhuColor50: String,
+		},
+		data() {
+			return {
+				option: {
+					grid: {
+						left: '10%',
+						right: '10%',
+						top: '0%',
+						bottom: '10%',
+						containLabel: false
+					},
+					xAxis: {
+						show: false,
+						type: 'category',
+						boundaryGap: ['20%', '20%']
+					},
+					yAxis: {
+						show: false,
+						type: 'value',
+						boundaryGap: ['70%', '70%']
+					},
+					series: [
+						{
+							type: 'line',
+							smooth: 0.5,
+							symbol: 'none',
+							lineStyle: {
+								color: null,
+								width: 3
+							},
+							data: []
+						}
+					]
+				}
+			}
+		},
+		
+		created() {
+			// this.option.series[0].data = []
+		},
+		
+		methods: {
+			getDataAction() {
+				this.option.series[0].data = this.dataList
+				this.option.series[0].lineStyle.color = this.isYellow ? this.fuzhuColor50 : this.themeColor50
+				// console.log('数据刷新', this.option.series)
+			},
+		},
+		watch: {
+			dataList: {
+				handler(e1, e2) {
+					var e1Str = JSON.stringify(e1)
+					var e2Str = JSON.stringify(e2)
+					if (e1Str && e1Str != e2Str) {
+						this.getDataAction()
+					}
+				},
+				deep: true,
+				immediate: true
+			},
+			themeColor50: {
+				handler(e) {
+					if (e) {
+						this.option.series[0].lineStyle.color = this.isYellow ? this.fuzhuColor50 : this.themeColor50
+					}
+				},
+				immediate: true
+			}
+		}
+		
+	}
+</script>
+
+<script module="echarts" lang="renderjs">
+	let myChart
+	export default {
+		mounted() {
+			this.initAction()
+		},
+		methods: {
+			initAction() {
+				if (typeof window.echarts === 'function') {
+					this.initEcharts()
+				} else {
+					// 动态引入较大类库避免影响页面展示
+					const script = document.createElement('script')
+					// view 层的页面运行在 www 根目录,其相对路径相对于 www 计算
+					script.src = 'static/echarts.js'
+					script.onload = this.initEcharts.bind(this)
+					document.head.appendChild(script)
+				}
+			},
+			initEcharts() {
+				myChart = echarts.init(document.getElementById("chengjiaoChart"))
+				// 观测更新的数据在 view 层可以直接访问到
+				myChart.setOption(this.option)
+			},
+			updateEcharts(newValue, oldValue, ownerInstance, instance) {
+				if (myChart) {
+					// 监听 service 层数据变更
+					myChart.setOption(newValue)
+				}
+				else {
+					// console.log("无chart11111 -> this.$refs", this.$refs.chartId.$el.id)
+					this.initAction()
+				}
+			},
+			onClick(event, ownerInstance) {
+				// 调用 service 层的方法
+				ownerInstance.callMethod('onViewClick', {
+					test: 'test'
+				})
+			}
+		}
+	}
+</script>
+
+<style>
+	.content {
+		width: 100%;
+		height: 100%;
+	}
+	
+	.title {
+		font-size: 32rpx;
+		font-family: Verdana;
+		text-align: center;
+		width: 176rpx;
+		margin-left: calc((100% - 176rpx) / 2);
+		line-height: 46rpx;
+		/* background-color: #E1F4F4; */
+		color: rgba(0, 0, 0, 0.65);
+		margin-top: 28rpx;
+		margin-left: 20rpx;
+		border-radius: 8rpx;
+	}
+	
+	.count {
+		width: 100%;
+		margin-top: 24rpx;
+		height: 48rpx;
+		line-height: 48rpx;
+		text-align: center;
+		font-family: Verdana;
+		font-size: 40rpx;
+		color: rgba(32, 38, 56, 1);
+	}
+	
+	.echarts {
+		margin-top: 10rpx;
+		width: 100%;
+		height: 80rpx;
+	}
+</style>

+ 220 - 0
components/charts/daskSubCharts/chengjiaoChart2.vue

@@ -0,0 +1,220 @@
+<template>
+	<view class="content">
+		<!-- #ifdef APP-PLUS || H5 -->
+		<view class="title" 
+		:style="`background-color: ${themeColor50};`">
+			{{title}}
+		</view>
+		<view class="count">
+			{{count}}
+		</view>
+		<view :prop="option" :change:prop="echarts.updateEcharts" id="chengjiaoChart2" class="echarts" v-show="fuzhuColor50!=null && dataList.length > 0"></view>
+		<!-- #endif -->
+		<!-- #ifndef APP-PLUS || H5 -->
+		<view>非 APP、H5 环境不支持</view>
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+	import echarts from '../../../static/echarts.js'
+	
+	export default {
+		props: {
+			title: String,
+			count: Number,
+			dataList: {
+				type: Array,
+				default: () => {
+					return []
+				}
+			},
+			dataList1: {
+				type: Array,
+				default: () => {
+					return []
+				}
+			},
+			themeColor50: String,
+			fuzhuColor50: String,
+		},
+		data() {
+			return {
+				option: {
+					grid: {
+						left: '10%',
+						right: '10%',
+						top: '0%',
+						bottom: '10%',
+						containLabel: false
+					},
+					xAxis: {
+						show: false,
+						type: 'category',
+						boundaryGap: ['20%', '20%']
+					},
+					yAxis: {
+						show: false,
+						type: 'value',
+						boundaryGap: ['70%', '70%']
+					},
+					series: [
+						{
+							type: 'line',
+							smooth: 0.5,
+							symbol: 'none',
+							lineStyle: {
+								color: null,
+								width: 3
+							},
+							data: []
+						},
+						{
+							type: 'line',
+							smooth: 0.5,
+							symbol: 'none',
+							lineStyle: {
+								color: null,
+								width: 3
+							},
+							data: []
+						}
+					]
+				}
+			}
+		},
+		
+		created() {
+			// this.option.series[0].data = []
+		},
+		
+		methods: {
+			getDataAction() {
+				this.option.series[0].data = this.dataList
+				this.option.series[1].data = this.dataList1
+				this.option.series[0].lineStyle.color = this.themeColor50
+				this.option.series[1].lineStyle.color = this.fuzhuColor50
+				// console.log('成交2数据刷新', this.option.series)
+			},
+		},
+		watch: {
+			dataList: {
+				handler(e1, e2) {
+					var e1Str = JSON.stringify(e1)
+					var e2Str = JSON.stringify(e2)
+					if (e1Str && e1Str != e2Str) {
+						this.getDataAction()
+					}
+				},
+				deep: true,
+				immediate: true
+			},
+			dataList1: {
+				handler(e) {
+					this.getDataAction()
+				},
+				deep: true,
+				immediate: true
+			},
+			themeColor50: {
+				handler(e) {
+					if (e) {
+						this.option.series[0].lineStyle.color = this.themeColor50
+					}
+				},
+				immediate: true
+			},
+			fuzhuColor50: {
+				handler(e) {
+					if (e) {
+						this.option.series[1].lineStyle.color = this.fuzhuColor50
+					}
+				},
+				immediate: true
+			}
+		}
+		
+	}
+</script>
+
+<script module="echarts" lang="renderjs">
+	let myChart
+	export default {
+		mounted() {
+			this.initAction()
+		},
+		methods: {
+			initAction() {
+				if (typeof window.echarts === 'function') {
+					this.initEcharts()
+				} else {
+					// 动态引入较大类库避免影响页面展示
+					const script = document.createElement('script')
+					// view 层的页面运行在 www 根目录,其相对路径相对于 www 计算
+					script.src = 'static/echarts.js'
+					script.onload = this.initEcharts.bind(this)
+					document.head.appendChild(script)
+				}
+			},
+			initEcharts() {
+				myChart = echarts.init(document.getElementById("chengjiaoChart2"))
+				// 观测更新的数据在 view 层可以直接访问到
+				myChart.setOption(this.option)
+			},
+			updateEcharts(newValue, oldValue, ownerInstance, instance) {
+				if (myChart) {
+					// 监听 service 层数据变更
+					myChart.setOption(newValue)
+				}
+				else {
+					// console.log("无chart11111 -> this.$refs", this.$refs.chartId.$el.id)
+					this.initAction()
+				}
+			},
+			onClick(event, ownerInstance) {
+				// 调用 service 层的方法
+				ownerInstance.callMethod('onViewClick', {
+					test: 'test'
+				})
+			}
+		}
+	}
+</script>
+
+<style>
+	.content {
+		width: 100%;
+		height: 100%;
+	}
+	
+	.title {
+		font-size: 32rpx;
+		font-family: Verdana;
+		text-align: center;
+		width: 176rpx;
+		margin-left: calc((100% - 176rpx) / 2);
+		line-height: 46rpx;
+		/* background-color: #E1F4F4; */
+		color: rgba(0, 0, 0, 0.65);
+		margin-top: 28rpx;
+		margin-left: 20rpx;
+		border-radius: 8rpx;
+	}
+	
+	.count {
+		width: 100%;
+		margin-top: 24rpx;
+		height: 48rpx;
+		line-height: 48rpx;
+		text-align: center;
+		font-family: Verdana;
+		font-size: 40rpx;
+		color: rgba(32, 38, 56, 1);
+	}
+	
+	.echarts {
+		margin-top: 10rpx;
+		width: 100%;
+		height: 80rpx;
+	}
+</style>

+ 188 - 0
components/charts/daskSubCharts/daofangChart.vue

@@ -0,0 +1,188 @@
+<template>
+	<view class="content">
+		<!-- #ifdef APP-PLUS || H5 -->
+		<view class="title" 
+		:style="`background-color: ${isYellow ? fuzhuColor50 : themeColor50};`">
+			{{title}}
+		</view>
+		<view class="count">
+			{{count}}
+		</view>
+		<view :prop="option" :change:prop="echarts.updateEcharts" id="daofangChart" class="echarts" v-show="fuzhuColor50!=null && dataList.length > 0"></view>
+		<!-- #endif -->
+		<!-- #ifndef APP-PLUS || H5 -->
+		<view>非 APP、H5 环境不支持</view>
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+	import echarts from '../../../static/echarts.js'
+	
+	export default {
+		props: {
+			title: String,
+			count: Number,
+			dataList: {
+				type: Array,
+				default: () => {
+					return []
+				}
+			},
+			isYellow: Boolean,
+			themeColor50: String,
+			fuzhuColor50: String,
+		},
+		data() {
+			return {
+				option: {
+					grid: {
+						left: '10%',
+						right: '10%',
+						top: '0%',
+						bottom: '10%',
+						containLabel: false
+					},
+					xAxis: {
+						show: false,
+						type: 'category',
+						boundaryGap: ['20%', '20%']
+					},
+					yAxis: {
+						show: false,
+						type: 'value',
+						boundaryGap: ['70%', '70%']
+					},
+					series: [
+						{
+							type: 'line',
+							smooth: 0.5,
+							symbol: 'none',
+							lineStyle: {
+								color: null,
+								width: 3
+							},
+							data: []
+						}
+					]
+				}
+			}
+		},
+		
+		created() {
+			// this.option.series[0].data = []
+		},
+		
+		methods: {
+			getDataAction() {
+				this.option.series[0].data = this.dataList
+				this.option.series[0].lineStyle.color = this.isYellow ? this.fuzhuColor50 : this.themeColor50
+				// console.log('数据刷新', this.option.series)
+			},
+		},
+		watch: {
+			dataList: {
+				handler(e1, e2) {
+					var e1Str = JSON.stringify(e1)
+					var e2Str = JSON.stringify(e2)
+					if (e1Str && e1Str != e2Str) {
+						this.getDataAction()
+					}
+				},
+				deep: true,
+				immediate: true
+			},
+			themeColor50: {
+				handler(e) {
+					if (e) {
+						this.option.series[0].lineStyle.color = this.isYellow ? this.fuzhuColor50 : this.themeColor50
+					}
+				},
+				immediate: true
+			}
+		}
+		
+	}
+</script>
+
+<script module="echarts" lang="renderjs">
+	let myChart
+	export default {
+		mounted() {
+			this.initAction()
+		},
+		methods: {
+			initAction() {
+				if (typeof window.echarts === 'function') {
+					this.initEcharts()
+				} else {
+					// 动态引入较大类库避免影响页面展示
+					const script = document.createElement('script')
+					// view 层的页面运行在 www 根目录,其相对路径相对于 www 计算
+					script.src = 'static/echarts.js'
+					script.onload = this.initEcharts.bind(this)
+					document.head.appendChild(script)
+				}
+			},
+			initEcharts() {
+				myChart = echarts.init(document.getElementById("daofangChart"))
+				// 观测更新的数据在 view 层可以直接访问到
+				myChart.setOption(this.option)
+			},
+			updateEcharts(newValue, oldValue, ownerInstance, instance) {
+				if (myChart) {
+					// 监听 service 层数据变更
+					myChart.setOption(newValue)
+				}
+				else {
+					// console.log("无chart11111 -> this.$refs", this.$refs.chartId.$el.id)
+					this.initAction()
+				}
+			},
+			onClick(event, ownerInstance) {
+				// 调用 service 层的方法
+				ownerInstance.callMethod('onViewClick', {
+					test: 'test'
+				})
+			}
+		}
+	}
+</script>
+
+<style>
+	.content {
+		width: 100%;
+		height: 100%;
+	}
+	
+	.title {
+		font-size: 32rpx;
+		font-family: Verdana;
+		text-align: center;
+		width: 176rpx;
+		margin-left: calc((100% - 176rpx) / 2);
+		line-height: 46rpx;
+		/* background-color: #E1F4F4; */
+		color: rgba(0, 0, 0, 0.65);
+		margin-top: 28rpx;
+		margin-left: 20rpx;
+		border-radius: 8rpx;
+	}
+	
+	.count {
+		width: 100%;
+		margin-top: 24rpx;
+		height: 48rpx;
+		line-height: 48rpx;
+		text-align: center;
+		font-family: Verdana;
+		font-size: 40rpx;
+		color: rgba(32, 38, 56, 1);
+	}
+	
+	.echarts {
+		margin-top: 10rpx;
+		width: 100%;
+		height: 80rpx;
+	}
+</style>

+ 188 - 0
components/charts/daskSubCharts/daofangjiluChart.vue

@@ -0,0 +1,188 @@
+<template>
+	<view class="content">
+		<!-- #ifdef APP-PLUS || H5 -->
+		<view class="title" 
+		:style="`background-color: ${isYellow ? fuzhuColor50 : themeColor50};`">
+			{{title}}
+		</view>
+		<view class="count">
+			{{count}}
+		</view>
+		<view :prop="option" :change:prop="echarts.updateEcharts" id="daofangjiluChart" class="echarts" v-show="fuzhuColor50!=null && dataList.length > 0"></view>
+		<!-- #endif -->
+		<!-- #ifndef APP-PLUS || H5 -->
+		<view>非 APP、H5 环境不支持</view>
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+	import echarts from '../../../static/echarts.js'
+	
+	export default {
+		props: {
+			title: String,
+			count: Number,
+			dataList: {
+				type: Array,
+				default: () => {
+					return []
+				}
+			},
+			isYellow: Boolean,
+			themeColor50: String,
+			fuzhuColor50: String,
+		},
+		data() {
+			return {
+				option: {
+					grid: {
+						left: '10%',
+						right: '10%',
+						top: '0%',
+						bottom: '10%',
+						containLabel: false
+					},
+					xAxis: {
+						show: false,
+						type: 'category',
+						boundaryGap: ['20%', '20%']
+					},
+					yAxis: {
+						show: false,
+						type: 'value',
+						boundaryGap: ['70%', '70%']
+					},
+					series: [
+						{
+							type: 'line',
+							smooth: 0.5,
+							symbol: 'none',
+							lineStyle: {
+								color: null,
+								width: 3
+							},
+							data: []
+						}
+					]
+				}
+			}
+		},
+		
+		created() {
+			// this.option.series[0].data = []
+		},
+		
+		methods: {
+			getDataAction() {
+				this.option.series[0].data = this.dataList
+				this.option.series[0].lineStyle.color = this.isYellow ? this.fuzhuColor50 : this.themeColor50
+				// console.log('数据刷新', this.option.series)
+			},
+		},
+		watch: {
+			dataList: {
+				handler(e1, e2) {
+					var e1Str = JSON.stringify(e1)
+					var e2Str = JSON.stringify(e2)
+					if (e1Str && e1Str != e2Str) {
+						this.getDataAction()
+					}
+				},
+				deep: true,
+				immediate: true
+			},
+			themeColor50: {
+				handler(e) {
+					if (e) {
+						this.option.series[0].lineStyle.color = this.isYellow ? this.fuzhuColor50 : this.themeColor50
+					}
+				},
+				immediate: true
+			}
+		}
+		
+	}
+</script>
+
+<script module="echarts" lang="renderjs">
+	let myChart
+	export default {
+		mounted() {
+			this.initAction()
+		},
+		methods: {
+			initAction() {
+				if (typeof window.echarts === 'function') {
+					this.initEcharts()
+				} else {
+					// 动态引入较大类库避免影响页面展示
+					const script = document.createElement('script')
+					// view 层的页面运行在 www 根目录,其相对路径相对于 www 计算
+					script.src = 'static/echarts.js'
+					script.onload = this.initEcharts.bind(this)
+					document.head.appendChild(script)
+				}
+			},
+			initEcharts() {
+				myChart = echarts.init(document.getElementById("daofangjiluChart"))
+				// 观测更新的数据在 view 层可以直接访问到
+				myChart.setOption(this.option)
+			},
+			updateEcharts(newValue, oldValue, ownerInstance, instance) {
+				if (myChart) {
+					// 监听 service 层数据变更
+					myChart.setOption(newValue)
+				}
+				else {
+					// console.log("无chart11111 -> this.$refs", this.$refs.chartId.$el.id)
+					this.initAction()
+				}
+			},
+			onClick(event, ownerInstance) {
+				// 调用 service 层的方法
+				ownerInstance.callMethod('onViewClick', {
+					test: 'test'
+				})
+			}
+		}
+	}
+</script>
+
+<style>
+	.content {
+		width: 100%;
+		height: 100%;
+	}
+	
+	.title {
+		font-size: 32rpx;
+		font-family: Verdana;
+		text-align: center;
+		width: 176rpx;
+		margin-left: calc((100% - 176rpx) / 2);
+		line-height: 46rpx;
+		/* background-color: #E1F4F4; */
+		color: rgba(0, 0, 0, 0.65);
+		margin-top: 28rpx;
+		margin-left: 20rpx;
+		border-radius: 8rpx;
+	}
+	
+	.count {
+		width: 100%;
+		margin-top: 24rpx;
+		height: 48rpx;
+		line-height: 48rpx;
+		text-align: center;
+		font-family: Verdana;
+		font-size: 40rpx;
+		color: rgba(32, 38, 56, 1);
+	}
+	
+	.echarts {
+		margin-top: 10rpx;
+		width: 100%;
+		height: 80rpx;
+	}
+</style>

+ 188 - 0
components/charts/daskSubCharts/daofangpingzhengChart.vue

@@ -0,0 +1,188 @@
+<template>
+	<view class="content">
+		<!-- #ifdef APP-PLUS || H5 -->
+		<view class="title" 
+		:style="`background-color: ${isYellow ? fuzhuColor50 : themeColor50};`">
+			{{title}}
+		</view>
+		<view class="count">
+			{{count}}
+		</view>
+		<view :prop="option" :change:prop="echarts.updateEcharts" id="daofangpingzhengChart" class="echarts" v-show="fuzhuColor50!=null && dataList.length > 0"></view>
+		<!-- #endif -->
+		<!-- #ifndef APP-PLUS || H5 -->
+		<view>非 APP、H5 环境不支持</view>
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+	import echarts from '../../../static/echarts.js'
+	
+	export default {
+		props: {
+			title: String,
+			count: Number,
+			dataList: {
+				type: Array,
+				default: () => {
+					return []
+				}
+			},
+			isYellow: Boolean,
+			themeColor50: String,
+			fuzhuColor50: String,
+		},
+		data() {
+			return {
+				option: {
+					grid: {
+						left: '10%',
+						right: '10%',
+						top: '0%',
+						bottom: '10%',
+						containLabel: false
+					},
+					xAxis: {
+						show: false,
+						type: 'category',
+						boundaryGap: ['20%', '20%']
+					},
+					yAxis: {
+						show: false,
+						type: 'value',
+						boundaryGap: ['70%', '70%']
+					},
+					series: [
+						{
+							type: 'line',
+							smooth: 0.5,
+							symbol: 'none',
+							lineStyle: {
+								color: null,
+								width: 3
+							},
+							data: []
+						}
+					]
+				}
+			}
+		},
+		
+		created() {
+			// this.option.series[0].data = []
+		},
+		
+		methods: {
+			getDataAction() {
+				this.option.series[0].data = this.dataList
+				this.option.series[0].lineStyle.color = this.isYellow ? this.fuzhuColor50 : this.themeColor50
+				// console.log('数据刷新', this.option.series)
+			},
+		},
+		watch: {
+			dataList: {
+				handler(e1, e2) {
+					var e1Str = JSON.stringify(e1)
+					var e2Str = JSON.stringify(e2)
+					if (e1Str && e1Str != e2Str) {
+						this.getDataAction()
+					}
+				},
+				deep: true,
+				immediate: true
+			},
+			themeColor50: {
+				handler(e) {
+					if (e) {
+						this.option.series[0].lineStyle.color = this.isYellow ? this.fuzhuColor50 : this.themeColor50
+					}
+				},
+				immediate: true
+			}
+		}
+		
+	}
+</script>
+
+<script module="echarts" lang="renderjs">
+	let myChart
+	export default {
+		mounted() {
+			this.initAction()
+		},
+		methods: {
+			initAction() {
+				if (typeof window.echarts === 'function') {
+					this.initEcharts()
+				} else {
+					// 动态引入较大类库避免影响页面展示
+					const script = document.createElement('script')
+					// view 层的页面运行在 www 根目录,其相对路径相对于 www 计算
+					script.src = 'static/echarts.js'
+					script.onload = this.initEcharts.bind(this)
+					document.head.appendChild(script)
+				}
+			},
+			initEcharts() {
+				myChart = echarts.init(document.getElementById("daofangpingzhengChart"))
+				// 观测更新的数据在 view 层可以直接访问到
+				myChart.setOption(this.option)
+			},
+			updateEcharts(newValue, oldValue, ownerInstance, instance) {
+				if (myChart) {
+					// 监听 service 层数据变更
+					myChart.setOption(newValue)
+				}
+				else {
+					// console.log("无chart11111 -> this.$refs", this.$refs.chartId.$el.id)
+					this.initAction()
+				}
+			},
+			onClick(event, ownerInstance) {
+				// 调用 service 层的方法
+				ownerInstance.callMethod('onViewClick', {
+					test: 'test'
+				})
+			}
+		}
+	}
+</script>
+
+<style>
+	.content {
+		width: 100%;
+		height: 100%;
+	}
+	
+	.title {
+		font-size: 32rpx;
+		font-family: Verdana;
+		text-align: center;
+		width: 176rpx;
+		margin-left: calc((100% - 176rpx) / 2);
+		line-height: 46rpx;
+		/* background-color: #E1F4F4; */
+		color: rgba(0, 0, 0, 0.65);
+		margin-top: 28rpx;
+		margin-left: 20rpx;
+		border-radius: 8rpx;
+	}
+	
+	.count {
+		width: 100%;
+		margin-top: 24rpx;
+		height: 48rpx;
+		line-height: 48rpx;
+		text-align: center;
+		font-family: Verdana;
+		font-size: 40rpx;
+		color: rgba(32, 38, 56, 1);
+	}
+	
+	.echarts {
+		margin-top: 10rpx;
+		width: 100%;
+		height: 80rpx;
+	}
+</style>

+ 188 - 0
components/charts/daskSubCharts/genjinChart.vue

@@ -0,0 +1,188 @@
+<template>
+	<view class="content">
+		<!-- #ifdef APP-PLUS || H5 -->
+		<view class="title" 
+		:style="`background-color: ${isYellow ? fuzhuColor50 : themeColor50};`">
+			{{title}}
+		</view>
+		<view class="count">
+			{{count}}
+		</view>
+		<view :prop="option" :change:prop="echarts.updateEcharts" id="genjinChart" class="echarts" v-show="fuzhuColor50!=null && dataList.length > 0"></view>
+		<!-- #endif -->
+		<!-- #ifndef APP-PLUS || H5 -->
+		<view>非 APP、H5 环境不支持</view>
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+	import echarts from '../../../static/echarts.js'
+	
+	export default {
+		props: {
+			title: String,
+			count: Number,
+			dataList: {
+				type: Array,
+				default: () => {
+					return []
+				}
+			},
+			isYellow: Boolean,
+			themeColor50: String,
+			fuzhuColor50: String,
+		},
+		data() {
+			return {
+				option: {
+					grid: {
+						left: '10%',
+						right: '10%',
+						top: '0%',
+						bottom: '10%',
+						containLabel: false
+					},
+					xAxis: {
+						show: false,
+						type: 'category',
+						boundaryGap: ['20%', '20%']
+					},
+					yAxis: {
+						show: false,
+						type: 'value',
+						boundaryGap: ['70%', '70%']
+					},
+					series: [
+						{
+							type: 'line',
+							smooth: 0.5,
+							symbol: 'none',
+							lineStyle: {
+								color: null,
+								width: 3
+							},
+							data: []
+						}
+					]
+				}
+			}
+		},
+		
+		created() {
+			// this.option.series[0].data = []
+		},
+		
+		methods: {
+			getDataAction() {
+				this.option.series[0].data = this.dataList
+				this.option.series[0].lineStyle.color = this.isYellow ? this.fuzhuColor50 : this.themeColor50
+				// console.log('数据刷新', this.option.series)
+			},
+		},
+		watch: {
+			dataList: {
+				handler(e1, e2) {
+					var e1Str = JSON.stringify(e1)
+					var e2Str = JSON.stringify(e2)
+					if (e1Str && e1Str != e2Str) {
+						this.getDataAction()
+					}
+				},
+				deep: true,
+				immediate: true
+			},
+			themeColor50: {
+				handler(e) {
+					if (e) {
+						this.option.series[0].lineStyle.color = this.isYellow ? this.fuzhuColor50 : this.themeColor50
+					}
+				},
+				immediate: true
+			}
+		}
+		
+	}
+</script>
+
+<script module="echarts" lang="renderjs">
+	let myChart
+	export default {
+		mounted() {
+			this.initAction()
+		},
+		methods: {
+			initAction() {
+				if (typeof window.echarts === 'function') {
+					this.initEcharts()
+				} else {
+					// 动态引入较大类库避免影响页面展示
+					const script = document.createElement('script')
+					// view 层的页面运行在 www 根目录,其相对路径相对于 www 计算
+					script.src = 'static/echarts.js'
+					script.onload = this.initEcharts.bind(this)
+					document.head.appendChild(script)
+				}
+			},
+			initEcharts() {
+				myChart = echarts.init(document.getElementById("genjinChart"))
+				// 观测更新的数据在 view 层可以直接访问到
+				myChart.setOption(this.option)
+			},
+			updateEcharts(newValue, oldValue, ownerInstance, instance) {
+				if (myChart) {
+					// 监听 service 层数据变更
+					myChart.setOption(newValue)
+				}
+				else {
+					// console.log("无chart11111 -> this.$refs", this.$refs.chartId.$el.id)
+					this.initAction()
+				}
+			},
+			onClick(event, ownerInstance) {
+				// 调用 service 层的方法
+				ownerInstance.callMethod('onViewClick', {
+					test: 'test'
+				})
+			}
+		}
+	}
+</script>
+
+<style>
+	.content {
+		width: 100%;
+		height: 100%;
+	}
+	
+	.title {
+		font-size: 32rpx;
+		font-family: Verdana;
+		text-align: center;
+		width: 176rpx;
+		margin-left: calc((100% - 176rpx) / 2);
+		line-height: 46rpx;
+		/* background-color: #E1F4F4; */
+		color: rgba(0, 0, 0, 0.65);
+		margin-top: 28rpx;
+		margin-left: 20rpx;
+		border-radius: 8rpx;
+	}
+	
+	.count {
+		width: 100%;
+		margin-top: 24rpx;
+		height: 48rpx;
+		line-height: 48rpx;
+		text-align: center;
+		font-family: Verdana;
+		font-size: 40rpx;
+		color: rgba(32, 38, 56, 1);
+	}
+	
+	.echarts {
+		margin-top: 10rpx;
+		width: 100%;
+		height: 80rpx;
+	}
+</style>

+ 188 - 0
components/charts/daskSubCharts/huodianChart.vue

@@ -0,0 +1,188 @@
+<template>
+	<view class="content">
+		<!-- #ifdef APP-PLUS || H5 -->
+		<view class="title" 
+		:style="`background-color: ${isYellow ? fuzhuColor50 : themeColor50};`">
+			{{title}}
+		</view>
+		<view class="count">
+			{{count}}
+		</view>
+		<view :prop="option" :change:prop="echarts.updateEcharts" id="huodianChart" class="echarts" v-show="fuzhuColor50!=null && dataList.length > 0"></view>
+		<!-- #endif -->
+		<!-- #ifndef APP-PLUS || H5 -->
+		<view>非 APP、H5 环境不支持</view>
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+	import echarts from '../../../static/echarts.js'
+	
+	export default {
+		props: {
+			title: String,
+			count: Number,
+			dataList: {
+				type: Array,
+				default: () => {
+					return []
+				}
+			},
+			isYellow: Boolean,
+			themeColor50: String,
+			fuzhuColor50: String,
+		},
+		data() {
+			return {
+				option: {
+					grid: {
+						left: '10%',
+						right: '10%',
+						top: '0%',
+						bottom: '10%',
+						containLabel: false
+					},
+					xAxis: {
+						show: false,
+						type: 'category',
+						boundaryGap: ['20%', '20%']
+					},
+					yAxis: {
+						show: false,
+						type: 'value',
+						boundaryGap: ['70%', '70%']
+					},
+					series: [
+						{
+							type: 'line',
+							smooth: 0.5,
+							symbol: 'none',
+							lineStyle: {
+								color: null,
+								width: 3
+							},
+							data: []
+						}
+					]
+				}
+			}
+		},
+		
+		created() {
+			// this.option.series[0].data = []
+		},
+		
+		methods: {
+			getDataAction() {
+				this.option.series[0].data = this.dataList
+				this.option.series[0].lineStyle.color = this.isYellow ? this.fuzhuColor50 : this.themeColor50
+				console.log('数据刷新', this.option.series)
+			},
+		},
+		watch: {
+			dataList: {
+				handler(e1, e2) {
+					var e1Str = JSON.stringify(e1)
+					var e2Str = JSON.stringify(e2)
+					if (e1Str && e1Str != e2Str) {
+						this.getDataAction()
+					}
+				},
+				deep: true,
+				immediate: true
+			},
+			themeColor50: {
+				handler(e) {
+					if (e) {
+						this.option.series[0].lineStyle.color = this.isYellow ? this.fuzhuColor50 : this.themeColor50
+					}
+				},
+				immediate: true
+			}
+		}
+		
+	}
+</script>
+
+<script module="echarts" lang="renderjs">
+	let myChart
+	export default {
+		mounted() {
+			this.initAction()
+		},
+		methods: {
+			initAction() {
+				if (typeof window.echarts === 'function') {
+					this.initEcharts()
+				} else {
+					// 动态引入较大类库避免影响页面展示
+					const script = document.createElement('script')
+					// view 层的页面运行在 www 根目录,其相对路径相对于 www 计算
+					script.src = 'static/echarts.js'
+					script.onload = this.initEcharts.bind(this)
+					document.head.appendChild(script)
+				}
+			},
+			initEcharts() {
+				myChart = echarts.init(document.getElementById("huodianChart"))
+				// 观测更新的数据在 view 层可以直接访问到
+				myChart.setOption(this.option)
+			},
+			updateEcharts(newValue, oldValue, ownerInstance, instance) {
+				if (myChart) {
+					// 监听 service 层数据变更
+					myChart.setOption(newValue)
+				}
+				else {
+					// console.log("无chart11111 -> this.$refs", this.$refs.chartId.$el.id)
+					this.initAction()
+				}
+			},
+			onClick(event, ownerInstance) {
+				// 调用 service 层的方法
+				ownerInstance.callMethod('onViewClick', {
+					test: 'test'
+				})
+			}
+		}
+	}
+</script>
+
+<style>
+	.content {
+		width: 100%;
+		height: 100%;
+	}
+	
+	.title {
+		font-size: 32rpx;
+		font-family: Verdana;
+		text-align: center;
+		width: 176rpx;
+		margin-left: calc((100% - 176rpx) / 2);
+		line-height: 46rpx;
+		/* background-color: #E1F4F4; */
+		color: rgba(0, 0, 0, 0.65);
+		margin-top: 28rpx;
+		margin-left: 20rpx;
+		border-radius: 8rpx;
+	}
+	
+	.count {
+		width: 100%;
+		margin-top: 24rpx;
+		height: 48rpx;
+		line-height: 48rpx;
+		text-align: center;
+		font-family: Verdana;
+		font-size: 40rpx;
+		color: rgba(32, 38, 56, 1);
+	}
+	
+	.echarts {
+		margin-top: 10rpx;
+		width: 100%;
+		height: 80rpx;
+	}
+</style>

+ 188 - 0
components/charts/daskSubCharts/huokeChart.vue

@@ -0,0 +1,188 @@
+<template>
+	<view class="content">
+		<!-- #ifdef APP-PLUS || H5 -->
+		<view class="title" 
+		:style="`background-color: ${isYellow ? fuzhuColor50 : themeColor50};`">
+			{{title}}
+		</view>
+		<view class="count">
+			{{count}}
+		</view>
+		<view :prop="option" :change:prop="echarts.updateEcharts" id="huokeChart" class="echarts" v-show="fuzhuColor50!=null && dataList.length > 0"></view>
+		<!-- #endif -->
+		<!-- #ifndef APP-PLUS || H5 -->
+		<view>非 APP、H5 环境不支持</view>
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+	import echarts from '../../../static/echarts.js'
+	
+	export default {
+		props: {
+			title: String,
+			count: Number,
+			dataList: {
+				type: Array,
+				default: () => {
+					return []
+				}
+			},
+			isYellow: Boolean,
+			themeColor50: String,
+			fuzhuColor50: String,
+		},
+		data() {
+			return {
+				option: {
+					grid: {
+						left: '10%',
+						right: '10%',
+						top: '0%',
+						bottom: '10%',
+						containLabel: false
+					},
+					xAxis: {
+						show: false,
+						type: 'category',
+						boundaryGap: ['20%', '20%']
+					},
+					yAxis: {
+						show: false,
+						type: 'value',
+						boundaryGap: ['70%', '70%']
+					},
+					series: [
+						{
+							type: 'line',
+							smooth: 0.5,
+							symbol: 'none',
+							lineStyle: {
+								color: null,
+								width: 3
+							},
+							data: []
+						}
+					]
+				}
+			}
+		},
+		
+		created() {
+			// this.option.series[0].data = []
+		},
+		
+		methods: {
+			getDataAction() {
+				this.option.series[0].data = this.dataList
+				this.option.series[0].lineStyle.color = this.isYellow ? this.fuzhuColor50 : this.themeColor50
+				// console.log('数据刷新', this.option.series)
+			},
+		},
+		watch: {
+			dataList: {
+				handler(e1, e2) {
+					var e1Str = JSON.stringify(e1)
+					var e2Str = JSON.stringify(e2)
+					if (e1Str && e1Str != e2Str) {
+						this.getDataAction()
+					}
+				},
+				deep: true,
+				immediate: true
+			},
+			themeColor50: {
+				handler(e) {
+					if (e) {
+						this.option.series[0].lineStyle.color = this.isYellow ? this.fuzhuColor50 : this.themeColor50
+					}
+				},
+				immediate: true
+			}
+		}
+		
+	}
+</script>
+
+<script module="echarts" lang="renderjs">
+	let myChart
+	export default {
+		mounted() {
+			this.initAction()
+		},
+		methods: {
+			initAction() {
+				if (typeof window.echarts === 'function') {
+					this.initEcharts()
+				} else {
+					// 动态引入较大类库避免影响页面展示
+					const script = document.createElement('script')
+					// view 层的页面运行在 www 根目录,其相对路径相对于 www 计算
+					script.src = 'static/echarts.js'
+					script.onload = this.initEcharts.bind(this)
+					document.head.appendChild(script)
+				}
+			},
+			initEcharts() {
+				myChart = echarts.init(document.getElementById("huokeChart"))
+				// 观测更新的数据在 view 层可以直接访问到
+				myChart.setOption(this.option)
+			},
+			updateEcharts(newValue, oldValue, ownerInstance, instance) {
+				if (myChart) {
+					// 监听 service 层数据变更
+					myChart.setOption(newValue)
+				}
+				else {
+					// console.log("无chart11111 -> this.$refs", this.$refs.chartId.$el.id)
+					this.initAction()
+				}
+			},
+			onClick(event, ownerInstance) {
+				// 调用 service 层的方法
+				ownerInstance.callMethod('onViewClick', {
+					test: 'test'
+				})
+			}
+		}
+	}
+</script>
+
+<style>
+	.content {
+		width: 100%;
+		height: 100%;
+	}
+	
+	.title {
+		font-size: 32rpx;
+		font-family: Verdana;
+		text-align: center;
+		width: 176rpx;
+		margin-left: calc((100% - 176rpx) / 2);
+		line-height: 46rpx;
+		/* background-color: #E1F4F4; */
+		color: rgba(0, 0, 0, 0.65);
+		margin-top: 28rpx;
+		margin-left: 20rpx;
+		border-radius: 8rpx;
+	}
+	
+	.count {
+		width: 100%;
+		margin-top: 24rpx;
+		height: 48rpx;
+		line-height: 48rpx;
+		text-align: center;
+		font-family: Verdana;
+		font-size: 40rpx;
+		color: rgba(32, 38, 56, 1);
+	}
+	
+	.echarts {
+		margin-top: 10rpx;
+		width: 100%;
+		height: 80rpx;
+	}
+</style>

+ 188 - 0
components/charts/daskSubCharts/jieyongpingzhengChart.vue

@@ -0,0 +1,188 @@
+<template>
+	<view class="content">
+		<!-- #ifdef APP-PLUS || H5 -->
+		<view class="title" 
+		:style="`background-color: ${isYellow ? fuzhuColor50 : themeColor50};`">
+			{{title}}
+		</view>
+		<view class="count">
+			{{count}}
+		</view>
+		<view :prop="option" :change:prop="echarts.updateEcharts" id="jieyongpingzhengChart" class="echarts" v-show="fuzhuColor50!=null && dataList.length > 0"></view>
+		<!-- #endif -->
+		<!-- #ifndef APP-PLUS || H5 -->
+		<view>非 APP、H5 环境不支持</view>
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+	import echarts from '../../../static/echarts.js'
+	
+	export default {
+		props: {
+			title: String,
+			count: Number,
+			dataList: {
+				type: Array,
+				default: () => {
+					return []
+				}
+			},
+			isYellow: Boolean,
+			themeColor50: String,
+			fuzhuColor50: String,
+		},
+		data() {
+			return {
+				option: {
+					grid: {
+						left: '10%',
+						right: '10%',
+						top: '0%',
+						bottom: '10%',
+						containLabel: false
+					},
+					xAxis: {
+						show: false,
+						type: 'category',
+						boundaryGap: ['20%', '20%']
+					},
+					yAxis: {
+						show: false,
+						type: 'value',
+						boundaryGap: ['70%', '70%']
+					},
+					series: [
+						{
+							type: 'line',
+							smooth: 0.5,
+							symbol: 'none',
+							lineStyle: {
+								color: null,
+								width: 3
+							},
+							data: []
+						}
+					]
+				}
+			}
+		},
+		
+		created() {
+			// this.option.series[0].data = []
+		},
+		
+		methods: {
+			getDataAction() {
+				this.option.series[0].data = this.dataList
+				this.option.series[0].lineStyle.color = this.isYellow ? this.fuzhuColor50 : this.themeColor50
+				// console.log('数据刷新', this.option.series)
+			},
+		},
+		watch: {
+			dataList: {
+				handler(e1, e2) {
+					var e1Str = JSON.stringify(e1)
+					var e2Str = JSON.stringify(e2)
+					if (e1Str && e1Str != e2Str) {
+						this.getDataAction()
+					}
+				},
+				deep: true,
+				immediate: true
+			},
+			themeColor50: {
+				handler(e) {
+					if (e) {
+						this.option.series[0].lineStyle.color = this.isYellow ? this.fuzhuColor50 : this.themeColor50
+					}
+				},
+				immediate: true
+			}
+		}
+		
+	}
+</script>
+
+<script module="echarts" lang="renderjs">
+	let myChart
+	export default {
+		mounted() {
+			this.initAction()
+		},
+		methods: {
+			initAction() {
+				if (typeof window.echarts === 'function') {
+					this.initEcharts()
+				} else {
+					// 动态引入较大类库避免影响页面展示
+					const script = document.createElement('script')
+					// view 层的页面运行在 www 根目录,其相对路径相对于 www 计算
+					script.src = 'static/echarts.js'
+					script.onload = this.initEcharts.bind(this)
+					document.head.appendChild(script)
+				}
+			},
+			initEcharts() {
+				myChart = echarts.init(document.getElementById("jieyongpingzhengChart"))
+				// 观测更新的数据在 view 层可以直接访问到
+				myChart.setOption(this.option)
+			},
+			updateEcharts(newValue, oldValue, ownerInstance, instance) {
+				if (myChart) {
+					// 监听 service 层数据变更
+					myChart.setOption(newValue)
+				}
+				else {
+					// console.log("无chart11111 -> this.$refs", this.$refs.chartId.$el.id)
+					this.initAction()
+				}
+			},
+			onClick(event, ownerInstance) {
+				// 调用 service 层的方法
+				ownerInstance.callMethod('onViewClick', {
+					test: 'test'
+				})
+			}
+		}
+	}
+</script>
+
+<style>
+	.content {
+		width: 100%;
+		height: 100%;
+	}
+	
+	.title {
+		font-size: 32rpx;
+		font-family: Verdana;
+		text-align: center;
+		width: 176rpx;
+		margin-left: calc((100% - 176rpx) / 2);
+		line-height: 46rpx;
+		/* background-color: #E1F4F4; */
+		color: rgba(0, 0, 0, 0.65);
+		margin-top: 28rpx;
+		margin-left: 20rpx;
+		border-radius: 8rpx;
+	}
+	
+	.count {
+		width: 100%;
+		margin-top: 24rpx;
+		height: 48rpx;
+		line-height: 48rpx;
+		text-align: center;
+		font-family: Verdana;
+		font-size: 40rpx;
+		color: rgba(32, 38, 56, 1);
+	}
+	
+	.echarts {
+		margin-top: 10rpx;
+		width: 100%;
+		height: 80rpx;
+	}
+</style>

+ 188 - 0
components/charts/daskSubCharts/jieyongpingzhengChart2.vue

@@ -0,0 +1,188 @@
+<template>
+	<view class="content">
+		<!-- #ifdef APP-PLUS || H5 -->
+		<view class="title" 
+		:style="`background-color: ${isYellow ? fuzhuColor50 : themeColor50};`">
+			结佣凭证
+		</view>
+		<view class="count">
+			{{count}}
+		</view>
+		<view :prop="option" :change:prop="echarts.updateEcharts" id="jieyongpingzhengChart2" class="echarts" v-show="fuzhuColor50!=null && dataList.length > 0"></view>
+		<!-- #endif -->
+		<!-- #ifndef APP-PLUS || H5 -->
+		<view>非 APP、H5 环境不支持</view>
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+	import echarts from '../../../static/echarts.js'
+	
+	export default {
+		props: {
+			title: String,
+			count: Number,
+			dataList: {
+				type: Array,
+				default: () => {
+					return []
+				}
+			},
+			isYellow: Boolean,
+			themeColor50: String,
+			fuzhuColor50: String,
+		},
+		data() {
+			return {
+				option: {
+					grid: {
+						left: '10%',
+						right: '10%',
+						top: '0%',
+						bottom: '10%',
+						containLabel: false
+					},
+					xAxis: {
+						show: false,
+						type: 'category',
+						boundaryGap: ['20%', '20%']
+					},
+					yAxis: {
+						show: false,
+						type: 'value',
+						boundaryGap: ['70%', '70%']
+					},
+					series: [
+						{
+							type: 'line',
+							smooth: 0.5,
+							symbol: 'none',
+							lineStyle: {
+								color: null,
+								width: 3
+							},
+							data: []
+						}
+					]
+				}
+			}
+		},
+		
+		created() {
+			// this.option.series[0].data = []
+		},
+		
+		methods: {
+			getDataAction() {
+				this.option.series[0].data = this.dataList
+				this.option.series[0].lineStyle.color = this.isYellow ? this.fuzhuColor50 : this.themeColor50
+				// console.log('数据刷新', this.option.series)
+			},
+		},
+		watch: {
+			dataList: {
+				handler(e1, e2) {
+					var e1Str = JSON.stringify(e1)
+					var e2Str = JSON.stringify(e2)
+					if (e1Str && e1Str != e2Str) {
+						this.getDataAction()
+					}
+				},
+				deep: true,
+				immediate: true
+			},
+			themeColor50: {
+				handler(e) {
+					if (e) {
+						this.option.series[0].lineStyle.color = this.isYellow ? this.fuzhuColor50 : this.themeColor50
+					}
+				},
+				immediate: true
+			}
+		}
+		
+	}
+</script>
+
+<script module="echarts" lang="renderjs">
+	let myChart
+	export default {
+		mounted() {
+			this.initAction()
+		},
+		methods: {
+			initAction() {
+				if (typeof window.echarts === 'function') {
+					this.initEcharts()
+				} else {
+					// 动态引入较大类库避免影响页面展示
+					const script = document.createElement('script')
+					// view 层的页面运行在 www 根目录,其相对路径相对于 www 计算
+					script.src = 'static/echarts.js'
+					script.onload = this.initEcharts.bind(this)
+					document.head.appendChild(script)
+				}
+			},
+			initEcharts() {
+				myChart = echarts.init(document.getElementById("jieyongpingzhengChart2"))
+				// 观测更新的数据在 view 层可以直接访问到
+				myChart.setOption(this.option)
+			},
+			updateEcharts(newValue, oldValue, ownerInstance, instance) {
+				if (myChart) {
+					// 监听 service 层数据变更
+					myChart.setOption(newValue)
+				}
+				else {
+					// console.log("无chart11111 -> this.$refs", this.$refs.chartId.$el.id)
+					this.initAction()
+				}
+			},
+			onClick(event, ownerInstance) {
+				// 调用 service 层的方法
+				ownerInstance.callMethod('onViewClick', {
+					test: 'test'
+				})
+			}
+		}
+	}
+</script>
+
+<style>
+	.content {
+		width: 100%;
+		height: 100%;
+	}
+	
+	.title {
+		font-size: 32rpx;
+		font-family: Verdana;
+		text-align: center;
+		width: 176rpx;
+		margin-left: calc((100% - 176rpx) / 2);
+		line-height: 46rpx;
+		/* background-color: #E1F4F4; */
+		color: rgba(0, 0, 0, 0.65);
+		margin-top: 28rpx;
+		margin-left: 20rpx;
+		border-radius: 8rpx;
+	}
+	
+	.count {
+		width: 100%;
+		margin-top: 24rpx;
+		height: 48rpx;
+		line-height: 48rpx;
+		text-align: center;
+		font-family: Verdana;
+		font-size: 40rpx;
+		color: rgba(32, 38, 56, 1);
+	}
+	
+	.echarts {
+		margin-top: 10rpx;
+		width: 100%;
+		height: 80rpx;
+	}
+</style>

+ 188 - 0
components/charts/daskSubCharts/kehufenpaiChart.vue

@@ -0,0 +1,188 @@
+<template>
+	<view class="content">
+		<!-- #ifdef APP-PLUS || H5 -->
+		<view class="title" 
+		:style="`background-color: ${isYellow ? fuzhuColor50 : themeColor50};`">
+			{{title}}
+		</view>
+		<view class="count">
+			{{count}}
+		</view>
+		<view :prop="option" :change:prop="echarts.updateEcharts" id="kehufenpaiChart" class="echarts" v-show="fuzhuColor50!=null && dataList.length > 0"></view>
+		<!-- #endif -->
+		<!-- #ifndef APP-PLUS || H5 -->
+		<view>非 APP、H5 环境不支持</view>
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+	import echarts from '../../../static/echarts.js'
+	
+	export default {
+		props: {
+			title: String,
+			count: Number,
+			dataList: {
+				type: Array,
+				default: () => {
+					return []
+				}
+			},
+			isYellow: Boolean,
+			themeColor50: String,
+			fuzhuColor50: String,
+		},
+		data() {
+			return {
+				option: {
+					grid: {
+						left: '10%',
+						right: '10%',
+						top: '0%',
+						bottom: '10%',
+						containLabel: false
+					},
+					xAxis: {
+						show: false,
+						type: 'category',
+						boundaryGap: ['20%', '20%']
+					},
+					yAxis: {
+						show: false,
+						type: 'value',
+						boundaryGap: ['70%', '70%']
+					},
+					series: [
+						{
+							type: 'line',
+							smooth: 0.5,
+							symbol: 'none',
+							lineStyle: {
+								color: null,
+								width: 3
+							},
+							data: []
+						}
+					]
+				}
+			}
+		},
+		
+		created() {
+			// this.option.series[0].data = []
+		},
+		
+		methods: {
+			getDataAction() {
+				this.option.series[0].data = this.dataList
+				this.option.series[0].lineStyle.color = this.isYellow ? this.fuzhuColor50 : this.themeColor50
+				// console.log('数据刷新', this.option.series)
+			},
+		},
+		watch: {
+			dataList: {
+				handler(e1, e2) {
+					var e1Str = JSON.stringify(e1)
+					var e2Str = JSON.stringify(e2)
+					if (e1Str && e1Str != e2Str) {
+						this.getDataAction()
+					}
+				},
+				deep: true,
+				immediate: true
+			},
+			themeColor50: {
+				handler(e) {
+					if (e) {
+						this.option.series[0].lineStyle.color = this.isYellow ? this.fuzhuColor50 : this.themeColor50
+					}
+				},
+				immediate: true
+			}
+		}
+		
+	}
+</script>
+
+<script module="echarts" lang="renderjs">
+	let myChart
+	export default {
+		mounted() {
+			this.initAction()
+		},
+		methods: {
+			initAction() {
+				if (typeof window.echarts === 'function') {
+					this.initEcharts()
+				} else {
+					// 动态引入较大类库避免影响页面展示
+					const script = document.createElement('script')
+					// view 层的页面运行在 www 根目录,其相对路径相对于 www 计算
+					script.src = 'static/echarts.js'
+					script.onload = this.initEcharts.bind(this)
+					document.head.appendChild(script)
+				}
+			},
+			initEcharts() {
+				myChart = echarts.init(document.getElementById("kehufenpaiChart"))
+				// 观测更新的数据在 view 层可以直接访问到
+				myChart.setOption(this.option)
+			},
+			updateEcharts(newValue, oldValue, ownerInstance, instance) {
+				if (myChart) {
+					// 监听 service 层数据变更
+					myChart.setOption(newValue)
+				}
+				else {
+					// console.log("无chart11111 -> this.$refs", this.$refs.chartId.$el.id)
+					this.initAction()
+				}
+			},
+			onClick(event, ownerInstance) {
+				// 调用 service 层的方法
+				ownerInstance.callMethod('onViewClick', {
+					test: 'test'
+				})
+			}
+		}
+	}
+</script>
+
+<style>
+	.content {
+		width: 100%;
+		height: 100%;
+	}
+	
+	.title {
+		font-size: 32rpx;
+		font-family: Verdana;
+		text-align: center;
+		width: 176rpx;
+		margin-left: calc((100% - 176rpx) / 2);
+		line-height: 46rpx;
+		/* background-color: #E1F4F4; */
+		color: rgba(0, 0, 0, 0.65);
+		margin-top: 28rpx;
+		margin-left: 20rpx;
+		border-radius: 8rpx;
+	}
+	
+	.count {
+		width: 100%;
+		margin-top: 24rpx;
+		height: 48rpx;
+		line-height: 48rpx;
+		text-align: center;
+		font-family: Verdana;
+		font-size: 40rpx;
+		color: rgba(32, 38, 56, 1);
+	}
+	
+	.echarts {
+		margin-top: 10rpx;
+		width: 100%;
+		height: 80rpx;
+	}
+</style>

+ 188 - 0
components/charts/daskSubCharts/qiangdanChart.vue

@@ -0,0 +1,188 @@
+<template>
+	<view class="content">
+		<!-- #ifdef APP-PLUS || H5 -->
+		<view class="title" 
+		:style="`background-color: ${isYellow ? fuzhuColor50 : themeColor50};`">
+			{{title}}
+		</view>
+		<view class="count">
+			{{count}}
+		</view>
+		<view :prop="option" :change:prop="echarts.updateEcharts" id="qiangdanChart" class="echarts" v-show="fuzhuColor50!=null && dataList.length > 0"></view>
+		<!-- #endif -->
+		<!-- #ifndef APP-PLUS || H5 -->
+		<view>非 APP、H5 环境不支持</view>
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+	import echarts from '../../../static/echarts.js'
+	
+	export default {
+		props: {
+			title: String,
+			count: Number,
+			dataList: {
+				type: Array,
+				default: () => {
+					return []
+				}
+			},
+			isYellow: Boolean,
+			themeColor50: String,
+			fuzhuColor50: String,
+		},
+		data() {
+			return {
+				option: {
+					grid: {
+						left: '10%',
+						right: '10%',
+						top: '0%',
+						bottom: '10%',
+						containLabel: false
+					},
+					xAxis: {
+						show: false,
+						type: 'category',
+						boundaryGap: ['20%', '20%']
+					},
+					yAxis: {
+						show: false,
+						type: 'value',
+						boundaryGap: ['70%', '70%']
+					},
+					series: [
+						{
+							type: 'line',
+							smooth: 0.5,
+							symbol: 'none',
+							lineStyle: {
+								color: null,
+								width: 3
+							},
+							data: []
+						}
+					]
+				}
+			}
+		},
+		
+		created() {
+			// this.option.series[0].data = []
+		},
+		
+		methods: {
+			getDataAction() {
+				this.option.series[0].data = this.dataList
+				this.option.series[0].lineStyle.color = this.isYellow ? this.fuzhuColor50 : this.themeColor50
+				// console.log('数据刷新', this.option.series)
+			},
+		},
+		watch: {
+			dataList: {
+				handler(e1, e2) {
+					var e1Str = JSON.stringify(e1)
+					var e2Str = JSON.stringify(e2)
+					if (e1Str && e1Str != e2Str) {
+						this.getDataAction()
+					}
+				},
+				deep: true,
+				immediate: true
+			},
+			themeColor50: {
+				handler(e) {
+					if (e) {
+						this.option.series[0].lineStyle.color = this.isYellow ? this.fuzhuColor50 : this.themeColor50
+					}
+				},
+				immediate: true
+			}
+		}
+		
+	}
+</script>
+
+<script module="echarts" lang="renderjs">
+	let myChart
+	export default {
+		mounted() {
+			this.initAction()
+		},
+		methods: {
+			initAction() {
+				if (typeof window.echarts === 'function') {
+					this.initEcharts()
+				} else {
+					// 动态引入较大类库避免影响页面展示
+					const script = document.createElement('script')
+					// view 层的页面运行在 www 根目录,其相对路径相对于 www 计算
+					script.src = 'static/echarts.js'
+					script.onload = this.initEcharts.bind(this)
+					document.head.appendChild(script)
+				}
+			},
+			initEcharts() {
+				myChart = echarts.init(document.getElementById("qiangdanChart"))
+				// 观测更新的数据在 view 层可以直接访问到
+				myChart.setOption(this.option)
+			},
+			updateEcharts(newValue, oldValue, ownerInstance, instance) {
+				if (myChart) {
+					// 监听 service 层数据变更
+					myChart.setOption(newValue)
+				}
+				else {
+					// console.log("无chart11111 -> this.$refs", this.$refs.chartId.$el.id)
+					this.initAction()
+				}
+			},
+			onClick(event, ownerInstance) {
+				// 调用 service 层的方法
+				ownerInstance.callMethod('onViewClick', {
+					test: 'test'
+				})
+			}
+		}
+	}
+</script>
+
+<style>
+	.content {
+		width: 100%;
+		height: 100%;
+	}
+	
+	.title {
+		font-size: 32rpx;
+		font-family: Verdana;
+		text-align: center;
+		width: 176rpx;
+		margin-left: calc((100% - 176rpx) / 2);
+		line-height: 46rpx;
+		/* background-color: #E1F4F4; */
+		color: rgba(0, 0, 0, 0.65);
+		margin-top: 28rpx;
+		margin-left: 20rpx;
+		border-radius: 8rpx;
+	}
+	
+	.count {
+		width: 100%;
+		margin-top: 24rpx;
+		height: 48rpx;
+		line-height: 48rpx;
+		text-align: center;
+		font-family: Verdana;
+		font-size: 40rpx;
+		color: rgba(32, 38, 56, 1);
+	}
+	
+	.echarts {
+		margin-top: 10rpx;
+		width: 100%;
+		height: 80rpx;
+	}
+</style>

+ 188 - 0
components/charts/daskSubCharts/renzhengChart.vue

@@ -0,0 +1,188 @@
+<template>
+	<view class="content">
+		<!-- #ifdef APP-PLUS || H5 -->
+		<view class="title" 
+		:style="`background-color: ${isYellow ? fuzhuColor50 : themeColor50};`">
+			{{title}}
+		</view>
+		<view class="count">
+			{{count}}
+		</view>
+		<view :prop="option" :change:prop="echarts.updateEcharts" id="renzhengChart" class="echarts" v-show="fuzhuColor50!=null && dataList.length > 0"></view>
+		<!-- #endif -->
+		<!-- #ifndef APP-PLUS || H5 -->
+		<view>非 APP、H5 环境不支持</view>
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+	import echarts from '../../../static/echarts.js'
+	
+	export default {
+		props: {
+			title: String,
+			count: Number,
+			dataList: {
+				type: Array,
+				default: () => {
+					return []
+				}
+			},
+			isYellow: Boolean,
+			themeColor50: String,
+			fuzhuColor50: String,
+		},
+		data() {
+			return {
+				option: {
+					grid: {
+						left: '10%',
+						right: '10%',
+						top: '0%',
+						bottom: '10%',
+						containLabel: false
+					},
+					xAxis: {
+						show: false,
+						type: 'category',
+						boundaryGap: ['20%', '20%']
+					},
+					yAxis: {
+						show: false,
+						type: 'value',
+						boundaryGap: ['70%', '70%']
+					},
+					series: [
+						{
+							type: 'line',
+							smooth: 0.5,
+							symbol: 'none',
+							lineStyle: {
+								color: null,
+								width: 3
+							},
+							data: []
+						}
+					]
+				}
+			}
+		},
+		
+		created() {
+			// this.option.series[0].data = []
+		},
+		
+		methods: {
+			getDataAction() {
+				this.option.series[0].data = this.dataList
+				this.option.series[0].lineStyle.color = this.isYellow ? this.fuzhuColor50 : this.themeColor50
+				// console.log('数据刷新', this.option.series)
+			},
+		},
+		watch: {
+			dataList: {
+				handler(e1, e2) {
+					var e1Str = JSON.stringify(e1)
+					var e2Str = JSON.stringify(e2)
+					if (e1Str && e1Str != e2Str) {
+						this.getDataAction()
+					}
+				},
+				deep: true,
+				immediate: true
+			},
+			themeColor50: {
+				handler(e) {
+					if (e) {
+						this.option.series[0].lineStyle.color = this.isYellow ? this.fuzhuColor50 : this.themeColor50
+					}
+				},
+				immediate: true
+			}
+		}
+		
+	}
+</script>
+
+<script module="echarts" lang="renderjs">
+	let myChart
+	export default {
+		mounted() {
+			this.initAction()
+		},
+		methods: {
+			initAction() {
+				if (typeof window.echarts === 'function') {
+					this.initEcharts()
+				} else {
+					// 动态引入较大类库避免影响页面展示
+					const script = document.createElement('script')
+					// view 层的页面运行在 www 根目录,其相对路径相对于 www 计算
+					script.src = 'static/echarts.js'
+					script.onload = this.initEcharts.bind(this)
+					document.head.appendChild(script)
+				}
+			},
+			initEcharts() {
+				myChart = echarts.init(document.getElementById("renzhengChart"))
+				// 观测更新的数据在 view 层可以直接访问到
+				myChart.setOption(this.option)
+			},
+			updateEcharts(newValue, oldValue, ownerInstance, instance) {
+				if (myChart) {
+					// 监听 service 层数据变更
+					myChart.setOption(newValue)
+				}
+				else {
+					// console.log("无chart11111 -> this.$refs", this.$refs.chartId.$el.id)
+					this.initAction()
+				}
+			},
+			onClick(event, ownerInstance) {
+				// 调用 service 层的方法
+				ownerInstance.callMethod('onViewClick', {
+					test: 'test'
+				})
+			}
+		}
+	}
+</script>
+
+<style>
+	.content {
+		width: 100%;
+		height: 100%;
+	}
+	
+	.title {
+		font-size: 32rpx;
+		font-family: Verdana;
+		text-align: center;
+		width: 176rpx;
+		margin-left: calc((100% - 176rpx) / 2);
+		line-height: 46rpx;
+		/* background-color: #E1F4F4; */
+		color: rgba(0, 0, 0, 0.65);
+		margin-top: 28rpx;
+		margin-left: 20rpx;
+		border-radius: 8rpx;
+	}
+	
+	.count {
+		width: 100%;
+		margin-top: 24rpx;
+		height: 48rpx;
+		line-height: 48rpx;
+		text-align: center;
+		font-family: Verdana;
+		font-size: 40rpx;
+		color: rgba(32, 38, 56, 1);
+	}
+	
+	.echarts {
+		margin-top: 10rpx;
+		width: 100%;
+		height: 80rpx;
+	}
+</style>

+ 190 - 0
components/charts/daskSubCharts/renzhengjiluChart.vue

@@ -0,0 +1,190 @@
+<template>
+	<view class="content">
+		<!-- #ifdef APP-PLUS || H5 -->
+		<view class="title" 
+		:style="`background-color: ${isYellow ? fuzhuColor50 : themeColor50};`">
+			{{title}}
+		</view>
+		<view class="count">
+			{{count}}
+		</view>
+		<view :prop="option" :change:prop="echarts.updateEcharts" id="renzhengjiluChart" class="echarts" v-show="fuzhuColor50!=null && dataList.length > 0"></view>
+		<!-- #endif -->
+		<!-- #ifndef APP-PLUS || H5 -->
+		<view>非 APP、H5 环境不支持</view>
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+	import echarts from '../../../static/echarts.js'
+	
+	export default {
+		props: {
+			title: String,
+			count: Number,
+			dataList: {
+				type: Array,
+				default: () => {
+					return []
+				}
+			},
+			isYellow: Boolean,
+			themeColor50: String,
+			fuzhuColor50: String,
+		},
+		data() {
+			return {
+				option: {
+					grid: {
+						left: '10%',
+						right: '10%',
+						top: '0%',
+						bottom: '10%',
+						containLabel: false
+					},
+					xAxis: {
+						show: false,
+						type: 'category',
+						boundaryGap: ['20%', '20%']
+					},
+					yAxis: {
+						show: false,
+						type: 'value',
+						boundaryGap: ['70%', '70%']
+					},
+					series: [
+						{
+							type: 'line',
+							smooth: 0.5,
+							symbol: 'none',
+							lineStyle: {
+								color: null,
+								width: 3
+							},
+							data: []
+						}
+					]
+				}
+			}
+		},
+		
+		created() {
+			// this.option.series[0].data = []
+		},
+		
+		methods: {
+			getDataAction() {
+				this.option.series[0].data = this.dataList
+				this.option.series[0].lineStyle.color = this.isYellow ? this.fuzhuColor50 : this.themeColor50
+				// console.log('数据刷新', this.option.series)
+			},
+		},
+		watch: {
+			dataList: {
+				handler(e1, e2) {
+					var e1Str = JSON.stringify(e1)
+					var e2Str = JSON.stringify(e2)
+					if (e1Str && e1Str != e2Str) {
+						this.getDataAction()
+					}
+				},
+				deep: true,
+				immediate: true
+			},
+			themeColor50: {
+				handler(e) {
+					if (e) {
+						this.option.series[0].lineStyle.color = this.isYellow ? this.fuzhuColor50 : this.themeColor50
+					}
+				},
+				immediate: true
+			}
+		}
+		
+	}
+</script>
+
+<script module="echarts" lang="renderjs">
+	let myChart
+	export default {
+		mounted() {
+			this.initAction()
+		},
+		methods: {
+			initAction() {
+				if (typeof window.echarts === 'function') {
+					this.initEcharts()
+				} else {
+					// 动态引入较大类库避免影响页面展示
+					const script = document.createElement('script')
+					// view 层的页面运行在 www 根目录,其相对路径相对于 www 计算
+					script.src = 'static/echarts.js'
+					script.onload = this.initEcharts.bind(this)
+					document.head.appendChild(script)
+				}
+			},
+			initEcharts() {
+				myChart = echarts.init(document.getElementById("renzhengjiluChart"))
+				// 观测更新的数据在 view 层可以直接访问到
+				myChart.setOption(this.option)
+				myChart.resize()
+			},
+			updateEcharts(newValue, oldValue, ownerInstance, instance) {
+				if (myChart) {
+					// 监听 service 层数据变更
+					myChart.setOption(newValue)
+					myChart.resize()
+				}
+				else {
+					// console.log("无chart11111 -> this.$refs", this.$refs.chartId.$el.id)
+					this.initAction()
+				}
+			},
+			onClick(event, ownerInstance) {
+				// 调用 service 层的方法
+				ownerInstance.callMethod('onViewClick', {
+					test: 'test'
+				})
+			}
+		}
+	}
+</script>
+
+<style>
+	.content {
+		width: 100%;
+		height: 100%;
+	}
+	
+	.title {
+		font-size: 32rpx;
+		font-family: Verdana;
+		text-align: center;
+		width: 176rpx;
+		margin-left: calc((100% - 176rpx) / 2);
+		line-height: 46rpx;
+		/* background-color: #E1F4F4; */
+		color: rgba(0, 0, 0, 0.65);
+		margin-top: 28rpx;
+		margin-left: 20rpx;
+		border-radius: 8rpx;
+	}
+	
+	.count {
+		width: 100%;
+		margin-top: 24rpx;
+		height: 48rpx;
+		line-height: 48rpx;
+		text-align: center;
+		font-family: Verdana;
+		font-size: 40rpx;
+		color: rgba(32, 38, 56, 1);
+	}
+	
+	.echarts {
+		margin-top: 10rpx;
+		width: 100%;
+		height: 80rpx;
+	}
+</style>

+ 188 - 0
components/charts/daskSubCharts/shibiejieguoChart.vue

@@ -0,0 +1,188 @@
+<template>
+	<view class="content">
+		<!-- #ifdef APP-PLUS || H5 -->
+		<view class="title" 
+		:style="`background-color: ${isYellow ? fuzhuColor50 : themeColor50};`">
+			{{title}}
+		</view>
+		<view class="count">
+			{{count}}
+		</view>
+		<view :prop="option" :change:prop="echarts.updateEcharts" id="shibiejieguoChart" class="echarts" v-show="fuzhuColor50!=null && dataList.length > 0"></view>
+		<!-- #endif -->
+		<!-- #ifndef APP-PLUS || H5 -->
+		<view>非 APP、H5 环境不支持</view>
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+	import echarts from '../../../static/echarts.js'
+	
+	export default {
+		props: {
+			title: String,
+			count: Number,
+			dataList: {
+				type: Array,
+				default: () => {
+					return []
+				}
+			},
+			isYellow: Boolean,
+			themeColor50: String,
+			fuzhuColor50: String,
+		},
+		data() {
+			return {
+				option: {
+					grid: {
+						left: '10%',
+						right: '10%',
+						top: '0%',
+						bottom: '10%',
+						containLabel: false
+					},
+					xAxis: {
+						show: false,
+						type: 'category',
+						boundaryGap: ['20%', '20%']
+					},
+					yAxis: {
+						show: false,
+						type: 'value',
+						boundaryGap: ['70%', '70%']
+					},
+					series: [
+						{
+							type: 'line',
+							smooth: 0.5,
+							symbol: 'none',
+							lineStyle: {
+								color: null,
+								width: 3
+							},
+							data: []
+						}
+					]
+				}
+			}
+		},
+		
+		created() {
+			// this.option.series[0].data = []
+		},
+		
+		methods: {
+			getDataAction() {
+				this.option.series[0].data = this.dataList
+				this.option.series[0].lineStyle.color = this.isYellow ? this.fuzhuColor50 : this.themeColor50
+				// console.log('数据刷新', this.option.series)
+			},
+		},
+		watch: {
+			dataList: {
+				handler(e1, e2) {
+					var e1Str = JSON.stringify(e1)
+					var e2Str = JSON.stringify(e2)
+					if (e1Str && e1Str != e2Str) {
+						this.getDataAction()
+					}
+				},
+				deep: true,
+				immediate: true
+			},
+			themeColor50: {
+				handler(e) {
+					if (e) {
+						this.option.series[0].lineStyle.color = this.isYellow ? this.fuzhuColor50 : this.themeColor50
+					}
+				},
+				immediate: true
+			}
+		}
+		
+	}
+</script>
+
+<script module="echarts" lang="renderjs">
+	let myChart
+	export default {
+		mounted() {
+			this.initAction()
+		},
+		methods: {
+			initAction() {
+				if (typeof window.echarts === 'function') {
+					this.initEcharts()
+				} else {
+					// 动态引入较大类库避免影响页面展示
+					const script = document.createElement('script')
+					// view 层的页面运行在 www 根目录,其相对路径相对于 www 计算
+					script.src = 'static/echarts.js'
+					script.onload = this.initEcharts.bind(this)
+					document.head.appendChild(script)
+				}
+			},
+			initEcharts() {
+				myChart = echarts.init(document.getElementById("shibiejieguoChart"))
+				// 观测更新的数据在 view 层可以直接访问到
+				myChart.setOption(this.option)
+			},
+			updateEcharts(newValue, oldValue, ownerInstance, instance) {
+				if (myChart) {
+					// 监听 service 层数据变更
+					myChart.setOption(newValue)
+				}
+				else {
+					// console.log("无chart11111 -> this.$refs", this.$refs.chartId.$el.id)
+					this.initAction()
+				}
+			},
+			onClick(event, ownerInstance) {
+				// 调用 service 层的方法
+				ownerInstance.callMethod('onViewClick', {
+					test: 'test'
+				})
+			}
+		}
+	}
+</script>
+
+<style>
+	.content {
+		width: 100%;
+		height: 100%;
+	}
+	
+	.title {
+		font-size: 32rpx;
+		font-family: Verdana;
+		text-align: center;
+		width: 176rpx;
+		margin-left: calc((100% - 176rpx) / 2);
+		line-height: 46rpx;
+		/* background-color: #E1F4F4; */
+		color: rgba(0, 0, 0, 0.65);
+		margin-top: 28rpx;
+		margin-left: 20rpx;
+		border-radius: 8rpx;
+	}
+	
+	.count {
+		width: 100%;
+		margin-top: 24rpx;
+		height: 48rpx;
+		line-height: 48rpx;
+		text-align: center;
+		font-family: Verdana;
+		font-size: 40rpx;
+		color: rgba(32, 38, 56, 1);
+	}
+	
+	.echarts {
+		margin-top: 10rpx;
+		width: 100%;
+		height: 80rpx;
+	}
+</style>

+ 188 - 0
components/charts/daskSubCharts/telishenheChart.vue

@@ -0,0 +1,188 @@
+<template>
+	<view class="content">
+		<!-- #ifdef APP-PLUS || H5 -->
+		<view class="title" 
+		:style="`background-color: ${isYellow ? fuzhuColor50 : themeColor50};`">
+			{{title}}
+		</view>
+		<view class="count">
+			{{count}}
+		</view>
+		<view :prop="option" :change:prop="echarts.updateEcharts" id="telishenheChart" class="echarts" v-show="fuzhuColor50!=null && dataList.length > 0"></view>
+		<!-- #endif -->
+		<!-- #ifndef APP-PLUS || H5 -->
+		<view>非 APP、H5 环境不支持</view>
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+	import echarts from '../../../static/echarts.js'
+	
+	export default {
+		props: {
+			title: String,
+			count: Number,
+			dataList: {
+				type: Array,
+				default: () => {
+					return []
+				}
+			},
+			isYellow: Boolean,
+			themeColor50: String,
+			fuzhuColor50: String,
+		},
+		data() {
+			return {
+				option: {
+					grid: {
+						left: '10%',
+						right: '10%',
+						top: '0%',
+						bottom: '10%',
+						containLabel: false
+					},
+					xAxis: {
+						show: false,
+						type: 'category',
+						boundaryGap: ['20%', '20%']
+					},
+					yAxis: {
+						show: false,
+						type: 'value',
+						boundaryGap: ['70%', '70%']
+					},
+					series: [
+						{
+							type: 'line',
+							smooth: 0.5,
+							symbol: 'none',
+							lineStyle: {
+								color: null,
+								width: 3
+							},
+							data: []
+						}
+					]
+				}
+			}
+		},
+		
+		created() {
+			// this.option.series[0].data = []
+		},
+		
+		methods: {
+			getDataAction() {
+				this.option.series[0].data = this.dataList
+				this.option.series[0].lineStyle.color = this.isYellow ? this.fuzhuColor50 : this.themeColor50
+				// console.log('数据刷新', this.option.series)
+			},
+		},
+		watch: {
+			dataList: {
+				handler(e1, e2) {
+					var e1Str = JSON.stringify(e1)
+					var e2Str = JSON.stringify(e2)
+					if (e1Str && e1Str != e2Str) {
+						this.getDataAction()
+					}
+				},
+				deep: true,
+				immediate: true
+			},
+			themeColor50: {
+				handler(e) {
+					if (e) {
+						this.option.series[0].lineStyle.color = this.isYellow ? this.fuzhuColor50 : this.themeColor50
+					}
+				},
+				immediate: true
+			}
+		}
+		
+	}
+</script>
+
+<script module="echarts" lang="renderjs">
+	let myChart
+	export default {
+		mounted() {
+			this.initAction()
+		},
+		methods: {
+			initAction() {
+				if (typeof window.echarts === 'function') {
+					this.initEcharts()
+				} else {
+					// 动态引入较大类库避免影响页面展示
+					const script = document.createElement('script')
+					// view 层的页面运行在 www 根目录,其相对路径相对于 www 计算
+					script.src = 'static/echarts.js'
+					script.onload = this.initEcharts.bind(this)
+					document.head.appendChild(script)
+				}
+			},
+			initEcharts() {
+				myChart = echarts.init(document.getElementById("telishenheChart"))
+				// 观测更新的数据在 view 层可以直接访问到
+				myChart.setOption(this.option)
+			},
+			updateEcharts(newValue, oldValue, ownerInstance, instance) {
+				if (myChart) {
+					// 监听 service 层数据变更
+					myChart.setOption(newValue)
+				}
+				else {
+					// console.log("无chart11111 -> this.$refs", this.$refs.chartId.$el.id)
+					this.initAction()
+				}
+			},
+			onClick(event, ownerInstance) {
+				// 调用 service 层的方法
+				ownerInstance.callMethod('onViewClick', {
+					test: 'test'
+				})
+			}
+		}
+	}
+</script>
+
+<style>
+	.content {
+		width: 100%;
+		height: 100%;
+	}
+	
+	.title {
+		font-size: 32rpx;
+		font-family: Verdana;
+		text-align: center;
+		width: 176rpx;
+		margin-left: calc((100% - 176rpx) / 2);
+		line-height: 46rpx;
+		/* background-color: #E1F4F4; */
+		color: rgba(0, 0, 0, 0.65);
+		margin-top: 28rpx;
+		margin-left: 20rpx;
+		border-radius: 8rpx;
+	}
+	
+	.count {
+		width: 100%;
+		margin-top: 24rpx;
+		height: 48rpx;
+		line-height: 48rpx;
+		text-align: center;
+		font-family: Verdana;
+		font-size: 40rpx;
+		color: rgba(32, 38, 56, 1);
+	}
+	
+	.echarts {
+		margin-top: 10rpx;
+		width: 100%;
+		height: 80rpx;
+	}
+</style>

+ 188 - 0
components/charts/daskSubCharts/yaoyueChart.vue

@@ -0,0 +1,188 @@
+<template>
+	<view class="content">
+		<!-- #ifdef APP-PLUS || H5 -->
+		<view class="title" 
+		:style="`background-color: ${isYellow ? fuzhuColor50 : themeColor50};`">
+			{{title}}
+		</view>
+		<view class="count">
+			{{count}}
+		</view>
+		<view :prop="option" :change:prop="echarts.updateEcharts" id="yaoyueChart" class="echarts" v-show="fuzhuColor50!=null && dataList.length > 0"></view>
+		<!-- #endif -->
+		<!-- #ifndef APP-PLUS || H5 -->
+		<view>非 APP、H5 环境不支持</view>
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+	import echarts from '../../../static/echarts.js'
+	
+	export default {
+		props: {
+			title: String,
+			count: Number,
+			dataList: {
+				type: Array,
+				default: () => {
+					return []
+				}
+			},
+			isYellow: Boolean,
+			themeColor50: String,
+			fuzhuColor50: String,
+		},
+		data() {
+			return {
+				option: {
+					grid: {
+						left: '10%',
+						right: '10%',
+						top: '0%',
+						bottom: '10%',
+						containLabel: false
+					},
+					xAxis: {
+						show: false,
+						type: 'category',
+						boundaryGap: ['20%', '20%']
+					},
+					yAxis: {
+						show: false,
+						type: 'value',
+						boundaryGap: ['70%', '70%']
+					},
+					series: [
+						{
+							type: 'line',
+							smooth: 0.5,
+							symbol: 'none',
+							lineStyle: {
+								color: null,
+								width: 3
+							},
+							data: []
+						}
+					]
+				}
+			}
+		},
+		
+		created() {
+			// this.option.series[0].data = []
+		},
+		
+		methods: {
+			getDataAction() {
+				this.option.series[0].data = this.dataList
+				this.option.series[0].lineStyle.color = this.isYellow ? this.fuzhuColor50 : this.themeColor50
+				// console.log('数据刷新', this.option.series)
+			},
+		},
+		watch: {
+			dataList: {
+				handler(e1, e2) {
+					var e1Str = JSON.stringify(e1)
+					var e2Str = JSON.stringify(e2)
+					if (e1Str && e1Str != e2Str) {
+						this.getDataAction()
+					}
+				},
+				deep: true,
+				immediate: true
+			},
+			themeColor50: {
+				handler(e) {
+					if (e) {
+						this.option.series[0].lineStyle.color = this.isYellow ? this.fuzhuColor50 : this.themeColor50
+					}
+				},
+				immediate: true
+			}
+		}
+		
+	}
+</script>
+
+<script module="echarts" lang="renderjs">
+	let myChart
+	export default {
+		mounted() {
+			this.initAction()
+		},
+		methods: {
+			initAction() {
+				if (typeof window.echarts === 'function') {
+					this.initEcharts()
+				} else {
+					// 动态引入较大类库避免影响页面展示
+					const script = document.createElement('script')
+					// view 层的页面运行在 www 根目录,其相对路径相对于 www 计算
+					script.src = 'static/echarts.js'
+					script.onload = this.initEcharts.bind(this)
+					document.head.appendChild(script)
+				}
+			},
+			initEcharts() {
+				myChart = echarts.init(document.getElementById("yaoyueChart"))
+				// 观测更新的数据在 view 层可以直接访问到
+				myChart.setOption(this.option)
+			},
+			updateEcharts(newValue, oldValue, ownerInstance, instance) {
+				if (myChart) {
+					// 监听 service 层数据变更
+					myChart.setOption(newValue)
+				}
+				else {
+					// console.log("无chart11111 -> this.$refs", this.$refs.chartId.$el.id)
+					this.initAction()
+				}
+			},
+			onClick(event, ownerInstance) {
+				// 调用 service 层的方法
+				ownerInstance.callMethod('onViewClick', {
+					test: 'test'
+				})
+			}
+		}
+	}
+</script>
+
+<style>
+	.content {
+		width: 100%;
+		height: 100%;
+	}
+	
+	.title {
+		font-size: 32rpx;
+		font-family: Verdana;
+		text-align: center;
+		width: 176rpx;
+		margin-left: calc((100% - 176rpx) / 2);
+		line-height: 46rpx;
+		/* background-color: #E1F4F4; */
+		color: rgba(0, 0, 0, 0.65);
+		margin-top: 28rpx;
+		margin-left: 20rpx;
+		border-radius: 8rpx;
+	}
+	
+	.count {
+		width: 100%;
+		margin-top: 24rpx;
+		height: 48rpx;
+		line-height: 48rpx;
+		text-align: center;
+		font-family: Verdana;
+		font-size: 40rpx;
+		color: rgba(32, 38, 56, 1);
+	}
+	
+	.echarts {
+		margin-top: 10rpx;
+		width: 100%;
+		height: 80rpx;
+	}
+</style>

+ 358 - 0
components/charts/doubleLineChart.vue

@@ -0,0 +1,358 @@
+<template>
+	<view class="content">
+		<!-- #ifdef APP-PLUS || H5 -->
+		<view class="top-Section">
+			<view class="title">{{title}}</view>
+			<view class="rightBtn" @click="yesterdayCompare" v-if="isShowYesterDay">
+				<view class="rightName">昨日环比</view>
+				<view class="rightIcon" :style="`border-color: ${fuzhuColor};`" v-if="isCompare"></view>
+				<view class="rightIcon" style="background-color: #F4F7F7; border-color: #F4F7F7;" v-else></view>
+			</view>
+		</view>
+		<view v-if="themeColor!=null" @click="echarts.onClick" :prop="option" :change:prop="echarts.updateEcharts" ref="chartId"
+		 :id="chartId" class="echarts"></view>
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+	import echarts from '../../static/echarts.js'
+	export default {
+		props: {
+			themeColor: String,
+			fuzhuColor: String,
+			themeColor50: String,
+			themeColor25: String,
+			fuzhuColor50: String,
+			chartId: String,
+			title: String,
+			dataList: Array,
+			data1: Array,
+			data2: Array,
+			isShowYesterDay: {
+				type: Boolean,
+				default: false
+			},
+
+		},
+		data() {
+			return {
+				// dataList: [],
+				// data1: [],
+				// data2: [],
+				option: {
+					tooltip: {
+						trigger: 'axis',
+						axisPointer: {
+							type: 'line',
+							lineStyle: {
+								color: '#F1F5F9',
+								// color: '#3CD9D9',
+								type: 'dotted',
+								width: 2
+							},
+							label: {
+								backgroundColor: '#6a7985'
+							},
+						},
+						extraCssText: 'z-index:50'
+					},
+					grid: {
+						left: '2%',
+						right: '5%',
+						bottom: 0,
+						top: '10%',
+						padding: 0,
+						containLabel: true,
+					},
+					// dataZoom: {
+					// 	type: 'inside',
+					// 	start: 0,
+					// 	end: 30,
+					// 	zoomLock: true,
+					// },
+					xAxis: {
+						type: 'category',
+						boundaryGap: false,
+						data: [],
+						axisLabel: { //坐标轴刻度标签的相关设置。
+							margin: 10,
+							textStyle: {
+								color: '#616F88',
+								fontFamily: 'Verdana',
+								fontSize: 10
+							},
+						},
+						axisTick: { //坐标轴刻度相关设置。
+							show: false,
+						},
+						axisLine: { //坐标轴轴线相关设置
+							show: false
+						},
+					},
+					yAxis: {
+						// show: false,
+						type: 'value',
+						splitNumber: 4,
+						boundaryGap: false,
+						axisTick: {
+							show: false
+						},
+						axisLine: { //坐标轴轴线相关设置
+							// show: false
+							lineStyle: {
+								color: '#707070',
+								opacity: 0
+							}
+						},
+						minInterval: 1,
+						splitLine: {
+							show: false
+						}
+					},
+					series: [{
+							name: '昨日',
+							type: 'line',
+							// stack: '总量',
+							symbol: 'circle',
+							symbolSize: 6,
+							itemStyle: {
+								opacity: 0,
+								normal: {
+									borderRadius: 3,
+									color: this.fuzhuColor,
+									borderWidth: 2,
+									borderColor: '#FFF'
+								},
+							},
+							areaStyle: {
+								color: ''
+							},
+							smooth: true,
+							lineStyle: {
+								color: ''
+							},
+							data: []
+						},
+						{
+							name: '当前',
+							type: 'line',
+							// stack: '总量',
+							symbol: 'circle',
+							symbolSize: 6,
+							itemStyle: {
+								opacity: 0,
+								normal: {
+									borderRadius: 3,
+									color: '',
+									borderWidth: 2,
+									borderColor: '#FFF'
+								},
+							},
+							areaStyle: {
+								// color: '#56CBCB'
+								color: ''
+							},
+							smooth: true,
+							lineStyle: {
+								// color: '#fff',
+								// type: 'dotted'
+							},
+							data: [],
+						}
+					]
+				},
+				isCompare: false
+			}
+		},
+
+		methods: {
+			getDataAction() {
+				// var data1 = []
+				// var data2 = []
+				// var dataList = []
+				// for (var i = 0; i < 24; i++) {
+				// 	var num1 = Math.ceil(Math.random() * 100)
+				// 	var num2 = Math.ceil(Math.random() * 100)
+				// 	data1.push(num1)
+				// 	data2.push(num2)
+				// 	dataList.push(i)
+				// }
+
+				// if (this.dataList.length <= 10) {
+				// 	this.option.dataZoom.end = 100
+				// } else if (this.dataList.length > 10 && this.dataList.length <= 20) {
+				// 	this.option.dataZoom.end = 70
+				// } else if (this.dataList.length > 20 && this.dataList.length <= 30) {
+				// 	this.option.dataZoom.end = 20
+				// } else if (this.dataList.length > 30 && this.dataList.length <= 40) {
+				// 	this.option.dataZoom.end = 15
+				// } else {
+				// 	this.option.dataZoom.end = 10
+				// }
+
+				this.option.series[1].data = this.data1 || []
+				if (this.isCompare) {
+					this.option.series[0].data = this.data2
+				} else {
+					this.option.series[0].data = []
+				}
+				this.option.xAxis.data = this.dataList || []
+				// // console.log('数据刷新', this.option)
+				// console.log('数据刷新Double', this.option)
+			},
+			onViewClick(options) {
+				// console.log(options)
+			},
+			reloadColor() {
+				// console.log('what???:', this.option.series)
+				this.option.series[1].areaStyle.color = new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+					offset: 0,
+					color: this.themeColor
+				}, {
+					offset: 1,
+					color: this.themeColor25
+				}])
+				this.option.series[0].areaStyle.color = new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+					offset: 0,
+					color: this.fuzhuColor50
+				}, {
+					offset: 1,
+					color: '#ffffff'
+				}])
+				this.option.tooltip.axisPointer.lineStyle.color = this.themeColor
+				this.option.series[0].lineStyle.color = this.fuzhuColor
+				this.option.series[1].itemStyle.normal.color = this.themeColor
+				this.option.series[0].itemStyle.normal.color = this.fuzhuColor
+			},
+			yesterdayCompare() {
+				this.isCompare = !this.isCompare
+				if (this.isCompare) {
+					this.option.series[0].data = this.data2
+				} else {
+					this.option.series[0].data = []
+				}
+			}
+		},
+		watch: {
+			chartId: {
+				handler(e) {
+					// // console.log('走没走!!!!', e)
+					this.getDataAction()
+				},
+				immediate: true
+			},
+			themeColor: {
+				handler(e) {
+					// console.log('走没走!!!!', e)
+					this.reloadColor()
+				},
+				immediate: true
+			},
+			data2: {
+				handler(e) {
+					this.getDataAction()
+				},
+				immediate: true
+			}
+		}
+
+	}
+</script>
+
+<script module="echarts" lang="renderjs">
+	let myChart
+	export default {
+		mounted() {
+			this.initAction()
+		},
+		methods: {
+			initAction() {
+				if (typeof window.echarts === 'function') {
+					this.initEcharts()
+				} else {
+					// 动态引入较大类库避免影响页面展示
+					const script = document.createElement('script')
+					// view 层的页面运行在 www 根目录,其相对路径相对于 www 计算
+					script.src = 'static/echarts.js'
+					script.onload = this.initEcharts.bind(this)
+					document.head.appendChild(script)
+				}
+			},
+			initEcharts() {
+				// console.log("initEcharts -> this.$refs", this.$refs.chartId.$el.id)
+				myChart = echarts.init(document.getElementById(this.$refs.chartId.$el.id))
+				// 观测更新的数据在 view 层可以直接访问到
+				if (myChart) {
+					myChart.clear()
+					myChart.setOption(this.option)
+				}
+
+			},
+			updateEcharts(newValue, oldValue, ownerInstance, instance) {
+				// 监听 service 层数据变更
+				if (myChart) {
+					myChart.clear()
+					myChart.setOption(newValue)
+				}
+			},
+			onClick(event, ownerInstance) {
+				// 调用 service 层的方法
+				ownerInstance.callMethod('onViewClick', {
+					test: 'test'
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.content {
+		width: 100%;
+		height: 100%;
+		// background-color: #FFFFFF;
+		overflow: hidden;
+		margin-bottom: 80rpx;
+
+		.top-Section {
+			padding: 0 20rpx;
+			display: flex;
+			flex-direction: row;
+			justify-content: space-between;
+			font-family: Verdana;
+
+			.title {
+				font-size: 32rpx;
+				font-weight: bold;
+				color: #383838;
+			}
+
+			.rightBtn {
+				font-size: 24rpx;
+				color: #546074;
+				margin-top: 5rpx;
+				display: flex;
+				flex-direction: row;
+				justify-content: flex-end;
+
+				.rightName {
+					margin-right: 12rpx;
+					margin-top: 5rpx;
+				}
+
+				.rightIcon {
+					width: 20rpx;
+					height: 20rpx;
+					border-radius: 50%;
+					border: 10rpx solid;
+				}
+			}
+		}
+
+		.echarts {
+			width: 100%;
+			margin-top: 0;
+			height: 350rpx;
+		}
+	}
+</style>

+ 344 - 0
components/charts/doubleLineChart2.vue

@@ -0,0 +1,344 @@
+<template>
+	<view class="content">
+		<!-- #ifdef APP-PLUS || H5 -->
+		<view class="top-Section">
+			<view class="title">{{title}}</view>
+			<view class="top-Section-right">
+				<view class="right-item">
+					<view class="right-item-point" :style="`background-color: ${fuzhuColor};`"></view>
+					<view class="right-item-title">认购</view>
+				</view>
+				<view class="right-item">
+					<view class="right-item-point" :style="`background-color: ${themeColor};`"></view>
+					<view class="right-item-title">签约</view>
+				</view>
+			</view>
+		</view>
+		<view class="top-Section-right">
+<!-- 			<view class="right-item">
+				<view class="right-item-point" :style="`background-color: ${fuzhuColor};`"></view>
+				<view class="right-item-title">认购</view>
+			</view>
+			<view class="right-item">
+				<view class="right-item-point" :style="`background-color: ${themeColor};`"></view>
+				<view class="right-item-title">签约</view>
+			</view> -->
+		</view>
+		<view v-if="themeColor!=null" @click="echarts.onClick" :prop="option" :change:prop="echarts.updateEcharts" ref="chartId"
+		 :id="chartId" class="echarts"></view>
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+	import echarts from '../../static/echarts.js'
+	export default {
+		props: {
+			themeColor: String,
+			fuzhuColor: String,
+			themeColor50: String,
+			themeColor25: String,
+			fuzhuColor50: String,
+			chartId: String,
+			title: String,
+			dataList: Array,
+			data1: Array,
+			data2: Array,
+		},
+		data() {
+			return {
+				option: {
+					tooltip: {
+						trigger: 'axis',
+						axisPointer: {
+							type: 'line',
+							lineStyle: {
+								color: '#F1F5F9',
+								// color: '#3CD9D9',
+								type: 'dotted',
+								width: 2
+							},
+							label: {
+								backgroundColor: '#6a7985'
+							},
+						},
+						extraCssText: 'z-index:50'
+					},
+					grid: {
+						left: '2%',
+						right: '5%',
+						bottom: 0,
+						top: '10%',
+						padding: 0,
+						containLabel: true,
+					},
+					xAxis: {
+						type: 'category',
+						boundaryGap: false,
+						data: [],
+						axisLabel: { //坐标轴刻度标签的相关设置。
+							margin: 10,
+							textStyle: {
+								color: '#616F88',
+								fontFamily: 'Verdana',
+								fontSize: 10,
+								opacity: 0.5
+							},
+						},
+						axisTick: { //坐标轴刻度相关设置。
+							show: false,
+						},
+						axisLine: { //坐标轴轴线相关设置
+							show: false,
+							lineStyle: {
+								color: '',
+								opacity: 1
+							}
+						},
+					},
+					yAxis: {
+						// show: false,
+						type: 'value',
+						splitNumber: 4,
+						boundaryGap: false,
+						axisTick: {
+							show: false
+						},
+						axisLine: { //坐标轴轴线相关设置
+							// show: false
+							lineStyle: {
+								color: '#707070',
+								opacity: 0
+							}
+						},
+						minInterval: 1,
+						splitLine: {
+							show: false
+						}
+					},
+					series: [{
+							name: '认购',
+							type: 'line',
+							// stack: '总量',
+							symbol: 'circle',
+							symbolSize: 6,
+							itemStyle: {
+								opacity: 0,
+								normal: {
+									borderRadius: 3,
+									color: this.fuzhuColor,
+									borderWidth: 2,
+									borderColor: '#FFF'
+								},
+							},
+							areaStyle: {
+								color: ''
+							},
+							smooth: true,
+							lineStyle: {
+								color: ''
+							},
+							data: []
+						},
+						{
+							name: '签约',
+							type: 'line',
+							// stack: '总量',
+							symbol: 'circle',
+							symbolSize: 6,
+							itemStyle: {
+								opacity: 0,
+								normal: {
+									borderRadius: 3,
+									color: '',
+									borderWidth: 2,
+									borderColor: '#FFF'
+								},
+							},
+							areaStyle: {
+								// color: '#56CBCB'
+								color: ''
+							},
+							smooth: true,
+							lineStyle: {
+								// color: '#fff',
+								// type: 'dotted'
+							},
+							data: [],
+						}
+					]
+				},
+				isCompare: false
+			}
+		},
+
+		methods: {
+			getDataAction() {
+
+				this.option.series[1].data = this.data1 || []
+				this.option.series[0].data = this.data2 || []
+				this.option.xAxis.data = this.dataList || []
+				
+				if (this.data2.length == 1) {
+					this.option.xAxis.axisLine.show = true
+					this.option.xAxis.axisLine.lineStyle.color = this.themeColor50
+				}
+				else {
+					this.option.xAxis.axisLine.show = false
+				}
+			},
+			onViewClick(options) {
+				// console.log(options)
+			},
+			reloadColor() {
+				// console.log('what???:', this.option.series)
+				this.option.series[1].areaStyle.color = new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+					offset: 0,
+					color: this.themeColor
+				}, {
+					offset: 1,
+					color: this.themeColor25
+				}])
+				this.option.series[0].areaStyle.color = new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
+					offset: 0,
+					color: this.fuzhuColor50
+				}, {
+					offset: 1,
+					color: '#ffffff'
+				}])
+				this.option.tooltip.axisPointer.lineStyle.color = this.themeColor
+				this.option.series[0].lineStyle.color = this.fuzhuColor
+				this.option.series[1].itemStyle.normal.color = this.themeColor
+				this.option.series[0].itemStyle.normal.color = this.fuzhuColor
+				this.option.xAxis.axisLine.lineStyle.color = this.themeColor50
+			}
+		},
+		watch: {
+			chartId: {
+				handler(e) {
+					// // console.log('走没走!!!!', e)
+					this.getDataAction()
+				},
+				immediate: true
+			},
+			themeColor: {
+				handler(e) {
+					// console.log('走没走!!!!', e)
+					this.reloadColor()
+				},
+				immediate: true
+			},
+			data2: {
+				handler(e) {
+					this.getDataAction()
+				},
+				immediate: true
+			}
+		}
+
+	}
+</script>
+
+<script module="echarts" lang="renderjs">
+	let myChart
+	export default {
+		mounted() {
+			this.initAction()
+		},
+		methods: {
+			initAction() {
+				if (typeof window.echarts === 'function') {
+					this.initEcharts()
+				} else {
+					// 动态引入较大类库避免影响页面展示
+					const script = document.createElement('script')
+					// view 层的页面运行在 www 根目录,其相对路径相对于 www 计算
+					script.src = 'static/echarts.js'
+					script.onload = this.initEcharts.bind(this)
+					document.head.appendChild(script)
+				}
+			},
+			initEcharts() {
+				// console.log("initEcharts -> this.$refs", this.$refs.chartId.$el.id)
+				myChart = echarts.init(document.getElementById(this.$refs.chartId.$el.id))
+				// 观测更新的数据在 view 层可以直接访问到
+				if (myChart) {
+					myChart.clear()
+					myChart.setOption(this.option)
+				}
+
+			},
+			updateEcharts(newValue, oldValue, ownerInstance, instance) {
+				// 监听 service 层数据变更
+				if (myChart) {
+					myChart.clear()
+					myChart.setOption(newValue)
+				}
+			},
+			onClick(event, ownerInstance) {
+				// 调用 service 层的方法
+				ownerInstance.callMethod('onViewClick', {
+					test: 'test'
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.content {
+		width: 100%;
+		height: 100%;
+		// background-color: #FFFFFF;
+		overflow: hidden;
+		margin-bottom: 80rpx;
+
+		.top-Section {
+			padding: 0 20rpx;
+			display: flex;
+			flex-direction: row;
+			justify-content: space-between;
+			font-family: Verdana;
+			align-items: center;
+			margin-bottom: 10rpx;
+
+			.title {
+				font-size: 32rpx;
+				font-weight: bold;
+				color: #383838;
+			}
+		}
+		
+		.top-Section-right {
+			display: flex;
+			align-items: center;
+			
+			.right-item {
+				display: flex;
+				align-items: center;
+				margin-left: 30rpx;
+				
+				.right-item-point {
+					width: 20rpx;
+					height: 20rpx;
+					border-radius: 50%;
+				}
+				
+				.right-item-title {
+					margin-left: 10rpx;
+					font-size: 24rpx;
+					font-family: Verdana, Verdana-Regular;
+					font-weight: 400;
+					text-align: right;
+					color: #546074;
+				}
+			}
+		}
+
+		.echarts {
+			width: 100%;
+			margin-top: 0;
+			height: 350rpx;
+		}
+	}
+</style>

+ 231 - 0
components/charts/firstAccessPieChart.vue

@@ -0,0 +1,231 @@
+<template>
+	<view class="content">
+		<!-- #ifdef APP-PLUS || H5 -->
+		<view @click="echarts.onClick" :prop="option" :change:prop="echarts.updateEcharts" ref="chartId" :id="chartId" class="echarts"></view>
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+	import echarts from '../../static/echarts.js'
+	let app = getApp();
+
+	export default {
+		props: {
+			chartId: String,
+			dataList: {
+				type: Array,
+				default: () => {
+					return []
+				}
+			}
+		},
+		data() {
+			return {
+				data1: [],
+				themeColor: null,
+				fuzhuColor: null,
+				themeColor50: null,
+				themeColor25: null,
+				fuzhuColor50: null,
+				fuzhuColor15: null,
+				option: {
+					tooltip: {
+						trigger: 'item',
+						// formatter: '{a} <br/>{b} : {c} ({d}%)'
+						// formatter: '{a} {b} :({d}%)'
+						// trigger: 'item',
+						align: 'auto'
+					},
+					color: [],
+					series: {
+						name: '',
+						type: 'pie',
+						radius: ['52%', '70%'],
+						center: ['50%', '50%'],
+						data: [],
+						itemStyle: {
+							normal: {
+								// color: function(e) {
+								// 	var colorList = [this.themeColor, this.fuzhuColor, this.themeColor25, this.themeColor50]
+								// 	return colorList[e.dataIndex]
+								// },
+								label: {
+									// formatter: function(e) {
+									// 	return "" + e.name + "\n\n{d|" + e.des + "}"
+									// },
+									formatter: null,
+									rich: {
+										d: {
+											fontSize: 14,
+											color: "#000000"
+										}
+									}
+								}
+							},
+							emphasis: {
+								itemStyle: {
+									shadowBlur: 10,
+									shadowOffsetX: 0,
+									shadowColor: 'rgba(0, 0, 0, 0.0)'
+								}
+							}
+						}
+						// emphasis: {
+						// 	itemStyle: {
+						// 		shadowBlur: 10,
+						// 		shadowOffsetX: 0,
+						// 		shadowColor: 'rgba(0, 0, 0, 0.5)'
+						// 	}
+						// }
+					}
+				},
+
+
+			}
+		},
+
+		mounted() {
+			this.themeColor = app.globalData.themeColor
+			this.themeColor50 = app.globalData.themeColor50
+			this.themeColor25 = app.globalData.themeColor25
+			this.fuzhuColor = app.globalData.fuzhuColor
+			this.fuzhuColor50 = app.globalData.fuzhuColor50
+			this.fuzhuColor15 = app.globalData.fuzhuColor15
+
+			this.getDataAction()
+		},
+
+		methods: {
+			getDataAction() {
+
+				// this.dataList = [{
+				// 		name: '户型',
+				// 		value: 460,
+				// 		color: this.themeColor
+				// 	},
+				// 	{
+				// 		name: '周边配置',
+				// 		value: 280,
+				// 		color: this.fuzhuColor
+				// 	},
+				// 	{
+				// 		name: '智能化',
+				// 		value: 120,
+				// 		color: this.themeColor25
+				// 	},
+				// 	{
+				// 		name: '面积',
+				// 		value: 210,
+				// 		color: this.themeColor50
+				// 	}
+				// ]
+
+				this.data1 = this.dataList || []
+				this.option.series.itemStyle.normal.color = null
+
+				this.data1.forEach((item, index) => {
+					item['color'] = ''
+					item.name = item.name + item.des
+					if (index == 0) {
+						item.color = this.themeColor
+					} else if (index == 1) {
+						item.color = this.fuzhuColor
+					} else if (index == 2) {
+						item.color = this.themeColor50
+					} else {
+						item.color = this.themeColor25
+					}
+				})
+				var tempData = this.data1
+				var self = this
+				this.option.series.data = tempData
+				this.option.color = [this.themeColor, this.fuzhuColor, this.themeColor50, this.themeColor25]
+				// this.option.series.itemStyle.normal.color = function(e) {
+				// 	// console.log('color打印:', self.data1[e.dataIndex].color)
+				// 	return self.data1[e.dataIndex].color
+				// }
+				// uni.showModal({
+				// 	content: JSON.stringify(this.data1)
+				// })
+				// this.option.series.itemStyle.normal.label.formatter = function(e) {
+				// 	// console.log('e:', e)
+				// 	var obj = self.data1[e.dataIndex]
+				// 	return "" + obj.name + "\n\n{d|" + (obj.value).toFixed(2) + "}"
+				// }
+				// this.chengjiaoNum = this.dataInfo.dealRateScore
+				// this.yixiangNum = this.dataInfo.yxScore
+				// this.bakongNum = this.dataInfo.bkScore
+				// this.option.series[0].data[0].value = [this.chengjiaoNum, this.yixiangNum, this.bakongNum]
+				// console.log('决策要素数据刷新', this.data1)
+			},
+			onViewClick(options) {
+				// console.log(options)
+			}
+		},
+		watch: {
+			chartId: {
+				handler(e) {
+					// this.getDataAction()
+				},
+				immediate: true
+			}
+		}
+
+	}
+</script>
+
+<script module="echarts" lang="renderjs">
+	let myChart
+	export default {
+		mounted() {
+			this.initAction()
+		},
+		methods: {
+			initAction() {
+				if (typeof window.echarts === 'function') {
+					this.initEcharts()
+				} else {
+					// 动态引入较大类库避免影响页面展示
+					const script = document.createElement('script')
+					// view 层的页面运行在 www 根目录,其相对路径相对于 www 计算
+					script.src = 'static/echarts.js'
+					script.onload = this.initEcharts.bind(this)
+					document.head.appendChild(script)
+				}
+			},
+			initEcharts() {
+				// console.log("initEcharts -> this.$refs", this.$refs.chartId.$el.id)
+				myChart = echarts.init(document.getElementById(this.$refs.chartId.$el.id))
+				// 观测更新的数据在 view 层可以直接访问到
+				if (myChart) myChart.setOption(this.option)
+			},
+			updateEcharts(newValue, oldValue, ownerInstance, instance) {
+				// 监听 service 层数据变更
+				if (myChart) myChart.setOption(newValue)
+			},
+			onClick(event, ownerInstance) {
+				// 调用 service 层的方法
+				ownerInstance.callMethod('onViewClick', {
+					test: 'test'
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.content {
+		width: 100%;
+		height: 100%;
+		position: relative;
+		font-size: 60rpx;
+		font-family: DIN Alternate;
+		font-weight: bold;
+
+		.echarts {
+			width: 100%;
+			height: 100%;
+		}
+	}
+</style>

+ 226 - 0
components/charts/hengxiang.vue

@@ -0,0 +1,226 @@
+<template>
+	<view class="content">
+		<view @click="echarts.onClick" :prop="option" :change:prop="echarts.updateEcharts" ref="chartId" :id="chartId" class="echarts"></view>
+		<view style="display: flex;justify-content: space-between; position: absolute;bottom: 20rpx; width: 542rpx; border-top:1rpx solid rgba(200,202,210,0.3); margin-left: 135rpx;">
+			<text style="font-size: 18rpx;font-family: Verdana, Verdana-Regular;font-weight: 400;text-align: right;color: #868da4;">冷</text>
+			<text style="font-size: 18rpx;font-family: Verdana, Verdana-Regular;font-weight: 400;text-align: right;color: #868da4;">热</text>
+		</view>
+	</view>
+</template>
+
+<script>
+	import echarts from '../../static/echarts.js'
+	export default {
+		props: {
+			chartId: String,
+			title: {
+				type: String,
+				default: '总访客量'
+			},
+			rightTitle: {
+				type: String,
+				default: '占比'
+			},
+			dataList: {
+				type: Array,
+				default:() => {
+					return []
+				}
+			}
+		},
+		data() {
+			return {
+				dateArray: [],
+				data1: [],
+				themeColor: "",
+				themeColor25: "",
+				option: {
+					grid: {
+						left: '3%',
+						right: '4%',
+						bottom: '3%',
+						top: '3%',
+						containLabel: true
+					},
+					xAxis: {
+						type: 'value',
+						show: false
+					},
+
+					yAxis: {
+						type: 'category',
+						data: [],
+						axisLabel: {
+							textStyle: {
+								color: '#666666',
+								fontStyle: 'normal',
+								fontFamily: '微软雅黑',
+								fontSize: 12,
+							}
+						},
+						axisTick: {
+							show: false
+						},
+						axisLine: { //坐标轴轴线相关设置
+							lineStyle: {
+								color: '#C8CAD2',
+								opacity: 0.2,
+							}
+						},
+					},
+					series: [{
+						type: 'bar',
+						data: [],
+						barWidth: 12,
+						itemStyle: {
+							// color: '#56CBCB'
+							color: new echarts.graphic.LinearGradient(1, 0, 0, 0, [{
+								offset: 0,
+								color: "#3CD9D9"
+							}, {
+								offset: 1,
+								color: '#CEF6F6'
+							}])
+						}
+					}]
+				}
+
+			}
+		},
+
+		methods: {
+			getDataAction() {
+				// this.dataList = []
+				// this.data1 = []
+				// for (var i = 0; i < 3; i++) {
+				// 	var num1 = Math.ceil(Math.random() * 50)
+				// 	this.data1.push(num1)
+				// 	this.dataList.push(num1)
+				// }
+				
+				this.data1 = []
+				this.dateArray = []
+				var self = this
+				this.dataList.forEach((item, index) => {
+					self.data1.push(item.count)
+					self.dateArray.push(item.title)
+				})
+				
+				this.option.series[0].data = this.data1.length > 6 ? this.data1.slice(0, 6) : this.data1
+				this.option.yAxis.data = this.dateArray.length > 6 ? this.dateArray.slice(0, 6) : this.dateArray
+				// console.log('关注项目数据刷新', this.option)
+			},
+			onViewClick(options) {
+				// console.log(options)
+			}
+		},
+		watch: {
+			// chartId: {
+			// 	handler(e) {
+			// 		// console.log('走没走!!!!', e)
+			// 		this.getDataAction()
+			// 	},
+			// 	immediate: true
+			// },
+			dataList: {
+				handler(e) {
+					this.getDataAction()
+				},
+				immediate: true
+			}
+		},
+		mounted() {
+			let app = getApp()
+			let globalData = app.globalData;
+			this.themeColor = globalData.themeColor
+			this.themeColor25 = globalData.themeColor25
+			let that = this;
+			this.option.series[0].itemStyle.color = new echarts.graphic.LinearGradient(1, 0, 0, 0, [{
+				offset: 0,
+				color: that.themeColor
+			}, {
+				offset: 1,
+				color: that.themeColor25
+			}])
+		}
+
+	}
+</script>
+
+<script module="echarts" lang="renderjs">
+	let myChart
+	export default {
+		mounted() {
+			this.initAction()
+		},
+		methods: {
+			initAction() {
+				if (typeof window.echarts === 'function') {
+					this.initEcharts()
+				} else {
+					// 动态引入较大类库避免影响页面展示
+					const script = document.createElement('script')
+					// view 层的页面运行在 www 根目录,其相对路径相对于 www 计算
+					script.src = 'static/echarts.js'
+					script.onload = this.initEcharts.bind(this)
+					document.head.appendChild(script)
+				}
+			},
+			initEcharts() {
+				// console.log("initEcharts -> this.$refs", this.$refs.chartId.$el.id)
+				myChart = echarts.init(document.getElementById(this.$refs.chartId.$el.id))
+				// 观测更新的数据在 view 层可以直接访问到
+				if (myChart) {
+					myChart.setOption(this.option)
+				}
+		
+			},
+			updateEcharts(newValue, oldValue, ownerInstance, instance) {
+				// 监听 service 层数据变更
+				if (myChart) {
+				  	myChart.setOption(newValue)	
+				}
+			},
+			onClick(event, ownerInstance) {
+				// 调用 service 层的方法
+				ownerInstance.callMethod('onViewClick', {
+					test: 'test'
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.content {
+		width: 100%;
+		height: 100%;
+		position: relative;
+
+		.top-Section {
+			padding: 0 20rpx;
+			display: flex;
+			flex-direction: row;
+			justify-content: space-between;
+			font-family: Verdana;
+
+			.title {
+				font-size: 32rpx;
+				font-weight: bold;
+				color: #383838;
+			}
+
+			.rightBtn {
+				font-size: 24rpx;
+				color: #546074;
+				margin-top: 5rpx;
+			}
+		}
+
+		.echarts {
+			width: 100%;
+			margin-top: 0;
+			height: 400rpx;
+		}
+	}
+</style>

+ 225 - 0
components/charts/homeChartItem.vue

@@ -0,0 +1,225 @@
+<template>
+	<view class="content">
+		<!-- #ifdef APP-PLUS || H5 -->
+		<view class="title" 
+		:style="`background-color: ${isYellow ? fuzhuColor50 : themeColor25};`">
+			{{title}}
+		</view>
+		<view class="count">
+			{{count}}
+		</view>
+		<!-- <view @click="echarts.onClick" :prop="option" :change:prop="echarts.updateEcharts" ref="chartId" :id="chartId" class="echarts"></view> -->
+		<view :prop="option" :change:prop="echarts.updateEcharts" ref="chartId" :id="chartId" class="echarts" v-show="fuzhuColor50!=null && dataList.length > 0"></view>
+		<!-- #endif -->
+		<!-- #ifndef APP-PLUS || H5 -->
+		<view>非 APP、H5 环境不支持</view>
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+	import echarts from '../../static/echarts.js'
+	
+	export default {
+		props: {
+			chartId: String,
+			title: String,
+			count: Number,
+			dataList: Array,
+			// dataList: {
+			// 	type: Array,
+			// 	default:()=> {
+			// 		return [1, 2, 1, 1]
+			// 	}
+			// },
+			isYellow: Boolean,
+			themeColor25: String,
+			fuzhuColor50: String,
+		},
+		data() {
+			return {
+				option: {
+					xAxis: {
+						show: false,
+						type: 'category',
+						// boundaryGap: false
+						boundaryGap: ['20%', '20%']
+					},
+					yAxis: {
+						show: false,
+						type: 'value',
+						boundaryGap: ['70%', '70%']
+						// boundaryGap: false
+					},
+					series: [
+						{
+							type: 'line',
+							smooth: 0.5,
+							symbol: 'none',
+							lineStyle: {
+								color: null,
+								// opacity: 0.6,
+								width: 3
+							},
+							data: []
+						}
+					]
+				}
+			}
+		},
+		
+		created() {
+			// this.option.series[0].data = []
+		},
+		
+		methods: {
+			getDataAction() {
+				this.option.series[0].data = this.dataList
+				// // console.log('图表数据打印:', this.chartId, this.dataList)
+				this.option.series[0].lineStyle.color = this.isYellow ? this.fuzhuColor50 : this.themeColor25
+				// // console.log('数据刷新', this.option.series)
+			},
+			clickAction() {
+				// // console.log("clickAction -> this.pageName", this.pageName)
+				this.$emit('homeChartItemAction', this.title)
+			},
+			changeOption() {
+				const data = this.option.series[0].data
+				// 随机更新示例数据
+				data.forEach((item, index) => {
+					data.splice(index, 1, Math.random() * 40)
+				})
+			},
+			onViewClick(options) {
+				// console.log(options)
+			}
+		},
+		watch: {
+			chartId: {
+				handler(e1, e2) {
+					if (e1 != e2) {
+						this.getDataAction()
+					}
+				},
+				immediate: true
+			},
+			dataList: {
+				handler(e1, e2) {
+					var e1Str = JSON.stringify(e1)
+					var e2Str = JSON.stringify(e2)
+					if (e1Str && e1Str != e2Str) {
+						this.getDataAction()
+					}
+				},
+				deep: true,
+				immediate: true
+			},
+			themeColor25: {
+				handler(e) {
+					if (e) {
+						this.option.series[0].lineStyle.color = this.isYellow ? this.fuzhuColor50 : this.themeColor25
+					}
+				},
+				immediate: true
+			}
+		}
+		
+	}
+</script>
+
+<script module="echarts" lang="renderjs">
+	let myChart
+	export default {
+		// props: {
+			// chartId: String
+		// },
+		created() {
+			this.initAction()
+		},
+		mounted() {
+			// this.initAction()
+		},
+		methods: {
+			initAction() {
+				if (typeof window.echarts === 'function') {
+					this.initEcharts()
+				} else {
+					// 动态引入较大类库避免影响页面展示
+					const script = document.createElement('script')
+					// view 层的页面运行在 www 根目录,其相对路径相对于 www 计算
+					script.src = 'static/echarts.js'
+					script.onload = this.initEcharts.bind(this)
+					document.head.appendChild(script)
+				}
+			},
+			initEcharts() {
+				// console.log("initEcharts -> this.$refs", this.$refs.chartId.$el.id)
+				if (document.getElementById(this.$refs.chartId.$el.id)) {
+					myChart = echarts.init(document.getElementById(this.$refs.chartId.$el.id))
+					// 观测更新的数据在 view 层可以直接访问到
+					if (myChart) {
+						myChart.setOption(this.option)
+					}
+					else {
+						// // console.log("无chart11111 -> this.$refs", this.$refs.chartId.$el.id)
+						this.initAction()
+					}
+				}
+			},
+			updateEcharts(newValue, oldValue, ownerInstance, instance) {
+				if (myChart) {
+					// 监听 service 层数据变更
+					myChart.setOption(newValue)
+				}
+				else {
+					// // console.log("无chart11111 -> this.$refs", this.$refs.chartId.$el.id)
+					this.initAction()
+				}
+			},
+			onClick(event, ownerInstance) {
+				// 调用 service 层的方法
+				ownerInstance.callMethod('onViewClick', {
+					test: 'test'
+				})
+			}
+		}
+	}
+</script>
+
+<style>
+	.content {
+		width: 100%;
+		height: 100%;
+	}
+	
+	.title {
+		font-size: 32rpx;
+		font-family: Verdana;
+		text-align: center;
+		width: 176rpx;
+		margin-left: calc((100% - 176rpx) / 2);
+		line-height: 46rpx;
+		/* background-color: #E1F4F4; */
+		color: rgba(0, 0, 0, 0.65);
+		margin-top: 28rpx;
+		margin-left: 20rpx;
+		border-radius: 8rpx;
+	}
+	
+	.count {
+		width: 100%;
+		margin-top: 24rpx;
+		height: 48rpx;
+		line-height: 48rpx;
+		text-align: center;
+		font-family: Verdana;
+		font-size: 40rpx;
+		color: rgba(32, 38, 56, 1);
+	}
+	
+	.echarts {
+		margin-top: 10rpx;
+		width: 100%;
+		height: 80rpx;
+	}
+</style>

+ 214 - 0
components/charts/mianji.vue

@@ -0,0 +1,214 @@
+<template>
+	<view style="width: 100%;display: flex;align-items: center;">
+		<view class="content">
+			<view @click="echarts.onClick" :prop="option" :change:prop="echarts.updateEcharts" ref="chartId" :id="chartId" class="echarts"></view>
+		</view>
+		<view>
+			<text style="font-size: 28rpx;font-family: Verdana, Verdana-Regular;font-weight: 400;text-align: left;color: #5f636f;">意向面积</text>
+			<view style="display: flex;justify-content: space-between;margin-top: 10rpx;">
+				<text style="font-size: 28rpx;font-family: Verdana, Verdana-Regular;font-weight: 400;text-align: left;" :style="{'color':fuzhuColor}" v-if="dataList.length > 0">{{dataList[0]}}m²</text>
+				<text style="font-size: 28rpx;font-family: Verdana, Verdana-Regular;font-weight: 400;text-align: left; margin-left: 82rpx;" v-if="dataList.length > 1">{{dataList[1]}}m²</text>
+				<text style="font-size: 28rpx;font-family: Verdana, Verdana-Regular;font-weight: 400;text-align: left; margin-left: 82rpx;" v-if="dataList.length > 2">{{dataList[2]}}m²</text>
+			</view>
+		</view>
+	</view>
+	
+</template>
+
+<script>
+	import echarts from '../../static/echarts.js'
+	var colorList = ['#FDD56A','#73ACFF','#73DDFF' ];
+	export default {
+		props: {
+			chartId: String,
+			title: {
+				type: String,
+				default: '面积'
+			},
+			dataList: {
+				type: Array,
+				default:() => {
+					return []
+				}
+			}
+		},
+		data() {
+			return {
+				themeColor: "",
+				fuzhuColor: "",
+				themeColor25: "",
+				option: {
+					title: {
+						text: '面积',
+						x: 'center',
+						y: 'center',
+						textStyle: {
+							fontSize: 10
+						}
+					},
+					color: colorList,
+					series: [{
+						name: '访问来源',
+						type: 'pie',
+						radius: ['50%', '70%'],
+						avoidLabelOverlap: false,
+						hoverAnimation: false,
+						label: {
+							show: false,
+							position: 'center'
+						},
+						itemStyle: {
+							normal: {
+								// color: function(params) {
+								// 	return colorList[params.dataIndex]
+								// }
+							}
+						},
+						emphasis: {
+							label: {
+								show: false,
+								fontSize: '30',
+								fontWeight: 'bold'
+							}
+						},
+						labelLine: {
+							show: false
+						},
+						data: []
+						// data: [{
+						// 		value: 335,
+						// 		name: '直接访问'
+						// 	},
+						// 	{
+						// 		value: 310,
+						// 		name: '邮件营销'
+						// 	},
+						// 	{
+						// 		value: 234,
+						// 		name: '联盟广告'
+						// 	}
+						// ]
+					}]
+				}
+			}
+		},
+
+		methods: {
+			getDataAction() {
+				// this.dataList = []
+				// this.data1 = []
+				// for (var i = 0; i < 3; i++) {
+				// 	var num1 = Math.ceil(Math.random() * 50)
+				// 	this.data1.push(num1)
+				// 	this.dataList.push(num1)
+				// }
+				this.option.series[0].data = this.dataList
+				// this.option.xAxis.data = this.dataList
+				// console.log('数据刷新面积', this.option.xAxis, this.dataList)
+			},
+			onViewClick(options) {
+				// console.log(options)
+			}
+		},
+		watch: {
+			chartId: {
+				handler(e) {
+					// console.log('走没走!!!!', e)
+					// this.getDataAction()
+				},
+				immediate: true
+			},
+			dataList: {
+				handler(e) {
+					this.getDataAction()
+				},
+				immediate: true
+			}
+		},
+		mounted() {
+			let app = getApp()
+			let globalData = app.globalData;
+			this.themeColor = globalData.themeColor
+			this.fuzhuColor = globalData.fuzhuColor
+			this.themeColor25 = globalData.themeColor25
+			let that = this;
+
+		}
+
+	}
+</script>
+
+<script module="echarts" lang="renderjs">
+	let myChart
+	export default {
+		mounted() {
+			this.initAction()
+		},
+		methods: {
+			initAction() {
+				if (typeof window.echarts === 'function') {
+					this.initEcharts()
+				} else {
+					// 动态引入较大类库避免影响页面展示
+					const script = document.createElement('script')
+					// view 层的页面运行在 www 根目录,其相对路径相对于 www 计算
+					script.src = 'static/echarts.js'
+					script.onload = this.initEcharts.bind(this)
+					document.head.appendChild(script)
+				}
+			},
+			initEcharts() {
+				// console.log("initEcharts -> this.$refs", this.$refs.chartId.$el.id)
+				myChart = echarts.init(document.getElementById(this.$refs.chartId.$el.id))
+				// 观测更新的数据在 view 层可以直接访问到
+				if(myChart){
+					myChart.setOption(this.option)
+				}
+			},
+			updateEcharts(newValue, oldValue, ownerInstance, instance) {
+				// 监听 service 层数据变更
+				if(myChart){
+					myChart.setOption(newValue)
+				}
+				
+			},
+			onClick(event, ownerInstance) {
+				// 调用 service 层的方法
+				ownerInstance.callMethod('onViewClick', {
+					test: 'test'
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.content {
+	    
+		.top-Section {
+			padding: 0 20rpx;
+			display: flex;
+			flex-direction: row;
+			justify-content: space-between;
+			font-family: Verdana;
+
+			.title {
+				font-size: 32rpx;
+				font-weight: bold;
+				color: #383838;
+			}
+
+			.rightBtn {
+				font-size: 24rpx;
+				color: #546074;
+				margin-top: 5rpx;
+			}
+		}
+
+		.echarts {
+			width: 214rpx;
+			margin-top: 0;
+			height: 200rpx;
+		}
+	}
+</style>

+ 210 - 0
components/charts/totlePrice.vue

@@ -0,0 +1,210 @@
+<template>
+	<view class="content">
+		<view style="width: 100%;display: flex;align-items: center;">
+			<view class="content">
+				<view @click="echarts.onClick" :prop="option" :change:prop="echarts.updateEcharts" ref="chartId" :id="chartId" class="echarts"></view>
+			</view>
+			<view>
+				<text style="font-size: 28rpx;font-family: Verdana, Verdana-Regular;font-weight: 400;text-align: left;color: #5f636f;">意向总价</text>
+				<view style="display: flex;justify-content: space-between;margin-top: 10rpx;">
+					<text style="font-size: 28rpx;font-family: Verdana, Verdana-Regular;font-weight: 400;text-align: left;" :style="{'color':fuzhuColor}" v-if="dataList.length > 0">约{{dataList[0]}}万</text>
+					<text style="font-size: 28rpx;font-family: Verdana, Verdana-Regular;font-weight: 400;text-align: left; margin-left: 82rpx;" v-if="dataList.length > 1">约{{dataList[1]}}万</text>
+					<text style="font-size: 28rpx;font-family: Verdana, Verdana-Regular;font-weight: 400;text-align: left; margin-left: 82rpx;" v-if="dataList.length > 2">约{{dataList[2]}}万</text>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import echarts from '../../static/echarts.js'
+	var colorList = ['#73DDFF', '#73ACFF', '#FDD56A'];
+	export default {
+		props: {
+			chartId: String,
+			title: {
+				type: String,
+				default: '面积'
+			},
+			dataList: {
+				type: Array,
+				default:() => {
+					return []
+				}
+			}
+		},
+		data() {
+			return {
+				themeColor: "",
+				fuzhuColor: "",
+				themeColor25: "",
+				option: {
+					title: {
+						text: '总价',
+						x: 'center',
+						y: 'center',
+						textStyle: {
+							fontSize: 10
+						}
+					},
+					color: colorList,
+					series: [{
+						name: '访问来源',
+						type: 'pie',
+						radius: ['50%', '70%'],
+						avoidLabelOverlap: false,
+						hoverAnimation: false,
+						label: {
+							show: false,
+							position: 'center'
+						},
+						itemStyle: {
+							normal: {
+								// color: function(params) {
+								// 	return colorList[params.dataIndex]
+								// }
+							}
+						},
+						emphasis: {
+							label: {
+								show: false,
+								fontSize: '30',
+								fontWeight: 'bold'
+							}
+						},
+						labelLine: {
+							show: false
+						},
+						data: []
+						// data: [{
+						// 		value: 335,
+						// 		name: '直接访问'
+						// 	},
+						// 	{
+						// 		value: 310,
+						// 		name: '邮件营销'
+						// 	},
+						// 	{
+						// 		value: 234,
+						// 		name: '联盟广告'
+						// 	}
+						// ]
+					}]
+				}
+			}
+		},
+
+		methods: {
+			getDataAction() {
+				// this.dataList = []
+				// this.data1 = []
+				// for (var i = 0; i < 3; i++) {
+				// 	var num1 = Math.ceil(Math.random() * 50)
+				// 	this.data1.push(num1)
+				// 	this.dataList.push(num1)
+				// }
+				this.option.series[0].data = this.dataList
+				// this.option.xAxis.data = this.dataList
+				// console.log('总价数据刷新', this.option)
+			},
+			onViewClick(options) {
+				// console.log(options)
+			}
+		},
+		watch: {
+			chartId: {
+				handler(e) {
+					// console.log('走没走!!!!', e)
+					// this.getDataAction()
+				},
+				immediate: true
+			},
+			dataList: {
+				handler(e) {
+					this.getDataAction()
+				},
+				immediate: true,
+				deep: true
+			}
+		},
+		mounted() {
+			let app = getApp()
+			let globalData = app.globalData;
+			this.themeColor = globalData.themeColor
+			this.fuzhuColor = globalData.fuzhuColor
+			this.themeColor25 = globalData.themeColor25
+			let that = this;
+
+		}
+
+	}
+</script>
+
+<script module="echarts" lang="renderjs">
+	let myChart
+	export default {
+		mounted() {
+			this.initAction()
+		},
+		methods: {
+			initAction() {
+				if (typeof window.echarts === 'function') {
+					this.initEcharts()
+				} else {
+					// 动态引入较大类库避免影响页面展示
+					const script = document.createElement('script')
+					// view 层的页面运行在 www 根目录,其相对路径相对于 www 计算
+					script.src = 'static/echarts.js'
+					script.onload = this.initEcharts.bind(this)
+					document.head.appendChild(script)
+				}
+			},
+			initEcharts() {
+				// console.log("initEcharts -> this.$refs", this.$refs.chartId.$el.id)
+				myChart = echarts.init(document.getElementById(this.$refs.chartId.$el.id))
+				// 观测更新的数据在 view 层可以直接访问到
+				myChart.setOption(this.option)
+			},
+			updateEcharts(newValue, oldValue, ownerInstance, instance) {
+				// 监听 service 层数据变更
+				myChart.setOption(newValue)
+			},
+			onClick(event, ownerInstance) {
+				// 调用 service 层的方法
+				ownerInstance.callMethod('onViewClick', {
+					test: 'test'
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.content {
+		.top-Section {
+			padding: 0 20rpx;
+			display: flex;
+			flex-direction: row;
+			justify-content: space-between;
+			font-family: Verdana;
+
+			.title {
+				font-size: 32rpx;
+				font-weight: bold;
+				color: #383838;
+			}
+
+			.rightBtn {
+				font-size: 24rpx;
+				color: #546074;
+				margin-top: 5rpx;
+			}
+		}
+
+		.echarts {
+			width: 214rpx;
+			margin-top: 0;
+			height: 200rpx;
+		}
+	}
+</style>

+ 249 - 0
components/charts/xingweitongji.vue

@@ -0,0 +1,249 @@
+<template>
+	<view class="content">
+		
+		<view @click="echarts.onClick" :prop="option" :change:prop="echarts.updateEcharts" ref="chartId" :id="chartId" class="echarts"></view>
+		<view style="display: flex;justify-content: space-between; position: absolute;bottom: 30rpx; width: 542rpx; margin-left: 135rpx;align-items: center;">
+			<text style="font-size: 18rpx;font-family: Verdana, Verdana-Regular;font-weight: 400;text-align: right;color: #868da4;">0</text>
+			<view style="border-top:1rpx solid rgba(200,202,210,1);width: 490rpx;"></view>
+			<text style="font-size: 18rpx;font-family: Verdana, Verdana-Regular;font-weight: 400;text-align: right;color: #868da4;">100</text>
+		</view>
+	</view>
+</template>
+
+<script>
+	import echarts from '../../static/echarts.js'
+	export default {
+		props: {
+			chartId: String,
+			title: {
+				type: String,
+				default: '总访客量'
+			},
+			rightTitle: {
+				type: String,
+				default: '占比'
+			},
+			dataList: {
+				type: Array,
+				default: () => {
+					return []
+				}
+			}
+		},
+		data() {
+			return {
+				dateArray: [],
+				data1: [],
+				themeColor: "",
+				themeColor25: "",
+				option: {
+					tooltip: {
+						show:false
+					},
+					grid: {
+						left: '3%',
+						right: '15%',
+						bottom: '3%',
+						top: '3%',
+						containLabel: true
+					},
+					xAxis: {
+						type: 'value',
+						show: false,
+						dataMax:100,
+					},
+
+					yAxis: {
+						type: 'category',
+						data: [],
+						axisLabel: {
+							textStyle: {
+								color: '#666666',
+								fontStyle: 'normal',
+								fontFamily: '微软雅黑',
+								fontSize: 12,
+							}
+						},
+						axisTick: {
+							show: false
+						},
+						axisLine: { //坐标轴轴线相关设置
+						    show: false
+						},
+					},
+					series: [{
+						type: 'bar',
+						data: [],
+						barWidth: 12,
+						itemStyle: {
+							// color: '#56CBCB'
+							normal:{
+								label: {
+									show: true, //开启显示
+									position: 'right', //在上方显示
+									textStyle: { //数值样式
+										color: '#202638',
+										fontSize: 14,
+										family: 'Verdana'
+									},
+									 backgroundColor:'#CEF6F6',
+									 padding: [5, 15, 3,15],
+									 borderRadius:5,
+									 verticalAlign: 'middle',
+									
+								},
+								color: new echarts.graphic.LinearGradient(1, 0, 0, 0, [{
+									offset: 0,
+									color: "#3CD9D9"
+								}, {
+									offset: 1,
+									color: '#CEF6F6'
+								}]),
+								
+							},
+							
+						},
+
+					}]
+				}
+
+			}
+		},
+
+		methods: {
+			getDataAction() {
+				// this.dataList = []
+				// this.data1 = []
+				// for (var i = 0; i < 6; i++) {
+				// 	var num1 = Math.ceil(Math.random() * 50)
+				// 	this.data1.push(num1)
+				// 	this.dataList.push(num1)
+				// }
+				this.data1 = []
+				this.dateArray = []
+				this.option.series[0].data = this.data1
+				this.option.yAxis.data = this.dateArray
+				var self = this
+				this.dataList.forEach((item, index) => {
+					self.data1.push(item.count)
+					self.dateArray.push(item.title)
+				})
+				this.option.series[0].data = this.data1
+				this.option.yAxis.data = this.dateArray
+				// console.log('行为统计数据刷新', this.option.series)
+			},
+			onViewClick(options) {
+				// console.log(options)
+			}
+		},
+		watch: {
+			chartId: {
+				handler(e) {
+					// console.log('走没走!!!!', e)
+					// this.getDataAction()
+				},
+				immediate: true
+			},
+			dataList: {
+				handler(e) {
+					this.getDataAction()
+				},
+				immediate: true,
+				deep: true
+			}
+		},
+		mounted() {
+			let app = getApp()
+			let globalData = app.globalData;
+			this.themeColor = globalData.themeColor
+			this.themeColor25 = globalData.themeColor25
+			let that = this;
+			this.option.series[0].itemStyle.normal.label.backgroundColor = that.themeColor25
+			this.option.series[0].itemStyle.normal.color = new echarts.graphic.LinearGradient(1, 0, 0, 0, [{
+				offset: 0,
+				color: that.themeColor
+			}, {
+				offset: 1,
+				color: that.themeColor25
+			}])
+		}
+
+	}
+</script>
+
+<script module="echarts" lang="renderjs">
+	let myChart
+	export default {
+		mounted() {
+			this.initAction()
+		},
+		methods: {
+			initAction() {
+				if (typeof window.echarts === 'function') {
+					this.initEcharts()
+				} else {
+					// 动态引入较大类库避免影响页面展示
+					const script = document.createElement('script')
+					// view 层的页面运行在 www 根目录,其相对路径相对于 www 计算
+					script.src = 'static/echarts.js'
+					script.onload = this.initEcharts.bind(this)
+					document.head.appendChild(script)
+				}
+			},
+			initEcharts() {
+				// console.log("initEcharts -> this.$refs", this.$refs.chartId.$el.id)
+				myChart = echarts.init(document.getElementById(this.$refs.chartId.$el.id))
+				// 观测更新的数据在 view 层可以直接访问到
+				if (myChart) {
+					myChart.setOption(this.option)
+				}
+			},
+			updateEcharts(newValue, oldValue, ownerInstance, instance) {
+				// 监听 service 层数据变更
+				if (myChart) {
+					myChart.setOption(newValue)
+				}
+			},
+			onClick(event, ownerInstance) {
+				// 调用 service 层的方法
+				ownerInstance.callMethod('onViewClick', {
+					test: 'test'
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.content {
+		width: 100%;
+		height: 100%;
+		position: relative;
+
+		.top-Section {
+			padding: 0 20rpx;
+			display: flex;
+			flex-direction: row;
+			justify-content: space-between;
+			font-family: Verdana;
+
+			.title {
+				font-size: 32rpx;
+				font-weight: bold;
+				color: #383838;
+			}
+
+			.rightBtn {
+				font-size: 24rpx;
+				color: #546074;
+				margin-top: 5rpx;
+			}
+		}
+
+		.echarts {
+			width: 100%;
+			margin-top: 0;
+			height: 500rpx;
+		}
+	}
+</style>

+ 266 - 0
components/charts/yipankeChart.vue

@@ -0,0 +1,266 @@
+<template>
+	<view class="content">
+		<!-- #ifdef APP-PLUS || H5 -->
+		<view @click="echarts.onClick" :prop="option" :change:prop="echarts.updateEcharts" ref="chartId" :id="chartId" class="echarts"></view>
+		<view class="chengjiaoLab">
+			<view class="name">{{dataInfo.dealRate}}</view>
+			<view class="valueDes">意向度</view>
+		</view>
+		<view class="yixiangLab" @click="desClickAction('left')">
+			<view class="name" style="min-height: 70rpx;">
+				{{dataInfo.yxLevel}}
+			</view>
+			<view class="valueDes">意向度</view>
+			<view class="icon" v-if="isShowIcon">?</view>
+		</view>
+		<view class="bakongLab" @click="desClickAction('right')">
+			<view class="name" style="min-height: 70rpx;">
+				{{bakongNum}}
+			</view>
+			<view class="valueDes">把控值</view>
+			<view class="icon" v-if="isShowIcon">?</view>
+		</view>
+		<!-- #endif -->
+	</view>
+</template>
+
+<script>
+	import echarts from '../../static/echarts.js'
+	export default {
+		props: {
+			chartId: String,
+			dataInfo: null,
+			isShowIcon: {
+				type: Boolean,
+				default: () => {
+					return false
+				}
+			}
+		},
+		data() {
+			return {
+				chengjiaoNum: 0,
+				yixiangNum: 0,
+				bakongNum: 0,
+				option: {
+					radar: [{
+						indicator: [{
+								name: '成交几率',
+								max: 100,
+								min: 0
+							},
+							{
+								name: '意向度',
+								max: 100,
+								min: 0
+							},
+							{
+								name: '把控值',
+								max: 100,
+								min: 0
+							}
+						],
+						center: ['50%', '57%'],
+						radius: 110,
+						startAngle: 90,
+						splitNumber: 4,
+						shape: 'circle',
+						// name: {
+						// 	formatter: '{value}',
+						// 	textStyle: {
+						// 		color: '#606060',
+						// 		opacity: 0.7
+						// 	}
+						// },
+						splitArea: {
+							areaStyle: {
+								// color: ['rgba(114, 172, 209, 0.2)',
+								//     'rgba(114, 172, 209, 0.4)', 'rgba(114, 172, 209, 0.6)',
+								//     'rgba(114, 172, 209, 0.8)', 'rgba(114, 172, 209, 1)'],
+								color: [
+									'rgba(254,195,80,0.5)',
+									'rgba(254,195,80,0.4)',
+									'rgba(254,195,80,0.3)',
+									'rgba(254,195,80,0.2)',
+									'rgba(254,195,80,0.1)'
+								],
+								shadowColor: 'rgba(0, 0, 0, 0)',
+								// shadowBlur: 10
+							}
+						},
+						axisLine: {
+							lineStyle: {
+								color: 'rgba(255, 255, 255, 0.5)'
+							}
+						},
+						splitLine: {
+							lineStyle: {
+								color: 'rgba(255, 255, 255, 0.5)'
+							}
+						}
+					}],
+					series: [{
+						name: '雷达图',
+						type: 'radar',
+						emphasis: {
+							lineStyle: {
+								width: 4
+							}
+						},
+						data: [{
+							value: [],
+							name: '图一',
+							symbol: 'circle',
+							symbolSize: 6,
+							itemStyle: {
+								color: '#fff',
+								borderWidth: 2,
+								borderColor: '#202638'
+							},
+							lineStyle: {
+								type: 'solid',
+								color: '#202638'
+							},
+							areaStyle: {
+								color: 'rgba(255, 255, 255, 0.7)'
+							}
+						}]
+					}]
+				}
+			}
+		},
+
+		methods: {
+			getDataAction() {
+				this.chengjiaoNum = this.dataInfo.dealRateScore
+				this.yixiangNum = this.dataInfo.yxScore
+				this.bakongNum = this.dataInfo.bkScore
+				// this.chengjiaoNum = Math.ceil(Math.random() * 100)
+				// this.yixiangNum = Math.ceil(Math.random() * 100)
+				// this.bakongNum = Math.ceil(Math.random() * 100)
+				this.option.series[0].data[0].value = [this.chengjiaoNum, this.yixiangNum, this.bakongNum]
+				// // console.log('数据刷新', this.option.series[0].data[0].value)
+			},
+
+			desClickAction(e) {
+				this.$emit('desClickAction', e)
+			},
+
+			onViewClick(options) {
+				// console.log(options)
+			}
+		},
+		watch: {
+			chartId: {
+				handler(e) {
+					// // console.log('走没走!!!!', e)
+					this.getDataAction()
+				},
+				immediate: true
+			}
+		}
+
+	}
+</script>
+
+<script module="echarts" lang="renderjs">
+	let myChart
+	export default {
+		mounted() {
+			this.initAction()
+		},
+		methods: {
+			initAction() {
+				if (typeof window.echarts === 'function') {
+					this.initEcharts()
+				} else {
+					// 动态引入较大类库避免影响页面展示
+					const script = document.createElement('script')
+					// view 层的页面运行在 www 根目录,其相对路径相对于 www 计算
+					script.src = 'static/echarts.js'
+					script.onload = this.initEcharts.bind(this)
+					document.head.appendChild(script)
+				}
+			},
+			initEcharts() {
+				// console.log("initEcharts -> this.$refs", this.$refs.chartId.$el.id)
+				myChart = echarts.init(document.getElementById(this.$refs.chartId.$el.id))
+				// 观测更新的数据在 view 层可以直接访问到
+				myChart.setOption(this.option)
+			},
+			updateEcharts(newValue, oldValue, ownerInstance, instance) {
+				// 监听 service 层数据变更
+				myChart.setOption(newValue)
+			},
+			onClick(event, ownerInstance) {
+				// 调用 service 层的方法
+				ownerInstance.callMethod('onViewClick', {
+					test: 'test'
+				})
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.content {
+		width: 100%;
+		height: 100%;
+		position: relative;
+		font-size: 60rpx;
+		font-family: DIN Alternate;
+		font-weight: bold;
+
+		.chengjiaoLab {
+			position: absolute;
+			top: 80rpx;
+			left: 0;
+			width: 100%;
+			text-align: center;
+			color: #FFA74E;
+		}
+
+		.yixiangLab {
+			position: absolute;
+			color: #546074;
+			left: 55rpx;
+			top: 485rpx;
+			width: 80rpx;
+			text-align: center;
+		}
+
+		.bakongLab {
+			position: absolute;
+			color: #546074;
+			right: 55rpx;
+			top: 485rpx;
+			width: 80rpx;
+			text-align: center;
+		}
+
+		.valueDes {
+			color: rgba($color: #606060, $alpha: 0.7);
+			font-size: 20rpx;
+			text-align: center;
+		}
+
+		.icon {
+			margin-left: 27rpx;
+			margin-top: 35rpx;
+			width: 26rpx;
+			height: 26rpx;
+			border-radius: 13rpx;
+			font-size: 10rpx;
+			text-align: center;
+			line-height: 26rpx;
+			background-color: #FEC350;
+			color: #FFFFFF;
+		}
+
+		.echarts {
+			width: 100%;
+			margin-top: 100rpx;
+			height: 100%;
+		}
+	}
+</style>

+ 673 - 0
components/libs/calendar.js

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

+ 0 - 1
components/marked/index.js

@@ -1 +0,0 @@
-export default './lib/marked'

File diff suppressed because it is too large
+ 0 - 1573
components/marked/lib/marked.js


File diff suppressed because it is too large
+ 0 - 12542
components/mpvue-citypicker/city-data/area.js


File diff suppressed because it is too large
+ 0 - 1503
components/mpvue-citypicker/city-data/city.js


+ 0 - 139
components/mpvue-citypicker/city-data/province.js

@@ -1,139 +0,0 @@
-/* eslint-disable */
-var provinceData = [{
-    "label": "北京市",
-    "value": "11"
-  },
-  {
-    "label": "天津市",
-    "value": "12"
-  },
-  {
-    "label": "河北省",
-    "value": "13"
-  },
-  {
-    "label": "山西省",
-    "value": "14"
-  },
-  {
-    "label": "内蒙古自治区",
-    "value": "15"
-  },
-  {
-    "label": "辽宁省",
-    "value": "21"
-  },
-  {
-    "label": "吉林省",
-    "value": "22"
-  },
-  {
-    "label": "黑龙江省",
-    "value": "23"
-  },
-  {
-    "label": "上海市",
-    "value": "31"
-  },
-  {
-    "label": "江苏省",
-    "value": "32"
-  },
-  {
-    "label": "浙江省",
-    "value": "33"
-  },
-  {
-    "label": "安徽省",
-    "value": "34"
-  },
-  {
-    "label": "福建省",
-    "value": "35"
-  },
-  {
-    "label": "江西省",
-    "value": "36"
-  },
-  {
-    "label": "山东省",
-    "value": "37"
-  },
-  {
-    "label": "河南省",
-    "value": "41"
-  },
-  {
-    "label": "湖北省",
-    "value": "42"
-  },
-  {
-    "label": "湖南省",
-    "value": "43"
-  },
-  {
-    "label": "广东省",
-    "value": "44"
-  },
-  {
-    "label": "广西壮族自治区",
-    "value": "45"
-  },
-  {
-    "label": "海南省",
-    "value": "46"
-  },
-  {
-    "label": "重庆市",
-    "value": "50"
-  },
-  {
-    "label": "四川省",
-    "value": "51"
-  },
-  {
-    "label": "贵州省",
-    "value": "52"
-  },
-  {
-    "label": "云南省",
-    "value": "53"
-  },
-  {
-    "label": "西藏自治区",
-    "value": "54"
-  },
-  {
-    "label": "陕西省",
-    "value": "61"
-  },
-  {
-    "label": "甘肃省",
-    "value": "62"
-  },
-  {
-    "label": "青海省",
-    "value": "63"
-  },
-  {
-    "label": "宁夏回族自治区",
-    "value": "64"
-  },
-  {
-    "label": "新疆维吾尔自治区",
-    "value": "65"
-  },
-  {
-    "label": "台湾",
-    "value": "66"
-  },
-  {
-    "label": "香港",
-    "value": "67"
-  },
-  {
-    "label": "澳门",
-    "value": "68"
-  }
-]
-export default provinceData;

+ 0 - 230
components/mpvue-citypicker/mpvueCityPicker.vue

@@ -1,230 +0,0 @@
-<template>
-	<div class="mpvue-picker">
-		<div :class="{'pickerMask':showPicker}" @click="maskClick" catchtouchmove="true"></div>
-		<div class="mpvue-picker-content " :class="{'mpvue-picker-view-show':showPicker}">
-			<div class="mpvue-picker__hd" catchtouchmove="true">
-				<div class="mpvue-picker__action" @click="pickerCancel">取消</div>
-				<div class="mpvue-picker__action" :style="{color:themeColor}" @click="pickerConfirm">确定</div>
-			</div>
-			<picker-view indicator-style="height: 40px;" class="mpvue-picker-view" :value="pickerValue" @change="pickerChange">
-				<block>
-					<picker-view-column>
-						<div class="picker-item" v-for="(item,index) in provinceDataList" :key="index">{{item.label}}</div>
-					</picker-view-column>
-					<picker-view-column>
-						<div class="picker-item" v-for="(item,index) in cityDataList" :key="index">{{item.label}}</div>
-					</picker-view-column>
-					<picker-view-column>
-						<div class="picker-item" v-for="(item,index) in areaDataList" :key="index">{{item.label}}</div>
-					</picker-view-column>
-				</block>
-			</picker-view>
-		</div>
-	</div>
-</template>
-
-<script>
-	import provinceData from './city-data/province.js';
-	import cityData from './city-data/city.js';
-	import areaData from './city-data/area.js';
-	export default {
-		data() {
-			return {
-				pickerValue: [0, 0, 0],
-				provinceDataList: provinceData,
-				cityDataList: cityData[0],
-				areaDataList: areaData[0][0],
-				/* 是否显示控件 */
-				showPicker: false,
-			};
-		},
-		created() {
-			this.init()
-		},
-		props: {
-			/* 默认值 */
-			pickerValueDefault: {
-				type: Array,
-				default () {
-					return [0, 0, 0]
-				}
-			},
-			/* 主题色 */
-			themeColor: String
-		},
-		watch: {
-			pickerValueDefault() {
-				this.init();
-			}
-		},
-		methods: {
-			init() {
-				this.handPickValueDefault(); // 对 pickerValueDefault 做兼容处理
-
-				const pickerValueDefault = this.pickerValueDefault
-
-				this.cityDataList = cityData[pickerValueDefault[0]];
-				this.areaDataList = areaData[pickerValueDefault[0]][pickerValueDefault[1]];
-				this.pickerValue = pickerValueDefault;
-			},
-			show() {
-				setTimeout(() => {
-					this.showPicker = true;
-				}, 0);
-			},
-			maskClick() {
-				this.pickerCancel();
-			},
-			pickerCancel() {
-				this.showPicker = false;
-				this._$emit('onCancel');
-			},
-			pickerConfirm(e) {
-				this.showPicker = false;
-				this._$emit('onConfirm');
-			},
-			showPickerView() {
-				this.showPicker = true;
-			},
-			handPickValueDefault() {
-				const pickerValueDefault = this.pickerValueDefault
-
-				let provinceIndex = pickerValueDefault[0]
-				let cityIndex = pickerValueDefault[1]
-				const areaIndex = pickerValueDefault[2]
-				if (
-					provinceIndex !== 0 ||
-					cityIndex !== 0 ||
-					areaIndex !== 0
-				) {
-					if (provinceIndex > provinceData.length - 1) {
-						this.pickerValueDefault[0] = provinceIndex = provinceData.length - 1;
-					}
-					if (cityIndex > cityData[provinceIndex].length - 1) {
-						this.pickerValueDefault[1] = cityIndex = cityData[provinceIndex].length - 1;
-					}
-					if (areaIndex > areaData[provinceIndex][cityIndex].length - 1) {
-						this.pickerValueDefault[2] = areaData[provinceIndex][cityIndex].length - 1;
-					}
-				}
-			},
-			pickerChange(e) {
-				let changePickerValue = e.mp.detail.value;
-				if (this.pickerValue[0] !== changePickerValue[0]) {
-					// 第一级发生滚动
-					this.cityDataList = cityData[changePickerValue[0]];
-					this.areaDataList = areaData[changePickerValue[0]][0];
-					changePickerValue[1] = 0;
-					changePickerValue[2] = 0;
-				} else if (this.pickerValue[1] !== changePickerValue[1]) {
-					// 第二级滚动
-					this.areaDataList =
-						areaData[changePickerValue[0]][changePickerValue[1]];
-					changePickerValue[2] = 0;
-				}
-				this.pickerValue = changePickerValue;
-				this._$emit('onChange');
-			},
-			_$emit(emitName) {
-				let pickObj = {
-					label: this._getLabel(),
-					value: this.pickerValue,
-					cityCode: this._getCityCode()
-				};
-				this.$emit(emitName, pickObj);
-			},
-			_getLabel() {
-				let pcikerLabel =
-					this.provinceDataList[this.pickerValue[0]].label +
-					'-' +
-					this.cityDataList[this.pickerValue[1]].label +
-					'-' +
-					this.areaDataList[this.pickerValue[2]].label;
-				return pcikerLabel;
-			},
-			_getCityCode() {
-				return this.areaDataList[this.pickerValue[2]].value;
-			}
-		}
-	};
-</script>
-
-<style>
-	.pickerMask {
-		position: fixed;
-		z-index: 1000;
-		top: 0;
-		right: 0;
-		left: 0;
-		bottom: 0;
-		background: rgba(0, 0, 0, 0.6);
-	}
-
-	.mpvue-picker-content {
-		position: fixed;
-		bottom: 0;
-		left: 0;
-		width: 100%;
-		transition: all 0.3s ease;
-		transform: translateY(100%);
-		z-index: 3000;
-	}
-
-	.mpvue-picker-view-show {
-		transform: translateY(0);
-	}
-
-	.mpvue-picker__hd {
-		display: flex;
-		padding: 9px 15px;
-		background-color: #fff;
-		position: relative;
-		text-align: center;
-		font-size: 17px;
-	}
-
-	.mpvue-picker__hd:after {
-		content: ' ';
-		position: absolute;
-		left: 0;
-		bottom: 0;
-		right: 0;
-		height: 1px;
-		border-bottom: 1px solid #e5e5e5;
-		color: #e5e5e5;
-		transform-origin: 0 100%;
-		transform: scaleY(0.5);
-	}
-
-	.mpvue-picker__action {
-		display: block;
-		flex: 1;
-		color: #1aad19;
-	}
-
-	.mpvue-picker__action:first-child {
-		text-align: left;
-		color: #888;
-	}
-
-	.mpvue-picker__action:last-child {
-		text-align: right;
-	}
-
-	.picker-item {
-		text-align: center;
-		line-height: 40px;
-		text-overflow: ellipsis;
-		white-space: nowrap;
-		font-size: 16px;
-	}
-
-	.mpvue-picker-view {
-		position: relative;
-		bottom: 0;
-		left: 0;
-		width: 100%;
-		height: 238px;
-		background-color: rgba(255, 255, 255, 1);
-	}
-</style>

+ 0 - 123
components/mpvue-echarts/src/echarts.vue

@@ -1,123 +0,0 @@
-<template>
-	<canvas v-if="canvasId" class="ec-canvas" :id="canvasId" :canvasId="canvasId" @touchstart="touchStart" @touchmove="touchMove" @touchend="touchEnd" @error="error"></canvas>
-</template>
-
-<script>
-import WxCanvas from './wx-canvas';
-
-export default {
-	props: {
-		canvasId: {
-			type: String,
-			default: 'ec-canvas'
-		},
-		lazyLoad: {
-			type: Boolean,
-			default: false
-		},
-		disableTouch: {
-			type: Boolean,
-			default: false
-		},
-		throttleTouch: {
-			type: Boolean,
-			default: false
-		}
-	},
-	// #ifdef H5
-	mounted() {
-		if (!this.lazyLoad) this.init();
-	},
-	// #endif
-	// #ifndef H5
-	onReady() {
-		if (!this.lazyLoad) this.init();
-	},
-	// #endif
-	methods: {
-		setChart(chart){
-			this.chart = chart
-		},
-		init() {
-			const { canvasId } = this;
-			this.ctx = wx.createCanvasContext(canvasId, this);
-
-			this.canvas = new WxCanvas(this.ctx, canvasId);
-
-			const query = wx.createSelectorQuery().in(this);
-			query
-				.select(`#${canvasId}`)
-				.boundingClientRect(res => {
-					if (!res) {
-						setTimeout(() => this.init(), 50);
-						return;
-					}
-					this.$emit('onInit', {
-						width: res.width,
-						height: res.height
-					});
-				})
-				.exec();
-		},
-		canvasToTempFilePath(opt) {
-			const { canvasId } = this;
-			this.ctx.draw(true, () => {
-				wx.canvasToTempFilePath({
-					canvasId,
-					...opt
-				});
-			});
-		},
-		touchStart(e) {
-			const { disableTouch, chart } = this;
-			if (disableTouch || !chart || !e.mp.touches.length) return;
-			const touch = e.mp.touches[0];
-			chart._zr.handler.dispatch('mousedown', {
-				zrX: touch.x,
-				zrY: touch.y
-			});
-			chart._zr.handler.dispatch('mousemove', {
-				zrX: touch.x,
-				zrY: touch.y
-			});
-		},
-		touchMove(e) {
-			const { disableTouch, throttleTouch, chart, lastMoveTime } = this;
-			if (disableTouch || !chart || !e.mp.touches.length) return;
-
-			if (throttleTouch) {
-				const currMoveTime = Date.now();
-				if (currMoveTime - lastMoveTime < 240) return;
-				this.lastMoveTime = currMoveTime;
-			}
-
-			const touch = e.mp.touches[0];
-			chart._zr.handler.dispatch('mousemove', {
-				zrX: touch.x,
-				zrY: touch.y
-			});
-		},
-		touchEnd(e) {
-			const { disableTouch, chart } = this;
-			if (disableTouch || !chart) return;
-			const touch = e.mp.changedTouches ? e.mp.changedTouches[0] : {};
-			chart._zr.handler.dispatch('mouseup', {
-				zrX: touch.x,
-				zrY: touch.y
-			});
-			chart._zr.handler.dispatch('click', {
-				zrX: touch.x,
-				zrY: touch.y
-			});
-		}
-	}
-};
-</script>
-
-<style scoped>
-.ec-canvas {
-	width: 100%;
-	height: 100%;
-	flex: 1;
-}
-</style>

+ 0 - 73
components/mpvue-echarts/src/wx-canvas.js

@@ -1,73 +0,0 @@
-export default class WxCanvas {
-  constructor(ctx, canvasId) {
-    this.ctx = ctx;
-    this.canvasId = canvasId;
-    this.chart = null;
-
-    WxCanvas.initStyle(ctx);
-    this.initEvent();
-  }
-
-  getContext(contextType) {
-    return contextType === '2d' ? this.ctx : null;
-  }
-
-  setChart(chart) {
-    this.chart = chart;
-  }
-
-  attachEvent() {
-    // noop
-  }
-
-  detachEvent() {
-    // noop
-  }
-
-  static initStyle(ctx) {
-    const styles = ['fillStyle', 'strokeStyle', 'globalAlpha',
-      'textAlign', 'textBaseAlign', 'shadow', 'lineWidth',
-      'lineCap', 'lineJoin', 'lineDash', 'miterLimit', 'fontSize'];
-
-    styles.forEach((style) => {
-      Object.defineProperty(ctx, style, {
-        set: (value) => {
-          if ((style !== 'fillStyle' && style !== 'strokeStyle')
-            || (value !== 'none' && value !== null)
-          ) {
-            ctx[`set${style.charAt(0).toUpperCase()}${style.slice(1)}`](value);
-          }
-        },
-      });
-    });
-
-    ctx.createRadialGradient = () => ctx.createCircularGradient(arguments);
-  }
-
-  initEvent() {
-    this.event = {};
-    const eventNames = [{
-      wxName: 'touchStart',
-      ecName: 'mousedown',
-    }, {
-      wxName: 'touchMove',
-      ecName: 'mousemove',
-    }, {
-      wxName: 'touchEnd',
-      ecName: 'mouseup',
-    }, {
-      wxName: 'touchEnd',
-      ecName: 'click',
-    }];
-
-    eventNames.forEach((name) => {
-      this.event[name.wxName] = (e) => {
-        const touch = e.mp.touches[0];
-        this.chart._zr.handler.dispatch(name.ecName, {
-          zrX: name.wxName === 'tap' ? touch.clientX : touch.x,
-          zrY: name.wxName === 'tap' ? touch.clientY : touch.y,
-        });
-      };
-    });
-  }
-}

+ 0 - 483
components/mpvue-picker/mpvuePicker.vue

@@ -1,483 +0,0 @@
-<template>
-	<view class="mpvue-picker">
-		<view :class="{'pickerMask':showPicker}" @click="maskClick" catchtouchmove="true"></view>
-		<view class="mpvue-picker-content " :class="{'mpvue-picker-view-show':showPicker}">
-			<view class="mpvue-picker__hd" catchtouchmove="true">
-				<view class="mpvue-picker__action" @click="pickerCancel">取消</view>
-				<view class="mpvue-picker__action" :style="{color:themeColor}" @click="pickerConfirm">确定</view>
-			</view>
-			<!-- 单列 -->
-			<picker-view indicator-style="height: 40px;" class="mpvue-picker-view" :value="pickerValue"
-				@change="pickerChange" v-if="mode==='selector' && pickerValueSingleArray.length > 0">
-				<picker-view-column>
-					<view class="picker-item" v-for="(item,index) in pickerValueSingleArray" :key="index">{{item.label}}
-					</view>
-				</picker-view-column>
-			</picker-view>
-			<!-- 时间选择器 -->
-			<picker-view indicator-style="height: 40px;" class="mpvue-picker-view" :value="pickerValue"
-				@change="pickerChange" v-if="mode==='timeSelector'">
-				<picker-view-column>
-					<view class="picker-item" v-for="(item,index) in pickerValueHour" :key="index">{{item.label}}</view>
-				</picker-view-column>
-				<picker-view-column>
-					<view class="picker-item" v-for="(item,index) in pickerValueMinute" :key="index">{{item.label}}
-					</view>
-				</picker-view-column>
-			</picker-view>
-			<!-- 多列选择 -->
-			<picker-view indicator-style="height: 40px;" class="mpvue-picker-view" :value="pickerValue"
-				@change="pickerChange" v-if="mode==='multiSelector'">
-				<!-- #ifdef VUE3 -->
-				<template v-for="(n,index) in pickerValueMulArray.length" :key="index">
-					<picker-view-column>
-						<view class="picker-item" v-for="(item,index1) in pickerValueMulArray[n]" :key="index1">
-							{{item.label}}
-						</view>
-					</picker-view-column>
-				</template>
-				<!-- #endif -->
-				<!-- #ifndef VUE3 -->
-				<block v-for="(n,index) in pickerValueMulArray.length" :key="index">
-					<picker-view-column>
-						<view class="picker-item" v-for="(item,index1) in pickerValueMulArray[n]" :key="index1">
-							{{item.label}}
-						</view>
-					</picker-view-column>
-				</block>
-				<!-- #endif -->
-			</picker-view>
-			<!-- 二级联动 -->
-			<picker-view indicator-style="height: 40px;" class="mpvue-picker-view" :value="pickerValue"
-				@change="pickerChangeMul" v-if="mode==='multiLinkageSelector' && deepLength===2">
-				<picker-view-column>
-					<view class="picker-item" v-for="(item,index) in pickerValueMulTwoOne" :key="index">{{item.label}}
-					</view>
-				</picker-view-column>
-				<picker-view-column>
-					<view class="picker-item" v-for="(item,index) in pickerValueMulTwoTwo" :key="index">{{item.label}}
-					</view>
-				</picker-view-column>
-			</picker-view>
-			<!-- 三级联动 -->
-			<picker-view indicator-style="height: 40px;" class="mpvue-picker-view" :value="pickerValue"
-				@change="pickerChangeMul" v-if="mode==='multiLinkageSelector' && deepLength===3">
-				<picker-view-column>
-					<view class="picker-item" v-for="(item,index) in pickerValueMulThreeOne" :key="index">{{item.label}}
-					</view>
-				</picker-view-column>
-				<picker-view-column>
-					<view class="picker-item" v-for="(item,index) in pickerValueMulThreeTwo" :key="index">{{item.label}}
-					</view>
-				</picker-view-column>
-				<picker-view-column>
-					<view class="picker-item" v-for="(item,index) in pickerValueMulThreeThree" :key="index">
-						{{item.label}}
-					</view>
-				</picker-view-column>
-			</picker-view>
-		</view>
-	</view>
-</template>
-
-<script>
-	export default {
-		data() {
-			return {
-				pickerChangeValue: [],
-				pickerValue: [],
-				pickerValueArrayChange: true,
-				modeChange: false,
-				pickerValueSingleArray: [],
-				pickerValueHour: [],
-				pickerValueMinute: [],
-				pickerValueMulArray: [],
-				pickerValueMulTwoOne: [],
-				pickerValueMulTwoTwo: [],
-				pickerValueMulThreeOne: [],
-				pickerValueMulThreeTwo: [],
-				pickerValueMulThreeThree: [],
-				/* 是否显示控件 */
-				showPicker: false,
-			};
-		},
-		props: {
-			/* mode */
-			mode: {
-				type: String,
-				default: 'selector'
-			},
-			/* picker 数值 */
-			pickerValueArray: {
-				type: Array,
-				default () {
-					return []
-				}
-			},
-			/* 默认值 */
-			pickerValueDefault: {
-				type: Array,
-				default () {
-					return []
-				}
-			},
-			/* 几级联动 */
-			deepLength: {
-				type: Number,
-				default: 2
-			},
-			/* 主题色 */
-			themeColor: String
-		},
-		watch: {
-			pickerValueArray(oldVal, newVal) {
-				this.pickerValueArrayChange = true;
-			},
-			mode(oldVal, newVal) {
-				this.modeChange = true;
-			},
-			pickerValueArray(val) {
-				this.initPicker(val);
-			}
-		},
-		methods: {
-			initPicker(valueArray) {
-				let pickerValueArray = valueArray;
-				this.pickerValue = this.pickerValueDefault;
-				// 初始化多级联动
-				if (this.mode === 'selector') {
-					this.pickerValueSingleArray = valueArray;
-				} else if (this.mode === 'timeSelector') {
-					this.modeChange = false;
-					let hourArray = [];
-					let minuteArray = [];
-					for (let i = 0; i < 24; i++) {
-						hourArray.push({
-							value: i,
-							label: i > 9 ? `${i} 时` : `0${i} 时`
-						});
-					}
-					for (let i = 0; i < 60; i++) {
-						minuteArray.push({
-							value: i,
-							label: i > 9 ? `${i} 分` : `0${i} 分`
-						});
-					}
-					this.pickerValueHour = hourArray;
-					this.pickerValueMinute = minuteArray;
-				} else if (this.mode === 'multiSelector') {
-					this.pickerValueMulArray = valueArray;
-				} else if (this.mode === 'multiLinkageSelector' && this.deepLength === 2) {
-					// 两级联动
-					let pickerValueMulTwoOne = [];
-					let pickerValueMulTwoTwo = [];
-					// 第一列
-					for (let i = 0, length = pickerValueArray.length; i < length; i++) {
-						pickerValueMulTwoOne.push(pickerValueArray[i]);
-					}
-					// 渲染第二列
-					// 如果有设定的默认值
-					if (this.pickerValueDefault.length === 2) {
-						let num = this.pickerValueDefault[0];
-						for (
-							let i = 0, length = pickerValueArray[num].children.length; i < length; i++
-						) {
-							pickerValueMulTwoTwo.push(pickerValueArray[num].children[i]);
-						}
-					} else {
-						for (
-							let i = 0, length = pickerValueArray[0].children.length; i < length; i++
-						) {
-							pickerValueMulTwoTwo.push(pickerValueArray[0].children[i]);
-						}
-					}
-					this.pickerValueMulTwoOne = pickerValueMulTwoOne;
-					this.pickerValueMulTwoTwo = pickerValueMulTwoTwo;
-				} else if (
-					this.mode === 'multiLinkageSelector' &&
-					this.deepLength === 3
-				) {
-					let pickerValueMulThreeOne = [];
-					let pickerValueMulThreeTwo = [];
-					let pickerValueMulThreeThree = [];
-					// 第一列
-					for (let i = 0, length = pickerValueArray.length; i < length; i++) {
-						pickerValueMulThreeOne.push(pickerValueArray[i]);
-					}
-					// 渲染第二列
-					this.pickerValueDefault =
-						this.pickerValueDefault.length === 3 ?
-						this.pickerValueDefault : [0, 0, 0];
-					if (this.pickerValueDefault.length === 3) {
-						let num = this.pickerValueDefault[0];
-						for (
-							let i = 0, length = pickerValueArray[num].children.length; i < length; i++
-						) {
-							pickerValueMulThreeTwo.push(pickerValueArray[num].children[i]);
-						}
-						// 第三列
-						let numSecond = this.pickerValueDefault[1];
-						for (let i = 0, length = pickerValueArray[num].children[numSecond].children.length; i <
-							length; i++) {
-							pickerValueMulThreeThree.push(
-								pickerValueArray[num].children[numSecond].children[i]
-							);
-						}
-					}
-					this.pickerValueMulThreeOne = pickerValueMulThreeOne;
-					this.pickerValueMulThreeTwo = pickerValueMulThreeTwo;
-					this.pickerValueMulThreeThree = pickerValueMulThreeThree;
-				}
-			},
-			show() {
-				setTimeout(() => {
-					if (this.pickerValueArrayChange || this.modeChange) {
-						this.initPicker(this.pickerValueArray);
-						this.showPicker = true;
-						this.pickerValueArrayChange = false;
-						this.modeChange = false;
-					} else {
-						this.showPicker = true;
-					}
-				}, 0);
-			},
-			maskClick() {
-				this.pickerCancel();
-			},
-			pickerCancel() {
-				this.showPicker = false;
-				this._initPickerVale();
-				let pickObj = {
-					index: this.pickerValue,
-					value: this._getPickerLabelAndValue(this.pickerValue, this.mode).value,
-					label: this._getPickerLabelAndValue(this.pickerValue, this.mode).label
-				};
-				this.$emit('onCancel', pickObj);
-			},
-			pickerConfirm(e) {
-				this.showPicker = false;
-				this._initPickerVale();
-				let pickObj = {
-					index: this.pickerValue,
-					value: this._getPickerLabelAndValue(this.pickerValue, this.mode).value,
-					label: this._getPickerLabelAndValue(this.pickerValue, this.mode).label
-				};
-				this.$emit('onConfirm', pickObj);
-			},
-			showPickerView() {
-				this.showPicker = true;
-			},
-			pickerChange(e) {
-				this.pickerValue = e.mp.detail.value;
-				let pickObj = {
-					index: this.pickerValue,
-					value: this._getPickerLabelAndValue(this.pickerValue, this.mode).value,
-					label: this._getPickerLabelAndValue(this.pickerValue, this.mode).label
-				};
-				this.$emit('onChange', pickObj);
-			},
-			pickerChangeMul(e) {
-				if (this.deepLength === 2) {
-					let pickerValueArray = this.pickerValueArray;
-					let changeValue = e.mp.detail.value;
-					// 处理第一列滚动
-					if (changeValue[0] !== this.pickerValue[0]) {
-						let pickerValueMulTwoTwo = [];
-						// 第一列滚动第二列数据更新
-						for (let i = 0, length = pickerValueArray[changeValue[0]].children.length; i < length; i++) {
-							pickerValueMulTwoTwo.push(pickerValueArray[changeValue[0]].children[i]);
-						}
-						this.pickerValueMulTwoTwo = pickerValueMulTwoTwo;
-						// 第二列初始化为 0
-						changeValue[1] = 0;
-					}
-					this.pickerValue = changeValue;
-				} else if (this.deepLength === 3) {
-					let pickerValueArray = this.pickerValueArray;
-					let changeValue = e.mp.detail.value;
-					let pickerValueMulThreeTwo = [];
-					let pickerValueMulThreeThree = [];
-					// 重新渲染第二列
-					// 如果是第一列滚动
-					if (changeValue[0] !== this.pickerValue[0]) {
-						this.pickerValueMulThreeTwo = [];
-						for (let i = 0, length = pickerValueArray[changeValue[0]].children.length; i < length; i++) {
-							pickerValueMulThreeTwo.push(pickerValueArray[changeValue[0]].children[i]);
-						}
-						// 重新渲染第三列
-						for (let i = 0, length = pickerValueArray[changeValue[0]].children[0].children.length; i <
-							length; i++) {
-							pickerValueMulThreeThree.push(pickerValueArray[changeValue[0]].children[0].children[i]);
-						}
-						changeValue[1] = 0;
-						changeValue[2] = 0;
-						this.pickerValueMulThreeTwo = pickerValueMulThreeTwo;
-						this.pickerValueMulThreeThree = pickerValueMulThreeThree;
-					} else if (changeValue[1] !== this.pickerValue[1]) {
-						// 第二列滚动
-						// 重新渲染第三列
-						this.pickerValueMulThreeThree = [];
-						pickerValueMulThreeTwo = this.pickerValueMulThreeTwo;
-						for (let i = 0, length = pickerValueArray[changeValue[0]].children[changeValue[1]].children
-								.length; i <
-							length; i++) {
-							pickerValueMulThreeThree.push(pickerValueArray[changeValue[0]].children[changeValue[1]]
-								.children[
-									i]);
-						}
-						changeValue[2] = 0;
-						this.pickerValueMulThreeThree = pickerValueMulThreeThree;
-					}
-					this.pickerValue = changeValue;
-				}
-				let pickObj = {
-					index: this.pickerValue,
-					value: this._getPickerLabelAndValue(this.pickerValue, this.mode).value,
-					label: this._getPickerLabelAndValue(this.pickerValue, this.mode).label
-				};
-				this.$emit('onChange', pickObj);
-			},
-			// 获取 pxikerLabel
-			_getPickerLabelAndValue(value, mode) {
-				let pickerLable;
-				let pickerGetValue = [];
-				// selector
-				if (mode === 'selector') {
-					pickerLable = this.pickerValueSingleArray[value].label;
-					pickerGetValue.push(this.pickerValueSingleArray[value].value);
-				} else if (mode === 'timeSelector') {
-					pickerLable = `${this.pickerValueHour[value[0]].label}-${this.pickerValueMinute[value[1]].label}`;
-					pickerGetValue.push(this.pickerValueHour[value[0]].value);
-					pickerGetValue.push(this.pickerValueHour[value[1]].value);
-				} else if (mode === 'multiSelector') {
-					for (let i = 0; i < value.length; i++) {
-						if (i > 0) {
-							pickerLable += this.pickerValueMulArray[i][value[i]].label + (i === value.length - 1 ? '' :
-								'-');
-						} else {
-							pickerLable = this.pickerValueMulArray[i][value[i]].label + '-';
-						}
-						pickerGetValue.push(this.pickerValueMulArray[i][value[i]].value);
-					}
-				} else if (mode === 'multiLinkageSelector') {
-					/* eslint-disable indent */
-					pickerLable =
-						this.deepLength === 2 ?
-						`${this.pickerValueMulTwoOne[value[0]].label}-${this.pickerValueMulTwoTwo[value[1]].label}` :
-						`${this.pickerValueMulThreeOne[value[0]].label}-${this.pickerValueMulThreeTwo[value[1]].label}-${this.pickerValueMulThreeThree[value[2]].label}`;
-					if (this.deepLength === 2) {
-						pickerGetValue.push(this.pickerValueMulTwoOne[value[0]].value);
-						pickerGetValue.push(this.pickerValueMulTwoTwo[value[1]].value);
-					} else {
-						pickerGetValue.push(this.pickerValueMulThreeOne[value[0]].value);
-						pickerGetValue.push(this.pickerValueMulThreeTwo[value[1]].value);
-						pickerGetValue.push(this.pickerValueMulThreeThree[value[2]].value);
-					}
-					/* eslint-enable indent */
-				}
-				return {
-					label: pickerLable,
-					value: pickerGetValue
-				};
-			},
-			// 初始化 pickerValue 默认值
-			_initPickerVale() {
-				if (this.pickerValue.length === 0) {
-					if (this.mode === 'selector') {
-						this.pickerValue = [0];
-					} else if (this.mode === 'multiSelector') {
-						this.pickerValue = new Int8Array(this.pickerValueArray.length);
-					} else if (
-						this.mode === 'multiLinkageSelector' &&
-						this.deepLength === 2
-					) {
-						this.pickerValue = [0, 0];
-					} else if (
-						this.mode === 'multiLinkageSelector' &&
-						this.deepLength === 3
-					) {
-						this.pickerValue = [0, 0, 0];
-					}
-				}
-			}
-		}
-	};
-</script>
-
-<style>
-	.pickerMask {
-		position: fixed;
-		z-index: 1000;
-		top: 0;
-		right: 0;
-		left: 0;
-		bottom: 0;
-		background: rgba(0, 0, 0, 0.6);
-	}
-
-	.mpvue-picker-content {
-		position: fixed;
-		bottom: 0;
-		left: 0;
-		width: 100%;
-		transition: all 0.3s ease;
-		transform: translateY(100%);
-		z-index: 3000;
-	}
-
-	.mpvue-picker-view-show {
-		transform: translateY(0);
-	}
-
-	.mpvue-picker__hd {
-		display: flex;
-		padding: 9px 15px;
-		background-color: #fff;
-		position: relative;
-		text-align: center;
-		font-size: 17px;
-	}
-
-	.mpvue-picker__hd:after {
-		content: ' ';
-		position: absolute;
-		left: 0;
-		bottom: 0;
-		right: 0;
-		height: 1px;
-		border-bottom: 1px solid #e5e5e5;
-		color: #e5e5e5;
-		transform-origin: 0 100%;
-		transform: scaleY(0.5);
-	}
-
-	.mpvue-picker__action {
-		display: block;
-		flex: 1;
-		color: #1aad19;
-	}
-
-	.mpvue-picker__action:first-child {
-		text-align: left;
-		color: #888;
-	}
-
-	.mpvue-picker__action:last-child {
-		text-align: right;
-	}
-
-	.picker-item {
-		text-align: center;
-		line-height: 40px;
-		font-size: 16px;
-	}
-
-	.mpvue-picker-view {
-		position: relative;
-		bottom: 0;
-		left: 0;
-		width: 100%;
-		height: 238px;
-		background-color: rgba(255, 255, 255, 1);
-	}
-</style>

+ 0 - 175
components/mpvueGestureLock/gestureLock.js

@@ -1,175 +0,0 @@
-class GestureLock {
-
-    constructor(containerWidth, cycleRadius) {
-        this.containerWidth = containerWidth; // 容器宽度
-        this.cycleRadius = cycleRadius; // 圆的半径
-
-        this.circleArray = []; // 全部圆的对象数组
-        this.checkPoints = []; // 选中的圆的对象数组
-        this.lineArray = []; // 已激活锁之间的线段数组
-        this.lastCheckPoint = 0; // 最后一个激活的锁
-        this.offsetX = 0; // 容器的 X 偏移
-        this.offsetY = 0; // 容器的 Y 偏移
-        this.activeLine = {}; // 最后一个激活的锁与当前位置之间的线段
-
-        this.windowWidth = wx.getSystemInfoSync().windowWidth; // 窗口大小(用于rpx 和 px 转换)
-
-        this.initCircleArray();
-    }
-
-    // 初始化 画布上的 9个圆
-    initCircleArray() {
-        const cycleMargin = (this.containerWidth - 6 * this.cycleRadius) / 6;
-        let count = 0;
-        for (let i = 0; i < 3; i++) {
-            for (let j = 0; j < 3; j++) {
-                count++;
-                this.circleArray.push({
-                    count: count,
-                    x: this.rpxTopx((cycleMargin + this.cycleRadius) * (j * 2 + 1)),
-                    y: this.rpxTopx((cycleMargin + this.cycleRadius) * (i * 2 + 1)),
-                    radius: this.rpxTopx(this.cycleRadius),
-                    check: false,
-                    style: {
-                        left: (cycleMargin + this.cycleRadius) * (j * 2 + 1) - this.cycleRadius + 'rpx',
-                        top: (cycleMargin + this.cycleRadius) * (i * 2 + 1) - this.cycleRadius + 'rpx',
-                        width: this.cycleRadius * 2 + 'rpx',
-                    }
-                });
-            }
-        }
-    }
-
-    onTouchStart(e) {
-        this.setOffset(e);
-        this.checkTouch({
-            x: e.touches[0].pageX - this.offsetX,
-            y: e.touches[0].pageY - this.offsetY
-        });
-    }
-
-    onTouchMove(e) {
-        this.moveDraw(e)
-    }
-
-    onTouchEnd(e) {
-        const checkPoints = this.checkPoints;
-        this.reset();
-        return checkPoints;
-    }
-
-    // 初始化 偏移量
-    setOffset(e) {
-        this.offsetX = e.currentTarget.offsetLeft;
-        this.offsetY = e.currentTarget.offsetTop;
-    }
-
-    // 检测当时 触摸位置是否位于 锁上
-    checkTouch({
-        x,
-        y
-    }) {
-        for (let i = 0; i < this.circleArray.length; i++) {
-            let point = this.circleArray[i];
-            if (this.isPointInCycle(x, y, point.x, point.y, point.radius)) {
-                if (!point.check) {
-                    this.checkPoints.push(point.count);
-                    if (this.lastCheckPoint != 0) {
-                        // 已激活锁之间的线段
-                        const line = this.drawLine(this.lastCheckPoint, point);
-                        this.lineArray.push(line);
-                    }
-                    this.lastCheckPoint = point;
-                }
-                point.check = true;
-                return;
-            }
-        }
-    }
-
-    // 画线 - 返回 样式 对象
-    drawLine(start, end) {
-        const width = this.getPointDis(start.x, start.y, end.x, end.y);
-        const rotate = this.getAngle(start, end);
-
-        return {
-            activeLeft: start.x + 'px',
-            activeTop: start.y + 'px',
-            activeWidth: width + 'px',
-            activeRotate: rotate + 'deg'
-        }
-
-    }
-
-    // 获取 画线的 角度
-    getAngle(start, end) {
-        var diff_x = end.x - start.x,
-            diff_y = end.y - start.y;
-        if (diff_x >= 0) {
-            return 360 * Math.atan(diff_y / diff_x) / (2 * Math.PI);
-        } else {
-            return 180 + 360 * Math.atan(diff_y / diff_x) / (2 * Math.PI);
-        }
-    }
-
-    // 判断 当前点是否位于 锁内
-    isPointInCycle(x, y, circleX, circleY, radius) {
-        return (this.getPointDis(x, y, circleX, circleY) < radius) ? true : false;
-    }
-
-    // 获取两点之间距离
-    getPointDis(ax, ay, bx, by) {
-        return Math.sqrt(Math.pow(ax - bx, 2) + Math.pow(ay - by, 2));
-    }
-
-    // 移动 绘制
-    moveDraw(e) {
-        // 画经过的圆
-        const x = e.touches[0].pageX - this.offsetX;
-        const y = e.touches[0].pageY - this.offsetY;
-        this.checkTouch({
-            x,
-            y
-        });
-
-        // 画 最后一个激活的锁与当前位置之间的线段
-        this.activeLine = this.drawLine(this.lastCheckPoint, {
-            x,
-            y
-        });
-    }
-
-    // 使 画布 恢复初始状态
-    reset() {
-        this.circleArray.forEach((item) => {
-            item.check = false;
-        });
-        this.checkPoints = [];
-        this.lineArray = [];
-        this.activeLine = {};
-        this.lastCheckPoint = 0;
-    }
-
-
-    // 获取 最后一个激活的锁与当前位置之间的线段
-    getActiveLine() {
-        return this.activeLine;
-    }
-
-    // 获取 圆对象数组
-    getCycleArray() {
-        return this.circleArray;
-    }
-
-    // 获取 已激活锁之间的线段
-    getLineArray() {
-        return this.lineArray;
-    }
-
-    // 将 RPX 转换成 PX
-    rpxTopx(rpx) {
-        return rpx / 750 * this.windowWidth;
-    }
-}
-
-export default GestureLock;

+ 0 - 138
components/mpvueGestureLock/index.vue

@@ -1,138 +0,0 @@
-<template>
-	<view class="gesture-lock" :class="{error:error}" :style="{width: containerWidth +'rpx', height:containerWidth +'rpx'}"
-	 @touchstart.stop="onTouchStart" @touchmove.stop="onTouchMove" @touchend.stop="onTouchEnd">
-		<!-- 同级 v-for 的 key 重复会有问题,需要套一层。 -->
-		<!-- 9 个圆 -->
-		<view>
-			<view v-for="(item,i) in circleArray" :key="i" class="cycle" :class="{check:item.check}" :style="{left:item.style.left,top:item.style.top,width:item.style.width,height:item.style.width}">
-			</view>
-		</view>
-		<view>
-			<!-- 已激活锁之间的线段 -->
-			<view v-for="(item,i) in lineArray" :key="i" class="line" :style="{left:item.activeLeft,top:item.activeTop,width:item.activeWidth,'-webkit-transform':'rotate('+item.activeRotate+')',transform:'rotate('+item.activeRotate+')'}">
-			</view>
-		</view>
-		<!-- 最后一个激活的锁与当前位置之间的线段 -->
-		<view class="line" :style="{left:activeLine.activeLeft,top:activeLine.activeTop,width:activeLine.activeWidth,'-webkit-transform':'rotate('+activeLine.activeRotate+')',transform:'rotate('+activeLine.activeRotate+')'}">
-		</view>
-	</view>
-</template>
-<script>
-	import GestureLock from './gestureLock';
-
-	export default {
-		name: 'index',
-		props: {
-			/**
-			 * 容器宽度
-			 */
-			containerWidth: {
-				type: [Number, String],
-				default: 0
-			},
-			/**
-			 * 圆的半径
-			 */
-			cycleRadius: {
-				type: [Number, String],
-				default: 0
-			},
-			/**
-			 * 已设定的密码
-			 */
-			password: {
-				type: Array,
-				default () {
-					return []
-				}
-			},
-		},
-		data() {
-			return {
-				gestureLock: {}, // 锁对象
-				circleArray: [], // 圆对象数组
-				lineArray: [], // 已激活锁之间的线段
-				activeLine: {}, // 最后一个激活的锁与当前位置之间的线段
-				error: false
-			}
-		},
-		methods: {
-			onTouchStart(e) {
-				this.gestureLock.onTouchStart(e);
-				this.refesh();
-			},
-
-			onTouchMove(e) {
-				this.gestureLock.onTouchMove(e);
-				this.refesh();
-			},
-
-			onTouchEnd(e) {
-				const checkPoints = this.gestureLock.onTouchEnd(e);
-				if (!this.password.length || checkPoints.join('') == this.password.join('')) {
-					this.refesh();
-					this.$emit('end', checkPoints);
-				} else {
-					this.error = true;
-					setTimeout(() => {
-						this.refesh();
-						this.$emit('end', checkPoints);
-					}, 800);
-				}
-
-			},
-			refesh() {
-				this.error = false;
-				this.circleArray = this.gestureLock.getCycleArray();
-				this.lineArray = this.gestureLock.getLineArray();
-				this.activeLine = this.gestureLock.getActiveLine();
-			}
-		},
-		mounted() {
-			this.gestureLock = new GestureLock(this.containerWidth, this.cycleRadius);
-			this.refesh();
-		}
-	}
-</script>
-
-<style scoped>
-	.gesture-lock {
-		margin: 0 auto;
-		position: relative;
-		box-sizing: border-box;
-		overflow: auto;
-	}
-
-	.gesture-lock .cycle {
-		box-sizing: border-box;
-		position: absolute;
-		border: 2px solid #66aaff;
-		border-radius: 50%;
-	}
-
-	.gesture-lock .cycle.check:after {
-		content: "";
-		display: block;
-		position: absolute;
-		width: 32%;
-		height: 32%;
-		border: 2px solid #66aaff;
-		border-radius: 50%;
-		top: 50%;
-		left: 50%;
-		transform: translate(-50%, -50%);
-	}
-
-	.gesture-lock .line {
-		height: 0;
-		border-top: 2px solid #66aaff;
-		position: absolute;
-		transform-origin: left center;
-	}
-
-	.gesture-lock.error .cycle.check,
-	.gesture-lock.error .cycle.check:after,
-	.gesture-lock.error .line {
-		border-color: #ffa197;
-	}
-</style>

+ 0 - 38
components/page-foot/page-foot.vue

@@ -1,38 +0,0 @@
-<template name="page-foot">
-	<view class="page-share-title">
-		<text>感谢{{name}}提供本示例,</text>
-		<text class="submit" @click="submit">我也提交</text>
-	</view>
-</template>
-
-<script>
-	export default {
-		name: "page-foot",
-		props: {
-			name: {
-				type: String,
-				default: ""
-			}
-		},
-		methods: {
-			submit() {
-				uni.showModal({
-					content:"hello uni-app开源地址为https://github.com/dcloudio/uni-app/tree/master/examples,请在这个开源项目上贡献你的代码",
-					showCancel:false
-				})
-			}
-		}
-	}
-</script>
-<style>
-	.page-share-title {
-		text-align: center;
-		font-size: 30rpx;
-		color: #BEBEBE;
-		padding: 20rpx 0;
-	}
-
-	.submit {
-		border-bottom: 1rpx solid #BEBEBE;
-	}
-</style>

+ 0 - 16
components/page-head/page-head.vue

@@ -1,16 +0,0 @@
-<template name="page-head">
-	<view class="common-page-head">
-		<view class="common-page-head-title">{{title}}</view>
-	</view>
-</template>
-<script>
-	export default {
-		name: "page-head",
-		props: {
-			title: {
-				type: String,
-				default: ""
-			}
-		}
-	}
-</script>

+ 0 - 66
components/product.vue

@@ -1,66 +0,0 @@
-<template>
-	<view class="product">
-		<image class="product-image" :src="image ? image : 'https://via.placeholder.com/150x200'"></image>
-		<view class="product-title">{{title}}</view>
-		<view class="product-price">
-			<text class="product-price-favour">¥{{originalPrice}}</text>
-			<text class="product-price-original">¥{{favourPrice}}</text>
-			<text class="product-tip">{{tip}}</text>
-		</view>
-	</view>
-</template>
-
-<script>
-	export default {
-		name: 'product',
-		props: ['image', 'title', 'originalPrice', 'favourPrice', 'tip']
-	}
-</script>
-
-<style>
-	.product {
-		padding: 10rpx 20rpx;
-		display: flex;
-		flex-direction: column;
-	}
-
-	.product-image {
-		height: 330rpx;
-		width: 330rpx;
-	}
-
-	.product-title {
-		width: 300rpx;
-		font-size: 32rpx;
-		word-break: break-all;
-		display: -webkit-box;
-		overflow: hidden;
-		text-overflow: ellipsis;
-		-webkit-box-orient: vertical;
-		-webkit-line-clamp: 2;
-	}
-
-	.product-price {
-		font-size: 28rpx;
-		position: relative;
-	}
-
-	.product-price-original {
-		color: #E80080;
-	}
-
-	.product-price-favour {
-		color: #888888;
-		text-decoration: line-through;
-		margin-left: 10rpx;
-	}
-
-	.product-tip {
-		position: absolute;
-		right: 10rpx;
-		background-color: #FF3333;
-		color: #FFFFFF;
-		padding: 0 10rpx;
-		border-radius: 5rpx;
-	}
-</style>

+ 156 - 0
components/subComponents/dmAlterPopView.vue

@@ -0,0 +1,156 @@
+<template>
+	<view class="pop-view" v-if='visible'>
+		<view class="pop-maskView" :style="{
+		  'background-color': maskBgColor,
+		  zIndex: zIndex - 1
+		}" @tap.stop="handleMaskTap"
+		 @touchmove.stop.prevent="moveHandle">
+		</view>
+		<view class='alterView' :style="{zIndex: zIndex}"
+		 @touchmove.stop.prevent="moveHandle">
+			
+		</view>
+	</view>
+</template>
+<script>
+	export default {
+		props: {
+			title: String,
+			maskColor: {
+				type: String,
+				default: 'rgba(0, 0, 0, 0.3)'
+			},
+			zIndex: {
+				type: Number,
+				default: 999
+			},
+			maskTapHide: {
+				type: Boolean,
+				default: true
+			},
+			isShowTitle: {
+				type: Boolean,
+				default: true
+			},
+			isShowClose: {
+				type: Boolean,
+				default: true
+			},
+			isShowConfirm: {
+				type: Boolean,
+				default: true
+			}
+		},
+		data() {
+			return {
+				visible: false,
+				containerVisible: false,
+				maskBgColor: '',
+				selectValue: [0],
+				selIdx: 0,
+				themeColor:''
+			}
+		},
+		mounted() {
+			let app = getApp();
+			this.globalData = app.globalData;
+			this.themeColor = this.globalData.themeColor;
+		},
+		methods: {
+			show() {
+				this.visible = true
+				setTimeout(() => {
+					this.maskBgColor = this.maskColor
+					this.containerVisible = true
+				}, 20)
+			},
+			hide() {
+				this.maskBgColor = ''
+				this.containerVisible = false
+				setTimeout(() => {
+					this.visible = false
+				}, 200)
+				this.$emit('close')
+			},
+			handleCancel() {
+				this.hide()
+			},
+			handleConfirm() {
+				this.hide()
+				this.$emit('confirm')
+			},
+			handleMaskTap() {
+				if (this.maskTapHide) {
+					this.hide()
+				}
+			},
+			moveHandle() {},
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.pop-view {
+		position: relative;
+
+		.pop-maskView {
+			position: fixed;
+			top: 0;
+			right: 0;
+			left: 0;
+			bottom: 0;
+			transition-property: background-color;
+			transition-duration: 0.3s;
+		}
+
+		.pop-contentView {
+			position: fixed;
+			right: 0;
+			left: 0;
+			bottom: 0;
+			background-color: #fff;
+			border-radius: 40rpx 40rpx 0rpx 0rpx;
+			box-shadow: 0rpx 8rpx 12rpx 0rpx;
+			display: flex;
+			flex-direction: column;
+			align-items: center;
+			transform: translateY(100%);
+			transition-property: transform;
+			transition-duration: 0.3s;
+
+			.pop-title {
+				margin-top: 60rpx;
+				font-size: 32rpx;
+				font-family: Verdana, Verdana-Bold;
+				font-weight: 700;
+				text-align: center;
+				color: #333333;
+			}
+
+			.pop-close {
+				position: absolute;
+				top: 64rpx;
+				right: 30rpx;
+				width: 40rpx;
+				height: 40rpx;
+			}
+
+			.pop-commit {
+				margin-bottom: 54rpx;
+				width: 260rpx;
+				height: 84rpx;
+				line-height: 84rpx;
+				border-radius: 42rpx;
+				font-size: 32rpx;
+				font-family: Verdana, Verdana-Regular;
+				font-weight: 400;
+				text-align: center;
+				color: #ffffff;
+			}
+		}
+
+		.pop-contentView-show {
+			transform: translateY(0);
+		}
+	}
+</style>

+ 284 - 0
components/subComponents/dmBaobeiScreenPicker.vue

@@ -0,0 +1,284 @@
+<template>
+	<dm-pop-view ref="popView" title="更多筛选" :isShowConfirm="false" :maskTapHide="true">
+		<scroll-view class="screen_container" scroll-y="true">
+			<dm-time-level-screen :sortType="sortType" :queryDateType="queryDateType" @queryDateTypeAction="queryDateTypeAction" @sortTypeAction="sortTypeAction"></dm-time-level-screen>
+			<dm-date-screen style="margin-top: 40rpx;" :defaultParameter="defaultParameter" @screenDateAction="screenDateAction"></dm-date-screen>
+			<view class="screen_item_title" v-if='isSingleProject && roleType != 12'>选择报备组织</view>
+			<view class="reportOrganize" @click="openReportOrganizePicker">
+				<view class="organizeName">
+					{{holdReportOrganize.title}}
+				</view>
+				<image class="organizeIcon" src="../../static/icons/icon_aboutUs_DropDown.png" mode=""></image>
+			</view>
+
+			<view class="screen_item_title">报备方式</view>
+			<view class="level_tag_view">
+				<text class="level_tag" :style="{ color: holdReportType == item.value ? '#fff' : '#666', 'background-color': holdReportType == item.value ? themeColor : '#F1F5F9' }"
+				 v-for="(item, i) in reportTypeList" :key="i" @click="chooseType(item)">
+					{{ item.title }}
+				</text>
+			</view>
+			<view class="screen_item_title">客户最新动态</view>
+			<view class="level_tag_view">
+				<text class="level_tag" :style="{ color: holdReportState == item.value ? '#fff' : '#666', 'background-color': holdReportState == item.value ? themeColor : '#F1F5F9' }"
+				 v-for="(item, i) in reportStateList" :key="i" @click="chooseState(item)">
+					{{ item.title }}
+				</text>
+			</view>
+
+			<view class="bottom_btn" style="margin-top: 60rpx;">
+				<text class="reset_btn" :style="{'background-color':themeColor25}" @click="resetAction">重置</text>
+				<text class="pop_btn" :style="{'background-color':themeColor}" @click="popConfirm">确定</text>
+			</view>
+
+			<dm-picker-view ref="reportOrganizePicker" :options="reportOrganizeList" :value="holdReportOrganize.value" title="选择报备组织"
+			 @confirm="confirmReportOrganize"></dm-picker-view>
+		</scroll-view>
+	</dm-pop-view>
+</template>
+
+<script>
+	import dmPopView from './dmPopView.vue'
+	import dmTimeLevelScreen from './dmTimeLevelScreen.vue'
+	import dmDateScreen from './dmDateScreen.vue'
+	import dmPickerView from './dmPickerView.vue'
+
+	export default {
+		props: {
+			defaultParameter: Object,
+			isSingleProject: {
+				type: Boolean,
+				default: true
+			},
+			roleType: {
+				type: [Number, String],
+				default: '0'
+			},
+			holdReportOrganize: Object,
+			holdReportType: String,
+			holdReportState: String,
+			reportTypeList: Array,
+			reportStateList: Array,
+			reportOrganizeList: Array,
+			queryDateType: [Number, String],
+			sortType: {
+				type: [Number, String],
+				default: 1
+			}
+		},
+		data() {
+			return {
+				themeColor: '',
+				fuzhuColor: '',
+				themeColor50: '',
+				themeColor25: '',
+				fuzhuColor50: '',
+			}
+		},
+		mounted() {
+			let globalData = getApp().globalData
+			this.themeColor = globalData.themeColor
+			this.themeColor50 = globalData.themeColor50
+			this.themeColor25 = globalData.themeColor25
+			this.fuzhuColor = globalData.fuzhuColor
+			this.fuzhuColor50 = globalData.fuzhuColor50
+		},
+		methods: {
+			show() {
+				this.$refs.popView.show()
+			},
+			queryDateTypeAction(e) {
+				// this.queryDateType = e
+				// this.getPageData()
+				this.$emit('queryDateTypeAction', e)
+			},
+
+			sortTypeAction(e) {
+				// this.sortType = e
+				// this.getPageData()
+				this.$emit('sortTypeAction', e)
+			},
+			// 筛选中时间选择
+			screenDateAction(val, start, end) {
+				this.$emit('screenDateAction', val, start, end)
+				// this.defaultParameter.dateType = val
+				// this.defaultParameter.startDate = start
+				// this.defaultParameter.endDate = end
+			},
+			openReportOrganizePicker() {
+				this.$refs.reportOrganizePicker.show()
+			},
+			chooseType(item) {
+				// this.holdReportType = item.value;
+				this.$emit('chooseType', item)
+			},
+			chooseState(item) {
+				// this.holdReportState = item.value;
+				this.$emit('chooseState', item)
+			},
+			confirmReportOrganize(e) {
+				this.$emit('confirmReportOrganize', e)
+				// this.holdReportOrganize = {
+				// 	title: e.selItem.title,
+				// 	value: e.selItem.value
+				// }
+			},
+			resetAction() {
+				this.$refs.popView.hide()
+				this.$emit('resetAction')
+			},
+			popConfirm() {
+				this.$refs.popView.hide()
+				this.$emit('sureAction')
+			}
+		},
+		components: {
+			dmPopView,
+			dmTimeLevelScreen,
+			dmDateScreen,
+			dmPickerView
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.screen_container {
+		margin-top: 40rpx;
+		margin-bottom: 50rpx;
+		overflow-y: scroll;
+		// display: flex;
+		// flex-direction: column;
+		width: 750rpx;
+		height: 960rpx;
+		min-height: 960rpx;
+		max-height: 960rpx;
+		// max-height: 1200rpx;
+
+		.screen_item_title {
+			margin-left: 30rpx;
+			margin-top: 40rpx;
+			line-height: 44rpx;
+			font-size: 32rpx;
+			font-family: Verdana, Verdana-Bold;
+			font-weight: 700;
+			text-align: left;
+			color: #454545;
+		}
+
+		.level_tag_view {
+			margin-left: 30rpx;
+			margin-top: 0rpx;
+			display: flex;
+			flex-wrap: wrap;
+
+			.level_tag {
+				margin-right: 16rpx;
+				// padding: 0 20rpx;
+				// height: 56rpx;
+				// border-radius: 8rpx;
+				width: 220rpx;
+				height: 72rpx;
+				border-radius: 12rpx;
+				font-size: 28rpx;
+				font-family: Verdana, Verdana-Regular;
+				font-weight: 400;
+				text-align: center;
+				line-height: 72rpx;
+				margin-top: 20rpx;
+				// margin-bottom: 10rpx;
+			}
+		}
+
+		.reportOrganize {
+			margin-top: 20rpx;
+			margin-left: 30rpx;
+			margin-right: 30rpx;
+			padding: 0 30rpx;
+			box-sizing: border-box;
+			border-radius: 16rpx;
+			background-color: #F1F5F9;
+			height: 94rpx;
+			min-height: 94rpx;
+			max-height: 94rpx;
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+			line-height: 94rpx;
+
+			.organizeName {
+				font-size: 28rpx;
+				font-family: Verdana;
+			}
+
+			.organizeIcon {
+				width: 14rpx;
+				height: 9rpx;
+			}
+		}
+
+		.screen_item_sub {
+			margin-top: 8rpx;
+			margin-bottom: 40rpx;
+			margin-left: 30rpx;
+			line-height: 34rpx;
+			font-size: 24rpx;
+			font-family: Verdana, Verdana-Regular;
+			font-weight: 400;
+			text-align: left;
+			color: #999999;
+		}
+
+		.score_view {
+			margin-top: 30rpx;
+			margin-bottom: 120rpx;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			height: 82rpx;
+
+			.score_text {
+				font-size: 70rpx;
+				font-family: 'DIN Alternate', 'DIN Alternate-Bold';
+				font-weight: 700;
+			}
+
+			.score_unit {
+				padding-top: 25rpx;
+				font-size: 28rpx;
+				font-family: Verdana, Verdana-Regular;
+				font-weight: 400;
+			}
+		}
+
+		.bottom_btn {
+			display: flex;
+			justify-content: center;
+			margin-bottom: 60rpx;
+
+			.reset_btn {
+				width: 156rpx;
+				height: 80rpx;
+				border-radius: 40rpx;
+				font-size: 28rpx;
+				font-family: Verdana, Verdana-Bold;
+				font-weight: 700;
+				text-align: center;
+				line-height: 80rpx;
+				color: #666666;
+			}
+
+			.pop_btn {
+				margin-left: 30rpx;
+				width: 444rpx;
+				height: 80rpx;
+				border-radius: 40rpx;
+				font-size: 28rpx;
+				font-family: Verdana, Verdana-Bold;
+				font-weight: 700;
+				text-align: center;
+				line-height: 80rpx;
+				color: #ffffff;
+			}
+		}
+	}
+</style>

+ 112 - 0
components/subComponents/dmCalendarPickerView.vue

@@ -0,0 +1,112 @@
+<template>
+	<dm-pop-view ref='popView' title="选择时段" :isShowConfirm="true" :maskTapHide='maskTapHide' @confirm="confirmAction">
+		<view class="content">
+			<uni-calendar 
+			    :insert="true"
+			    :lunar="true"
+				:range = "true"
+				:startDate = "afterDate"
+			    :end-date="nowDate"
+			    @change="change"
+			     />
+		</view>
+	</dm-pop-view>
+</template>
+
+<script>
+	import dmPopView from './dmPopView.vue'
+	import uniCalendar from '../uni-calendar/uni-calendar.vue'
+	
+	import moment from '../../static/moment.min.js'
+	export default {
+		props: {
+			maskTapHide: {
+				type: Boolean,
+				default: true
+			},
+			dataList: Array,
+		},
+		data() {
+			return { 
+				nowDate:'',
+				afterDate:'',
+				startDate: '',
+				endDate: ''
+			}
+		},
+		created() {
+			// this.nowDate = moment('2020-08-20').day(5).format("YYYY-MM-DD");
+			// this.afterDate = moment('2020-08-20').day(-5).format('YYYY-MM-DD');
+			// // console.log("日期1", this.nowDate, this.afterDate);
+		},
+		mounted() {
+			// 控制只能选择之前90天
+			// this.nowDate = moment('2020-08-20').day(5).format("YYYY-MM-DD");
+			// this.afterDate = moment('2020-08-20').day(-5).format('YYYY-MM-DD');
+			// // console.log("日期2", this.nowDate, this.afterDate);
+			
+		},
+		methods: {
+			show() {
+				this.$refs.popView.show()
+
+			},
+			confirmAction() {
+				if(this.startDate=="" || this.endDate==""){
+					return uni.showToast({
+				    	icon:'none',
+				    	title:'请选择时间范围'
+				    });
+				}
+				const param = {
+					startDate:this.startDate,
+					endDate:this.endDate
+				}
+				this.$emit('confirmSelDate',param)
+			},
+			change(e) {
+				// console.log(e);
+				this.startDate = e.range.before;
+				this.endDate = e.range.after;
+			}
+		},
+		components: {
+			dmPopView,
+			uniCalendar
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.content {
+		width: 100%;
+		height: 776rpx;
+		font-family: Verdana;
+		padding-bottom: 100rpx;
+		.list-content {
+			margin-top: 20rpx;
+			border-radius: 20rpx;
+			background-color: #FFFFFF;
+			margin-left: 20rpx;
+			width: 670rpx;
+			display: flex;
+			flex-direction: column;
+			padding: 30rpx 20rpx;
+
+			.list-title {
+				color: #333333;
+				font-size: 28rpx;
+				font-weight: bold;
+			}
+
+			.list-content-detail {
+				margin-top: 14rpx;
+				color: #333333;
+				font-size: 24rpx;
+				line-height: 46rpx;
+			}
+
+		}
+
+	}
+</style>

+ 92 - 0
components/subComponents/dmCalendarView.vue

@@ -0,0 +1,92 @@
+<template>
+	<dm-pop-view ref='popView' title="选择时段" :isShowConfirm="true" :maskTapHide='maskTapHide' @confirm="confirmAction">
+		<view class="content">
+			<uni-calendar 
+				:date = "date==''?startDate:date"
+			    :insert="true"
+			    :lunar="true"
+				:range = "false"
+				:startDate = "afterDate"
+			    :end-date="nowDate"
+			    @change="change"
+			     />
+		</view>
+	</dm-pop-view>
+</template>
+
+<script>
+	import dmPopView from './dmPopView.vue'
+	import uniCalendar from '../uni-calendar/uni-calendar.vue'
+	
+	import moment from '../../static/moment.min.js'
+	export default {
+		props: {
+			maskTapHide: {
+				type: Boolean,
+				default: true
+			},
+			dataList: Array,
+			date: String
+		},
+		data() {
+			return { 
+				nowDate:'',
+				afterDate:'',
+				startDate: '',
+				endDate: ''
+			}
+		},
+		created() {
+			this.startDate = moment().locale('zh-cn').format('YYYY-MM-DD');
+		},
+		methods: {
+			show() {
+				this.$refs.popView.show()
+			},
+			confirmAction() {
+				this.$emit('confirm',this.startDate)
+			},
+			change(e) {
+				this.startDate = e.fulldate;
+			}
+		},
+		components: {
+			dmPopView,
+			uniCalendar
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.content {
+		width: 100%;
+		height: 776rpx;
+		font-family: Verdana;
+		padding-bottom: 100rpx;
+		.list-content {
+			margin-top: 20rpx;
+			border-radius: 20rpx;
+			background-color: #FFFFFF;
+			margin-left: 20rpx;
+			width: 670rpx;
+			display: flex;
+			flex-direction: column;
+			padding: 30rpx 20rpx;
+
+			.list-title {
+				color: #333333;
+				font-size: 28rpx;
+				font-weight: bold;
+			}
+
+			.list-content-detail {
+				margin-top: 14rpx;
+				color: #333333;
+				font-size: 24rpx;
+				line-height: 46rpx;
+			}
+
+		}
+
+	}
+</style>

+ 159 - 0
components/subComponents/dmCheckboxPreView.vue

@@ -0,0 +1,159 @@
+<template>
+	<dm-pop-view ref='popView' :title="title"  :isShowConfirm='true'>
+		<view class="screen_container" >
+			<view class="level_tag_view">
+				<text class="level_tag" v-for="(item, i) in curItem" :key="i">{{item.dicDataName}}</text>
+			</view>
+		</view>
+	</dm-pop-view>
+</template>
+
+<script>
+	import dmPopView from './dmPopView.vue'
+	export default {
+		props: {
+			curItem: Array,
+			title:{
+				type:String,
+				default:'请选择'
+			},
+		},
+		data() {
+			return {
+			}
+		},
+		methods: {
+			show() {
+				this.$refs.popView.show()
+			}
+		},
+		components: {
+			dmPopView
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.pop-pickerView {
+		margin: 40rpx 0;
+		width: 750rpx;
+		height: 300rpx;
+
+		.column-item {
+			height: 80rpx;
+			display: flex;
+			box-sizing: border-box;
+			white-space: nowrap;
+			overflow: hidden;
+			flex-direction: row;
+			align-items: center;
+			justify-content: center;
+		}
+		
+	}
+	
+	.screen_container {
+		display: flex;
+		flex-direction: column;
+		width: 750rpx;
+	
+		.screen_item_title {
+			margin-left: 30rpx;
+			margin-top: 54rpx;
+			line-height: 44rpx;
+			font-size: 32rpx;
+			font-family: Verdana, Verdana-Bold;
+			font-weight: 700;
+			text-align: left;
+			color: #454545;
+		}
+	
+		.level_tag_view {
+			margin-left: 30rpx;
+			margin-top: 20rpx;
+			margin-bottom: 100rpx;
+			display: flex;
+			flex-wrap: wrap;
+			.level_tag {
+				color: #666;
+				margin-bottom: 20rpx;
+				padding: 0rpx 20rpx;
+				margin-right: 30rpx;
+				min-width: 116rpx;
+				height: 56rpx;
+				border-radius: 8rpx;
+				font-size: 28rpx;
+				font-family: Verdana, Verdana-Regular;
+				font-weight: 400;
+				text-align: center;
+				line-height: 56rpx;
+			}
+		}
+	
+		.screen_item_sub {
+			margin-top: 8rpx;
+			margin-bottom: 40rpx;
+			margin-left: 30rpx;
+			line-height: 34rpx;
+			font-size: 24rpx;
+			font-family: Verdana, Verdana-Regular;
+			font-weight: 400;
+			text-align: left;
+			color: #999999;
+		}
+	
+		.score_view {
+			margin-top: 30rpx;
+			margin-bottom: 120rpx;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			height: 82rpx;
+	
+			.score_text {
+				font-size: 70rpx;
+				font-family: 'DIN Alternate', 'DIN Alternate-Bold';
+				font-weight: 700;
+			}
+	
+			.score_unit {
+				padding-top: 25rpx;
+				font-size: 28rpx;
+				font-family: Verdana, Verdana-Regular;
+				font-weight: 400;
+			}
+		}
+	
+		.bottom_btn {
+			display: flex;
+			justify-content: center;
+			margin-bottom: 60rpx;
+	
+			.reset_btn {
+				width: 156rpx;
+				height: 80rpx;
+				border-radius: 40rpx;
+				font-size: 28rpx;
+				font-family: Verdana, Verdana-Bold;
+				font-weight: 700;
+				text-align: center;
+				line-height: 80rpx;
+				color: #666666;
+			}
+	
+			.pop_btn {
+				margin-left: 30rpx;
+				width: 444rpx;
+				height: 80rpx;
+				border-radius: 40rpx;
+				font-size: 28rpx;
+				font-family: Verdana, Verdana-Bold;
+				font-weight: 700;
+				text-align: center;
+				line-height: 80rpx;
+				color: #ffffff;
+			}
+		}
+	}
+	
+</style>

+ 223 - 0
components/subComponents/dmCheckboxView.vue

@@ -0,0 +1,223 @@
+<template>
+	<dm-pop-view ref='popView' title="更多筛选"  :isShowConfirm='false'>
+		<view class="screen_container" >
+			<text class="screen_item_title">{{title}}</text>
+			<view class="level_tag_view">
+				<text class="level_tag" v-for="(item, i) in curOptions" :key="i"  :style="{ color: item.isSelected ? '#fff' : '#666', 'background-color': item.isSelected ? themeColor : '#fff' }"
+				  @click="chooseTags(item, i)">
+					{{item.name}}
+				</text>
+			</view>
+			<view class="bottom_btn">
+				<text class="reset_btn" :style="{'background-color':themeColor25}" @click="resetAction">重置</text>
+				<text class="pop_btn" :style="{'background-color':themeColor}" @click="popConfirm">确定</text>
+			</view>
+		</view>
+	</dm-pop-view>
+</template>
+
+<script>
+	import dmPopView from './dmPopView.vue'
+	export default {
+		props: {
+			options: Array,
+			curItem: Array,
+			items:Array,
+			value: [String, Number],
+			title:{
+				type:String,
+				default:'请选择'
+			},
+		},
+		data() {
+			return {
+				oldSelectItem: [],
+				selectItem: [],
+				curOptions: [],
+				selIdx: 0,
+				themeColor:'',
+				themeColor25:''
+			}
+		},
+		watch:{
+			items(newVal,oldVal){
+				if(this.curOptions.length==0){
+					this.curOptions = newVal;
+				}
+			},
+			selectItem(newVal,oldVal){
+				var tempOptions = [];
+				for(let index in this.curOptions){
+					var option = this.curOptions[index];
+					const temp = newVal.findIndex(item=> option.id==item.dicDataId);
+					option.isSelected = (temp != -1 ? true : false);
+					tempOptions.push(option);
+				}
+				this.curOptions = tempOptions;
+			}	
+		},
+		mounted() {
+			let globalData = getApp().globalData
+			this.themeColor = globalData.themeColor
+			this.themeColor25 = globalData.themeColor25
+		},
+		methods: {
+			show() {
+				this.$refs.popView.show()
+				var oldItemTemp = JSON.stringify(this.curItem);
+				var oldItem = JSON.parse(oldItemTemp);
+				// console.log("XXXXXXXX", oldItemTemp, oldItem)
+				this.selectItem = oldItem;
+				this.oldSelectItem = oldItem;
+			},
+			popConfirm() { // 确定
+			// console.log("确定",this.selectItem)
+				this.$emit('confirm', {
+					'selItems': this.selectItem,
+				})
+				this.$refs.popView.hide()
+			},
+			resetAction(e) { // 重置
+				var oldItemTemp = JSON.stringify(this.curItem);
+				var oldItem = JSON.parse(oldItemTemp);
+				this.selectItem = [];
+			},
+			chooseTags(subitem, idx){ // 选择
+				this.seltag = idx;
+				const temp = this.selectItem.findIndex(item=> subitem.id==item.dicDataId);
+				if(temp!=-1){
+					this.selectItem.splice(temp, 1)
+				}else{
+					this.selectItem.push({"dicDataId":subitem.id, "dicDataName":subitem.name});
+				}
+			}
+		},
+		components: {
+			dmPopView
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.pop-pickerView {
+		margin: 40rpx 0;
+		width: 750rpx;
+		height: 300rpx;
+
+		.column-item {
+			height: 80rpx;
+			display: flex;
+			box-sizing: border-box;
+			white-space: nowrap;
+			overflow: hidden;
+			flex-direction: row;
+			align-items: center;
+			justify-content: center;
+		}
+		
+	}
+	
+	.screen_container {
+		display: flex;
+		flex-direction: column;
+		width: 750rpx;
+	
+		.screen_item_title {
+			margin-left: 30rpx;
+			margin-top: 54rpx;
+			line-height: 44rpx;
+			font-size: 32rpx;
+			font-family: Verdana, Verdana-Bold;
+			font-weight: 700;
+			text-align: left;
+			color: #454545;
+		}
+	
+		.level_tag_view {
+			margin-left: 30rpx;
+			margin-top: 20rpx;
+			margin-bottom: 100rpx;
+			display: flex;
+			flex-wrap: wrap;
+			.level_tag {
+				margin-bottom: 20rpx;
+				padding: 0rpx 20rpx;
+				margin-right: 30rpx;
+				min-width: 116rpx;
+				height: 56rpx;
+				border-radius: 8rpx;
+				font-size: 28rpx;
+				font-family: Verdana, Verdana-Regular;
+				font-weight: 400;
+				text-align: center;
+				line-height: 56rpx;
+			}
+		}
+	
+		.screen_item_sub {
+			margin-top: 8rpx;
+			margin-bottom: 40rpx;
+			margin-left: 30rpx;
+			line-height: 34rpx;
+			font-size: 24rpx;
+			font-family: Verdana, Verdana-Regular;
+			font-weight: 400;
+			text-align: left;
+			color: #999999;
+		}
+	
+		.score_view {
+			margin-top: 30rpx;
+			margin-bottom: 120rpx;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			height: 82rpx;
+	
+			.score_text {
+				font-size: 70rpx;
+				font-family: 'DIN Alternate', 'DIN Alternate-Bold';
+				font-weight: 700;
+			}
+	
+			.score_unit {
+				padding-top: 25rpx;
+				font-size: 28rpx;
+				font-family: Verdana, Verdana-Regular;
+				font-weight: 400;
+			}
+		}
+	
+		.bottom_btn {
+			display: flex;
+			justify-content: center;
+			margin-bottom: 60rpx;
+	
+			.reset_btn {
+				width: 156rpx;
+				height: 80rpx;
+				border-radius: 40rpx;
+				font-size: 28rpx;
+				font-family: Verdana, Verdana-Bold;
+				font-weight: 700;
+				text-align: center;
+				line-height: 80rpx;
+				color: #666666;
+			}
+	
+			.pop_btn {
+				margin-left: 30rpx;
+				width: 444rpx;
+				height: 80rpx;
+				border-radius: 40rpx;
+				font-size: 28rpx;
+				font-family: Verdana, Verdana-Bold;
+				font-weight: 700;
+				text-align: center;
+				line-height: 80rpx;
+				color: #ffffff;
+			}
+		}
+	}
+	
+</style>

+ 489 - 0
components/subComponents/dmChengjiao2Screen.vue

@@ -0,0 +1,489 @@
+<template>
+	<dm-pop-view ref='popView' title="筛选" :isShowConfirm="false" :maskTapHide='true'>
+		<scroll-view class="screen_container" scroll-y="true">
+			<dm-time-level-screen :isChengjiao2="true" :sortType="sortType" :queryDateType="queryDateType" @queryDateTypeAction="queryDateTypeAction" @sortTypeAction="sortTypeAction"></dm-time-level-screen>
+			<dm-date-screen style="margin-top: 40rpx;" :defaultParameter="tempDefaultParameter" @screenDateAction="screenDateAction"></dm-date-screen>
+			<view class="screen_item_title">成交进度</view>
+			<view class="level_tag_view">
+				<text class="level_tag" :style="{ color: item.isSelect ? '#fff' : '#666', 'background-color': item.isSelect ? themeColor : '#F1F5F9' }"
+				 v-for="(item, i) in progressList" :key="i" @click="selectProgress(item)">
+					<view class="level_tag_title">
+						{{ item.title }}
+					</view>
+					<view class="level_tag_subTitle" v-if="item.subTitle!=null">
+						({{item.subTitle}})
+					</view>
+				</text>
+			</view>
+			<view class="screen_item_title">成交业态</view>
+			<view class="level_tag_view">
+				<view class="level_tag" :style="{ color: item.isSelect ? '#fff' : '#666', 'background-color': item.isSelect ? themeColor : '#F1F5F9' }"
+				 v-for="(item, i) in yetaiList" :key="i" @click="selectYetai(item)">
+					<view class="level_tag_title">
+						{{ item.title }}
+					</view>
+					<view class="level_tag_subTitle" v-if="item.subTitle!=null">
+						({{item.subTitle}})
+					</view>
+				</view>
+			</view>
+			<view class="screen_item_title">成交构成</view>
+			<view class="level_tag_view">
+				<text class="level_tag" :style="{ color: item.isSelect ? '#fff' : '#666', 'background-color': item.isSelect ? themeColor : '#F1F5F9' }"
+				 v-for="(item, i) in gouchengList" :key="i" @click="selectGoucheng(item)">
+					<view class="level_tag_title">
+						{{ item.title }}
+					</view>
+					<view class="level_tag_subTitle" v-if="item.subTitle!=null">
+						({{item.subTitle}})
+					</view>
+				</text>
+			</view>
+			<view class="reportOrganize" @click="selectChengjiaoType" v-if="formType == 2 || formType == 3">
+				<view class="organizeName">
+					{{formTypeResponseSelect != null ? formTypeResponseSelect.title : formType == 2 ? '请选择推荐成交类型': '请选择报备成交类型'}}
+				</view>
+				<image class="organizeIcon" src="../../static/icons/icon_aboutUs_DropDown.png" mode=""></image>
+			</view>
+		</scroll-view>
+		<dm-picker-view ref="formTypeResponsePicker" :options="formTypeResponse" :value="formTypeResponseSelect != null ? formTypeResponseSelect.value : 0" :title="formType == 2 ? '请选择推荐成交类型': '请选择报备成交类型'" @confirm="confirmAction"></dm-picker-view>
+		<view class="bottom_btn" style="margin-top: 60rpx;">
+			<text class="reset_btn" :style="{'background-color':themeColor25}" @click="resetAction">重置</text>
+			<text class="pop_btn" :style="{'background-color':themeColor}" @click="sureAction">确定</text>
+		</view>
+	</dm-pop-view>
+</template>
+
+<script>
+	import dmPopView from './dmPopView.vue'
+	import dmPickerView from './dmPickerView.vue'
+	import dmTimeLevelScreen from './dmTimeLevelScreen.vue'
+	import dmDateScreen from './dmDateScreen.vue'
+	let app = getApp();
+	
+	export default {
+		props: {
+			houseId: {
+				type: [String, Number],
+				default: ''
+			},
+			defaultParameter: Object,
+			sortSel: [Number, String],
+			timeLevelSel: [Number, String]
+		},
+		data() {
+			return {
+				themeColor: null,
+				fuzhuColor: null,
+				themeColor50: null,
+				themeColor25: null,
+				fuzhuColor50: null,
+				progressList: [], // 成交进度
+				yetaiList: [], // 成交业态
+				gouchengList: [] ,// 成交构成
+				formTypeResponse: [],
+				changjiaoTypeList: [],
+				formTypeResponseSelect: null,
+				formType: 0,
+				sortType: 0,
+				queryDateType: 0,
+				tempDefaultParameter: null
+			}
+		},
+		mounted() {
+			this.themeColor = app.globalData.themeColor
+			this.themeColor50 = app.globalData.themeColor50
+			this.themeColor25 = app.globalData.themeColor25
+			this.fuzhuColor = app.globalData.fuzhuColor
+			this.fuzhuColor50 = app.globalData.fuzhuColor50
+			
+			this.resetAction()
+		},
+		methods: {
+			show() {
+				this.$refs.popView.show()
+			},
+			// 正序、倒叙
+			sortTypeAction(e) {
+				// this.$emit('sortTypeAction', e)
+				// debugger
+				this.sortType = e
+			},
+			// 选择时间维度(条件)
+			queryDateTypeAction(e) {
+				// this.$emit('queryDateTypeAction', e)
+				this.queryDateType = e
+			},
+			// 选择时间
+			screenDateAction(val, start, end) {
+				// this.$emit('screenDateAction', val, start, end)
+				this.tempDefaultParameter = {
+					value: this.tempDefaultParameter.value,
+					dateType: val,
+					startDate: start,
+					endDate: end,
+					terminal: this.tempDefaultParameter.terminal
+				}
+			},
+			selectProgress(e) {
+				if (e.value == 0) {
+					this.progressList.forEach((item) => {
+						item.isSelect = false
+					})
+					this.progressList[0].isSelect = true
+				}
+				else {
+					this.progressList[0].isSelect = false
+					var isHave = false
+					this.progressList.forEach((item, idx) => {
+						if (e.value == item.value) {
+							item.isSelect = !item.isSelect
+						}
+						if (item.isSelect) {
+							isHave = true
+						}
+					})
+					if (!isHave) {
+						this.progressList[0].isSelect = true
+					}
+				}
+			},
+			selectYetai(e) {
+				if (e.value == 0) {
+					this.yetaiList.forEach((item) => {
+						item.isSelect = false
+					})
+					this.yetaiList[0].isSelect = true
+				}
+				else {
+					this.yetaiList[0].isSelect = false
+					var isHave = false
+					this.yetaiList.forEach((item, idx) => {
+						if (e.value == item.value) {
+							item.isSelect = !item.isSelect
+						}
+						if (item.isSelect) {
+							isHave = true
+						}
+					})
+					if (!isHave) {
+						this.yetaiList[0].isSelect = true
+					}
+				}
+			},
+			selectGoucheng(e) {
+				var self = this
+				this.gouchengList.forEach((item, idx) => {
+					item.isSelect = false
+					if (e.value == item.value) {
+						item.isSelect = true
+						self.formType = item.value
+						self.formTypeResponseSelect = null
+						if (item.value == 2 || item.value == 3) {
+							self.getDealFormTips(item.value)
+						}
+					}
+				})
+			},
+			async getDealFormTips(type) {
+				var tempformType = 1
+				if (type == 2) { // 推荐成交
+					tempformType = 1
+				}
+				else {// 报备成交
+					tempformType = 2 
+				}
+				let res = await this.$myRequest({
+					url: '/elab-marketing-user/dealLedger/getDealFormTips',
+					data: {
+						houseId: this.houseId,
+						formType: tempformType,
+						dateType: this.defaultParameter.dateType,
+						mindate: this.defaultParameter.startDate,
+						maxdate: this.defaultParameter.endDate,
+						timeDimension: this.queryDateType
+					}
+				})
+				if (res.data.success && res.data.single) {
+					this.formTypeResponse = res.data.single.formTypeResponse || []
+					if (res.data.single.showXsxcx == 1) {
+						var dic = {
+							relationMess: "线上小程序用户",
+							relationOrganizeName: '',
+							relationOrganizeType: ''
+						}
+						this.formTypeResponse.push(dic)
+					}
+					this.formTypeResponse.forEach((item, idx) => {
+						item['title'] = item.relationMess
+						item['value'] = idx
+					})
+					this.$forceUpdate()		
+				}
+				
+			},
+			
+			selectChengjiaoType() {
+				this.$refs.formTypeResponsePicker.show()
+			},
+			
+			confirmAction(e) {
+				console.log('选择类型:', e)
+				this.formTypeResponseSelect = e.selItem
+			},
+			
+			resetAction() {
+				this.progressList = [
+						{title: '全部', isSelect: true, value: 0},
+						{title: '认购', isSelect: false, value: 1},
+						{title: '签约', isSelect: false, value: 2},
+						{title: '已结首付', isSelect: false, value: 3},
+						{title: '已结全款', isSelect: false, value: 4},
+						{title: '已退房', isSelect: false, value: 6},
+					]
+				this.yetaiList = [
+						{title: '全部', isSelect: true, value: 0},
+						{title: '住宅', isSelect: false, value: 1},
+						{title: '公寓', isSelect: false, value: 2},
+						{title: '商业', isSelect: false, value: 3},
+						{title: '写字楼', isSelect: false, value: 4},
+						{title: '公共配套', isSelect: false, value: 5},
+						{title: '地下室', subTitle: '不含车位', isSelect: false, value: 6},
+						{title: '政策住宅', isSelect: false, value: 7},
+						{title: '车位', isSelect: false, value: 8},
+						{title: '其他', isSelect: false, value: 9},
+					]
+				this.gouchengList = [
+						{title: '全部', isSelect: true, value: 0},
+						{title: '其他自然成交', isSelect: false, value: 1},
+						{title: '推荐成交', isSelect: false, value: 2},
+						{title: '报备成交', isSelect: false, value: 3},
+						{title: '线上自然成交', isSelect: false, value: 4},
+						{title: '自然到访成交', isSelect: false, value: 5},
+					]
+					
+				this.formTypeResponseSelect = null
+				this.formTypeResponse = []
+				this.tempDefaultParameter = JSON.parse(JSON.stringify(this.defaultParameter))
+				this.sortType = this.sortSel
+				this.queryDateType = this.timeLevelSel
+			},
+			sureAction() {
+				var transactionProgressList = []
+				this.progressList.forEach((item) => {
+					if (item.isSelect) {
+						transactionProgressList.push(item.value)
+					}
+				})
+				var productTypeList = []
+				this.yetaiList.forEach((item) => {
+					if (item.isSelect) {
+						productTypeList.push(item.value)
+					}
+				})
+				var screenParmas = {
+					timeLevelSel: this.queryDateType,
+					sortSel: this.sortType,
+					defaultParameter: this.tempDefaultParameter,
+					//成交进度
+					transactionProgress: transactionProgressList || [0],
+					// 成交业态
+					productType: productTypeList || [0],
+					// 成交构成
+					formType: this.formType,
+					
+					relationOrganizeName: this.formTypeResponseSelect != null ? this.formTypeResponseSelect.relationOrganizeName : null,
+					
+					relationOrganizeType: this.formTypeResponseSelect != null ? this.formTypeResponseSelect.relationOrganizeType : null,
+				}
+				this.$emit('screenAction', screenParmas)
+				this.$refs.popView.hide()
+			}
+		},
+		components: {
+			dmPopView,
+			dmPickerView,
+			dmTimeLevelScreen,
+			dmDateScreen
+		},
+		watch: {
+			defaultParameter: {
+				handler(e) {
+					this.tempDefaultParameter = JSON.parse(JSON.stringify(e))
+					if (this.formType == 2 || this.formType == 3) {
+						self.getDealFormTips(this.formType)
+					}
+				},
+				deep: true,
+				immediate: true
+			},
+			timeLevelSel: {
+				handler(e) {
+					this.queryDateType = e
+					this.$forceUpdate()
+				},
+				immediate: true
+			},
+			sortSel: {
+				handler(e) {
+					this.sortType = e
+					this.$forceUpdate()
+				},
+				immediate: true
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.screen_container {
+		position: relative;
+		margin-bottom: 190rpx;
+		width: 750rpx;
+		max-height: 1000rpx;
+		
+
+		.screen_item_title {
+			margin-left: 30rpx;
+			margin-top: 54rpx;
+			line-height: 44rpx;
+			font-size: 32rpx;
+			font-family: Verdana, Verdana-Bold;
+			font-weight: 700;
+			text-align: left;
+			color: #454545;
+		}
+
+		.level_tag_view {
+			margin-left: 30rpx;
+			margin-top: 0rpx;
+			display: flex;
+			flex-wrap: wrap;
+
+			.level_tag {
+				margin-right: 16rpx;
+				width: 220rpx;
+				height: 72rpx;
+				border-radius: 12rpx;
+				margin-top: 20rpx;
+				display: flex;
+				flex-direction: column;
+				justify-content: center;
+				align-items: center;
+				
+				.level_tag_title {
+					font-size: 28rpx;
+					font-family: Verdana, Verdana-Regular;
+					font-weight: 400;
+					text-align: center;
+				}
+				
+				.level_tag_subTitle {
+					margin-top: -5rpx;
+					font-size: 20rpx;
+					font-family: Verdana, Verdana-Regular;
+					font-weight: 400;
+					text-align: center;
+				}
+			}
+		}
+
+		.reportOrganize {
+			margin-top: 20rpx;
+			margin-left: 30rpx;
+			margin-right: 30rpx;
+			padding: 0 30rpx;
+			box-sizing: border-box;
+			border-radius: 16rpx;
+			background-color: #F1F5F9;
+			height: 94rpx;
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+			line-height: 94rpx;
+
+			.organizeName {
+				font-size: 28rpx;
+				font-family: Verdana, Verdana-Regular;
+				font-weight: 400;
+				text-align: left;
+				color: #666666;
+
+			}
+
+			.organizeIcon {
+				width: 14rpx;
+				height: 9rpx;
+			}
+		}
+
+		.screen_item_sub {
+			margin-top: 8rpx;
+			margin-bottom: 40rpx;
+			margin-left: 30rpx;
+			line-height: 34rpx;
+			font-size: 24rpx;
+			font-family: Verdana, Verdana-Regular;
+			font-weight: 400;
+			text-align: left;
+			color: #999999;
+		}
+
+		.score_view {
+			margin-top: 30rpx;
+			margin-bottom: 120rpx;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			height: 82rpx;
+
+			.score_text {
+				font-size: 70rpx;
+				font-family: 'DIN Alternate', 'DIN Alternate-Bold';
+				font-weight: 700;
+			}
+
+			.score_unit {
+				padding-top: 25rpx;
+				font-size: 28rpx;
+				font-family: Verdana, Verdana-Regular;
+				font-weight: 400;
+			}
+		}
+
+	}
+	.bottom_btn {
+		display: flex;
+		justify-content: center;
+		position: fixed;
+		width: 100%;
+		left: 0;
+		bottom: 60rpx;
+	
+		.reset_btn {
+			width: 156rpx;
+			height: 80rpx;
+			border-radius: 40rpx;
+			font-size: 28rpx;
+			font-family: Verdana, Verdana-Bold;
+			font-weight: 700;
+			text-align: center;
+			line-height: 80rpx;
+			color: #666666;
+		}
+	
+		.pop_btn {
+			margin-left: 30rpx;
+			width: 444rpx;
+			height: 80rpx;
+			border-radius: 40rpx;
+			font-size: 28rpx;
+			font-family: Verdana, Verdana-Bold;
+			font-weight: 700;
+			text-align: center;
+			line-height: 80rpx;
+			color: #ffffff;
+		}
+	}
+		
+</style>

+ 78 - 0
components/subComponents/dmCustLevelDesPicker.vue

@@ -0,0 +1,78 @@
+<template>
+	<dm-pop-view ref='popView' title="顾问等级" :isShowConfirm="false" :maskTapHide='maskTapHide'>
+		<view class="content">
+			<view class="list-content" v-for="(item, index) in dataList" :key="index">
+				<text class="list-title">{{item.value}}</text>
+				<text class="list-content-detail">{{item.remark}}</text>
+			</view>
+		</view>
+	</dm-pop-view>
+</template>
+
+<script>
+	import dmPopView from './dmPopView.vue'
+
+	export default {
+		props: {
+			maskTapHide: {
+				type: Boolean,
+				default: true
+			},
+			dataList: Array,
+		},
+		data() {
+			return {
+				
+			}
+		},
+		mounted() {
+
+		},
+		methods: {
+			show() {
+				this.$refs.popView.show()
+
+			},
+			confirmAction() {
+				this.$emit('confirmGoExport')
+			}
+		},
+		components: {
+			dmPopView
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.content {
+		width: 100%;
+		height: 676rpx;
+		font-family: Verdana;
+
+		.list-content {
+			margin-top: 20rpx;
+			border-radius: 20rpx;
+			background-color: #FFFFFF;
+			margin-left: 20rpx;
+			width: 670rpx;
+			display: flex;
+			flex-direction: column;
+			padding: 30rpx 20rpx;
+
+			.list-title {
+				color: #333333;
+				font-size: 28rpx;
+				font-weight: bold;
+			}
+
+			.list-content-detail {
+				margin-top: 14rpx;
+				color: #333333;
+				font-size: 24rpx;
+				line-height: 46rpx;
+			}
+
+		}
+
+	}
+</style>

+ 228 - 0
components/subComponents/dmDateScreen.vue

@@ -0,0 +1,228 @@
+<template>
+	<view class="dateContainer">
+		<view class="topSection">
+			<view class="title">{{title}}</view>
+			<view class="dateItems">
+				<view class="item" v-for="(item, idx) in dateItems" :key="idx" :style="`color: ${item.value == defaultParameter.dateType ? '#454545' : '#999999'};`"
+				 @click="screenAction(item.value)">
+					{{item.title}}
+				</view>
+			</view>
+		</view>
+		<view class="botttomSection" @click="screenAction(4)">
+			<view class="bottomItem">
+				<view class="leftText">起</view>
+				<view class="dateText">{{beginDate | visitTimeFilter}}</view>
+				<image class="rightIcon" src="../../static/icons/more.png" mode=""></image>
+			</view>
+			<view class="bottomItem">
+				<view class="leftText">终</view>
+				<view class="dateText">{{endDate | visitTimeFilter}}</view>
+				<image class="rightIcon" src="../../static/icons/more.png" mode=""></image>
+			</view>
+		</view>
+
+		<dm-calendar-picker-view ref='calendarPickerView' @confirmSelDate='confirmSelDate'></dm-calendar-picker-view>
+	</view>
+</template>
+
+<script>
+	import dmCalendarPickerView from './dmCalendarPickerView.vue'
+	import moment from '../../static/moment.min.js'
+	import {
+		displayDateFormatChi
+	} from '../../static/format.js'
+
+	export default {
+		props: {
+			title: {
+				type: String,
+				default: '筛选日期'
+			},
+			defaultParameter: {
+				type: Object,
+				default () {
+					return {
+						'dateType': '1',
+						'startDate': '',
+						'endDate': '',
+						'terminal': '0'
+					}
+				}
+			},
+			modelValue: {
+				type: [Number, String],
+				default: '0'
+			},
+		},
+		data() {
+			return {
+				dateItems: [{
+						title: '今日',
+						value: 1
+					},
+					{
+						title: '近7日',
+						value: 2
+					},
+					{
+						title: '近30天',
+						value: 3
+					},
+				],
+				beginDate: null,
+				endDate: null
+			}
+		},
+		mounted() {
+
+		},
+		methods: {
+			screenAction(val) {
+				if (val < 4) {
+					this.$emit('screenDateAction', val)
+				} else {
+					this.$refs.calendarPickerView.show()
+				}
+			},
+
+			confirmSelDate(e) {
+				const startDate = e.startDate;
+				const endDate = e.endDate;
+				var start = ''
+				var end = ''
+				if (moment(startDate).isBefore(endDate)) {
+					start = startDate;
+					end = endDate;
+				} else {
+					start = endDate;
+					end = startDate;
+				}
+
+				this.$emit('screenDateAction', 4, start, end)
+			},
+
+			displayDate() {
+				var dateType = parseInt(this.defaultParameter.dateType)
+				let curDate = (new Date()).getTime();
+				this.beginDate = null
+				this.endDate = null
+
+				if (dateType == 1) {
+					this.beginDate = curDate
+					this.endDate = curDate
+				} else if (dateType == 2) {
+					this.endDate = curDate
+					this.beginDate = this.getBeginDate(6)
+				} else if (dateType == 3) {
+					this.endDate = curDate
+					this.beginDate = this.getBeginDate(29)
+				} else if (dateType == 4) {
+					this.beginDate = this.stringToStamp(this.defaultParameter.startDate)
+					this.endDate = this.stringToStamp(this.defaultParameter.endDate)
+				}
+			},
+
+			getBeginDate(days) {
+				let curDate = (new Date()).getTime();
+				let beginDay = curDate - days * 24 * 60 * 60 * 1000
+				return beginDay
+			},
+			stringToStamp(val) {
+				// var timeStr = val.replace('-', '/') + ' ' + '00:00:00'
+				var timeStr = val.replace(/-/g,'/') + " " + '00:00:00'
+				var stamp = new Date(timeStr).getTime()
+				return stamp
+			}
+		},
+
+		filters: {
+			visitTimeFilter(val) {
+				return displayDateFormatChi(val)
+			},
+		},
+		watch: {
+			defaultParameter: {
+				handler(e) {
+					this.displayDate()
+				},
+				deep: true,
+				immediate: true
+			}
+		},
+		components: {
+			dmCalendarPickerView
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.dateContainer {
+		width: 100%;
+		font-family: Verdana;
+		padding: 0 30rpx;
+		box-sizing: border-box;
+
+		.topSection {
+			width: 100%;
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+
+			.title {
+				color: #454545;
+				font-size: 32rpx;
+				font-weight: bold;
+			}
+
+			.dateItems {
+				display: flex;
+				justify-content: flex-end;
+				font-size: 28rpx;
+				color: #999999;
+
+				.item {
+					margin-left: 20rpx;
+				}
+			}
+		}
+
+		.botttomSection {
+			background-color: #F1F5F9;
+			border-radius: 16rpx;
+			width: 100%;
+			height: 94rpx;
+			display: flex;
+			justify-content: space-between;
+			padding: 0 30rpx;
+			box-sizing: border-box;
+			margin-top: 22rpx;
+
+			.bottomItem {
+				display: flex;
+				justify-content: flex-start;
+				align-items: center;
+
+				.leftText {
+					color: #999999;
+					font-size: 28rpx;
+					font-weight: bold;
+					margin-right: 12rpx;
+				}
+
+				.dateText {
+					color: #333333;
+					font-size: 28rpx;
+					margin-right: 20rpx;
+				}
+
+				.rightIcon {
+					width: 15rpx;
+					height: 24rpx;
+				}
+
+			}
+		}
+
+	}
+</style>

+ 235 - 0
components/subComponents/dmDfJyScreenPicker.vue

@@ -0,0 +1,235 @@
+<template>
+	<dm-pop-view ref="popView" title="更多筛选" :isShowConfirm="false" :maskTapHide="true">
+		<scroll-view class="screen_container" scroll-y="true">
+			<view class="screen_item_title" v-if='isSingleProject && roleType != 12'>选择报备组织</view>
+			<view class="reportOrganize" @click="openReportOrganizePicker">
+				<view class="organizeName">
+					{{holdReportOrganize.title}}
+				</view>
+				<image class="organizeIcon" src="../../static/icons/icon_aboutUs_DropDown.png" mode=""></image>
+			</view>
+			<view class="screen_item_title">报备方式</view>
+			<view class="level_tag_view">
+				<text class="level_tag" :style="{ color: holdReportType == item.value ? '#fff' : '#666', 'background-color': holdReportType == item.value ? themeColor : '#F1F5F9' }"
+				 v-for="(item, i) in reportTypeList" :key="i" @click="chooseType(item)">
+					{{ item.title }}
+				</text>
+			</view>
+			<view class="screen_item_title" v-if="false">报备状态</view>
+			<view class="level_tag_view" v-if="false">
+				<text class="level_tag" :style="{ color: holdReportState == item.value ? '#fff' : '#666', 'background-color': holdReportState == item.value ? themeColor : '#F1F5F9' }"
+				 v-for="(item, i) in reportStateList" :key="i" @click="chooseState(item)">
+					{{ item.title }}
+				</text>
+			</view>
+			<view class="bottom_btn" style="margin-top: 60rpx;">
+				<text class="reset_btn" :style="{'background-color':themeColor25}" @click="resetAction">重置</text>
+				<text class="pop_btn" :style="{'background-color':themeColor}" @click="sureAction">确定</text>
+			</view>
+			
+			<dm-picker-view ref="reportOrganizePicker" :options="reportOrganizeList" :value="holdReportOrganize.value" title="选择报备组织" @confirm="confirmReportOrganize"></dm-picker-view>
+		</scroll-view>
+	</dm-pop-view>
+</template>
+
+<script>
+	import dmPopView from './dmPopView.vue'
+	import dmPickerView from './dmPickerView.vue'
+	
+	export default {
+		props: {
+			isSingleProject: {
+				type: Boolean,
+				default: true
+			},
+			roleType: {
+				type: [Number, String],
+				default: '0'
+			},
+			holdReportOrganize: Object,
+			holdReportType: String,
+			holdReportState: String,
+			reportTypeList: Array,
+			reportStateList: Array,
+			reportOrganizeList: Array
+		},
+		data() {
+			return {
+				themeColor: '',
+				fuzhuColor: '',
+				themeColor50: '',
+				themeColor25: '',
+				fuzhuColor50: '',
+			}
+		},
+		mounted() {
+			let globalData = getApp().globalData
+			this.themeColor = globalData.themeColor
+			this.themeColor50 = globalData.themeColor50
+			this.themeColor25 = globalData.themeColor25
+			this.fuzhuColor = globalData.fuzhuColor
+			this.fuzhuColor50 = globalData.fuzhuColor50
+		},
+		methods: {
+			show() {
+				this.$refs.popView.show()
+			},
+			openReportOrganizePicker() {
+				this.$refs.reportOrganizePicker.show()
+			},
+			chooseType(item) {
+				this.$emit('chooseType', item)
+			},
+			chooseState(item) {
+				this.$emit('chooseState', item)
+			},
+			confirmReportOrganize(e) {
+				this.$emit('confirmReportOrganize', e)
+			},
+			resetAction() {
+				this.$refs.popView.hide()
+				this.$emit('resetAction')
+			},
+			sureAction() {
+				this.$refs.popView.hide()
+				this.$emit('sureAction')
+			}
+		},
+		components: {
+			dmPopView,
+			dmPickerView
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.screen_container {
+		// display: flex;
+		// flex-direction: column;
+		position: relative;
+		margin-bottom: 50rpx;
+		width: 750rpx;
+		height: 760rpx;
+
+		.screen_item_title {
+			margin-left: 30rpx;
+			margin-top: 54rpx;
+			line-height: 44rpx;
+			font-size: 32rpx;
+			font-family: Verdana, Verdana-Bold;
+			font-weight: 700;
+			text-align: left;
+			color: #454545;
+		}
+
+		.level_tag_view {
+			margin-left: 30rpx;
+			margin-top: 0rpx;
+			display: flex;
+			flex-wrap: wrap;
+
+			.level_tag {
+				margin-right: 16rpx;
+				width: 220rpx;
+				height: 72rpx;
+				border-radius: 12rpx;
+				font-size: 28rpx;
+				font-family: Verdana, Verdana-Regular;
+				font-weight: 400;
+				text-align: center;
+				line-height: 72rpx;
+				margin-top: 20rpx;
+			}
+		}
+
+		.reportOrganize {
+			margin-top: 20rpx;
+			margin-left: 30rpx;
+			margin-right: 30rpx;
+			padding: 0 30rpx;
+			box-sizing: border-box;
+			border-radius: 16rpx;
+			background-color: #F1F5F9;
+			height: 94rpx;
+			display: flex;
+			justify-content: space-between;
+			align-items: center;
+			line-height: 94rpx;
+
+			.organizeName {
+				font-size: 28rpx;
+				font-family: Verdana;
+			}
+
+			.organizeIcon {
+				width: 14rpx;
+				height: 9rpx;
+			}
+		}
+
+		.screen_item_sub {
+			margin-top: 8rpx;
+			margin-bottom: 40rpx;
+			margin-left: 30rpx;
+			line-height: 34rpx;
+			font-size: 24rpx;
+			font-family: Verdana, Verdana-Regular;
+			font-weight: 400;
+			text-align: left;
+			color: #999999;
+		}
+
+		.score_view {
+			margin-top: 30rpx;
+			margin-bottom: 120rpx;
+			display: flex;
+			justify-content: center;
+			align-items: center;
+			height: 82rpx;
+
+			.score_text {
+				font-size: 70rpx;
+				font-family: 'DIN Alternate', 'DIN Alternate-Bold';
+				font-weight: 700;
+			}
+
+			.score_unit {
+				padding-top: 25rpx;
+				font-size: 28rpx;
+				font-family: Verdana, Verdana-Regular;
+				font-weight: 400;
+			}
+		}
+
+		.bottom_btn {
+			display: flex;
+			justify-content: center;
+			margin-bottom: 60rpx;
+
+			.reset_btn {
+				width: 156rpx;
+				height: 80rpx;
+				border-radius: 40rpx;
+				font-size: 28rpx;
+				font-family: Verdana, Verdana-Bold;
+				font-weight: 700;
+				text-align: center;
+				line-height: 80rpx;
+				color: #666666;
+			}
+
+			.pop_btn {
+				margin-left: 30rpx;
+				width: 444rpx;
+				height: 80rpx;
+				border-radius: 40rpx;
+				font-size: 28rpx;
+				font-family: Verdana, Verdana-Bold;
+				font-weight: 700;
+				text-align: center;
+				line-height: 80rpx;
+				color: #ffffff;
+			}
+		}
+	}
+</style>

+ 139 - 0
components/subComponents/dmDfMethod.vue

@@ -0,0 +1,139 @@
+<template>
+	<dm-pop-view ref='popView' :isShowTitle="false" :isShowClose="false" :isShowConfirm="false" :maskTapHide='maskTapHide'>
+		<view class="content" v-if="info">
+			<view class="content-des">是否确定判定客户{{mobile}}归属为:{{info.isZrSf?'案场自然获客':info.reporterOrganizeName+info.reporterName+"-"+info.reporterHiddenMobile}}</view>
+			<view class="time_content" v-if="!info.isZrSf && info.reportTimeDate">{{info.isRecommendRelation?"推荐时间":"报备时间"}}{{info.reportTimeDate|dateFormatFilter}}</view>
+			<view class="content_desc">(确定后其他所有报备关系自动失效,客户归类为{{info.isZrSf?'案场自然获客':(info.isRecommendRelation?'当前推荐获客':'当前渠道获客')}})</view>
+			<view class="goBtn" :style="`background-color: ${themeColor};`" @click="confirmAction">{{confirmStr}}</view>
+			<view class="knowBtn" @click="knowAction">{{cancelStr}}</view>
+		</view>
+	</dm-pop-view>
+</template>
+
+<script>
+	import dmPopView from './dmPopView.vue'
+	
+	let app = getApp();
+	import {
+		dateFormat,
+		mobileFormat
+	} from "../../static/format.js"
+	export default {
+		props: {
+			maskTapHide: {
+				type: Boolean,
+				default: true
+			},
+			confirmStr: {
+				type: String,
+				default: '确认'
+			},
+			cancelStr: {
+				type: String,
+				default: '取消'
+			},
+			info:Object,
+			mobile:String
+		},
+		data() {
+			return {
+				themeColor: null,
+				fuzhuColor: null,
+				themeColor50: null,
+				themeColor25: null,
+				fuzhuColor50: null,
+			}
+		},
+		mounted() {
+			this.themeColor = app.globalData.themeColor
+			this.themeColor50 = app.globalData.themeColor50
+			this.themeColor25 = app.globalData.themeColor25
+			this.fuzhuColor = app.globalData.fuzhuColor
+			this.fuzhuColor50 = app.globalData.fuzhuColor50
+			
+		},
+		filters:{
+			dateFormatFilter(val){
+				return dateFormat(val)
+			}
+		},
+		methods: {
+			show() {
+				this.$refs.popView.show()
+			},
+			knowAction(){
+				this.$refs.popView.hide()
+			},
+			confirmAction() {
+				this.$refs.popView.hide()
+				this.$emit('confirmAction')
+			}
+		},
+		components: {
+			dmPopView
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.content {
+		width: 100%;
+		height: 600rpx;
+		font-family: Verdana;
+		
+		.content-des {
+			color: #333333;
+			font-size: 32rpx;
+			font-weight: bold;
+			margin-top: 60rpx;
+			text-align: center;
+			margin-left: 20rpx;
+			margin-right: 20rpx;
+		}
+		
+		.time_content{
+			font-size: 24rpx;
+			font-family: Verdana, Verdana-Regular;
+			font-weight: 400;
+			text-align: left;
+			color: #999999;
+			margin-left: 20rpx;
+			margin-top: 20rpx;
+		}
+		.content_desc{
+			font-size: 32rpx;
+			font-family: Verdana, Verdana-Regular;
+			font-weight: 400;
+			text-align: left;
+			color: red;
+			margin-left: 20rpx;
+			margin-right: 20rpx;
+			margin-top: 30rpx;
+		}
+		
+		.goBtn {
+			width: 260rpx;
+			height: 84rpx;
+			border-radius: 42rpx;
+			margin-left: calc((100% - 260rpx) / 2);
+			margin-top: 50rpx;
+			font-size: 32rpx;
+			color: #FFFFFF;
+			line-height: 84rpx;
+			text-align: center;
+		}
+		
+		.knowBtn {
+			width: 260rpx;
+			height: 84rpx;
+			border-radius: 42rpx;
+			margin-left: calc((100% - 260rpx) / 2);
+			margin-top: 20rpx;
+			color: #666666;
+			font-size: 32rpx;
+			line-height: 84rpx;
+			text-align: center;
+		}
+		
+	}
+</style>

+ 118 - 0
components/subComponents/dmEditedSuccess.vue

@@ -0,0 +1,118 @@
+<template>
+	<dm-pop-view ref='popView' :isShowTitle="false" :isShowClose="false" :isShowConfirm="false" :maskTapHide='maskTapHide'>
+		<view class="content" v-if="false">
+			<view class="content_success">
+				<image class="img_success" src="../../static/icons/complete_success.png" mode=""></image>
+			</view>
+			<view class="content-des">保存完成!</view>
+			<view class="goBtn" :style="`background-color: ${themeColor};`" @click="confirmAction">好的</view>
+		</view>
+		<view  class="content" v-if="false">
+			<view class="content_success">
+				<image class="img_success" src="../../static/icons/complete_failure.png" mode=""></image>
+			</view>
+			<view class="content-des">保存失败!</view>
+			<view class="goBtn" :style="`background-color: ${themeColor};`" @click="confirmAction">重新编辑</view>
+		</view>
+		<view  class="content">
+			<view class="content_success">
+				<view style="position: relative;margin-top: 100rpx;width: 118rpx;height: 118rpx;">
+					<image class="img_success" src="../../static/icons/icon_info_bt_bg.png" mode="" style="margin-top: 0rpx;"></image>
+					<image style="width: 54rpx;height: 10rpx;position: absolute;left: 50%;top: 50%;transform: translate(-50%,-50%);" src="../../static/icons/diandiandian.png" mode=""></image>
+				</view>
+				
+			</view>
+			<view class="content-des">填写完必填项后,方可保存</view>
+			<view class="goBtn" :style="`background-color: ${themeColor};`" @click="confirmAction">继续填写</view>
+		</view>
+	</dm-pop-view>
+</template>
+
+<script>
+	import dmPopView from './dmPopView.vue'
+	
+	let app = getApp();
+	export default {
+		props: {
+			maskTapHide: {
+				type: Boolean,
+				default: true
+			}
+		},
+		data() {
+			return {
+				themeColor: null,
+				fuzhuColor: null,
+				themeColor50: null,
+				themeColor25: null,
+				fuzhuColor50: null,
+			}
+		},
+		mounted() {
+			this.themeColor = app.globalData.themeColor
+			this.themeColor50 = app.globalData.themeColor50
+			this.themeColor25 = app.globalData.themeColor25
+			this.fuzhuColor = app.globalData.fuzhuColor
+			this.fuzhuColor50 = app.globalData.fuzhuColor50
+			
+		},
+		methods: {
+			show() {
+				this.$refs.popView.show()
+			},
+			knowAction(){
+				this.$refs.popView.hide()
+			},
+			confirmAction() {
+				this.$refs.popView.hide()
+				this.$emit('confirmAction')
+			}
+		},
+		components: {
+			dmPopView
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.content {
+		width: 100%;
+		height: 520rpx;
+		font-family: Verdana;
+		
+		.content_success{
+			width: 100%;
+			height: 118rpx;
+			border-radius: 50%;
+			display: flex;
+			justify-content: center;
+			
+			.img_success{
+				width: 118rpx;
+				height: 118rpx;
+				border-radius: 50%;
+				margin-top: 100rpx;
+			}
+		}
+		.content-des {
+			color: #333333;
+			font-size: 32rpx;
+			font-weight: bold;
+			margin-top: 125rpx;
+			text-align: center;
+		}
+		
+		.goBtn {
+			width: 260rpx;
+			height: 84rpx;
+			border-radius: 42rpx;
+			margin-left: calc((100% - 260rpx) / 2);
+			margin-top: 90rpx;
+			font-size: 32rpx;
+			color: #FFFFFF;
+			line-height: 84rpx;
+			text-align: center;
+		}
+		
+	}
+</style>

+ 788 - 0
components/subComponents/dmExplainPicker.vue

@@ -0,0 +1,788 @@
+<template>
+	<dm-pop-view ref='popView' title="解释说明" :isShowConfirm="false" :maskTapHide='maskTapHide'>
+		<scroll-view class="explain-contain" :style="{height:viewHeight}" :scroll-y="true">
+			<view class="explainItem" v-for="(item, index) in dataList" :key="index">
+				<view class="explain-Title">{{item.title}}</view>
+				<view class="explain-Des">{{item.des}}</view>
+			</view>
+		</scroll-view>
+	</dm-pop-view>
+</template>
+
+<script>
+	import dmPopView from './dmPopView.vue'
+	
+	let app = getApp();
+	export default {
+		props: {
+			title: {
+				type: String,
+				default: '解释说明'
+			},
+			maskTapHide: {
+				type: Boolean,
+				default: true
+			},
+			chartId: {
+				type: String,
+				default: ''
+			},
+			isJiTuanCeng:{
+				type: Boolean,
+				default: false
+			},
+			brandSelected: {
+				type: Boolean,
+				default: false
+			}
+		},
+		data() {
+			return {
+				themeColor: null,
+				fuzhuColor: null,
+				themeColor50: null,
+				themeColor25: null,
+				fuzhuColor50: null,
+				dataList: [],
+				viewHeight:"760rpx"
+			}
+		},
+		mounted() {
+			this.themeColor = app.globalData.themeColor
+			this.themeColor50 = app.globalData.themeColor50
+			this.themeColor25 = app.globalData.themeColor25
+			this.fuzhuColor = app.globalData.fuzhuColor
+			this.fuzhuColor50 = app.globalData.fuzhuColor50
+			this.viewHeight = "760rpx"
+		},
+		methods: {
+			show() {
+				this.$refs.popView.show()
+			},
+			reloadData() {
+				// 获客
+				if (this.title == '客户浏览情况') {
+					this.dataList = [
+						{
+							title: '新访',
+							des: '在当前时间范围内,首次访问小程序的客户,数据统计维度按人按天去重'
+						},
+						{
+							title: '复访',
+							des: '在当前时间范围内,非首次访问小程序的客户,数据统计维度按人按天去重'
+						}
+					]
+				}
+				else if (this.title == '访客来源') {
+					this.dataList = [
+						{
+							title: '集团',
+							des: '在当前时间范围内,首次进入集团页面,获得的客户'
+						},
+						{
+							title: '其他项目',
+							des: '在当前时间范围内,首次进入集团其他项目,获得的客户'
+						},
+						{
+							title: '本项目',
+							des: '在当前时间范围内,首次进入本项目,获得的客户'
+						}
+					]
+				}
+				else if (this.title == '来源场景') {
+					this.dataList = [
+						{
+							title: '获客来源场景',
+							des: '指该新增获客首次进入小程序的场景方式'
+						},
+						{
+							title: '长按识别',
+							des: '通过长按识别二维码进入小程序的用户,一般为人为分享的二维码'
+						},
+						{
+							title: '会话分享',
+							des: '通过会话分享(单人会话、群消息)进入的用户'
+						},
+						{
+							title: '扫码进入',
+							des: '通过扫码方式进入小程序的用户'
+						},
+						{
+							title: '朋友圈进入',
+							des: '通过分享到朋友圈的小程序页面进入的用户'
+						},
+						{
+							title: '最近使用',
+							des: '通过最近使用的小程序进入的用户'
+						},
+						{
+							title: '广告',
+							des: '通过广告进入小程序的用户'
+						},
+						{
+							title: '搜索',
+							des: '通过主动搜索方式进入小程序的用户'
+						},
+						{
+							title: '公众号',
+							des: '通过公众号菜单、公众号消息等进入小程序的用户'
+						},
+						{
+							title: '公众号文章',
+							des: '通过公众号文章进入小程序的用户'
+						},
+						{
+							title: '视频号进入',
+							des: '通过视频号进入小程序的用户'
+						},
+						{
+							title: '订阅号进入',
+							des: '通过订阅号进入小程序的用户'
+						},
+						{
+							title: '订阅消息',
+							des: '通过订阅的微信消息进入小程序的用户'
+						},
+						{
+							title: '其他APP/其他小程序',
+							des: '通过APP、或其他小程序进入小程序的用户'
+						},
+						{
+							title: '企业微信',
+							des: '通过企业微信打开小程序的用户'
+						},
+						{
+							title: '其他',
+							des: '不属于以上场景的其他进入小程序场景的用户'
+						}
+					]
+				}
+				else if (this.title == '浏览情况') {
+					this.dataList = [
+						{
+							title: '浏览量',
+							des: '时间范围内,小程序用户产生以下行为的总浏览量,客户每浏览1个页面即产生1个浏览量'
+						}
+					]
+				} else if (this.title == '浏览时长') {
+					this.dataList = [
+						{
+							title: '',
+							des: '在当前时间范围内,客户单次在项目内浏览时长(当天数据当天无法查看,仅能查看截止至昨天的数据)'
+						}
+					]
+				} else if (this.title == '用户转化明细') {
+					this.dataList = [
+						{
+							title: '',
+							des: '在当前时间范围内,IM咨询及视频看房接通情况(当天数据当天无法查看,仅能查看截止至昨天的数据)'
+						}
+					]
+				}
+				
+				// 获电
+				else if (this.title == '获电情况') {
+					this.dataList = [
+						{
+							title: '集团层查看',
+							des: '集团获电:统计整个集团的获电情况,如客户在多个项目产生留电行为,取该客户的最早一次获电场景进行统计'
+						},
+						{
+							title: '小程序获电',
+							des: '在当前时间范围内,通过触及小程序的使用场景,所产生的获电'
+						},
+						{
+							title: '非小程序获电',
+							des: '在当前时间范围内,未触发过小程序的使用场景,并产生了获电'
+						}
+					]
+				}
+				else if (this.title == '获电方式') {
+					this.dataList = [
+						{
+							title: '授权号码',
+							des: '客户进入小程序,并在当前项目产生授权留存的客户电话'
+						},
+						{
+							title: '手动报备',
+							des: '通过经纪人手动录入客户电话产生报备关系的客户电话'
+						},
+						{
+							title: '到访录入',
+							des: '线下自然顺访的客户,通过录入来访系统产生的客户电话'
+						},
+						{
+							title: '导入获电',
+							des: '项目历史客户资源,通过导入系统而产生的客户电话'
+						},
+						{
+							title: '其他',
+							des: '通过H5、或其他非以上方式产生的客户电话'
+						}
+					]
+				}
+				else if (this.title == '获电来源') {
+					if (this.isJiTuanCeng) {
+						this.dataList = [{
+							title: '集团层',
+							des: '客户在集团层浏览过并且已产生电话'
+						}]
+					}
+					else if (this.brandSelected) {
+						this.dataList = [
+							{
+								title: '集团层',
+								des: '客户在集团层浏览过并且已产生电话'
+							},
+							{
+								title: '线上获电-自然获电',
+								des: '客户主动进入小程序产生获电,无推荐或报备关系'
+							},
+							{
+								title: '线上获电-自然裂变',
+								des: '由自然人推荐裂变产生的获电'
+							},
+							{
+								title: '指定角色获电',
+								des: '由对应身份的用户(案场顾问、老业主、全民经纪人、分销经纪人等各种身份)推荐或报备产生的获电'
+							},
+							{
+								title: '线下-自然来访',
+								des: '通过扫码到访、或手动录入到访产生的获电'
+							},
+							{
+								title: '线下-其他',
+								des: '通过非以上场景产生的获电情况,统计为其他获电'
+							}
+						]
+					}
+					else {
+						this.dataList = [
+							{
+								title: '线上获电-自然获电',
+								des: '客户主动进入小程序产生获电,无推荐或报备关系'
+							},
+							{
+								title: '线上获电-自然裂变',
+								des: '由自然人推荐裂变产生的获电'
+							},
+							{
+								title: '指定角色获电',
+								des: '由对应身份的用户(案场顾问、老业主、全民经纪人、分销经纪人等各种身份)推荐或报备产生的获电'
+							},
+							{
+								title: '线下-自然来访',
+								des: '通过扫码到访、或手动录入到访产生的获电'
+							},
+							{
+								title: '线下-其他',
+								des: '通过非以上场景产生的获电情况,统计为其他获电'
+							}
+						]
+					}
+					// this.dataList = [
+					// 	{
+					// 		title: '更新时间差',
+					// 		des: '有2小时延迟 例:当前时间为10点,数据为8点的统计结果'
+					// 	},
+					// 	{
+					// 		title: '线上-自然获客',
+					// 		des: '小程序产生的自然获客(如通过公众号文章、微信投放等进入的客户)'
+					// 	},
+					// 	{
+					// 		title: '线上-自然裂变',
+					// 		des: '通过客户推荐分享,产生的获客'
+					// 	},
+					// 	{
+					// 		title: '线上-顾问拓客',
+					// 		des: '案场置业顾问通过小程序产生的推荐/裂变客户'
+					// 	},
+					// 	{
+					// 		title: '线上-组织名称',
+					// 		des: '渠道人员推荐/报备产生的客户'
+					// 	},{
+					// 		title: '线下-自然来访',
+					// 		des: '线下到访客户中,来源为自然来访的客户'
+					// 	},{
+					// 		title: '线下-来电',
+					// 		des: '线下到访客户中,来源为“来电”的客户'
+					// 	},{
+					// 		title: '线下-电转访',
+					// 		des: '线下到访客户中,来源为“电转访”的客户'
+					// 	},{
+					// 		title: '线下-全民营销',
+					// 		des: '线下到访客户中,来源为“全民营销”的客户'
+					// 	},{
+					// 		title: '线下-老客户介绍',
+					// 		des: '线下到访客户中,来源为“老客户介绍”的客户'
+					// 	},{
+					// 		title: '线下-员工自购',
+					// 		des: '线下到访客户中,来源为“员工自购”的客户'
+					// 	},{
+					// 		title: '线下-其他',
+					// 		des: '线下到访客户中,来源为“其他”的客户'
+					// 	},
+					// ]
+				}
+				
+				// 跟进
+				else if (this.title == '跟进客户来源') {
+					this.dataList = [
+						{
+							title: '更新时间差',
+							des: '有2小时延迟 例:当前时间为10点,数据为8点的统计结果'
+						},
+						{
+							title: '线上-自然获客',
+							des: '小程序产生的自然获客(如通过公众号文章、微信投放等进入的客户)'
+						},
+						{
+							title: '线上-自然裂变',
+							des: '通过客户推荐分享,产生的获客'
+						},
+						{
+							title: '线上-顾问拓客',
+							des: '案场置业顾问通过小程序产生的推荐/裂变客户'
+						},
+						{
+							title: '线上-组织名称',
+							des: '渠道人员推荐/报备产生的客户'
+						},
+						{
+							title: '线下-自然来访',
+							des: '线下到访客户中,来源为自然来访的客户'
+						},
+						{
+							title: '线下-来电',
+							des: '线下到访客户中,来源为“来电”的客户'
+						},
+						{
+							title: '线下-电转访',
+							des: '线下到访客户中,来源为“电转访”的客户'
+						},
+						{
+							title: '线下-全民营销',
+							des: '线下到访客户中,来源为“全民营销”的客户'
+						},
+						{
+							title: '线下-老客户介绍',
+							des: '线下到访客户中,来源为“老客户介绍”的客户'
+						},
+						{
+							title: '线下-员工自购',
+							des: '线下到访客户中,来源为“员工自购”的客户'
+						},
+						{
+							title: '线下-其他',
+							des: '线下到访客户中,来源为“其他”的客户'
+						}
+					]
+				}
+				
+				// 到访
+				else if (this.title == '到访方式') {
+					this.dataList = [
+						{
+							title: '扫码到访',
+							des: '在当前时间范围内,到访方式为扫小程序码'
+						},
+						{
+							title: '线下录入',
+							des: '在当前时间范围内,到访方式为线下录入特例审核'
+						},
+						{
+							title: '隐号报备到访',
+							des: '在当前时间范围内,到访方式为前三后四'
+						}
+					]
+				}else if (this.title == '到访来源') {
+					this.dataList = [
+						{
+							title: '更新时间差',
+							des: '有2小时延迟 例:当前时间为10点,数据为8点的统计结果'
+						},
+						{
+							title: '线上-自然获客',
+							des: '小程序产生的自然获客(如通过公众号文章、微信投放等进入的客户)'
+						},
+						{
+							title: '线上-自然裂变',
+							des: '通过客户推荐分享,产生的获客'
+						},
+						{
+							title: '线上-顾问拓客',
+							des: '案场置业顾问通过小程序产生的推荐/裂变客户'
+						},
+						{
+							title: '线上-组织名称',
+							des: '渠道人员推荐/报备产生的客户'
+						},
+						{
+							title: '线下-自然来访',
+							des: '线下到访客户中,来源为自然来访的客户'
+						},
+						{
+							title: '线下-来电',
+							des: '线下到访客户中,来源为“来电”的客户'
+						},
+						{
+							title: '线下-电转访',
+							des: '线下到访客户中,来源为“电转访”的客户'
+						},
+						{
+							title: '线下-全民营销',
+							des: '线下到访客户中,来源为“全民营销”的客户'
+						},
+						{
+							title: '线下-老客户介绍',
+							des: '线下到访客户中,来源为“老客户介绍”的客户'
+						},
+						{
+							title: '线下-员工自购',
+							des: '线下到访客户中,来源为“员工自购”的客户'
+						},
+						{
+							title: '线下-其他',
+							des: '线下到访客户中,来源为“其他”的客户'
+						}
+					]
+				}else if(this.title == '认知途径'){
+					this.dataList = [
+						{
+							title: '未知',
+							des: '无客户认知途径的客户'
+						},
+						{
+							title: '路过',
+							des: '客户认知途径中,来源为“路过”的客户'
+						},
+						{
+							title: '渠道/中介',
+							des: '客户认知途径中,来源为“渠道/中介”的客户'
+						},
+						{
+							title: '朋友介绍',
+							des: '客户认知途径中,来源为“朋友介绍”的客户'
+						},
+						{
+							title: '互联网/平台',
+							des: '客户认知途径中,来源为“互联网/平台”的客户'
+						},
+						{
+							title: '公众号',
+							des: '客户认知途径中,来源为“公众号”的客户'
+						},
+						{
+							title: '小程序',
+							des: '客户认知途径中,来源为“小程序”的客户'
+						},
+						{
+							title: '户外广告',
+							des: '客户认知途径中,来源为“户外广告”的客户'
+						},
+						{
+							title: '展点/活动',
+							des: '客户认知途径中,来源为“展点/活动”的客户'
+						},
+						{
+							title: '其他',
+							des: '客户认知途径中,来源为“其他”的客户'
+						}
+					]
+				}
+				
+				// 成交
+				else if (this.title == '成交进度') {
+					if (this.chartId == 'chengJiaoPage2') {
+						this.dataList = [
+							{
+								title: '说明',
+								des: '当前版本认购、签合为发生过即'
+							},
+							{
+								title: '认购',
+								des: '在当前时间范围内,发生认购的客户总数'
+							},
+							{
+								title: '签约',
+								des: '在当前时间范围内,成交情况为已签约'
+							},
+							{
+								title: '回款',
+								des: '在当前时间范围内,成交情况为已回款'
+							},
+							{
+								title: '已结首付',
+								des: '在当前时间范围内,成交情况为已结首付'
+							},
+							{
+								title: '已结全款',
+								des: '在当前时间范围内,成交情况为已结全款'
+							}
+						]
+					}
+					else {
+						this.dataList = [
+							{
+								title: '统计口径',
+								des: '成交进度以客户成交的房间为单位,统计时间范围内的最新成交进度'
+							},
+							{
+								title: '认购',
+								des: '统计时间范围内,成交进度达到认购的成交数量'
+							},
+							{
+								title: '签约',
+								des: '统计时间范围内,成交进度达到签约的成交数量'
+							},
+							{
+								title: '已结首付',
+								des: '统计时间范围内,成交进度达到已完成首付的成交数量'
+							},
+							{
+								title: '已结全款',
+								des: '统计时间范围内,成交进度达到已完成全款支付的成交数量'
+							},
+							{
+								title: '已退房',
+								des: '统计时间范围内,成交进度为已退房的成交数量'
+							}
+						]
+					}
+					
+				}else if (this.title == '成交来源') {
+					this.dataList = [
+						{
+							title: '更新时间差',
+							des: '有2小时延迟 例:当前时间为10点,数据为8点的统计结果'
+						},
+						{
+							title: '线上-自然获客',
+							des: '小程序产生的自然获客(如通过公众号文章、微信投放等进入的客户)'
+						},
+						{
+							title: '线上-自然裂变',
+							des: '通过客户推荐分享,产生的获客'
+						},
+						{
+							title: '线上-顾问拓客',
+							des: '案场置业顾问通过小程序产生的推荐/裂变客户'
+						},
+						{
+							title: '线上-组织名称',
+							des: '渠道人员推荐/报备产生的客户'
+						},
+						{
+							title: '线下-自然来访',
+							des: '线下到访客户中,来源为自然来访的客户'
+						},
+						{
+							title: '线下-来电',
+							des: '线下到访客户中,来源为“来电”的客户'
+						},
+						{
+							title: '线下-电转访',
+							des: '线下到访客户中,来源为“电转访”的客户'
+						},
+						{
+							title: '线下-全民营销',
+							des: '线下到访客户中,来源为“全民营销”的客户'
+						},
+						{
+							title: '线下-老客户介绍',
+							des: '线下到访客户中,来源为“老客户介绍”的客户'
+						},
+						{
+							title: '线下-员工自购',
+							des: '线下到访客户中,来源为“员工自购”的客户'
+						},
+						{
+							title: '线下-其他',
+							des: '线下到访客户中,来源为“其他”的客户'
+						}
+					]
+				} else if (this.title == '成交构成') {
+					this.dataList = [
+						{
+							title: '报备成交',
+							des: '报备有效成交,且报备关系人为对应角色类型的成员'
+						},
+						{
+							title: '推荐成交',
+							des: '小程序分享推荐成交,且推荐关系人为对应角色类型的成员(PS:经纪人和客户仅存在推荐关系,无有效的报备关系时不能生成结佣凭证)'
+						},
+						{
+							title: '自然人推荐成交',
+							des: '分享推荐成交,且推荐人为自然用户'
+						},
+						{
+							title: '线上自然成交',
+							des: '自然进入线上小程序,并成交的客户(无推荐报备关系)'
+						},
+						{
+							title: '自然到访成交',
+							des: '自然来访并成交的客户'
+						},
+						{
+							title: '其他自然成交',
+							des: '不符合以上成交类型的,统计为其他自然成交'
+						}
+					]
+				}
+				
+				// 抢单
+				else if (this.title == '客户构成') {
+					this.dataList = [
+						{
+							title: 'A级',
+							des: '通过客户视频看房、留电、关注项目等行为,由AI系统评定AI等级为A的客户'
+						},
+						{
+							title: 'B级',
+							des: '通过客户视频看房、留电、关注项目等行为,由AI系统评定AI等级为B的客户'
+						},
+						{
+							title: 'C级',
+							des: '通过客户视频看房、留电、关注项目等行为,由AI系统评定AI等级为C的客户'
+						}
+					]
+				}
+				
+				// 认证
+				else if (this.title == '认证角色') {
+					this.dataList = [
+						{
+							title: '组织名称',
+							des: '在当前时间范围内,认证角色的组织名称'
+						}
+					]
+				}
+				
+				// 报备
+				else if (this.title == '报备方式') {
+					this.dataList = [
+						{
+							title: '推荐自动报备',
+							des: '在当前时间范围内,通过分享转发,客户授权后自动报备的客户'
+						},
+						{
+							title: '推荐手动报备',
+							des: '在当前时间范围内,通过分享转发,客户授权后操作报备的客户'
+						},
+						{
+							title: '手动录入报备',
+							des: '在当前时间范围内,通过手动录入报备的客户'
+						},
+						{
+							title: '导入报备',
+							des: '在当前时间范围内,通过导入形式产生的报备客户(一般为系统切换时产生)'
+						},
+						{
+							title: '隐号报备',
+							des: '在当前时间范围内,通过前三后四报备的客户'
+						}
+					]
+				}else if (this.title == '报备来源') {
+					this.dataList = [
+						{
+							title: '更新时间差',
+							des: '有2小时延迟例:当前时间为10点,数据为8点的统计结果'
+						},
+						{
+							title: '线上-组织名称',
+							des: '渠道人员推荐/报备产生的客户'
+						}
+					]
+				}
+				else if (this.title == '待确认明细') {
+					this.dataList = [
+						{
+							title: '待确认状态',
+							des: '案场暂未确认客户报备结果,确认报备结果前请勿带访客户。'
+						},
+						{
+							title: '提醒审核',
+							des: '发起当条报备的有效性审核,如系统未完成判定,10分钟后可再次发起确认;'
+						},
+						{
+							title: '一键批量提醒',
+							des: '批量发起当前客户列表的有效性审核,如系统未完成判定,10分钟后可再次发起确认'
+						}
+					]
+				}
+				else if (this.title == '推荐关系来源') {
+					this.dataList = [
+						{
+							title: '推荐关系来源',
+							des: '客户在本项目的推荐人,如无则显示空'
+						}
+					];
+					this.viewHeight = "300rpx"
+				}else if (this.title == '报备关系来源') {
+					this.dataList = [
+						{
+							title: '报备关系来源',
+							des: '客户在本项目的首位报备关系人,如无则显示空'
+						}
+					];
+					this.viewHeight = "300rpx"
+				}
+				else if (this.title == '邀约方式') {
+					this.dataList = [
+						{
+							title: '普通邀约',
+							des: '在当前时间范围内,非二维码和顾问私密二维码邀约产生的成功邀约'
+						},
+						{
+							title: '二维码邀约',
+							des: '在当前时间范围内,通过活动页面二维码扫码产生的成功邀约'
+						},
+						{
+							title: '顾问私密邀约',
+							des: '在当前时间范围内,通过顾问私密二维码产生成功邀约'
+						}
+					];
+				}
+				
+			}
+		},
+		watch: {
+			title: {
+				handler(e) {
+					this.reloadData()
+				},
+				immediate: true
+			}
+		},
+		components: {
+			dmPopView
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.explain-contain {
+		width: 100%;
+		height: 760rpx;
+		font-family: Verdana;
+		color: #454545;
+		overflow-y: scroll;
+		padding-bottom: 50rpx;
+		
+		.explainItem {
+			width: 100%;
+			padding: 20rpx 30rpx;
+			box-sizing: border-box;
+			white-space: pre-wrap;
+			
+			.explain-Title {
+				font-size: 32rpx;
+				font-weight: bold;
+			}
+			.explain-Des {
+				font-size: 28rpx;
+			}
+		}
+		
+	}
+</style>

+ 104 - 0
components/subComponents/dmExportPicker.vue

@@ -0,0 +1,104 @@
+<template>
+	<dm-pop-view ref='popView' :isShowTitle="false" :isShowClose="false" :isShowConfirm="false" :maskTapHide='maskTapHide'>
+		<view class="export-content">
+			<image class="icon" src="../../static/icons/icon_finsh_yellow@2x.png" mode=""></image>
+			<view class="content-des">明细文档已生成至导出列表</view>
+			<view class="goBtn" :style="`background-color: ${themeColor};`" @click="confirmAction">立即前往</view>
+			<view class="knowBtn" @click="knowAction">知道了</view>
+		</view>
+	</dm-pop-view>
+</template>
+
+<script>
+	import dmPopView from './dmPopView.vue'
+	
+	let app = getApp();
+	export default {
+		props: {
+			maskTapHide: {
+				type: Boolean,
+				default: true
+			}
+		},
+		data() {
+			return {
+				themeColor: null,
+				fuzhuColor: null,
+				themeColor50: null,
+				themeColor25: null,
+				fuzhuColor50: null,
+			}
+		},
+		mounted() {
+			this.themeColor = app.globalData.themeColor
+			this.themeColor50 = app.globalData.themeColor50
+			this.themeColor25 = app.globalData.themeColor25
+			this.fuzhuColor = app.globalData.fuzhuColor
+			this.fuzhuColor50 = app.globalData.fuzhuColor50
+			
+		},
+		methods: {
+			show() {
+				this.$refs.popView.show()
+			},
+			knowAction(){
+				this.$refs.popView.hide()
+			},
+			confirmAction() {
+				this.$refs.popView.hide()
+				this.$emit('confirmGoExport')
+			}
+		},
+		components: {
+			dmPopView
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.export-content {
+		width: 100%;
+		height: 676rpx;
+		font-family: Verdana;
+		
+		.icon {
+			width: 118rpx;
+			height: 118rpx;
+			margin-top: 124rpx;
+			margin-left: calc((100% - 118rpx) / 2);
+		}
+		
+		.content-des {
+			color: #333333;
+			font-size: 32rpx;
+			font-weight: bold;
+			margin-top: 30rpx;
+			text-align: center;
+		}
+		
+		.goBtn {
+			width: 260rpx;
+			height: 84rpx;
+			border-radius: 42rpx;
+			margin-left: calc((100% - 260rpx) / 2);
+			margin-top: 100rpx;
+			font-size: 32rpx;
+			color: #FFFFFF;
+			line-height: 84rpx;
+			text-align: center;
+		}
+		
+		.knowBtn {
+			width: 260rpx;
+			height: 84rpx;
+			border-radius: 42rpx;
+			margin-left: calc((100% - 260rpx) / 2);
+			margin-top: 20rpx;
+			color: #666666;
+			font-size: 32rpx;
+			line-height: 84rpx;
+			text-align: center;
+		}
+		
+	}
+</style>

+ 446 - 0
components/subComponents/dmHexiaoScreenPicker.vue

@@ -0,0 +1,446 @@
+<template>
+	<dm-pop-view ref="popView" title="更多筛选" :isShowConfirm="false" :maskTapHide='true'>
+		<scroll-view class="screen_container" scroll-y="true">
+			<view class="screen-items" v-for="(item, idx) in dataList" :key="idx">
+				<block v-if="!(idx == 1 && screenValue == 1)">
+					<view class="screen_item_title">{{item.title}}</view>
+					<view class="level_tag_view">
+						<text class="level_tag" :style="{ color: item1.isSelect ? '#fff' : '#666', 'background-color': item1.isSelect ? themeColor : '#F1F5F9' }"
+						 v-for="(item1, idx1) in item.subList" :key="idx1" @click="selectAction(item1, idx)">
+							{{item1.title}}
+						</text>
+					</view>
+				</block>
+			</view>
+		</scroll-view>
+
+		<view class="bottom_btn">
+			<text class="reset_btn" :style="`background-color: ${themeColor25};`" @click="resetAction">重置</text>
+			<text class="pop_btn" :style="`background-color: ${themeColor};`" @click="sureAction">确定</text>
+		</view>
+
+	</dm-pop-view>
+</template>
+
+<script>
+	import dmPopView from './dmPopView.vue';
+	let app = getApp()
+
+	export default {
+		props: {
+			screenValue: {
+				type: [String, Number],
+				default: 0
+			},
+			houseId: {
+				type: [String, Number],
+				default: ''
+			},
+			isSingleProject: {
+				type: Boolean,
+				default: false
+			},
+			isBrand: Boolean,
+			defaultParameter: Object
+		},
+		data() {
+			return {
+				themeColor: null,
+				fuzhuColor: null,
+				themeColor50: null,
+				themeColor25: null,
+				fuzhuColor50: null,
+				dataList: [],
+				brandId: ''
+			}
+		},
+		mounted() {
+			this.themeColor = app.globalData.themeColor
+			this.themeColor50 = app.globalData.themeColor50
+			this.themeColor25 = app.globalData.themeColor25
+			this.fuzhuColor = app.globalData.fuzhuColor
+			this.fuzhuColor50 = app.globalData.fuzhuColor50
+			let that = this;
+			uni.getStorage({
+				//获得保存在本地的用户信息
+				key: 'userInfo',
+				success: res => {
+					if (res.data) {
+						//有数据,已登录
+						that.brandId = res.data.brandId;
+						that.reloadDatahandle()
+					}
+				}
+			});
+		},
+		methods: {
+			async dataHandle() {
+				if (!this.isSingleProject) {
+					return
+				}
+				var houseIds = []
+				if (this.houseId != '' && this.houseId != null) {
+					houseIds = [this.houseId]
+				}
+				var self = this
+				let res = await this.$myRequest({
+					url: '/elab-marketing-user/activity_ticket_record/get_ticket_activity',
+					data: {
+						brandId: self.brandId,
+						isBrand: self.isBrand,
+						dateType: self.defaultParameter.dateType,
+						maxDate: self.defaultParameter.endDate,
+						minDate: self.defaultParameter.startDate,
+						houseIds: houseIds,
+						type: self.screenValue + 1
+					}
+				})
+				if (res.data.success) {
+					var tempList = [{
+						title: '全部',
+						isSelect: true,
+						id: 0
+					}]
+					res.data.list.forEach((item, idx) => {
+						var data = {
+							title: item.activityName,
+							isSelect: false,
+							id: item.activityId
+						}
+						tempList.push(data)
+					})
+					this.dataList[3].subList = tempList
+					this.dataList.forEach((item, idx) => {
+						item.subList.forEach((item1, idx1) => {
+							if (item1.hasOwnProperty('idx')) {
+								item1.idx = idx1
+							} else {
+								item1['idx'] = idx1
+							}
+						})
+					})
+				}
+			},
+			
+			async getActiveTypeDatahandle() {
+				if (!this.isSingleProject) {
+					return
+				}
+				var houseIds = []
+				if (this.houseId != '' && this.houseId != null) {
+					houseIds = [this.houseId]
+				}
+				var self = this
+				let res = await this.$myRequest({
+					url: '/elab-marketing-user/activity_ticket_record/get_ticket_activity_type',
+					data: {
+						brandId: self.brandId,
+						isBrand: self.isBrand,
+						dateType: self.defaultParameter.dateType,
+						maxDate: self.defaultParameter.endDate,
+						minDate: self.defaultParameter.startDate,
+						houseIds: houseIds,
+						type: self.screenValue + 1
+					}
+				})
+				if (res.data.success) {
+					var tempList = [{
+						title: '全部',
+						isSelect: true,
+						id: 0
+					}]
+					res.data.list.forEach((item, idx) => {
+						var data = {
+							title: item.activityTypeName,
+							isSelect: false,
+							id: item.activityType
+						}
+						tempList.push(data)
+					})
+					this.dataList[2].subList = tempList
+					this.dataList.forEach((item, idx) => {
+						item.subList.forEach((item1, idx1) => {
+							if (item1.hasOwnProperty('idx')) {
+								item1.idx = idx1
+							} else {
+								item1['idx'] = idx1
+							}
+						})
+					})
+				}
+			},
+				
+			show() {
+				this.$refs.popView.show()
+			},
+			reloadDataList() {
+				this.dataList = [{
+						title: '排序',
+						subList: [{
+								title: '获券时间倒序',
+								isSelect: true,
+								id: 0
+							},
+							{
+								title: '获券时间正序',
+								isSelect: false,
+								id: 1
+							}
+						]
+					},
+					{
+						title: '奖券状态',
+						subList: [{
+								title: '全部',
+								isSelect: true,
+								id: 0
+							},
+							{
+								title: '可使用',
+								isSelect: false,
+								id: 1
+							},
+							{
+								title: '已使用',
+								isSelect: false,
+								id: 2
+							},
+							{
+								title: '已过期',
+								isSelect: false,
+								id: 3
+							}
+						]
+					},
+					{
+						title: '活动类型',
+						subList: []
+					},
+					{
+						title: '活动名称',
+						subList: []
+					}
+				]
+
+				this.dataList.forEach((item, idx) => {
+					item.subList.forEach((item1, idx1) => {
+						if (item1.hasOwnProperty('idx')) {
+							item1.idx = idx1
+						} else {
+							item1['idx'] = idx1
+						}
+					})
+				})
+
+			},
+			selectAction(e, index) {
+				this.dataList.forEach((item, idx) => {
+					if (index == idx) {
+						if (index > 1) {
+							var isHave = false
+							if (e.id != 0) {
+								item.subList.forEach((item1, idx1) => {
+									if (item1.idx == 0) {
+										item1.isSelect = false
+									}
+									if (item1.idx == e.idx) {
+										item1.isSelect = !item1.isSelect
+									}
+									if (item1.isSelect) {
+										isHave = true
+									}
+								})
+								if (!isHave) {
+									item.subList[0].isSelect = true
+								}
+							} else {
+								item.subList.forEach((item1, idx1) => {
+									item1.isSelect = false
+									if (item1.idx == 0) {
+										item1.isSelect = true
+									}
+								})
+							}
+						} else {
+							item.subList.forEach((item1, idx1) => {
+								item1.isSelect = item1.idx == e.idx ? true : false
+							})
+						}
+					}
+				})
+			},
+			sureAction() {
+				this.$emit('selectScreenAction', this.dataList)
+				this.$refs.popView.hide()
+			},
+			resetAction() {
+				this.dataList.forEach((item, idx) => {
+					item.subList.forEach((item1, idx1) => {
+						item1.isSelect = idx1 == 0 ? true: false
+					})
+				})
+				this.$emit('selectScreenAction', this.dataList)
+				this.$refs.popView.hide()
+			},
+			reloadDatahandle() {
+				this.reloadDataList()
+				this.dataHandle()
+				this.getActiveTypeDatahandle()
+				// var self = this
+				// Promise.all([
+				// 	self.dataHandle(),
+				// 	self.getActiveTypeDatahandle(),
+				// ]).then(res => {
+				// 	if (res && res.length == 2) {
+				// 		self.reloadDataList()
+				// 	}
+				// })
+			}
+		},
+		components: {
+			dmPopView
+		},
+		watch: {
+			screenValue: {
+				handler(e) {
+					this.reloadDatahandle()
+				},
+				immediate: true
+			},
+			houseId: {
+				handler(e) {
+					this.reloadDatahandle()
+				},
+				immediate: true
+			},
+			isSingleProject: {
+				handler(e) {
+					if (e) {
+						this.reloadDatahandle()
+					}
+				},
+				immediate: true
+			},
+			defaultParameter: {
+				handler(e) {
+					this.reloadDatahandle()
+				},
+				deep: true,
+				immediate: true
+			}
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.screen_container {
+		position: relative;
+		margin-bottom: 190rpx;
+		width: 750rpx;
+		max-height: 1000rpx;
+
+		.screen_item_title {
+			margin-left: 30rpx;
+			margin-top: 54rpx;
+			line-height: 44rpx;
+			font-size: 32rpx;
+			font-family: Verdana, Verdana-Bold;
+			font-weight: 700;
+			text-align: left;
+			color: #454545;
+		}
+
+		.level_tag_view {
+			margin-left: 30rpx;
+			margin-top: 0rpx;
+			display: flex;
+			flex-wrap: wrap;
+			align-content: center;
+			align-items: center;
+
+			.level_tag {
+				padding: 0 26rpx;
+				box-sizing: border-box;
+				margin-right: 16rpx;
+				min-width: 220rpx;
+				height: 72rpx;
+				border-radius: 12rpx;
+				margin-top: 20rpx;
+				display: flex;
+				flex-direction: column;
+				justify-content: center;
+				align-items: center;
+
+				.level_tag_title {
+					font-size: 28rpx;
+					font-family: Verdana, Verdana-Regular;
+					font-weight: 400;
+					text-align: center;
+				}
+
+				.level_tag_subTitle {
+					margin-top: -5rpx;
+					font-size: 20rpx;
+					font-family: Verdana, Verdana-Regular;
+					font-weight: 400;
+					text-align: center;
+				}
+			}
+		}
+	}
+
+	// .bottom_btn {
+	// 	display: flex;
+	// 	justify-content: center;
+	// 	position: fixed;
+	// 	width: 100%;
+	// 	left: 0;
+	// 	bottom: 60rpx;
+
+	// 	.text {
+	// 		width: 260rpx;
+	// 		height: 84rpx;
+	// 		border-radius: 42rpx;
+	// 		line-height: 84rpx;
+	// 		font-size: 32rpx;
+	// 		font-family: Verdana, Verdana-Regular;
+	// 		font-weight: 400;
+	// 		text-align: center;
+	// 		color: #ffffff;
+	// 	}
+	// }
+
+	.bottom_btn {
+		display: flex;
+		justify-content: center;
+		position: fixed;
+		width: 100%;
+		left: 0;
+		bottom: 60rpx;
+
+		.reset_btn {
+			width: 156rpx;
+			height: 80rpx;
+			border-radius: 40rpx;
+			font-size: 28rpx;
+			font-family: Verdana, Verdana-Bold;
+			font-weight: 700;
+			text-align: center;
+			line-height: 80rpx;
+			color: #666666;
+		}
+
+		.pop_btn {
+			margin-left: 30rpx;
+			width: 444rpx;
+			height: 80rpx;
+			border-radius: 40rpx;
+			font-size: 28rpx;
+			font-family: Verdana, Verdana-Bold;
+			font-weight: 700;
+			text-align: center;
+			line-height: 80rpx;
+			color: #ffffff;
+		}
+	}
+</style>

+ 0 - 0
components/subComponents/dmItemView.vue


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