Ver Fonte

绩效考核初始化

zhengkaixin há 9 meses atrás
commit
13bffe4663
76 ficheiros alterados com 18306 adições e 0 exclusões
  1. 49 0
      App.vue
  2. 79 0
      README.md
  3. 646 0
      common/pa_main.scss
  4. 1448 0
      common/uni.css
  5. 161 0
      components/daily_report_statistics_card/daily_report_statistics_card.vue
  6. 132 0
      components/employee_card/employee_card.vue
  7. 170 0
      components/employee_daily_report_card/employee_daily_report_card.vue
  8. 166 0
      components/employee_header/employee_header.vue
  9. 765 0
      components/ren-calendar/ren-calendar.vue
  10. 202 0
      components/slider-number/slider-number.vue
  11. 546 0
      components/uni-calendar/calendar.js
  12. 12 0
      components/uni-calendar/i18n/en.json
  13. 8 0
      components/uni-calendar/i18n/index.js
  14. 12 0
      components/uni-calendar/i18n/zh-Hans.json
  15. 12 0
      components/uni-calendar/i18n/zh-Hant.json
  16. 181 0
      components/uni-calendar/uni-calendar-item.vue
  17. 551 0
      components/uni-calendar/uni-calendar.vue
  18. 354 0
      components/uni-calendar/util.js
  19. 402 0
      components/uni-collapse-item/uni-collapse-item.vue
  20. 146 0
      components/uni-collapse/uni-collapse.vue
  21. 239 0
      components/uni-combox/uni-combox.vue
  22. 449 0
      components/uni-fab/uni-fab.vue
  23. 382 0
      components/uni-fab/uni-fab.vue.bak
  24. 132 0
      components/uni-icons/icons.js
  25. 10 0
      components/uni-icons/uni-icons.vue
  26. BIN
      components/uni-icons/uni.ttf
  27. 256 0
      components/uni-id-combox/uni-id-combox.vue
  28. 443 0
      components/uni-list-item/uni-list-item.vue
  29. 107 0
      components/uni-list/uni-list.vue
  30. 65 0
      components/uni-list/uni-refresh.vue
  31. 87 0
      components/uni-list/uni-refresh.wxs
  32. 252 0
      components/uni-nav-bar/uni-nav-bar.vue
  33. 27 0
      components/uni-nav-bar/uni-status-bar.vue
  34. 224 0
      components/uni-number-box/uni-number-box.vue
  35. 259 0
      components/uni-right-combox/uni-right-combox.vue
  36. 283 0
      components/uni-tag/uni-tag.vue
  37. 385 0
      components/xiaolu-tree/code.js
  38. 342 0
      components/xiaolu-tree/css/icon.css
  39. 119 0
      components/xiaolu-tree/css/style.scss
  40. 66 0
      components/xiaolu-tree/search/index.vue
  41. 62 0
      components/xiaolu-tree/tree.vue
  42. 23 0
      main.js
  43. 88 0
      manifest.json
  44. 5 0
      package.json
  45. 178 0
      pages.json
  46. 1192 0
      pages/daily_comment_score/daily_comment_score.vue
  47. 382 0
      pages/daily_report_detail/daily_report_detail.vue
  48. 475 0
      pages/daily_report_statistics/daily_report_statistics.vue
  49. 851 0
      pages/employee_daily_report/employee_daily_report.vue
  50. 573 0
      pages/employee_list/employee_list.vue
  51. 665 0
      pages/fill_log/fill_log.vue
  52. 1157 0
      pages/month_comment_score/month_comment_score.vue
  53. 306 0
      pages/month_log/month_log.vue
  54. 933 0
      pages/work_log/work_log.vue
  55. BIN
      static/arrow_down.png
  56. BIN
      static/component.png
  57. BIN
      static/componentHL.png
  58. BIN
      static/extui.png
  59. BIN
      static/extuiHL.png
  60. 539 0
      static/font/demo.css
  61. 349 0
      static/font/demo_index.html
  62. 42 0
      static/font/iconfont.css
  63. 0 0
      static/font/iconfont.js
  64. 58 0
      static/font/iconfont.json
  65. BIN
      static/font/iconfont.ttf
  66. BIN
      static/font/iconfont.woff
  67. BIN
      static/font/iconfont.woff2
  68. BIN
      static/logo.png
  69. BIN
      static/template.png
  70. BIN
      static/templateHL.png
  71. BIN
      static/uni.ttf
  72. BIN
      static/userpic.png
  73. 23 0
      store/index.js
  74. 76 0
      uni.scss
  75. 133 0
      utils/common.js
  76. 27 0
      utils/store.js

+ 49 - 0
App.vue

@@ -0,0 +1,49 @@
+<script>
+	
+	export default {
+		 
+		onLaunch: function() {
+			
+			//let workNumber = '2215aef3-4f5b-44a3-99d9-547a7a8c43d2';
+			//let kpi_url ='http://192.168.77.99:8081/jpkpi';
+			//公司API
+			let kpi_url = 'http://jxkh.hbjp.com.cn/assessment-server';//'http://192.168.77.129:8081';
+			
+			//let kpi_url = 'http://www.jzrccs.com/jxkh-api';//'http://192.168.77.129:8081';			
+			// kpi_url = 'http://192.168.77.162:8086/assessment-server/';//'http://192.168.77.129:8081';
+			//let kpi_url = 'http://10.168.1.245:8086/assessment-server';//'http://192.168.77.129:8081';
+			//let kpi_url = 'http://192.168.77.129:8086/assessment-server';
+			//let kpi_url = 'http://192.168.77.219:8086/assessment-server';
+			//let kpi_url = 'http://192.168.77.99:8081/jpkpi';
+			//uni.setStorageSync('kpi-url','http://192.168.77.99:8081')
+			uni.setStorageSync('kpi-url',kpi_url);
+			//console.log('xxxxxxkpi_url '+kpi_url)
+			//uni.setStorageSync('usId','118')
+			//uni.setStorageSync('usId',workNumber);
+			//this.getUserIdByWorkNum('2422008')
+			//console.log('App Launch')
+		},
+		onShow: function() {
+			// console.log('App Show')
+		},
+		onHide: function() {
+			// console.log('App Hide')
+		},
+		data() {
+			return {
+				//kpi_url:'http://127.0.0.1:8081',
+				//employeeID:'',
+			}
+		},
+		methods:{
+			
+		}
+	}
+	
+</script>
+
+<style>
+	/*每个页面公共css */
+	@import "/common/uni.css" 
+	
+</style>

+ 79 - 0
README.md

@@ -0,0 +1,79 @@
+# ren-calendar
+
+### 简介
+> 一款可收缩,可标记日期的日历,目前只在uni-app项目中使用,其他平台适配兼容未知,如有帮助到你不胜荣幸,欢迎Star!
+
+>[DCloud插件市场地址](https://ext.dcloud.net.cn/plugin?id=1795)
+
+
+
+### 调用示例
+
+```
+<view class="content">
+    <ren-calendar ref='ren' :markDays='markDays' :headerBar='false' @onDayClick='onDayClick'></ren-calendar>
+    <view class="change">选中日期:{{curDate}}</view>
+</view>
+```
+
+```
+ import RenCalendar from '@/components/ren-calendar/ren-calendar.vue'
+	export default {
+        components:{
+            RenCalendar
+        },
+		data() {
+			return {
+				curDate:'',
+                markDays:[]
+			}
+		},
+		onReady() {
+            let today = this.$refs.ren.getToday().date;
+            this.curDate = today;
+            this.markDays.push(today);
+		},
+		methods: {
+            onDayClick(data){
+                this.curDate = data.date;
+            }
+		}
+	}
+```
+
+### 属性说明
+
+| 属性名 | 类型   | 默认值 | 说明   |
+| :----- | :----- | :----- | :----- |
+| weekstart | Number | 0 (即周日为第一天)| 以周几为第一天|
+| markDays | Array | - | 标记的日期集合 |
+| headerBar | Boolean | true | 是否展示月份切换按钮 |
+| open | Boolean | true | 是否展开日历 |
+| collapsible | Boolean | true | 是否可收缩 |
+| disabledAfter | Boolean | false | 未来日期是否不可点击 |
+
+
+### 事件说明
+
+| 事件名 | 说明   | 
+| :----- | :----- | 
+| onDayClick | 点击日期时触发,返回当前选中日期, 如:{date: "2020-07-18", week: "星期六"}  |
+
+
+
+### 方法说明
+
+| 方法名 | 说明   | 
+| :----- | :----- | 
+| changYearMonth | 改变年月,初始化时需在onReady后通过$refs调用  |
+
+### Tips
+
+* 如果不能满足场景需求可自行更改组件源代码来满足需求
+
+### 预览
+
+![ren-calendar](https://i.loli.net/2020/07/16/rN5sGIofx7FJz8Y.png)
+![ren-calendar](https://i.loli.net/2020/07/16/a14rGY8JgIpimqv.png)
+![ren-calendar](https://i.loli.net/2020/07/16/ejMgK3EqLIdhPRO.png)
+![ren-calendar](https://i.loli.net/2020/07/16/LKZIRAgDweESxWl.png)

+ 646 - 0
common/pa_main.scss

@@ -0,0 +1,646 @@
+
+$bgcolor:#f2f2f2;
+$al_bgcolor:#21191b;
+$bg_whilecolor:#FFFFFF;
+$fgcolor:#FFFFFF;
+$red_color:#FE007E;
+$grey_color:#888A9B;
+$blue_color:#6177FF;
+$green_color:#34CBB4;
+$al_fgcolor:#b89249;
+$dates_header_bgcolor:#21191b;
+$default_row_height: 100rpx;
+$button_bgcolor:#3385FF;
+$switch_color:#3385FF;
+$tbl_border_color:#D2D2D2;
+$border_color:#D2D2D2;
+$top_item_color :#888A9B;
+$header_height:80rpx;
+$header_with_date_height:170rpx;
+
+$tail_height:100rpx;
+
+$margin_0:0rpx;
+$margin_1:10rpx;
+$margin_2:20rpx;
+$margin_3:30rpx;
+$margin_4:40rpx;
+$margin_5:50rpx;
+$margin_6:60rpx;
+$margin_7:70rpx;
+$margin_8:80rpx;
+$margin_9:90rpx;
+$margin_10:100rpx;
+
+$padding_0:0rpx;
+$padding_1:10rpx;
+$padding_2:20rpx;
+$padding_3:30rpx;
+$padding_4:40rpx;
+$padding_5:50rpx;
+$padding_6:60rpx;
+$padding_7:70rpx;
+$padding_8:80rpx;
+$padding_9:90rpx;
+$padding_10:100rpx;
+
+
+$height_default:50rpx;
+$height_small:44rpx;
+$height_min: 50rpx;
+$height_mid: 100rpx;
+$height_max: 150rpx;
+$mark_color : #F44480;
+
+$font_default:50rpx;
+$font_smallest:20rpx;
+$font_smaller:30rpx;
+$font_sm:44rpx;
+$font_mder: 50rpx;
+$font_md:60rpx;
+$font_lg:80rpx;
+$font_big:120rpx;
+
+$lineheight_footer:80rpx;
+
+.overflow_auto{overflow: auto;}
+.lh_footer{line-height: $lineheight_footer!important;}
+.mark_color{color:$mark_color;}
+.bg_whilecolor{background-color:$bg_whilecolor;}
+.btn_color{ color:$fgcolor;}
+.btn_bgcolor { background-color: $button_bgcolor;}
+.switch_color {color:$switch_color;}
+
+.h-max{height: $height_max;}
+.h-mid{height: $height_mid;}
+.h-min{height: $height_min;}
+
+/* 字体 */
+.font{ font-size: $font_default; }
+.font_smallest{font-size: $font_smallest;}
+.font_smaller{font-size: $font_smaller;}
+.font-sm{ font-size: $font_sm; }
+.font-md{ font-size: $font_md; }
+.font-mder{font-size:$font_mder;}
+.font-lg{ font-size: $font_lg; }
+.font-big{ font-size: $font_big; }
+.font-weight{ font-weight: bold!important; }
+.font-weight-100{ font-weight: 100!important; }
+
+.pa_column
+{
+	display: flex;
+	flex-direction: column;
+	
+}
+.pa_row
+{
+	display: flex;
+	flex-direction: row;
+}
+.work_break
+{
+	word-break: break-word;
+}
+
+.pa-sb{ justify-content: space-between; }
+
+.item-box
+{
+ 	display: flex;
+ 	flex-direction: row;
+	
+}
+ .page-box {
+ 	display: flex;
+ 	flex-direction: column;
+ 	height: 100%;
+ }
+.head-right-box
+{
+	position: absolute;
+	top:0;
+	height:$header_height;
+	right: 10rpx;
+	line-height: $header_height;	
+}
+
+.head-box {
+	//display:flex;
+	//flex-direction: row;
+    position:absolute;
+	top:0; /*头部绝对定位位置*/
+	height:$header_height;
+	width:100%; 
+ }
+ .head-box-date {
+ 	display:flex;
+ 	flex-direction: column;
+     position:absolute;
+ 	top:0; /*头部绝对定位位置*/
+ 	height:$header_with_date_height;
+ 	width:100%; 
+  }
+  .header-nav-box{
+	  position: absolute;
+	  top:0rpx;
+	  left: 0rpx;
+	  height: $header_height;
+	  width: 100%;
+	  background-color: #007AFF!important;
+  }
+  .heax-date-box {
+	display: flex;
+	flex-direction: row;
+	justify-content: space-between;
+	align-items:center;
+	top:$header_height;
+	height: $header_with_date_height - $header_height;
+	background-color: $bg_whilecolor; 
+  	position:absolute;
+  	width:100%;
+  /*	top:$header_with_date_height; 中间自适应部分绝对定位位置,top是头部的高度*/
+  /*	bottom:0; bottom是尾部的高度*/ 
+  	/*overflow:auto; 超出的部分,滚动条显示*/ 
+  }
+  
+  .content-box_with_date_none_footer {
+  	position:absolute;
+  	width:100%;
+  	top:$header_with_date_height; /*中间自适应部分绝对定位位置,top是头部的高度*/
+  	bottom:0; /*bottom是尾部的高度*/ 
+  	overflow:auto; /*超出的部分,滚动条显示*/ 
+  }
+  
+  .content-box_with_date_footer {
+  	position:absolute;
+  	width:100%;
+  	top:$header_with_date_height; /*中间自适应部分绝对定位位置,top是头部的高度*/
+  	bottom:$tail_height; /*bottom是尾部的高度*/ 
+  	overflow:auto; /*超出的部分,滚动条显示*/ 
+  }
+ .content-box {
+ 	position:absolute;
+	width:100%;
+	top:$header_height; /*中间自适应部分绝对定位位置,top是头部的高度*/
+	bottom:$tail_height; /*bottom是尾部的高度*/ 
+	overflow:auto; /*超出的部分,滚动条显示*/ 
+ }
+ 
+ .content-box_fixed {
+ 	position:fixed;
+ 	width:100%;
+ 	top:$header_height; /*中间自适应部分绝对定位位置,top是头部的高度*/
+ 	bottom:$tail_height; /*bottom是尾部的高度*/ 
+ 	overflow:auto; /*超出的部分,滚动条显示*/ 
+ }
+ .content-box_with_none_footer {
+ 	position:absolute;
+ 	width:100%;
+ 	top:$header_height; /*中间自适应部分绝对定位位置,top是头部的高度*/
+ 	bottom:0; /*bottom是尾部的高度*/ 
+ 	overflow:auto; /*超出的部分,滚动条显示*/ 
+ }
+ .footer-box {
+ 	position:absolute;
+	bottom:0;/*尾部绝对定位位置*/
+	height:$tail_height;
+	width:100%; 
+ }
+ 
+.pre,.next{
+	      color: #4d7df9;
+	      font-size: 28rpx;
+	      font-weight: normal;
+	      padding: 8rpx 15rpx;
+	      //border-radius: 10rpx;
+	      //border: 2rpx solid #dcdfe6;
+}
+
+.pre_unable,.next_unable
+{
+	color: #B5B5B5;
+	font-size: 28rpx;
+	font-weight: normal;
+	padding: 8rpx 15rpx;
+}
+.pre{
+	margin-right: 30rpx;
+}
+.next{
+	margin-left: 30rpx;
+} 
+ 
+/* 防止图片闪一下 */
+image{will-change: transform}
+/* scroll-view */
+.scroll-row{ width: 100%;white-space: nowrap; }
+.scroll-row-item{ display: inline-block; }
+
+body{
+	--primary:#007bff;
+	--secondary: #6c757d;
+	--success: #28a745;
+	--danger: #dc3545;
+	--warning: #ffc107;
+	--info: #17a2b8;
+	--light: #f8f9fa;
+	--dark: #343a40;
+	--muted: #6c757d;
+	--white: #fff;
+	/*--borderColor:#dee2e6;*/
+	--lightmuted:#B2B2B2;
+}
+
+ .slider_header_tip{
+ 	 font-weight: bold;
+ 	 color:#000000;
+ 	 line-height: 60rpx;
+ }
+ .slider_tail_tip{
+	 font-weight: bold;
+	 color:#0092FF;
+	 line-height: 60rpx;
+ }
+ .slider_tip{ 
+	  display: -webkit-flex; 
+	  display: flex;
+	  flex-direction: row;
+	  justify-content: space-between;
+	  background-color:#ffffff;
+	  position: relative;
+	  height: 60rpx; 
+	  margin-left: 20rpx;
+	  margin-right:20rpx;
+ }
+/* 阴影 */
+.shadow-sm {
+    box-shadow: 0 2upx 4upx rgba(114, 130, 138, 0.2)!important;
+}
+.shadow {
+    box-shadow: 0 8upx 16upx rgba(114, 130, 138, 0.2)!important;
+}
+.shadow-lg {
+    box-shadow: 0 16upx 48upx rgba(114, 130, 138, 0.2)!important;
+}
+/* 定位 */
+.position-absolute{ position: absolute; }
+.position-fixed{ position: fixed; }
+.position-relative{ position: relative; }
+.left-0{ left: 0; }
+.top-0{ top: 0; }
+.bottom-0{ bottom: 0; }
+.right-0{ right: 0; }
+/* 宽高 */
+.w_auto{width: auto;}
+.w-5{width:5%;}
+.w-10{width:10%;}
+.w-15{width:15%;}
+.w-20{width:20%;}
+.w-25{width: 25%;}
+.w-30{width:30%;}
+.w-40{width:40%;}
+.w-50{ width: 50%;}
+.w-60{width:60%;}
+.w-70{width:70%;}
+.w-75{width:75%;}
+.w-80{width:80%;}
+.w-85{width:85%;}
+.w-90{width:90%;}
+.w-100{ width: 100%;}
+
+.h_auto{height:auto;}
+.h-5{height:5%;}
+.h-10{height: 10%;}
+.h-20{height: 20%;}
+.h-25{height:25%;}
+.h-30{height:30%;}
+.h-40{height:40%}
+.h-50{ width: 50%; }
+.h-60{height: 60%;}
+.h-70{height:70%;}
+.h_75{height:75%;}
+.h_80{height:80%;}
+.h_90{height:90%;}
+.h-100{ height: 100%;}
+
+.hr-1{height:calc(100%/1);}
+.hr-2{height:calc(100%/2);}
+.hr-3{height:calc(100%/3);}
+.hr-4{height:calc(100%/4);}
+.hr-5{height:calc(100%/5);}
+.hr-6{height:calc(100%/6);}
+.hr-7{height:calc(100%/7);}
+.hr-9{height:calc(100%/8);}
+.hr-9{height:calc(100%/9);}
+.hr-10{height: calc(100%/10);}
+.hr-20{height: calc(100%/20);}
+.hr-25{height:calc(100%/25);}
+.hr-30{height:calc(100%/30);}
+.hr-40{height:calc(100%/40);}
+.hr-50{ width: calc(100%/50);}
+.hr-60{height: calc(100%/60);}
+.hr-70{height:calc(100%/70);}
+.hr_75{height:calc(100%/75);}
+.hr_80{height:calc(100%/80);}
+.hr_90{height:calc(100%/90);}
+.hr-100{ height: calc(100%/100);}
+
+ 
+.line-h0{ line-height: 0!important; }
+.line-h{ line-height: 1!important; }
+.line-h-sm{ line-height: 1.2!important; }
+.line-h-md{ line-height: 1.5!important; }
+.line-h-lg{ line-height: 2!important; }
+.line-h-big{ line-height: 3!important; }
+
+.line-through{ text-decoration: line-through; }
+
+.text-center{ text-align: center; }
+.text-left{ text-align: left; }
+.text-right{ text-align: right; }
+
+.row { box-sizing: border-box!important; display: flex!important; flex-direction: row; flex-wrap: wrap;}
+[class*='col-'],[class*='span-'],[class*='span24-'] { min-height: 1px;box-sizing: border-box!important;}
+/* 栅栏一 */
+.col-1{ width: 62.5upx; } 
+.col-2{ width: 125upx; } 
+.col-3{ width: 187.5upx; } 
+.col-4{ width: 250upx;} 
+.col-5{ width: 312.5upx; } 
+.col-6{ width: 375upx; }
+.col-7{ width: 437.5upx; }
+.col-8{ width: 500upx; }
+.col-9{ width: 562.5upx; }
+.col-10{ width: 625upx; }
+.col-11{ width: 687.5upx; }
+.col-12{ width: 750upx; }
+/* 栅栏二 */
+.span-1{ width: 5%; } 
+.span-2{ width: 10%; } 
+.span-3{ width: 15%; } 
+.span-4{ width: 20%;} 
+.span-5{ width: 25%; } 
+.span-6{ width: 30%; }
+.span-7{ width: 35%; }
+.span-8{ width: 40%; }
+.span-9{ width: 45%; }
+.span-10{ width: 50%; }
+.span-11{ width: 55%; }
+.span-12{ width: 60%; }
+.span-13{ width: 65%; }
+.span-14{ width: 70%; }
+.span-15{ width: 75%; }
+.span-16{ width: 80%; }
+.span-17{ width: 85%; }
+.span-18{ width: 90%; }
+.span-19{ width: 95%; }
+.span-20{ width: 100%; }
+/* 栅栏三 */
+.span24-1{ width: 4.17%; } 
+.span24-2{ width: 8.33%; } 
+.span24-3{ width: 12.5%; } 
+.span24-4{ width: 16.67%;} 
+.span24-5{ width: 20.83%; } 
+.span24-6{ width: 25%; }
+.span24-7{ width: 29.17%; }
+.span24-8{ width: 33.33%; }
+.span24-9{ width: 37.5%; }
+.span24-10{ width: 41.67%; }
+.span24-11{ width: 45.83%; }
+.span24-12{ width: 50%; }
+.span24-13{ width: 54.17%; }
+.span24-14{ width: 58.33%; }
+.span24-15{ width: 62.5%; }
+.span24-16{ width: 66.67%; }
+.span24-17{ width: 70.83%; }
+.span24-18{ width: 75%; }
+.span24-19{ width: 79.17%; }
+.span24-20{ width: 83.33%; }
+.span24-21{ width: 87.5%; }
+.span24-22{ width: 91.67%; }
+.span24-23{ width: 95.83%; }
+.span24-24{ width: 100%; }
+
+
+/* flex布局 */
+.d-webkit-flex{display: -webkit-flex;}
+.d-flex{ display: flex; }
+.d-block{ display: block; }
+.d-inline-block{ display: inline-block; }
+
+.flex-1{ flex: 1; }
+.flex-column{ flex-direction: column; }
+.flex-row{ flex-direction: row; }
+.flex-wrap{ flex-wrap: wrap; }
+.flex-nowrap{ flex-wrap: nowrap; }
+.flex-shrink{flex-shrink: 0;}
+.j-start{ justify-content: flex-start; }
+.j-center{ justify-content: center; }
+.j-end{ justify-content: flex-end; }
+.j-sb{ justify-content: space-between; }
+.a-center{ align-items:center; }
+.a-start{ align-items: flex-start; }
+.a-end{ align-items:flex-end; }
+.a-stretch{ align-items: stretch; }
+.a-self-start{ align-self: flex-start; }
+.a-self-auto{ align-self: auto; }
+.a-self-end{ align-self: flex-end; }
+.a-self-stretch{ align-self:stretch; }
+.a-self-baseline{ align-self:baseline; }
+/* Border */
+.border{  border-width: 1rpx; border-style: solid; border-color: $border_color;}
+.border-top{ border-top-width: 1rpx; border-top-style: solid; border-top-color: $border_color; }
+.border-right{ border-right-width: 1rpx; border-right-style: solid; border-right-color: $border_color;}
+.border-bottom{ border-bottom-width: 1rpx;border-bottom-style: solid;border-bottom-color:$border_color;}
+.border-left{ border-left-width: 1rpx;border-left-style: solid;border-left-color:$border_color;}
+
+.border_bottom_1{ border-bottom-width: 1rpx;border-bottom-style: solid;border-bottom-color:$border_color;}
+
+.border-0{ border-width: 0; }
+.border-top-0{ border-top-width: 0; }
+.border-right-0{ border-right-width: 0; }
+.border-bottom-0{ border-bottom-width: 0; }
+.border-left-0{ border-left-width: 0; }
+
+.border-top-1{ border-top-width: 1rpx; border-top-style: solid; border-top-color: $border_color; }
+.border-top-2{ border-top-width: 2rpx; border-top-style: solid; border-top-color: $border_color; }
+.border-top-3{ border-top-width: 3rpx; border-top-style: solid; border-top-color: $border_color; }
+.border-top-4{ border-top-width: 4rpx; border-top-style: solid; border-top-color: $border_color; }
+.border-top-5{ border-top-width: 5rpx; border-top-style: solid; border-top-color: $border_color; }
+.border-top-6{ border-top-width: 6rpx; border-top-style: solid; border-top-color: $border_color; }
+.border-top-7{ border-top-width: 7rpx; border-top-style: solid; border-top-color: $border_color; }
+.border-top-8{ border-top-width: 8rpx; border-top-style: solid; border-top-color: $border_color; }
+.border-top-9{ border-top-width: 9rpx; border-top-style: solid; border-top-color: $border_color; }
+.border-top-10{ border-top-width: 10rpx; border-top-style: solid; border-top-color: $border_color; }
+
+.border-primary{ border-color: var(--primary)!important }
+.border-secondary{ border-color:var(--secondary)!important }
+.border-success{ border-color: var(--success)!important }
+.border-danger{ border-color: var(--danger)!important }
+.border-warning{ border-color:var(--warning)!important }
+.border-info{ border-color: var(--info)!important }
+.border-light{ border-color: var(--light)!important }
+.border-dark{ border-color: var(--dark)!important }
+.border-white{ border-color: var(--white)!important }
+.border-light-secondary{border-color: #F1F1F1!important;}
+
+.rounded{ border-radius: 5rpx; }
+.rounded-circle{ border-radius:100%; }
+.rounded-0{ border-radius:0; }
+.rounded-1{ border-radius:1rpx; }
+.rounded-2{ border-radius:2rpx; }
+.rounded-3{ border-radius:3rpx; }
+.rounded-4{ border-radius:4rpx; }
+.rounded-5{ border-radius:5rpx; }
+.rounded-6{ border-radius:6rpx; }
+.rounded-7{ border-radius:7rpx; }
+.rounded-8{ border-radius:8rpx; }
+.rounded-9{ border-radius:9rpx; }
+.rounded-10{ border-radius:10rpx; }
+
+/* color */
+.textgreen{color:$green_color}
+.textblue{color:$blue_color}
+.textred{color:$red_color}
+.textgrey{color:$grey_color}
+.text-primary{ color:var(--primary)!important; }
+.text-secondary{ color:var(--secondary)!important; }
+.text-success{ color:var(--success)!important; }
+.text-danger{ color: var(--danger)!important; }
+.text-warning{ color:var(--warning)!important; }
+.text-info{ color: var(--info)!important; }
+.text-light{ color: var(--light)!important; }
+.text-dark{ color: var(--dark)!important; }
+.text-muted{ color: var(--muted)!important; }
+.text-light-muted{ color: var(--lightmuted)!important; }
+.text-white{ color: var(--white)!important; }
+.text-grey{color:#A19F9F!important;}
+
+.bg-primary{ background-color: $bgcolor !important; }
+.bg-secondary{ background-color:var(--secondary)!important; }
+.bg-success{ background-color:var(--success)!important; }
+.bg-danger{ background-color: var(--danger)!important; }
+.bg-warning{ background-color:var(--warning)!important; }
+.bg-info{ background-color: var(--info)!important; }
+.bg-light{ background-color: var(--light)!important; }
+.bg-dark{ background-color: var(--dark)!important; }
+.bg-white{ background-color: $bg_whilecolor!important; }
+.bg-light-secondary{background-color: #F1F1F1!important;}
+.bg-grey { background-color: #EEEEEE!important;}
+.bg_red  { background-color: #DF5000!important;}
+/* Spacing */
+.m-0 { margin-left: $margin_0;margin-right: $margin_0;margin-top: $margin_0;margin-bottom: $margin_0;}
+.m { margin-left: $margin_1;margin-right: $margin_1;margin-top: $margin_1;margin-bottom: $margin_1;}
+.m-1 { margin-left: $margin_2;margin-right: $margin_2;margin-top: $margin_2;margin-bottom: $margin_2;}
+.m-2 { margin-left: $margin_4;margin-right: $margin_4;margin-top: $margin_4;margin-bottom: $margin_4;}
+.m-3 { margin-left: $margin_6;margin-right: $margin_6;margin-top: $margin_6;margin-bottom: $margin_6;}
+.m-4 { margin-left: $margin_8;margin-right: $margin_8;margin-top: $margin_8;margin-bottom: $margin_8;}
+.m-5 { margin-left: $margin_10;margin-right: $margin_10;margin-top: $margin_10;margin-bottom: $margin_10;}
+
+.mx-0 { margin-left: $margin_0;margin-right: $margin_0;}
+.mx { margin-left: $margin_1;margin-right: $margin_1;}
+.mx-1 { margin-left: $margin_2;margin-right: $margin_2;}
+.mx-2 { margin-left: $margin_4;margin-right: $margin_4;}
+.mx-3 { margin-left: $margin_6;margin-right: $margin_6;}
+.mx-4 { margin-left: $margin_8;margin-right: $margin_8;}
+.mx-5 { margin-left: $margin_10;margin-right: $margin_10;}
+
+.my-0 { margin-top: $margin_0;margin-bottom: $margin_0;}
+.my { margin-top: $margin_1;margin-bottom: $margin_1;}
+.my-1 { margin-top: $margin_2;margin-bottom: $margin_2;}
+.my-2 { margin-top: $margin_4;margin-bottom: $margin_4;}
+.my-3 { margin-top: $margin_6;margin-bottom: $margin_6;}
+.my-4 { margin-top: $margin_8;margin-bottom: $margin_8;}
+.my-5 { margin-top: $margin_10;margin-bottom: $margin_10;}
+
+.mt-0 { margin-top: $margin_0;}
+.mt { margin-top: $margin_1;}
+.mt-auto { margin-top: auto;}
+.mt-1 { margin-top: $margin_2;}
+.mt-2 { margin-top: $margin_4;}
+.mt-3 { margin-top: $margin_6;}
+.mt-4 { margin-top: $margin_8;}
+.mt-5 { margin-top: $margin_10;}
+
+.mb-0 { margin-bottom: $margin_0;}
+.mb { margin-bottom: $margin_1;}
+.mb-auto { margin-bottom: auto;}
+.mb-1 { margin-bottom: $margin_2;}
+.mb-2 { margin-bottom: $margin_4;}
+.mb-3 { margin-bottom: $margin_6;}
+.mb-4 { margin-bottom: $margin_8;}
+.mb-5 { margin-bottom: $margin_10;}
+
+.ml-0 { margin-left: $margin_0;}
+.ml { margin-left: $margin_1;}
+.ml-auto { margin-left: auto;}
+.ml-1 { margin-left: $margin_2;}
+.ml-2 { margin-left: $margin_4;}
+.ml-3 { margin-left: $margin_6;}
+.ml-4 { margin-left: $margin_8;}
+.ml-5 { margin-left: $margin_10;}
+
+.mr-0 { margin-right: $margin_0;}
+.mr { margin-right: $margin_1;}
+.mr-1 { margin-right: $margin_2;}
+.mr-2 { margin-right: $margin_4;}
+.mr-3 { margin-right: $margin_6;}
+.mr-4 { margin-right: $margin_8;}
+.mr-5 { margin-right: $margin_10;}
+
+.p-0 {padding-left: $padding_0;padding-right: $padding_0;padding-top: $padding_0;padding-bottom: $padding_0;}
+.p {padding-left: $padding_1;padding-right: $padding_1;padding-top: $padding_1;padding-bottom:$padding_1;}
+.p-1 {padding-left: $padding_2;padding-right: $padding_2;padding-top: $padding_2;padding-bottom: $padding_2;}
+.p-2 {padding-left: $padding_4;padding-right: $padding_4;padding-top: $padding_4;padding-bottom: $padding_4;}
+.p-3 {padding-left: $padding_6;padding-right: $padding_6;padding-top: $padding_6;padding-bottom: $padding_6;}
+.p-4 {padding-left: $padding_8;padding-right: $padding_8;padding-top: $padding_8;padding-bottom: $padding_8;}
+.p-5 {padding-left: $padding_10;padding-right: $padding_10;padding-top: $padding_10;padding-bottom: $padding_10;}
+
+.px-0 { padding-left: $padding_0;padding-right: $padding_0;}
+.px { padding-left: $padding_1;padding-right: $padding_1;}
+.px-1 { padding-left: $padding_2;padding-right: $padding_2;}
+.px-2 { padding-left: $padding_4;padding-right: $padding_4;}
+.px-3 { padding-left: $padding_6;padding-right: $padding_6;}
+.px-4 { padding-left: $padding_8;padding-right: $padding_8;}
+.px-5 { padding-left: $padding_10;padding-right: $padding_10;}
+
+.py-0 { padding-top: $padding_0;padding-bottom: $padding_0;}
+.py { padding-top: $padding_1;padding-bottom: $padding_1;}
+.py-1 { padding-top: $padding_2;padding-bottom: $padding_2;}
+.py-2 { padding-top: $padding_4;padding-bottom: $padding_4;}
+.py-3 { padding-top: $padding_6;padding-bottom: $padding_6;}
+.py-4 { padding-top: $padding_8;padding-bottom: $padding_8;}
+.py-5 { padding-top: $padding_10;padding-bottom: $padding_10;}
+
+.pt-0 { padding-top: $padding_0;}
+.pt { padding-top: $padding_1;}
+.pt-1 { padding-top: $padding_2;}
+.pt-2 { padding-top: $padding_4;}
+.pt-3 { padding-top: $padding_6;}
+.pt-4 { padding-top: $padding_8;}
+.pt-5 { padding-top: $padding_10;}
+
+.pb-0 { padding-bottom: $padding_0;}
+.pb { padding-bottom: $padding_1;}
+.pb-1 { padding-bottom: $padding_2;}
+.pb-2 { padding-bottom: $padding_4;}
+.pb-3 { padding-bottom: $padding_6;}
+.pb-4 { padding-bottom: $padding_8;}
+.pb-5 { padding-bottom: $padding_10;}
+
+.pl-0 { padding-left: $padding_0;}
+.pl { padding-left: $padding_1;}
+.pl-1 { padding-left: $padding_2;}
+.pl-2 { padding-left: $padding_4;}
+.pl-3 { padding-left: $padding_6;}
+.pl-4 { padding-left: $padding_8;}
+.pl-5 { padding-left: $padding_10;}
+
+.pr-0 { padding-right: $padding_0;}
+.pr { padding-right: $padding_1;}
+.pr-1 { padding-right: $padding_2;}
+.pr-2 { padding-right: $padding_4;}
+.pr-3 { padding-right: $padding_6;}
+.pr-4 { padding-right: $padding_8;}
+.pr-5 { padding-right: $padding_10;}

+ 1448 - 0
common/uni.css

@@ -0,0 +1,1448 @@
+@font-face {
+	font-family: uniicons;
+	font-weight: normal;
+	font-style: normal;
+	src: url('./static/uni.ttf') format('truetype');
+}
+
+/*通用 */
+view{
+	font-size:28upx; 
+	line-height:1.8;
+}
+progress, checkbox-group{
+	width: 100%;
+}
+form {
+	width: 100%;
+}
+.uni-flex {
+	display: flex;
+	flex-direction: row;
+}
+.uni-flex-item {
+	flex: 1;
+}
+.uni-row {
+	flex-direction: row;
+}
+.uni-column {
+	flex-direction: column;
+}
+.uni-link{
+	color:#576B95;
+	font-size:26upx;
+}
+.uni-center{
+	text-align:center;
+}
+.uni-inline-item{
+	display: flex;
+	flex-direction: row;
+	align-items:center;
+}
+.uni-inline-item text{
+	margin-right: 20upx;
+}
+.uni-inline-item text:last-child{
+	margin-right: 0upx;
+	margin-left: 20upx;
+}
+
+/* page */
+.uni-page-head{
+	padding:35upx; 
+	text-align: center;
+}
+.uni-page-head-title {
+	display: inline-block;
+	padding: 0 40upx;
+	font-size: 30upx;
+	height: 88upx;
+	line-height: 88upx;
+	color: #BEBEBE;
+	box-sizing: border-box;
+	border-bottom: 2upx solid #D8D8D8;
+}
+.uni-page-body {
+	width: 100%;
+	flex-grow: 1;
+	overflow-x: hidden;
+}
+.uni-padding-wrap{
+	width:690upx;
+	padding:0 30upx;
+}
+.uni-word {
+	text-align: center;
+	padding:200upx 100upx;
+}
+.uni-title {
+	font-size:30upx;
+	font-weight:500;
+	padding:20upx 0;
+	line-height:1.5;
+}
+.uni-text{
+	font-size:28upx;
+}
+.uni-title text{
+	font-size:24upx; 
+	color:#888;
+}
+
+.uni-text-gray{
+	color: #ccc;
+}
+.uni-text-small {
+	font-size:24upx;
+}
+.uni-common-mb{
+	margin-bottom:30upx;
+}
+.uni-common-pb{
+	padding-bottom:30upx;
+}
+.uni-common-pl{
+	padding-left:30upx;
+}
+.uni-common-mt{
+	margin-top:30upx;
+}
+/* 背景色 */
+.uni-bg-red{
+	background:#F76260; color:#FFF;
+}
+.uni-bg-green{
+	background:#09BB07; color:#FFF;
+}
+.uni-bg-blue{
+	background:#007AFF; color:#FFF;
+}
+/* 标题 */
+.uni-h1 {font-size: 80upx; font-weight:700;}
+.uni-h2 {font-size: 60upx; font-weight:700;}
+.uni-h3 {font-size: 48upx; font-weight:700;}
+.uni-h4 {font-size: 36upx; font-weight:700;}
+.uni-h5 {font-size: 28upx; color: #8f8f94;}
+.uni-h6 {font-size: 24upx; color: #8f8f94;}
+.uni-bold{font-weight:bold;}
+
+/* 文本溢出隐藏 */
+.uni-ellipsis {overflow: hidden; white-space: nowrap; text-overflow: ellipsis;}
+
+/* 竖向百分百按钮 */
+.uni-btn-v{
+	padding:10upx 0;
+}
+.uni-btn-v button{margin:20upx 0;}
+
+/* 表单 */
+.uni-form-item{
+	display:flex;
+	width:100%;
+	padding:10upx 0;
+}
+.uni-form-item .title{
+	padding:10upx 25upx;
+}
+.uni-label {
+	width: 210upx;
+	word-wrap: break-word;
+	word-break: break-all;
+	text-indent:20upx;
+}
+.uni-input {
+	height: 50upx;
+	padding: 15upx 25upx;
+	line-height:50upx;
+	font-size:28upx;
+	background:#FFF;
+	flex: 1;
+}
+radio-group, checkbox-group{
+	width:100%;
+}
+radio-group label, checkbox-group label{
+	padding-right:20upx;
+}
+.uni-form-item .with-fun{
+	display:flex; 
+	flex-wrap:nowrap; 
+	background:#FFFFFF;
+}
+.uni-form-item .with-fun .uni-icon{
+	width:40px; 
+	height:80upx; 
+	line-height:80upx; 
+	flex-shrink:0;
+}
+
+/* loadmore */
+.uni-loadmore{
+	height:80upx;
+	line-height:80upx;
+	text-align:center;
+	padding-bottom:30upx;
+}
+/*数字角标*/
+.uni-badge,
+.uni-badge-default {
+	font-family: 'Helvetica Neue', Helvetica, sans-serif;
+	font-size: 12px;
+	line-height: 1;
+	display: inline-block;
+	padding: 3px 6px;
+	color: #333;
+	border-radius: 100px;
+	background-color: rgba(0, 0, 0, .15);
+}
+.uni-badge.uni-badge-inverted {
+	padding: 0 5px 0 0;
+	color: #929292;
+	background-color: transparent
+}
+.uni-badge-primary {
+	color: #fff;
+	background-color: #007aff
+}
+.uni-badge-blue.uni-badge-inverted,
+.uni-badge-primary.uni-badge-inverted {
+	color: #007aff;
+	background-color: transparent
+}
+.uni-badge-green,
+.uni-badge-success {
+	color: #fff;
+	background-color: #4cd964;
+}
+.uni-badge-green.uni-badge-inverted,
+.uni-badge-success.uni-badge-inverted {
+	color: #4cd964;
+	background-color: transparent
+}
+.uni-badge-warning,
+.uni-badge-yellow {
+	color: #fff;
+	background-color: #f0ad4e
+}
+.uni-badge-warning.uni-badge-inverted,
+.uni-badge-yellow.uni-badge-inverted {
+	color: #f0ad4e;
+	background-color: transparent
+}
+.uni-badge-danger,
+.uni-badge-red {
+	color: #fff;
+	background-color: #dd524d
+}
+.uni-badge-danger.uni-badge-inverted,
+.uni-badge-red.uni-badge-inverted {
+	color: #dd524d;
+	background-color: transparent
+}
+.uni-badge-purple,
+.uni-badge-royal {
+	color: #fff;
+	background-color: #8a6de9
+}
+.uni-badge-purple.uni-badge-inverted,
+.uni-badge-royal.uni-badge-inverted {
+	color: #8a6de9;
+	background-color: transparent
+}
+
+/*折叠面板 */
+.uni-collapse-content {
+	height: 0;
+	width: 100%;
+	overflow: hidden;
+}
+.uni-collapse-content.uni-active {
+	height: auto;
+}
+
+/*卡片视图 */
+.uni-card {
+	background: #fff;
+	border-radius: 8upx;
+	margin:20upx 0;
+	position: relative;
+	box-shadow: 0 2upx 4upx rgba(0, 0, 0, .3);
+}
+.uni-card-content {
+	font-size: 30upx;
+}
+.uni-card-content.image-view{
+    width: 100%;
+    margin: 0;
+}
+.uni-card-content-inner {
+	position: relative;
+	padding: 30upx;
+}
+.uni-card-footer,
+.uni-card-header {
+	position: relative;
+	display: flex;
+	min-height: 50upx;
+	padding: 20upx 30upx;
+	justify-content: space-between;
+	align-items: center;
+}
+.uni-card-header {
+	font-size: 36upx;
+}
+.uni-card-footer {
+	color: #6d6d72;
+}
+.uni-card-footer:before,
+.uni-card-header:after {
+	position: absolute;
+	top: 0;
+	right: 0;
+	left: 0;
+	height: 2upx;
+	content: '';
+	-webkit-transform: scaleY(.5);
+	transform: scaleY(.5);
+	background-color: #c8c7cc;
+}
+.uni-card-header:after {
+	top: auto;
+	bottom: 0;
+}
+.uni-card-media {
+	justify-content: flex-start;
+}
+.uni-card-media-logo {
+	height: 84upx;
+	width: 84upx;
+	margin-right: 20upx;
+}
+.uni-card-media-body {
+	height: 84upx;
+	display: flex;
+	flex-direction: column;
+	justify-content: space-between;
+	align-items: flex-start;
+}
+.uni-card-media-text-top {
+	line-height: 36upx;
+	font-size: 34upx;
+}
+.uni-card-media-text-bottom {
+	line-height: 30upx;
+	font-size: 28upx;
+	color: #8f8f94;
+}
+.uni-card-link {
+	color: #007AFF;
+}
+
+/* 列表 */
+.uni-list {
+	background-color: #FFFFFF;
+	position: relative;
+	width: 100%;
+	display: flex;
+	flex-direction: column;
+}
+.uni-list:after {
+	position: absolute;
+	z-index: 10;
+	right: 0;
+	bottom: 0;
+	left: 0;
+	height: 1px;
+	content: '';
+	-webkit-transform: scaleY(.5);
+	transform: scaleY(.5);
+	background-color: #c8c7cc;
+}
+.uni-list::before {
+	position: absolute;
+	z-index: 10;
+	right: 0;
+	top: 0;
+	left: 0;
+	height: 1px;
+	content: '';
+	-webkit-transform: scaleY(.5);
+	transform: scaleY(.5);
+	background-color: #c8c7cc;
+}
+.uni-list-cell {
+	position: relative;
+	display: flex;
+	flex-direction: row;
+	justify-content: space-between;
+	align-items: center;
+}
+.uni-list-cell-hover {
+	background-color: #eee;
+}
+.uni-list-cell-pd {
+	padding: 22upx 30upx;
+}
+.uni-list-cell-left {
+	font-size:28upx;
+	padding: 0 30upx;
+}
+.uni-list-cell-db,
+.uni-list-cell-right {
+	flex: 1;
+}
+.uni-list-cell::after {
+	position: absolute;
+  z-index: 3;
+	right: 0;
+	bottom: 0;
+	left: 30upx;
+	height: 1px;
+	content: '';
+	-webkit-transform: scaleY(.5);
+	transform: scaleY(.5);
+	background-color: #c8c7cc;
+}
+.uni-list .uni-list-cell:last-child::after {
+	height: 0upx;
+}
+.uni-list-cell-last.uni-list-cell::after {
+	height: 0upx;
+}
+.uni-list-cell-divider {
+	position: relative;
+	display: flex;
+	color: #999;
+	background-color: #f7f7f7;
+	padding:15upx 20upx;
+}
+.uni-list-cell-divider::before {
+	position: absolute;
+	right: 0;
+	top: 0;
+	left: 0;
+	height: 1px;
+	content: '';
+	-webkit-transform: scaleY(.5);
+	transform: scaleY(.5);
+	background-color: #c8c7cc;
+}
+.uni-list-cell-divider::after {
+	position: absolute;
+	right: 0;
+	bottom: 0;
+	left: 0upx;
+	height: 1px;
+	content: '';
+	-webkit-transform: scaleY(.5);
+	transform: scaleY(.5);
+	background-color: #c8c7cc;
+}
+.uni-list-cell-navigate {
+	font-size:30upx;
+	padding: 22upx 30upx;
+	line-height: 48upx;
+	position: relative;
+	display: flex;
+	box-sizing: border-box;
+	width: 100%;
+	flex: 1;
+	justify-content: space-between;
+	align-items: center;
+}
+.uni-list-cell-navigate {
+	padding-right: 36upx;
+}
+.uni-navigate-badge {
+	padding-right: 50upx;
+}
+.uni-list-cell-navigate.uni-navigate-right:after {
+	font-family: uniicons;
+	content: '\e583';
+	position: absolute;
+	right: 24upx;
+	top: 50%;
+	color: #bbb;
+	-webkit-transform: translateY(-50%);
+	transform: translateY(-50%);
+}
+.uni-list-cell-navigate.uni-navigate-bottom:after {
+	font-family: uniicons;
+	content: '\e581';
+	position: absolute;
+	right: 24upx;
+	top: 50%;
+	color: #bbb;
+	-webkit-transform: translateY(-50%);
+	transform: translateY(-50%);
+}
+.uni-list-cell-navigate.uni-navigate-bottom.uni-active::after {
+	font-family: uniicons;
+	content: '\e580';
+	position: absolute;
+	right: 24upx;
+	top: 50%;
+	color: #bbb;
+	-webkit-transform: translateY(-50%);
+	transform: translateY(-50%);
+}
+.uni-collapse.uni-list-cell {
+	flex-direction: column;
+}
+.uni-list-cell-navigate.uni-active {
+	background: #eee;
+}
+.uni-list.uni-collapse {
+	box-sizing: border-box;
+	height: 0;
+	overflow: hidden;
+}
+.uni-collapse .uni-list-cell {
+	padding-left: 20upx;
+}
+.uni-collapse .uni-list-cell::after {
+	left: 52upx;
+}
+.uni-list.uni-active {
+	height: auto;
+}
+
+/* 三行列表 */
+.uni-triplex-row {
+	display: flex;
+	flex: 1;
+	width: 100%;
+	box-sizing: border-box;
+	flex-direction: row;
+	padding: 22upx 30upx;
+}
+.uni-triplex-right,
+.uni-triplex-left {
+	display: flex;
+	flex-direction: column;
+}
+.uni-triplex-left {
+	width: 84%;
+}
+.uni-triplex-left .uni-title{
+	padding:8upx 0;
+}
+.uni-triplex-left .uni-text, .uni-triplex-left .uni-text-small{color:#999999;}
+.uni-triplex-right {
+	width: 16%;
+	text-align: right;
+}
+
+/* 图文列表 */
+.uni-media-list {
+	padding: 22upx 30upx;
+	box-sizing: border-box;
+	display: flex;
+	width: 100%;
+	flex-direction: row;
+}
+.uni-navigate-right.uni-media-list {
+	padding-right: 74upx;
+}
+.uni-pull-right {
+	flex-direction: row-reverse;
+}
+.uni-pull-right>.uni-media-list-logo {
+	margin-right: 0upx;
+	margin-left: 20upx;
+}
+.uni-media-list-logo {
+	height: 84upx;
+	width: 84upx;
+	margin-right: 20upx;
+}
+.uni-media-list-logo image {
+	height: 100%;
+	width: 100%;
+}
+.uni-media-list-body {
+	height: 84upx;
+	display: flex;
+	flex: 1;
+	flex-direction: column;
+	justify-content: space-between;
+	align-items: flex-start;
+	overflow: hidden;
+}
+.uni-media-list-text-top {
+	width: 100%;
+	line-height: 36upx;
+	font-size: 30upx;
+}
+.uni-media-list-text-bottom {
+	width: 100%;
+	line-height: 30upx;
+	font-size: 26upx;
+	color: #8f8f94;
+}
+
+/* 九宫格 */
+.uni-grid-9 {
+	background: #f2f2f2;
+	width: 750upx;
+	display: flex;
+	flex-direction: row;
+	flex-wrap: wrap;
+	border-top: 2upx solid #eee;
+}
+.uni-grid-9-item {
+	width: 250upx;
+	height: 200upx;
+	display: flex;
+	flex-direction: column;
+	align-items: center;
+	justify-content: center;
+	border-bottom: 2upx solid;
+	border-right: 2upx solid;
+	border-color: #eee;
+	box-sizing: border-box;
+}
+.no-border-right {
+	border-right: none;
+}
+.uni-grid-9-image {
+	width: 100upx;
+	height: 100upx;
+}
+.uni-grid-9-text {
+	width: 250upx;
+	line-height: 4upx;
+	height: 40upx;
+	text-align: center;
+	font-size: 30upx;
+}
+.uni-grid-9-item-hover {
+	background: rgba(0, 0, 0, 0.1);
+}
+
+/* 上传 */
+.uni-uploader {
+	flex: 1;
+	flex-direction: column;
+}
+.uni-uploader-head {
+	display: flex;
+	flex-direction: row;
+	justify-content: space-between;
+}
+.uni-uploader-info {
+	color: #B2B2B2;
+}
+.uni-uploader-body {
+	margin-top: 16upx;
+}
+.uni-uploader__files {
+	display: flex;
+	flex-direction: row;
+	flex-wrap: wrap;
+}
+.uni-uploader__file {
+	margin: 10upx;
+	width: 210upx;
+	height: 210upx;
+}
+.uni-uploader__img {
+	display: block;
+	width: 210upx;
+	height: 210upx;
+}
+.uni-uploader__input-box {
+	position: relative;
+	margin:10upx;
+	width: 208upx;
+	height: 208upx;
+	border: 2upx solid #D9D9D9;
+}
+.uni-uploader__input-box:before,
+.uni-uploader__input-box:after {
+	content: " ";
+	position: absolute;
+	top: 50%;
+	left: 50%;
+	-webkit-transform: translate(-50%, -50%);
+	transform: translate(-50%, -50%);
+	background-color: #D9D9D9;
+}
+.uni-uploader__input-box:before {
+	width: 4upx;
+	height: 79upx;
+}
+.uni-uploader__input-box:after {
+	width: 79upx;
+	height: 4upx;
+}
+.uni-uploader__input-box:active {
+	border-color: #999999;
+}
+.uni-uploader__input-box:active:before,
+.uni-uploader__input-box:active:after {
+	background-color: #999999;
+}
+.uni-uploader__input {
+	position: absolute;
+	z-index: 1;
+	top: 0;
+	left: 0;
+	width: 100%;
+	height: 100%;
+	opacity: 0;
+}
+
+/*问题反馈*/
+.feedback-title {
+	display: flex;
+	flex-direction: row;
+	justify-content: space-between;
+	align-items: center;
+	padding: 20upx;
+	color: #8f8f94;
+	font-size: 28upx;
+}
+.feedback-star-view.feedback-title {
+	justify-content: flex-start;
+	margin: 0;
+}
+.feedback-quick {
+	position: relative;
+	padding-right: 40upx;
+}
+.feedback-quick:after {
+	font-family: uniicons;
+	font-size: 40upx;
+	content: '\e581';
+	position: absolute;
+	right: 0;
+	top: 50%;
+	color: #bbb;
+	-webkit-transform: translateY(-50%);
+	transform: translateY(-50%);
+}
+.feedback-body {
+	background: #fff;
+}
+.feedback-textare {
+	height: 200upx;
+	font-size: 34upx;
+	line-height: 50upx;
+	width: 100%;
+	box-sizing: border-box;
+	padding: 20upx 30upx 0;
+}
+.feedback-input {
+	font-size: 34upx;
+	height: 50upx;
+	min-height: 50upx;
+	padding: 15upx 20upx;
+	line-height: 50upx;
+}
+.feedback-uploader {
+	padding: 22upx 20upx;
+}
+.feedback-star {
+	font-family: uniicons;
+	font-size: 40upx;
+	margin-left: 6upx;
+}
+.feedback-star-view {
+	margin-left: 20upx;
+}
+.feedback-star:after {
+	content: '\e408';
+}
+.feedback-star.active {
+	color: #FFB400;
+}
+.feedback-star.active:after {
+	content: '\e438';
+}
+.feedback-submit {
+	background: #007AFF;
+	color: #FFFFFF;
+	margin: 20upx;
+}
+
+/* input group */
+.uni-input-group {
+	position: relative;
+	padding: 0;
+	border: 0;
+	background-color: #fff;
+}
+
+.uni-input-group:before {
+	position: absolute;
+	top: 0;
+	right: 0;
+	left: 0;
+	height: 2upx;
+	content: '';
+	transform: scaleY(.5);
+	background-color: #c8c7cc;
+}
+
+.uni-input-group:after {
+	position: absolute;
+	right: 0;
+	bottom: 0;
+	left: 0;
+	height: 2upx;
+	content: '';
+	transform: scaleY(.5);
+	background-color: #c8c7cc;
+}
+
+.uni-input-row {
+	position: relative;
+	display: flex;
+	flex-direction: row;
+	font-size:28upx;
+	padding: 22upx 30upx;
+	justify-content: space-between;
+}
+
+.uni-input-group .uni-input-row:after {
+	position: absolute;
+	right: 0;
+	bottom: 0;
+	left: 30upx;
+	height: 2upx;
+	content: '';
+	transform: scaleY(.5);
+	background-color: #c8c7cc;
+}
+
+.uni-input-row label {
+	line-height: 70upx;
+}
+
+/* textarea */
+.uni-textarea{
+	width:100%;
+	background:#FFF;
+}
+.uni-textarea textarea{
+	width:96%;
+	padding:18upx 2%;
+	line-height:1.6;
+	font-size:28upx;
+	height:150upx;
+}
+
+/* tab bar */
+.uni-tab-bar {
+	display: flex;
+	flex: 1;
+	flex-direction: column;
+	overflow: hidden;
+	height: 100%;
+}
+
+.uni-tab-bar .list {
+	width: 750upx;
+	height: 100%;
+}
+
+.uni-swiper-tab {
+	width: 100%;
+	white-space: nowrap;
+	line-height: 100upx;
+	height: 100upx;
+	/* border-bottom: 1px solid #c8c7cc; */
+}
+
+.swiper-tab-list {
+	font-size: 30upx;
+	width: 120upx;
+	position: relative;
+	display: inline-block;
+	text-align: center;
+	color: #555;
+}
+
+.uni-tab-bar .active {
+	color: #FD6801;
+}
+
+.uni-tab-bar .swiper-box {
+	flex: 1;
+	width: 100%;
+	height: calc(100% - 100upx);
+}
+
+.uni-tab-bar-loading{
+	padding:20upx 0;
+}
+
+/* comment */
+.uni-comment{padding:5rpx 0; display: flex; flex-grow:1; flex-direction: column;}
+.uni-comment-list{flex-wrap:nowrap; padding:10rpx 0; margin:10rpx 0; width:100%; display: flex;}
+.uni-comment-face{width:70upx; height:70upx; border-radius:100%; margin-right:20upx; flex-shrink:0; overflow:hidden;}
+.uni-comment-face image{width:100%; border-radius:100%;}
+.uni-comment-body{width:100%;}
+.uni-comment-top{line-height:1.5em; justify-content:space-between;}
+.uni-comment-top text{color:#0A98D5; font-size:24upx;}
+.uni-comment-date{line-height:38upx; flex-direction:row; justify-content:space-between; display:flex !important; flex-grow:1;}
+.uni-comment-date view{color:#666666; font-size:24upx; line-height:38upx;}
+.uni-comment-content{line-height:1.6em; font-size:28upx; padding:8rpx 0;}
+.uni-comment-replay-btn{background:#FFF; font-size:24upx; line-height:28upx; padding:5rpx 20upx; border-radius:30upx; color:#333 !important; margin:0 10upx;}
+
+/* swiper msg */
+.uni-swiper-msg{width:100%; padding:12rpx 0; flex-wrap:nowrap; display:flex;}
+.uni-swiper-msg-icon{width:50upx; margin-right:20upx;}
+.uni-swiper-msg-icon image{width:100%; flex-shrink:0;}
+.uni-swiper-msg swiper{width:100%; height:50upx;}
+.uni-swiper-msg swiper-item{line-height:50upx;}
+
+/* product */
+.uni-product-list {
+    display: flex;
+    width: 100%;
+    flex-wrap: wrap;
+    flex-direction: row;
+}
+
+.uni-product {
+    padding: 20upx;
+    display: flex;
+    flex-direction: column;
+}
+
+.image-view {
+    height: 330upx;
+    width: 330upx;
+	margin:12upx 0;
+}
+
+.uni-product-image {
+    height: 330upx;
+    width: 330upx;
+}
+
+.uni-product-title {
+    width: 300upx;
+    word-break: break-all;
+    display: -webkit-box;
+    overflow: hidden;
+	line-height:1.5;
+    text-overflow: ellipsis;
+    -webkit-box-orient: vertical;
+    -webkit-line-clamp: 2;
+}
+
+.uni-product-price {
+	margin-top:10upx;
+    font-size: 28upx;
+	line-height:1.5;
+    position: relative;
+}
+
+.uni-product-price-original {
+    color: #e80080;
+}
+
+.uni-product-price-favour {
+    color: #888888;
+    text-decoration: line-through;
+    margin-left: 10upx;
+}
+
+.uni-product-tip {
+    position: absolute;
+    right: 10upx;
+    background-color: #ff3333;
+    color: #ffffff;
+    padding: 0 10upx;
+    border-radius: 5upx;
+}
+
+/* timeline */
+.uni-timeline {
+		margin: 35upx 0;
+		display: flex;
+		flex-direction: column;
+		position: relative;
+	}
+
+
+	.uni-timeline-item {
+		display: flex;
+		flex-direction: row;
+		position: relative;
+		padding-bottom: 20upx;
+		box-sizing: border-box;
+		overflow: hidden;
+
+	}
+
+	.uni-timeline-item .uni-timeline-item-keynode {
+		width: 160upx;
+		flex-shrink: 0;
+		box-sizing: border-box;
+		padding-right: 20upx;
+		text-align: right;
+		line-height: 65upx;
+	}
+
+	.uni-timeline-item .uni-timeline-item-divider {
+		flex-shrink: 0;
+		position: relative;
+		width: 30upx;
+		height: 30upx;
+		top: 15upx;
+		border-radius: 50%;
+		background-color: #bbb;
+	}
+
+
+
+	.uni-timeline-item-divider::before,
+	.uni-timeline-item-divider::after {
+		position: absolute;
+		left: 15upx;
+		width: 1upx;
+		height: 100vh;
+		content: '';
+		background: inherit;
+	}
+
+	.uni-timeline-item-divider::before {
+		bottom: 100%;
+	}
+
+	.uni-timeline-item-divider::after {
+		top: 100%;
+	}
+
+
+	.uni-timeline-last-item .uni-timeline-item-divider:after {
+		display: none;
+	}
+
+	.uni-timeline-first-item .uni-timeline-item-divider:before {
+		display: none;
+	}
+
+	.uni-timeline-item .uni-timeline-item-content {
+		padding-left: 20upx;
+	}
+	
+	.uni-timeline-last-item .bottom-border::after{
+		display: none;
+	}
+	
+	.uni-timeline-item-content .datetime{
+		color: #CCCCCC;
+	}
+	
+	/* 自定义节点颜色 */
+	.uni-timeline-last-item .uni-timeline-item-divider{
+		background-color: #1AAD19;
+	}
+  
+  
+/* uni-icon */
+
+.uni-icon {
+	font-family: uniicons;
+	font-size: 24px;
+	font-weight: normal;
+	font-style: normal;
+	line-height: 1;
+	display: inline-block;
+	text-decoration: none;
+	-webkit-font-smoothing: antialiased;
+}
+
+.uni-icon.uni-active {
+	color: #007aff;
+}
+
+.uni-icon-contact:before {
+	content: '\e100';
+}
+
+.uni-icon-person:before {
+	content: '\e101';
+}
+
+.uni-icon-personadd:before {
+	content: '\e102';
+}
+
+.uni-icon-contact-filled:before {
+	content: '\e130';
+}
+
+.uni-icon-person-filled:before {
+	content: '\e131';
+}
+
+.uni-icon-personadd-filled:before {
+	content: '\e132';
+}
+
+.uni-icon-phone:before {
+	content: '\e200';
+}
+
+.uni-icon-email:before {
+	content: '\e201';
+}
+
+.uni-icon-chatbubble:before {
+	content: '\e202';
+}
+
+.uni-icon-chatboxes:before {
+	content: '\e203';
+}
+
+.uni-icon-phone-filled:before {
+	content: '\e230';
+}
+
+.uni-icon-email-filled:before {
+	content: '\e231';
+}
+
+.uni-icon-chatbubble-filled:before {
+	content: '\e232';
+}
+
+.uni-icon-chatboxes-filled:before {
+	content: '\e233';
+}
+
+.uni-icon-weibo:before {
+	content: '\e260';
+}
+
+.uni-icon-weixin:before {
+	content: '\e261';
+}
+
+.uni-icon-pengyouquan:before {
+	content: '\e262';
+}
+
+.uni-icon-chat:before {
+	content: '\e263';
+}
+
+.uni-icon-qq:before {
+	content: '\e264';
+}
+
+.uni-icon-videocam:before {
+	content: '\e300';
+}
+
+.uni-icon-camera:before {
+	content: '\e301';
+}
+
+.uni-icon-mic:before {
+	content: '\e302';
+}
+
+.uni-icon-location:before {
+	content: '\e303';
+}
+
+.uni-icon-mic-filled:before,
+.uni-icon-speech:before {
+	content: '\e332';
+}
+
+.uni-icon-location-filled:before {
+	content: '\e333';
+}
+
+.uni-icon-micoff:before {
+	content: '\e360';
+}
+
+.uni-icon-image:before {
+	content: '\e363';
+}
+
+.uni-icon-map:before {
+	content: '\e364';
+}
+
+.uni-icon-compose:before {
+	content: '\e400';
+}
+
+.uni-icon-trash:before {
+	content: '\e401';
+}
+
+.uni-icon-upload:before {
+	content: '\e402';
+}
+
+.uni-icon-download:before {
+	content: '\e403';
+}
+
+.uni-icon-close:before {
+	content: '\e404';
+}
+
+.uni-icon-redo:before {
+	content: '\e405';
+}
+
+.uni-icon-undo:before {
+	content: '\e406';
+}
+
+.uni-icon-refresh:before {
+	content: '\e407';
+}
+
+.uni-icon-star:before {
+	content: '\e408';
+}
+
+.uni-icon-plus:before {
+	content: '\e409';
+}
+
+.uni-icon-minus:before {
+	content: '\e410';
+}
+
+.uni-icon-circle:before,
+.uni-icon-checkbox:before {
+	content: '\e411';
+}
+
+.uni-icon-close-filled:before,
+.uni-icon-clear:before {
+	content: '\e434';
+}
+
+.uni-icon-refresh-filled:before {
+	content: '\e437';
+}
+
+.uni-icon-star-filled:before {
+	content: '\e438';
+}
+
+.uni-icon-plus-filled:before {
+	content: '\e439';
+}
+
+.uni-icon-minus-filled:before {
+	content: '\e440';
+}
+
+.uni-icon-circle-filled:before {
+	content: '\e441';
+}
+
+.uni-icon-checkbox-filled:before {
+	content: '\e442';
+}
+
+.uni-icon-closeempty:before {
+	content: '\e460';
+}
+
+.uni-icon-refreshempty:before {
+	content: '\e461';
+}
+
+.uni-icon-reload:before {
+	content: '\e462';
+}
+
+.uni-icon-starhalf:before {
+	content: '\e463';
+}
+
+.uni-icon-spinner:before {
+	content: '\e464';
+}
+
+.uni-icon-spinner-cycle:before {
+	content: '\e465';
+}
+
+.uni-icon-search:before {
+	content: '\e466';
+}
+
+.uni-icon-plusempty:before {
+	content: '\e468';
+}
+
+.uni-icon-forward:before {
+	content: '\e470';
+}
+
+.uni-icon-back:before,
+.uni-icon-left-nav:before {
+	content: '\e471';
+}
+
+.uni-icon-checkmarkempty:before {
+	content: '\e472';
+}
+
+.uni-icon-home:before {
+	content: '\e500';
+}
+
+.uni-icon-navigate:before {
+	content: '\e501';
+}
+
+.uni-icon-gear:before {
+	content: '\e502';
+}
+
+.uni-icon-paperplane:before {
+	content: '\e503';
+}
+
+.uni-icon-info:before {
+	content: '\e504';
+}
+
+.uni-icon-help:before {
+	content: '\e505';
+}
+
+.uni-icon-locked:before {
+	content: '\e506';
+}
+
+.uni-icon-more:before {
+	content: '\e507';
+}
+
+.uni-icon-flag:before {
+	content: '\e508';
+}
+
+.uni-icon-home-filled:before {
+	content: '\e530';
+}
+
+.uni-icon-gear-filled:before {
+	content: '\e532';
+}
+
+.uni-icon-info-filled:before {
+	content: '\e534';
+}
+
+.uni-icon-help-filled:before {
+	content: '\e535';
+}
+
+.uni-icon-more-filled:before {
+	content: '\e537';
+}
+
+.uni-icon-settings:before {
+	content: '\e560';
+}
+
+.uni-icon-list:before {
+	content: '\e562';
+}
+
+.uni-icon-bars:before {
+	content: '\e563';
+}
+
+.uni-icon-loop:before {
+	content: '\e565';
+}
+
+.uni-icon-paperclip:before {
+	content: '\e567';
+}
+
+.uni-icon-eye:before {
+	content: '\e568';
+}
+
+.uni-icon-arrowup:before {
+	content: '\e580';
+}
+
+.uni-icon-arrowdown:before {
+	content: '\e581';
+}
+
+.uni-icon-arrowleft:before {
+	content: '\e582';
+}
+
+.uni-icon-arrowright:before {
+	content: '\e583';
+}
+
+.uni-icon-arrowthinup:before {
+	content: '\e584';
+}
+
+.uni-icon-arrowthindown:before {
+	content: '\e585';
+}
+
+.uni-icon-arrowthinleft:before {
+	content: '\e586';
+}
+
+.uni-icon-arrowthinright:before {
+	content: '\e587';
+}
+
+.uni-icon-pulldown:before {
+	content: '\e588';
+}
+
+.uni-icon-scan:before {
+    content: "\e612";
+}
+
+/* 分界线 */
+.uni-divider{
+    height: 110upx;
+    display: flex;
+    align-items:center;
+    justify-content: center;
+    position: relative;
+}
+.uni-divider__content{
+    font-size: 28upx;
+    color: #999;
+    padding: 0 20upx;
+    position: relative;
+    z-index: 101;
+    background: #F4F5F6;
+}
+.uni-divider__line{
+    background-color: #CCCCCC;
+    height: 1px;
+    width: 100%;
+    position: absolute;
+    z-index: 100;
+    top: 50%;
+    left: 0;
+    transform: translateY(50%);
+}

+ 161 - 0
components/daily_report_statistics_card/daily_report_statistics_card.vue

@@ -0,0 +1,161 @@
+<template>
+	<view class="daily_report_statistics_card" :class="{onDutyStatus:onDuty,notOnDutyStatus:!onDuty}" @click="clicked">
+		<view class="row_header">
+			<label class="item font-weight">日报统计</label>
+			<label class="item">{{date}}</label>
+		</view>
+		<view v-if="onDuty" class="row"> 
+			<view class="column1">
+				<label class="font-weight">{{submitted}}</label>
+				<label>已提交</label>
+			</view>
+			<label class="item2">|</label>
+			<view class="column1 ">
+				<label class="font-weight" style="color: #DF5000;font-size: 40rpx;">{{unsubmitted}}</label>
+				<label>未提交</label>
+			</view>
+		</view>
+		<view v-else class="row">
+			<view class="column3">
+				<label class="item3">休息</label>				
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	
+	export default {
+		
+		
+	    name: 'daily-report-statistics-card',
+		props: {
+		    // 星期几为第一天(0为星期日)
+		    date: {
+		        type: String,
+		        default: '2020-01-01 星期二'
+		    },
+			submitted:{
+				type: Number,
+				default:1
+			},
+			unsubmitted:{
+				type:Number,
+				default:2
+			},
+			onDuty:
+			{
+				type:Boolean,
+				default:true
+			}
+		},
+		methods:
+		{
+			clicked()
+			{
+				//console.log('date' + this.date+' submitted '+ this.unsubmitted);
+				let response={
+					date:this.date,
+					submiteed:this.submitted,
+					unsubmitted:this.unsubmitted,
+					
+				};
+				this.$emit("onCardClick",response);
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	@import "@/common/pa_main.scss";
+	.daily_report_statistics_card{
+/**		display: flex;
+		flex-direction: column; */
+		border-radius: 20rpx;
+		
+		display: flex;
+		flex-direction: column;
+		/**justify-content: space-around;**/
+		position: relative;
+		height: 240rpx; 
+		top:0rpx;
+		left:0rpx;  	
+		justify-content: center;
+		align-items:center; 
+		margin-left: $margin_4;margin-right: $margin_4;margin-top: $margin_4;margin-bottom: $margin_4; 
+		
+		background-color: #61eaff!important;
+		border-top: 0rpx;
+		border-left: 0rpx;
+		border-right:0rpx;
+		border-bottom: 10rpx;
+		border-style: solid;
+		border-bottom-color: #F4F4F4;
+		width: auto;
+		
+		//background-color: #FFFFFF;
+	}
+	.column1{
+		display: flex;
+		flex-direction: column;  
+		justify-content: center;
+		align-items: center;
+//		background-color: #007AFF;
+		width:calc(100%/3)
+	}
+	.column2{
+		display: flex;
+		flex-direction: column;  
+		justify-content: center;
+		align-items: center;
+//		background-color: #007AFF;
+		width:calc(100%/3)
+	}
+	
+	.column3{
+			display: flex;
+			flex-direction: column;  
+			justify-content: center;
+			align-items: center;
+			flex: 1;
+		}
+	.item2{
+		color:#D2D2D2;
+	}
+	
+	.item3{
+		font-size: 60rpx;
+		line-height: 100rpx;
+		color: #688987;
+	}
+	.item
+	{
+		align-items: center;
+		justify-content: center;
+		line-height: 100rpx; 
+		margin-left:30rpx;
+		margin-right: 30rpx;
+	}
+	.row_header{
+		display: flex;
+		flex-direction: row;
+		height: 100rpx;
+		width: 100%;
+		justify-content: space-between; 
+	}
+	.row{
+		display: flex;
+		flex-direction: row;
+		height: 100rpx;
+		width: 100%;
+		justify-content: space-between; 
+	}
+	.onDutyStatus
+	{
+		background-color: #FFFFFF!important;
+	}
+	.notOnDutyStatus
+	{
+		background-color: #F4F4F4!important;
+	}
+</style>

+ 132 - 0
components/employee_card/employee_card.vue

@@ -0,0 +1,132 @@
+<template>
+ 
+	<view  class="employee_card" @click="selectOne">
+		<view  :class="{employee_card_left_box:right_nativate==true,
+						employee_card_box:right_nativate==false}" >
+			<view >
+				<image class="image" mode="aspectFill" :src="imgUrl" />
+			</view>
+			<view class="employee_card_column">
+				<label class="employee_card_top_box">{{name}}</label>
+				<label class="employee_card_bottom_box">{{position}}</label>			
+			</view>			
+		</view>
+		<view v-if="right_nativate" class="employee_card_right_box">
+			<label class="right_label">></label>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		
+		
+	    name: 'employee-card',
+		props: {
+			right_nativate:
+			{
+				type:Boolean,
+				default:true
+			},
+			employeeId:
+			{
+				type:String,
+				default:'asdf'
+			},
+			name: {
+			    type: String,
+			    default: ''
+			},
+			position:{
+				type:String,
+				default:'程序员'
+			},
+			imgUrl:{
+				type:String,
+				default:'/static/userpic.png'
+			},
+		},
+		methods:{
+			selectOne(i, event) {
+				let _id = this.employeeId;
+				let _name = this.name; 
+				let response = {
+				    id: _id,
+				    name: _name
+				};
+				this.$emit('onEmployeeClick',response);
+			}
+		}
+	}
+</script>
+
+<style>
+	.image {
+		margin:20rpx 20rpx 20rpx 20rpx;
+		width: 100rpx;
+		height: 100rpx;
+	}
+	
+	.employee_card_column
+	{
+		display: flex;
+		flex-direction: column;
+	}
+	.employee_card
+	{
+		display: flex;
+		flex-direction: row;
+		justify-content: space-around;
+		position: relative;
+		height: 140rpx; 
+		top:0rpx;
+		left:0rpx;  			
+		background-color: #FFFFFF!important;
+		width: auto;
+		
+	}
+	.employee_card_left_box
+	{
+		display: flex;
+		flex-direction: row;
+		height: 100%;
+		width: 90%;
+	}	
+	.employee_card_box
+	{
+		display: flex;
+		flex-direction: row;
+		height: 100%;
+		width: 100%;
+	}	
+	.employee_card_right_box
+	{
+		height: 100%;
+		width: 10%;
+		display: flex;
+		justify-content: flex-end;
+		padding-right: 20rpx;
+	}
+	.right_label
+	{
+		color: #C8C8C8;
+		line-height: 140rpx;
+		font-size: 40rpx;
+	}
+	.employee_card_top_box
+	{
+		height: 60%;
+		font-weight: bold;
+		line-height: 84rpx;
+		font-size: 44rpx;
+		margin-left: 20rpx;
+	}
+	.employee_card_bottom_box
+	{
+		height: 40%;
+		line-height: 56rpx;
+		font-size: 30rpx;
+		margin-left: 20rpx;
+	}
+	
+</style>

+ 170 - 0
components/employee_daily_report_card/employee_daily_report_card.vue

@@ -0,0 +1,170 @@
+<template>
+	<view class="employee_daily_report_card_box" @click="clicked">		
+		<view class="employee_card_top_box">
+			<view class="employee_card_box">
+				<view  class="employee_card_left_box" >
+					<view>
+						<image class="image" mode="aspectFill" :src="imgUrl" />
+					</view>
+					<view class="employee_card_column">
+						<view>
+							<label class="employee_card_top_box font_weight">{{name}}</label>
+							<label v-if="scored" style="color:red">{{score}}分</label>
+							<label v-else style="color:red">[未评分]</label>
+														
+						</view>
+						<label class="employee_card_bottom_box grey_text_color">{{position}}</label>			
+					</view>			
+				</view>
+				<view class="employee_card_right_box grey_text_color">{{date}}</view>						
+			</view>
+		</view>
+		<view class="employee_card_bottom_box pt-1">
+			<label >{{log}}</label>
+		</view>
+	</view>	
+</template>
+
+<script>
+	
+	export default {
+		
+		
+	    name: 'daily-report-statistics-card',
+		props: {
+		    // 星期几为第一天(0为星期日)
+			year:{
+				type:Number,
+				default:1,
+ 			},
+			month:{
+				type:Number,
+				default:1,
+			},
+			day:{
+				type:Number,
+				default:1,
+			},
+			employeeId:{
+				type:String,
+				default:'',
+			},
+		    date: {
+		        type: String,
+		        default: '01日-01日18:39'
+		    },
+			name:
+			{
+				type:String,
+				default:'杨所'
+			},
+			position:
+			{
+				type:String,
+				default:'程序员'
+			},
+			imgUrl:
+			{
+				type:String,
+				default:'/static/userpic.png'
+			},
+			log:
+			{
+				type:String,
+				default:'解答温州方面提出的问题,回答校信达问题。测试荆州开发区就业系统智慧就业功能。'
+			},
+			scored:
+			{
+				type:Boolean,
+				default:false
+			},
+			score:
+			{
+				type:Number,
+				default:0
+			}
+		}, 
+		methods:{
+			set_score(_score)
+			{
+				this.score = _score;
+				this.scored = true;
+			},
+			clicked()
+			{
+				let response={id:this.employeeId,name:this.name,year:this.year,month:this.month,day:this.day};
+				this.$emit('OnCardClick',response);
+			}
+		}
+	}
+</script>
+
+<style>
+	.image {
+		margin:10rpx 10rpx 0rpx 10rpx;
+		width: 70rpx;
+		height: 70rpx;
+	}
+	.employee_card_column
+	{
+		display: flex;
+		flex-direction: column;
+	}
+	.employee_daily_report_card_box
+	{
+		display: flex;
+		flex-direction: column;
+		height: 100%;
+		width: 100%;
+	}
+	.employee_card_box
+	{
+		display: flex;
+		flex-direction: row;
+		height: 100%;
+		width: 100%;
+	}	
+	.font_weight
+	{
+		font-weight: bold;		
+	} 
+	.employee_card_top_box
+	{
+		height: 60%;
+		line-height: 60rpx;
+		font-size: 30rpx;
+		margin-left: 20rpx;
+		margin-bottom: 0rpx;
+		padding-bottom: 0rpx;
+	}
+	.grey_text_color
+	{
+		color:#A19F9F
+	}
+	.employee_card_bottom_box
+	{
+		height: 40%;
+		line-height: 28rpx;
+		font-size: 28rpx;
+		margin-top: 0rpx;
+		margin-left: 20rpx;
+		padding-top: 0rpx;
+		
+	}
+	.employee_card_left_box
+	{
+		display: flex;
+		flex-direction: row;
+		height: 100%;
+		width: 70%;
+ 
+	}	
+	.employee_card_right_box
+	{
+		width:30%;
+		padding-top: 10rpx;
+		line-height: 28rpx;
+		font-size: 26rpx;
+ 	}
+	.pt-1 { padding-top: 10rpx;}
+</style>

+ 166 - 0
components/employee_header/employee_header.vue

@@ -0,0 +1,166 @@
+<template>
+	<view class="employee_header border-bottom">
+		<view class="subview">
+			<view class="grandview">
+				<uni-id-combox  ref="employee"  :candidates="employees"  :value="employee" @update:modelValue='onEmployeeClick'></uni-id-combox>			 				
+			</view>
+		</view>
+		<view class="subview">
+			<view class="grandview">
+				<uni-id-combox ref="month"  :candidates="months" :value="month" @update:modelValue='onMonthClick'></uni-id-combox>			 				
+			</view>
+		</view>
+		<view class="subview">
+			<view class="grandview">
+				<uni-id-combox ref="logtype"  :candidates="types"  :value="log_type" @update:modelValue='onTypeClick'></uni-id-combox>			 			
+				
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	
+	
+	import uniIdCombox from '@/components/uni-id-combox/uni-id-combox.vue'
+	export default {
+		components:{
+			uniIdCombox
+		},
+		onReady()
+		{
+			console.log('ssssss')
+		},
+	    name: 'employee_header',
+		props: {
+		    // 星期几为第一天(0为星期日)
+			employee:{
+				type:String,
+				default:''
+			},
+			employeeId:{
+				type:Number,
+				default:0
+			},
+		    month: {
+		        type: String,
+		        default: ''
+		    },
+			log_type:
+			{
+				type:String,
+				default:''
+			},
+			employees:
+			{
+				type:Array,
+				default () {
+					return [
+						{id:'1',value:'郑强'},
+						{id:'2',value:'陈文'},
+						{id:'3',value:'朱鹏'}
+					]
+				}
+			},
+			months:
+			{
+				type:Array,
+				default () {
+					return [
+						{id:'1',value:'2021-01'},
+						{id:'2',value:'2021-02'},
+						{id:'3',value:'2021-03'}
+					]
+				}
+			},
+			types:
+			{
+				type:Array,
+				default () {
+					return [
+						{id:'1',value:'工作日志'},
+						{id:'2',value:'工作计划'},
+						{id:'3',value:'信息单'},
+						{id:'4',value:'成交单'}
+					]
+				}
+			}
+		},		
+		computed:
+		{
+			currentTypes()
+			{
+				return this.types;
+			}, 
+			currentMonths(){
+				return this.months;
+			},
+			currentEmployees(){
+				return this.employees;
+			},
+			currentEmployee(){
+				return this.employee;
+			},
+			currentEmployeeId()
+			{
+				return this.employeeId;
+			},
+			currentMonth()
+			{
+				return this.month;
+			},
+			currentLog_type()
+			{
+				return this.log_type;
+			}			
+		}, 
+		methods:{
+			 
+			onEmployeeClick(data)
+			{
+				this.$emit("update:employee",data);
+				//console.log('employee click'+JSON.stringify(data));
+			},
+			onMonthClick(data)
+			{
+				this.$emit("update:month",data);
+				//console.log('month click'+JSON.stringify(data));
+			},
+			onTypeClick(data)
+			{
+				this.$emit("update:type",data);
+				//console.log('type click'+JSON.stringify(data));
+			}		 
+			
+		}
+	}
+</script>
+
+<style lang="scss">
+	.employee_header
+	{
+		display: flex;
+		direction: row;
+		//justify-content: space-around;
+		width: 100%;
+		background-color: #FFFFFF;
+		
+		.subview
+		{ 
+			display: flex;
+			flex-direction: row;
+			//background-color: #007AFF;
+			justify-content: center;
+			align-items: center;
+			width: calc(100%/3);
+		}
+		.grandview
+		{
+			//background-color: #b88fff;
+			justify-content: center;
+			align-items: center;
+			width: 200rpx;
+		}
+		
+	} 
+</style>

+ 765 - 0
components/ren-calendar/ren-calendar.vue

@@ -0,0 +1,765 @@
+<template>
+    <view class="calendar-wrapper">
+       <view class="header" v-if="headerBar">
+           <view :class="{pre: !is_future_month(-1),
+						  pre_unable: is_future_month(-1)}" @click="changeMonth('pre')">
+				<label class="iconfont icon-left-circle"></label>
+				上月</view>
+            <view>{{y+'年'+formatNum(m)+'月'}}</view>
+			
+            <view :class="{next: !is_future_month(1),
+						   next_unable: is_future_month(1)}" @click="changeMonth('next')">下月
+			<label class="iconfont icon-right-circle"></label>
+			</view>
+        </view> 
+        <view class="week">
+            <view class="week-day border_dates" v-for="(item, index) in weekDay" :key="index">{{ item }}</view>
+        </view>	
+		<view class='weeks'>
+			<view class="week-row border_dates" v-for="(item1, index1) in group_dates" :key="index1">
+				<view class="week-day border_dates" v-for="(item2, index2) in item1" :key="index2" @click="selectOne(item2, $event)">
+					<label class="content">{{Number(items[index1*7+index2].date)}}</label>
+					
+					<view  class="status" 
+					:class="{
+							status1: items[index1*7+index2].status==0,
+							status2: items[index1*7+index2].status==1,
+							status3: items[index1*7+index2].status==2,
+							status4: items[index1*7+index2].status==3
+						}"></view>
+				</view>
+			</view>
+		</view>
+	 
+    </view>
+</template>
+
+<script>
+export default {
+    name: 'ren-calendar',
+    props: {
+        // 星期几为第一天(0为星期日)
+        weekstart: {
+            type: Number,
+            default: 0
+        },		 
+        // 标记的日期
+        markDays: {
+            type: Array,
+            default: ()=>{
+                return [];
+            }
+        },
+        //是否展示月份切换按钮
+        headerBar:{
+            type: Boolean,
+            default: true
+        },
+        // 是否展开
+        open: {
+            type: Boolean,
+            default: true
+        },
+        //是否可收缩
+        collapsible:{
+            type: Boolean,
+            default: true
+        },
+        //未来日期是否不可点击
+        disabledAfter: {
+            type: Boolean,
+            default: false
+        }
+    },
+    data() {
+        return {
+			//kpi_url:'',
+			//employeeNumber:'',
+			//datas:[],
+			//workMonth:'',
+            weektext: [ '一', '二', '三', '四', '五', '六','日'],
+            y: new Date().getFullYear(), // 年
+            m: new Date().getMonth() + 1, // 月
+            dates: [], // 当前月的日期数据
+			group_dates:[],
+			prev_dates:[],//上一月数据
+			next_dates:[],//下一月数据
+            positionTop: 0,
+            monthOpen: true,
+            choose: '',
+			items:[
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'01'},
+				{day:2,year:2021,month:10,status:3,isCurM:false,date:'02'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'03'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'04'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'05'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'06'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'07'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'08'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'09'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'10'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'11'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'12'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'13'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'14'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'15'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'16'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'17'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'18'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'19'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'20'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'21'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'22'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'23'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'24'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'25'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'26'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'27'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'28'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'29'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'30'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'31'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'32'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'33'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'34'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'35'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'36'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'37'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'38'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'39'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'40'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'41'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'42'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'43'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'44'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'45'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'46'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'47'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'48'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'49'},
+				{day:1,year:2021,month:10,status:3,isCurM:false,date:'50'},
+			]
+        };
+    },
+    created() {
+		 
+		this.dates = this.monthDay(this.y, this.m);
+		 this.group_dates = [];
+		 for(let i = 0;i<this.dates.length/7;i++)
+		 {
+			 this.group_dates.push(this.dates.slice(i*7,i*7+7)); 
+		 } 
+		 for(let i = 0;i<this.dates.length;i++)
+		 {
+			 this.items[i] = this.dates[i];
+		 }
+		
+		!this.open && this.toggle();
+		 
+         
+    },
+    mounted() {
+        this.choose = this.getToday().date;
+    },
+    computed: {
+        // 顶部星期栏
+        weekDay() {
+            return this.weektext.slice(this.weekstart).concat(this.weektext.slice(0, this.weekstart));
+        },
+        height() {
+            return (this.dates.length / 7) * 80 + 'rpx';
+        }
+    },
+    methods: {
+        formatNum(num) {
+            let res = Number(num);
+            return res < 10 ? '0' + res : res;
+        },
+		addMonth(date, months) {
+		    let y = date.getFullYear();
+		    let m = date.getMonth();
+		    var d = date.getDate();
+		
+	//		console.log('add month y' + y + ' m:' + m + ' d: ' + d + ' month: ' + months);
+		    y += Math.floor((m + 1 + months) / 12); //计算年
+		    m = Math.floor((m + 1 + months) % 12) - 1; //计算月
+			let _date = new Date(y,m,d);
+	//		console.log('result y:' + y + ' m: ' + m + '_date:' + _date);
+			return _date;
+		},
+		 set_status_by_datestr(date,status)
+		 {
+			 for(let i = 0;i< this.items.length;i++)
+			 {
+			    let date1 = this.items[i].year.toString()+this.items[i].month.toString()+this.items[i].date;
+				if(date1 == date)
+				{					
+					this.items[i].status = status;
+					
+					//if(status == 0)
+					//	console.log('zero alarm');
+					console.log('find '+date1);
+					return;
+				}  
+				 
+			 }
+		 },
+		 set_status_by_datestr1(date,status)
+		{ 
+			 for(let i = 0;i< this.items.length;i++)
+			 {
+				let date1 = this.items[i].year.toString()+'-'+this.items[i].month.toString()+'-'+this.items[i].date;
+				if(date1 == date)
+				{					
+					if(status == 3)
+					{
+						if(this.items[i].status== 1)
+							this.items[i].status = status;
+						
+					}else{
+						this.items[i].status = status;
+						
+					}
+					//console.log('find '+date1);
+					return;
+				}  
+				 
+			 }
+		 },
+		set_status(index,status)
+		{
+			this.items[index].status = status;
+		},
+		is_future_month(increment)
+		{
+			let date = new Date();
+			let page_date = new Date(this.y,this.m-1,1);
+			page_date = this.addMonth(page_date,increment)
+			let _y = date.getFullYear();//当前年
+			let _m = date.getMonth();//当前月
+			let _y1 = page_date.getFullYear();
+			let _m1 = page_date.getMonth();
+			//console.log('计算 y:' +_y1 + 'm:' + _m1);
+			//console.log('当前 y:'+_y +' m:' + _m);
+			if(_y1>_y)
+				return true;
+			if(_y1<_y)
+				return false;
+			if(_m1 > _m)
+				return true;
+			return false;
+		},
+        getToday() {
+            let date = new Date();
+            let y = date.getFullYear();
+            let m = date.getMonth();
+            let d = date.getDate();
+            let week = new Date().getDay();
+            let weekText = ['日', '一', '二', '三', '四', '五', '六'];
+            let formatWeek = '星期' + weekText[week];
+            let today = {
+                date: y + '-' + this.formatNum(m + 1) + '-' + this.formatNum(d),
+                week: formatWeek
+            };
+            return today;
+        },
+		is_fill_logs(_year,_month,_date)
+		{
+			
+			//console.log('res'+JSON.stringify(this.datas));
+			let workDate = _year + '-' + this.formatNum(_month) + '-' + this.formatNum(_date);
+ 			return false;
+			if(!this.datas.length)
+				return false;
+			console.log('datas:' +JSON.stringify(this.datas))
+				
+			for(let i = 0;i< this.datas.length;i++)
+			{
+				//console.log('logs:'+ JSON.stringify(this.datas[i]))
+				//continue;
+				if(workDate==this.datas[i].workDate)
+				{
+					if(this.datas[i].summary.length>0)
+					{
+						console.log('work logs filled'+this.datas[i].summary);	
+						return true;
+					}
+					console.log('work logs is not filled');
+					return false;
+				}
+			}
+			return false;
+		},
+		 
+        // 获取当前月份数据
+        monthDay(y, month) {
+            let dates = [];
+            let m = Number(month);
+            let firstDayOfMonth = new Date(y, m - 1, 1).getDay(); // 当月第一天星期几
+			let prevDays = firstDayOfMonth-1;//前面有几天
+			if(prevDays<0)
+				prevDays = 6;				
+			let lastDayOfMonth = new Date(y,m,0).getDay();
+			let nextDays = 7- lastDateOfMonth;
+			/*for(let i = 1;i< prevDays;i++)
+			{
+				dates.push({
+				    date: this.formatNum(lastDayOfLastMonth - startDay + i),
+				    day: weekstart + i - 1 || 7,
+				    month: m - 2 >= 0 ? this.formatNum(m - 1) : 12,
+				    year: m - 2 >= 0 ? y : y - 1
+				});
+				
+			}
+			for(let i = 1;i<nextDays;i++)
+			{
+				
+			}*/
+            let lastDateOfMonth = new Date(y, m, 0).getDate(); // 当月最后一天
+            let lastDayOfLastMonth = new Date(y, m - 1, 0).getDate(); // 上一月的最后一天 
+            let weekstart = this.weekstart == 7 ? 0 : this.weekstart;
+            let startDay = (() => {
+                // 周初有几天是上个月的
+				let prevDays = firstDayOfMonth -1;
+				if(prevDays<0)
+					prevDays = 6;
+				return prevDays;
+                /*
+				if (firstDayOfMonth == weekstart) {
+                    return 0;//
+                } else if (firstDayOfMonth > weekstart) {
+                    return firstDayOfMonth - weekstart;
+                } else {
+                    return 7 - weekstart + firstDayOfMonth;
+                }*/
+            })();
+            let endDay = 7 - ((startDay + lastDateOfMonth) % 7); // 结束还有几天是下个月的
+			if(endDay>=7)
+				endDay = 0;
+				
+			//console.log('endDay'+endDay);
+            for (let i = 1; i <= startDay; i++) {
+                dates.push({
+                    date: this.formatNum(lastDayOfLastMonth - startDay + i),
+                    day: weekstart + i - 1 || 7,
+                    month: m - 1 >= 0 ? this.formatNum(m - 1) : 12,
+                    year: m - 1 >= 0 ? y : y - 1,
+					status:0,
+					isCurM:false
+                });
+            }
+            for (let j = 1; j <= lastDateOfMonth; j++) {
+				let _status = 3;
+				let _date = this.formatNum(j);
+				let _day = (j % 7) + firstDayOfMonth - 1 || 7;
+				let _month = this.formatNum(m);
+				let _year = y;
+				
+				/*if(!this.isWorkDay(_year,_month,_date))
+					_status = 2;
+				else if(!this.is_fill_logs(_year,_month,_date))
+				{
+					//_status = Math.floor(Math.random() * 4);	
+					_status = 2;
+				}*/
+                dates.push({
+                    date: _date,
+                    day: _day,
+                    month: _month,
+                    year: _year,
+					status: _status,
+                    isCurM: true //是否当前月份
+                });
+            }
+            for (let k = 1; k <= endDay; k++) {
+				//console.log(' date ' + k);
+                dates.push({
+                    date: this.formatNum(k),
+                    day: (lastDateOfMonth + startDay + weekstart + k - 1) % 7 || 7,
+                    month: m + 1 <= 11 ? this.formatNum(m + 1) : 0,
+                    year: m + 1 <= 11 ? y : y + 1,
+					status:0,
+					isCurM:false
+                });
+            }
+            // console.log(dates);
+            return dates;
+        },
+        isWorkDay(y, m, d) {
+            //是否工作日
+            let ymd = `${y}/${m}/${d}`;
+            let formatDY = new Date(ymd.replace(/-/g, '/'));
+            let week = formatDY.getDay();
+            if (week == 0 ) {//|| week == 6
+                return false;
+            } else {
+                return true;
+            }
+        },
+        isFutureDay(y, m, d) {
+            //是否未来日期
+            let ymd = `${y}/${m}/${d}`;
+            let formatDY = new Date(ymd.replace(/-/g, '/'));
+            let showTime = formatDY.getTime();
+            let curTime = new Date().getTime();
+            if (showTime > curTime) {
+                return true;
+            } else {
+                return false;
+            }
+        },
+        // 标记日期
+        isMarkDay(y, m, d) {
+            let flag = false;
+            for (let i = 0; i < this.markDays.length; i++) {
+                let dy = `${y}-${m}-${d}`;
+                if (this.markDays[i] == dy) {
+                    flag = true;
+                    break;
+                }
+            }
+            return flag;
+        },
+        isToday(y, m, d) {
+            let checkD = y + '-' + m + '-' + d;
+            let today = this.getToday().date;
+            if (checkD == today) {
+                return true;
+            } else {
+                return false;
+            }
+        },
+        // 展开收起
+        toggle() {
+            this.monthOpen = !this.monthOpen;
+            if (this.monthOpen) {
+                this.positionTop = 0;
+            } else {
+                let index = -1;
+                this.dates.forEach((i, x) => {
+                    this.isToday(i.year, i.month, i.date) && (index = x);
+                });
+                this.positionTop = -((Math.ceil((index + 1) / 7) || 1) - 1) * 80;
+            }
+        },
+        // 点击回调
+        selectOne(i, event) {
+            let date = `${i.year}-${i.month}-${i.date}`;
+            let selectD = new Date(date).getTime();
+            let curTime = new Date().getTime();
+            let week = new Date(date).getDay();
+            let weekText = ['日', '一', '二', '三', '四', '五', '六'];
+            let formatWeek = '星期' + weekText[week];
+            let response = {
+                date: date,
+                week: formatWeek
+            };
+			
+			if(i.status ==2)
+				return false;
+            if (!i.isCurM) {
+                // console.log('不在当前月范围内');
+                return false;
+            }
+			/*
+            if (selectD > curTime) {
+                if (this.disabledAfter) {
+                    console.log('未来日期不可选');
+                    return false;
+                } else {
+                    this.choose = date;
+                    this.$emit('onDayClick', response);
+                }
+            } else {
+				*/
+             this.choose = date;
+             this.$emit('onDayClick', response);
+            //}
+            //console.log(response);
+        },
+        //改变年月
+        changYearMonth(y, m) {
+            this.dates = this.monthDay(y, m);
+            this.y = y;
+            this.m = m;
+        }, 
+        changeMonth(type){
+            if(type=='pre'){
+               
+			   if (this.m + 1 == 2) {
+                   this.m = 12;
+                   this.y = this.y - 1;
+               } else {
+                   this.m = this.m - 1;
+               } 
+			   
+			   let _year = this.y;
+			   let _month = this.m; 
+			   let response = {
+			       year: _year,
+			       month: _month
+			   };
+			   
+			   this.dates = this.monthDay(this.y, this.m);
+			   this.group_dates =[];
+			   for(let i = 0;i<this.dates.length/7;i++)
+			   {
+			   	this.group_dates.push(this.dates.slice(i*7,i*7+7));  
+			   }
+			   for(let i = 0;i<this.dates.length;i++)
+			   {
+			   	 this.items[i] = this.dates[i];
+			   }
+			   
+			   this.$emit('onPreviousMonth',response);
+			    
+            }else{
+                if (this.m + 1 == 13) {
+                    this.m = 1;
+                    this.y = this.y + 1;
+                } else {
+                    this.m = this.m + 1;
+                }
+				let _year = this.y;
+				let _month = this.m; 
+				let response = {
+				    year: _year,
+				    month: _month
+				};
+				
+				this.dates = this.monthDay(this.y, this.m);
+				this.group_dates =[];
+				for(let i = 0;i<this.dates.length/7;i++)
+				{
+					this.group_dates.push(this.dates.slice(i*7,i*7+7));  
+				}
+				for(let i = 0;i<this.dates.length;i++)
+				{
+					 this.items[i] = this.dates[i];
+				}
+				
+				this.$emit('onNextMonth',response);
+				 
+            }
+			
+
+			//console.log('xxxx');
+        }
+    }
+};
+</script>
+
+<style lang="scss" scoped>
+	@import url("/static/font/iconfont.css");
+	.border_dates{
+		border-style: solid; 
+		border-width: 1rpx;
+		border-right-style: none;
+		border-bottom-style:none; 
+		border-color: #E6E6E6;
+		
+	}
+.calendar-wrapper {
+    color: #bbb7b7;
+    font-size: 28rpx;
+    text-align: center;
+    background-color: #fff;
+    padding-bottom: 10rpx;
+	display: flex;
+	flex-direction: column;
+    
+    .header{
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        height: 88rpx;
+        color: #42464A;
+        font-size: 32rpx;
+        font-weight: bold;
+        border-bottom: 2rpx solid #f2f2f2;
+        .pre,.next{
+              color: #4d7df9;
+              font-size: 28rpx;
+              font-weight: normal;
+              padding: 8rpx 15rpx;
+              //border-radius: 10rpx;
+              //border: 2rpx solid #dcdfe6;
+        }
+		.pre_unable,.next_unable
+		{
+			color: #B5B5B5;
+			font-size: 28rpx;
+			font-weight: normal;
+			padding: 8rpx 15rpx;
+		}
+        .pre{
+            margin-right: 30rpx;
+        }
+        .next{
+            margin-left: 30rpx;
+        }
+    }
+	.weeks{
+		display: flex;
+		flex-direction: column;
+		.week-row{
+			display: flex;
+			flex-direction: row;
+			width: 100%;
+			height: 100rpx;
+			.week-day
+			{
+				display: flex;
+				flex-direction: column;
+				height: 100rpx;
+				line-height: 50rpx;	
+				align-items: center;
+				justify-content: center;
+				
+				width:calc(100%/7);
+				.content{
+					height: 50%;
+					padding-bottom: 0rpx;
+					margin-bottom: 0rpx;
+				}
+				.status{
+				    font-style: normal;	 
+				    width: 20rpx;
+				    height: 20rpx;
+				    border-radius: 20rpx;
+					
+				}
+				.status1{
+					
+				}
+				.status2{
+				    background: #34C758;
+					
+				}
+				.status3{
+				    background: #B5B5B5;
+					
+				}
+				.status4{
+				    background: #FF6666;
+					
+				}
+			}
+		}
+	}
+    .week {
+        display: flex;
+        align-items: center;
+        height: 80rpx;
+        line-height: 80rpx;
+        border-bottom: 1rpx solid rgba(255, 255, 255, 0.2);
+		.week-day
+		{
+			background-color: #ECEEF0;
+		}
+        view {
+            flex: 1;
+        }
+    }
+
+    .content {
+        position: relative;
+        overflow: hidden;
+        transition: height 0.4s ease;
+
+        .days {
+            transition: top 0.3s;
+            display: flex;
+            align-items: center;
+            flex-wrap: wrap;
+            position: relative;
+			
+			
+            .item {
+                position: relative;
+                display: block;
+                height: 80rpx;
+                line-height: 80rpx;	
+                width: calc(100% / 7);
+               .day {
+					
+                    font-style: normal;
+                    display: inline-block;
+                    vertical-align: middle;
+                    width: 60rpx;
+                    height: 60rpx;
+                    line-height: 60rpx;
+                    overflow: hidden;
+                    border-radius: 60rpx;
+
+                    &.choose {
+                        background-color: #4d7df9;
+                        color: #fff;
+                    }
+
+                    &.nolm {
+                        color: #666666;
+                        opacity: 0.3;
+                    }
+                }
+                .isWorkDay {
+                    color: #42464a;
+                }
+
+                .notSigned {
+                    font-style: normal;
+                    width: 8rpx;
+                    height: 8rpx;
+                    background: #fa7268;
+                    border-radius: 10rpx;
+                    position: absolute;
+                    left: 50%;
+                    bottom: 0;
+                    pointer-events: none;
+                }
+                .today {
+                    color: #fff;
+                    background-color: #a8c0ff;
+                }
+                .workDay {
+                    font-style: normal;
+                    width: 8rpx;
+                    height: 8rpx;
+                    background: #4d7df9;
+                    border-radius: 10rpx;
+                    position: absolute;
+                    left: 50%;
+                    bottom: 0;
+                    pointer-events: none;
+                }
+                .markDay{
+                    font-style: normal;
+                    width: 8rpx;
+                    height: 8rpx;
+                    background: #fc7a64;
+                    border-radius: 10rpx;
+                    position: absolute;
+                    left: 50%;
+                    bottom: 0;
+                    pointer-events: none;
+                }
+            }
+        }
+    }
+
+    .hide {
+        height: 80rpx !important;
+    }
+
+    .weektoggle {
+        width: 85rpx;
+        height: 32rpx;
+        position: relative;
+        bottom: -42rpx;
+        &.down {
+            transform: rotate(180deg);
+            bottom: 0;
+        }
+    }
+}
+</style>

+ 202 - 0
components/slider-number/slider-number.vue

@@ -0,0 +1,202 @@
+<template>
+	<!--<view class="pa_row w-100" style="background-color: red;">
+		<view class="d-flex w-50" style="background-color: blue;">
+			test
+		</view>
+		<div class="" >
+			<div>
+			</div>
+			<div>
+			</div>
+		</div>
+	</view>-->
+	 
+	<view class="pa_row position-relative h-100 w-100 a-center j-center j-sb" v-if="max==1 && min ==0">
+		<view style="width: 50%;">
+			<radio :checked="value == 1"  @click="clicked" :disabled="disabled"/>
+				是
+			</radio>			
+		</view>
+		<view style="width: 50%;">
+			<radio :checked="value == 0"  @click="clicked" :disabled="disabled"/>
+					否
+			</radio>		
+			
+		</view>
+	</view>
+	<view class="pa_row position-relative h-100 w-100" v-else >
+			<slider v-if="max==0 && min ==0" class="left"  disabled="true" v-model="data1" min="0" max="1" :step="step" @change="sliderChange" activeColor="#2533ff" backgroundColor="#989693" block-color="#8A6DE9" block-size="20"/>											
+			<slider  v-else class="left"   v-model="data1" :disabled="disabled" :min="min" :max="max" :step="step" @change="sliderChange" activeColor="#2533ff" backgroundColor="#989693" block-color="#8A6DE9" block-size="20"/>											
+			<uni-number-box  class="right" :disabled="disabled"  :min="min" :max="max" v-model="data2" :step="step" @change="change"/>									 
+	</view>
+</template>
+
+<script>
+	export default {
+		name:"slider-number",
+		props: {
+			name:{
+				type:String,
+				default:''
+			},
+			disabled:{
+				type:Boolean,
+				default:false
+			},
+		    // 星期几为第一天(0为星期日)
+		    min: {
+		        type: Number,
+		        default: 0
+		    },
+			max:{
+				type: Number,
+				default : 1
+			},
+			step:{
+				type: Number,
+				default : 1
+			},
+			value:{
+				type : Number,
+				default: 0
+			}			
+		},
+		data() {
+			return {
+				data1:0,
+				data2:0, 
+				newValue:0
+			};
+		},
+		methods:{
+			clicked(){
+				if(this.disabled)
+				{
+					
+					 return;
+				}
+				if(this.value == 1)
+				{
+					this.value = 0;
+					this.data1 = 0;
+					this.data2 = 0;
+				}else{
+					this.value = 1;
+					this.data1 = 1;
+					this.data2 = 1;
+					
+				}
+				this.$emit("input",this.value);
+				this.$emit('onChange', this.value);
+			},
+			change(value) {
+				this.data1 = value;
+				this.value = this.data1;
+				this.$emit("input",this.value);
+				this.$emit('onChange', this.value);
+				//console.log("value " + value);
+			},
+			sliderChange(e) {
+				//e.detail.value = 0;
+				this.data2 = e.detail.value;
+				this.value = this.data2;
+				this.$emit("input",this.value);
+				this.$emit('onChange', this.value);
+				//console.log('value 发生变化:' + e.detail.value)
+			},
+			set_value(data)
+			{
+				this.data1 = data;
+				this.data2 = data;
+			},
+			set_disabled(_disabled)
+			{
+				this.disabled = _disabled
+			},
+			set_max(_max)
+			{
+				this.max = _max
+			},
+			set_min(_min)
+			{
+				this.min = _min;
+			},
+			set_name(_name)
+			{
+				this.name = _name;
+			},
+			set_step(_step)
+			{
+				this.step = _step;
+			},
+			get_step()
+			{
+				return this.step;
+			},
+			get_max()
+			{
+				return this.max;
+			},
+			get_min()
+			{
+				return this.min;
+			},
+			get_value()
+			{
+				return this.value;
+			},
+			get_name()
+			{
+				return this.name;
+			}
+			
+			
+			
+		},
+		mounted() {
+			this.data1 = this.value;
+			this.data2 = this.value;
+			
+			//if(name.indexOf('扣工作日志')>=0)
+			//	console.log('name '+this.name + ' value ' + this.value + ' disabled ' + this.disabled + ' max ' + this.max +' min ' + this.min + ' step ' + this.step);
+		},
+		watch: {
+		  value(newVal, oldVal) {
+		    if (newVal) {
+				//console.log('value' + this.value)
+		      this.$nextTick(() => {
+		        this.value = newVal
+				this.data1 = newVal;
+				this.data2 = newVal;
+		      })
+		    }
+		  },
+		}
+
+		/*watch:{
+			data1(val,newVal)
+			{
+				if(val != newVal)
+				{
+					this.$emit("input",newVal);
+				}
+			},
+			data2(val,newVal)
+			{
+				if(val != newVal)
+				{
+					this.$emit("input",newVal);
+				}
+			}			
+		}*/
+	}
+</script>
+
+<style>
+	.left{
+		width: 77%;
+	}
+	.right {
+		width: 23%;
+	}
+</style>

+ 546 - 0
components/uni-calendar/calendar.js

@@ -0,0 +1,546 @@
+/**
+* @1900-2100区间内的公历、农历互转
+* @charset UTF-8
+* @github  https://github.com/jjonline/calendar.js
+* @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]
+*/
+/* eslint-disable */
+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, 0x06e95, 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
+    0x0a2e0, 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'],
+
+  /**
+      * 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'],
+
+  /**
+      * 返回农历y年一整年的总天数
+      * @param lunar Year
+      * @return Number
+      * @eg:var count = calendar.lYearDays(1987) ;//count=387
+      */
+  lYearDays: function (y) {
+    var i; var 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  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
+    // 年份限定、上限
+    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; var leap = 0; var temp = 0
+    // 修正ymd参数
+    var y = objDate.getFullYear()
+    var m = objDate.getMonth() + 1
+    var 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()
+    var isToday = false
+    if (isTodayObj.getFullYear() == y && isTodayObj.getMonth() + 1 == m && isTodayObj.getDate() == d) {
+      isToday = true
+    }
+    // 星期几
+    var nWeek = objDate.getDay()
+    var 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)
+
+    return { '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
+    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; var 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)
+  }
+}
+
+export default calendar

+ 12 - 0
components/uni-calendar/i18n/en.json

@@ -0,0 +1,12 @@
+{
+	"uni-calender.ok": "ok",
+	"uni-calender.cancel": "cancel",
+	"uni-calender.today": "today",
+	"uni-calender.MON": "MON",
+	"uni-calender.TUE": "TUE",
+	"uni-calender.WED": "WED",
+	"uni-calender.THU": "THU",
+	"uni-calender.FRI": "FRI",
+	"uni-calender.SAT": "SAT",
+	"uni-calender.SUN": "SUN"
+}

+ 8 - 0
components/uni-calendar/i18n/index.js

@@ -0,0 +1,8 @@
+import en from './en.json'
+import zhHans from './zh-Hans.json'
+import zhHant from './zh-Hant.json'
+export default {
+	en,
+	'zh-Hans': zhHans,
+	'zh-Hant': zhHant
+}

+ 12 - 0
components/uni-calendar/i18n/zh-Hans.json

@@ -0,0 +1,12 @@
+{
+	"uni-calender.ok": "确定",
+	"uni-calender.cancel": "取消",
+	"uni-calender.today": "今日",
+	"uni-calender.SUN": "日",
+	"uni-calender.MON": "一",
+	"uni-calender.TUE": "二",
+	"uni-calender.WED": "三",
+	"uni-calender.THU": "四",
+	"uni-calender.FRI": "五",
+	"uni-calender.SAT": "六"
+}

+ 12 - 0
components/uni-calendar/i18n/zh-Hant.json

@@ -0,0 +1,12 @@
+{
+	"uni-calender.ok": "確定",
+	"uni-calender.cancel": "取消",
+	"uni-calender.today": "今日",
+	"uni-calender.SUN": "日",
+	"uni-calender.MON": "一",
+	"uni-calender.TUE": "二",
+	"uni-calender.WED": "三",
+	"uni-calender.THU": "四",
+	"uni-calender.FRI": "五",
+	"uni-calender.SAT": "六"
+}

+ 181 - 0
components/uni-calendar/uni-calendar-item.vue

@@ -0,0 +1,181 @@
+<template>
+	<view class="uni-calendar-item__weeks-box" :class="{
+		'uni-calendar-item--disable':weeks.disable,
+		'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay,
+		'uni-calendar-item--checked':(calendar.fullDate === weeks.fullDate && !weeks.isDay) ,
+		'uni-calendar-item--before-checked':weeks.beforeMultiple,
+		'uni-calendar-item--multiple': weeks.multiple,
+		'uni-calendar-item--after-checked':weeks.afterMultiple,
+		}"
+	 @click="choiceDate(weeks)">
+		<view class="uni-calendar-item__weeks-box-item">
+			<text v-if="selected&&weeks.extraInfo" class="uni-calendar-item__weeks-box-circle"></text>
+			<text class="uni-calendar-item__weeks-box-text" :class="{
+				'uni-calendar-item--isDay-text': weeks.isDay,
+				'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay,
+				'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate && !weeks.isDay,
+				'uni-calendar-item--before-checked':weeks.beforeMultiple,
+				'uni-calendar-item--multiple': weeks.multiple,
+				'uni-calendar-item--after-checked':weeks.afterMultiple,
+				'uni-calendar-item--disable':weeks.disable,
+				}">{{weeks.date}}</text>
+			<text v-if="!lunar&&!weeks.extraInfo && weeks.isDay" class="uni-calendar-item__weeks-lunar-text" :class="{
+				'uni-calendar-item--isDay-text':weeks.isDay,
+				'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay,
+				'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate && !weeks.isDay,
+				'uni-calendar-item--before-checked':weeks.beforeMultiple,
+				'uni-calendar-item--multiple': weeks.multiple,
+				'uni-calendar-item--after-checked':weeks.afterMultiple,
+				}">{{todayText}}</text>
+			<text v-if="lunar&&!weeks.extraInfo" class="uni-calendar-item__weeks-lunar-text" :class="{
+				'uni-calendar-item--isDay-text':weeks.isDay,
+				'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay,
+				'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate && !weeks.isDay,
+				'uni-calendar-item--before-checked':weeks.beforeMultiple,
+				'uni-calendar-item--multiple': weeks.multiple,
+				'uni-calendar-item--after-checked':weeks.afterMultiple,
+				'uni-calendar-item--disable':weeks.disable,
+				}">{{weeks.isDay ? todayText : (weeks.lunar.IDayCn === '初一'?weeks.lunar.IMonthCn:weeks.lunar.IDayCn)}}</text>
+			<text v-if="weeks.extraInfo&&weeks.extraInfo.info" class="uni-calendar-item__weeks-lunar-text" :class="{
+				'uni-calendar-item--extra':weeks.extraInfo.info,
+				'uni-calendar-item--isDay-text':weeks.isDay,
+				'uni-calendar-item--isDay':calendar.fullDate === weeks.fullDate && weeks.isDay,
+				'uni-calendar-item--checked':calendar.fullDate === weeks.fullDate && !weeks.isDay,
+				'uni-calendar-item--before-checked':weeks.beforeMultiple,
+				'uni-calendar-item--multiple': weeks.multiple,
+				'uni-calendar-item--after-checked':weeks.afterMultiple,
+				'uni-calendar-item--disable':weeks.disable,
+				}">{{weeks.extraInfo.info}}</text>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+	initVueI18n
+	} from '@dcloudio/uni-i18n'
+	import messages from './i18n/index.js'
+	const {	t	} = initVueI18n(messages)
+	export default {
+		emits:['change'],
+		props: {
+			weeks: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+			calendar: {
+				type: Object,
+				default: () => {
+					return {}
+				}
+			},
+			selected: {
+				type: Array,
+				default: () => {
+					return []
+				}
+			},
+			lunar: {
+				type: Boolean,
+				default: false
+			}
+		},
+		computed: {
+			todayText() {
+				return t("uni-calender.today")
+			},
+		},
+		methods: {
+			choiceDate(weeks) {
+				this.$emit('change', weeks)
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.uni-calendar-item__weeks-box {
+		flex: 1;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+	}
+
+	.uni-calendar-item__weeks-box-text {
+		font-size: $uni-font-size-base;
+		color: $uni-text-color;
+	}
+
+	.uni-calendar-item__weeks-lunar-text {
+		font-size: $uni-font-size-sm;
+		color: $uni-text-color;
+	}
+
+	.uni-calendar-item__weeks-box-item {
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+		width: 100rpx;
+		height: 100rpx;
+	}
+
+	.uni-calendar-item__weeks-box-circle {
+		position: absolute;
+		top: 5px;
+		right: 5px;
+		width: 8px;
+		height: 8px;
+		border-radius: 8px;
+		background-color: $uni-color-error;
+
+	}
+
+	.uni-calendar-item--disable {
+		background-color: rgba(249, 249, 249, $uni-opacity-disabled);
+		color: $uni-text-color-disable;
+	}
+
+	.uni-calendar-item--isDay-text {
+		color: $uni-color-primary;
+	}
+
+	.uni-calendar-item--isDay {
+		background-color: $uni-color-primary;
+		opacity: 0.8;
+		color: #fff;
+	}
+
+	.uni-calendar-item--extra {
+		color: $uni-color-error;
+		opacity: 0.8;
+	}
+
+	.uni-calendar-item--checked {
+		background-color: $uni-color-primary;
+		color: #fff;
+		opacity: 0.8;
+	}
+
+	.uni-calendar-item--multiple {
+		background-color: $uni-color-primary;
+		color: #fff;
+		opacity: 0.8;
+	}
+	.uni-calendar-item--before-checked {
+		background-color: #ff5a5f;
+		color: #fff;
+	}
+	.uni-calendar-item--after-checked {
+		background-color: #ff5a5f;
+		color: #fff;
+	}
+</style>

+ 551 - 0
components/uni-calendar/uni-calendar.vue

@@ -0,0 +1,551 @@
+<template>
+	<view class="uni-calendar">
+		<view v-if="!insert&&show" class="uni-calendar__mask" :class="{'uni-calendar--mask-show':aniMaskShow}" @click="clean"></view>
+		<view v-if="insert || show" class="uni-calendar__content" :class="{'uni-calendar--fixed':!insert,'uni-calendar--ani-show':aniMaskShow}">
+			<view v-if="!insert" class="uni-calendar__header uni-calendar--fixed-top">
+				<view class="uni-calendar__header-btn-box" @click="close">
+					<text class="uni-calendar__header-text uni-calendar--fixed-width">{{cancelText}}</text>
+				</view>
+				<view class="uni-calendar__header-btn-box" @click="confirm">
+					<text class="uni-calendar__header-text uni-calendar--fixed-width">{{okText}}</text>
+				</view>
+			</view>
+			<view class="uni-calendar__header">
+				<view class="uni-calendar__header-btn-box" @click.stop="pre">
+					<view class="uni-calendar__header-btn uni-calendar--left"></view>
+				</view>
+				<picker mode="date" :value="date" fields="month" @change="bindDateChange">
+					<text class="uni-calendar__header-text">{{ (nowDate.year||'') +' / '+( nowDate.month||'')}}</text>
+				</picker>
+				<view class="uni-calendar__header-btn-box" @click.stop="next">
+					<view class="uni-calendar__header-btn uni-calendar--right"></view>
+				</view>
+				<text class="uni-calendar__backtoday" @click="backtoday">{{todayText}}</text>
+
+			</view>
+			<view class="uni-calendar__box">
+				<view v-if="showMonth" class="uni-calendar__box-bg">
+					<text class="uni-calendar__box-bg-text">{{nowDate.month}}</text>
+				</view>
+				<view class="uni-calendar__weeks">
+					<view class="uni-calendar__weeks-day">
+						<text class="uni-calendar__weeks-day-text">{{SUNText}}</text>
+					</view>
+					<view class="uni-calendar__weeks-day">
+						<text class="uni-calendar__weeks-day-text">{{monText}}</text>
+					</view>
+					<view class="uni-calendar__weeks-day">
+						<text class="uni-calendar__weeks-day-text">{{TUEText}}</text>
+					</view>
+					<view class="uni-calendar__weeks-day">
+						<text class="uni-calendar__weeks-day-text">{{WEDText}}</text>
+					</view>
+					<view class="uni-calendar__weeks-day">
+						<text class="uni-calendar__weeks-day-text">{{THUText}}</text>
+					</view>
+					<view class="uni-calendar__weeks-day">
+						<text class="uni-calendar__weeks-day-text">{{FRIText}}</text>
+					</view>
+					<view class="uni-calendar__weeks-day">
+						<text class="uni-calendar__weeks-day-text">{{SATText}}</text>
+					</view>
+				</view>
+				<view class="uni-calendar__weeks" v-for="(item,weekIndex) in weeks" :key="weekIndex">
+					<view class="uni-calendar__weeks-item" v-for="(weeks,weeksIndex) in item" :key="weeksIndex">
+						<calendar-item class="uni-calendar-item--hook" :weeks="weeks" :calendar="calendar" :selected="selected" :lunar="lunar" @change="choiceDate"></calendar-item>
+					</view>
+				</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import Calendar from './util.js';
+	import calendarItem from './uni-calendar-item.vue'
+	import {
+	initVueI18n
+	} from '@dcloudio/uni-i18n'
+	import messages from './i18n/index.js'
+	const {	t	} = initVueI18n(messages)
+	/**
+	 * Calendar 日历
+	 * @description 日历组件可以查看日期,选择任意范围内的日期,打点操作。常用场景如:酒店日期预订、火车机票选择购买日期、上下班打卡等
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=56
+	 * @property {String} date 自定义当前时间,默认为今天
+	 * @property {Boolean} lunar 显示农历
+	 * @property {String} startDate 日期选择范围-开始日期
+	 * @property {String} endDate 日期选择范围-结束日期
+	 * @property {Boolean} range 范围选择
+	 * @property {Boolean} insert = [true|false] 插入模式,默认为false
+	 * 	@value true 弹窗模式
+	 * 	@value false 插入模式
+	 * @property {Boolean} clearDate = [true|false] 弹窗模式是否清空上次选择内容
+	 * @property {Array} selected 打点,期待格式[{date: '2019-06-27', info: '签到', data: { custom: '自定义信息', name: '自定义消息头',xxx:xxx... }}]
+	 * @property {Boolean} showMonth 是否选择月份为背景
+	 * @event {Function} change 日期改变,`insert :ture` 时生效
+	 * @event {Function} confirm 确认选择`insert :false` 时生效
+	 * @event {Function} monthSwitch 切换月份时触发
+	 * @example <uni-calendar :insert="true":lunar="true" :start-date="'2019-3-2'":end-date="'2019-5-20'"@change="change" />
+	 */
+	export default {
+		components: {
+			calendarItem
+		},
+		emits:['close','confirm','change','monthSwitch'],
+		props: {
+			date: {
+				type: String,
+				default: ''
+			},
+			selected: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			lunar: {
+				type: Boolean,
+				default: false
+			},
+			startDate: {
+				type: String,
+				default: ''
+			},
+			endDate: {
+				type: String,
+				default: ''
+			},
+			range: {
+				type: Boolean,
+				default: false
+			},
+			insert: {
+				type: Boolean,
+				default: true
+			},
+			showMonth: {
+				type: Boolean,
+				default: true
+			},
+			clearDate: {
+				type: Boolean,
+				default: true
+			}
+		},
+		data() {
+			return {
+				show: false,
+				weeks: [],
+				calendar: {},
+				nowDate: '',
+				aniMaskShow: false
+			}
+		},
+		computed:{
+			/**
+			 * for i18n
+			 */
+
+			okText() {
+				return t("uni-calender.ok")
+			},
+			cancelText() {
+				return t("uni-calender.cancel")
+			},
+			todayText() {
+				return t("uni-calender.today")
+			},
+			monText() {
+				return t("uni-calender.MON")
+			},
+			TUEText() {
+				return t("uni-calender.TUE")
+			},
+			WEDText() {
+				return t("uni-calender.WED")
+			},
+			THUText() {
+				return t("uni-calender.THU")
+			},
+			FRIText() {
+				return t("uni-calender.FRI")
+			},
+			SATText() {
+				return t("uni-calender.SAT")
+			},
+			SUNText() {
+				return t("uni-calender.SUN")
+			},
+		},
+		watch: {
+			date(newVal) {
+				// this.cale.setDate(newVal)
+				this.init(newVal)
+			},
+			startDate(val){
+				this.cale.resetSatrtDate(val)
+				this.cale.setDate(this.nowDate.fullDate)
+				this.weeks = this.cale.weeks
+			},
+			endDate(val){
+				this.cale.resetEndDate(val)
+				this.cale.setDate(this.nowDate.fullDate)
+				this.weeks = this.cale.weeks
+			},
+			selected(newVal) {
+				this.cale.setSelectInfo(this.nowDate.fullDate, newVal)
+				this.weeks = this.cale.weeks
+			}
+		},
+		created() {
+			// 获取日历方法实例
+			this.cale = new Calendar({
+				// date: new Date(),
+				selected: this.selected,
+				startDate: this.startDate,
+				endDate: this.endDate,
+				range: this.range,
+			})
+			// 选中某一天
+			// this.cale.setDate(this.date)
+			this.init(this.date)
+			// this.setDay
+		},
+		methods: {
+			// 取消穿透
+			clean() {},
+			bindDateChange(e) {
+				const value = e.detail.value + '-1'
+				console.log(this.cale.getDate(value));
+				this.init(value)
+			},
+			/**
+			 * 初始化日期显示
+			 * @param {Object} date
+			 */
+			init(date) {
+				this.cale.setDate(date)
+				this.weeks = this.cale.weeks
+				this.nowDate = this.calendar = this.cale.getInfo(date)
+			},
+			/**
+			 * 打开日历弹窗
+			 */
+			open() {
+				// 弹窗模式并且清理数据
+				if (this.clearDate && !this.insert) {
+					this.cale.cleanMultipleStatus()
+					// this.cale.setDate(this.date)
+					this.init(this.date)
+				}
+				this.show = true
+				this.$nextTick(() => {
+					setTimeout(() => {
+						this.aniMaskShow = true
+					}, 50)
+				})
+			},
+			/**
+			 * 关闭日历弹窗
+			 */
+			close() {
+				this.aniMaskShow = false
+				this.$nextTick(() => {
+					setTimeout(() => {
+						this.show = false
+						this.$emit('close')
+					}, 300)
+				})
+			},
+			/**
+			 * 确认按钮
+			 */
+			confirm() {
+				this.setEmit('confirm')
+				this.close()
+			},
+			/**
+			 * 变化触发
+			 */
+			change() {
+				if (!this.insert) return
+				this.setEmit('change')
+			},
+			/**
+			 * 选择月份触发
+			 */
+			monthSwitch() {
+				let {
+					year,
+					month
+				} = this.nowDate
+				this.$emit('monthSwitch', {
+					year,
+					month: Number(month)
+				})
+			},
+			/**
+			 * 派发事件
+			 * @param {Object} name
+			 */
+			setEmit(name) {
+				let {
+					year,
+					month,
+					date,
+					fullDate,
+					lunar,
+					extraInfo
+				} = this.calendar
+				this.$emit(name, {
+					range: this.cale.multipleStatus,
+					year,
+					month,
+					date,
+					fulldate: fullDate,
+					lunar,
+					extraInfo: extraInfo || {}
+				})
+			},
+			/**
+			 * 选择天触发
+			 * @param {Object} weeks
+			 */
+			choiceDate(weeks) {
+				if (weeks.disable) return
+				this.calendar = weeks
+				// 设置多选
+				//this.cale.setMultiple(this.calendar.fullDate)
+				this.weeks = this.cale.weeks
+				this.change()
+			},
+			/**
+			 * 回到今天
+			 */
+			backtoday() {
+				console.log(this.cale.getDate(new Date()).fullDate);
+				let date = this.cale.getDate(new Date()).fullDate
+				// this.cale.setDate(date)
+				this.init(date)
+				this.change()
+			},
+			/**
+			 * 上个月
+			 */
+			pre() {
+				const preDate = this.cale.getDate(this.nowDate.fullDate, -1, 'month').fullDate
+				this.setDate(preDate)
+				this.monthSwitch()
+
+			},
+			/**
+			 * 下个月
+			 */
+			next() {
+				const nextDate = this.cale.getDate(this.nowDate.fullDate, +1, 'month').fullDate
+				this.setDate(nextDate)
+				this.monthSwitch()
+			},
+			/**
+			 * 设置日期
+			 * @param {Object} date
+			 */
+			setDate(date) {
+				this.cale.setDate(date)
+				this.weeks = this.cale.weeks
+				this.nowDate = this.cale.getInfo(date)
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.uni-calendar {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+	}
+
+	.uni-calendar__mask {
+		position: fixed;
+		bottom: 0;
+		top: 0;
+		left: 0;
+		right: 0;
+		background-color: $uni-bg-color-mask;
+		transition-property: opacity;
+		transition-duration: 0.3s;
+		opacity: 0;
+		/* #ifndef APP-NVUE */
+		z-index: 99;
+		/* #endif */
+	}
+
+	.uni-calendar--mask-show {
+		opacity: 1
+	}
+
+	.uni-calendar--fixed {
+		position: fixed;
+		bottom: calc(var(--window-bottom));
+		left: 0;
+		right: 0;
+		transition-property: transform;
+		transition-duration: 0.3s;
+		transform: translateY(460px);
+		/* #ifndef APP-NVUE */
+		z-index: 99;
+		/* #endif */
+	}
+
+	.uni-calendar--ani-show {
+		transform: translateY(0);
+	}
+
+	.uni-calendar__content {
+		background-color: #fff;
+	}
+
+	.uni-calendar__header {
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		justify-content: center;
+		align-items: center;
+		height: 50px;
+		border-bottom-color: $uni-border-color;
+		border-bottom-style: solid;
+		border-bottom-width: 1px;
+	}
+
+	.uni-calendar--fixed-top {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		justify-content: space-between;
+		border-top-color: $uni-border-color;
+		border-top-style: solid;
+		border-top-width: 1px;
+	}
+
+	.uni-calendar--fixed-width {
+		width: 50px;
+		// padding: 0 15px;
+	}
+
+	.uni-calendar__backtoday {
+		position: absolute;
+		right: 0;
+		top: 25rpx;
+		padding: 0 5px;
+		padding-left: 10px;
+		height: 25px;
+		line-height: 25px;
+		font-size: 12px;
+		border-top-left-radius: 25px;
+		border-bottom-left-radius: 25px;
+		color: $uni-text-color;
+		background-color: $uni-bg-color-hover;
+	}
+
+	.uni-calendar__header-text {
+		text-align: center;
+		width: 100px;
+		font-size: $uni-font-size-base;
+		color: $uni-text-color;
+	}
+
+	.uni-calendar__header-btn-box {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+		justify-content: center;
+		width: 50px;
+		height: 50px;
+	}
+
+	.uni-calendar__header-btn {
+		width: 10px;
+		height: 10px;
+		border-left-color: $uni-text-color-placeholder;
+		border-left-style: solid;
+		border-left-width: 2px;
+		border-top-color: $uni-color-subtitle;
+		border-top-style: solid;
+		border-top-width: 2px;
+	}
+
+	.uni-calendar--left {
+		transform: rotate(-45deg);
+	}
+
+	.uni-calendar--right {
+		transform: rotate(135deg);
+	}
+
+
+	.uni-calendar__weeks {
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+	}
+
+	.uni-calendar__weeks-item {
+		flex: 1;
+	}
+
+	.uni-calendar__weeks-day {
+		flex: 1;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+		height: 45px;
+		border-bottom-color: #F5F5F5;
+		border-bottom-style: solid;
+		border-bottom-width: 1px;
+	}
+
+	.uni-calendar__weeks-day-text {
+		font-size: 14px;
+	}
+
+	.uni-calendar__box {
+		position: relative;
+	}
+
+	.uni-calendar__box-bg {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		justify-content: center;
+		align-items: center;
+		position: absolute;
+		top: 0;
+		left: 0;
+		right: 0;
+		bottom: 0;
+	}
+
+	.uni-calendar__box-bg-text {
+		font-size: 200px;
+		font-weight: bold;
+		color: $uni-text-color-grey;
+		opacity: 0.1;
+		text-align: center;
+		/* #ifndef APP-NVUE */
+		line-height: 1;
+		/* #endif */
+	}
+</style>

+ 354 - 0
components/uni-calendar/util.js

@@ -0,0 +1,354 @@
+import CALENDAR from './calendar.js'
+
+class Calendar {
+	constructor({
+		date,
+		selected,
+		startDate,
+		endDate,
+		range
+	} = {}) {
+		// 当前日期
+		this.date = this.getDate(new Date()) // 当前初入日期
+		// 打点信息
+		this.selected = selected || [];
+		// 范围开始
+		this.startDate = startDate
+		// 范围结束
+		this.endDate = endDate
+		this.range = range
+		// 多选状态
+		this.cleanMultipleStatus()
+		// 每周日期
+		this.weeks = {}
+		// this._getWeek(this.date.fullDate)
+	}
+	/**
+	 * 设置日期
+	 * @param {Object} date
+	 */
+	setDate(date) {
+		this.selectDate = this.getDate(date)
+		this._getWeek(this.selectDate.fullDate)
+	}
+
+	/**
+	 * 清理多选状态
+	 */
+	cleanMultipleStatus() {
+		this.multipleStatus = {
+			before: '',
+			after: '',
+			data: []
+		}
+	}
+
+	/**
+	 * 重置开始日期
+	 */
+	resetSatrtDate(startDate) {
+		// 范围开始
+		this.startDate = startDate
+
+	}
+
+	/**
+	 * 重置结束日期
+	 */
+	resetEndDate(endDate) {
+		// 范围结束
+		this.endDate = endDate
+	}
+
+	/**
+	 * 获取任意时间
+	 */
+	getDate(date, AddDayCount = 0, str = 'day') {
+		if (!date) {
+			date = new Date()
+		}
+		if (typeof date !== 'object') {
+			date = date.replace(/-/g, '/')
+		}
+		const dd = new Date(date)
+		switch (str) {
+			case 'day':
+				dd.setDate(dd.getDate() + AddDayCount) // 获取AddDayCount天后的日期
+				break
+			case 'month':
+				if (dd.getDate() === 31) {
+					dd.setDate(dd.getDate() + AddDayCount)
+				} else {
+					dd.setMonth(dd.getMonth() + AddDayCount) // 获取AddDayCount天后的日期
+				}
+				break
+			case 'year':
+				dd.setFullYear(dd.getFullYear() + AddDayCount) // 获取AddDayCount天后的日期
+				break
+		}
+		const y = dd.getFullYear()
+		const m = dd.getMonth() + 1 < 10 ? '0' + (dd.getMonth() + 1) : dd.getMonth() + 1 // 获取当前月份的日期,不足10补0
+		const d = dd.getDate() < 10 ? '0' + dd.getDate() : dd.getDate() // 获取当前几号,不足10补0
+		return {
+			fullDate: y + '-' + m + '-' + d,
+			year: y,
+			month: m,
+			date: d,
+			day: dd.getDay()
+		}
+	}
+
+
+	/**
+	 * 获取上月剩余天数
+	 */
+	_getLastMonthDays(firstDay, full) {
+		let dateArr = []
+		for (let i = firstDay; i > 0; i--) {
+			const beforeDate = new Date(full.year, full.month - 1, -i + 1).getDate()
+			dateArr.push({
+				date: beforeDate,
+				month: full.month - 1,
+				lunar: this.getlunar(full.year, full.month - 1, beforeDate),
+				disable: true
+			})
+		}
+		return dateArr
+	}
+	/**
+	 * 获取本月天数
+	 */
+	_currentMonthDys(dateData, full) {
+		let dateArr = []
+		let fullDate = this.date.fullDate
+		for (let i = 1; i <= dateData; i++) {
+			let isinfo = false
+			let nowDate = full.year + '-' + (full.month < 10 ?
+				full.month : full.month) + '-' + (i < 10 ?
+				'0' + i : i)
+			// 是否今天
+			let isDay = fullDate === nowDate
+			// 获取打点信息
+			let info = this.selected && this.selected.find((item) => {
+				if (this.dateEqual(nowDate, item.date)) {
+					return item
+				}
+			})
+
+			// 日期禁用
+			let disableBefore = true
+			let disableAfter = true
+			if (this.startDate) {
+				// let dateCompBefore = this.dateCompare(this.startDate, fullDate)
+				// disableBefore = this.dateCompare(dateCompBefore ? this.startDate : fullDate, nowDate)
+				disableBefore = this.dateCompare(this.startDate, nowDate)
+			}
+
+			if (this.endDate) {
+				// let dateCompAfter = this.dateCompare(fullDate, this.endDate)
+				// disableAfter = this.dateCompare(nowDate, dateCompAfter ? this.endDate : fullDate)
+				disableAfter = this.dateCompare(nowDate, this.endDate)
+			}
+			let multiples = this.multipleStatus.data
+			let checked = false
+			let multiplesStatus = -1
+			if (this.range) {
+				if (multiples) {
+					multiplesStatus = multiples.findIndex((item) => {
+						return this.dateEqual(item, nowDate)
+					})
+				}
+				if (multiplesStatus !== -1) {
+					checked = true
+				}
+			}
+			let data = {
+				fullDate: nowDate,
+				year: full.year,
+				date: i,
+				multiple: this.range ? checked : false,
+				beforeMultiple: this.dateEqual(this.multipleStatus.before, nowDate),
+				afterMultiple: this.dateEqual(this.multipleStatus.after, nowDate),
+				month: full.month,
+				lunar: this.getlunar(full.year, full.month, i),
+				disable: !(disableBefore && disableAfter),
+				isDay
+			}
+			if (info) {
+				data.extraInfo = info
+			}
+
+			dateArr.push(data)
+		}
+		return dateArr
+	}
+	/**
+	 * 获取下月天数
+	 */
+	_getNextMonthDays(surplus, full) {
+		let dateArr = []
+		for (let i = 1; i < surplus + 1; i++) {
+			dateArr.push({
+				date: i,
+				month: Number(full.month) + 1,
+				lunar: this.getlunar(full.year, Number(full.month) + 1, i),
+				disable: true
+			})
+		}
+		return dateArr
+	}
+
+	/**
+	 * 获取当前日期详情
+	 * @param {Object} date
+	 */
+	getInfo(date) {
+		if (!date) {
+			date = new Date()
+		}
+		const dateInfo = this.canlender.find(item => item.fullDate === this.getDate(date).fullDate)
+		return dateInfo
+	}
+
+	/**
+	 * 比较时间大小
+	 */
+	dateCompare(startDate, endDate) {
+		// 计算截止时间
+		startDate = new Date(startDate.replace('-', '/').replace('-', '/'))
+		// 计算详细项的截止时间
+		endDate = new Date(endDate.replace('-', '/').replace('-', '/'))
+		if (startDate <= endDate) {
+			return true
+		} else {
+			return false
+		}
+	}
+
+	/**
+	 * 比较时间是否相等
+	 */
+	dateEqual(before, after) {
+		// 计算截止时间
+		before = new Date(before.replace('-', '/').replace('-', '/'))
+		// 计算详细项的截止时间
+		after = new Date(after.replace('-', '/').replace('-', '/'))
+		if (before.getTime() - after.getTime() === 0) {
+			return true
+		} else {
+			return false
+		}
+	}
+
+
+	/**
+	 * 获取日期范围内所有日期
+	 * @param {Object} begin
+	 * @param {Object} end
+	 */
+	geDateAll(begin, end) {
+		var arr = []
+		var ab = begin.split('-')
+		var ae = end.split('-')
+		var db = new Date()
+		db.setFullYear(ab[0], ab[1] - 1, ab[2])
+		var de = new Date()
+		de.setFullYear(ae[0], ae[1] - 1, ae[2])
+		var unixDb = db.getTime() - 24 * 60 * 60 * 1000
+		var unixDe = de.getTime() - 24 * 60 * 60 * 1000
+		for (var k = unixDb; k <= unixDe;) {
+			k = k + 24 * 60 * 60 * 1000
+			arr.push(this.getDate(new Date(parseInt(k))).fullDate)
+		}
+		return arr
+	}
+	/**
+	 * 计算阴历日期显示
+	 */
+	getlunar(year, month, date) {
+		return CALENDAR.solar2lunar(year, month, date)
+	}
+	/**
+	 * 设置打点
+	 */
+	setSelectInfo(data, value) {
+		this.selected = value
+		this._getWeek(data)
+	}
+
+	/**
+	 *  获取多选状态
+	 */
+	setMultiple(fullDate) {
+		let {
+			before,
+			after
+		} = this.multipleStatus
+
+		if (!this.range) return
+		if (before && after) {
+			this.multipleStatus.before = ''
+			this.multipleStatus.after = ''
+			this.multipleStatus.data = []
+		} else {
+			if (!before) {
+				this.multipleStatus.before = fullDate
+			} else {
+				this.multipleStatus.after = fullDate
+				if (this.dateCompare(this.multipleStatus.before, this.multipleStatus.after)) {
+					this.multipleStatus.data = this.geDateAll(this.multipleStatus.before, this.multipleStatus.after);
+				} else {
+					this.multipleStatus.data = this.geDateAll(this.multipleStatus.after, this.multipleStatus.before);
+				}
+			}
+		}
+		this._getWeek(fullDate)
+	}
+
+	/**
+	 * 获取每周数据
+	 * @param {Object} dateData
+	 */
+	_getWeek(dateData) {
+		const {
+			fullDate,
+			year,
+			month,
+			date,
+			day
+		} = this.getDate(dateData)
+		let firstDay = new Date(year, month - 1, 1).getDay()
+		let currentDay = new Date(year, month, 0).getDate()
+		let dates = {
+			lastMonthDays: this._getLastMonthDays(firstDay, this.getDate(dateData)), // 上个月末尾几天
+			currentMonthDys: this._currentMonthDys(currentDay, this.getDate(dateData)), // 本月天数
+			nextMonthDays: [], // 下个月开始几天
+			weeks: []
+		}
+		let canlender = []
+		const surplus = 42 - (dates.lastMonthDays.length + dates.currentMonthDys.length)
+		dates.nextMonthDays = this._getNextMonthDays(surplus, this.getDate(dateData))
+		canlender = canlender.concat(dates.lastMonthDays, dates.currentMonthDys, dates.nextMonthDays)
+		let weeks = {}
+		// 拼接数组  上个月开始几天 + 本月天数+ 下个月开始几天
+		for (let i = 0; i < canlender.length; i++) {
+			if (i % 7 === 0) {
+				weeks[parseInt(i / 7)] = new Array(7)
+			}
+			weeks[parseInt(i / 7)][i % 7] = canlender[i]
+		}
+		this.canlender = canlender
+		this.weeks = weeks
+	}
+
+	//静态方法
+	// static init(date) {
+	// 	if (!this.instance) {
+	// 		this.instance = new Calendar(date);
+	// 	}
+	// 	return this.instance;
+	// }
+}
+
+
+export default Calendar

+ 402 - 0
components/uni-collapse-item/uni-collapse-item.vue

@@ -0,0 +1,402 @@
+<template>
+	<view class="uni-collapse-item">
+		<!-- onClick(!isOpen) -->
+		<view @click="onClick(!isOpen)" class="uni-collapse-item__title"
+			:class="{'is-open':isOpen &&titleBorder === 'auto' ,'uni-collapse-item-border':titleBorder !== 'none'}">
+			<view class="uni-collapse-item__title-wrap">
+				<slot name="title">
+					<view class="uni-collapse-item__title-box" :class="{'is-disabled':disabled}">
+						<image v-if="thumb" :src="thumb" class="uni-collapse-item__title-img" />
+						<text class="uni-collapse-item__title-text">{{ title }}</text>
+					</view>
+				</slot>
+			</view>
+			<view
+				v-if="showArrow"
+				:class="{ 'uni-collapse-item__title-arrow-active': isOpen, 'uni-collapse-item--animation': showAnimation === true }"
+				class="uni-collapse-item__title-arrow">
+				<uni-icons :color="disabled?'#ddd':'#bbb'" size="14" type="arrowdown" />
+			</view>
+		</view>
+		<view class="uni-collapse-item__wrap" :class="{'is--transition':showAnimation}"
+			:style="{height: (isOpen?height:0) +'px'}">
+			<view :id="elId" ref="collapse--hook" class="uni-collapse-item__wrap-content"
+				:class="{open:isheight,'uni-collapse-item--border':border&&isOpen}">
+				<slot></slot>
+			</view>
+		</view>
+
+	</view>
+</template>
+
+<script>
+	// #ifdef APP-NVUE
+	const dom = weex.requireModule('dom')
+	// #endif
+	/**
+	 * CollapseItem 折叠面板子组件
+	 * @description 折叠面板子组件
+	 * @property {String} title 标题文字
+	 * @property {String} thumb 标题左侧缩略图
+	 * @property {String} name 唯一标志符
+	 * @property {Boolean} open = [true|false] 是否展开组件
+	 * @property {Boolean} titleBorder = [true|false] 是否显示标题分隔线
+	 * @property {Boolean} border = [true|false] 是否显示分隔线
+	 * @property {Boolean} disabled = [true|false] 是否展开面板
+	 * @property {Boolean} showAnimation = [true|false] 开启动画
+	 * @property {Boolean} showArrow = [true|false] 是否显示右侧箭头
+	 */
+	export default {
+		name: 'uniCollapseItem',
+		props: {
+			// 列表标题
+			title: {
+				type: String,
+				default: ''
+			},
+			name: {
+				type: [Number, String],
+				default: ''
+			},
+			// 是否禁用
+			disabled: {
+				type: Boolean,
+				default: false
+			},
+			// #ifdef APP-PLUS
+			// 是否显示动画,app 端默认不开启动画,卡顿严重
+			showAnimation: {
+				type: Boolean,
+				default: false
+			},
+			// #endif
+			// #ifndef APP-PLUS
+			// 是否显示动画
+			showAnimation: {
+				type: Boolean,
+				default: true
+			},
+			// #endif
+			// 是否展开
+			open: {
+				type: Boolean,
+				default: false
+			},
+			// 缩略图
+			thumb: {
+				type: String,
+				default: ''
+			},
+			// 标题分隔线显示类型
+			titleBorder: {
+				type: String,
+				default: 'auto'
+			},
+			border: {
+				type: Boolean,
+				default: true
+			},
+			showArrow:{
+				type: Boolean,
+				default: true
+			}
+		},
+		data() {
+			// TODO 随机生生元素ID,解决百度小程序获取同一个元素位置信息的bug
+			const elId = `Uni_${Math.ceil(Math.random() * 10e5).toString(36)}`
+			return {
+				isOpen: false,
+				isheight: null,
+				height: 0,
+				elId,
+				nameSync: 0
+			}
+		},
+		watch: {
+			open(val) {
+				this.isOpen = val
+				this.onClick(val,'init')
+			}
+		},
+		updated(e) {
+			this.$nextTick(()=> {
+				this.init(true)
+			})
+		},
+		created(){
+			this.collapse = this.getCollapse()
+			this.oldHeight = 0
+		},
+		// #ifndef VUE3
+		// TODO vue2
+		destroyed() {
+			if (this.__isUnmounted) return
+			this.uninstall()
+		},
+		// #endif
+		// #ifdef VUE3
+		// TODO vue3
+		unmounted() {
+			this.__isUnmounted = true
+			this.uninstall()
+		},
+		// #endif
+		mounted() {
+			if (!this.collapse) return
+			if (this.name !== '') {
+				this.nameSync = this.name
+			} else {
+				this.nameSync = this.collapse.childrens.length + ''
+			}
+			if (this.collapse.names.indexOf(this.nameSync) === -1) {
+				this.collapse.names.push(this.nameSync)
+			} else {
+				console.warn(`name 值 ${this.nameSync} 重复`);
+			}
+			if (this.collapse.childrens.indexOf(this) === -1) {
+				this.collapse.childrens.push(this)
+			}
+			this.init()
+		},
+		methods: {
+			init(type) {
+				// #ifndef APP-NVUE
+				this.getCollapseHeight(type)
+				// #endif
+				// #ifdef APP-NVUE
+				this.getNvueHwight(type)
+				// #endif
+			},
+			uninstall() {
+				if (this.collapse) {
+					this.collapse.childrens.forEach((item, index) => {
+						if (item === this) {
+							this.collapse.childrens.splice(index, 1)
+						}
+					})
+					this.collapse.names.forEach((item, index) => {
+						if (item === this.nameSync) {
+							this.collapse.names.splice(index, 1)
+						}
+					})
+				}
+			},
+			onClick(isOpen,type) {
+				if (this.disabled) return
+				this.isOpen = isOpen
+				if (this.isOpen && this.collapse) {
+					this.collapse.setAccordion(this)
+				}
+				if(type !== 'init'){
+					this.collapse.onChange(isOpen,this)
+				}
+			},
+			getCollapseHeight(type, index = 0) {
+				const views = uni.createSelectorQuery().in(this)
+				views
+					.select(`#${this.elId}`)
+					.fields({
+						size: true
+					}, data => {
+						// TODO 百度中可能获取不到节点信息 ,需要循环获取
+						if (index >= 10) return
+						if (!data) {
+							index++
+							this.getCollapseHeight(false, index)
+							return
+						}
+						// #ifdef APP-NVUE
+						this.height = data.height + 1
+						// #endif
+						// #ifndef APP-NVUE
+						this.height = data.height
+						// #endif
+						this.isheight = true
+						if (type) return
+						this.onClick(this.open,'init')
+					})
+					.exec()
+			},
+			getNvueHwight(type) {
+				const result = dom.getComponentRect(this.$refs['collapse--hook'], option => {
+					if (option && option.result && option.size) {
+						// #ifdef APP-NVUE
+						this.height = option.size.height + 1
+						// #endif
+						// #ifndef APP-NVUE
+						this.height = option.size.height
+						// #endif
+						this.isheight = true
+						if (type) return
+						this.onClick(this.open,'init')
+					}
+				})
+			},
+			/**
+			 * 获取父元素实例
+			 */
+			getCollapse(name = 'uniCollapse') {
+				let parent = this.$parent;
+				let parentName = parent.$options.name;
+				while (parentName !== name) {
+					parent = parent.$parent;
+					if (!parent) return false;
+					parentName = parent.$options.name;
+				}
+				return parent;
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.uni-collapse-item {
+		/* #ifndef APP-NVUE */
+		box-sizing: border-box;
+
+		/* #endif */
+		&__title {
+			/* #ifndef APP-NVUE */
+			display: flex;
+			width: 100%;
+			box-sizing: border-box;
+			/* #endif */
+			flex-direction: row;
+			align-items: center;
+			transition: border-bottom-color .3s;
+
+			// transition-property: border-bottom-color;
+			// transition-duration: 5s;
+			&-wrap {
+				width: 100%;
+				flex: 1;
+
+			}
+
+			&-box {
+				padding: 0 15px;
+				/* #ifndef APP-NVUE */
+				display: flex;
+				width: 100%;
+				box-sizing: border-box;
+				/* #endif */
+				flex-direction: row;
+				justify-content: space-between;
+				align-items: center;
+				height: 48px;
+				line-height: 48px;
+				background-color: #fff;
+				color: #303133;
+				font-size: 13px;
+				font-weight: 500;
+				/* #ifdef H5 */
+				cursor: pointer;
+				outline: none;
+
+				/* #endif */
+				&.is-disabled {
+					.uni-collapse-item__title-text {
+						color: $uni-text-color-disable;
+					}
+				}
+
+			}
+
+			&.uni-collapse-item-border {
+				border-bottom: 1px solid #ebeef5;
+			}
+
+			&.is-open {
+				border-bottom-color: transparent;
+			}
+
+			&-img {
+				height: $uni-img-size-base;
+				width: $uni-img-size-base;
+				margin-right: 10px;
+			}
+
+			&-text {
+				flex: 1;
+				font-size: $uni-font-size-base;
+				/* #ifndef APP-NVUE */
+				white-space: nowrap;
+				color: inherit;
+				/* #endif */
+				/* #ifdef APP-NVUE */
+				lines: 1;
+				/* #endif */
+				overflow: hidden;
+				text-overflow: ellipsis;
+			}
+
+			&-arrow {
+				/* #ifndef APP-NVUE */
+				display: flex;
+				box-sizing: border-box;
+				/* #endif */
+				align-items: center;
+				justify-content: center;
+				width: 20px;
+				height: 20px;
+				margin-right: 10px;
+				transform: rotate(0deg);
+
+				&-active {
+					transform: rotate(180deg);
+				}
+			}
+
+
+		}
+
+		&__wrap {
+			/* #ifndef APP-NVUE */
+			will-change: height;
+			box-sizing: border-box;
+			/* #endif */
+			background-color: #fff;
+			overflow: hidden;
+			position: relative;
+			height: 0;
+
+			&.is--transition {
+				// transition: all 0.3s;
+				transition-property: height, border-bottom-width;
+				transition-duration: 0.3s;
+				/* #ifndef APP-NVUE */
+				will-change: height;
+				/* #endif */
+			}
+
+
+
+			&-content {
+				position: absolute;
+				font-size: 13px;
+				color: #303133;
+				// transition: height 0.3s;
+				border-bottom-color: transparent;
+				border-bottom-style: solid;
+				border-bottom-width: 0;
+
+				&.uni-collapse-item--border {
+					border-bottom-width: 1px;
+					border-bottom-color: red;
+					border-bottom-color: #ebeef5;
+				}
+
+				&.open {
+					position: relative;
+				}
+			}
+		}
+
+		&--animation {
+			transition-property: transform;
+			transition-duration: 0.3s;
+			transition-timing-function: ease;
+		}
+
+	}
+</style>

+ 146 - 0
components/uni-collapse/uni-collapse.vue

@@ -0,0 +1,146 @@
+<template>
+	<view class="uni-collapse">
+		<slot />
+	</view>
+</template>
+<script>
+	/**
+	 * Collapse 折叠面板
+	 * @description 展示可以折叠 / 展开的内容区域
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=23
+	 * @property {String|Array} value 当前激活面板改变时触发(如果是手风琴模式,参数类型为string,否则为array)
+	 * @property {Boolean} accordion = [true|false] 是否开启手风琴效果是否开启手风琴效果
+	 * @event {Function} change 切换面板时触发,如果是手风琴模式,返回类型为string,否则为array
+	 */
+	export default {
+		name: 'uniCollapse',
+		emits:['change','activeItem','input','update:modelValue'],
+		props: {
+			value: {
+				type: [String, Array],
+				default: ''
+			},
+			modelValue: {
+				type: [String, Array],
+				default: ''
+			},
+			accordion: {
+				// 是否开启手风琴效果
+				type: [Boolean, String],
+				default: false
+			},
+		},
+		data() {
+			return {}
+		},
+		computed: {
+			// TODO 兼容 vue2 和 vue3
+			dataValue() {
+				let value = (typeof this.value === 'string' && this.value === '') ||
+					(Array.isArray(this.value) && this.value.length === 0)
+				let modelValue = (typeof this.modelValue === 'string' && this.modelValue === '') ||
+					(Array.isArray(this.modelValue) && this.modelValue.length === 0)
+				if (value) {
+					return this.modelValue
+				}
+				if (modelValue) {
+					return this.value
+				}
+
+				return this.value
+			}
+		},
+		watch: {
+			dataValue(val) {
+				this.setOpen(val)
+			}
+		},
+		created() {
+			this.childrens = []
+			this.names = []
+		},
+		mounted() {
+			this.setOpen(this.dataValue)
+		},
+		methods: {
+			setOpen(val) {
+				let str = typeof val === 'string'
+				let arr = Array.isArray(val)
+
+				this.childrens.forEach((vm, index) => {
+					if (str) {
+						if (val === vm.nameSync) {
+							if (!this.accordion) {
+								console.warn('accordion 属性为 false ,v-model 类型应该为 array')
+								return
+							}
+							vm.isOpen = true
+						}
+					}
+					if (arr) {
+						val.forEach(v => {
+							if (v === vm.nameSync) {
+								if (this.accordion) {
+									console.warn('accordion 属性为 true ,v-model 类型应该为 string')
+									return
+								}
+								vm.isOpen = true
+							}
+						})
+					}
+				})
+				this.emit(val)
+			},
+			setAccordion(self) {
+				if (!this.accordion) return
+				this.childrens.forEach((vm, index) => {
+					if (self !== vm) {
+						vm.isOpen = false
+					}
+				})
+			},
+			resize() {
+				this.childrens.forEach((vm, index) => {
+					// #ifndef APP-NVUE
+					vm.getCollapseHeight()
+					// #endif
+					// #ifdef APP-NVUE
+					vm.getNvueHwight()
+					// #endif
+				})
+			},
+			onChange(isOpen, self) {
+				let activeItem = []
+
+				if (this.accordion) {
+					activeItem = isOpen ? self.nameSync : ''
+				} else {
+					this.childrens.forEach((vm, index) => {
+						if (vm.isOpen) {
+							activeItem.push(vm.nameSync)
+						}
+					})
+				}
+				this.$emit('change', activeItem)
+				this.emit(activeItem)
+			},
+			emit(val){
+				this.$emit('input', val)
+				this.$emit('update:modelValue', val)
+			}
+		}
+	}
+</script>
+<style lang="scss" scoped>
+	.uni-collapse {
+		/* #ifndef APP-NVUE */
+		width: 100%;
+		display: flex;
+		/* #endif */
+		/* #ifdef APP-NVUE */
+		flex: 1;
+		/* #endif */
+		flex-direction: column;
+		background-color: $uni-bg-color;
+	}
+</style>

+ 239 - 0
components/uni-combox/uni-combox.vue

@@ -0,0 +1,239 @@
+<template>
+	<view class="uni-combox">
+		<view v-if="label" class="uni-combox__label" :style="labelStyle">
+			<text>{{label}}</text>
+		</view>
+		<view class="uni-combox__input-box">
+			<input class="uni-combox__input" type="text" :placeholder="placeholder" v-model="inputVal" @input="onInput"
+			 @focus="onFocus" @blur="onBlur" />
+			<uni-icons class="uni-combox__input-arrow" type="arrowdown" size="14" @click="toggleSelector"></uni-icons>
+			<view class="uni-combox__selector" v-if="showSelector">
+				<scroll-view scroll-y="true" class="uni-combox__selector-scroll">
+					<view class="uni-combox__selector-empty" v-if="filterCandidatesLength === 0">
+						<text>{{emptyTips}}</text>
+					</view>
+					<view class="uni-combox__selector-item" v-for="(item,index) in filterCandidates" :key="index" @click="onSelectorClick(index)">
+						<text>{{item}}</text>
+					</view>
+				</scroll-view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	/**
+	 * Combox 组合输入框
+	 * @description 组合输入框一般用于既可以输入也可以选择的场景
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=1261
+	 * @property {String} label 左侧文字
+	 * @property {String} labelWidth 左侧内容宽度
+	 * @property {String} placeholder 输入框占位符
+	 * @property {Array} candidates 候选项列表
+	 * @property {String} emptyTips 筛选结果为空时显示的文字
+	 * @property {String} value 组合框的值
+	 */
+	export default {
+		name: 'uniCombox',
+		emits:['input','update:modelValue'],
+		props: {
+			label: {
+				type: String,
+				default: ''
+			},
+			labelWidth: {
+				type: String,
+				default: 'auto'
+			},
+			placeholder: {
+				type: String,
+				default: ''
+			},
+			candidates: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			emptyTips: {
+				type: String,
+				default: '无匹配项'
+			},
+			// #ifndef VUE3
+			value: {
+				type: [String, Number],
+				default: ''
+			},
+			// #endif
+			// #ifdef VUE3
+			modelValue: {
+				type: [String, Number],
+				default: ''
+			},
+			// #endif
+		},
+		data() {
+			return {
+				showSelector: false,
+				inputVal: ''
+			}
+		},
+		computed: {
+			labelStyle() {
+				if (this.labelWidth === 'auto') {
+					return {}
+				}
+				return {
+					width: this.labelWidth
+				}
+			},
+			filterCandidates() {
+				return this.candidates.filter((item) => {
+					return item.toString().indexOf(this.inputVal) > -1
+				})
+			},
+			filterCandidatesLength() {
+				return this.filterCandidates.length
+			}
+		},
+		watch: {
+			// #ifndef VUE3
+			value: {
+				handler(newVal) {
+					this.inputVal = newVal
+				},
+				immediate: true
+			},
+			// #endif
+			// #ifdef VUE3
+			modelValue: {
+				handler(newVal) {
+					this.inputVal = newVal
+				},
+				immediate: true
+			},
+			// #endif
+		},
+		methods: {
+			toggleSelector() {
+				this.showSelector = !this.showSelector
+			},
+			onFocus() {
+				this.showSelector = true
+			},
+			onBlur() {
+				setTimeout(() => {
+					this.showSelector = false
+				}, 153)
+			},
+			onSelectorClick(index) {
+				this.inputVal = this.filterCandidates[index]
+				this.showSelector = false
+				this.$emit('input', this.inputVal)
+				this.$emit('update:modelValue', this.inputVal)
+			},
+			onInput() {
+				setTimeout(() => {
+					this.$emit('input', this.inputVal)
+					this.$emit('update:modelValue', this.inputVal)
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.uni-combox {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		height: 40px;
+		flex-direction: row;
+		align-items: center;
+		// border-bottom: solid 1px #DDDDDD;
+	}
+
+	.uni-combox__label {
+		font-size: 16px;
+		line-height: 22px;
+		padding-right: 10px;
+		color: #999999;
+	}
+
+	.uni-combox__input-box {
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex: 1;
+		flex-direction: row;
+		align-items: center;
+	}
+
+	.uni-combox__input {
+		flex: 1;
+		font-size: 16px;
+		height: 22px;
+		line-height: 22px;
+	}
+
+	.uni-combox__input-arrow {
+		padding: 10px;
+	}
+
+	.uni-combox__selector {
+		/* #ifndef APP-NVUE */
+		box-sizing: border-box;
+		/* #endif */
+		position: absolute;
+		top: 42px;
+		left: 0;
+		width: 100%;
+		background-color: #FFFFFF;
+		border-radius: 6px;
+		box-shadow: #DDDDDD 4px 4px 8px, #DDDDDD -4px -4px 8px;
+		z-index: 2;
+	}
+
+	.uni-combox__selector-scroll {
+		/* #ifndef APP-NVUE */
+		max-height: 200px;
+		box-sizing: border-box;
+		/* #endif */
+	}
+
+	.uni-combox__selector::before {
+		/* #ifndef APP-NVUE */
+		content: '';
+		/* #endif */
+		position: absolute;
+		width: 0;
+		height: 0;
+		border-bottom: solid 6px #FFFFFF;
+		border-right: solid 6px transparent;
+		border-left: solid 6px transparent;
+		left: 50%;
+		top: -6px;
+		margin-left: -6px;
+	}
+
+	.uni-combox__selector-empty,
+	.uni-combox__selector-item {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		cursor: pointer;
+		/* #endif */
+		line-height: 36px;
+		font-size: 14px;
+		text-align: center;
+		border-bottom: solid 1px #DDDDDD;
+		margin: 0px 10px;
+	}
+
+	.uni-combox__selector-empty:last-child,
+	.uni-combox__selector-item:last-child {
+		/* #ifndef APP-NVUE */
+		border-bottom: none;
+		/* #endif */
+	}
+</style>

+ 449 - 0
components/uni-fab/uni-fab.vue

@@ -0,0 +1,449 @@
+<template>
+	<view class="uni-cursor-point">
+		<!--<view v-if="popMenu && (leftBottom||rightBottom||leftTop||rightTop) && content.length > 0" :class="{
+        'uni-fab--leftBottom': leftBottom,
+        'uni-fab--rightBottom': rightBottom,
+        'uni-fab--leftTop': leftTop,
+        'uni-fab--rightTop': rightTop
+      }" class="uni-fab">
+			<view :class="{
+          'uni-fab__content--left': horizontal === 'left',
+          'uni-fab__content--right': horizontal === 'right',
+          'uni-fab__content--flexDirection': direction === 'vertical',
+          'uni-fab__content--flexDirectionStart': flexDirectionStart,
+          'uni-fab__content--flexDirectionEnd': flexDirectionEnd,
+		  'uni-fab__content--other-platform': !isAndroidNvue
+        }" :style="{ width: boxWidth, height: boxHeight, backgroundColor: styles.backgroundColor }" class="uni-fab__content" elevation="5">
+				<view v-if="flexDirectionStart || horizontalLeft" class="uni-fab__item uni-fab__item--first" />
+				<view v-for="(item, index) in content" :key="index" :class="{ 'uni-fab__item--active': isShow }" class="uni-fab__item" @click="_onItemClick(index, item)">
+					<image :src="item.active ? item.selectedIconPath : item.iconPath" class="uni-fab__item-image" mode="widthFix" />
+					<text class="uni-fab__item-text" :style="{ color: item.active ? styles.selectedColor : styles.color }">{{ item.text }}</text>
+				</view>
+				<view v-if="flexDirectionEnd || horizontalRight" class="uni-fab__item uni-fab__item--first" />
+			</view>
+		</view>-->
+		 
+		<view v-for="(item, index) in content" :key="index" :class="{ 'uni-fab__item--active': isShow }" class="uni-fab__item" @click="_onItemClick(index, item)">
+			<image :src="item.active ? item.selectedIconPath : item.iconPath" class="uni-fab__item-image" mode="widthFix" />
+			<text class="uni-fab__item-text" :style="{ color: item.active ? styles.selectedColor : styles.color }">{{ item.text }}</text>
+		</view>
+		<!--
+		<view :class="{
+		  'uni-fab__circle--leftBottom': leftBottom,
+		  'uni-fab__circle--rightBottom': rightBottom,
+		  'uni-fab__circle--leftTop': leftTop,
+		  'uni-fab__circle--rightTop': rightTop,
+		  'uni-fab__content--other-platform': !isAndroidNvue
+		}" class="uni-fab__circle uni-fab__plus" :style="{ 'background-color': styles.buttonColor }" @click="_onClick">-->
+<			<view class="fab-circle-v" :class="{'uni-fab__plus--active': isShow && content.length > 0}"></view>
+			<view class="fab-circle-h" :class="{'uni-fab__plus--active': isShow  && content.length > 0}"></view>
+		</view>
+	</view>
+</template>
+
+<script>
+	let platform = 'other'
+	// #ifdef APP-NVUE
+	platform = uni.getSystemInfoSync().platform
+	// #endif
+
+	/**
+	 * Fab 悬浮按钮
+	 * @description 点击可展开一个图形按钮菜单
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=144
+	 * @property {Object} pattern 可选样式配置项
+	 * @property {Object} horizontal = [left | right] 水平对齐方式
+	 * 	@value left 左对齐
+	 * 	@value right 右对齐
+	 * @property {Object} vertical = [bottom | top] 垂直对齐方式
+	 * 	@value bottom 下对齐
+	 * 	@value top 上对齐
+	 * @property {Object} direction = [horizontal | vertical] 展开菜单显示方式
+	 * 	@value horizontal 水平显示
+	 * 	@value vertical 垂直显示
+	 * @property {Array} content 展开菜单内容配置项
+	 * @property {Boolean} popMenu 是否使用弹出菜单
+	 * @event {Function} trigger 展开菜单点击事件,返回点击信息
+	 * @event {Function} fabClick 悬浮按钮点击事件
+	 */
+	export default {
+		name: 'UniFab',
+		emits: ['fabClick', 'trigger'],
+		props: {
+			pattern: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+			horizontal: {
+				type: String,
+				default: 'left'
+			},
+			vertical: {
+				type: String,
+				default: 'bottom'
+			},
+			direction: {
+				type: String,
+				default: 'horizontal'
+			},
+			content: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			show: {
+				type: Boolean,
+				default: false
+			},
+			popMenu: {
+				type: Boolean,
+				default: true
+			}
+		},
+		data() {
+			return {
+				fabShow: false,
+				isShow: false,
+				isAndroidNvue: platform === 'android',
+				styles: {
+					color: '#3c3e49',
+					selectedColor: '#007AFF',
+					backgroundColor: '#fff',
+					buttonColor: '#007AFF'
+				}
+			}
+		},
+		computed: {
+			contentWidth(e) {
+				return (this.content.length + 1) * 55 + 10 + 'px'
+			},
+			contentWidthMin() {
+				return 55 + 'px'
+			},
+			// 动态计算宽度
+			boxWidth() {
+				return this.getPosition(3, 'horizontal')
+			},
+			// 动态计算高度
+			boxHeight() {
+				return this.getPosition(3, 'vertical')
+			},
+			// 计算左下位置
+			leftBottom() {
+				return this.getPosition(0, 'left', 'bottom')
+			},
+			// 计算右下位置
+			rightBottom() {
+				return this.getPosition(0, 'right', 'bottom')
+			},
+			// 计算左上位置
+			leftTop() {
+				return this.getPosition(0, 'left', 'top')
+			},
+			rightTop() {
+				return this.getPosition(0, 'right', 'top')
+			},
+			flexDirectionStart() {
+				return this.getPosition(1, 'vertical', 'top')
+			},
+			flexDirectionEnd() {
+				return this.getPosition(1, 'vertical', 'bottom')
+			},
+			horizontalLeft() {
+				return this.getPosition(2, 'horizontal', 'left')
+			},
+			horizontalRight() {
+				return this.getPosition(2, 'horizontal', 'right')
+			}
+		},
+		watch: {
+			pattern(newValue, oldValue) {
+				//console.log(JSON.stringify(newValue))
+				this.styles = Object.assign({}, this.styles, newValue)
+			}
+		},
+		created() {
+			this.isShow = this.show
+			if (this.top === 0) {
+				this.fabShow = true
+			}
+			// 初始化样式
+			this.styles = Object.assign({}, this.styles, this.pattern)
+		},
+		methods: {
+			_onClick() {
+				this.$emit('fabClick')
+				if (!this.popMenu) {
+					return
+				}
+				this.isShow = !this.isShow
+			},
+			open() {
+				this.isShow = true
+			},
+			close() {
+				this.isShow = false
+			},
+			/**
+			 * 按钮点击事件
+			 */
+			_onItemClick(index, item) {
+				this.$emit('trigger', {
+					index,
+					item
+				})
+			},
+			/**
+			 * 获取 位置信息
+			 */
+			getPosition(types, paramA, paramB) {
+				if (types === 0) {
+					return this.horizontal === paramA && this.vertical === paramB
+				} else if (types === 1) {
+					return this.direction === paramA && this.vertical === paramB
+				} else if (types === 2) {
+					return this.direction === paramA && this.horizontal === paramB
+				} else {
+					return this.isShow && this.direction === paramA ? this.contentWidth : this.contentWidthMin
+				}
+			}
+		}
+	}
+</script>
+
+<style scoped>
+	.uni-fab {
+		position: fixed;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		justify-content: center;
+		align-items: center;
+		z-index: 10;
+	}
+
+	.uni-cursor-point {
+		/* #ifdef H5 */
+		cursor: pointer;
+		/* #endif */
+	}
+
+	.uni-fab--active {
+		opacity: 1;
+	}
+
+	.uni-fab--leftBottom {
+		left: 5px;
+		bottom: 20px;
+		/* #ifdef H5 */
+		left: calc(5px + var(--window-left));
+		bottom: calc(20px + var(--window-bottom));
+		/* #endif */
+		padding: 10px;
+	}
+
+	.uni-fab--leftTop {
+		left: 5px;
+		top: 30px;
+		/* #ifdef H5 */
+		left: calc(5px + var(--window-left));
+		top: calc(30px + var(--window-top));
+		/* #endif */
+		padding: 10px;
+	}
+
+	.uni-fab--rightBottom {
+		right: 5px;
+		bottom: 20px;
+		/* #ifdef H5 */
+		right: calc(5px + var(--window-right));
+		bottom: calc(20px + var(--window-bottom));
+		/* #endif */
+		padding: 10px;
+	}
+
+	.uni-fab--rightTop {
+		right: 5px;
+		top: 30px;
+		/* #ifdef H5 */
+		right: calc(5px + var(--window-right));
+		top: calc(30px + var(--window-top));
+		/* #endif */
+		padding: 10px;
+	}
+
+	.uni-fab__circle {
+		position: fixed;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		justify-content: center;
+		align-items: center;
+		width: 55px;
+		height: 55px;
+		background-color: #3c3e49;
+		border-radius: 55px;
+		z-index: 11;
+	}
+
+	.uni-fab__circle--leftBottom {
+		left: 15px;
+		bottom: 30px;
+		/* #ifdef H5 */
+		left: calc(15px + var(--window-left));
+		bottom: calc(30px + var(--window-bottom));
+		/* #endif */
+	}
+
+	.uni-fab__circle--leftTop {
+		left: 15px;
+		top: 40px;
+		/* #ifdef H5 */
+		left: calc(15px + var(--window-left));
+		top: calc(40px + var(--window-top));
+		/* #endif */
+	}
+
+	.uni-fab__circle--rightBottom {
+		right: 15px;
+		bottom: 30px;
+		/* #ifdef H5 */
+		right: calc(15px + var(--window-right));
+		bottom: calc(30px + var(--window-bottom));
+		/* #endif */
+	}
+
+	.uni-fab__circle--rightTop {
+		right: 15px;
+		top: 40px;
+		/* #ifdef H5 */
+		right: calc(15px + var(--window-right));
+		top: calc(40px + var(--window-top));
+		/* #endif */
+	}
+
+	.uni-fab__circle--left {
+		left: 0;
+	}
+
+	.uni-fab__circle--right {
+		right: 0;
+	}
+
+	.uni-fab__circle--top {
+		top: 0;
+	}
+
+	.uni-fab__circle--bottom {
+		bottom: 0;
+	}
+
+	.uni-fab__plus {
+		font-weight: bold;
+	}
+
+	.fab-circle-v {
+		position: absolute;
+		width: 3px;
+		height: 31px;
+		left: 26px;
+		top: 12px;
+		background-color: white;
+		transform: rotate(0deg);
+		transition: transform 0.3s;
+	}
+
+	.fab-circle-h {
+		position: absolute;
+		width: 31px;
+		height: 3px;
+		left: 12px;
+		top: 26px;
+		background-color: white;
+		transform: rotate(0deg);
+		transition: transform 0.3s;
+	}
+
+	.uni-fab__plus--active {
+		transform: rotate(135deg);
+	}
+
+	.uni-fab__content {
+		/* #ifndef APP-NVUE */
+		box-sizing: border-box;
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		border-radius: 55px;
+		overflow: hidden;
+		transition-property: width, height;
+		transition-duration: 0.2s;
+		width: 55px;
+		border-color: #DDDDDD;
+		border-width: 1rpx;
+		border-style: solid;
+	}
+
+	.uni-fab__content--other-platform {
+		border-width: 0px;
+		box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.2);
+	}
+
+	.uni-fab__content--left {
+		justify-content: flex-start;
+	}
+
+	.uni-fab__content--right {
+		justify-content: flex-end;
+	}
+
+	.uni-fab__content--flexDirection {
+		flex-direction: column;
+		justify-content: flex-end;
+	}
+
+	.uni-fab__content--flexDirectionStart {
+		flex-direction: column;
+		justify-content: flex-start;
+	}
+
+	.uni-fab__content--flexDirectionEnd {
+		flex-direction: column;
+		justify-content: flex-end;
+	}
+
+	.uni-fab__item {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+		width: 55px;
+		height: 55px;
+		opacity: 0;
+		transition: opacity 0.2s;
+	}
+
+	.uni-fab__item--active {
+		opacity: 1;
+	}
+
+	.uni-fab__item-image {
+		width: 25px;
+		height: 25px;
+		margin-bottom: 3px;
+	}
+
+	.uni-fab__item-text {
+		color: #FFFFFF;
+		font-size: 12px;
+	}
+
+	.uni-fab__item--first {
+		width: 55px;
+	}
+</style>

+ 382 - 0
components/uni-fab/uni-fab.vue.bak

@@ -0,0 +1,382 @@
+<template>
+	<view>
+		<view :class="{
+        leftBottom: leftBottom,
+        rightBottom: rightBottom,
+        leftTop: leftTop,
+        rightTop: rightTop
+      }" v-if="leftBottom||rightBottom||leftTop||rightTop" class="fab-box fab">
+			<view :class="{
+          left: horizontal === 'left' && direction === 'horizontal',
+          top: vertical === 'top' && direction === 'vertical',
+          bottom: vertical === 'bottom' && direction === 'vertical',
+          right: horizontal === 'right' && direction === 'horizontal'
+        }" :style="{ 'background-color': styles.buttonColor }" class="fab-circle" @click="_onClick">
+				<view class="fab-circle-box" :class="{ active: isShow }">
+					<view class="fab-circle-v"></view>
+					<view class="fab-circle-h"></view>
+				</view>
+			</view>
+			<view :class="{
+          left: horizontal === 'left',
+          right: horizontal === 'right',
+          flexDirection: direction === 'vertical',
+          flexDirectionStart: flexDirectionStart,
+          flexDirectionEnd: flexDirectionEnd
+        }" :style="{ width: boxWidth, height: boxHeight, background: styles.backgroundColor }" class="fab-content">
+				<view v-if="flexDirectionStart || horizontalLeft" class="fab-item first" />
+				<view v-for="(item, index) in content" :key="index" :class="{ active: isShow }" :style="{
+            color: item.active ? styles.selectedColor : styles.color
+          }" class="fab-item" @click="_onItemClick(index, item)">
+					<image :src="item.active ? item.selectedIconPath : item.iconPath" class="content-image" mode="widthFix" />
+					<text class="text">{{ item.text }}</text>
+				</view>
+				<view v-if="flexDirectionEnd || horizontalRight" class="fab-item first" />
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import uniIcons from "../uni-icons/uni-icons.vue";
+	export default {
+		name: 'UniFab',
+		components: {
+			uniIcons
+		},
+		props: {
+			pattern: {
+				type: Object,
+				default () {
+					return {}
+				}
+			},
+			horizontal: {
+				type: String,
+				default: 'left'
+			},
+			vertical: {
+				type: String,
+				default: 'bottom'
+			},
+			direction: {
+				type: String,
+				default: 'horizontal'
+			},
+			content: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			show: {
+				type: Boolean,
+				default: false
+			}
+		},
+		data() {
+			return {
+				fabShow: false,
+				flug: true,
+				isShow: false,
+				styles: {
+					color: '#3c3e49',
+					selectedColor: '#007AFF',
+					backgroundColor: '#fff',
+					buttonColor: '#3c3e49'
+				}
+			}
+		},
+		computed: {
+			contentWidth(e) {
+				return uni.upx2px((this.content.length + 1) * 110 + 20) + 'px'
+			},
+			contentWidthMin() {
+				return uni.upx2px(110) + 'px'
+			},
+			// 动态计算宽度
+			boxWidth() {
+				return this.getPosition(3, 'horizontal')
+			},
+			// 动态计算高度
+			boxHeight() {
+				return this.getPosition(3, 'vertical')
+			},
+			// 计算左下位置
+			leftBottom() {
+				return this.getPosition(0, 'left', 'bottom')
+			},
+			// 计算右下位置
+			rightBottom() {
+				return this.getPosition(0, 'right', 'bottom')
+			},
+			// 计算左上位置
+			leftTop() {
+				return this.getPosition(0, 'left', 'top')
+			},
+			rightTop() {
+				return this.getPosition(0, 'right', 'top')
+			},
+			flexDirectionStart() {
+				return this.getPosition(1, 'vertical', 'top')
+			},
+			flexDirectionEnd() {
+				return this.getPosition(1, 'vertical', 'bottom')
+			},
+			horizontalLeft() {
+				return this.getPosition(2, 'horizontal', 'left')
+			},
+			horizontalRight() {
+				return this.getPosition(2, 'horizontal', 'right')
+			}
+		},
+		watch: {
+			pattern(newValue, oldValue) {
+				//console.log(JSON.stringify(newValue))
+				this.styles = Object.assign({}, this.styles, newValue)
+			}
+		},
+		created() {
+			this.isShow = this.show
+			if (this.top === 0) {
+				this.fabShow = true
+			}
+			// 初始化样式
+			this.styles = Object.assign({}, this.styles, this.pattern)
+		},
+		methods: {
+			_onClick() {
+				this.isShow = !this.isShow
+			},
+			open() {
+				this.isShow = true
+			},
+			close() {
+				this.isShow = false
+			},
+			/**
+			 * 按钮点击事件
+			 */
+			_onItemClick(index, item) {
+				this.$emit('trigger', {
+					index,
+					item
+				})
+			},
+			/**
+			 * 获取 位置信息
+			 */
+			getPosition(types, paramA, paramB) {
+				if (types === 0) {
+					return this.horizontal === paramA && this.vertical === paramB
+				} else if (types === 1) {
+					return this.direction === paramA && this.vertical === paramB
+				} else if (types === 2) {
+					return this.direction === paramA && this.horizontal === paramB
+				} else {
+					return this.isShow && this.direction === paramA ? this.contentWidth : this.contentWidthMin
+				}
+			}
+		}
+	}
+</script>
+
+<style scoped>
+	.uni-icon {
+		font-family: uniicons;
+		font-size: 30px;
+		font-weight: normal;
+		font-style: normal;
+		line-height: 1;
+		display: inline-block;
+		text-decoration: none;
+		-webkit-font-smoothing: antialiased;
+	}
+
+	.fab-box {
+		position: fixed;
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		z-index: 2;
+	}
+
+	.fab-box.top {
+		width: 60rpx;
+		height: 60rpx;
+		right: 30rpx;
+		bottom: 60rpx;
+		border: 1px #5989b9 solid;
+		background: #6699cc;
+		border-radius: 10rpx;
+		color: #fff;
+		transition: all 0.3;
+		opacity: 0;
+	}
+
+	.fab-box.active {
+		opacity: 1;
+	}
+
+	.fab-box.fab {
+		z-index: 10;
+	}
+
+	.fab-box.fab.leftBottom {
+		left: 30rpx;
+		bottom: 60rpx;
+	}
+
+	.fab-box.fab.leftTop {
+		left: 30rpx;
+		top: 80rpx;
+		/* #ifdef H5 */
+		top: calc(80rpx + var(--window-top));
+		/* #endif */
+	}
+
+	.fab-box.fab.rightBottom {
+		right: 30rpx;
+		bottom: 60rpx;
+	}
+
+	.fab-box.fab.rightTop {
+		right: 30rpx;
+		top: 80rpx;
+		/* #ifdef H5 */
+		top: calc(80rpx + var(--window-top));
+		/* #endif */
+	}
+
+	.fab-circle {
+		display: flex;
+		justify-content: center;
+		align-items: center;
+		position: absolute;
+		width: 110rpx;
+		height: 110rpx;
+		background: #3c3e49;
+		/* background: #5989b9; */
+		border-radius: 50%;
+		box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.2);
+		z-index: 11;
+	}
+
+	.fab-circle-box {
+		position: absolute;
+		left: 0;
+		top: 0;
+		right: 0;
+		bottom: 0;
+		transition: all 0.3s;
+	}
+
+	.fab-circle-v {
+		position: absolute;
+		width: 8rpx;
+		height: 60rpx;
+		left: 50%;
+		top: 50%;
+		margin: -30rpx 0 0 -4rpx;
+		background-color: white;
+	}
+
+	.fab-circle-h {
+		position: absolute;
+		width: 60rpx;
+		height: 8rpx;
+		left: 50%;
+		top: 50%;
+		margin: -4rpx 0 0 -30rpx;
+		background-color: white;
+	}
+
+	.fab-circle.left {
+		left: 0;
+	}
+
+	.fab-circle.right {
+		right: 0;
+	}
+
+	.fab-circle.top {
+		top: 0;
+	}
+
+	.fab-circle.bottom {
+		bottom: 0;
+	}
+
+	.fab-circle .uni-icon-plusempty {
+		color: #ffffff;
+		font-size: 80rpx;
+		transition: all 0.3s;
+		font-weight: bold;
+	}
+
+	.fab-circle-box.active {
+		transform: rotate(135deg);
+		font-size: 80rpx;
+	}
+
+	.fab-content {
+		background: #6699cc;
+		box-sizing: border-box;
+		display: flex;
+		border-radius: 100rpx;
+		overflow: hidden;
+		box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.1);
+		transition: all 0.2s;
+		width: 110rpx;
+	}
+
+	.fab-content.left {
+		justify-content: flex-start;
+	}
+
+	.fab-content.right {
+		justify-content: flex-end;
+	}
+
+	.fab-content.flexDirection {
+		flex-direction: column;
+		justify-content: flex-end;
+	}
+
+	.fab-content.flexDirectionStart {
+		flex-direction: column;
+		justify-content: flex-start;
+	}
+
+	.fab-content.flexDirectionEnd {
+		flex-direction: column;
+		justify-content: flex-end;
+	}
+
+	.fab-content .fab-item {
+		display: flex;
+		flex-direction: column;
+		justify-content: center;
+		align-items: center;
+		width: 110rpx;
+		height: 110rpx;
+		font-size: 24rpx;
+		color: #fff;
+		opacity: 0;
+		transition: opacity 0.2s;
+	}
+
+	.fab-content .fab-item.active {
+		opacity: 1;
+	}
+
+	.fab-content .fab-item .content-image {
+		width: 50rpx;
+		height: 50rpx;
+		margin-bottom: 5rpx;
+	}
+
+	.fab-content .fab-item.first {
+		width: 110rpx;
+	}
+</style>

+ 132 - 0
components/uni-icons/icons.js

@@ -0,0 +1,132 @@
+export default {
+	"pulldown": "\ue588",
+	"refreshempty": "\ue461",
+	"back": "\ue471",
+	"forward": "\ue470",
+	"more": "\ue507",
+	"more-filled": "\ue537",
+	"scan": "\ue612",
+	"qq": "\ue264",
+	"weibo": "\ue260",
+	"weixin": "\ue261",
+	"pengyouquan": "\ue262",
+	"loop": "\ue565",
+	"refresh": "\ue407",
+	"refresh-filled": "\ue437",
+	"arrowthindown": "\ue585",
+	"arrowthinleft": "\ue586",
+	"arrowthinright": "\ue587",
+	"arrowthinup": "\ue584",
+	"undo-filled": "\ue7d6",
+	"undo": "\ue406",
+	"redo": "\ue405",
+	"redo-filled": "\ue7d9",
+	"bars": "\ue563",
+	"chatboxes": "\ue203",
+	"camera": "\ue301",
+	"chatboxes-filled": "\ue233",
+	"camera-filled": "\ue7ef",
+	"cart-filled": "\ue7f4",
+	"cart": "\ue7f5",
+	"checkbox-filled": "\ue442",
+	"checkbox": "\ue7fa",
+	"arrowleft": "\ue582",
+	"arrowdown": "\ue581",
+	"arrowright": "\ue583",
+	"smallcircle-filled": "\ue801",
+	"arrowup": "\ue580",
+	"circle": "\ue411",
+	"eye-filled": "\ue568",
+	"eye-slash-filled": "\ue822",
+	"eye-slash": "\ue823",
+	"eye": "\ue824",
+	"flag-filled": "\ue825",
+	"flag": "\ue508",
+	"gear-filled": "\ue532",
+	"reload": "\ue462",
+	"gear": "\ue502",
+	"hand-thumbsdown-filled": "\ue83b",
+	"hand-thumbsdown": "\ue83c",
+	"hand-thumbsup-filled": "\ue83d",
+	"heart-filled": "\ue83e",
+	"hand-thumbsup": "\ue83f",
+	"heart": "\ue840",
+	"home": "\ue500",
+	"info": "\ue504",
+	"home-filled": "\ue530",
+	"info-filled": "\ue534",
+	"circle-filled": "\ue441",
+	"chat-filled": "\ue847",
+	"chat": "\ue263",
+	"mail-open-filled": "\ue84d",
+	"email-filled": "\ue231",
+	"mail-open": "\ue84e",
+	"email": "\ue201",
+	"checkmarkempty": "\ue472",
+	"list": "\ue562",
+	"locked-filled": "\ue856",
+	"locked": "\ue506",
+	"map-filled": "\ue85c",
+	"map-pin": "\ue85e",
+	"map-pin-ellipse": "\ue864",
+	"map": "\ue364",
+	"minus-filled": "\ue440",
+	"mic-filled": "\ue332",
+	"minus": "\ue410",
+	"micoff": "\ue360",
+	"mic": "\ue302",
+	"clear": "\ue434",
+	"smallcircle": "\ue868",
+	"close": "\ue404",
+	"closeempty": "\ue460",
+	"paperclip": "\ue567",
+	"paperplane": "\ue503",
+	"paperplane-filled": "\ue86e",
+	"person-filled": "\ue131",
+	"contact-filled": "\ue130",
+	"person": "\ue101",
+	"contact": "\ue100",
+	"images-filled": "\ue87a",
+	"phone": "\ue200",
+	"images": "\ue87b",
+	"image": "\ue363",
+	"image-filled": "\ue877",
+	"location-filled": "\ue333",
+	"location": "\ue303",
+	"plus-filled": "\ue439",
+	"plus": "\ue409",
+	"plusempty": "\ue468",
+	"help-filled": "\ue535",
+	"help": "\ue505",
+	"navigate-filled": "\ue884",
+	"navigate": "\ue501",
+	"mic-slash-filled": "\ue892",
+	"search": "\ue466",
+	"settings": "\ue560",
+	"sound": "\ue590",
+	"sound-filled": "\ue8a1",
+	"spinner-cycle": "\ue465",
+	"download-filled": "\ue8a4",
+	"personadd-filled": "\ue132",
+	"videocam-filled": "\ue8af",
+	"personadd": "\ue102",
+	"upload": "\ue402",
+	"upload-filled": "\ue8b1",
+	"starhalf": "\ue463",
+	"star-filled": "\ue438",
+	"star": "\ue408",
+	"trash": "\ue401",
+	"phone-filled": "\ue230",
+	"compose": "\ue400",
+	"videocam": "\ue300",
+	"trash-filled": "\ue8dc",
+	"download": "\ue403",
+	"chatbubble-filled": "\ue232",
+	"chatbubble": "\ue202",
+	"cloud-download": "\ue8e4",
+	"cloud-upload-filled": "\ue8e5",
+	"cloud-upload": "\ue8e6",
+	"cloud-download-filled": "\ue8e9",
+	"headphones":"\ue8bf",
+	"shop":"\ue609"
+}

Diff do ficheiro suprimidas por serem muito extensas
+ 10 - 0
components/uni-icons/uni-icons.vue


BIN
components/uni-icons/uni.ttf


+ 256 - 0
components/uni-id-combox/uni-id-combox.vue

@@ -0,0 +1,256 @@
+<template>
+	<view class="uni-id-combox">
+		<!--<view v-if="label" class="uni-id-combox__label" :style="labelStyle">
+			<text>{{label}}</text>
+		</view>-->
+		<view class="uni-id-combox__input-box">
+			<label class="uni-id-combox__input" @click="toggleSelector">{{inputVal}}</label>
+<!--			<input class="uni-id-combox__input" type="text" disabled="true"   :placeholder="placeholder" v-model="inputVal" @input="onInput"/>-->
+<!--			 @focus="onFocus" @blur="onBlur" />-->
+			 <label class="iconfont icon-triangle-down " style="color: grey;" @click="toggleSelector"></label>
+<!--			<uni-icons class="uni-id-combox__input-arrow" type="arrowdown" size="14" @click="toggleSelector"></uni-icons>-->
+			<view class="uni-id-combox__selector" v-if="showSelector">
+				<scroll-view scroll-y="true" class="uni-id-combox__selector-scroll">
+
+					<view class="uni-id-combox__selector-empty" v-if="filterCandidatesLength === 0">
+						<label>{{emptyTips}}</label>
+					</view>
+<!--					<view class="uni-id-combox__selector-item" v-for="(item,index) in filterCandidates" :key="index" @click="onSelectorClick(index)">-->
+					<view class="uni-id-combox__selector-item" v-for="(item,index) in candidates" :key="index" @click="onSelectorClick(index)">
+						<label>{{item.value}}</label>
+<!--						<text>{{item.value}}</text>-->
+					</view>
+				</scroll-view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	/**
+	 * Combox 组合输入框
+	 * @description 组合输入框一般用于既可以输入也可以选择的场景
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=1261
+	 * @property {String} label 左侧文字
+	 * @property {String} labelWidth 左侧内容宽度
+	 * @property {String} placeholder 输入框占位符
+	 * @property {Array} candidates 候选项列表
+	 * @property {String} emptyTips 筛选结果为空时显示的文字
+	 * @property {String} value 组合框的值
+	 */
+	export default {
+		name: 'uniIdCombox',
+		emits:['input','update:modelValue'],
+		props: {
+			label: {
+				type: String,
+				default: ''
+			},
+			labelWidth: {
+				type: String,
+				default: 'auto'
+			},
+			placeholder: {
+				type: String,
+				default: ''
+			},
+			candidates: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			emptyTips: {
+				type: String,
+				default: '无匹配项'
+			},
+			// #ifndef VUE3
+			value: {
+				type: [String, Number],
+				default: ''
+			},
+			// #endif
+			// #ifdef VUE3
+			modelValue: {
+				type: [String, Number],
+				default: ''
+			},
+			// #endif
+		},
+		data() {
+			return {
+				showSelector: false,
+				inputVal: '',
+				id:'',
+			}
+		},
+		computed: {
+			labelStyle() {
+				if (this.labelWidth === 'auto') {
+					return {}
+				}
+				return {
+					width: this.labelWidth
+				}
+			},
+			filterCandidates() {
+				return this.candidates.filter((item) => {
+					let ret = item.value.toString().indexOf(this.inputVal) > -1;
+					//console.log('value:' +item.value + ' ret:' + ret);
+					return ret
+				})
+			},
+			filterCandidatesLength() {
+				return this.filterCandidates.length
+			}
+		},
+		watch: {
+			// #ifndef VUE3
+			value: {
+				handler(newVal) {
+					this.inputVal = newVal
+				},
+				immediate: true
+			},
+			// #endif
+			// #ifdef VUE3
+			modelValue: {
+				handler(newVal) {
+					this.inputVal = newVal
+				},
+				immediate: true
+			},
+			// #endif
+		},
+		methods: {
+			toggleSelector() {
+				this.showSelector = !this.showSelector
+			},
+			onFocus() {
+				this.showSelector = true
+			},
+			onBlur() {
+				setTimeout(() => {
+					this.showSelector = false
+				}, 153)
+			},
+			onSelectorClick(index) {
+				this.inputVal = this.candidates[index].value;
+				this.id = this.candidates[index].id;
+				//this.filterCandidates[index].value
+				this.showSelector = false
+				this.$emit('input', this.inputVal)
+				this.$emit('update:modelValue', {id:this.id,value:this.inputVal})
+			},
+			onInput() {
+				
+				setTimeout(() => {
+					this.$emit('input', this.inputVal)
+					this.$emit('update:modelValue', this.inputVal)
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import url("/static/font/iconfont.css");
+	.uni-id-combox {
+		///* #ifndef APP-NVUE */
+		display: flex;
+		///* #endif */
+		height: 80rpx;
+		flex-direction: row;
+		align-items: center;
+		// border-bottom: solid 1px #DDDDDD;
+	}
+
+	.uni-id-combox__label {
+		font-size: 32rpx;
+		line-height: 44rpx;
+		padding-right: 20rpx;
+		color: #999999;
+	}
+
+	.uni-id-combox__input-box {
+		position: relative;
+		///* #ifndef APP-NVUE */
+		display: flex;
+		////* #endif */
+		//flex: 1;
+		flex-direction: row;
+		align-items: center;
+		justify-content: center;
+		width:100%
+		//background-color: #007AFF;
+	}
+
+	.uni-id-combox__input {
+		//flex: 1;		
+		font-size: 32rpx;
+		height: 44rpx;
+		line-height: 44rpx;
+		//justify-content: flex-end;
+	}
+
+	.uni-id-combox__input-arrow {
+		padding: 10rpx;
+	}
+
+	.uni-id-combox__selector {
+		///* #ifndef APP-NVUE */
+		box-sizing: border-box;
+		///* #endif */
+		position: absolute;
+		top: 42rpx;
+		left: 0;
+		width: 100%;
+		background-color: #FFFFFF;
+		border-radius: 6rpx;
+		box-shadow: #DDDDDD 4rpx 4rpx 8rpx, #DDDDDD -4rpx -4rpx 8rpx;
+		z-index: 2;
+	}
+
+	.uni-id-combox__selector-scroll {
+		///* #ifndef APP-NVUE */
+		max-height: 800rpx;
+		box-sizing: border-box;
+		///* #endif */
+	}
+
+	.uni-id-combox__selector::before {
+		///* #ifndef APP-NVUE */
+		content: '';
+		///* #endif */
+		position: absolute;
+		width: 0;
+		height: 0;
+		border-bottom: solid 6rpx #FFFFFF;
+		border-right: solid 6rpx transparent;
+		border-left: solid 6rpx transparent;
+		left: 50%;
+		top: -6rpx;
+		margin-left: -6rpx;
+	}
+
+	.uni-id-combox__selector-empty,
+	.uni-id-combox__selector-item {
+		///* #ifndef APP-NVUE */
+		display: flex;
+		cursor: pointer;
+		///* #endif */
+		line-height: 72rpx;
+		font-size: 28rpx;
+		text-align: center;
+		border-bottom: solid 1rpx #DDDDDD;
+		margin: 0px 20rpx; 
+		justify-content: center;
+	}
+
+	.uni-id-combox__selector-empty:last-child,
+	.uni-id-combox__selector-item:last-child {
+		///* #ifndef APP-NVUE */
+		border-bottom: none;
+		///* #endif */
+	}
+</style>

+ 443 - 0
components/uni-list-item/uni-list-item.vue

@@ -0,0 +1,443 @@
+<template>
+	<!-- #ifdef APP-NVUE -->
+	<cell>
+		<!-- #endif -->
+
+		<view :class="{ 'uni-list-item--disabled': disabled }" :hover-class="(!clickable && !link) || disabled || showSwitch ? '' : 'uni-list-item--hover'" class="uni-list-item" @click="onClick">
+			<view v-if="!isFirstChild" class="border--left" :class="{ 'uni-list--border': border }"></view>
+			<view class="uni-list-item__container" :class="{ 'container--right': showArrow || link, 'flex--direction': direction === 'column' }">
+				<slot name="header">
+					<view class="uni-list-item__header">
+						<view v-if="thumb" class="uni-list-item__icon">
+							<image :src="thumb" class="uni-list-item__icon-img" :class="['uni-list--' + thumbSize]" />
+						</view>
+						<view v-else-if="showExtraIcon" class="uni-list-item__icon">
+							<uni-icons :color="extraIcon.color" :size="extraIcon.size" :type="extraIcon.type" />
+						</view>
+					</view>
+				</slot>
+				<slot name="body">
+					<view class="uni-list-item__content" :class="{ 'uni-list-item__content--center': thumb || showExtraIcon || showBadge || showSwitch }">
+						<text v-if="title" class="uni-list-item__content-title" :class="[ellipsis !== 0 && ellipsis <= 2 ? 'uni-ellipsis-' + ellipsis : '']">{{ title }}</text>
+						<text v-if="note" class="uni-list-item__content-note">{{ note }}</text>
+					</view>
+				</slot>
+				<slot name="footer">
+					<view v-if="rightText || showBadge || showSwitch" class="uni-list-item__extra" :class="{ 'flex--justify': direction === 'column' }">
+						<text v-if="rightText" class="uni-list-item__extra-text">{{ rightText }}</text>
+						<uni-badge v-if="showBadge" :type="badgeType" :text="badgeText" />
+						<switch v-if="showSwitch" :disabled="disabled" :checked="switchChecked" @change="onSwitchChange" />
+					</view>
+				</slot>
+			</view>
+			<uni-icons v-if="showArrow || link" :size="16" class="uni-icon-wrapper" color="#bbb" type="arrowright" />
+		</view>
+		<!-- #ifdef APP-NVUE -->
+	</cell>
+	<!-- #endif -->
+</template>
+
+<script>
+	/**
+	 * ListItem 列表子组件
+	 * @description 列表子组件
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=24
+	 * @property {String} 	title 							标题
+	 * @property {String} 	note 							描述
+	 * @property {String} 	thumb 							左侧缩略图,若thumb有值,则不会显示扩展图标
+	 * @property {String}  	thumbSize = [lg|base|sm]		略缩图大小
+	 * 	@value 	 lg			大图
+	 * 	@value 	 base		一般
+	 * 	@value 	 sm			小图
+	 * @property {String} 	badgeText						数字角标内容
+	 * @property {String} 	badgeType 						数字角标类型,参考[uni-icons](https://ext.dcloud.net.cn/plugin?id=21)
+	 * @property {String} 	rightText 						右侧文字内容
+	 * @property {Boolean} 	disabled = [true|false]			是否禁用
+	 * @property {Boolean} 	clickable = [true|false] 		是否开启点击反馈
+	 * @property {String} 	link = [navigateTo|redirectTo|reLaunch|switchTab] 是否展示右侧箭头并开启点击反馈
+	 *  @value 	navigateTo 	同 uni.navigateTo()
+	 * 	@value redirectTo 	同 uni.redirectTo()
+	 * 	@value reLaunch   	同 uni.reLaunch()
+	 * 	@value switchTab  	同 uni.switchTab()
+	 * @property {String | PageURIString} 	to  			跳转目标页面
+	 * @property {Boolean} 	showBadge = [true|false] 		是否显示数字角标
+	 * @property {Boolean} 	showSwitch = [true|false] 		是否显示Switch
+	 * @property {Boolean} 	switchChecked = [true|false] 	Switch是否被选中
+	 * @property {Boolean} 	showExtraIcon = [true|false] 	左侧是否显示扩展图标
+	 * @property {Object} 	extraIcon 						扩展图标参数,格式为 {color: '#4cd964',size: '22',type: 'spinner'}
+	 * @property {String} 	direction = [row|column]		排版方向
+	 * @value row 			水平排列
+	 * @value column 		垂直排列
+	 * @event {Function} 	click 							点击 uniListItem 触发事件
+	 * @event {Function} 	switchChange 					点击切换 Switch 时触发
+	 */
+	export default {
+		name: 'UniListItem',
+		emits: ['click', 'switchChange'],
+		props: {
+			direction: {
+				type: String,
+				default: 'row'
+			},
+			title: {
+				type: String,
+				default: ''
+			},
+			note: {
+				type: String,
+				default: ''
+			},
+			ellipsis: {
+				type: [Number],
+				default: 0
+			},
+			disabled: {
+				type: [Boolean, String],
+				default: false
+			},
+			clickable: {
+				type: Boolean,
+				default: false
+			},
+			showArrow: {
+				type: [Boolean, String],
+				default: false
+			},
+			link: {
+				type: [Boolean, String],
+				default: false
+			},
+			to: {
+				type: String,
+				default: ''
+			},
+			showBadge: {
+				type: [Boolean, String],
+				default: false
+			},
+			showSwitch: {
+				type: [Boolean, String],
+				default: false
+			},
+			switchChecked: {
+				type: [Boolean, String],
+				default: false
+			},
+			badgeText: {
+				type: String,
+				default: ''
+			},
+			badgeType: {
+				type: String,
+				default: 'success'
+			},
+			rightText: {
+				type: String,
+				default: ''
+			},
+			thumb: {
+				type: String,
+				default: ''
+			},
+			thumbSize: {
+				type: String,
+				default: 'base'
+			},
+			showExtraIcon: {
+				type: [Boolean, String],
+				default: false
+			},
+			extraIcon: {
+				type: Object,
+				default () {
+					return {
+						type: 'contact',
+						color: '#000000',
+						size: 20
+					};
+				}
+			},
+			border: {
+				type: Boolean,
+				default: true
+			}
+		},
+		// inject: ['list'],
+		data() {
+			return {
+				isFirstChild: false
+			};
+		},
+		mounted() {
+			this.list = this.getForm()
+			// 判断是否存在 uni-list 组件
+			if (this.list) {
+				if (!this.list.firstChildAppend) {
+					this.list.firstChildAppend = true;
+					this.isFirstChild = true;
+				}
+			}
+		},
+		methods: {
+			/**
+			 * 获取父元素实例
+			 */
+			getForm(name = 'uniList') {
+				let parent = this.$parent;
+				let parentName = parent.$options.name;
+				while (parentName !== name) {
+					parent = parent.$parent;
+					if (!parent) return false
+					parentName = parent.$options.name;
+				}
+				return parent;
+			},
+			onClick() {
+				if (this.to !== '') {
+					this.openPage();
+					return;
+				}
+				if (this.clickable || this.link) {
+					this.$emit('click', {
+						data: {}
+					});
+				}
+			},
+			onSwitchChange(e) {
+				this.$emit('switchChange', e.detail);
+			},
+			openPage() {
+				if (['navigateTo', 'redirectTo', 'reLaunch', 'switchTab'].indexOf(this.link) !== -1) {
+					this.pageApi(this.link);
+				} else {
+					this.pageApi('navigateTo');
+				}
+			},
+			pageApi(api) {
+				let callback = {
+					url: this.to,
+					success: res => {
+						this.$emit('click', {
+							data: res
+						});
+					},
+					fail: err => {
+						this.$emit('click', {
+							data: err
+						});
+					}
+				}
+				switch (api) {
+					case 'navigateTo':
+						uni.navigateTo(callback)
+						break
+					case 'redirectTo':
+						uni.redirectTo(callback)
+						break
+					case 'reLaunch':
+						uni.reLaunch(callback)
+						break
+					case 'switchTab':
+						uni.switchTab(callback)
+						break
+					default:
+						uni.navigateTo(callback)
+				}
+			}
+		}
+	};
+</script>
+
+<style scoped>
+	.uni-list-item {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		font-size: 16px;
+		position: relative;
+		justify-content: space-between;
+		align-items: center;
+		background-color: #fff;
+		flex-direction: row;
+		/* #ifdef H5 */
+		cursor: pointer;
+		/* #endif */
+	}
+
+	.uni-list-item--disabled {
+		opacity: 0.3;
+	}
+
+	.uni-list-item--hover {
+		background-color: #f1f1f1;
+	}
+
+	.uni-list-item__container {
+		position: relative;
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		padding: 12px 15px;
+		padding-left: 15px;
+		flex: 1;
+		overflow: hidden;
+	}
+
+	.container--right {
+		padding-right: 0;
+	}
+
+	.uni-list--border {
+		position: absolute;
+		top: 0;
+		right: 0;
+		left: 0;
+		/* #ifdef APP-NVUE */
+		border-top-color: #e5e5e5;
+		border-top-style: solid;
+		border-top-width: 0.5px;
+		/* #endif */
+	}
+
+	/* #ifndef APP-NVUE */
+	.uni-list--border:after {
+		position: absolute;
+		top: 0;
+		right: 0;
+		left: 0;
+		height: 1px;
+		content: "";
+		-webkit-transform: scaleY(0.5);
+		transform: scaleY(0.5);
+		background-color: #e5e5e5;
+	}
+
+	/* #endif */
+	.uni-list-item__content {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		padding-right: 8px;
+		flex: 1;
+		color: #3b4144;
+		flex-direction: column;
+		justify-content: space-between;
+		overflow: hidden;
+	}
+
+	.uni-list-item__content--center {
+		justify-content: center;
+	}
+
+	.uni-list-item__content-title {
+		font-size: 14px;
+		color: #3b4144;
+		overflow: hidden;
+	}
+
+	.uni-list-item__content-note {
+		margin-top: 6rpx;
+		color: #999;
+		font-size: 12px;
+		overflow: hidden;
+	}
+
+	.uni-list-item__extra {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		justify-content: flex-end;
+		align-items: center;
+	}
+
+	.uni-list-item__header {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+	}
+
+	.uni-list-item__icon {
+		margin-right: 18rpx;
+		flex-direction: row;
+		justify-content: center;
+		align-items: center;
+	}
+
+	.uni-list-item__icon-img {
+		/* #ifndef APP-NVUE */
+		display: block;
+		/* #endif */
+		height: 26px;
+		width: 26px;
+		margin-right: 10px;
+	}
+
+	.uni-icon-wrapper {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		align-items: center;
+		padding: 0 10px;
+	}
+
+	.flex--direction {
+		flex-direction: column;
+		/* #ifndef APP-NVUE */
+		align-items: initial;
+		/* #endif */
+	}
+
+	.flex--justify {
+		/* #ifndef APP-NVUE */
+		justify-content: initial;
+		/* #endif */
+	}
+
+	.uni-list--lg {
+		height: 40px;
+		width: 40px;
+	}
+
+	.uni-list--base {
+		height: 26px;
+		width: 26px;
+	}
+
+	.uni-list--sm {
+		height: 20px;
+		width: 20px;
+	}
+
+	.uni-list-item__extra-text {
+		color: #999;
+		font-size: 12px;
+	}
+
+	.uni-ellipsis-1 {
+		/* #ifndef APP-NVUE */
+		overflow: hidden;
+		white-space: nowrap;
+		text-overflow: ellipsis;
+		/* #endif */
+		/* #ifdef APP-NVUE */
+		lines: 1;
+		/* #endif */
+	}
+
+	.uni-ellipsis-2 {
+		/* #ifndef APP-NVUE */
+		overflow: hidden;
+		text-overflow: ellipsis;
+		display: -webkit-box;
+		-webkit-line-clamp: 2;
+		-webkit-box-orient: vertical;
+		/* #endif */
+		/* #ifdef APP-NVUE */
+		lines: 2;
+		/* #endif */
+	}
+</style>

+ 107 - 0
components/uni-list/uni-list.vue

@@ -0,0 +1,107 @@
+<template>
+	<!-- #ifndef APP-NVUE -->
+	<view class="uni-list uni-border-top-bottom">
+		<view v-if="border" class="uni-list--border-top"></view>
+		<slot />
+		<view v-if="border" class="uni-list--border-bottom"></view>
+	</view>
+	<!-- #endif -->
+	<!-- #ifdef APP-NVUE -->
+	<list class="uni-list" :class="{ 'uni-list--border': border }" :enableBackToTop="enableBackToTop" loadmoreoffset="15">
+		<slot />
+	</list>
+	<!-- #endif -->
+</template>
+
+<script>
+	/**
+	 * List 列表
+	 * @description 列表组件
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=24
+	 * @property {String} 	border = [true|false] 		标题
+	 */
+	export default {
+		name: 'uniList',
+		'mp-weixin': {
+			options: {
+				multipleSlots: false
+			}
+		},
+		props: {
+			enableBackToTop: {
+				type: [Boolean, String],
+				default: false
+			},
+			scrollY: {
+				type: [Boolean, String],
+				default: false
+			},
+			border: {
+				type: Boolean,
+				default: true
+			}
+		},
+		// provide() {
+		// 	return {
+		// 		list: this
+		// 	};
+		// },
+		created() {
+			this.firstChildAppend = false;
+		},
+		methods: {
+			loadMore(e) {
+				this.$emit('scrolltolower');
+			}
+		}
+	};
+</script>
+<style scoped>
+	.uni-list {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		background-color: #ffffff;
+		position: relative;
+		flex-direction: column;
+	}
+
+	.uni-list--border {
+		position: relative;
+		/* #ifdef APP-NVUE */
+		border-top-color: #e5e5e5;
+		border-top-style: solid;
+		border-top-width: 0.5px;
+		border-bottom-color: #e5e5e5;
+		border-bottom-style: solid;
+		border-bottom-width: 0.5px;
+		/* #endif */
+		z-index: -1;
+	}
+
+	/* #ifndef APP-NVUE */
+	.uni-list--border-top {
+		position: absolute;
+		top: 0;
+		right: 0;
+		left: 0;
+		height: 1px;
+		-webkit-transform: scaleY(0.5);
+		transform: scaleY(0.5);
+		background-color: #e5e5e5;
+		z-index: 1;
+	}
+
+	.uni-list--border-bottom {
+		position: absolute;
+		bottom: 0;
+		right: 0;
+		left: 0;
+		height: 1px;
+		-webkit-transform: scaleY(0.5);
+		transform: scaleY(0.5);
+		background-color: #e5e5e5;
+	}
+
+	/* #endif */
+</style>

+ 65 - 0
components/uni-list/uni-refresh.vue

@@ -0,0 +1,65 @@
+<template>
+	<!-- #ifdef APP-NVUE -->
+	<refresh :display="display" @refresh="onrefresh" @pullingdown="onpullingdown">
+		<slot />
+	</refresh>
+	<!-- #endif -->
+	<!-- #ifndef APP-NVUE -->
+	<view ref="uni-refresh" class="uni-refresh" v-show="isShow">
+		<slot />
+	</view>
+	<!-- #endif -->
+</template>
+
+<script>
+	export default {
+		name: 'UniRefresh',
+		props: {
+			display: {
+				type: [String],
+				default: "hide"
+			}
+		},
+		data() {
+			return {
+				pulling: false
+			}
+		},
+		computed: {
+			isShow() {
+				if (this.display === "show" || this.pulling === true) {
+					return true;
+				}
+				return false;
+			}
+		},
+		created() {},
+		methods: {
+			onchange(value) {
+				this.pulling = value;
+			},
+			onrefresh(e) {
+				this.$emit("refresh", e);
+			},
+			onpullingdown(e) {
+				// #ifdef APP-NVUE
+				this.$emit("pullingdown", e);
+				// #endif
+				// #ifndef APP-NVUE
+				var detail = {
+					viewHeight: 90,
+					pullingDistance: e.height
+				}
+				this.$emit("pullingdown", detail);
+				// #endif
+			}
+		}
+	}
+</script>
+
+<style scoped>
+	.uni-refresh {
+		height: 0;
+		overflow: hidden;
+	}
+</style>

+ 87 - 0
components/uni-list/uni-refresh.wxs

@@ -0,0 +1,87 @@
+var pullDown = {
+    threshold: 95,
+    maxHeight: 200,
+    callRefresh: 'onrefresh',
+    callPullingDown: 'onpullingdown',
+    refreshSelector: '.uni-refresh'
+};
+
+function ready(newValue, oldValue, ownerInstance, instance) {
+    var state = instance.getState()
+    state.canPullDown = newValue;
+    // console.log(newValue);
+}
+
+function touchStart(e, instance) {
+    var state = instance.getState();
+    state.refreshInstance = instance.selectComponent(pullDown.refreshSelector);
+    state.canPullDown = (state.refreshInstance != null && state.refreshInstance != undefined);
+    if (!state.canPullDown) {
+        return
+    }
+
+    // console.log("touchStart");
+
+    state.height = 0;
+    state.touchStartY = e.touches[0].pageY || e.changedTouches[0].pageY;
+    state.refreshInstance.setStyle({
+        'height': 0
+    });
+    state.refreshInstance.callMethod("onchange", true);
+}
+
+function touchMove(e, ownerInstance) {
+    var instance = e.instance;
+    var state = instance.getState();
+    if (!state.canPullDown) {
+        return
+    }
+
+    var oldHeight = state.height;
+    var endY = e.touches[0].pageY || e.changedTouches[0].pageY;
+    var height = endY - state.touchStartY;
+    if (height > pullDown.maxHeight) {
+        return;
+    }
+
+    var refreshInstance = state.refreshInstance;
+    refreshInstance.setStyle({
+        'height': height + 'px'
+    });
+
+    height = height < pullDown.maxHeight ? height : pullDown.maxHeight;
+    state.height = height;
+    refreshInstance.callMethod(pullDown.callPullingDown, {
+        height: height
+    });
+}
+
+function touchEnd(e, ownerInstance) {
+    var state = e.instance.getState();
+    if (!state.canPullDown) {
+        return
+    }
+
+    state.refreshInstance.callMethod("onchange", false);
+
+    var refreshInstance = state.refreshInstance;
+    if (state.height > pullDown.threshold) {
+        refreshInstance.callMethod(pullDown.callRefresh);
+        return;
+    }
+
+    refreshInstance.setStyle({
+        'height': 0
+    });
+}
+
+function propObserver(newValue, oldValue, instance) {
+    pullDown = newValue;
+}
+
+module.exports = {
+    touchmove: touchMove,
+    touchstart: touchStart,
+    touchend: touchEnd,
+    propObserver: propObserver
+}

+ 252 - 0
components/uni-nav-bar/uni-nav-bar.vue

@@ -0,0 +1,252 @@
+<template>
+	<view class="uni-navbar">
+		<view :class="{ 'uni-navbar--fixed': fixed, 'uni-navbar--shadow': shadow, 'uni-navbar--border': border }" :style="{ 'background-color': backgroundColor }"
+		 class="uni-navbar__content">
+			<status-bar v-if="statusBar" />
+			<view :style="{ color: color,backgroundColor: backgroundColor }" class="uni-navbar__header uni-navbar__content_view">
+				<view @tap="onClickLeft" class="uni-navbar__header-btns uni-navbar__header-btns-left uni-navbar__content_view">
+					<view class="uni-navbar__content_view" v-if="leftIcon.length">
+						<uni-icons :color="color" :type="leftIcon" size="24" />
+					</view>
+					<view :class="{ 'uni-navbar-btn-icon-left': !leftIcon.length }" class="uni-navbar-btn-text uni-navbar__content_view"
+					 v-if="leftText.length">
+						<text :style="{ color: color, fontSize: '14px' }">{{ leftText }}</text>
+					</view>
+					<slot name="left" />
+				</view>
+				<view class="uni-navbar__header-container uni-navbar__content_view" @tap="onClickTitle">
+					<view class="uni-navbar__header-container-inner uni-navbar__content_view" v-if="title.length">
+						<text class="uni-nav-bar-text" :style="{color: color }">{{ title }}</text>
+					</view>
+					<!-- 标题插槽 -->
+					<slot />
+				</view>
+				<view :class="title.length ? 'uni-navbar__header-btns-right' : ''" @tap="onClickRight" class="uni-navbar__header-btns uni-navbar__content_view">
+					<view class="uni-navbar__content_view" v-if="rightIcon.length">
+						<uni-icons :color="color" :type="rightIcon" size="24" />
+					</view>
+					<!-- 优先显示图标 -->
+					<view class="uni-navbar-btn-text uni-navbar__content_view" v-if="rightText.length && !rightIcon.length">
+						<text class="uni-nav-bar-right-text">{{ rightText }}</text>
+					</view>
+					<slot name="right" />
+				</view>
+			</view>
+		</view>
+		<view class="uni-navbar__placeholder" v-if="fixed">
+			<status-bar v-if="statusBar" />
+			<view class="uni-navbar__placeholder-view" />
+		</view>
+	</view>
+</template>
+
+<script>
+	import statusBar from "./uni-status-bar.vue";
+
+	/**
+	 * NavBar 自定义导航栏
+	 * @description 导航栏组件,主要用于头部导航
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=52
+	 * @property {String} title 标题文字
+	 * @property {String} leftText 左侧按钮文本
+	 * @property {String} rightText 右侧按钮文本
+	 * @property {String} leftIcon 左侧按钮图标(图标类型参考 [Icon 图标](http://ext.dcloud.net.cn/plugin?id=28) type 属性)
+	 * @property {String} rightIcon 右侧按钮图标(图标类型参考 [Icon 图标](http://ext.dcloud.net.cn/plugin?id=28) type 属性)
+	 * @property {String} color 图标和文字颜色
+	 * @property {String} backgroundColor 导航栏背景颜色
+	 * @property {Boolean} fixed = [true|false] 是否固定顶部
+	 * @property {Boolean} statusBar = [true|false] 是否包含状态栏
+	 * @property {Boolean} shadow = [true|false] 导航栏下是否有阴影
+	 * @event {Function} clickLeft 左侧按钮点击时触发
+	 * @event {Function} clickRight 右侧按钮点击时触发
+	 * @event {Function} clickTitle 中间标题点击时触发
+	 */
+	export default {
+		name: "UniNavBar",
+		components: {
+			statusBar
+		},
+		emits:['clickLeft','clickRight','clickTitle'],
+		props: {
+			title: {
+				type: String,
+				default: ""
+			},
+			leftText: {
+				type: String,
+				default: ""
+			},
+			rightText: {
+				type: String,
+				default: ""
+			},
+			leftIcon: {
+				type: String,
+				default: ""
+			},
+			rightIcon: {
+				type: String,
+				default: ""
+			},
+			fixed: {
+				type: [Boolean, String],
+				default: false
+			},
+			color: {
+				type: String,
+				default: "#000000"
+			},
+			backgroundColor: {
+				type: String,
+				default: "#FFFFFF"
+			},
+			statusBar: {
+				type: [Boolean, String],
+				default: false
+			},
+			shadow: {
+				type: [Boolean, String],
+				default: false
+			},
+			border: {
+				type: [Boolean, String],
+				default: true
+			}
+		},
+        mounted() {
+          if(uni.report && this.title !== '') {
+              uni.report('title', this.title)
+          }
+        },
+		methods: {
+			onClickLeft() {
+				this.$emit("clickLeft");
+			},
+			onClickRight() {
+				this.$emit("clickRight");
+			},
+			onClickTitle() {
+				this.$emit("clickTitle");
+			}
+		}
+	};
+</script>
+
+<style lang="scss" scoped>
+	$nav-height: 44px;
+	.uni-nav-bar-text {
+		/* #ifdef APP-PLUS */
+		font-size: 34rpx;
+		/* #endif */
+		/* #ifndef APP-PLUS */
+		font-size: $uni-font-size-lg;
+		/* #endif */
+	}
+
+	.uni-nav-bar-right-text {
+		font-size: $uni-font-size-base;
+	}
+
+	.uni-navbar__content {
+		position: relative;
+		background-color: $uni-bg-color;
+		overflow: hidden;
+		// width: 750rpx;
+	}
+
+	.uni-navbar__content_view {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		align-items: center;
+		flex-direction: row;
+		// background-color: #FFFFFF;
+	}
+
+	.uni-navbar__header {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		height: $nav-height;
+		line-height: $nav-height;
+		font-size: 16px;
+		// background-color: #ffffff;
+	}
+
+	.uni-navbar__header-btns {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-wrap: nowrap;
+		width: 120rpx;
+		padding: 0 6px;
+		justify-content: center;
+		align-items: center;
+		/* #ifdef H5 */
+		cursor: pointer;
+		/* #endif */
+	}
+
+	.uni-navbar__header-btns-left {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		width: 150rpx;
+		justify-content: flex-start;
+	}
+
+	.uni-navbar__header-btns-right {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		width: 150rpx;
+		padding-right: 30rpx;
+		justify-content: flex-end;
+	}
+
+	.uni-navbar__header-container {
+		flex: 1;
+	}
+
+	.uni-navbar__header-container-inner {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex: 1;
+		align-items: center;
+		justify-content: center;
+		font-size: $uni-font-size-base;
+	}
+
+
+	.uni-navbar__placeholder-view {
+		height: $nav-height;
+	}
+
+	.uni-navbar--fixed {
+		position: fixed;
+		z-index: 998;
+		/* #ifdef H5 */
+		left: var(--window-left);
+		right: var(--window-right);
+		/* #endif */
+		/* #ifndef H5 */
+		left:0;
+		right: 0;
+		/* #endif */
+
+	}
+
+	.uni-navbar--shadow {
+		/* #ifndef APP-NVUE */
+		box-shadow: 0 1px 6px #ccc;
+		/* #endif */
+	}
+
+	.uni-navbar--border {
+		border-bottom-width: 10rpx;
+		border-bottom-style: none;
+		border-bottom-color: $uni-border-color;
+	}
+</style>

+ 27 - 0
components/uni-nav-bar/uni-status-bar.vue

@@ -0,0 +1,27 @@
+<template>
+	<view :style="{ height: statusBarHeight }" class="uni-status-bar">
+		<slot />
+	</view>
+</template>
+
+<script>
+	export default {
+		name: 'UniStatusBar',
+		data() {
+			return {
+				statusBarHeight: 20
+			}
+		},
+		mounted() {
+			this.statusBarHeight = uni.getSystemInfoSync().statusBarHeight + 'px'
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.uni-status-bar {
+		// width: 750rpx;
+		height: 20px;
+		// height: var(--status-bar-height);
+	}
+</style>

+ 224 - 0
components/uni-number-box/uni-number-box.vue

@@ -0,0 +1,224 @@
+<template>
+	<view class="uni-numbox">
+		<view @click="_calcValue('minus')" class="uni-numbox__minus uni-cursor-point">
+			<text class="uni-numbox--text" :class="{ 'uni-numbox--disabled': inputValue <= min || disabled }">-</text>
+		</view>
+		<input :disabled="disabled" @focus="_onFocus" @blur="_onBlur" class="uni-numbox__value" type="number" v-model="inputValue" />
+		<view @click="_calcValue('plus')" class="uni-numbox__plus uni-cursor-point">
+			<text class="uni-numbox--text" :class="{ 'uni-numbox--disabled': inputValue >= max || disabled }">+</text>
+		</view>
+	</view>
+</template>
+<script>
+	/**
+	 * NumberBox 数字输入框
+	 * @description 带加减按钮的数字输入框
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=31
+	 * @property {Number} value 输入框当前值
+	 * @property {Number} min 最小值
+	 * @property {Number} max 最大值
+	 * @property {Number} step 每次点击改变的间隔大小
+	 * @property {Boolean} disabled = [true|false] 是否为禁用状态
+	 * @event {Function} change 输入框值改变时触发的事件,参数为输入框当前的 value
+	 */
+
+	export default {
+		name: "UniNumberBox",
+		emits: ['change', 'input', 'update:modelValue', 'blur', 'focus'],
+		props: {
+			value: {
+				type: [Number, String],
+				default: 1
+			},
+			modelValue: {
+				type: [Number, String],
+				default: 1
+			},
+			min: {
+				type: Number,
+				default: 0
+			},
+			max: {
+				type: Number,
+				default: 100
+			},
+			step: {
+				type: Number,
+				default: 1
+			},
+			disabled: {
+				type: Boolean,
+				default: false
+			}
+		},
+		data() {
+			return {
+				inputValue: 0
+			};
+		},
+		watch: {
+			value(val) {
+				this.inputValue = +val;
+			},
+			modelValue(val) {
+				this.inputValue = +val;
+			}
+		},
+		created() {
+			if (this.value === 1) {
+				this.inputValue = +this.modelValue;
+			}
+			if (this.modelValue === 1) {
+				this.inputValue = +this.value;
+			}
+		},
+		methods: {
+			_calcValue(type) {
+				if (this.disabled) {
+					return;
+				}
+				const scale = this._getDecimalScale();
+				let value = this.inputValue * scale;
+				let step = this.step * scale;
+				if (type === "minus") {
+					value -= step;
+					if (value < (this.min * scale)) {
+						return;
+					}
+					if (value > (this.max * scale)) {
+						value = this.max * scale
+					}
+				}
+
+				if (type === "plus") {
+					value += step;
+					if (value > (this.max * scale)) {
+						return;
+					}
+					if (value < (this.min * scale)) {
+						value = this.min * scale
+					}
+				}
+
+				this.inputValue = (value / scale).toFixed(String(scale).length - 1);
+				this.$emit("change", +this.inputValue);
+				// TODO vue2 兼容
+				this.$emit("input", +this.inputValue);
+				// TODO vue3 兼容
+				this.$emit("update:modelValue", +this.inputValue);
+			},
+			_getDecimalScale() {
+
+				let scale = 1;
+				// 浮点型
+				if (~~this.step !== this.step) {
+					scale = Math.pow(10, String(this.step).split(".")[1].length);
+				}
+				return scale;
+			},
+			_onBlur(event) {
+				this.$emit('blur', event)
+				let value = event.detail.value;
+				if (!value) {
+					// this.inputValue = 0;
+					return;
+				}
+				value = +value;
+				if (value > this.max) {
+					value = this.max;
+				} else if (value < this.min) {
+					value = this.min;
+				}
+				const scale = this._getDecimalScale();
+				this.inputValue = value.toFixed(String(scale).length - 1);
+				this.$emit("change", +this.inputValue);
+				this.$emit("input", +this.inputValue);
+			},
+			_onFocus(event) {
+				this.$emit('focus', event)
+			}
+		}
+	};
+</script>
+<style scoped>
+	/* #ifdef APP-NVUE */
+	/* #endif */
+	.uni-numbox {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		height: 35px;
+		line-height: 35px;
+		width: 120px;
+	}
+
+	.uni-cursor-point {
+		/* #ifdef H5 */
+		cursor: pointer;
+		/* #endif */
+	}
+
+	.uni-numbox__value {
+		background-color: #ffffff;
+		width: 50px;
+		height: 35px;
+		text-align: center;
+		font-size: 16px;
+		border-width: 1rpx;
+		border-style: solid;
+		border-color: #e5e5e5;
+		border-left-width: 0;
+		border-right-width: 0;
+	}
+
+	.uni-numbox__minus {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+		justify-content: center;
+		width: 35px;
+		height: 35px;
+		font-size: 20px;
+		color: #333;
+		background-color: #f8f8f8;
+		border-width: 1rpx;
+		border-style: solid;
+		border-color: #e5e5e5;
+		border-top-left-radius: 3px;
+		border-bottom-left-radius: 3px;
+		border-right-width: 0;
+	}
+
+	.uni-numbox__plus {
+		/* #ifndef APP-NVUE */
+		display: flex;
+		/* #endif */
+		flex-direction: row;
+		align-items: center;
+		justify-content: center;
+		width: 35px;
+		height: 35px;
+		border-width: 1rpx;
+		border-style: solid;
+		border-color: #e5e5e5;
+		border-top-right-radius: 3px;
+		border-bottom-right-radius: 3px;
+		background-color: #f8f8f8;
+		border-left-width: 0;
+	}
+
+	.uni-numbox--text {
+		font-size: 20px;
+		color: #333;
+	}
+
+	.uni-numbox--disabled {
+		color: #c0c0c0;
+		/* #ifdef H5 */
+		cursor: not-allowed;
+		/* #endif */
+	}
+</style>

+ 259 - 0
components/uni-right-combox/uni-right-combox.vue

@@ -0,0 +1,259 @@
+<template>
+	<view class="uni-id-combox">
+		<!--<view v-if="label" class="uni-id-combox__label" :style="labelStyle">
+			<text>{{label}}</text>
+		</view>-->
+		<view class="uni-id-combox__input-box">
+			<label class="uni-id-combox__input" @click="toggleSelector">{{inputVal}}
+				<uni-icons color="#C8C8C8" type="arrowright"/>	
+			</label>
+<!--			<input class="uni-id-combox__input" type="text" disabled="true"   :placeholder="placeholder" v-model="inputVal" @input="onInput"/>-->
+<!--			 @focus="onFocus" @blur="onBlur" />-->
+	 
+<!--			 <label class="iconfont icon-triangle-down " style="color: grey;" @click="toggleSelector"></label>-->
+<!--			<uni-icons class="uni-id-combox__input-arrow" type="arrowdown" size="14" @click="toggleSelector"></uni-icons>-->
+			<view class="uni-id-combox__selector " v-if="showSelector">
+				<scroll-view scroll-y="true" class="uni-id-combox__selector-scroll">
+
+					<view class="uni-id-combox__selector-empty" v-if="filterCandidatesLength === 0">
+						<label>{{emptyTips}}</label>
+					</view>
+<!--					<view class="uni-id-combox__selector-item" v-for="(item,index) in filterCandidates" :key="index" @click="onSelectorClick(index)">-->
+					<view class="uni-id-combox__selector-item" v-for="(item,index) in candidates" :key="index" @click="onSelectorClick(index)">
+						<label>{{item.value}}</label>
+<!--						<text>{{item.value}}</text>-->
+					</view>
+				</scroll-view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	/**
+	 * Combox 组合输入框
+	 * @description 组合输入框一般用于既可以输入也可以选择的场景
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=1261
+	 * @property {String} label 左侧文字
+	 * @property {String} labelWidth 左侧内容宽度
+	 * @property {String} placeholder 输入框占位符
+	 * @property {Array} candidates 候选项列表
+	 * @property {String} emptyTips 筛选结果为空时显示的文字
+	 * @property {String} value 组合框的值
+	 */
+	export default {
+		name: 'uniIdCombox',
+		emits:['input','update:modelValue'],
+		props: {
+			label: {
+				type: String,
+				default: ''
+			},
+			labelWidth: {
+				type: String,
+				default: 'auto'
+			},
+			placeholder: {
+				type: String,
+				default: ''
+			},
+			candidates: {
+				type: Array,
+				default () {
+					return []
+				}
+			},
+			emptyTips: {
+				type: String,
+				default: '无匹配项'
+			},
+			// #ifndef VUE3
+			value: {
+				type: [String, Number],
+				default: ''
+			},
+			// #endif
+			// #ifdef VUE3
+			modelValue: {
+				type: [String, Number],
+				default: ''
+			},
+			// #endif
+		},
+		data() {
+			return {
+				showSelector: false,
+				inputVal: '',
+				id:'',
+			}
+		},
+		computed: {
+			labelStyle() {
+				if (this.labelWidth === 'auto') {
+					return {}
+				}
+				return {
+					width: this.labelWidth
+				}
+			},
+			filterCandidates() {
+				return this.candidates.filter((item) => {
+					let ret = item.value.toString().indexOf(this.inputVal) > -1;
+					//console.log('value:' +item.value + ' ret:' + ret);
+					return ret
+				})
+			},
+			filterCandidatesLength() {
+				return this.filterCandidates.length
+			}
+		},
+		watch: {
+			// #ifndef VUE3
+			value: {
+				handler(newVal) {
+					this.inputVal = newVal
+				},
+				immediate: true
+			},
+			// #endif
+			// #ifdef VUE3
+			modelValue: {
+				handler(newVal) {
+					this.inputVal = newVal
+				},
+				immediate: true
+			},
+			// #endif
+		},
+		methods: {
+			toggleSelector() {
+				this.showSelector = !this.showSelector
+			},
+			onFocus() {
+				this.showSelector = true
+			},
+			onBlur() {
+				setTimeout(() => {
+					this.showSelector = false
+				}, 153)
+			},
+			onSelectorClick(index) {
+				this.inputVal = this.candidates[index].value;
+				this.id = this.candidates[index].id;
+				//this.filterCandidates[index].value
+				this.showSelector = false
+				this.$emit('input', this.inputVal)
+				this.$emit('update:modelValue', {id:this.id,value:this.inputVal})
+			},
+			onInput() {
+				
+				setTimeout(() => {
+					this.$emit('input', this.inputVal)
+					this.$emit('update:modelValue', this.inputVal)
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	@import url("/static/font/iconfont.css");
+	.uni-id-combox {
+		///* #ifndef APP-NVUE */
+		display: flex;
+		///* #endif */
+		height: 80rpx;
+		flex-direction: row;
+		align-items: center;
+		// border-bottom: solid 1px #DDDDDD;
+	}
+
+	.uni-id-combox__label {
+		font-size: 32rpx;
+		line-height: 44rpx;
+		//padding-right: 20rpx;
+		color: #999999;
+	}
+
+	.uni-id-combox__input-box {
+		position: relative;
+		///* #ifndef APP-NVUE */
+		display: flex;
+		////* #endif */
+		//flex: 1;
+		flex-direction: row;
+		align-items: center;
+		justify-content: center;
+		width:100%
+		//background-color: #007AFF;
+	}
+
+	.uni-id-combox__input {
+		//flex: 1;		
+		font-size: 32rpx;
+		height: 44rpx;
+		line-height: 44rpx;
+		//justify-content: flex-end;
+	}
+
+	.uni-id-combox__input-arrow {
+		//padding: 10rpx;
+	}
+
+	.uni-id-combox__selector {
+		///* #ifndef APP-NVUE */
+		box-sizing: border-box;
+		///* #endif */
+		position: absolute;
+		top: 42rpx;
+		left: 0;
+		width: 100%;
+		background-color: #FFFFFF;
+		border-radius: 6rpx;
+		box-shadow: #DDDDDD 4rpx 4rpx 8rpx, #DDDDDD -4rpx -4rpx 8rpx;
+		z-index: 2;
+	}
+
+	.uni-id-combox__selector-scroll {
+		///* #ifndef APP-NVUE */
+		max-height: 800rpx;
+		box-sizing: border-box;
+		///* #endif */
+	}
+
+	.uni-id-combox__selector::before {
+		///* #ifndef APP-NVUE */
+		content: '';
+		///* #endif */
+		position: absolute;
+		width: 0;
+		height: 0;
+		border-bottom: solid 6rpx #FFFFFF;
+		border-right: solid 6rpx transparent;
+		border-left: solid 6rpx transparent;
+		//left: 50%;
+		top: -6rpx;
+		//margin-left: -6rpx;
+	}
+
+	.uni-id-combox__selector-empty,
+	.uni-id-combox__selector-item {
+		///* #ifndef APP-NVUE */
+		display: flex;
+		cursor: pointer;
+		///* #endif */
+		line-height: 72rpx;
+		font-size: 28rpx;
+		text-align: center;
+		border-bottom: solid 1rpx #DDDDDD;
+		//margin: 0px 20rpx; 
+		justify-content: center;
+	}
+
+	.uni-id-combox__selector-empty:last-child,
+	.uni-id-combox__selector-item:last-child {
+		///* #ifndef APP-NVUE */
+		border-bottom: none;
+		///* #endif */
+	}
+</style>

+ 283 - 0
components/uni-tag/uni-tag.vue

@@ -0,0 +1,283 @@
+<template>
+	<text class="uni-tag" v-if="text" :class="classes" :style="customStyle" @click="onClick">
+		<slot />{{text}}
+		<slot name="right" />
+	</text>
+</template>
+
+<script>
+	/**
+	 * Tag 标签
+	 * @description 用于展示1个或多个文字标签,可点击切换选中、不选中的状态
+	 * @tutorial https://ext.dcloud.net.cn/plugin?id=35
+	 * @property {String} text 标签内容
+	 * @property {String} size = [normal|small] 大小尺寸
+	 * 	@value normal 正常
+	 * 	@value small 小尺寸
+	 * @property {String} type = [default|primary|success|warning|error|royal]  颜色类型
+	 * 	@value default 灰色
+	 * 	@value primary 蓝色
+	 * 	@value success 绿色
+	 * 	@value warning 黄色
+	 * 	@value error 红色
+	 * 	@value royal 紫色
+	 * @property {Boolean} disabled = [true|false] 是否为禁用状态
+	 * @property {Boolean} inverted = [true|false] 是否无需背景颜色(空心标签)
+	 * @property {Boolean} circle = [true|false] 是否为圆角
+	 * @event {Function} click 点击 Tag 触发事件
+	 */
+
+	export default {
+		name: "UniTag",
+		emits: ['click'],
+		props: {
+			type: {
+				// 标签类型default、primary、success、warning、error、royal
+				type: String,
+				default: "default"
+			},
+			size: {
+				// 标签大小 normal, small
+				type: String,
+				default: "normal"
+			},
+			// 标签内容
+			text: {
+				type: String,
+				default: ""
+			},
+			disabled: {
+				// 是否为禁用状态
+				type: [Boolean, String],
+				default: false
+			},
+			inverted: {
+				// 是否为空心
+				type: [Boolean, String],
+				default: false
+			},
+			circle: {
+				// 是否为圆角样式
+				type: [Boolean, String],
+				default: false
+			},
+			mark: {
+				// 是否为标记样式
+				type: [Boolean, String],
+				default: false
+			},
+			customStyle: {
+				type: String,
+				default: ''
+			}
+		},
+		computed: {
+			classes() {
+				const {
+					type,
+					disabled,
+					inverted,
+					circle,
+					mark,
+					size,
+					isTrue
+				} = this
+				const classArr = [
+					'uni-tag--' + type,
+					isTrue(disabled) ? 'uni-tag--disabled' : '',
+					isTrue(inverted) ? type + '-uni-tag--inverted' : '',
+					isTrue(circle) ? 'uni-tag--circle' : '',
+					isTrue(mark) ? 'uni-tag--mark' : '',
+					'uni-tag--' + size,
+					// type === 'default' ? 'uni-tag--default' : 'uni-tag-text',
+					isTrue(inverted) ? 'uni-tag-text--' + type : '',
+					size === 'small' ? 'uni-tag-text--small' : ''
+				]
+				return classArr.join(' ')
+			}
+		},
+		methods: {
+			isTrue(value) {
+				return value === true || value === 'true'
+			},
+			onClick() {
+				if (this.isTrue(this.disabled)) return
+				this.$emit("click");
+			}
+		}
+	};
+</script>
+
+<style scoped>
+	.uni-tag {
+		/* #ifndef APP-NVUE */
+		display: inline-block;
+		/* #endif */
+		/* #ifdef APP-NVUE */
+		align-self: flex-start;
+		/* #endif */
+		padding: 0px 16px;
+		line-height: 30px;
+		color: #333;
+		border-radius: 3px;
+		background-color: #f8f8f8;
+		border-width: 1rpx;
+		border-style: solid;
+		border-color: #f8f8f8;
+		/* #ifdef H5 */
+		cursor: pointer;
+		/* #endif */
+	}
+
+	.uni-tag--circle {
+		border-radius: 15px;
+	}
+
+	.uni-tag--mark {
+		border-top-left-radius: 0;
+		border-bottom-left-radius: 0;
+		border-top-right-radius: 15px;
+		border-bottom-right-radius: 15px;
+	}
+
+	.uni-tag--disabled {
+		opacity: 0.5;
+		/* #ifdef H5 */
+		cursor: not-allowed;
+		/* #endif */
+	}
+
+	.uni-tag--small {
+		height: 20px;
+		padding: 0px 8px;
+		line-height: 20px;
+		font-size: 12px;
+	}
+
+	.uni-tag--default {
+		color: #333;
+		font-size: 14px;
+	}
+
+	.uni-tag--royal {
+		color: #333;
+		font-size: 14px;
+	}
+
+	.uni-tag-text--small {
+		font-size: 12px;
+	}
+
+	.uni-tag-text {
+		color: #fff;
+		font-size: 14px;
+	}
+
+	.uni-tag-text--primary {
+		color: #007aff;
+	}
+
+	.uni-tag-text--success {
+		color: #4cd964;
+	}
+
+	.uni-tag-text--warning {
+		color: #f0ad4e;
+	}
+
+	.uni-tag-text--error {
+		color: #dd524d;
+	}
+
+	.uni-tag-text--royal {
+		color: #4335d6;
+	}
+
+	.uni-tag--primary {
+		color: #fff;
+		background-color: #007aff;
+		border-width: 1rpx;
+		border-style: solid;
+		border-color: #007aff;
+	}
+
+	.primary-uni-tag--inverted {
+		color: #007aff;
+		background-color: #ffffff;
+		border-width: 1rpx;
+		border-style: solid;
+		border-color: #007aff;
+	}
+
+	.uni-tag--success {
+		color: #fff;
+		background-color: #4cd964;
+		border-width: 1rpx;
+		border-style: solid;
+		border-color: #4cd964;
+	}
+
+	.success-uni-tag--inverted {
+		color: #4cd964;
+		background-color: #ffffff;
+		border-width: 1rpx;
+		border-style: solid;
+		border-color: #4cd964;
+	}
+
+	.uni-tag--warning {
+		color: #fff;
+		background-color: #f0ad4e;
+		border-width: 1rpx;
+		border-style: solid;
+		border-color: #f0ad4e;
+	}
+
+	.warning-uni-tag--inverted {
+		color: #f0ad4e;
+		background-color: #ffffff;
+		border-width: 1rpx;
+		border-style: solid;
+		border-color: #f0ad4e;
+	}
+
+	.uni-tag--error {
+		color: #fff;
+		background-color: #dd524d;
+		border-width: 1rpx;
+		border-style: solid;
+		border-color: #dd524d;
+	}
+
+	.error-uni-tag--inverted {
+		color: #dd524d;
+		background-color: #ffffff;
+		border-width: 1rpx;
+		border-style: solid;
+		border-color: #dd524d;
+	}
+
+	.uni-tag--royal {
+		color: #fff;
+		background-color: #4335d6;
+		border-width: 1rpx;
+		border-style: solid;
+		border-color: #4335d6;
+	}
+
+	.royal-uni-tag--inverted {
+		color: #4335d6;
+		background-color: #ffffff;
+		border-width: 1rpx;
+		border-style: solid;
+		border-color: #4335d6;
+	}
+
+	.uni-tag--inverted {
+		color: #333;
+		background-color: #ffffff;
+		border-width: 1rpx;
+		border-style: solid;
+		border-color: #f8f8f8;
+	}
+</style>

+ 385 - 0
components/xiaolu-tree/code.js

@@ -0,0 +1,385 @@
+import search from './search/index.vue'
+	/*
+	 *	已兼容h5和小程序端,其它端没测试过,估计问题不大,只需要改一下传值的方式
+	 * 
+	 *	如有问题可以加qq:122720267
+	 * 	
+	 *	使用该插件的朋友请给个好评,或者到git start一下
+	 *   git地址:https://github.com/LSZ579/xiaolu-tree-plugin.git
+	 *   插件市场地址: https://ext.dcloud.net.cn/plugin?id=2423
+	 * 
+	 */
+export default {
+	name: "treeComponent",
+	data() {
+		return {
+			isre: false,
+			tree: Object.freeze(this.treeNone),
+			newNum: 0,
+			oldNum: 0,
+			catchTreeNone: [...this.treeNone],
+			tree_stack: [1],
+			searchResult: [],
+			newCheckList: this.checkList,
+			scrollLeft: 999,
+			nodePathArray: []
+		}
+	},
+	components: {
+		search
+	},
+	computed: {
+		isSelect() {
+			return (item) => {
+				const checkList = this.newCheckList
+				if (checkList.length == 0) {
+					this.props.checkStrictly ? (item.bx = 0, item.qx = 0) : ''
+					return false
+				}
+				const i = checkList.findIndex(e => {
+					return item[this.keyCode] == e[this.keyCode]
+				}) > -1
+				return i && !item.qx
+			}
+		},
+		radioSelect() {
+			const list = this.newCheckList
+			return (item) => {
+				return list.length > 0 && item[this.keyCode] == list[0][this.keyCode]
+			}
+		},
+		keyCode() {
+			return this.keyValue
+		}
+	},
+	created() {
+		this.Init()
+	},
+	methods: {
+		// 初始化
+		Init() {
+			if (this.newCheckList.length !== 0) {
+				let {
+					tree_stack,
+					props,
+					catchTreeNone,
+					newCheckList
+				} = this
+				if (props.multiple) {
+					if (props.checkStrictly) {
+						this.checkAllChoose();
+					}
+				} else {
+					this.getNodeRoute(catchTreeNone, newCheckList[0][this.keyCode])
+					let arr = this.nodePathArray.reverse()
+					console.log(arr)
+					if (arr.length == 0) return
+					this.tree_stack = tree_stack.concat(arr);
+					this.tree = this.tree_stack[this.tree_stack.length - 1].children;
+				}
+			}
+		},
+		// 点击项目处理
+		handleClick(item, index) {
+			let children = item[this.props.children]
+			if (index > -1 && children && children.length > 0) {
+				this.toChildren(item)
+			} else if (this.props.multiple) {
+				this.checkboxChange(item, index, item.bx, item.qx)
+			} else {
+				this.checkbox(item, index)
+			}
+		},
+		// 获取路径
+		getPath() {
+			const {
+				keyCode,
+				tree_stack,
+				props
+			} = this
+			const path = [...tree_stack].map(e => {
+				const item = Object.assign({}, e)
+				delete item[props.children]
+				return item
+			})
+			return path.slice(1, path.length) || []
+		},
+		//多选
+		async checkboxChange(item, index, bx, qx) {
+			let that = this;
+			const {
+				props
+			} = that
+			if (!props.multiple) return;
+			let findIdex = that.newCheckList.findIndex(e => item[this.keyCode] == e[this.keyCode]);
+			const path = this.getPath()
+			if (findIdex > -1) { //反选
+				if (props.checkStrictly) { //关联子级
+					if (item.user) { //用户
+						that.newCheckList.splice(findIdex, 1)
+					} else { //非用户,取消所有下一级
+						that.getIdBydelete(item.children)
+					}
+				} else {
+					that.newCheckList.splice(findIdex, 1)
+				}
+			} else { //选中
+				if (!item.user && props.checkStrictly) { //选中下一级
+					if (qx || bx) { //取消下级
+						await that.getIdBydelete(item.children);
+						item.qx = 0;
+						item.bx = 0;
+					} else {
+						item.qx = 1;
+						item.bx = 0;
+						const {
+							id,
+							name,
+							user
+						} = item
+						const newObj = {
+							id,
+							name,
+							user
+						}
+						const pathList = this.tree_stack.length === 1 ? [newObj, ...path] : [...path, newObj]
+						await that.chooseChild(item.children, pathList);
+					}
+					this.$forceUpdate()
+					return
+				}
+				that.newCheckList.push({ ...item,
+					path
+				});
+			}
+		},
+		// 取消下一级的选中
+		getIdBydelete(arr) {
+			arr.forEach(e => {
+				if (e.user) {
+					for (var i = 0; i < this.newCheckList.length; i++) {
+						if (e[this.keyCode] == this.newCheckList[i][this.keyCode]) {
+							this.newCheckList.splice(i, 1)
+							break;
+						}
+					}
+				} else {
+					this.getIdBydelete(e.children)
+				}
+			})
+		},
+
+		// 关联下一级,选中
+		chooseChild(arr, path) {
+			let that = this;
+			const oldPath = [...path]
+			for (var i = 0, len = arr.length; i < len; i++) {
+				let item = arr[i];
+				if (item.user) {
+					that.newCheckList.push({ ...item,
+						path: oldPath
+					})
+				} else {
+					const newItem = { ...item
+					}
+					delete newItem[that.props.children]
+					const newPath = [...oldPath, newItem]
+					that.chooseChild(item.children, newPath)
+				}
+			}
+		},
+
+		// (tree为目标树,targetId为目标节点id) 
+		getNodeRoute(tree, targetId) {
+			for (let index = 0; index < tree.length; index++) {
+				if (tree[index].children) {
+					let endRecursiveLoop = this.getNodeRoute(tree[index].children, targetId)
+					if (endRecursiveLoop) {
+						this.nodePathArray.push(tree[index])
+						return true
+					}
+				}
+				if (tree[index][this.keyCode] === targetId) {
+					return true
+				}
+			}
+		},
+
+		//单选
+		checkbox(item, index) {
+			const path = this.getPath()
+			this.$set(this, 'newCheckList', [{ ...item,
+				path
+			}])
+		},
+		//到下一级
+		toChildren(item) {
+			if (item.user) return
+			var that = this;
+			uni.showLoading({
+				title: '加载中'
+			})
+			let children = that.props.children;
+			if (!item.user && item[children].length > 0 && !(that.tree_stack[0][this.keyCode] == item[this.keyCode])) {
+				that.tree = item[children];
+				that.tree_stack.push(item);
+			}
+			this.$nextTick(() => {
+				uni.hideLoading()
+				this.scrollLeft += 200;
+			})
+			if (this.props.checkStrictly) this.checkAllChoose();
+		},
+		//搜索
+		confirmSearch(val) {
+			this.searchResult = []
+			this.search(this.catchTreeNone, val)
+			this.isre = true
+			this.tree_stack.splice(1, 1000)
+			uni.showLoading({
+				title: '正在查找'
+			})
+			setTimeout(() => {
+				this.tree = this.searchResult
+				uni.hideLoading()
+			}, 300)
+		},
+		search(data, keyword) {
+			var that = this
+			let children = that.props.children
+			for (var i = 0, len = data.length; i < len; i++) {
+				if (data[i].name.indexOf(keyword) >= 0) {
+					that.searchResult.push(data[i])
+				}
+				if (!data[i].user && data[i][children].length > 0) {
+					that.search(data[i][children], keyword)
+				}
+			}
+		},
+
+		checkAllChoose() {
+			let o = false,
+				t = true;
+			this.tree.forEach((e, i) => {
+				if (!e.user) {
+					e.qx = o;
+					e.bx = o;
+					 this.computAllNumber(e.children);
+					// console.log(this.newNum,this.oldNum)
+					if (this.newNum != 0 && this.oldNum != 0) {
+						if (this.newNum == this.oldNum) {
+							e.qx = t;
+							e.bx = o;
+						} else {
+							e.qx = o;
+							e.bx = t;
+						}
+					}
+					if (this.newNum != 0 && this.oldNum == 0) {
+						this.$set(this.tree[i], 'bx', o);
+						this.$set(this.tree[i], 'qx', o);
+					}
+					this.$forceUpdate()
+					this.newNum = 0
+					this.oldNum = 0
+				}
+			})
+		},
+
+		computAllNumber(arr) {
+			for (let j = 0; j < arr.length; j++) {
+				var e = arr[j];
+				this.checkSum(e[this.keyCode])
+				if (e.user) {
+					this.newNum++;
+				} else {
+					this.computAllNumber(e.children)
+				}
+			}
+		},
+
+		checkSum(id) {
+			for (let i = 0; i < this.newCheckList.length; i++) {
+				if (id == this.newCheckList[i][this.keyCode]) {
+					this.oldNum++;
+					break
+				}
+			}
+		},
+
+		//返回其它层
+		backTree(item, index) {
+			let that = this,
+				tree_stack = that.tree_stack,
+				max = 10000;
+			if (index === -1) {
+				that.tree = that.catchTreeNone
+				that.tree_stack.splice(1, max)
+				that.isre = false
+				that.$refs.sea.clears()
+			} else if (index === -2) {
+				that.tree = that.searchResult
+				that.tree_stack.splice(1, max)
+			} else {
+				if (tree_stack.length - index > 2) {
+					tree_stack.forEach((item, i) => {
+						if (i > index) {
+							that.tree_stack.splice(i, max)
+						}
+					})
+				} else if (index !== tree_stack.length - 1) {
+					that.tree_stack.splice(tree_stack.length - 1, 1)
+				}
+				that.tree = item[that.props.children]
+			}
+			if (this.props.checkStrictly) this.checkAllChoose();
+			this.$forceUpdate()
+		},
+		backConfirm() {
+			this.$emit('sendValue', this.newCheckList, 'back')
+		}
+
+	},
+	props: {
+		treeNone: {
+			type: Array,
+			default: () => {
+				return []
+			}
+		},
+		//是否开启选中
+		isCheck: {
+			type: Boolean,
+			default: () => {
+				return false
+			}
+		},
+		checkList: {
+			type: Array,
+			default: () => []
+		},
+		parentList: {
+			type: Array,
+			default: () => []
+		},
+		searchIf: {
+			type: Boolean,
+			default: () => true
+		},
+		keyValue: {
+			type: String,
+			default: 'id',
+		},
+		props: {
+			type: Object,
+			default: () => {
+				return {
+					label: 'name',
+					children: 'children',
+					multiple: false,
+					checkStrictly: false, //不关联
+				}
+			}
+		}
+	},
+}

+ 342 - 0
components/xiaolu-tree/css/icon.css

@@ -0,0 +1,342 @@
+@font-face {
+  font-family: "iconfont"; /* Project id 2009600 */
+  src: url('https://at.alicdn.com/t/font_2009600_gpzp7pxtnw.woff2?t=1620633089023') format('woff2'),
+       url('https://at.alicdn.com/t/font_2009600_gpzp7pxtnw.woff?t=1620633089023') format('woff'),
+       url('https://at.alicdn.com/t/font_2009600_gpzp7pxtnw.ttf?t=1620633089023') format('truetype');
+}
+
+.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-banxuanzhongshousuo1-shi:before {
+  content: "\e682";
+}
+
+.icon-xuanzhong3:before {
+  content: "\e6bb";
+}
+
+.icon-weixuanzhong2:before {
+  content: "\e62e";
+}
+
+.icon-danxuanxuanzhong:before {
+  content: "\e631";
+}
+
+.icon-xuanzhong4:before {
+  content: "\e63e";
+}
+
+.icon-xuanzhong1:before {
+  content: "\e62d";
+}
+
+.icon-xuanzhong2:before {
+  content: "\e656";
+}
+
+.icon-selected:before {
+  content: "\e615";
+}
+
+.icon-weixuanzhong1:before {
+  content: "\e614";
+}
+
+.icon-xingzhuang6kaobei3-copy-copy:before {
+  content: "\e613";
+}
+
+.icon-radio-checked:before {
+  content: "\e63f";
+}
+
+.icon-huifu:before {
+  content: "\e619";
+}
+
+.icon-dizhi:before {
+  content: "\e64a";
+}
+
+.icon-kuaijiecaidan:before {
+  content: "\e60a";
+}
+
+.icon-z043:before {
+  content: "\e62f";
+}
+
+.icon-guanbi:before {
+  content: "\e607";
+}
+
+.icon-xuanze:before {
+  content: "\e623";
+}
+
+.icon-caidanzhaolinggan:before {
+  content: "\e616";
+}
+
+.icon-xitongshezhi:before {
+  content: "\e60c";
+}
+
+.icon-xitongshezhi1:before {
+  content: "\e633";
+}
+
+.icon-lunbo:before {
+  content: "\e692";
+}
+
+.icon-shuping:before {
+  content: "\e659";
+}
+
+.icon-tongzhi:before {
+  content: "\e641";
+}
+
+.icon-pinglunguanlishezhi:before {
+  content: "\e6ac";
+}
+
+.icon-icon:before {
+  content: "\e600";
+}
+
+.icon-liuyanguanli:before {
+  content: "\e61d";
+}
+
+.icon-xuanzhong:before {
+  content: "\e669";
+}
+
+.icon--:before {
+  content: "\e622";
+}
+
+.icon-tushu:before {
+  content: "\e604";
+}
+
+.icon-huishouzhan:before {
+  content: "\e61c";
+}
+
+.icon-yonghutouxiang:before {
+  content: "\e617";
+}
+
+.icon-liebiao:before {
+  content: "\e630";
+}
+
+.icon-fenlei:before {
+  content: "\e621";
+}
+
+.icon-tushu1:before {
+  content: "\e605";
+}
+
+.icon-tubiao-:before {
+  content: "\e620";
+}
+
+.icon-weixuanze:before {
+  content: "\e624";
+}
+
+.icon-tushujieyue:before {
+  content: "\e690";
+}
+
+.icon-lunbo1:before {
+  content: "\e6c5";
+}
+
+.icon-shanchu:before {
+  content: "\e67b";
+}
+
+.icon-lunbo2:before {
+  content: "\e61e";
+}
+
+.icon-huaban:before {
+  content: "\e663";
+}
+
+.icon-kehuan:before {
+  content: "\e608";
+}
+
+.icon-icon02:before {
+  content: "\e601";
+}
+
+.icon-huishouzhan1:before {
+  content: "\e612";
+}
+
+.icon-huishouzhan2:before {
+  content: "\e63d";
+}
+
+.icon-sousuo:before {
+  content: "\e62c";
+}
+
+.icon-xingzhuang:before {
+  content: "\e625";
+}
+
+.icon-lunbobankuai:before {
+  content: "\e61f";
+}
+
+.icon-shangchuan:before {
+  content: "\e602";
+}
+
+.icon-yonghu:before {
+  content: "\e761";
+}
+
+.icon-tongzhi1:before {
+  content: "\e603";
+}
+
+.icon-jingsong:before {
+  content: "\e65c";
+}
+
+.icon-fenlei1:before {
+  content: "\e6c6";
+}
+
+.icon-xieshupingicon:before {
+  content: "\e72d";
+}
+
+.icon-liuyan:before {
+  content: "\e626";
+}
+
+.icon-weixuanzhong:before {
+  content: "\e627";
+}
+
+.icon-youxiang:before {
+  content: "\e646";
+}
+
+.icon-lunboguanggao:before {
+  content: "\e6b3";
+}
+
+.icon-xuanze1:before {
+  content: "\e60d";
+}
+
+.icon-chushaixuanxiang:before {
+  content: "\e606";
+}
+
+.icon-liuyanguanli1:before {
+  content: "\e61a";
+}
+
+.icon-shanchu1:before {
+  content: "\e609";
+}
+
+.icon-huishouzhan3:before {
+  content: "\e642";
+}
+
+.icon-shangchuan1:before {
+  content: "\e823";
+}
+
+.icon-huishouzhan4:before {
+  content: "\e61b";
+}
+
+.icon-chuangzuo:before {
+  content: "\e8ad";
+}
+
+.icon-dianzan:before {
+  content: "\e8ae";
+}
+
+.icon-paihangbang:before {
+  content: "\e8b3";
+}
+
+.icon-shouye:before {
+  content: "\e8b9";
+}
+
+.icon-shoucang:before {
+  content: "\e8c6";
+}
+
+.icon-addApp:before {
+  content: "\e60b";
+}
+
+.icon-huishouzhan5:before {
+  content: "\e63a";
+}
+
+.icon-add1:before {
+  content: "\e60e";
+}
+
+.icon-shoucang1:before {
+  content: "\e60f";
+}
+
+.icon-canshutongji:before {
+  content: "\e618";
+}
+
+.icon-rizhiguanli:before {
+  content: "\e628";
+}
+
+.icon-shanchu2:before {
+  content: "\e629";
+}
+
+.icon-xinzeng:before {
+  content: "\e62a";
+}
+
+.icon-zhankailiebiao:before {
+  content: "\e62b";
+}
+
+.icon-xiala-copy:before {
+  content: "\e610";
+}
+
+.icon-shangla:before {
+  content: "\e64e";
+}
+
+.icon-xianxingshezhi:before {
+  content: "\e611";
+}

+ 119 - 0
components/xiaolu-tree/css/style.scss

@@ -0,0 +1,119 @@
+.flex_between_center {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+	}
+
+	.checkbox {
+		position: relative;
+		margin-left: 10rpx;
+		margin-right: 0px;
+		.color {
+			color: #00aaff;
+			background-color: #00aaff;
+		}
+		.txt {
+			font-size: 44rpx;
+			width: 100%;
+			height: 100%;
+			display: flex;
+		}
+	}
+	.checkBorder {
+		border: 1px solid #ecdee4;
+	}
+	.header {
+		width: 100%;
+		position: fixed;
+		background-color: #fff;
+		z-index: 9999;
+		.title {
+			height: 90rpx;
+			padding: 0 32rpx;
+			line-height: 90rpx;
+			font-size: 30rpx;
+			background-color: #f5f5f5;
+			color: #606064;
+		}
+	}
+	.iconclass {
+		display: inline-block;
+		margin: 0 12rpx;
+		color: #D0D4DB;
+		font-size: 28rpx;
+	}
+	.container-list {
+		overflow-y: scroll;
+		overflow-x: hidden;
+		padding-bottom: 160rpx;
+		padding-top: 200rpx;
+		.common {
+			background-color: #fff;
+			border-bottom: 1rpx solid #f4f4f4;
+			padding-left: 10rpx;
+			.content {
+				display: flex;
+				align-items: center;
+				height: 60rpx;
+				width: 100%;
+				padding: 15rpx 0;
+				position: relative;
+				font-size: 32rpx;
+				.lable-text{
+					margin-left: 16rpx;
+					font-size: 30rpx;
+					color: #5b5757;
+					width: 500rpx;
+					word-break: break-all;
+				}
+				.right {
+					position: absolute;
+					right: 30rpx;
+					color: #babdc3;
+					font-size: 32rpx;
+				}
+			}
+		}
+	}
+	.active {
+		color: #4297ED !important;
+	}
+	.none {
+		color: #666666;
+	}
+	.icon-selected{
+		color: #0095F2!important;
+		font-size: 40rpx!important;
+	}
+	.icons{
+		color: #0095F2!important;
+		font-size: 40rpx!important;
+	}
+	.inline-item {
+		display: inline-block
+	}
+	
+	.content-item{
+		display: flex;
+		position: relative;
+		align-items: center;
+	}
+	
+	.box_sizing {
+		-webkit-box-sizing: border-box;
+		-moz-box-sizing: border-box;
+		box-sizing: border-box;
+	}
+	
+	.btn {
+		position: fixed;
+		bottom: 0;
+		padding: 10px;
+		background-color: #fff;
+		width: 100%;
+	
+		.sureBtn {
+			background-color: #0095F2;
+			color: #fff;
+		}
+	}

+ 66 - 0
components/xiaolu-tree/search/index.vue

@@ -0,0 +1,66 @@
+<template>
+	<view class="tmp-box">
+		<view class='filterBox'>
+			<view class='filter-input'>
+				<text style="color: #b8b8b8;"  class="iconfont icon-sousuo filterImg"/>
+				<input class="text" type='text' v-model="inputVal" confirm-type="搜索" @confirm='handleFllter' placeholder='搜索'></input>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				inputVal: "",
+
+			};
+		},
+		methods: {
+			handleFllter(e) {
+				// console.log(e.detail.value)
+				this.$emit("confirm", e.detail.value)
+			},
+			clears(){
+				console.log(this.inputVal)
+				this.inputVal=""
+				console.log('清除了内容')
+			}
+		},
+	}
+</script>
+
+<style lang="scss" scoped>
+	.filterBox {
+		padding: 15rpx 32rpx;
+		background-color: #fff;
+		.filter-input {
+			height: 80rpx;
+			background-color: #eeeff0;
+			border-radius: 40rpx;
+			display: flex;
+			align-items: center;
+			
+			padding-left: 40rpx;
+			.filterImg {
+				width: 32rpx;
+				height: 32rpx;
+				margin-right: 20rpx;
+				margin-bottom: 5rpx;
+			}
+			.filterImgs {
+				width: 32rpx;
+				height: 32rpx;
+				
+			}
+			.text {
+				width: 84%;
+				background-color: #eeeff0;
+				font-size: 32rpx;
+				color: #000;
+			}
+		}
+	}
+	@import url("../css/icon.css");
+</style>

+ 62 - 0
components/xiaolu-tree/tree.vue

@@ -0,0 +1,62 @@
+<template>
+	<view>
+		<view class="header">
+			<search v-if="searchIf" ref="sea" @confirm="confirmSearch" />
+			<view class="title">
+				<scroll-view scroll-x style="width: 100%;white-space: nowrap;" :scroll-left="scrollLeft">
+					<view v-for="(item,index) in tree_stack" class="inline-item" :key="index">
+						<view class="inline-item" v-if="index==0" @click="backTree(item,-1)">
+							<text :class="[(index==tree_stack.length-1&&!isre)?'none':'active']">全部</text>
+						</view>
+						<view v-if="index==0&&isre" @click="backTree(item,-2)" :class="[index==tree_stack.length-1&&isre]?'none inline-item':'active inline-item'">
+							<i class="iconfont icon-z043 iconclass" />
+							搜索结果
+						</view>
+						<view class="inline-item" @click="backTree(item,index)" v-if="index!=0">
+							<i class="iconfont icon-z043 iconclass" />
+							<text :class="index==tree_stack.length-1?'none inline-ite':'active'">
+								{{item[props.label]}}
+							</text>
+						</view>
+					</view>
+				</scroll-view>
+			</view>
+		</view>
+		<view>
+			<view class="container-list">
+				<view class="common" v-for="(item, index) in tree" @click="handleClick(item,index)" :key="index">
+					<label class="content">
+						<view class="list-item" v-show="isCheck">
+							<!-- 多选 -->
+							<view class="checkbox" v-if="props.multiple" @click.stop="handleClick(item,-1)">
+								<span v-if="isSelect(item)">
+									<i v-if="item.bx&&newCheckList.length!=0" class="iconfont icon-banxuanzhongshousuo1-shi icons" />
+									<i v-else class="iconfont icon-xuanzhong txt icon-selected" />
+								</span>
+								<i v-else-if="item.qx" class="iconfont icon-xuanzhong txt icon-selected" />
+								<i v-else-if="item.bx" class="iconfont icon-banxuanzhongshousuo1-shi icons" />
+								<i style="color: #b8b8b8;" v-else class="iconfont icon-weixuanzhong txt" />
+							</view>
+							<!-- 单选 -->
+							<view class="checkbox" v-else-if="(props.nodes?item.user?true:false:true)" @click.stop="handleClick(item,-1)">
+								<i v-if="radioSelect(item)" class="txt iconfont icon-selected" />
+								<i style="color: #b8b8b8;" v-else class="txt iconfont icon-weixuanzhong1" />
+							</view>
+						</view>
+						<view class="lable-text">{{item[props.label]}}</view>
+						<view class="right"><i v-if="!item.user&&item.children.length>0" class="iconfont icon-z043 iconclass"></i></view>
+					</label>
+				</view>
+			</view>
+		</view>
+		<view class="btn box_sizing">
+			<button class="sureBtn" type="primary" @click="backConfirm">确认</button>
+		</view>
+	</view>
+</template>
+
+<script src="./code.js" type="text/javascript"></script>
+<style lang="scss" scoped>
+	@import './css/style.scss';
+	@import url("./css/icon.css");
+</style>

+ 23 - 0
main.js

@@ -0,0 +1,23 @@
+import Vue from 'vue'
+import App from './App'
+
+import uniIcons from  '@/components/uni-icons/uni-icons.vue'
+import uniNavBar from '@/components/uni-nav-bar/uni-nav-bar.vue'
+//import uniCollapseItem from '@/components/uni-collapse-item/uni-collapse-item.vue'
+//import uniCollapse from '@/components/uni-collapse/uni-collapse.vue'
+Vue.config.productionTip = false
+
+App.mpType = 'app'
+
+const app = new Vue({
+    ...App
+})
+
+
+
+Vue.component('uni-icons',uniIcons)
+Vue.component('uni-nav-bar',uniNavBar)
+//Vue.component('uni-collapse-item',uniCollapseItem)
+//Vue.component('uni-collapse',uniCollapse)
+
+app.$mount()

+ 88 - 0
manifest.json

@@ -0,0 +1,88 @@
+{
+    "name" : "绩效考核",
+    "appid" : "__UNI__9A7009A",
+    "description" : "",
+    "versionName" : "1.0.0",
+    "versionCode" : "100",
+    "transformPx" : false,
+    /* 5+App特有相关 */
+    "app-plus" : {
+        "usingComponents" : true,
+        "nvueCompiler" : "uni-app",
+        "compilerVersion" : 3,
+        "splashscreen" : {
+            "alwaysShowBeforeRender" : true,
+            "waiting" : true,
+            "autoclose" : true,
+            "delay" : 0
+        },
+        /* 模块配置 */
+        "modules" : {},
+        /* 应用发布信息 */
+        "distribute" : {
+            /* android打包配置 */
+            "android" : {
+                "permissions" : [
+                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>",
+                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+                    "<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
+                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+                    "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
+                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+                    "<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
+                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera\"/>",
+                    "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
+                ]
+            },
+            /* ios打包配置 */
+            "ios" : {},
+            /* SDK配置 */
+            "sdkConfigs" : {}
+        }
+    },
+    /* 快应用特有相关 */
+    "quickapp" : {},
+    /* 小程序特有相关 */
+    "mp-weixin" : {
+        "appid" : "",
+        "setting" : {
+            "urlCheck" : false
+        },
+        "usingComponents" : true
+    },
+    "mp-alipay" : {
+        "usingComponents" : true
+    },
+    "mp-baidu" : {
+        "usingComponents" : true
+    },
+    "mp-toutiao" : {
+        "usingComponents" : true
+    },
+    "uniStatistics" : {
+        "enable" : false
+    },
+    "vueVersion" : "2",
+    "h5" : {
+        "devServer" : {
+            "https" : false,
+            "port" : 80
+        },
+        "router" : {
+            "base" : "jxkh-mobile"
+        }
+    }
+}

+ 5 - 0
package.json

@@ -0,0 +1,5 @@
+{
+  "dependencies": {
+    "scss": "^0.2.4"
+  }
+}

+ 178 - 0
pages.json

@@ -0,0 +1,178 @@
+{
+	"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
+		
+		{
+			"path": "pages/work_log/work_log",
+			"style": {
+				"navigationBarTitleText": "绩效考核",
+				"navigationStyle": "custom",
+//				"navigationBarBackgroundColor": "#FFFFFF",
+//				"backgroundColor": "#FFFFFF",
+				"enablePullDownRefresh": false,
+				"app-plus": {
+					"titleNView": false,
+					"bounce": "none",
+					"pullToRefresh": {
+						"style": "circle",
+						"offset": "70px"
+					}
+				}
+			}
+		},
+		{
+			"path":"pages/daily_report_statistics/daily_report_statistics",
+			"style": {
+				"navigationBarTitleText": "绩效考核",
+				"navigationStyle": "custom",
+				"enablePullDownRefresh": false,
+				"app-plus": {
+					"titleNView": false,
+					"bounce": "none",
+					"pullToRefresh": {
+						"style": "circle",
+						"offset": "70px"
+					}
+				}
+			}
+		}
+		,
+		{
+			"path":"pages/employee_list/employee_list",
+			"style": {
+				"navigationBarTitleText": "绩效考核",
+				"navigationStyle": "custom",
+				"enablePullDownRefresh": false,
+				
+				"app-plus": {
+					"titleNView": false,
+					"bounce": "none",
+					"scrollIndicator":"false",
+					"pullToRefresh": {
+						"style": "circle",
+						"offset": "70px"
+					}
+				}
+			}
+		}
+		,
+		{
+			"path":"pages/daily_comment_score/daily_comment_score",
+			"style": {
+				"navigationBarTitleText": "绩效考核",
+				"navigationStyle": "custom",
+				"enablePullDownRefresh": false,
+				"app-plus": {
+					"titleNView": false,
+					"bounce": "none",
+					"pullToRefresh": {
+						"style": "circle",
+						"offset": "70px"
+					}
+				}
+			}
+		}
+		,
+		{
+			"path":"pages/month_comment_score/month_comment_score",
+			"style": {
+				"navigationBarTitleText": "绩效考核",
+				"navigationStyle": "custom",
+				"enablePullDownRefresh": false,
+				"app-plus": {
+					"titleNView": false,
+					"bounce": "none",
+					"pullToRefresh": {
+						"style": "circle",
+						"offset": "70px"
+					}
+				}
+			}
+		},
+		{
+			"path":"pages/daily_report_detail/daily_report_detail",
+			"style": {
+				"navigationBarTitleText": "绩效考核",
+				"navigationStyle": "custom",
+				"enablePullDownRefresh": false,
+				"app-plus": {
+					"titleNView": false,
+					"bounce": "none",
+					"pullToRefresh": {
+						"style": "circle",
+						"offset": "70px"
+					}
+				}
+			}
+		},
+		{
+			"path":"pages/employee_daily_report/employee_daily_report",
+			"style": {
+				"navigationBarTitleText": "绩效考核",
+				"navigationStyle": "custom",
+				"enablePullDownRefresh": false,
+				"app-plus": {
+					"titleNView": false,
+					"bounce": "none",
+					"pullToRefresh": {
+						"style": "circle",
+						"offset": "70px"
+					}
+				}
+			}
+		},
+		{
+			"path":"pages/fill_log/fill_log",
+			"style": {
+				"navigationBarTitleText": "绩效考核",
+				"navigationStyle": "custom",
+				"enablePullDownRefresh": false,
+				"app-plus": {
+					"titleNView": false,
+					"bounce": "none",
+	//				"softinputMode": "adjustResize",
+					"pullToRefresh": {
+						"style": "circle",
+						"offset": "70px"
+					}
+				}
+			}
+		},
+		{
+			"path" : "pages/month_log/month_log",
+			
+			"style": {
+						"navigationBarTitleText": "工作总结",
+						"navigationStyle": "custom",
+						"enablePullDownRefresh": false,
+						"app-plus": {
+							"titleNView": false,
+							"bounce": "none",
+			//				"softinputMode": "adjustResize",
+							"pullToRefresh": {
+								"style": "circle",
+								"offset": "70px"
+							}
+						}
+					}
+		}
+	],
+	"globalStyle": {
+		"navigationBarTextStyle": "white",
+		"navigationBarTitleText": "绩效考核",
+		"navigationBarBackgroundColor": "#FFFFFF",
+		"backgroundColor": "#FFFFFF",
+		"app-plus":{
+		            "scrollIndicator":"none" //全局 在APP页面都不显示滚动条
+		        }
+	},
+	"condition" : { //模式配置,仅开发期间生效
+		"current": 0, //当前激活的模式(list 的索引项)
+		"list": [
+			{
+				"name": "", //模式名称
+				"path": "", //启动页面,必选
+				"query": "" //启动参数,在页面的onLoad函数里面得到
+			}
+		]
+	}
+}

+ 1192 - 0
pages/daily_comment_score/daily_comment_score.vue

@@ -0,0 +1,1192 @@
+<template>
+	<view class="page-box">
+		<view class="head-box">
+			<uni-nav-bar id="header_nav" left-icon="arrowleft" type="line" title="日评打分"  @clickLeft="back" />			
+		</view>
+		<form   @submit="formsubmit">
+		<view class="content-box">
+			 <view>
+				<view class="pa_row pa-sb h-mid bg_whilecolor mb-1 a-center border-bottom mx-1"  >
+					<view class="mx-1">
+						<label class="mark_color font-weight">*</label>
+						<label class="font-weight">针对员工</label>				
+					</view>
+					<view class="pa_row w-30">
+						<uniRightCombox class="w-100 m-0 p-0" ref="logtype"  :candidates="employees"  :value="employee.name" @update:modelValue="onEmplyeeClick"></uniRightCombox>
+						
+						
+						<!--<label class="pr-1 font-weight" @click="toggleSelector">{{employee.name}}<uni-icons color="#C8C8C8" type="arrowright"/></label> -->
+					</view>
+ 
+ 
+				</view>
+				
+				<view class="pa_row pa-sb h-mid bg_whilecolor mx-1 a-center"  >
+					<view class="mx-1">
+						<label class="mark_color font-weight">*</label>
+						<label class="font-weight">针对日期</label>				
+					</view>
+					<view class="pa_row">
+						<label class="pr-1 font-weight" @click="open">{{dateweek}}<uni-icons color="#C8C8C8" type="arrowright"/></label> 
+					</view>
+				</view>				 
+			 </view>
+			 <view class="pt-1 border-top-10" v-for="(item,index) in projects" :key="index">
+				 <view>
+					 <label class="pl-1 font-weight font_sm">{{item.name}}
+					 <label v-show="item.score>0">:{{item.score}}分</label></label>					 
+				 </view>
+				 
+				 <view class="px-1" v-show="item.type==2">
+					 <view class="pa_column pb-1" :class="{border_bottom_1:index1<(item.items.length-1)}" v-for="(item1,index1) in item.items" :key="index1">
+						 <view class="pa_row pa-sb">
+							 
+									 <label class="radio a-center j-center ">
+										 {{item1.text}}({{item1.unit}})
+									 </label>																  
+						 </view>
+						 <view class="pa_row pa-sb" >
+							  <slider-number :ref="item1.id" :name="item1.text" :id="item1.id" :min="item1.slider_min" :max="item1.slider_max" :step="item1.slider_step" v-model="item1.value" @onChange="calc_score"></slider-number>
+						 </view>										    
+					 </view>
+				 </view>				 
+				 <view class="px-1" v-show="item.type==1">
+					<!-- <radio-group @change="changed">			-->				 
+						 <view class="pa_column   pb-1 " :class="{border_bottom_1:index1<(item.items.length-1)}" v-for="(item1,index1) in item.items" :key="index1">
+							 <view class="pa_row pa-sb">
+								 <view class="w-85">
+									 <view class="h-100 pa_column j-center">
+										 <label class="radio a-center j-center " >
+											 {{item1.text}}{{item1.unit}}	
+<!--											<radio :value="item1.id.toString()" :checked="item.selectedIndex == item1.id"  @click="_group_clicked(item1.id)" />{{item1.text}}-->
+										 </label>								 
+									 </view>
+								 </view>
+								 <view class="w-15">
+									<input type="number" :id="item1.id" class="uni-input bg-grey my-1 rounded-10" @input="onKeyInput"  v-model="item1.value" 
+										:class="{textred:item1.value<0,
+										textgrey:item1.value>=0}"/>								 
+								 </view>
+							 </view>												
+						 </view>
+					<!--</radio-group>-->						 
+				 </view>
+ 
+			 </view>
+ 
+		</view>
+
+		<view class="footer-box">
+			<view class="pa_row a-center h-100">		
+				<view class="w-50">
+					<label class="font-sm lh_footer mx-2" >得分:</label>
+					<label class="font-sm lh_footer">{{score.toFixed(2)}}</label>					
+				</view>
+				<button  form-type="submit" class="w-50 btn_bgcolor btn_color">提交</button>			
+			</view>
+		</view>
+		</form>
+		<uni-calendar ref="calendar" @change="change" class="uni-calendar--hook" :clear-date="true" :date="info.date" :insert="info.insert" :lunar="info.lunar" :startDate="info.startDate" :endDate="info.endDate" :range="info.range" @confirm="confirm" @close="close" />		
+		
+	</view>
+</template>
+
+<script>
+	import utils from '../../utils/common.js'
+	import store from '../../utils/store.js'
+	
+	import RenCalendar from '@/components/ren-calendar/ren-calendar.vue'
+	import uniRightCombox from '@/components/uni-right-combox/uni-right-combox.vue'
+	import uniNumberBox from '@/components/uni-number-box/uni-number-box.vue' 
+	import sliderNumber from '@/components/slider-number/slider-number.vue'
+	var _self;
+	export default {
+		components:{
+		    RenCalendar,
+			uniRightCombox,
+			uniNumberBox,
+			sliderNumber
+		},
+		data() {
+			return { 
+				showSelector:false,
+				
+				kpi_url:'',
+				template:'',
+				calendar:'',
+				workNums:0,
+				score:0,
+				info: {
+					lunar: true,
+					range: true,
+					insert: false,
+					date:utils.get_date_str(new Date()),
+					startDate:utils.get_date_str(utils.addMonth(new Date(),-1)),
+					endDate:utils.get_date_str(utils.addMonth(new Date(),1)),
+					selected: []
+				},
+				level:0,
+				submit_projects:[],
+				projects:[
+					],
+				dtl:[ 
+				],
+				employee:{id:'0',name:'李广宵'},
+				employees:[{id:'1',value:'zhupeng'},
+				{id:'2',value:'zhupeng2'},
+				{id:'3',value:'zhupeng3'},
+				{id:'4',value:'zhupeng4'},
+				{id:'5',value:'zhupeng5'}],
+				year:new Date().getFullYear(),
+				month:new Date().getMonth()+1,
+				day:new Date().getDate()
+				//dateweek:'2021-10-01 星期一'
+			}
+		},
+		onLoad()
+		{
+			_self = this;
+
+			//console.log('xxx'+this.info.date);
+			
+			//console.log('kpi_url'+this.kpi_url)
+			this.kpi_url=  uni.getStorageSync('kpi-url');
+			this.employeeID =  uni.getStorageSync('usId');
+			if(!this.employeeID || this.employeeID.length<=0)
+			{
+				uni.showToast({
+				    title: '未设置员工ID',
+											  icon: 'error',
+				    duration: 2000
+				}); 
+				return;
+			}			
+			this.refreshEmployeeList();
+			
+			_self.onActivate();
+			return;
+			console.log("onLoad");
+				
+			let date = new Date();
+			this.year = date.getFullYear();
+			this.month = date.getMonth()+1;
+			this.day = date.getDate();
+			
+			this.settingDate(this.year,this.month,this.day);
+			
+		},
+		activated()
+		{
+		    _self.onActivate();					
+ 		},
+		onReady()
+		{
+			
+			//this.LoadKpiTemplate(this.employeeID);
+		},
+		
+		computed: {
+		    // 顶部星期栏
+		    dateweek() {
+				let  str  = utils.get_date_week_str(new Date(this.year,this.month-1,this.day));
+				//console.log('xxxxxxxxxx'+str);
+		        return str;
+		    } 
+		},
+		methods:
+		{
+			onActivate()
+			{
+				// #ifdef APP-NVUE
+				const eventChannel = this.$scope.eventChannel; // 兼容APP-NVUE
+				// #endif
+				// #ifndef APP-NVUE
+				const eventChannel = this.getOpenerEventChannel();
+				// #endif
+				eventChannel.on('acceptDataFromOpenerPage', function(data) {
+					   if(data)
+					   {
+						   
+							let param = data.data;
+						   if(param)
+						   {
+							   //console.log('month score activated'+JSON.stringify(data));
+							   //return;
+							   if(param.action && param.action=='employee_daily_report')
+							   {
+								   if(param.month)
+								   {
+									   let year = Number(param.month.substr(0,4));
+									   let month = Number(param.month.substr(5,2));
+									   _self.year = year;
+									   _self.month = month;
+									   _self.day = 1;
+									   _self.info.startDate = utils.get_date_str(utils.addMonth(new Date(year,month-1,1),-1));
+									   _self.info.date = utils.get_date_str(new Date(year,month-1,1));
+									   _self.info.endDate= utils.get_date_str(utils.addMonth(new Date(year,month-1,1),1));
+									   //console.log('year'+_self.year+'month'+_self.month);
+								   }
+								   if(param.employee)
+								   {
+									   _self.employee = param.employee;//{id:param.,name:'李广宵'}, 
+									   _self.LoadKpiTemplate(_self.employee.id,_self.employeeID);
+									   return true;
+								   }
+									
+							   }else if(param.action && param.action=='daily_report_detail')
+							   {
+								   //{"data":{"action":"daily_report_detail","year":"2021","month":"09","day":"30","id":102,"name":"徐邱"}} 
+								   //return;
+								   //console.log("param " + JSON.stringify(param))
+								   if(param.year && param.month &&  param.day)
+								   {
+									   //let year = Number(param.month.substr(0,4));
+									   //let month = Number(param.month.substr(5,2));
+									   _self.year = Number(param.year);
+									   _self.month = Number(param.month);
+									   _self.day = Number(param.day);
+									   _self.info.startDate = utils.get_date_str(utils.addMonth(new Date(_self.year,_self.month-1,1),-1));
+									   _self.info.date = utils.get_date_str(new Date(_self.year,_self.month-1,_self.day));
+									   _self.info.endDate= utils.get_date_str(utils.addMonth(new Date(_self.year,_self.month-1,1),1));
+									   //console.log('time year'+_self.year+'month'+_self.month+'day'+_self.day);
+								   }
+								   if(param.id && param.name)
+								   {
+									   _self.employee = {id:param.id,name:param.name}, 
+									   //console.log('kpi date'+_self.info.date)
+									   _self.LoadKpiTemplate(_self.employee.id,_self.employeeID);
+									   return true;
+								   }
+							   }
+						   }
+					   }
+				});
+				return false; 
+			},
+			onEmplyeeClick(data)
+			{
+				if(data.id && data.value)
+				{
+					this.employee = {id:data.id,name:data.value};
+					this.LoadKpiTemplate(this.employee.id,this.employeeID);
+					
+				}
+				
+				//console.log('data'+JSON.stringify(data));
+			},
+			onKeyInput: function(event) {
+				//console.log('input id'+ event.target.value);
+				//this.inputValue = event.target.value
+				//console.log('input id ' + event.target.id);
+				let itemIndex = this.findDtlById(event.target.id);
+				if(itemIndex>=0)
+				{
+					let projectIndex = this.findProjectById(this.dtl[itemIndex].fid); 
+					if(projectIndex>=0)
+					{
+					    for(let i = 0;i< this.projects[projectIndex].items.length;i++)
+						{
+							if(this.projects[projectIndex].items[i].id == event.target.id)
+							{
+								//console.log('单位最大值'+ this.projects[projectIndex].items[i].unitvalue);
+								let maxvalue = this.projects[projectIndex].items[i].multiple;
+								if(maxvalue>0)
+								{
+									//console.log('xxxx')
+									if(Number(event.target.value) >maxvalue){
+										this.projects[projectIndex].items[i].value = this.workNums;
+										//console.log('11xxxx' + this.projects[projectIndex].items[i].value)
+									}
+									else{
+										if(Number(event.target.value) < 0){
+											this.projects[projectIndex].items[i].value = 0;
+											//console.log('22xxxx')
+										}
+									}
+									
+								}
+							}
+						}
+					}
+				}
+				
+				this.calc_score();
+			},
+			 
+			open() {
+				this.$refs.calendar.open()
+				 
+			},
+			findDtlByName(projectIndex,name)
+			{
+				if(projectIndex>=this.projects.length)
+					return -1;
+					
+				for(let i = 0;i<this.projects[projectIndex].items.length;i++)
+				{
+					if(this.projects[projectIndex].items[i].text == name)
+						return i;
+				}
+				return -1;
+			},
+			findProjectByName(name)
+			{
+				for(let i = 0;i<this.projects.length;i++)
+				{
+					if(this.projects[i].name == name)
+						return i;
+				}
+				return -1;
+			},
+			findDtlById(id)
+			{
+				for(let i = 0;i<this.dtl.length;i++)
+				{
+					if(this.dtl[i].id == id)
+						return i;
+				}
+				return -1;
+			},
+			findProjectById(id)
+			{
+				for(let i = 0;i<this.projects.length;i++)
+				{
+					if(this.projects[i].id == id)
+						return i;
+				}
+				return -1;
+			},
+			clicked:function(_id)
+			{
+				//console.log('clicked' +_id)
+				let itemIndex = this.findDtlById(_id);
+				if(itemIndex<0)
+				{
+					//console.log('not find dtl index '+_id);
+					return;
+				}
+				let projectIndex = this.findProjectById(this.dtl[itemIndex].fid); 
+				if(projectIndex<0)
+				{
+					//console.log('not find project index '+this.dtl[itemIndex].fid);
+					return;
+				}
+				//console.log('log Index : '+itemIndex +'project Index: ' +projectIndex)
+				//return;
+				for (let i = 0; i < this.projects[projectIndex].items.length; i++) {
+					//console.log('id:'+this.projects[projectIndex].items[i].id);
+					if (this.projects[projectIndex].items[i].id === _id) {
+						//console.log('find item'+ _id)
+						this.projects[projectIndex].items[i].checked = !this.projects[projectIndex].items[i].checked;
+						break;
+					}
+				}
+				this.calc_score();
+			},
+			_group_clicked:function(_id)
+			{
+				//console.log('_group_clicked ' +_id )
+				let itemIndex = this.findDtlById(_id);
+				if(itemIndex<0)
+				{
+					//console.log('not find dtl index '+_id);
+					return;
+				}
+				let projectIndex = this.findProjectById(this.dtl[itemIndex].fid); 
+				if(projectIndex<0)
+				{
+					//console.log('not find project index '+this.dtl[itemIndex].fid);
+					return;
+				}
+				
+				//console.log('selectedIndex : '+this.projects[projectIndex].selectedIndex )
+				//return;
+				if(this.projects[projectIndex].selectedIndex== _id)
+				{
+					for (let i = 0; i < this.projects[projectIndex].items.length; i++) {
+						//console.log('id:'+this.projects[projectIndex].items[i].id);
+						if (this.projects[projectIndex].items[i].id == _id) {
+							//console.log('find item'+ _id)
+							if(this.projects[projectIndex].selectedIndex == _id)
+							{
+								console.log('unselected:'+_id);
+								this.projects[projectIndex].selectedIndex = -1;
+							} 
+							this.projects[projectIndex].items[i].checked = false;														
+						}
+					}
+					
+				}else
+				{
+					for (let i = 0; i < this.projects[projectIndex].items.length; i++) {
+						//console.log('id:'+this.projects[projectIndex].items[i].id);
+						if (this.projects[projectIndex].items[i].id == _id) {
+							this.projects[projectIndex].selectedIndex = _id;
+							this.projects[projectIndex].items[i].checked = true;							
+						}else
+						{
+							//this.projects[projectIndex].selectedIndex = -1;
+							this.projects[projectIndex].items[i].checked = false;														
+							
+						}
+					}
+					
+				}
+				this.calc_score();
+			},
+			changed:function(evt)
+			{
+				//console.log('changed' +evt.detail.value)
+				let itemIndex = this.findDtlById(evt.detail.value);
+				if(itemIndex<0)
+				{
+					//console.log('not find dtl index '+evt.detail.value);
+					return;
+				}
+				let projectIndex = this.findProjectById(this.dtl[itemIndex].fid); 
+				if(projectIndex<0)
+				{
+					//console.log('not find project index '+this.dtl[itemIndex].fid);
+					return;
+				}
+				//console.log('log Index : '+itemIndex +'project Index: ' +projectIndex + )
+				//return;
+				for (let i = 0; i < this.projects[projectIndex].items.length; i++) {
+					//console.log('id:'+this.projects[projectIndex].items[i].id);
+					if (this.projects[projectIndex].items[i].id.toString() === evt.detail.value) {
+						//console.log('find item'+ evt.detail.value)
+						if(!this.projects[projectIndex].items[i].checked)
+						{
+							this.projects[projectIndex].selectedIndex = evt.detail.value;
+							this.projects[projectIndex].items[i].checked = true;							
+						}else
+						{
+							this.projects[projectIndex].selectedIndex = -1;
+							this.projects[projectIndex].items[i].checked = false;														
+						}
+						//this.projects[projectIndex].items[i].checked = !this.projects[projectIndex].items[i].checked;
+						//break;
+					}else{
+						this.projects[projectIndex].items[i].checked = false;
+					}
+				}
+			},
+			/*updateUnitValue()
+			{
+				return;
+				if(this.projects)
+				{
+					  for(let index = 0;index<this.projects.length;index++)
+					  {
+						 
+						  for(let index1 = 0;index1<this.projects[index].items.length;index1++)
+						  {
+							  let text = this.projects[index].items[index1].text;
+							  
+							  if(this.projects[index].name =='工作量')
+							  {
+								 if(text.indexOf('工作量分')>=0)
+								 {
+									  console.log('jjj' + JSON.stringify(this.projects[index].items[index1]))
+									  let score = this.projects[index].score/this.workNums;
+									  this.projects[index].items[index1].score = score.toFixed(1);
+									  this.projects[index].items[index1].unit = '天'
+									  //this.projects[index].items[index1].unit = score;
+									  this.projects[index].items[index1].memo = this.workNums +'个工作日 ' + score.toFixed(2) + '分/天';
+								 }
+							  }
+							  if(this.projects[index].name =='工作质量')
+							  {
+								  if(text.indexOf('质量分')>=0)
+								  {
+									  //console.log('yyyy')
+									  let score = this.projects[index].score/this.workNums;
+									  this.projects[index].items[index1].score = score.toFixed(1);
+									  this.projects[index].items[index1].unit = '天'
+									  //this.projects[index].items[index1].unit = score;
+									  this.projects[index].items[index1].memo = this.workNums +'个工作日 ' + score.toFixed(2) + '分/天';
+								  }
+							  }
+							  if(this.projects[index].name =='工作态度')
+							  {
+								  if(text.indexOf('态度分')>=0)
+								  {
+									  //console.log('yyyy')
+									  let score = this.projects[index].score/this.workNums;
+									  this.projects[index].items[index1].score = score.toFixed(1);
+									  this.projects[index].items[index1].unit = '天'
+									  //this.projects[index].items[index1].unit = score;
+									  this.projects[index].items[index1].memo = this.workNums +'个工作日 ' + score.toFixed(2) + '分/天';
+								  }
+							  }
+							  
+							  //console.log('zzz')
+						  } 
+					  
+					  }													  
+				}
+			},
+			
+			LoadWorkLog(_year,_month)
+			{
+				_self.updateUnitValue();
+				return;
+				let workMonth = 'WorkDays_' +_year.toString() +'-' + utils.formatNum(_month);
+				let workDays = uni.getStorageSync(workMonth);
+				if(workDays)
+				{
+					_self.workNums = workDays;
+					_self.updateUnitValue();
+					console.log('读取工作天数:'+workMonth + ':'+workDays);
+					return;
+				}
+				
+				uni.request({
+					url: 'https://xpgjapi.xiaoxinda.com/mobile/workAttendance/queryMonthWorkDays',//'http://192.168.77.99:8080/api/loadMonthWorkSummary.do',//?workNum='+this.employeeNumber+'&workMonth='+this.workMonth, //仅为示例,并非真实接口地址。
+					data:{year:_year,month:_month},
+					method:'POST',
+					timeout:20000,
+				    header: {
+					  'content-type': 'application/x-www-form-urlencoded' //自定义请求头信息
+				    },
+					success: (res) => {
+						
+						if(res.statusCode==200)
+						{
+							if(res.data)
+							{
+								_self.workNums = res.data;								
+								uni.setStorageSync(workMonth,_self.workNums);
+								//console.log('result:' +JSON.stringify(res));
+								_self.updateUnitValue();
+								console.log('读取工作天数【'+workMonth + ':'+JSON.data(_self.workNums));
+								//console.log('res'+this.workNums);
+								return ; 
+								
+							}
+						}					  
+					},
+					fail:(res)=>{
+						 console.log('LoadWorkLog requrest failed')
+						 console.log(res);
+						 uni.showModal({
+							title:'提示',
+							content:'请求工作天数失败,请检查网络!',
+							showCancel:false
+						 })
+						
+						 
+					},
+					complete:()=>{
+						uni.hideLoading();
+					}
+				});
+			},*/
+			sortByIndex(index,name)
+			{
+				let destIndex = index;
+				for(;index < this.projects.length;index++)
+				{
+					if(this.projects[index].name==name)
+					{
+						let temp = this.projects[index];
+						this.projects[index] = this.projects[destIndex];
+						this.projects[destIndex] = temp;
+						return destIndex;
+					}
+				}
+				return -1;				
+			},
+			filter_item(item)
+			{
+				let _item = Object.assign({},item);
+				_item.items = [];
+				//let _item = {fid:item.fid,is_month_assess:item.is_month_assess,score:item.score,del_flag:item.del_flag,name:item.name,is_day_assess:item.is_day_assess,id:item.id,type:item.type,is_multiple:item.is_multiple,items:[]};
+				for(let j=0;j<item.items.length;j++)
+				{
+					if(item.items[j].is_day_assess)
+					{
+						_item.items.push(item.items[j]);
+					}
+				}
+				//console.log('item'+JSON.stringify(_item));
+				return _item;
+			},
+			LoadKpiTemplate(_usId,_evalUsId)
+			{
+				//console.log('读取考勤模板usId ' + _usId + ' evalUsId '+_evalUsId+'assessMonth'+this.info.date)
+				 
+				uni.request({
+					url: this.kpi_url+ '/api/loadDayAssessTemplate.do',//'http://192.168.77.99:8080/api/loadMonthWorkSummary.do',//?workNum='+this.employeeNumber+'&workMonth='+this.workMonth, //仅为示例,并非真实接口地址。
+					data:{usId:_usId,evalUsId:_evalUsId,assessMonth:this.info.date},
+					method:'GET',
+					timeout:20000,
+				   /*header: {
+					  'content-type': 'application/x-www-form-urlencoded' //自定义请求头信息
+				  },*/
+					success: (res) => {
+					  //console.log('xxxres'+JSON.stringify(res.data));
+						 
+					   if(res.data.success){
+						  
+						  if(res.data.data)
+						  {
+							  if(res.data.data.level)
+							  {
+								  _self.level = res.data.data.level;
+								  //console.log('level'+_self.level);
+							  }
+							  if(res.data.data.projects)
+							  {
+								  this.projects = [];
+								  for(let i = 0;i < res.data.data.projects.length;i++)
+								  {
+									  let item = _self.filter_item(res.data.data.projects[i]);
+									  //let project = {fid:item.fid,id:item.id,name:item.name,type:item.type,selectedIndex:-1,score:item.score,checked:false,value:0,text:'',items:[]};
+									  if(item.items.length>0)
+										_self.projects.push(item);
+									  //console.log('item'+JSON.stringify(item));
+								  }
+								  let destIndex = -1;
+								  destIndex = _self.sortByIndex(destIndex+1,'工作量');
+								  destIndex = _self.sortByIndex(destIndex+1,'工作质量');
+								  destIndex = _self.sortByIndex(destIndex+1,'工作态度');
+								  destIndex = _self.sortByIndex(destIndex+1,'出勤情况');
+								   
+							  }
+							   
+								  
+							  _self.refreshDayAssess(_self.year,_self.month,_self.day);	 
+						  }
+						  /**this.work_logs = res.data.data;
+							
+							if(this.work_logs)
+							{
+//								console.log('xxxxx'+JSON.stringify(this.work_logs));
+								for(let i = 0;i< this.work_logs.length;i++)
+								{
+									//console.log('i'+i+JSON.stringify(this.work_logs[i]));
+									if(this.work_logs[i].summaryLen>0)
+										this.$refs.ren.set_status_by_datestr1(this.work_logs[i].workDate,1);
+									else
+										this.$refs.ren.set_status_by_datestr1(this.work_logs[i].workDate,3);
+									
+								} 
+							}*/
+										 
+					   }
+					   else{
+						  /*console.log('fail')
+						  uni.showToast({
+							  title: res.data.exception,
+							  icon: 'error',
+							  duration: 2000
+						  });*/ 
+					   }
+					  
+					},
+					fail:(res)=>{
+						 /*console.log('requrest failed')
+						 console.log(res);
+						 uni.showModal({
+							title:'提示',
+							content:'请求服务失败,请检查网络!',
+							showCancel:false
+						 })*/
+						
+						 
+					},
+					complete:()=>{
+						uni.hideLoading();
+					}
+				});
+			}, 
+			settingDate(_year,_month,_day)
+			{ 
+				
+				let date = new Date(_year,_month-1,_day);
+				let nextMonth = utils.addMonth(date,1);
+				let previousMonth = utils.addMonth(date,-1);
+				
+				this.info.date = date.getFullYear().toString()+'-'+utils.formatNum(date.getMonth()+1)+'-'+ utils.formatNum(date.getDate());
+				this.info.startDate = previousMonth.getFullYear().toString()+'-'+utils.formatNum(previousMonth.getMonth()+1)+'-'+ utils.formatNum(previousMonth.getDate());
+				this.info.endDate = nextMonth.getFullYear().toString()+'-'+utils.formatNum(nextMonth.getMonth()+1)+'-'+ utils.formatNum(nextMonth.getDate());
+				 
+				
+				//this.info.date = _year + '-' + utils.formatNum(_month)+ utils.formatNum(_day);
+				//
+				//let startDate = utils.addMonth(date,1);
+				//let endDate = utils.addMonth(date,-1);
+				//this.info.startDate = startDate.getFullYear() + '-' + utils.formatNum(startDate.getMonth()+1)+ utils.formatNum(startDate.getDate());
+				//this.info.endDate = endDate.getFullYear() + '-' + utils.formatNum(endDate.getMonth()+1)+ utils.formatNum(endDate.getDate());
+
+ 			},
+			confirm(e) {
+				//console.log('xxxxxx'+ e.fulldate);
+				//return ;
+				let year = e.fulldate.substr(0,4);
+				let month = e.fulldate.substr(5,2);
+				let day = e.fulldate.substr(8,2);
+				this.year = year;
+				this.month = month;
+				this.day = day;
+				this.settingDate(year,month,day);
+				this.refreshDayAssess(year,month,day);
+				return ;
+				 
+			}, 
+			change(e){
+				//console.log('change'+e);
+			},
+			close() {
+				//console.log('弹窗关闭');
+			},
+			back() {
+				console.log('test')
+				uni.navigateBack({
+					delta: 1
+			})
+			},
+			refreshDayAssess(_year,_month,_day)
+			{
+				
+				let workMonth = _year.toString()+'-'+utils.formatNum(_month) +'-'+ utils.formatNum(_day);
+				//console.log('id:'+this.employee.id);
+				//console.log('evaUsrID:'+this.employeeID);
+				//console.log('workMonth:'+workMonth);
+				let loadMonthAssess = false;
+				_self.disabled= false;
+				uni.request({
+				    url: this.kpi_url+ '/api/loadDayAssess.do',//'http://192.168.77.99:8080/api/loadMonthWorkSummary.do',//?workNum='+this.employeeNumber+'&workMonth='+this.workMonth, //仅为示例,并非真实接口地址。
+				    data:{usId:this.employee.id,evaUsId:this.employeeID,assessMonth:workMonth},
+					method:'GET',
+					timeout:20000,
+				    
+				    success: (res) => {
+						//console.log('读取月评:'+JSON.stringify(res.data));
+						//return;
+						
+				       if(res.data.success){
+						  
+							//console.log('dddd'+JSON.stringify(res))
+						    if(res.data.data)
+							{
+								if(res.data.data.list)
+								{
+									let items = res.data.data.list;
+									
+									for(let i = 0;i< items.length;i++)
+									 {
+										 let index = _self.findProjectByName(items[i].title);
+										 if(index<0)
+											continue;
+										 //console.log('find project'+items[i].title);	
+										 for(let j=0;j<items[i].children.length;j++)
+										 {
+											 let itemIndex = _self.findDtlByName(index,items[i].children[j].title);
+											 
+											 if(itemIndex>=0)
+											 {
+												 //console.log('find dtl'+items[i].children[j].title);
+												 _self.projects[index].items[itemIndex].checked = true;
+												 _self.projects[index].selectedIndex = itemIndex;
+												 _self.projects[index].items[itemIndex].data_id = items[i].children[j].id;
+												 _self.projects[index].items[itemIndex].value = items[i].children[j].unitScore;
+												 //_self.projects[index].items[itemIndex].value = 3.3
+											 	 //console.log('id '+ _self.projects[index].items[itemIndex].id);
+												 //let element = document.getElementById(_self.projects[index].items[itemIndex].id);
+												 //if(element)
+												//	element.data1 = items[i].children[j].unitScore;
+												// console.log('object'+ JSON.stringify(this.$refs[_self.projects[index].items[itemIndex].id]))
+												 //console.log('item'+JSON.stringify(_self.projects[index].items[itemIndex]))								 
+											 }
+										 }
+
+									 }
+									 if(!items || items.length==0)
+									 {
+										   //console.log('fail xxxx')
+										   for(let i = 0;i < _self.projects.length;i++)
+										   {
+												_self.projects[i].selectedIndex = -1;
+												//console.log('xxx fail xxxx')
+												for(let j = 0;j<_self.projects[i].items.length;j++)
+												{
+													_self.projects[i].items[j].checked = false;
+												}
+										   }
+																//console.log('failed failed')
+									 } 
+									 _self.calc_score();
+									 loadMonthAssess = true;
+								}
+								
+							}
+										 
+					   }
+					   else{
+					   console.log('fail refreshDayAssess')
+						  uni.showToast({
+						      title: res.data.exception,
+							  icon: 'error',
+						      duration: 2000
+						  }); 
+					   }
+					   
+					   
+				      
+				    },
+					fail:(res)=>{
+						console.log('requrest failed refreshDayAssess')
+						 console.log(res);
+						 uni.showModal({
+						 	title:'提示',
+							content:'请求服务失败,请检查网络!',
+							showCancel:false
+						 })
+						
+						 
+					},
+					complete:()=>{
+						//uni.hideLoading();
+						/*_self.LoadWorkLog(this.year,this.month);
+						if(!loadMonthAssess)
+						{
+							if(!items || items.length==0)
+							{
+									   //console.log('fail xxxx')
+									   for(let i = 0;i < _self.projects.length;i++)
+									   {
+											_self.projects[i].selectedIndex = -1;
+											//console.log('xxx fail xxxx')
+											for(let j = 0;j<_self.projects[i].items.length;j++)
+											{
+												_self.projects[i].items[j].checked = false;
+											}
+									   }
+							//console.log('failed failed')
+							} 
+							_self.score= _self.calc_score();
+						}*/
+						
+					}
+				});
+			},
+			refreshEmployeeList()
+			{ 
+				//console.log('url'+this.kpi_url+' usId' + this.employeeID)  
+				uni.request({
+				    url: this.kpi_url+ '/api/loadNeedAssessUsers.do',//'http://192.168.77.99:8080/api/loadMonthWorkSummary.do',//?workNum='+this.employeeNumber+'&workMonth='+this.workMonth, //仅为示例,并非真实接口地址。
+				    data:{usId:this.employeeID},
+					method:'GET',
+					timeout:20000,
+				   
+				    success: (res) => {
+						//console.log('res1111'+JSON.stringify(res.data));
+						 
+				       if(res.data.success){
+						  
+						  let employees = res.data.data;
+						  //this.$refs.ren.set_status(year,month);
+						   
+							if(employees)
+							{
+								_self.employees = [];//employees;
+								let findEmployee = false;
+								for(let i = 0;i< employees.length;i++)
+								{
+									let employee = {id:employees[i].id,value:employees[i].name};
+									_self.employees.push(employee);
+									if(!findEmployee)
+									{
+										//console.log('id '+ _self.employee.id + ' id: ' + employee.id);
+										if(_self.employee.id == employee.id)
+										{
+											findEmployee = true;
+										}
+									}
+								}
+								//console.log('data '+JSON.stringify( _self.employees));
+								if(!findEmployee)
+								{
+									//console.log('not find data ');
+									if(_self.employees.length>0)
+									{
+										_self.employee = {"id":_self.employees[0].id,"name":_self.employees[0].value};//self.employees[0];	
+										//console.log('data '+JSON.stringify(_self.employee));
+										 _self.LoadKpiTemplate(_self.employee.id,_self.employeeID);
+									}
+									 
+								}
+							}
+										 
+					   }
+					   else{
+					   console.log('fail refreshEmployeeList')
+						  uni.showToast({
+						      title: res.data.exception,
+							  icon: 'error',
+						      duration: 2000
+						  }); 
+					   }
+				      
+				    },
+					fail:(res)=>{
+						console.log('requrest failed')
+						 console.log(res);
+						 uni.showModal({
+						 	title:'提示',
+							content:'请求服务失败,请检查网络!',
+							showCancel:false
+						 })
+						
+						 
+					},
+					complete:()=>{
+						//uni.hideLoading();
+					}
+				});
+			}, 
+			calc_score()
+			{
+				 
+				let total_score = 0;
+				if(this.projects)
+				{
+					
+					for(let i = 0;i< this.projects.length;i++)
+					{
+						let project = this.projects[i];
+						if(project)
+						{
+							//console.log('item'+JSON.stringify(project));
+							for(let j=0;j<project.items.length;j++)
+							{
+								let dtl = project.items[j];
+								if(project.is_multiple) 
+								{
+									//console.log('multiple')
+									if(dtl.value!= null && dtl.value>0)
+									{
+										total_score+= dtl.value*dtl.score;
+									}
+								}else{
+									//console.log('not multiple')
+									if(dtl.score!=null)
+									{
+										total_score+=dtl.score;
+									}
+								}
+								 
+							}
+						}
+					}
+				}
+				this.score = total_score;//console.log('score'+total_score);
+				return total_score;
+			},
+			process_data(scoreDataParent,scoreData) {
+			   
+			  if(scoreData.children == null){
+				 
+				  if(scoreData.value == 0){
+					if(scoreData.data_id != null)
+					{
+					  this.submit_projects.children.push(scoreData);
+					}
+				  }else
+				  {
+					this.submit_projects.children.push(scoreData);
+				  }
+				}else
+				{
+				  if(scoreData.isMultiple!=null && scoreData.isMultiple == true){
+					 let data = Object.assign({},scoreData);
+					 data.children = [];
+					 for(let j = 0; j < scoreData.children.length; j++){
+						  if(scoreData.children[j].value != 0)
+						  {
+							 data.children.push(scoreData.children[j]);
+						  }else if(scoreData.children[j].data_id != null)
+						  {
+							data.children.push(scoreData.children[j]);
+						  }
+					 }
+					 if(data.children.length>0){
+						this.submit_projects.children.push(data);
+					 }
+				  }else{
+					for(let j = 0;j<scoreData.children.length;j++)
+					{
+						this.process_data(scoreData,scoreData.children[j]);
+					}
+		
+				  }
+				}     
+			   
+			}, 
+			back() {
+				console.log('test')
+				uni.navigateBack({
+					delta: 1
+			})
+			},
+			formsubmit:function(e)
+			{
+				let datestr = utils.get_date_str(new Date(this.year,this.month-1,this.day));
+				
+				let datas  = {id:'',data_id:null,name:'日评数据',value:0,score:0,unit:null,type:2,isMultiple:true,sliderMin:0,sliderMax:1, sliderStep:0,children:[],date:datestr,userId:this.employee.id, evalId:this.employeeID,level:this.level,radio:null};
+				
+				if(this.projects)
+				{
+					for(let i = 0;i< this.projects.length;i++)
+					{
+						let project =  this.projects[i];
+						if(project)
+						{
+							let parent  = {id:project.id,data_id:null,name:project.name,value:project.value,score:project.score,unit:project.unit,type:project.type,isMultiple:project.is_multiple,sliderMin:project.slider_min,sliderMax:project.slider_max, sliderStep:project.slider_step,children:[],date:datestr,userId:this.employee.id, evalId:this.employeeID,level:this.level,radio:null};
+							
+							for(let j=0;j<project.items.length;j++)
+							{
+								let dtl = project.items[j];
+								if(project.items[j].data_id != null || 
+									(project.items[j].value != null && project.items[j].value>0))
+								{
+									
+									let data ={};
+									if(project.items[j].id != null)
+										data.id  = project.items[j].id;
+									if(project.items[j].data_id != null)
+										data.data_id  = project.items[j].data_id;
+									if(project.items[j].text != null)
+										data.name  = project.items[j].text;	 
+									if(project.items[j].value != null)
+										data.value  = project.items[j].value;	 
+									if(project.items[j].score != null)
+										data.score  = project.items[j].score;
+									if(project.items[j].unit != null)
+										data.unit  = project.items[j].unit;
+									if(project.items[j].type != null)
+										data.type  = project.items[j].type;
+									if(project.items[j].is_multiple != null)
+										data.isMultiple  = project.items[j].is_multiple;
+									if(project.items[j].slider_step != null)
+										data.sliderStep  = project.items[j].slider_step;
+									if(project.items[j].slider_max != null)
+										data.sliderMax  = project.items[j].slider_max;
+									if(project.items[j].slider_min != null)
+										data.sliderMin  = project.items[j].slider_min;
+									data.userId = this.employee.id;
+									data.evalId = this.employeeID;
+									data.date = datestr;
+									data.level = this.level;
+									if(project.items[j].slider_max == 1 && project.items[j].slider_min ==0)
+									{
+										data.radio = project.items[j].id;
+									}
+									parent.children.push(data);
+									//console.log('dtl 初始值' + JSON.stringify(project.items[j]));	
+								}
+								 
+							}
+							if(parent.children.length>0)
+								datas.children.push(parent);
+							
+						}
+					}
+				}
+				
+				//console.log('data'+JSON.stringify(datas));
+				
+				uni.request({
+				    url: this.kpi_url+ '/api/saveDayAssess.do',//'http://192.168.77.99:8080/api/loadMonthWorkSummary.do',//?workNum='+this.employeeNumber+'&workMonth='+this.workMonth, //仅为示例,并非真实接口地址。
+				    data:datas,
+				    headers: {
+					 "Content-Type": "application/json"
+				    },
+					method:'POST',
+					timeout:20000,
+				   
+				    success: (res) => {
+						//console.log('res'+JSON.stringify(res.data));
+						//return; 
+				       if(res.data.success){
+						  
+						  uni.navigateTo({
+						  	url:'../daily_report_detail/daily_report_detail',
+						  	 success: function(res) {
+						  	     // 通过eventChannel向被打开页面传送数据
+						  								 //console.log('fill xxxx')
+						  	     res.eventChannel.emit('acceptDataFromOpenerPage', { data: 
+						  								 {action:'daily_comment_score',year:Number(_self.year),month:Number(_self.month),day:Number(_self.day),
+						  									id:_self.employee.id.toString(),name:_self.employee.name,employees:_self.employees} })
+						  	   }
+						  })
+										 
+					   }
+					   else{
+					      //console.log('fail')
+						  uni.showToast({
+						      title: res.data.exception,
+							  icon: 'error',
+						      duration: 2000
+						  }); 
+						  /*uni.navigateTo({
+						  	url:'../employee_daily_report/employee_daily_report',
+						  	 success: function(res) {
+						  	     // 通过eventChannel向被打开页面传送数据
+						  								 //console.log('fill xxxx')
+						   	     res.eventChannel.emit('acceptDataFromOpenerPage', { data: {action:'month_comment_score',year:_self.year,month:_self.month,day:_self.day,id:data.id,name:_self.employee.name,employees:_self.employees} })
+						  	   }
+						  })*/
+					   }
+				      
+				    },
+					fail:(res)=>{
+						console.log('requrest failed')
+						 //console.log(res);
+						 uni.showModal({
+						 	title:'提示',
+							content:'请求服务失败,请检查网络!',
+							showCancel:false
+						 })
+						
+						 
+					},
+					complete:()=>{
+						uni.hideLoading();
+					}
+				});
+				//console.log('formsubmit');
+			},
+		}
+	} 
+</script>
+
+<style lang="scss">
+	@import "@/common/pa_main.scss";
+	 
+	.content {
+	    //padding-top: 50rpx;
+		.change{
+	        display: flex;
+	        align-items: center;
+	        justify-content: center;
+	        margin: 0 auto;
+	        margin-top: 100rpx;
+	        height: 100rpx;
+	        color: #b89249;
+	        background-color: #21191b;
+			 
+			
+	    }
+		.head-box
+		{
+			
+		}
+		
+		
+	}
+	
+	 
+</style>

+ 382 - 0
pages/daily_report_detail/daily_report_detail.vue

@@ -0,0 +1,382 @@
+<template>
+	<view class="page-box">
+		<view class="head-box-date">
+			<uni-nav-bar id="header_nav" left-icon="arrowleft" type="line" title="日报明细"  @clickLeft="back" />			
+			<view class="heax-date-box border-bottom border-top">
+				
+				<view :class="{pre: !_is_future_day(year,month,day,-1),
+								  pre_unable: _is_future_day(year,month,day,-1)}" @click="changeDay(-1)">
+						<label class="font_smaller iconfont icon-left-circle">上日</label>
+						
+						</view> 
+					<view>
+						<label class="font_smaller">{{month}}月{{day}}日</label>
+					</view>
+					 <view :class="{next: !_is_future_day(year,month,day,1),
+								   next_unable: _is_future_day(year,month,day,1)}" @click="changeDay(1)">
+					<label class="font_smaller">下日</label>
+					<label class="font_smaller iconfont icon-right-circle"></label>
+				</view>				 
+			</view>
+			
+		</view> 
+		<view class="pt-1 content-box_with_date_none_footer">
+			<view class="pa_row  a-center j-center mx-1 pb-1 border-bottom">
+				<uni-tag class="w-40" type="primary" :inverted="selectedIndex != 0"  @click="changePosition(0)" :text="_submitted"/>
+				<uni-tag class="w-40" type="primary" :inverted="selectedIndex != 1"  @click="changePosition(1)" :text="_unsubmitted"/>				
+			</view>
+			<view class="mx-1" v-if="selectedIndex == 0">
+				<view class="employee_list ">
+					 <employee-daily-report-card class="py-1 border-bottom" v-for="(item,index) in work_logs" :key="index"
+						:year="year" :month="month" :day="day" :log="item.work_log" :date="item.date" :name="item.name" :position="item.postname" :score="item.score" :scored="item.scored" :right_nativate="false"  imgUrl="/static/userpic.png" :employeeId="item.id.toString()"
+						@OnCardClick="OnDailyReportCardClick"		
+					 >
+					</employee-daily-report-card>
+				</view> 
+			</view>
+			<view class="mx-1" v-if="selectedIndex == 1">
+				<view class="employee_list">
+					 <employeeCard class="border-bottom"  v-for="(item,index) in employees"  :key="index"
+						:name="item.name"  :position="item.postname" :right_nativate="false"   imgUrl="/static/userpic.png" :employeeId="item.id.toString()"
+						 
+					 >
+					</employeeCard>
+				</view> 
+			</view>
+		</view>
+		
+	</view>
+</template>
+
+<script>
+	 import utils from '../../utils/common.js'
+	 import store from '../../utils/store.js'
+	 
+	 import uniTag from '@/components/uni-tag/uni-tag.vue'
+	 import employeeCard from '@/components/employee_card/employee_card.vue'
+	 import employeeDailyReportCard from '@/components/employee_daily_report_card/employee_daily_report_card.vue'
+	 
+	 var _self;
+	 export default {
+	 	components:{
+	 	    uniTag,
+			employeeCard,
+			employeeDailyReportCard
+	 	}, 
+		onLoad()
+		{
+			_self = this;
+			let pages = getCurrentPages();
+			_self.pages = pages.length;
+			this.kpi_url=  uni.getStorageSync('kpi-url');
+			this.employeeID =  uni.getStorageSync('usId');
+			if(!this.employeeID || this.employeeID.length<=0)
+			{
+				uni.showToast({
+				    title: '未设置员工ID',
+											  icon: 'error',
+				    duration: 2000
+				}); 
+				return;
+			}
+		},
+		onReady()
+		{
+			let date = new Date();
+			let year = date.getFullYear();
+			let month = date.getMonth()+1;
+			let day = date.getDate();
+			_self.year = year;
+			_self.month = month;
+			_self.day = day;
+			// #ifdef APP-NVUE
+			const eventChannel = this.$scope.eventChannel; // 兼容APP-NVUE
+			// #endif
+			// #ifndef APP-NVUE
+			const eventChannel = this.getOpenerEventChannel();
+			// #endif
+			eventChannel.on('acceptDataFromOpenerPage', function(data) {
+				   if(data)
+				   {
+					   if(data.data)
+					   {
+						   //console.log('data' + JSON.stringify(data.data));
+						   if(data.data.action!=null && data.data.action == 'daily_comment_score')
+						   { 
+							   if(data.data.year !=null &&  data.data.month != null && data.data.day != null)
+							   {
+								   _self.year = data.data.year;
+								   _self.month = data.data.month;
+								   _self.day = data.data.day;				
+								   //_self.refreshDailyReportDetail(_self.year,_self.month,_self.day);
+							   } 
+						   }else  if(data.data.date)
+						   {
+							   _self.year = Number(data.data.date.substr(0,4));
+							   _self.month = Number(data.data.date.substr(5,2));
+							   _self.day = Number(data.data.date.substr(8,2));
+							   //_self.refreshDailyReportDetail(_self.year,_self.month,_self.day);
+								//console.log('year:' + _self.year + 'month:'+ _self.month + 'day:'+_self.day);
+						   }
+						   
+					   }
+				   }
+			});
+			_self.refreshDailyReportDetail(_self.year,_self.month,_self.day);
+		},
+	 	data() {
+	 		return {
+				pages:0,
+				kpi_url:'',
+				employeeID:'',
+				year:2021,
+				month:10,
+				day:13,
+				submitted:3,//已填写
+				unsubmitted:6,//未填写
+				selectedIndex:0,
+				employees:[
+					 //{id:'1', name:'郑强',postname:'副总经理兼研发部经理',imgUrl:'/static/userpic.png'},
+					 //{id:'2',name:'邓凯',postname:'程序员',imgUrl:'/static/userpic.png'},
+					 //{id:'3',name:'李广宵',postname:'程序员',imgUrl:'/static/userpic.png'},
+					 //{id:'4',name:'杨所',postname:'测试工程师/软件测试',imgUrl:'/static/userpic.png'},
+					 //{id:'5',name:'舒展',postname:'程序员',imgUrl:'/static/userpic.png'},
+					 //{id:'6',name:'颜黎明',postname:'程序员',imgUrl:'/static/userpic.png'},
+				],
+				work_logs:[
+					 //{id:'1', name:'郑强',date:'09月29日18:39',postname:'副总经理兼研发部经理',imgUrl:'/static/userpic.png',work_log:'荆州开发区人力资源市场项目原型讲解与沟通2014年10月15日,习近平总书记主持召开文艺工作座谈会强调,坚持以人民为中心的创作导向,创作更多无愧于时代的优秀作品。关于文艺工作,习近平总书记有哪些重要论述?中国日报网带你一起学习。'},
+					 //{id:'2', name:'邓凯',date:'09月29日18:39',postname:'程序员',imgUrl:'/static/userpic.png',work_log:'荆州开发区人力资源市场项目原型讲解与沟通'},
+					 //{id:'3', name:'李广宵',date:'09月29日18:39',postname:'副总经理兼研发部经理',imgUrl:'/static/userpic.png',work_log:'荆州开发区人力资源市场项目原型讲解与沟通'},
+					 //{id:'4', name:'杨所',date:'09月29日18:39',postname:'测试工程师',imgUrl:'/static/userpic.png',work_log:'荆州开发区人力资源市场项目原型讲解与沟通'},
+					 //{id:'5', name:'舒展',date:'09月29日18:39',postname:'程序员',imgUrl:'/static/userpic.png',work_log:'荆州开发区人力资源市场项目原型讲解与沟通'},
+				]
+				}
+			},
+			computed:
+			{
+				_submitted : function()
+				{
+					return '已填写' + this.submitted;
+				},
+				_unsubmitted:function()
+				{
+					return '未填写' + this.unsubmitted;
+				}
+			},
+			methods:
+			{
+				refreshDayAssess(_year,_month,_day)
+				{				
+					
+					let workMonth = _year.toString()+'-'+utils.formatNum(_month) + '-'+utils.formatNum(_day);
+					
+					//console.log('evaUsrID:'+this.employeeID);
+					//console.log('workMonth:'+workMonth); 
+					let loadMonthAssess = false;
+					_self.disabled= false;
+					uni.request({
+					    url: this.kpi_url+ '/api/loadDayAssessByEvalUsId.do',//'http://192.168.77.99:8080/api/loadMonthWorkSummary.do',//?workNum='+this.employeeNumber+'&workMonth='+this.workMonth, //仅为示例,并非真实接口地址。
+					    data:{evaUsId:this.employeeID,assessMonth:workMonth},
+						method:'GET',
+						timeout:60000,
+					    
+					    success: (res) => {
+							//console.log('读取月评:'+JSON.stringify(res.data));
+							//return;
+							
+					       if(res.data.success){
+							  
+								//console.log('dddd'+JSON.stringify(res))
+								//console.log('work_logs'+JSON.stringify(_self.work_logs))
+							    if(res.data.data)
+								{
+									 
+									let items = res.data.data;
+									
+									for(let i = 0;i< items.length;i++)
+									 {
+										 for(let j=0;j<_self.work_logs.length;j++)
+										 {
+											if(_self.work_logs[j].id == items[i].user_id)
+											{
+												_self.work_logs[j].score = items[i].actual_score;
+												_self.work_logs[j].scored = true;
+												//console.log('find employee')
+												break;
+											}
+										 } 
+			
+									 }
+									  
+									 //_self.calc_score();
+									 loadMonthAssess = true; 
+									
+								}
+											 
+						   }
+						   else{
+							 //console.log('fail refreshDayAssess')
+							  uni.showToast({
+							      title: res.data.exception,
+								  icon: 'error',
+							      duration: 2000
+							  }); 
+						   }
+						   
+						   
+					      
+					    },
+						fail:(res)=>{
+							console.log('requrest failed refreshDayAssess')
+							 console.log(res);
+							 uni.showModal({
+							 	title:'提示',
+								content:'请求服务失败,请检查网络!',
+								showCancel:false
+							 })
+							
+							 
+						},
+						complete:()=>{
+							 
+							//console.log('items'+JSON.stringify(_self.items))
+						}
+					});
+				},
+				OnDailyReportCardClick(data)
+				{ 
+					//console.log('data:' + JSON.stringify(data));
+					uni.navigateTo({
+						url:'../daily_comment_score/daily_comment_score',
+				 
+						 success: function(res) {
+						  // 通过eventChannel向被打开页面传送数据
+						  //console.log('fill xxxx')
+						  //'
+							//let year = _self.month.substr(0,4);
+							//let month = _self.month.substr(5,2);
+							console.log('data' + JSON.stringify(data))
+							res.eventChannel.emit('acceptDataFromOpenerPage', { data: {action:'daily_report_detail',year:data.year,month:data.month,day:data.day, employee:_self.employee,id:data.id,name:data.name} })
+						 }	  
+					})
+					/**uni.navigateTo({
+						url:'../employee_daily_report/employee_daily_report',
+						 success: function(res) {
+						     // 通过eventChannel向被打开页面传送数据
+													 //console.log('fill xxxx')
+						     res.eventChannel.emit('acceptDataFromOpenerPage', { data: {action:'daily_report_detail',year:_self.year,month:_self.month,day:_self.day,id:Number(data.id),name:data.name} })
+	//					           res.eventChannel.emit('acceptDataFromOpenerPage', { data: {action:'employee_list',id:data.id,name:data.name,year:_self.year,month:_self.month,employees:_self.employees} })
+
+						   }
+					})*/
+				},
+				refreshDailyReportDetail(year,month,day)
+				{
+					this.submitted = 0;
+					this.unsubmitted = 0;
+					this.employees = [];
+					this.work_logs = [];
+					let workDate = year +'-' + utils.formatNum(month)+'-'+utils.formatNum(day);
+					//console.log('usId' + this.employeeID + 'workDate'+  workDate);
+					uni.request({
+					    url: this.kpi_url+ '/api/loadDailySubmitData.do',//'http://192.168.77.99:8080/api/loadMonthWorkSummary.do',//?workNum='+this.employeeNumber+'&workMonth='+this.workMonth, //仅为示例,并非真实接口地址。
+					    data:{usId:this.employeeID,workDate:workDate},
+						method:'GET',
+						timeout:20000,
+					   
+					    success: (res) => {
+							//console.log('data detail'+JSON.stringify(res.data));
+							//return; 
+					       if(res.data.success){
+							  if(res.data.data)
+							  {
+								  
+								  
+								  for(let i = 0;i< res.data.data.length;i++)
+								  {
+									  let item = res.data.data[i];
+									  if(item.summary)
+									  {
+										  this.submitted++;
+										  let work_log = {id:item.userid, name:item.name,date:item.dates.substr(0,10),postname:item.postname,imgUrl:'/static/userpic.png',work_log:item.summary,score:0,scored:false};
+										  this.work_logs.push(work_log);
+									  }else
+									  {
+										  let employee = {id:item.userid,name:item.name,postname:item.postname,imgUrl:'/static/userpic.png'};
+										  this.unsubmitted++;
+										  this.employees.push(employee);
+										  
+									  }
+								  } 
+								  
+								  _self.refreshDayAssess(year,month,day);
+							  }
+					
+											 
+						   }
+						   else{
+						   //console.log('fail')
+							  uni.showToast({
+							      title: res.data.exception,
+								  icon: 'error',
+							      duration: 2000
+							  }); 
+						   }
+					      
+					    },
+						fail:(res)=>{
+							
+							//console.log('requrest failed')
+							// console.log(res);
+							 uni.showModal({
+							 	title:'提示',
+								content:'请求服务失败,请检查网络!',
+								showCancel:false
+							 })
+							
+							 
+						},
+						complete:()=>{
+							//uni.hideLoading();
+						}
+					});
+				},
+				changePosition(index)
+				{
+					this.selectedIndex = index;
+				},
+				_is_future_day(year,month,day,increment)
+				{
+					return utils.is_future_day(year,month,day,increment);
+				},
+				changeDay(days){
+					let current = new Date(this.year,this.month-1,this.day);
+					//console.log('date'+JSON.stringify(current));
+				    let date = utils.addDay(current,days);
+					this.year = date.getFullYear();
+					this.month = date.getMonth()+1;
+					this.day = date.getDate();
+					this.refreshDailyReportDetail(this.year,this.month,this.day);
+					return;
+				},
+				back() {
+					let pages = getCurrentPages();
+					//let delta = pages.length -_self.pages;
+					let delta = pages.length-2;
+					if(delta<1)
+						delta = 1;
+ 					console.log('pages'+pages.length);
+					//console.log('test')
+					uni.navigateBack({
+						delta: delta
+				})
+				}
+			}
+			
+		}
+</script>
+
+<style lang="scss">
+	@import "@/common/pa_main.scss";
+	 
+</style>

+ 475 - 0
pages/daily_report_statistics/daily_report_statistics.vue

@@ -0,0 +1,475 @@
+<template>
+	<view class="content">
+		<view class="head-box-date" style="border: none;">
+			<uni-nav-bar class="header-nav-box"  id="header_nav" left-icon="arrowleft" type="line" title="日报统计"  @clickLeft="back" />			
+			<label class="head-right-box iconfont icon-switch switch_color" @click="btnclick">切换月评</label>
+			<!--
+			<button class="head-right-box iconfont icon-switch switch_color" @click="btnclick">切换月评</button>
+			-->
+			<view class="heax-date-box">
+				 <view  :class="{pre: !is_future_month(-1),
+								  pre_unable: is_future_month(-1)}" @click="changeMonth('pre')">
+						<label class="font_smaller iconfont icon-left-circle">上月</label>
+						
+						</view> 
+					<view>
+						<label class="font_smaller">{{year}}年{{month}}月</label>
+					</view>
+					 <view :class="{next: !is_future_month(1),
+								   next_unable: is_future_month(1)}" @click="changeMonth('next')">
+					<label class="font_smaller">下月</label>
+					<label class="font_smaller iconfont icon-right-circle"></label>
+					</view>				 
+			</view>
+			
+ 		</view>
+		<view class="content-box_with_date_none_footer" style="background-color: #EEEEEE;" >
+			 <view class="daily_report_statistics">
+				 <daily-report-statistics-card  v-for="(item,index) in daily_report_statistics" :key="index"
+					:onDuty="item.on_duty" :submitted="item.submitted" :unsubmitted="item.unsubmitted" :date="item.date_str"
+					@onCardClick="onCardClick"
+				 >
+					 
+				 </daily-report-statistics-card>
+			 </view>
+		</view>			 
+	</view>
+</template>
+
+<script>
+    import utils from '../../utils/common.js'
+	import store from '../../utils/store.js'
+	
+	//Vue.component('uni-collapse-item',uniCollapseItem)
+	//Vue.component('uni-collapse',uniCollapse)
+	import dailyReportStatisticsCard from '@/components/daily_report_statistics_card/daily_report_statistics_card.vue'
+	var _self;
+	export default {
+         components:{
+             dailyReportStatisticsCard
+         },
+		data() {
+			return {
+				kpi_url:'',
+				employeeID:'',
+				workMonth:'',
+				date:'09-01 2021',
+				year:new Date().getFullYear(),
+				month:new Date().getMonth()+1,
+				day:new Date().getDate(),
+//				holidays:[],
+				workTags:[],
+				daily_report_statistics:[
+					 {on_duty:true,date_str:'2021-09-29',submitted:5,unsubmitted:1},
+					 {on_duty:true,date_str:'2021-09-28',submitted:2,unsubmitted:4},
+					 {on_duty:true,date_str:'2021-09-27',submitted:3,unsubmitted:3},
+					 {on_duty:false,date_str:'2021-09-26',submitted:0,unsubmitted:0},
+					 {on_duty:true,date_str:'2021-09-25',submitted:5,unsubmitted:1},
+					 {on_duty:true,date_str:'2021-09-24',submitted:5,unsubmitted:1},
+					 {on_duty:true,date_str:'2021-09-23',submitted:5,unsubmitted:1},
+					 {on_duty:true,date_str:'2021-09-22',submitted:5,unsubmitted:1},
+					 {on_duty:true,date_str:'2021-09-21',submitted:5,unsubmitted:1},
+					 {on_duty:true,date_str:'2021-09-20',submitted:5,unsubmitted:1},
+					 {on_duty:false,date_str:'2021-09-19',submitted:5,unsubmitted:1},
+					 {on_duty:true,date_str:'2021-09-18',submitted:5,unsubmitted:1},
+					 {on_duty:true,date_str:'2021-09-17',submitted:5,unsubmitted:1},
+					 {on_duty:true,date_str:'2021-09-16',submitted:5,unsubmitted:1},
+					 {on_duty:true,date_str:'2021-09-15',submitted:5,unsubmitted:1},
+					 {on_duty:true,date_str:'2021-09-14',submitted:5,unsubmitted:1},
+					 {on_duty:true,date_str:'2021-09-13',submitted:5,unsubmitted:1},
+				]
+			}
+		},
+		 onLoad(options)
+		 {
+			 //console.log('data stattistics'+JSON.stringify(options));
+			 _self = this;
+			 if(options.date)
+			 {
+			 	const date1 = JSON.parse(decodeURIComponent(options.date));
+				//console.log('data'+JSON.stringify(date1));
+				if(date1)
+				{
+					this.year = date1.year;
+					this.month = date1.month;
+					
+				}
+				//
+			 }
+		 	this.kpi_url=  uni.getStorageSync('kpi-url');
+		 	this.employeeID =  uni.getStorageSync('usId');
+		 },
+/**		 onUnload() {
+		 	uni.navigateBack({
+		 		delta: 10
+		 	})
+		 },*/
+		onReady() {
+			if(this.year<2000)
+			{
+				 let date = new Date();
+				 this.year = date.getFullYear();
+				 this.month = date.getMonth()+1;				
+			}
+			 this.refreshEmployeeList();
+			 
+			 
+			 // #ifdef APP-NVUE
+			 const eventChannel = this.$scope.eventChannel; // 兼容APP-NVUE
+			 // #endif
+			 // #ifndef APP-NVUE
+			 const eventChannel = this.getOpenerEventChannel();
+			 // #endif
+			 eventChannel.on('acceptDataFromOpenerPage', function(data) {
+			 	   if(data)
+			 	   {
+			 		    let param = data.data;
+			 		   if(param)
+			 		   {
+			 			   console.log('employee_list activated'+JSON.stringify(data));
+			 			   if(param.action && param.action=='employee_list')//employee_daily_report
+			 			   {
+			 				    if(param.year && param.month)
+								{
+									_self.year = param.year;
+									_self.month =param.month;
+									_self.refreshEmployeeList();
+									
+								}
+			 			   }
+			 		   }
+			 	   }
+			 });
+		},
+		methods: {
+			onCardClick(data)
+			{
+				uni.navigateTo({
+					url:'../daily_report_detail/daily_report_detail', //?date='+encodeURIComponent(JSON.stringify(data.date)) 
+					success: function(res) {
+					    // 通过eventChannel向被打开页面传送数据
+						//console.log('fill xxxx')
+					    res.eventChannel.emit('acceptDataFromOpenerPage', { data: data })
+					  }
+				})
+				
+				
+				//console.log('index:'+JSON.stringify(data));
+			},
+			btnclick()
+			{
+				//uni.navigateTo({
+				let date = {year:_self.year,month:_self.month};//new Date(_self.year,_self.month,_self.day);	
+				//console.log('daily date'+ JSON.stringify(date));
+				uni.redirectTo({
+					url:'../employee_list/employee_list?date='+encodeURIComponent(JSON.stringify(date))
+						
+//					url:'../employee_list/employee_list', //?date='+encodeURIComponent(JSON.stringify(data.date)) 
+///					success: function(res) {
+					 // 通过eventChannel向被打开页面传送数据
+					 //console.log('fill xxxx')
+//					 res.eventChannel.emit('acceptDataFromOpenerPage', { data: 
+//					 {action:'daily_report_statistics',year:_self.year,month:_self.month} })
+//					}
+				})
+				
+			},
+			/*
+			_holidays(_year,_month)
+			{ 
+				//console.log('xxx'+_year+'xxx');
+				let monthstr = _year.toString() + this.formatNum(_month);
+				let yearstr = _year.toString();
+				let keystr = 'holidays_'+yearstr+monthstr;
+				//console.log('xx'+keystr+'xx');
+				let valuestr = uni.getStorageSync(keystr);
+				if(valuestr)
+				{			
+					this.holidays = valuestr;
+					return;
+				}
+			 
+				//let urlStr = 'https://api.apihubs.cn/holiday/get?field=year,month,date&year=' + _year.toString() + '&' + 'month=' +monthstr + '&holiday_recess=1&cn=1&size=31';
+				//console.log(urlStr);
+				uni.request({
+					url:'https://api.apihubs.cn/holiday/get',
+					data: 
+					{
+						field:'year,month,date',
+						year:yearstr,
+						month:monthstr,
+						holiday_recess:1,
+						cn:1,
+						size:31
+					},
+					method:'GET',
+					sslVerify:false,
+					timeout:2000,
+					
+					success:(res)=>{
+						//console.log('res success'+JSON.stringify(res.data));
+						if(res.data)
+						{
+							if(res.data.msg =='ok')
+							{
+								if(res.data.data)
+								{
+									if(res.data.data.list)
+									{										 
+										uni.setStorageSync(keystr,res.data.data.list);
+										this.holidays = res.data.data.list;
+									}
+								}
+							}
+						}
+					},
+					fail:(res)=>{
+						console.log('res failed'+JSON.stringify(res.data));
+					}
+				});		
+			},*/
+			isHoliday(_date)
+			{
+				//console.log('date' + JSON.stringify(_date) +'tag'+ JSON.stringify(this.workTags));
+				//return false;
+				for(let i = 0;i< this.workTags.length;i++)
+				{
+					
+					if(_date == this.workTags[i].date)
+					{
+						if(this.workTags[i].flag ==0)
+						{
+							//console.log('假期 ' + this.workTags[i].date);
+							//console.log('xxxx' + this.holidays[i].date.toString());
+							return true;
+							
+						}
+					}
+				}
+/*				let date = _date.replace(new RegExp(/-/g), ""); 
+				//console.log('date:'+date);
+				for(let i = 0;i< this.holidays.length;i++)
+				{
+					
+					if(date == this.holidays[i].date.toString())
+					{
+						//console.log('xxxx' + this.holidays[i].date.toString());
+						return true;
+					}
+				}*/
+				return false;
+			},
+			isWorkDay(ymd) {
+			    //是否工作日
+			    //let ymd = `${y}/${m}/${d}`;
+			    let formatDY = new Date(ymd.replace(/-/g, '/'));
+			    let week = formatDY.getDay();
+			    if (week == 0 ) {//|| week == 6
+			        return false;
+			    } else {
+			        return true;
+			    }
+			},
+			refreshEmployeeList()
+			{ 
+				this.daily_report_statistics = [];
+				//this._holidays(this.year,this.month);	
+				let today = new Date();
+				let todaystr = this.year + '-' + this.formatNum(today.getMonth()+1) +'-' + this.formatNum(today.getDate());
+			    this.workMonth= this.year +'-'+ this.formatNum(this.month);
+				//console.log('日报统计 ID:'+this.employeeID+'month:'+this.workMonth);
+				uni.request({
+				    url: this.kpi_url+ '/api/rptDailySubmitData.do',//'http://192.168.77.99:8080/api/loadMonthWorkSummary.do',//?workNum='+this.employeeNumber+'&workMonth='+this.workMonth, //仅为示例,并非真实接口地址。
+				    data:{usId:this.employeeID,workMonth:this.workMonth},
+					method:'GET',
+					timeout:20000,
+				   
+				    success: (res) => {
+						//console.log('res'+JSON.stringify(res.data));
+						 
+				       if(res.data.success){
+						  if(res.data.data)
+						  {
+							  let total = 0;
+							  if(res.data.data.total)
+							  {
+								  total = res.data.data.total;
+								  //console.log('total'+total);
+							  }
+							  let daily_report_statistics = res.data.data.rpt;
+							  //this.$refs.ren.set_status(year,month);
+							  let workTags = res.data.data.workTags;
+							  for(let i = 0;i< workTags.length;i++)
+							  {
+								  let workTag = {date:this.year.toString()+'-' + utils.formatNum(this.month)+'-' +utils.formatNum(i+1),flag:Number(workTags[i])};
+								  this.workTags.push(workTag);		
+							  }
+							  //console.log('data '+JSON.stringify(this.workTags));
+							  //return;
+								if(daily_report_statistics)
+								{
+									//console.log('res'+JSON.stringify(daily_report_statistics));
+									this.daily_report_statistics = [];
+									for(let i = 0;i< daily_report_statistics.length;i++)
+									{
+										//console.log('xxxx')
+										let statistics = daily_report_statistics[i];
+										if(statistics.submitDate>todaystr)
+											continue;
+										let _unsubmitted = total-statistics.submitCount;
+										let _onDuty = true;
+										//if(!statistics.submitCount)
+										//{
+											if(this.isHoliday(statistics.submitDate))
+												_onDuty=false;
+										//	if(!this.isWorkDay(statistics.submitDate))
+										//		_onDuty = false;
+										//}
+										this.daily_report_statistics.push({on_duty:_onDuty,date_str:statistics.submitDate,submitted:statistics.submitCount,unsubmitted:_unsubmitted})	
+											//console.log('Date: '+statistics.submitDate);
+									}
+									 
+								}
+						  }
+
+										 
+					   }
+					   else{
+					   console.log('fail')
+						  uni.showToast({
+						      title: res.data.exception,
+							  icon: 'error',
+						      duration: 2000
+						  }); 
+					   }
+				      
+				    },
+					fail:(res)=>{
+						
+						console.log('requrest failed')
+						 console.log(res);
+						 uni.showModal({
+						 	title:'提示',
+							content:'请求服务失败,请检查网络!',
+							showCancel:false
+						 })
+						
+						 
+					},
+					complete:()=>{
+						//uni.hideLoading();
+					}
+				});
+			}, 
+			back() {
+				console.log('test')
+				uni.navigateBack({
+					delta: 10
+				})
+			},
+			formatNum(num) {
+			    let res = Number(num);
+			    return res < 10 ? '0' + res : res;
+			},
+			addMonth(date, months) {
+				    let y = date.getFullYear();
+				    let m = date.getMonth();
+				    var d = date.getDate();
+				
+			//		console.log('add month y' + y + ' m:' + m + ' d: ' + d + ' month: ' + months);
+				    y += Math.floor((m + 1 + months) / 12); //计算年
+				    m = Math.floor((m + 1 + months) % 12) - 1; //计算月
+					let _date = new Date(y,m,d);
+			//		console.log('result y:' + y + ' m: ' + m + '_date:' + _date);
+					return _date;
+				},
+			is_future_month(increment)
+			{
+				let date = new Date();
+				let page_date = new Date(this.year,this.month-1,1);
+				page_date = this.addMonth(page_date,increment)
+				let _y = date.getFullYear();//当前年
+				let _m = date.getMonth();//当前月
+				let _y1 = page_date.getFullYear();
+				let _m1 = page_date.getMonth(); 
+				if(_y1>_y)
+					return true;
+				if(_y1<_y)
+					return false;
+				if(_m1 > _m)
+					return true;
+				return false;
+			},
+			changeMonth(type){
+			    if(type=='pre'){
+			       if (this.month + 1 == 2) {
+			           this.month = 12;
+			           this.year = this.year - 1;
+			       } else {
+			           this.month = this.month - 1;
+			       } 
+			    }else{
+			        if (this.month + 1 == 13) {
+			            this.month = 1;
+			            this.year = this.year + 1;
+			        } else {
+			            this.month = this.month + 1;
+			        }
+			    } 
+				this.refreshEmployeeList();
+				 
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	@import url("/static/font/iconfont.css");
+	@import "@/common/pa_main.scss";
+	button::after { border: none }
+	#header_nav {
+		color: #007AFF;
+		box-shadow: 0 0px 0px #FFFFFF;
+		
+		border-bottom-width: 10rpx;
+		border-bottom-style: solid;
+		border-bottom-color: #FFFFFF;	
+	} 
+	.pre,.next{
+	      color: #4d7df9;
+	      font-size: 28rpx;
+	      font-weight: normal;
+	      padding: 8rpx 15rpx;
+	      //border-radius: 10rpx;
+	      //border: 2rpx solid #dcdfe6;
+	}
+	
+	.pre_unable,.next_unable
+	{
+		color: #B5B5B5;
+		font-size: 28rpx;
+		font-weight: normal;
+		padding: 8rpx 15rpx;
+	}
+	.pre{
+	    margin-right: 30rpx;
+	}
+	.next{
+	    margin-left: 30rpx;
+	}
+     .daily_report_statistics
+     {
+     		padding-top: 10rpx;
+     		padding-left: 0rpx;
+     		padding-right: 0rpx;
+			height: auto;
+			background-color: #EEEEEE!important;
+     }
+     ::-webkit-scrollbar {  
+         display: none;  
+         width: 0 !important;  
+         height: 0 !important;  
+         -webkit-appearance: none;  
+         background: transparent;  
+     }
+</style>

+ 851 - 0
pages/employee_daily_report/employee_daily_report.vue

@@ -0,0 +1,851 @@
+<template>
+	<view class="content">
+		<view class="head-box-date ">
+			<uni-nav-bar id="header_nav" left-icon="arrowleft" type="line" title="员工日报"  @clickLeft="back" />			
+			<view class="heax-date-box">
+				<employee_header ref="header" :employee="employee.name" :month="month" :log_type="log_type" :employees="employees" :months="months" :types="types"
+					@update:employee="updateEmployee" @update:month="updateMonth" @update:type="updateType">
+				</employee_header>
+			</view>
+		</view>
+		<view class="content-box_with_date_footer" style="background-color: #EEEEEE;" >
+			<view class="pa_column border-bottom bg-white" v-for="(item,index) in items" :key="index">
+				<view class="pt-1 topsubitem px-2 pa_row pa-sb">
+					<label class="uni-text-gray" >{{item.date}}</label>	
+					<label v-if="item.isWorkDay" class="textblue font-weight" >工作日</label>			
+					<!--{{(item.score>0)?(item.score+'分'):'工作日'}}-->		
+					<label v-else class="textgreen font-weight" >休息日</label>					
+				</view>
+				<!--<textarea class="bottomsubitem  px-2 w_auto overflow_auto" disabled='true' :value="item.content"></textarea>-->
+				<text v-if="item.isWorkDay && item.content.length>0" class="bottomsubitem py-1  px-2 w_auto overflow_auto work_break" >{{item.content}}</text>
+				<text v-else-if="item.isWorkDay" class="bottomsubitem py-1  px-2 w_auto overflow_auto work_break textred" >未填写</text>				
+				<text v-else class="bottomsubitem py-1  px-2 w_auto overflow_auto work_break" >无</text>				
+			</view>
+		</view>
+		<view class="footer-box">
+			<view class="pa_row a-center h-100">		
+				<view class="w-50">
+					<label class="font-sm lh_footer mx-2" >得分:</label>
+					<label class="font-sm lh_footer">{{score_str}}</label>					
+				</view>
+				<button class="btn_bgcolor btn_color w-50" @click="monthscore">月评</button>							
+			</view>
+		</view>		
+	</view>
+</template>
+
+<script>
+	import utils from '../../utils/common.js'
+	import store from '../../utils/store.js'
+	
+	var _self;
+	export default {
+	     
+		data() {
+			return {
+				 kpi_url:'',
+				 employeeID:'',				 
+				 score:99.00,
+				 log_type:'工作日志',
+				 employee:{id:0,name:''},//{id:100,name:'郑强'},
+				 month:'2021-01',
+				 employees:[
+						//{id:'1',value:'郑强'}
+					],
+				 months:[
+					{id:'1',value:'2021-01'},
+					{id:'2',value:'2021-02'},
+					{id:'3',value:'2021-03'},
+					{id:'4',value:'2021-04'}
+					],	
+				 types: [
+						{id:'1',value:'工作日志'},
+						{id:'2',value:'工作计划'},
+						{id:'3',value:'信息单'},
+						{id:'4',value:'成交单'}
+					],
+				 items:[
+					 {date:'2021-09-30 星期四',content:'校信达2.0账单代码优化',isWorkDay:true},
+					 {date:'2021-09-29 星期三',content:'校信达2.0账单代码优化',isWorkDay:true},
+					 {date:'2021-09-28 星期二',content:'',isWorkDay:true},
+					 {date:'2021-09-28 星期二',content:'',isWorkDay:false},
+					 //{date:'2021-09-27 星期一',content:'校信达2.0账单代码优化'},
+					 //{date:'2021-09-26 星期日',content:'校信达2.0账单代码优化'},
+					 //{date:'2021-09-25 星期六',content:'校信达2.0账单代码优化'},
+					 //{date:'2021-09-24 星期五',content:'校信达2.0账单代码优化'},
+					 //{date:'2021-09-23 星期四',content:'校信达2.0账单代码优化'},
+					 //{date:'2021-09-22 星期三',content:'校信达2.0账单代码优化'},
+					 //{date:'2021-09-21 星期二',content:'校信达2.0账单代码优化'},
+					 //{date:'2021-09-20 星期一',content:'校信达2.0账单代码优化'},
+					 ],
+				 maxdate_year:1,
+				 maxdate_month:1,
+				 maxdate_day:1
+			}
+		} ,
+		
+		onLoad()
+		{
+			_self = this;
+			this.kpi_url=  uni.getStorageSync('kpi-url');
+			this.employeeID =  uni.getStorageSync('usId');
+			
+			let date = new Date();
+			let year = date.getFullYear();
+			let month = date.getMonth()+1;
+			this.generateMonth(year,month);
+			
+		},
+		activated()
+		{
+			return;
+			//_self.refreshSummary(Number(data.data.id),year,month,_self.log_type);
+			
+			console.log('daily report activate')
+			// #ifdef APP-NVUE
+			const eventChannel = this.$scope.eventChannel; // 兼容APP-NVUE
+			// #endif
+			// #ifndef APP-NVUE
+			const eventChannel = this.getOpenerEventChannel();
+			// #endif
+			eventChannel.on('acceptDataFromOpenerPage', function(data) {
+				   if(data)
+				   {
+					   
+					   if(data.data)
+					   {
+						   let action = data.data.action;
+						   if(action)
+						   {
+							   console.log('员工列表data :',JSON.stringify(data));
+							   if(action == 'employee_list')
+							   {
+								   console.log('employeelist');
+								   console.log('wwww'+ JSON.stringify(data.data));
+								   
+								   if(data.data.year && data.data.month)
+								   {
+									   let workMonth = data.data.year +'-'+ utils.formatNum(data.data.month);
+									   _self.month = workMonth;
+								   }
+								   if(data.data.employees && data.data.employees.length>0)
+								   {
+									   //console.log('xxx' + JSON.stringify(data));
+									   _self.employees = [];
+									   for(let j = 0;j < data.data.employees.length;j++)
+									   {
+											   let employee = data.data.employees[j];
+											   let item = {id:employee.id.toString(),value:employee.name};
+											   //{id:'1',value:'郑强'},
+											   
+											   _self.employees.push(item);
+											   //console.log('111xxxx',JSON.stringify(item))
+									   }
+								   }
+								   if(data.data.id && data.data.name)
+								   {
+									   
+									   let item1 = {id:data.data.id,name:data.data.name};
+									   _self.employee = item1;
+									   console.log('item1'+JSON.stringify(item1));
+									   let year = _self.month.substr(0,4);
+									   let month = _self.month.substr(5,2);
+									   _self.refreshSummary(data.data.id,year,month,_self.log_type);
+									   
+									   //_self.$refs.header.set_employee(employee.id,employee.name);
+									   //console.log('zzzzz'+ JSON.stringify(item1));
+								   }
+							   }
+							   if(action == 'month_comment_score')
+							   {
+	//							    console.log('month_comment_score');
+								   if(data.data.year && data.data.month)
+								   {
+										   let workMonth = data.data.year +'-'+ utils.formatNum(data.data.month);
+										   _self.month = workMonth;
+								   }
+								   if(data.data.employees && data.data.employees.length>0)
+								   {
+									   //console.log('xxx' + JSON.stringify(data));
+									   _self.employees = [];
+									   for(let j = 0;j < data.data.employees.length;j++)
+									   {
+											   let employee = data.data.employees[j];
+											   let item = {id:employee.id.toString(),value:employee.name};
+											   //{id:'1',value:'郑强'},
+											   
+											   _self.employees.push(item);
+											   //console.log('111xxxx',JSON.stringify(item))
+									   }
+								   }
+								   if(data.data.id && data.data.name)
+								   {
+										   let item1 = {id:data.data.id,name:data.data.name};
+										   _self.employee = item1;
+										   let year = _self.month.substr(0,4);
+										   let month = _self.month.substr(5,2);
+										   _self.refreshSummary(data.data.id,year,month,_self.log_type);
+										   //_self.$refs.header.set_employee(employee.id,employee.name);
+										   //console.log('zzzzz'+ JSON.stringify(item1));
+								   }
+								   
+							   }
+						   }
+						  
+						   
+					   }
+					   // console.log('xxx' + JSON.stringify(data));
+				   }
+			});
+		},
+		onReady()
+		{
+			
+			let date = new Date();
+			let year = date.getFullYear();
+			let month = date.getMonth()+1;
+			this.month = year.toString()+ '-'+ utils.formatNum(month);
+			this.refreshEmployeeList();
+			//console.log('daily report activate')
+			// #ifdef APP-NVUE
+			const eventChannel = this.$scope.eventChannel; // 兼容APP-NVUE
+			// #endif
+			// #ifndef APP-NVUE
+			const eventChannel = this.getOpenerEventChannel();
+			// #endif
+			eventChannel.on('acceptDataFromOpenerPage', function(data) {
+				   if(data)
+				   {
+					   
+					   if(data.data)
+					   {
+						   let action = data.data.action;
+						   if(action)
+						   {
+							   //console.log('员工列表data :',JSON.stringify(data));
+							   if(action== "daily_report_detail")
+							   {
+								   //console.log('daily_report_detail');
+								   //console.log('wwww'+ JSON.stringify(data.data)); 
+								   if(data.data.year && data.data.month)
+								   {
+										   let workMonth = data.data.year +'-'+ utils.formatNum(data.data.month);
+										   _self.month = workMonth;
+								   }
+								   if(data.data.employees && data.data.employees.length>0)
+								   {
+										   //console.log('xxx' + JSON.stringify(data));
+										   _self.employees = [];
+										   for(let j = 0;j < data.data.employees.length;j++)
+										   {
+												   let employee = data.data.employees[j];
+												   let item = {id:employee.id.toString(),value:employee.name};
+												   //{id:'1',value:'郑强'},
+												   
+												   _self.employees.push(item);
+												   //console.log('111xxxx',JSON.stringify(item))
+										   }
+								   }
+								   if(data.data.id && data.data.name)
+								   {
+										   let item1 = {id:data.data.id,name:data.data.name};
+										   _self.employee = item1;
+										   let year = _self.month.substr(0,4);
+										   let month = _self.month.substr(5,2);
+										   _self.refreshSummary(data.data.id,year,month,_self.log_type);
+								   									   
+								   									   //_self.$refs.header.set_employee(employee.id,employee.name);
+								   									   //console.log('zzzzz'+ JSON.stringify(item1));
+								   }
+							   }else if(action == 'employee_list')
+							   {
+								   //console.log('employeelist');
+								   //console.log('employeelist '+ JSON.stringify(data.data)); 
+								   if(data.data.year && data.data.month)
+								   {
+									   let workMonth = data.data.year +'-'+ utils.formatNum(data.data.month);
+									   _self.month = workMonth;
+								   }
+								   if(data.data.employees && data.data.employees.length>0)
+								   {
+									   //console.log('xxx' + JSON.stringify(data));
+									   _self.employees = [];
+									   for(let j = 0;j < data.data.employees.length;j++)
+									   {
+											   let employee = data.data.employees[j];
+											   let item = {id:employee.id.toString(),value:employee.name};
+											   //{id:'1',value:'郑强'},
+											   
+											   _self.employees.push(item);
+											   //console.log('111xxxx',JSON.stringify(item))
+									   }
+								   }
+								   if(data.data.id && data.data.name)
+								   {
+									   //console.log('employee list data_id ' + data.data.id);
+									   let item1 = {id:data.data.id,name:data.data.name};
+									   _self.employee = item1;
+									   let year = _self.month.substr(0,4);
+									   let month = _self.month.substr(5,2);
+									   //console.log('data id' + data.data.data_id);
+									   _self.refreshSummary(data.data.id,year,month,_self.log_type);
+									   
+									   //_self.$refs.header.set_employee(employee.id,employee.name);
+									   //console.log('zzzzz'+ JSON.stringify(item1));
+								   }
+							   }
+							   if(action == 'month_comment_score')
+							   {
+	//							    console.log('month_comment_score'); 
+								   if(data.data.year && data.data.month)
+								   {
+										   let workMonth = data.data.year +'-'+ utils.formatNum(data.data.month);
+										   _self.month = workMonth;
+								   }
+								   if(data.data.employees && data.data.employees.length>0)
+								   {
+									   //console.log('xxx' + JSON.stringify(data));
+									   _self.employees = [];
+									   for(let j = 0;j < data.data.employees.length;j++)
+									   {
+											   let employee = data.data.employees[j];
+											   let item = {id:employee.id.toString(),value:employee.name};
+											   //{id:'1',value:'郑强'},
+											   
+											   _self.employees.push(item);
+											   //console.log('111xxxx',JSON.stringify(item))
+									   }
+								   }
+								   if(data.data.id && data.data.name)
+								   {
+										   let item1 = {id:data.data.id,name:data.data.name};
+										   _self.employee = item1;
+										   let year = _self.month.substr(0,4);
+										   let month = _self.month.substr(5,2);
+										   _self.refreshSummary(data.data.id,year,month,_self.log_type);
+										   //_self.$refs.header.set_employee(employee.id,employee.name);
+										   //console.log('zzzzz'+ JSON.stringify(item1));
+								   }
+								   
+							   }
+						   }
+						  
+						   
+					   }
+					   // console.log('xxx' + JSON.stringify(data));
+				   }
+			});
+			 
+		},
+		computed:
+		{
+			score_str()
+			{
+				let str = this.score.toFixed(2); 
+				return str;
+			}
+		},
+		methods:
+		{
+			dayscore(score)
+			{
+				if(score == null)
+					return '工作日';
+				console.log('score'+score)
+				return score.toString()+'分';
+			},
+			updateEmployee(data)
+			{				
+				if(data)
+				{
+					//console.log('updateEmployee1'+JSON.stringify(this.employee));
+					this.employee = {id:data.id,name:data.value};					
+					//console.log('updateEmployee2'+JSON.stringify(this.employee));
+					let year = this.month.substr(0,4);
+					let month = this.month.substr(5,2);
+					//console.log("更新员工 "+this.employee.id+" 年 " + year+" 月 " +month + " 类型 " + this.log_type);					
+					this.refreshSummary(data.id,year,month,this.log_type);
+				}
+			},
+			updateMonth(data)
+			{
+				//2021-01
+				//console.log('updateMonth'+JSON.stringify(this.month));
+				this.month = data.value;					
+				//console.log('updateMonth'+JSON.stringify(this.month));
+				//console.log('updateMonth'+JSON.stringify(data));
+				let year = this.month.substr(0,4);
+				let month = this.month.substr(5,2);
+				//console.log("更新月份 "+this.employee.id+" 年 " + year+" 月 " +month + " 类型 " + this.log_type);
+				
+				this.refreshSummary(this.employee.id,year,month,this.log_type);
+			
+			},
+			updateType(data)
+			{
+				//console.log('updateType'+JSON.stringify(this.log_type));
+				this.log_type = data.value;					
+				//console.log('updateType'+JSON.stringify(this.log_type));
+				 let year = this.month.substr(0,4);
+				 let month = this.month.substr(5,2);
+				 //console.log("更新类型 "+this.employee.id+" 年 " + year+" 月 " +month + " 类型 " + this.log_type);
+				 this.refreshSummary(this.employee.id,year,month,this.log_type);
+				 			
+			},
+			refreshDayAssess(_year,_month)
+			{				
+				let workMonth = _year.toString()+'-'+utils.formatNum(_month);
+				//console.log('id:'+this.employee.id);
+				//console.log('evaUsrID:'+this.employeeID);
+				//console.log('workMonth:'+workMonth);
+				let loadMonthAssess = false;
+				_self.disabled= false;
+				uni.request({
+				    url: this.kpi_url+ '/api/loadDayAssess.do',//'http://192.168.77.99:8080/api/loadMonthWorkSummary.do',//?workNum='+this.employeeNumber+'&workMonth='+this.workMonth, //仅为示例,并非真实接口地址。
+				    data:{usId:this.employee.id,evaUsId:this.employeeID,assessMonth:workMonth},
+					method:'GET',
+					timeout:20000,
+				    
+				    success: (res) => {
+						//console.log('读取月评:'+JSON.stringify(res.data));
+						//return;
+						
+				       if(res.data.success){
+						  
+							//console.log('dddd'+JSON.stringify(res))
+						    if(res.data.data)
+							{
+								if(res.data.data.list)
+								{
+									let items = res.data.data.list;
+									
+									for(let i = 0;i< items.length;i++)
+									 {
+										 for(let j=0;j<items[i].children.length;j++)
+										 {
+											 for(let m = 0;m<this.items.length;m++)
+											 {
+												 if(this.items[m].date == items[i].children[j].date)
+												 {
+													 if(_self.items[m].score == null)
+													 {
+														 _self.items[m].score = 0;
+													 }
+													 _self.items[m].score += items[i].children[j].actualScore;
+													 //console.log("score"+this.items[m].score);
+														
+												 }
+											 }
+											 //console.log('Item '+JSON.stringify(items[i].children[j]))
+										 } 
+			
+									 }
+									 if(!items || items.length==0)
+									 {
+										   //console.log('fail xxxx')
+										   for(let i = 0;i < _self.projects.length;i++)
+										   {
+												_self.projects[i].selectedIndex = -1;
+												//console.log('xxx fail xxxx')
+												for(let j = 0;j<_self.projects[i].items.length;j++)
+												{
+													_self.projects[i].items[j].checked = false;
+												}
+										   }
+																//console.log('failed failed')
+									 } 
+									 //_self.calc_score();
+									 loadMonthAssess = true;
+								}
+								
+							}
+										 
+					   }
+					   else{
+					   console.log('fail refreshDayAssess')
+						  uni.showToast({
+						      title: res.data.exception,
+							  icon: 'error',
+						      duration: 2000
+						  }); 
+					   }
+					   
+					   
+				      
+				    },
+					fail:(res)=>{
+						console.log('requrest failed refreshDayAssess')
+						 console.log(res);
+						 uni.showModal({
+						 	title:'提示',
+							content:'请求服务失败,请检查网络!',
+							showCancel:false
+						 })
+						
+						 
+					},
+					complete:()=>{
+						 
+						//console.log('items'+JSON.stringify(_self.items))
+					}
+				});
+			},
+			generateMonth(year,month)
+			{
+				 this.months = [];
+				 
+				 for(let i = 1;i<=12;i++)
+				 {				
+				 	let monthstr = year + '-' + utils.formatNum(month);				
+				 	this.months.push({id:i.toString(),value:monthstr});
+				 	
+				 	if(month==1)
+				 	{
+				 		month = 12;
+				 		year--;
+				 	}else
+				 	{
+				 		month--;
+				 	}
+				 }
+			},
+			back() {
+				let pages = getCurrentPages();
+				//let nowPage = pages[ pages.length - 1]; 
+				//let prevPage = pages[ pages.length - 2 ];
+				//console.log('pages'+pages.length);
+				//console.log('nowPage'+JSON.stringify(nowPage));
+				//console.log('prevPage'+JSON.stringify(prevPage));
+				//console.log('test')
+				uni.navigateBack({
+					delta: pages.length-2
+			})
+			},
+			monthscore()
+			{
+				uni.navigateTo({
+					url:'../month_comment_score/month_comment_score' ,//?date='+encodeURIComponent(JSON.stringify(data.date)) 
+					success: function(res) {
+					 // 通过eventChannel向被打开页面传送数据
+					 //console.log('月评'+JSON.stringify(_self.employee))
+					 //'
+						res.eventChannel.emit('acceptDataFromOpenerPage', { data: {action:'employee_daily_report',month:_self.month,employee:_self.employee,maxdate_day:_self.maxdate_day} })
+					}					
+				})
+			},
+			refreshAllMonthAssess(_id,_year,month)
+			{ 
+				let workMonth = _year.toString()+'-'+utils.formatNum(month);
+				//console.log('id:'+_id);
+				//console.log('workMonth:'+workMonth);
+				//console.log('workMonth:'+workMonth);
+				_self.score = 0;
+				//_self.first_assess = [];
+				//_self.second_assess = [];
+				//_self.third_assess = [];
+				//loadAllMonthAssess
+				//console.log("loadAllMonthAssess "+_id+" assessMonth "+workMonth);
+				uni.request({
+					//url: this.kpi_url+ '/api/loadMonthAssess.do',//'http://192.168.77.99:8080/api/loadMonthWorkSummary.do',//?workNum='+this.employeeNumber+'&workMonth='+this.workMonth, //仅为示例,并非真实接口地址。
+					url: this.kpi_url+ '/api/loadAllMonthAssess.do',//'http://192.168.77.99:8080/api/loadMonthWorkSummary.do',//?workNum='+this.employeeNumber+'&workMonth='+this.workMonth, //仅为示例,并非真实接口地址。
+					data:{usId:_id,assessMonth:workMonth},
+					method:'GET',
+					timeout:20000,
+				   
+					success: (res) => {
+						//console.log('loadAllMonthAssess:'+JSON.stringify(res));
+						//return;
+					   if(res.data.success){
+						  
+							if(res.data.data)
+							{
+								let items = res.data.data.list;
+								if(items==null)
+								{
+									_self.score = 0;
+									//console.log('items is  null');
+									return;	
+								}
+								//console.log('items is not null');
+								_self.score = 0;
+								if(items.length ==0)
+									_self.score = 0; 
+								for(let i = 0;i<items.length;i++)
+								{
+									if(items[i] == null || items[i].level<0 || items[i].level>3)
+										continue;
+									//let item ={};
+									//if(items[i].projectName && items[i].optionsName)
+									//	item.title = items[i].projectName +'-'+items[i].optionsName +'      ';										
+									//if(items[i].actualScore)
+									//	item.title += items[i].actualScore +'  ';
+									 	
+									/*switch(items[i].level)
+									{
+										case 1:																				
+										if(item.title)
+											_self.first_assess.push(item);
+										break; 
+										
+										case 2:
+										if(item.title)
+											_self.second_assess.push(item);
+											 
+											 
+											break;
+										case 3:
+										if(item.title)
+											_self.third_assess.push(item);
+											  
+											 
+										break;	
+									}*/
+									if(items[i].isValid)
+										_self.score+= items[i].actualScore;
+									//console.log('score'+JSON.stringify(items[i]));
+								}
+//								console.log('first'+_self._self.first_assess);								
+//								console.log('second'+_self.second_assess);
+//								console.log('third'+_self.third_assess);
+								 
+								
+							}
+										 
+					   }
+					   else{
+					   console.log(' refreshAllMonthAssess fail')
+						  uni.showToast({
+							  title: res.data.exception,
+							  icon: 'error',
+							  duration: 2000
+						  }); 
+					   }
+					  
+					},
+					fail:(res)=>{
+						console.log('requrest refreshAllMonthAssess failed')
+						 console.log(res);
+						 uni.showModal({
+							title:'提示',
+							content:'请求月份评价失败,请检查网络!',
+							showCancel:false
+						 })
+						
+						 
+					},
+					complete:()=>{
+						//uni.hideLoading();
+					}
+				});
+			}, 	
+			refreshEmployeeList()
+			{ 
+				  
+				uni.request({
+				    url: this.kpi_url+ '/api/loadNeedAssessUsers.do',//'http://192.168.77.99:8080/api/loadMonthWorkSummary.do',//?workNum='+this.employeeNumber+'&workMonth='+this.workMonth, //仅为示例,并非真实接口地址。
+				    data:{usId:this.employeeID},
+					method:'GET',
+					timeout:20000,
+				   
+				    success: (res) => {
+						 
+				       if(res.data.success){
+						  
+						  let employees = res.data.data;
+						  //this.$refs.ren.set_status(year,month);
+						   
+							if(employees)
+							{
+								//console.log('employees'+JSON.stringify(employees));
+								_self.employees = [];
+								for(let j = 0;j < res.data.data.length;j++)
+								{
+								    
+ 								   let employee = res.data.data[j];
+								   let item = {id:employee.id.toString(),value:employee.name};
+								    if(_self.employee.id == 0)
+								    {
+								    	_self.employee.id = employee.id;
+										_self.employee.name = employee.name;
+										let year = _self.month.substr(0,4);
+										let month = _self.month.substr(5,2);
+										//console.log("employee"+ JSON.stringify(employee));
+										 _self.refreshSummary(_self.employee.id,year,month,_self.log_type);
+								    }
+								   _self.employees.push(item);
+								   //console.log('111xxxx')
+								}  
+							}
+										 
+					   }
+					   else{
+					   console.log('fail')
+						  uni.showToast({
+						      title: res.data.exception,
+							  icon: 'error',
+						      duration: 2000
+						  }); 
+					   }
+				      
+				    },
+					fail:(res)=>{
+						console.log('requrest failed')
+						 console.log(res);
+						 uni.showModal({
+						 	title:'提示',
+							content:'请求服务失败,请检查网络!',
+							showCancel:false
+						 })
+						
+						 
+					},
+					complete:()=>{
+						//uni.hideLoading();
+					}
+				});
+			},
+			refreshSummary(usId,year,month,type)
+			{
+				//console.log('刷新工作日志 用户ID:'+usId+' 年 '+year + '月 '+month + " 类型 " + type);
+				this.refreshAllMonthAssess(usId,year,month);
+				//console.log('usId'+usId+' year '+year + ' month ' + month + ' type ' + type);
+				//this.year = year;
+				//this.month = month;	
+				 
+				let _workMonth= year +'-'+ utils.formatNum(month);
+				//let _workDate = year +'-'+ utils.formatNum(month)+'-'+ utils.formatNum(day);
+				//console.log('workMonth'+_workMonth);
+				//return;
+				//console.log('refreshSummary' + this.employeeNumber + 'month:' + this.workMonth)
+				uni.request({
+					url: this.kpi_url+ '/api/loadMonthWorkSummary.do',//'http://192.168.77.99:8080/api/loadMonthWorkSummary.do',//?workNum='+this.employeeNumber+'&workMonth='+this.workMonth, //仅为示例,并非真实接口地址。
+					data:{usId:usId,workMonth:_workMonth},
+					method:'GET',
+					timeout:20000,
+				   
+					success: (res) => {
+					   //console.log('res'+JSON.stringify(res.data));
+						 
+					   if(res.data.success){
+						  
+ 						    let work_logs = res.data.data.workLogs;
+							let datestr = utils.get_date_str(new Date());
+							if(work_logs)
+							{
+								_self.items = [];
+								//console.log('xxxxx'+JSON.stringify(this.work_logs));
+								//for(let i = 0;i< work_logs.length;i++)
+								for(let i = work_logs.length-1;i>=0;i--)
+								{
+									if(work_logs[i].workDate>datestr)
+									{
+										continue;
+									}
+									if((i == work_logs.length-1) || (work_logs[i].workDate==datestr))
+									{
+										if(work_logs[i].workDate)
+										{
+											_self.maxdate_year = work_logs[i].workDate.substr(0,4);
+											_self.maxdate_month = work_logs[i].workDate.substr(5,2);
+											_self.maxdate_day = work_logs[i].workDate.substr(8,2);											
+										}
+									}
+									if(work_logs[i])
+									{
+									 
+										 
+										if(_self.log_type == _self.types[0].value)
+										{ 
+											if(work_logs[i].summary)
+											{
+												//console.log('type1'+_self.log_type);
+												let item ={isWorkDay: work_logs[i].workday, date:work_logs[i].workDate,content:work_logs[i].summary};
+												_self.items.push(item);											
+												
+											}else{
+												let item ={isWorkDay: work_logs[i].workday, date:work_logs[i].workDate,content:''};
+												_self.items.push(item);											
+												
+											}
+											
+										}else if(_self.log_type == _self.types[1].value)
+										{
+											if(work_logs[i].program)
+											{
+												console.log('type2'+_self.log_type);
+												let item ={isWorkDay: work_logs[i].workday,date:work_logs[i].workDate,content:work_logs[i].program};
+												_self.items.push(item);											
+											}else{
+												let item ={isWorkDay: work_logs[i].workday, date:work_logs[i].workDate,content:''};
+												_self.items.push(item);											
+												
+											}
+											
+										}else if(_self.log_type == _self.types[2].value)
+										{
+											if(work_logs[i].message)
+											{
+											
+												console.log('type3'+_self.log_type);
+												let item ={isWorkDay: work_logs[i].workday,date:work_logs[i].workDate,content:work_logs[i].message};
+												_self.items.push(item);											
+										   }else{
+												let item ={isWorkDay: work_logs[i].workday, date:work_logs[i].workDate,content:''};
+												_self.items.push(item);											
+												
+											}
+											
+										}if(_self.log_type == _self.types[3].value)
+										{
+											if(work_logs[i].clinch)
+											{
+												console.log('type4'+_self.log_type);
+												let item ={isWorkDay: work_logs[i].workday,date:work_logs[i].workDate,content:work_logs[i].clinch};
+													_self.items.push(item);											
+											}else{
+												let item ={isWorkDay: work_logs[i].workday, date:work_logs[i].workDate,content:''};
+												_self.items.push(item);											
+												
+											}
+											
+										}
+									}
+  								} 
+								//_self.refreshDayAssess(year,month)
+							}
+										 
+					   }
+					   else{
+					   console.log('fail')
+						  uni.showToast({
+							  title: res.data.exception,
+							  icon: 'error',
+							  duration: 2000
+						  }); 
+					   }
+					  
+					},
+					fail:(res)=>{
+						console.log('requrest failed')
+						 console.log(res);
+						 uni.showModal({
+							title:'提示',
+							content:'请求服务失败,请检查网络!',
+							showCancel:false
+						 })
+						
+						 
+					},
+					complete:()=>{
+						uni.hideLoading();
+					}
+				});
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	@import "@/common/pa_main.scss";
+	 
+</style>

+ 573 - 0
pages/employee_list/employee_list.vue

@@ -0,0 +1,573 @@
+<template>
+	<view class="content">
+		<view class="head-box-date">			
+			<uni-nav-bar class="header-nav-box" id="header_nav" left-icon="arrowleft" type="line" title="员工列表"  @clickLeft="back" />
+<!--			<button class="head-right-box iconfont icon-switch switch_color" @click="btnclick">切换日评</button>-->
+			<label class="head-right-box iconfont icon-switch switch_color" @click="btnclick">切换日评</label>
+			<view class="heax-date-box">
+				 <view  :class="{pre: !is_future_month(-1),
+								  pre_unable: is_future_month(-1)}" @click="changeMonth('pre')">
+						<label class="font_smaller iconfont icon-left-circle">上月</label>
+						
+						</view> 
+					<view>
+						<label class="font_smaller">{{year}}年{{month}}月</label>
+					</view>
+					 <view :class="{next: !is_future_month(1),
+								   next_unable: is_future_month(1)}" @click="changeMonth('next')">
+					<label class="font_smaller">下月</label>
+					<label class="font_smaller iconfont icon-right-circle"></label>
+					</view>				 
+			</view>	
+		</view>
+		<view class="content-box_with_date_none_footer " >		 
+			 <xiaolu-tree  :checkList="checkList"  v-if="tree.length>0"  :props="prop" @backTree="backTree" @toChildren="toChildren" @search="search" @sendValue="confirm"  :isCheck="true" :treeNone="tree"></xiaolu-tree>
+			 <view class="p-1" v-if="tree.length>0">
+				 <label class="iconfont icon-zuzhirenyuan" style="color: #0062CC;"></label>
+				 <label class="pl-1">组织人员</label>				 
+			 </view>
+			  <view class="employee_list " > 
+					 <employeeCard class="border-bottom" v-for="(item,index) in employees" :key="index"
+						:name="item.name" :position="item.postname"  imgUrl="/static/userpic.png" :employeeId="item.id.toString()"
+						@onEmployeeClick="employeeClick"
+					 >
+					</employeeCard>
+			  </view>
+		</view>
+	</view>
+</template>
+
+<script>
+    import employeeCard from '@/components/employee_card/employee_card.vue'
+    import store from '../../utils/store.js'
+	import xiaoluTree from '@/components/xiaolu-tree/tree.vue'
+	
+	var _self;
+
+	export default {
+         components:{
+             employeeCard,
+			 xiaoluTree
+         },
+		data() {
+			return {
+				 kpi_url:'',
+				 employeeID:'',
+				 year:new Date().getFullYear(),
+				 month:new Date().getMonth()+1,
+				 checkList:[],
+				 employees:[
+					// {id:'1', name:'郑强',postname:'副总经理兼研发部经理',imgUrl:'/static/userpic.png'},
+					// {id:'2',name:'邓凯',postname:'程序员',imgUrl:'/static/userpic.png'},
+					// {id:'3',name:'李广宵',postname:'程序员',imgUrl:'/static/userpic.png'},
+					// {id:'4',name:'杨所',postname:'测试工程师/软件测试',imgUrl:'/static/userpic.png'},
+					// {id:'5',name:'舒展',postname:'程序员',imgUrl:'/static/userpic.png'},
+					// {id:'6',name:'颜黎明',postname:'程序员',imgUrl:'/static/userpic.png'},
+					// {id:'7',name:'付龙龙',postname:'后端工程师',imgUrl:'/static/userpic.png'},
+					// {id:'8',name:'郑开鑫',postname:'程序员',imgUrl:'/static/userpic.png'},
+					// {id:'9',name:'文康勇',postname:'程序员',imgUrl:'/static/userpic.png'}
+				 ],
+				 tree:[],
+/*tree:[{
+					children: [
+						{
+							children: [
+								{
+									children: [],//都需要带这个
+									id: "128334455556667687",
+									name: "学生2107",
+									checked: false,
+									user: false
+								}
+							],//都需要带这个
+							id: "128334455556667685",
+							name: "学生2105",
+							checked: false,
+							user: false
+						},
+						{
+							children: [
+								{
+									children: [],//都需要带这个
+									id: "128334455556667688",
+									name: "学生2108",
+									checked: false,
+									user: false
+								}
+							],//都需要带这个
+							id: "128334455556667686",
+							name: "学生2106",
+							checked: false,
+							user: false
+						},
+						{
+							children: [],//都需要带这个
+							id: "128334455556667618",
+							name: "学生2118",
+							checked: false,
+							user: false
+						},
+						{
+							children: [],//都需要带这个
+							id: "128334455556667628",
+							name: "学生2128",
+							checked: false,
+							user: false
+						},
+						{
+							children: [],//都需要带这个
+							id: "128334455556667638",
+							name: "学生2138",
+							checked: false,
+							user: false
+						}
+					],//都需要带这个
+					id: "128334455556667681",
+					name: "学生2104",
+					checked: false,
+					user: false
+				}] */
+				 
+			}
+		},
+		computed:
+		{
+			 
+		},
+		onLoad(options)
+		{
+			 //console.log('data employee_list'+JSON.stringify(options));
+			_self = this;
+			if(options.date)
+			{
+				const date1 = JSON.parse(decodeURIComponent(options.date));
+				//console.log('data'+JSON.stringify(date1));
+				if(date1)
+				{
+					this.year = date1.year;
+					this.month = date1.month;
+					 
+				}
+							//
+			}
+			this.kpi_url=  uni.getStorageSync('kpi-url');
+			this.employeeID =  uni.getStorageSync('usId');
+			if(!this.employeeID || this.employeeID.length<=0)
+			{
+				uni.showToast({
+				    title: '未设置员工ID',
+											  icon: 'error',
+				    duration: 2000
+				}); 
+				return;
+			}		
+		},
+		/*onUnload() {
+			uni.navigateBack({
+				delta: 10
+			})
+		},*/
+		onReady() {
+			if(this.year<2000)
+			{
+				 let date = new Date();
+				 this.year = date.getFullYear();
+				 this.month = date.getMonth()+1;
+			 }
+			 this.refreshOrganizationEmployeeList();
+			 //this.refreshEmployeeList();
+			 
+			 //return;
+			 // #ifdef APP-NVUE
+			 const eventChannel = this.$scope.eventChannel; // 兼容APP-NVUE
+			 // #endif
+			 // #ifndef APP-NVUE
+			 const eventChannel = this.getOpenerEventChannel();
+			 // #endif
+			 eventChannel.on('acceptDataFromOpenerPage', function(data) {
+			 	   if(data)
+			 	   {
+			 		    let param = data.data;
+			 		   if(param)
+			 		   {
+			 			   //console.log('month score activated'+JSON.stringify(data));
+			 			   if(param.action && param.action=='daily_report_statistics')//employee_daily_report
+			 			   {
+			 				    if(param.year && param.month)
+								{
+									_self.year = param.year;
+									_self.month =param.month;
+									//_self.refreshEmployeeList();
+									_self.refreshOrganizationEmployeeList();
+								}
+			 			   }
+			 		   }
+			 	   }
+			 });
+		},
+		methods: {	
+			confirm(val) {
+				console.log('confirm' +JSON.stringify(val))
+				_self.checkList=val
+			},
+			search(val) {
+				 _self.filterEmployeeList(val);
+				//console.log('search' +JSON.stringify(val))
+				//_self.checkList=val
+			},
+			toChildren(val) {
+				 _self.filterEmployeeList(val);
+				//console.log('toChildren' +JSON.stringify(val))
+				//_self.checkList=val
+			},		
+			backTree(val) {
+				 _self.filterEmployeeList(val);
+				//console.log('backTree' +JSON.stringify(val))
+				//_self.checkList=val
+			},				
+			employeeClick(data)
+			{ 
+				//console.log('safds'+this.employees);
+				uni.navigateTo({
+				//uni.redirectTo({	
+					url:'../employee_daily_report/employee_daily_report',//?date='+encodeURIComponent(JSON.stringify(data.date)) 
+					success: function(res) {
+					    // 通过eventChannel向被打开页面传送数据
+													 //console.log('fill xxxx')
+						let _data = { data: {action:'employee_list',id:data.id,name:data.name,year:_self.year,month:_self.month,employees:_self.employees} };
+						//console.log("employee click " +JSON.stringify(_data));
+						
+					    res.eventChannel.emit('acceptDataFromOpenerPage', _data);
+					  }
+				}) 
+				//console.log('name'+data.id + data.name);
+			},
+			btnclick()
+			{
+				
+				let date = {year:_self.year,month:_self.month};
+				//console.log('employee date'+ JSON.stringify(date));
+				//let workMonth = _self.year.toString() + '-' + utils.formatNum(_self.month);
+				uni.redirectTo({
+					url:'../daily_report_statistics/daily_report_statistics?date='+encodeURIComponent(JSON.stringify(date))
+					 
+					
+				//uni.navigateTo({
+					//url:'../daily_report_statistics/daily_report_statistics', //?date='+encodeURIComponent(JSON.stringify(data.date)) 
+					/*success: function(res) {
+					 // 通过eventChannel向被打开页面传送数据
+					 //console.log('fill xxxx')
+					 res.eventChannel.emit('acceptDataFromOpenerPage', { data: 
+					 {action:'employee_list',year:_self.year,month:_self.month} })
+					}*/					
+				})
+				
+			},
+			refreshEmployeeList()
+			{ 
+				/*if(_self.employeeID!="")
+				{
+					console.log(_self.employeeID)
+					let employees =store.getItem(_self.employeeID,'employees');
+					if(employees!=null)
+					{
+						this.employees = employees;
+						console.log('employees'+JSON.stringify(employees));
+						return;
+					}					
+				} */
+				uni.request({
+				    url: this.kpi_url+ '/api/loadNeedAssessUsers.do',//'http://192.168.77.99:8080/api/loadMonthWorkSummary.do',//?workNum='+this.employeeNumber+'&workMonth='+this.workMonth, //仅为示例,并非真实接口地址。
+				    data:{usId:this.employeeID},
+					method:'GET',
+					timeout:20000,
+				   
+				    success: (res) => {
+						//console.log('res'+JSON.stringify(res.data));
+						 
+				       if(res.data.success){
+						  
+						  let employees = res.data.data;
+						  //this.$refs.ren.set_status(year,month);
+						   
+							if(employees)
+							{
+								this.employees = employees;
+								//store.setItem(_self.employeeID,employees,'employees');
+								//console.log('xxxxx'+JSON.stringify(employees));
+								//this.employees.clear();
+								/*for(let i = 0;i< this.employees.length;i++)
+								{
+									this.employees.push()
+									if(this.work_logs[i].summaryLen>0)
+										this.$refs.ren.set_status_by_datestr1(this.work_logs[i].workDate,1);
+									else
+										this.$refs.ren.set_status_by_datestr1(this.work_logs[i].workDate,3);
+									
+								}  */
+							}
+										 
+					   }
+					   else{
+					   console.log('fail')
+						  uni.showToast({
+						      title: res.data.exception,
+							  icon: 'error',
+						      duration: 2000
+						  }); 
+					   }
+				      
+				    },
+					fail:(res)=>{
+						 _self.employees =[];
+						 console.log('requrest failed')
+						 console.log(res);
+						 uni.showModal({
+						 	title:'提示',
+							content:'请求服务失败,请检查网络!',
+							showCancel:false
+						 })
+						
+						 
+					},
+					complete:()=>{
+						//uni.hideLoading();
+					}
+				});
+			}, 
+			process_tree_node(parent,parent_tree)
+			{
+				if(parent.children == null)
+				{
+					console.log('child null'+JSON.stringify(parent))
+					return;					
+				} 
+				
+				for(let i = 0;i< parent.children.length;i++)
+				{
+					let child = parent.children[i];
+					if(child.type!=null && child.type ==0)
+					{
+						let item = {children: [],//都需要带这个
+						  	id: child.id,
+						  	name: child.name,
+						  	checked: false,
+						  	user: false};
+														
+						parent_tree.children.push(item);
+						_self.process_tree_node(child,item);
+					}else
+					{
+						//console.log('child'+JSON.stringify(child))
+						let item = {children: [],//都需要带这个
+						  	id: child.id,
+						  	name: child.name,
+						  	checked: false,
+							postname: child.position,
+							username:child.username,
+							old_id :child.old_id,
+						  	user: true};
+														
+						parent_tree.children.push(item);
+					}
+				}
+			},
+			filterEmployees(tree)
+			{
+				
+				//console.log('item'+JSON.stringify(tree));
+				if(tree.children == null)
+				{
+					return;					
+				} 
+				for(let i = 0;i< tree.children.length;i++)
+				{
+					let child = tree.children[i];
+					
+					if(child.user==null)
+					{  
+						continue;
+					}
+					if(child.user)
+					{
+						/*let item = {children: [],//都需要带这个
+						  	id: child.id,
+						  	name: child.name,
+						  	postname: child.,
+						  	user: true};
+						{id:'2',name:'邓凯',postname:'程序员',imgUrl:'/static/userpic.png'},	*/	
+						//console.log('item'+JSON.stringify(child));
+						_self.employees.push(child);
+					}else
+					{
+						_self.filterEmployees(child);
+					}
+				}
+			},
+			filterEmployeeList(tree)
+			{
+				_self.employees =[];
+				//if(_self.employees.length<=0)
+				_self.filterEmployeeArray(tree)
+				for(let j = 0;j< tree.length;j++)
+					_self.filterEmployees(tree[j]);
+			},
+			filterEmployeeArray(arr)
+			{
+				_self.employees =[];
+				for(let j = 0;j< arr.length;j++)
+				{
+					if(arr[j].user)
+					{
+						_self.employees.push(arr[j]);
+					}
+				}
+			},
+			refreshOrganizationEmployeeList()
+			{ 
+				//console.log('aaaa') 
+				uni.request({
+				    url: this.kpi_url+ '/api/loadNeedAssessOrganizationAndUsers.do',//'http://192.168.77.99:8080/api/loadMonthWorkSummary.do',//?workNum='+this.employeeNumber+'&workMonth='+this.workMonth, //仅为示例,并非真实接口地址。
+				    data:{usId:this.employeeID},
+					method:'GET',
+					timeout:20000,
+				   
+				    success: (res) => {
+						console.log('res'+JSON.stringify(res.data));
+						 
+				       if(res.data.success){
+						   _self.tree = [];
+						   for(let j = 0;j< res.data.data.length;j++){
+							   if(res.data.data[j].type==0)
+							   {
+								   let item = {children: [],//都需要带这个
+										id: res.data.data[j].id,
+										name: res.data.data[j].name,
+										checked: false,
+										user: false};
+									_self.tree.push(item);
+									_self.process_tree_node(res.data.data[j],item);								   
+							   }
+						   } 
+						   _self.filterEmployeeList(_self.tree);
+						   
+							/*
+							let employees = res.data.data;
+						   
+							if(employees)
+							{
+								this.employees = employees;								 
+							}*/
+										 
+					   }
+					   else{
+					   console.log('fail')
+						  uni.showToast({
+						      title: res.data.exception,
+							  icon: 'error',
+						      duration: 2000
+						  }); 
+					   }
+				      
+				    },
+					fail:(res)=>{
+						 _self.employees =[];
+						 console.log('requrest failed')
+						 console.log(res);
+						 uni.showModal({
+						 	title:'提示',
+							content:'请求服务失败,请检查网络!',
+							showCancel:false
+						 })
+						
+						 
+					},
+					complete:()=>{
+						//uni.hideLoading();
+					}
+				});
+			}, 
+			back() {
+				console.log('test')
+				uni.navigateBack({
+					delta: 10
+				})
+			},
+			addMonth(date, months) {
+				    let y = date.getFullYear();
+				    let m = date.getMonth();
+				    var d = date.getDate();
+				
+			//		console.log('add month y' + y + ' m:' + m + ' d: ' + d + ' month: ' + months);
+				    y += Math.floor((m + 1 + months) / 12); //计算年
+				    m = Math.floor((m + 1 + months) % 12) - 1; //计算月
+					let _date = new Date(y,m,d);
+			//		console.log('result y:' + y + ' m: ' + m + '_date:' + _date);
+					return _date;
+				},
+			is_future_month(increment)
+			{
+				let date = new Date();
+				let page_date = new Date(this.year,this.month-1,1);
+				page_date = this.addMonth(page_date,increment)
+				let _y = date.getFullYear();//当前年
+				let _m = date.getMonth();//当前月
+				let _y1 = page_date.getFullYear();
+				let _m1 = page_date.getMonth(); 
+				if(_y1>_y)
+					return true;
+				if(_y1<_y)
+					return false;
+				if(_m1 > _m)
+					return true;
+				return false;
+				
+				
+			},
+			changeMonth(type){
+			    if(type=='pre'){
+			       if (this.month + 1 == 2) {
+			           this.month = 12;
+			           this.year = this.year - 1;
+			       } else {
+			           this.month = this.month - 1;
+			       } 
+			    }else{
+			        if (this.month + 1 == 13) {
+			            this.month = 1;
+			            this.year = this.year + 1;
+			        } else {
+			            this.month = this.month + 1;
+			        }
+			    } 
+				 
+			}
+		}
+	}
+</script>
+ 
+<style lang="scss"> 
+	@import url("/static/font/iconfont.css");
+	@import "@/common/pa_main.scss";
+     button::after { border: none }
+      
+	 .employee_list
+	 {
+		background-color:  #F1F1F1;
+		padding-top: 30rpx;
+		padding-left: 0rpx;
+		padding-right: 0rpx;
+ 	 }
+	 ::-webkit-scrollbar {  
+	     display: none;  
+	     width: 0 !important;  
+	     height: 0 !important;  
+	     -webkit-appearance: none;  
+	     background: transparent;  
+	 }
+	 
+	 	.colorFF8800 {
+	 		color: #FF8800;
+	 	}
+	 
+</style>

+ 665 - 0
pages/fill_log/fill_log.vue

@@ -0,0 +1,665 @@
+<template>
+	<view class="page-box">  <!--pa_column bg-primary pg_sb">-->
+		<view class="head-box">
+			<uni-nav-bar id="header_nav" left-icon="arrowleft" type="line" title="填写日志"  @clickLeft="back" />			
+		</view>
+		<!--cursor-spaceing="500rpx"-->
+		<form    @submit="formsubmit">
+			<view class="content-box_fixed  bg-grey">					
+			
+				<view class="pa_row pa-sb h-mid bg_whilecolor my-1 a-center"  >
+					<view class="mx-1">
+						<label class="mark_color font-weight">*</label>
+						<label class="font-weight">填报日期</label>				
+					</view>
+					<view class="pa_row">
+						<label class="pr-1 font-weight" @click="open">{{calendar}}<uni-icons color="#C8C8C8" type="arrowright"/></label> 
+					</view>
+				</view>
+				<view class="pa-column bg_whilecolor my-1 a-center w_auto " >
+<!--					:class="{h-20:windowHeight==0;}">-->
+					<view class="mx-1 font-weight">
+						<label class="mark_color font-weight">*</label>
+						<label>工作日志</label>				
+					</view>
+					<view class="uni-textarea ">
+						<textarea   class="w_auto mx-1 " :adjust-position="false" placeholder="请填写内容" maxlength="200" name="summary"  v-model="Summary">			
+						 
+						</textarea>
+					</view>
+				</view>
+				<view class="pa-column bg_whilecolor my-1 a-center w_auto  "   >
+				
+					<view class="mx-1  font-weight">
+						<label>工作计划(周填)</label>				
+					</view>
+					<view class="uni-textarea">						
+						<textarea  class="w_auto mx-1 "  :adjust-position="false" placeholder="请填写内容" maxlength="200" name="program" v-model="Program">						
+						</textarea>
+					</view>
+				</view>
+				<view class="pa-column bg_whilecolor my-1 a-center w_auto " ><!--:style="{height: 'calc(100%/5*'+ heightRatio+')'}"-->
+					<view class="mx-1  font-weight">
+						<label>信息单</label>				
+					</view>
+					<view class="uni-textarea">
+						<textarea  class="w_auto mx-1" :adjust-position="false" placeholder="请填写内容" maxlength="200" name="message" v-model="Message">
+							</textarea>						
+					</view>		
+				</view>
+				<view class="pa-column bg_whilecolor my-1 a-center  w_auto" >
+					<view class="mx-1  font-weight">
+						<label>成交单</label>				
+					</view>
+					<view class="uni-textarea ">
+						<textarea class="w_auto mx-1"  :adjust-position="false" placeholder="请填写内容" maxlength="200" v-model="Clinch">						
+						</textarea>						
+					</view>
+					
+				</view>		
+			</view>
+			
+			<view class="footer-box">
+				<button form-type="submit" class="btn_bgcolor btn_color">提交</button>			
+			</view>
+			
+		</form>
+		<uni-calendar ref="calendar" @change="change" class="uni-calendar--hook" :clear-date="true" :date="info.date" :insert="info.insert" :lunar="info.lunar" :startDate="info.startDate" :endDate="info.endDate" :range="info.range" @confirm="confirm" @close="close" />		
+	</view>
+</template>
+
+<script>
+	import uniCalendar from '@/components/uni-calendar/uni-calendar.vue'
+	import utils from '../../utils/common.js'
+	import store from '../../utils/store.js'
+	
+	var _self;
+	function getDate(date, AddDayCount = 0) {
+		if (!date) {
+			date = new Date()
+		}
+		 if (typeof date !== 'object') {
+		 	date = date.replace(/-/g, '/')
+		 }
+		const dd = new Date(date)
+	
+		dd.setDate(dd.getDate() + AddDayCount) // 获取AddDayCount天后的日期
+	
+		const y = dd.getFullYear()
+		const m = dd.getMonth() + 1 < 10 ? '0' + (dd.getMonth() + 1) : dd.getMonth() + 1 // 获取当前月份的日期,不足10补0
+		const d = dd.getDate() < 10 ? '0' + dd.getDate() : dd.getDate() // 获取当前几号,不足10补0
+		return {
+			fullDate: y + '-' + m + '-' + d,
+			year: y,
+			month: m,
+			date: d,
+			day: dd.getDay()
+		}
+	}
+	export default {
+	   components:{
+			uniCalendar
+	    },
+		onLoad:function(options) {
+		    _self = this;  
+			this.kpi_url=  uni.getStorageSync('kpi-url');
+			
+			this.windowOrignalHeight = this.getWindowHeight();
+			this.windowHeight = this.windowOrignalHeight;
+			//this.inputBoxHeight =this.windowOrignalHeight/5.0;
+			uni.onWindowResize((res) => {
+				this.windowHeight = this.getWindowHeight(); 
+				this.heightRatio = this.windowOrignalHeight/this.windowHeight;
+				//this.inputBoxHeight =this.windowHeight/5.0;
+			})
+			/**uni.onKeyboardHeightChange(res => {
+				this.windowHeight = res.size.windowHeight
+				this.windowWidth = res.size.windowWidth;
+				console.log('height' +this.windowHeight)
+			})*/
+ 			_self.date = new Date();				
+			if(options.date)
+			{
+				const date1 = JSON.parse(decodeURIComponent(options.date));
+				if(date1)
+				{
+					let year = date1.substr(0,4);
+					let month = date1.substr(5,2);
+					let day = date1.substr(8,2);
+					//let day = date1.substr(5,5);
+					//let date = year + ' ' + day;
+					//console.log('九九九九九'+ date);
+					_self.date = new Date(year,month-1,day);					 
+					
+					//console.log('date1'+ _self.date);
+				}	
+				//_self.log.Program =
+			}
+			
+			this.info.date = getDate(new Date(_self.date),0).fullDate
+			//console.log('test5'+this.info.date)
+			
+			this.info.startDate = getDate(new Date(_self.date),  -60).fullDate
+			//console.log('test2'+this.info.startDate)
+			
+			this.info.endDate = getDate(new Date(_self.date) , 30).fullDate
+			//console.log('test3'+this.info.endDate)
+			
+				this.info.selected = [{
+						date: getDate(new Date(_self.date), -5).fullDate,
+						info: '打卡'
+					} ,
+				]
+			  
+			if(uni.getSystemInfoSync().platform == 'ios')
+				_self.calendar =  utils.get_date_week_str_by_slash(_self.date);
+			else
+				_self.calendar =  utils.get_date_week_str(_self.date);
+			/////
+			//console.log(options.query)
+			// #ifdef APP-NVUE
+			const eventChannel = this.$scope.eventChannel; // 兼容APP-NVUE
+			// #endif
+			// #ifndef APP-NVUE
+			const eventChannel = this.getOpenerEventChannel();
+			// #endif
+			//eventChannel.emit('acceptDataFromOpenedPage', {data: 'test'});
+			//eventChannel.emit('someEvent', {data: 'test'});
+			// 监听acceptDataFromOpenerPage事件,获取上一页面通过eventChannel传送到当前页面的数据
+			eventChannel.on('acceptDataFromOpenerPage', function(data) {
+							  
+							 //console.log('xsxs'+data.data.summary);
+							 
+							 if(data && data.data && data.data.remarks)
+							 {
+								 console.log('xxxxx data:'+JSON.stringify(data));
+								if(data.data.remarks.summary)
+									_self.Summary = data.data.remarks.summary;
+								if(data.data.remarks.message)
+									_self.Message = data.data.remarks.message;
+								if(data.data.remarks.clinch)
+									_self.Clinch = data.data.remarks.clinch;
+								if( data.data.remarks.program)
+									_self.Program = data.data.remarks.program;
+							   //console.log('data111'+JSON.stringify(data));
+								 
+							 }
+							   //console.log('data:' + _self.Summary);
+			});
+			//////
+		 
+			this.employeeID =  uni.getStorageSync('usId');
+			if(!this.employeeID || this.employeeID.length<=0)
+			{
+				uni.showToast({
+					title: '未设置员工ID',
+											  icon: 'error',
+					duration: 2000
+				}); 
+				return;
+			}		 
+	
+			 
+		}, 
+		activated()
+		{
+			
+			  
+		},
+		onReady() {
+			this.doReady();
+		},
+		data() {
+			return {
+				heightRatio:1,
+				windowOrignalHeight:0,
+				windowHeight:0,
+				count:1,
+				calendar:'',
+				showCalendar: false,
+				employeeID:'',
+				kpi_url:'',// 
+				//log:{
+					Program:'',//工作计划
+					Summary:'',//工作安排
+					Message:'',//信息单;
+					Clinch:'',//成交单
+				//},
+				info: {
+					lunar: true,
+					range: true,
+					insert: false,
+					date:utils.get_date_str(new Date()),
+					startDate:utils.get_date_str(utils.addMonth(new Date(),-1)),
+					endDate:utils.get_date_str(utils.addMonth(new Date(),1)),
+					selected: []
+				}
+			}
+		},
+		methods:{
+			getWindowHeight(){
+				var result = 0;
+				uni.getSystemInfo({
+						success: function(res) {
+							//console.log(res.windowHeight);// print 610
+							result = uni.upx2px(res.windowHeight)  // 这里加200或者加100为了看测试效果
+							// 不加200默认 return 292
+						}
+				});
+				return result;
+			  },
+			doReady()
+			{
+				
+				if(this.employeeID)
+				{
+					//setTimeout(() => {
+					
+					this.info.date = getDate(new Date(_self.date),0).fullDate
+					//console.log('test5'+this.info.date)
+					
+					this.info.startDate = getDate(new Date(_self.date),  -60).fullDate
+					//console.log('test2'+this.info.startDate)
+					
+					this.info.endDate = getDate(new Date(_self.date) , 30).fullDate
+					//console.log('test3'+this.info.endDate)
+					
+						this.info.selected = [{
+								date: getDate(new Date(_self.date), -5).fullDate,
+								info: '打卡'
+							} ,
+						]
+					
+					//let year = this.info.date.substr(0,4);
+					//let month = this.info.date.substr(5,2);
+					//let day = this.info.date.substr(8,2);
+					//console.log('year '+year + month + 'month '+ month + 'day '+day);
+					//this.refreshSummary(year,month,day);
+								
+						//console.log('test1'+this.info.startDate)
+					//}, 2000)
+				}
+
+			},
+			open() {
+				this.$refs.calendar.open()
+				 
+			},
+			
+			back() {
+				console.log('test')
+				uni.navigateBack({
+					delta: 1
+				})
+			},
+			confirm(e) {
+				let year = e.fulldate.substr(0,4);
+				let day = e.fulldate.substr(5,5);
+				let date = year + '-' + day;				
+				//
+				// console.log('day '+e.fulldate);
+				let _month = e.fulldate.substr(5,2);
+				let _day = e.fulldate.substr(8,2);
+				this.date = new Date(date);
+				//console.log('log ' + this.employeeID)
+				if(uni.getSystemInfoSync().platform == 'ios')
+					_self.calendar =  utils.get_date_week_str_by_slash(_self.date);
+				else
+					_self.calendar =  utils.get_date_week_str(_self.date);
+//				this.calendar = utils.get_date_week_str(this.date);
+				this.refreshSummary(year,_month,_day);
+
+				console.log('confirm 返回:', this.calendar);
+				setTimeout(() => {
+				
+				this.info.date = getDate(new Date(_self.date),0).fullDate
+				this.info.startDate = getDate(new Date(_self.date),  -60).fullDate
+				this.info.endDate = getDate(new Date(_self.date) , 30).fullDate
+				
+					this.info.selected = [{
+							date: getDate(new Date(_self.date), -5).fullDate,
+							info: '打卡'
+						} ,
+					]
+					
+					//console.log('test1'+this.info.startDate)
+				}, 2000)
+			}, 
+			change(e){
+				console.log('change'+e);
+			},
+			close() {
+				console.log('弹窗关闭');
+			},
+			getUserIdByWorkNum(workNumber)
+			{
+				//let workMonth = _year.toString()+'-'+utils.formatNum(month);
+				 
+				uni.request({
+				    url: this.kpi_url +'/api/getUsIdByNum.do',//'http://192.168.77.99:8080/api/loadMonthWorkSummary.do',//?workNum='+this.employeeNumber+'&workMonth='+this.workMonth, //仅为示例,并非真实接口地址。
+				    data:{workNum:workNumber},
+					method:'GET',
+					/*header: {
+					  'content-type': 'application/x-www-form-urlencoded' //自定义请求头信息
+					},*/
+					timeout:20000,
+				   
+				    success: (res) => {
+						//console.log('refreshMonthAssess:'+JSON.stringify(res.data));
+						//return;
+				       if(res.data.success){
+						  
+						    if(res.data.data)
+							{								
+								this.employeeID = res.data.data;
+								uni.setStorageSync('usId',this.employeeID);		
+								_self.doReady();
+								console.log('usID' + this.employeeID);	 
+								
+							}else
+							{
+								let _content ='工号'+ workNumber+'未找到';
+								uni.showModal({
+									title:'提示',
+										content:_content,
+										showCancel:false
+								})
+							}
+										 
+					   }
+					   else{
+						  console.log('fail  getUserIdByWorkNum')
+						  uni.showToast({
+						      title: res.data.exception,
+							  icon: 'error',
+						      duration: 2000
+						  }); 
+					   }
+				      
+				    },
+					fail:(res)=>{
+						console.log('requrest getUserIdByWorkNum failed')
+						 console.log(res);
+						 uni.showModal({
+						 	title:'提示',
+							content:'请求用户ID失败,请检查网络!',
+							showCancel:false
+						 })
+						
+						 
+					},
+					complete:()=>{
+						//uni.hideLoading();
+					}
+				});
+			}, 
+			refreshSummary(year,month,day)
+			{
+				//this.year = year;
+				//this.month = month;	
+				 
+				let _workMonth= year +'-'+ utils.formatNum(month);
+				let _workDate = year +'-'+ utils.formatNum(month)+'-'+ utils.formatNum(day);
+				this.Summary = '';
+				this.Clinch = '';
+				this.Program = '';
+				this.Message = '';
+
+				uni.request({
+					url: this.kpi_url+ '/api/loadMonthWorkSummary.do',//'http://192.168.77.99:8080/api/loadMonthWorkSummary.do',//?workNum='+this.employeeNumber+'&workMonth='+this.workMonth, //仅为示例,并非真实接口地址。
+					data:{usId:this.employeeID,workMonth:_workMonth},
+					method:'GET',
+					timeout:20000,
+				   
+					success: (res) => {
+					   console.log('res'+JSON.stringify(res.data));
+						 
+					   if(res.data.success){
+						  
+						  let work_logs = res.data.data.workLogs;
+							
+							if(work_logs)
+							{
+								
+//								console.log('xxxxx'+JSON.stringify(this.work_logs));
+								for(let i = 0;i< work_logs.length;i++)
+								{
+									if(work_logs[i].workDate == _workDate)
+									{
+										console.log('i'+i+JSON.stringify(work_logs[i]));
+										if(work_logs[i].program)
+											this.Program = work_logs[i].program;
+										if(work_logs[i].clinch)
+											this.Clinch = work_logs[i].clinch;
+										if(work_logs[i].message)
+											this.Message = work_logs[i].message;
+										if(work_logs[i].summary)
+											this.Summary = work_logs[i].summary;
+									}
+									//if(work_logs[i].summaryLen>0)
+									//	this.$refs.ren.set_status_by_datestr1(this.work_logs[i].workDate,1);
+									//else
+								//		this.$refs.ren.set_status_by_datestr1(this.work_logs[i].workDate,3);
+									
+								} 
+							}
+										 
+					   }
+					   else{
+					   console.log('fail')
+						  uni.showToast({
+							  title: res.data.exception,
+							  icon: 'error',
+							  duration: 2000
+						  }); 
+					   }
+					  
+					},
+					fail:(res)=>{
+						console.log('requrest failed')
+						 console.log(res);
+						 uni.showModal({
+							title:'提示',
+							content:'请求服务失败,请检查网络!',
+							showCancel:false
+						 })
+						
+						 
+					},
+					complete:()=>{
+						uni.hideLoading();
+					}
+				});
+			}, 
+			 loadDailySubmitData(id,_workDate)
+			 { 
+				console.log('loadDailySubmitData id'+id+'workDate'+_workDate);
+				uni.request({
+			 	    url: this.kpi_url+ '/api/loadDailySubmitData.do',//'http://192.168.77.99:8080/api/loadMonthWorkSummary.do',//?workNum='+this.employeeNumber+'&workMonth='+this.workMonth, //仅为示例,并非真实接口地址。
+			 	    data:{usId:id,workDate:_workDate},
+			 		method:'GET',
+					/**header: {
+					  'content-type': 'application/x-www-form-urlencoded' //自定义请求头信息
+					},*/
+			 		timeout:20000,
+			 	   
+			 	    success: (res) => {
+			 			console.log('读取日报数据'+JSON.stringify(res));
+			 			return; 
+			 	       if(res.data.success){
+			 			  if(res.data.data)
+			 			  {
+			 				  let total = 0;
+			 				  if(res.data.data.total)
+			 				  {
+			 					  total = res.data.data.total;
+			 					  //console.log('total'+total);
+			 				  }
+			 				  let daily_report_statistics = res.data.data.rpt;
+			 				  //this.$refs.ren.set_status(year,month);
+			 				   
+			 					if(daily_report_statistics)
+			 					{
+			 						console.log('res'+JSON.stringify(daily_report_statistics));
+			 						this.daily_report_statistics = [];
+			 						for(let i = 0;i< daily_report_statistics.length;i++)
+			 						{
+			 							//console.log('xxxx')
+			 							let statistics = daily_report_statistics[i];
+			 							if(statistics.submitDate>todaystr)
+			 								continue;
+			 							let _unsubmitted = total-statistics.submitCount;
+			 							let _onDuty = true;
+			 							if(!statistics.submitCount)
+			 							{
+			 								if(this.isHoliday(statistics.submitDate))
+			 									_onDuty=false;
+			 								if(!this.isWorkDay(statistics.submitDate))
+			 									_onDuty = false;
+			 							}
+			 							this.daily_report_statistics.push({on_duty:_onDuty,date_str:statistics.submitDate,submitted:statistics.submitCount,unsubmitted:_unsubmitted})	
+			 								//console.log('Date: '+statistics.submitDate);
+			 						}
+			 						 
+			 					}
+			 			  }
+			 
+			 							 
+			 		   }
+			 		   else{
+			 		   console.log('fail')
+			 			  uni.showToast({
+			 			      title: res.data.exception,
+			 				  icon: 'error',
+			 			      duration: 2000
+			 			  }); 
+			 		   }
+			 	      
+			 	    },
+			 		fail:(res)=>{
+			 			console.log('requrest failed')
+			 			 console.log(res);
+			 			 uni.showModal({
+			 			 	title:'提示',
+			 				content:'请求服务失败,请检查网络!',
+			 				showCancel:false
+			 			 })
+			 			
+			 			 
+			 		},
+			 		complete:()=>{
+			 			//uni.hideLoading();
+			 		}
+			 	});
+			 }, 
+			  
+			formsubmit:function(e)
+			{
+				//this.count++;
+				//console.log('xxxxxx'+this.count);
+				//console.log('date: '+ utils.get_date_str(_self.date));
+				//console.log('datetime: '+_self.get_datetime_str(_self.date));
+				let datestr = utils.get_date_str(this.date);
+				let datetimestr = utils.get_datetime_str(new Date());
+				var formdata = e.detail.value 
+				//console.log(formdata);				 
+				//console.log('date'+ datestr);
+				//console.log('datetimestr'+datetimestr);
+				//console.log('id'+ this.employeeID);
+				//console.log('log'+JSON.stringify(this.log))
+				uni.request({
+				    url: this.kpi_url+ '/api/saveDailyWorkSummary.do',//'http://192.168.77.99:8080/api/loadMonthWorkSummary.do',//?workNum='+this.employeeNumber+'&workMonth='+this.workMonth, //仅为示例,并非真实接口地址。
+				    data:{
+						userid:this.employeeID,
+						  dates:datestr,
+						  program:this.Program,
+						  pid:this.employeeID,
+						  summary:this.Summary,
+						  sid:this.employeeID,
+						 // modifytime:datetimestr,
+						  message:this.Message,
+						  mid:this.employeeID,
+						  clinch:this.Clinch,
+						  cid:this.employeeID
+						  },
+					   header: {
+							  'content-type': 'application/x-www-form-urlencoded' //自定义请求头信息
+						  },
+					method:'POST',
+					timeout:20000,
+				   
+				    success: (res) => {
+						console.log('saveDailyWorkSummary'+JSON.stringify(res.data));
+						 
+				       if(res.data.success){
+						  
+						   uni.navigateTo({
+						   	url:'../work_log/work_log',
+						   	 success: function(res) {
+						   	     // 通过eventChannel向被打开页面传送数据
+								 //console.log('fill xxxx')
+						   	     res.eventChannel.emit('acceptDataFromOpenerPage', { data: {action:'fill_log',date:datestr} })
+						   	   }
+						   })
+										 
+					   }
+					   else{
+					   console.log('fail')
+						  uni.showToast({
+						      title: res.data.exception,
+							  icon: 'error',
+						      duration: 2000
+						  }); 
+					   }
+				      
+				    },
+					fail:(res)=>{
+						console.log('requrest failed')
+						 console.log(res);
+						 uni.showModal({
+						 	title:'提示',
+							content:'请求服务失败,请检查网络!',
+							showCancel:false
+						 })
+						
+						 
+					},
+					complete:()=>{
+						uni.hideLoading();
+					}
+				});
+				console.log('formsubmit');
+			},
+			formreset:function(e)
+			{
+				console.log('formreset')
+			}			
+		}
+		
+	}
+	
+</script>
+
+<style lang="scss">
+	@import "@/common/pa_main.scss";
+	
+	
+	.content {
+	   // padding-top: 50rpx;
+		.change{
+	        display: flex;
+	        align-items: center;
+	        justify-content: center;
+	        margin: 0 auto;
+	        margin-top: $margin_10;
+	        height: $default_row_height;
+	        color: $al_fgcolor;
+	        background-color: $al_bgcolor;
+			
+	    }
+		.head-box
+		{
+			
+		}
+	}
+</style>

+ 1157 - 0
pages/month_comment_score/month_comment_score.vue

@@ -0,0 +1,1157 @@
+<template>
+	<view class="page-box">
+		<view class="head-box">
+			<uni-nav-bar id="header_nav" left-icon="arrowleft" type="line" title="月评打分"  @clickLeft="back" />			
+		</view>
+		<form   @submit="formsubmit">
+		<view class="content-box">
+			 <view>
+				<view class="pa_row pa-sb h-mid bg_whilecolor mb-1 a-center border-bottom mx-1"  >
+					<view class="mx-1">
+						<label class="mark_color font-weight">*</label>
+						<label class="font-weight">针对员工</label>				
+					</view>
+					<view class="pa_row w-30">
+						<uniRightCombox class="w-100 m-0 p-0" ref="logtype"  :candidates="employees"  :value="employee.name" @update:modelValue="onEmplyeeClick"></uniRightCombox>
+						
+						
+						<!--<label class="pr-1 font-weight" @click="toggleSelector">{{employee.name}}<uni-icons color="#C8C8C8" type="arrowright"/></label> -->
+					</view>
+ 
+ 
+				</view>
+				
+				<view class="pa_row pa-sb h-mid bg_whilecolor mx-1 a-center"  >
+					<view class="mx-1">
+						<label class="mark_color font-weight">*</label>
+						<label class="font-weight">针对日期</label>				
+					</view>
+					<view class="pa_row">
+						<label class="pr-1 font-weight" @click="open">{{dateweek}}<uni-icons color="#C8C8C8" type="arrowright"/></label> 
+					</view>
+				</view>				 
+			 </view>
+			
+			 <view class="pt-1 border-top-10" v-for="(item,index) in projects" :key="index">
+				 <view>
+					 <label class="pl-1 font-weight font_sm">{{item.name}}
+					 <label v-show="item.score>0">:{{item.score}}分</label></label>					 
+				 </view>
+				 
+				 <view class="px-1" v-show="item.type==2">
+					 <view class="pa_column pb-1" :class="{border_bottom_1:index1<(item.items.length-1)}" v-for="(item1,index1) in item.items" :key="index1">
+						 <view class="pa_row pa-sb">
+							 <view class="w-85">
+								 <view class="h-100 pa_column j-center">
+									 <label class="radio a-center j-center ">
+										 {{item1.text}}({{item1.unit}})
+									 </label>								 
+								 </view>
+							 </view>
+						 </view>
+						<view class="pa_row pa-sb" >
+							<slider-number :name="item1.text"  :id="item1.id" :disabled="disabled" :min="item1.slider_min" :max="item1.slider_max" :step="item1.slider_step" v-model="item1.value"></slider-number>
+						</view>	  
+								     
+					 </view>
+				 </view>
+				  
+				 <view class="px-1" v-show="item.type==1"> 			 
+						 <view class="pa_column   pb-1 " :class="{border_bottom_1:index1<(item.items.length-1)}" v-for="(item1,index1) in item.items" :key="index1">
+							 <view class="pa_row pa-sb">
+								 <view class="w-85">
+									 <view class="h-100 pa_column j-center">
+										 <label class="radio a-center j-center " >
+											<radio :value="item1.id.toString()" :checked="item1.checked"  @click="_group_clicked(item1.id)" />{{item1.text}}
+										 </label>								 
+									 </view>
+								 </view>
+								 <view class="w-15">
+									<input type="number" :id="item1.id" class="uni-input bg-grey my-1 rounded-10" @input="onKeyInput"  v-model="item1.value" 
+										:class="{textred:item1.value<0,
+										textgrey:item1.value>=0}"/>								 
+								 </view>
+							 </view>
+							  
+												
+						 </view> 
+						 
+				 </view>
+ 
+			 </view>
+ 
+		</view>
+
+		<view class="footer-box">
+			<view class="pa_row a-center h-100">		
+	<!--			<view class="w-50">
+					<label class="font-sm lh_footer mx-2" >得分:</label>
+					<label class="font-sm lh_footer">{{score.toFixed(2)}}</label>					
+				</view>-->
+				<button  form-type="submit" class="w-100 btn_bgcolor btn_color">提交</button>			
+			</view>
+		</view>
+		</form>
+		<uni-calendar ref="calendar" @change="change" class="uni-calendar--hook" :clear-date="true" :date="info.date" :insert="info.insert" :lunar="info.lunar" :startDate="info.startDate" :endDate="info.endDate" :range="info.range" @confirm="confirm" @close="close" />		
+		
+	</view>
+</template>
+
+<script>
+	import utils from '../../utils/common.js'
+	import store from '../../utils/store.js'
+	
+	import RenCalendar from '@/components/ren-calendar/ren-calendar.vue'
+	import uniRightCombox from '@/components/uni-right-combox/uni-right-combox.vue'
+	import uniNumberBox from '@/components/uni-number-box/uni-number-box.vue'
+	import sliderNumber from '@/components/slider-number/slider-number.vue'
+	var _self;
+	export default {
+		components:{
+		    RenCalendar,
+			uniRightCombox,
+			uniNumberBox,
+			sliderNumber
+		},
+		data() {
+			return {  
+				showSelector:false,
+				
+				kpi_url:'',
+				template:'',
+				calendar:'',
+				workNums:0,
+				score:0,
+				init_score :0,
+				info: {
+					lunar: true,
+					range: true,
+					insert: false,
+					date:utils.get_date_str(new Date()),
+					startDate: utils.get_date_str(utils.addMonth(new Date(),-1)),
+					endDate:utils.get_date_str(utils.addMonth(new Date(),1)),
+					selected: []
+				},
+				disabled:false,				
+				level:0,
+				projects:[
+					 
+					],
+				dtl:[
+					 
+				],
+				employee:{id:'0',name:''},//{id:1,name:'李广宵'},
+				employees:[
+					//{id:'1',value:'zhupeng'},
+				//{id:'2',value:'zhupeng2'},
+				//{id:'3',value:'zhupeng3'},
+				//{id:'4',value:'zhupeng4'},
+				//{id:'5',value:'zhupeng5'}
+				],
+				year:new Date().getFullYear(),
+				month:new Date().getMonth()+1,
+				day:new Date().getDate()
+				//dateweek:'2021-10-01 星期一'
+			}
+		},
+		onLoad()
+		{
+			console.log("onLoad");
+			_self = this;
+			_self.disabled = false;
+			//console.log('xxx'+this.info.date);
+			
+			this.kpi_url=  uni.getStorageSync('kpi-url');
+			//console.log('kpi_url'+this.kpi_url)
+			this.employeeID =  uni.getStorageSync('usId');
+			if(!this.employeeID || this.employeeID.length<=0)
+			{
+				uni.showToast({
+				    title: '未设置员工ID',
+											  icon: 'error',
+				    duration: 2000
+				}); 
+				return;
+			}
+			this.refreshEmployeeList();
+			_self.onActivate();
+			
+		},
+		activated()
+		{
+			console.log("activate");
+			_self.onActivate();
+			
+ 		},
+		onReady()
+		{
+			
+			 
+		},
+		computed: {
+		    // 顶部星期栏
+		    dateweek() {
+				let  str  = utils.get_date_week_str(new Date(this.year,this.month-1,this.day));
+				//console.log('xxxxxxxxxx'+str);
+		        return str;
+		    } 
+		},
+		methods:
+		{
+			onActivate()
+			{
+				_self.disabled = false;
+				
+				//setTimeout(() => {
+					//console.log('ready  month comment score')
+				 
+				//},2000);
+				
+				// #ifdef APP-NVUE
+				const eventChannel = this.$scope.eventChannel; // 兼容APP-NVUE
+				// #endif
+				// #ifndef APP-NVUE
+				const eventChannel = this.getOpenerEventChannel();
+				// #endif
+				eventChannel.on('acceptDataFromOpenerPage', function(data) {
+					   if(data)
+					   {
+						    let param = data.data;
+						   if(param)
+						   {
+								console.log('month score activated'+JSON.stringify(data));
+							   if(param.action && param.action=='employee_daily_report')
+							   {
+								   if(param.month)
+								   {
+									   let year = Number(param.month.substr(0,4));
+									   let month = Number(param.month.substr(5,2));
+									   _self.year = year;
+									   _self.month = month;
+									   _self.day = 1;
+									   _self.info.startDate = utils.get_date_str(utils.addMonth(new Date(year,month-1,1),-1));
+									   _self.info.date = utils.get_date_str(new Date(year,month-1,_self.day));
+									   _self.info.endDate= utils.get_date_str(utils.addMonth(new Date(year,month-1,1),1));
+									   //console.log('date'+_self.info.startDate);
+									   //console.log('date'+_self.info.date);
+									   //console.log('date'+_self.info.endDate);
+									   if(param.maxdate_day)
+											_self.day = param.maxdate_day;
+									   //utils.addMonth(new Date(_self.year,_self.month,_self.))
+									   //console.log('year'+_self.year+'month'+_self.month);
+								   }
+								   if(param.employee)
+								   {
+									   console.log("employee"+JSON.stringify(param))
+									   _self.employee = param.employee;//{id:param.,name:'李广宵'}, 
+									   _self.LoadKpiTemplate(_self.employee.id,_self.employeeID);
+								   }
+									
+							   }
+						   }
+					   }
+				});
+			},
+			onEmplyeeClick(data)
+			{
+				if(data.id && data.value)
+				{
+					this.employee = {id:data.id,name:data.value};
+					//console.log("employee click"+JSON.stringify(this.employee))
+					this.LoadKpiTemplate(this.employee.id,this.employeeID);
+					
+				}
+				
+				//console.log('data'+JSON.stringify(data));
+			},
+			onKeyInput: function(event) {
+				//this.title++;
+				//console.log('input id'+ event.target.value);
+				//this.inputValue = event.target.value
+				//console.log('input id ' + event.target.id);
+				let itemIndex = this.findDtlById(event.target.id);
+				if(itemIndex>=0)
+				{
+					let projectIndex = this.findProjectById(this.dtl[itemIndex].fid); 
+					if(projectIndex>=0)
+					{
+					    for(let i = 0;i< this.projects[projectIndex].items.length;i++)
+						{
+							if(this.projects[projectIndex].items[i].id == event.target.id)
+							{
+								let maxvalue = this.projects[projectIndex].items[i].unitvalue;
+								if(maxvalue>0)
+								{
+									
+									//console.log('xxxx')
+									if(Number(event.target.value) >this.workNums){
+										this.projects[projectIndex].items[i].value = this.workNums;
+										//console.log('11xxxx' + this.projects[projectIndex].items[i].value)
+									}
+									else{
+										
+										if(Number(event.target.value) < 0){
+											this.projects[projectIndex].items[i].value = 0;
+											//console.log('22xxxx')
+										}
+									}
+									this.projects[projectIndex].items[i].multiple = this.projects[projectIndex].items[i].value;
+									console.log('name'+this.projects[projectIndex].name + ' text: '+ this.projects[projectIndex].items[i].text);
+									console.log('单位最大值'+ this.projects[projectIndex].items[i].unitvalue);
+									console.log('倍数最大值'+ this.projects[projectIndex].items[i].multiple);
+									console.log('最大值'+ this.projects[projectIndex].items[i].value);
+									
+								}
+							}
+						}
+					}
+				}
+				
+				 this.calc_score();
+			},
+			 
+			open() {
+				this.$refs.calendar.open()
+				 
+			},
+			findDtlByName(projectIndex,name)
+			{
+				if(projectIndex>=this.projects.length)
+					return -1;
+					
+				for(let i = 0;i<this.projects[projectIndex].items.length;i++)
+				{
+					if(this.projects[projectIndex].items[i].text == name)
+					{
+						
+						if(name == '无信息单')
+						{
+							console.log('无信息单 ' + i);
+						}
+						return i;
+					}
+				}
+				return -1;
+			},
+			findProjectByName(name)
+			{
+				for(let i = 0;i<this.projects.length;i++)
+				{
+					if(this.projects[i].name == name)
+					{
+						/*if(name == '销售任务')
+						{
+							console.log('销售任务 ' + i);
+						}*/
+						return i;						
+					}
+				}
+				return -1;
+			},
+			findDtlById(id)
+			{
+				for(let i = 0;i<this.dtl.length;i++)
+				{
+					if(this.dtl[i].id == id)
+						return i;
+				}
+				return -1;
+			},
+			findProjectById(id)
+			{
+				for(let i = 0;i<this.projects.length;i++)
+				{
+					if(this.projects[i].id == id)
+						return i;
+				}
+				return -1;
+			},
+			clicked:function(_id)
+			{
+				//console.log('clicked' +_id)
+				let itemIndex = this.findDtlById(_id);
+				if(itemIndex<0)
+				{
+					//console.log('not find dtl index '+_id);
+					return;
+				}
+				let projectIndex = this.findProjectById(this.dtl[itemIndex].fid); 
+				if(projectIndex<0)
+				{
+					//console.log('not find project index '+this.dtl[itemIndex].fid);
+					return;
+				}
+				//console.log('log Index : '+itemIndex +'project Index: ' +projectIndex)
+				//return;
+				for (let i = 0; i < this.projects[projectIndex].items.length; i++) {
+					//console.log('id:'+this.projects[projectIndex].items[i].id);
+					if (this.projects[projectIndex].items[i].id === _id) {
+						//console.log('find item'+ _id)
+						this.projects[projectIndex].items[i].checked = !this.projects[projectIndex].items[i].checked;
+						break;
+					}
+				}
+				this.calc_score();
+			},
+			_group_clicked:function(_id)
+			{
+				console.log('_group_clicked ' +_id )
+				let itemIndex = this.findDtlById(_id);
+				if(itemIndex<0)
+				{
+					//console.log('not find dtl index '+_id);
+					return;
+				}
+				let projectIndex = this.findProjectById(this.dtl[itemIndex].fid); 
+				if(projectIndex<0)
+				{
+					//console.log('not find project index '+this.dtl[itemIndex].fid);
+					return;
+				}
+				
+				//console.log('selectedIndex : '+this.projects[projectIndex].selectedIndex )
+				//return;
+				if(this.projects[projectIndex].selectedIndex== _id)
+				{
+					for (let i = 0; i < this.projects[projectIndex].items.length; i++) {
+						//console.log('id:'+this.projects[projectIndex].items[i].id);
+						if (this.projects[projectIndex].items[i].id == _id) {
+							//console.log('find item'+ _id)
+							if(this.projects[projectIndex].selectedIndex == _id)
+							{
+								console.log('unselected:'+_id);
+								this.projects[projectIndex].selectedIndex = -1;
+							} 
+							this.projects[projectIndex].items[i].checked = false;														
+						}
+					}
+					
+				}else
+				{
+					for (let i = 0; i < this.projects[projectIndex].items.length; i++) {
+						//console.log('id:'+this.projects[projectIndex].items[i].id);
+						if (this.projects[projectIndex].items[i].id == _id) {
+							this.projects[projectIndex].selectedIndex = _id;
+							this.projects[projectIndex].items[i].checked = true;	
+							console.log('xxx'+JSON.stringify(this.projects[projectIndex].items[i]))
+						}else
+						{
+							//this.projects[projectIndex].selectedIndex = -1;
+							this.projects[projectIndex].items[i].checked = false;														
+							
+						}
+					}
+					
+				}
+				this.calc_score();
+			},
+			changed:function(evt)
+			{
+				//console.log('changed' +evt.detail.value)
+				let itemIndex = this.findDtlById(evt.detail.value);
+				if(itemIndex<0)
+				{
+					//console.log('not find dtl index '+evt.detail.value);
+					return;
+				}
+				let projectIndex = this.findProjectById(this.dtl[itemIndex].fid); 
+				if(projectIndex<0)
+				{
+					//console.log('not find project index '+this.dtl[itemIndex].fid);
+					return;
+				}
+				//console.log('log Index : '+itemIndex +'project Index: ' +projectIndex + )
+				//return;
+				for (let i = 0; i < this.projects[projectIndex].items.length; i++) {
+					//console.log('id:'+this.projects[projectIndex].items[i].id);
+					if (this.projects[projectIndex].items[i].id.toString() === evt.detail.value) {
+						//console.log('find item'+ evt.detail.value)
+						if(!this.projects[projectIndex].items[i].checked)
+						{
+							this.projects[projectIndex].selectedIndex = evt.detail.value;
+							this.projects[projectIndex].items[i].checked = true;							
+						}else
+						{
+							this.projects[projectIndex].selectedIndex = -1;
+							this.projects[projectIndex].items[i].checked = false;														
+						}
+						//this.projects[projectIndex].items[i].checked = !this.projects[projectIndex].items[i].checked;
+						//break;
+					}else{
+						this.projects[projectIndex].items[i].checked = false;
+					}
+				}
+			},
+			/*updateUnitValue()
+			{
+				if(this.projects)
+				{
+					  for(let index = 0;index<this.projects.length;index++)
+					  {
+						  if(this.projects[index].name =='工作分')
+						  {
+							  for(let index1 = 0;index1<this.projects[index].items.length;index1++)
+							  {
+								  let text = this.projects[index].items[index1].text;
+								  //console.log('xxx'+text)
+								  
+								 if(text.indexOf('工作量')>=0)
+								 {
+									  let score = 60/this.workNums;
+									  this.projects[index].items[index1].unitvalue = score;
+									  //if(!this.projects[index].items[index1].multiple)
+	  									//	this.projects[index].items[index1].multiple = 0;
+									  this.projects[index].items[index1].memo = this.workNums +'个工作日 ' + score.toFixed(2) + '分/天';
+									  console.log('工作量 unitvalue '+score);									  
+								 }else if(text.indexOf('工作日志')>=0)
+								  {
+									  let score = 100/this.workNums;
+									  this.projects[index].items[index1].unitvalue = score;
+									  //if(!this.projects[index].items[index1].multiple)
+									  //	this.projects[index].items[index1].multiple = 0;
+									  this.projects[index].items[index1].memo = this.workNums +'个工作日 ' + score.toFixed(2) + '分/天';
+									  console.log('工作日志 unitvalue ' +score);
+								  }
+								   
+								  //console.log('zzz')
+							  }
+						  } 
+					  
+					  }		
+					  
+					  this.refreshMonthAssess(_self.year,_self.month);
+				}
+				
+			},
+			LoadWorkLog(_year,_month)
+			{
+				let workMonth = 'WorkDays_' +_year.toString() +'-' + utils.formatNum(_month);
+				let workDays = uni.getStorageSync(workMonth);
+				if(workDays)
+				{
+					_self.workNums = workDays;
+					_self.updateUnitValue();
+					//console.log('读取工作天数:'+workMonth + ':'+workDays);
+					return;
+				}
+				
+				uni.request({
+					url: 'https://xpgjapi.xiaoxinda.com/mobile/workAttendance/queryMonthWorkDays',//'http://192.168.77.99:8080/api/loadMonthWorkSummary.do',//?workNum='+this.employeeNumber+'&workMonth='+this.workMonth, //仅为示例,并非真实接口地址。
+					data:{year:_year,month:_month},
+					method:'POST',
+					timeout:20000,
+				    header: {
+					  'content-type': 'application/x-www-form-urlencoded' //自定义请求头信息
+				    },
+					success: (res) => {
+						
+						if(res.statusCode==200)
+						{
+							if(res.data)
+							{
+								_self.workNums = res.data;								
+								uni.setStorageSync(workMonth,_self.workNums);
+								//console.log('result:' +JSON.stringify(res));
+								_self.updateUnitValue();
+								//console.log('读取工作天数【'+workMonth + ':'+JSON.data(_self.workNums));
+								//console.log('res'+this.workNums);
+								return ; 
+								
+							}
+						}					  
+					},
+					fail:(res)=>{
+						 //console.log('LoadWorkLog requrest failed')
+						 console.log(res);
+						 uni.showModal({
+							title:'提示',
+							content:'请求工作天数失败,请检查网络!',
+							showCancel:false
+						 })
+						
+						 
+					},
+					complete:()=>{
+						uni.hideLoading();
+					}
+				});
+			},*/
+			sortByIndex(index,name)
+			{
+				let destIndex = index;
+				for(;index < this.projects.length;index++)
+				{
+					if(this.projects[index].name==name)
+					{
+						let temp = this.projects[index];
+						this.projects[index] = this.projects[destIndex];
+						this.projects[destIndex] = temp;
+						return destIndex;
+					}
+				}
+				return -1;				
+			},
+			filter_item(item)
+			{
+				let _item = Object.assign({},item);
+				_item.items = [];
+				//let _item = {fid:item.fid,is_month_assess:item.is_month_assess,score:item.score,del_flag:item.del_flag,name:item.name,is_day_assess:item.is_day_assess,id:item.id,type:item.type,is_multiple:item.is_multiple,items:[]};
+				for(let j=0;j<item.items.length;j++)
+				{
+					if(item.items[j].is_month_assess)
+					{
+						_item.items.push(item.items[j]);
+					}
+				}
+				//console.log('item'+JSON.stringify(_item));
+				return _item;
+			},
+			LoadKpiTemplate(_usId,_evalUsId)
+			{
+				//console.log('读取考勤模板usId ' + _usId + ' evalUsId '+_evalUsId +'assessMonth'+this.info.date );
+				
+ 				uni.request({
+					url: this.kpi_url+ '/api/loadAssessTemplate.do',//'http://192.168.77.99:8080/api/loadMonthWorkSummary.do',//?workNum='+this.employeeNumber+'&workMonth='+this.workMonth, //仅为示例,并非真实接口地址。
+					data:{usId:_usId,evalUsId:_evalUsId,assessMonth:this.info.date},
+					method:'GET',
+					timeout:20000,
+				   /*header: {
+					  'content-type': 'application/x-www-form-urlencoded' //自定义请求头信息
+				  },*/
+					success: (res) => {
+					   //console.log('loadAssessTemplate'+JSON.stringify(res.data));
+						 
+					   if(res.data.success){
+						  
+						  if(res.data.data)
+						  {
+							   
+							  if(res.data.data.level)
+							  {
+								  _self.level = res.data.data.level; 
+								  //console.log('level'+_self.level);
+							  }
+							  if(res.data.data.projects)
+							  {
+								  
+								  this.projects = [];
+								  for(let i = 0;i < res.data.data.projects.length;i++)
+								  {
+									  //let item = res.data.data.projects[i];
+									  /*for(let j = 0;j< item.items.length;j++)
+									  {
+										  item.items[j].disabled = false
+										  //console.log('item'+JSON.stringify(item.items[j]))
+									  }*/
+									  //console.log("item xx" +JSON.stringify(item))
+									  //let project = {fid:item.fid,id:item.id,name:item.name,type:item.type,selectedIndex:-1,score:item.score,checked:false,value:0,text:'',items:[]};
+									  //_self.projects.push(item);
+									  let item = _self.filter_item(res.data.data.projects[i]);
+									  //let project = {fid:item.fid,id:item.id,name:item.name,type:item.type,selectedIndex:-1,score:item.score,checked:false,value:0,text:'',items:[]};
+									  if(item.items.length>0)
+	  										_self.projects.push(item);
+								  }
+								  let destIndex = -1;
+								  destIndex = _self.sortByIndex(destIndex+1,'工作量');
+								  destIndex = _self.sortByIndex(destIndex+1,'工作质量');
+								  destIndex = _self.sortByIndex(destIndex+1,'工作态度');
+								  destIndex = _self.sortByIndex(destIndex+1,'出勤情况');
+								  
+								  //for(let i = 0;)
+								  //this.projects = res.data.data.projects;
+								  //console.log('projects'+JSON.stringify(this.projects));
+							  }  
+							  _self.refreshMonthAssess(_self.year,_self.month);	 
+							   //_self.LoadWorkLog(this.year,this.month); 
+						  }
+						 		 
+					   } 
+					  
+					},
+					fail:(res)=>{
+						 /*console.log('requrest failed')
+						 console.log(res);
+						 uni.showModal({
+							title:'提示',
+							content:'请求服务失败,请检查网络!',
+							showCancel:false
+						 })*/
+						
+						 
+					},
+					complete:()=>{
+						uni.hideLoading();
+					}
+				});
+			}, 
+			settingDate(_year,_month,_day)
+			{ 
+				
+				let date = new Date(_year,_month-1,_day);
+				let nextMonth = utils.addMonth(date,1);
+				let previousMonth = utils.addMonth(date,-1);
+				
+				this.info.date = date.getFullYear().toString()+'-'+utils.formatNum(date.getMonth()+1)+'-'+ utils.formatNum(date.getDate());
+				this.info.startDate = previousMonth.getFullYear().toString()+'-'+utils.formatNum(previousMonth.getMonth()+1)+'-'+ utils.formatNum(previousMonth.getDate());
+				this.info.endDate = nextMonth.getFullYear().toString()+'-'+utils.formatNum(nextMonth.getMonth()+1)+'-'+ utils.formatNum(nextMonth.getDate());
+				 
+				 
+ 			},
+			confirm(e) {
+				//console.log('xxxxxx'+ e.fulldate);
+				//return ;
+				let year = e.fulldate.substr(0,4);
+				let month = e.fulldate.substr(5,2);
+				let day = e.fulldate.substr(8,2);
+				this.year = year;
+				this.month = month;
+				this.day = day;
+				this.settingDate(year,month,day);
+				console.log("confirm "+ JSON.stringify(this.employee));
+				this.LoadKpiTemplate(this.employee.id,this.employeeID);
+				//_self.LoadWorkLog(this.year,this.month);
+				//this.refreshMonthAssess(year,month);
+				return ;
+				 
+			}, 
+			change(e){
+				console.log('change'+e);
+			},
+			close() {
+				console.log('弹窗关闭');
+			},
+			back() {
+				//console.log('test')
+				uni.navigateBack({
+					delta: 1
+			})
+			},
+			 		
+			refreshMonthAssess(_year,month)
+			{
+				//console.log('refreshMonthAssess')
+				let workMonth = _year.toString()+'-'+utils.formatNum(month);
+				let loadMonthAssess = false;
+				let items = [];
+				_self.disabled= false;
+				uni.request({
+				    url: this.kpi_url+ '/api/loadMonthAssess.do',//'http://192.168.77.99:8080/api/loadMonthWorkSummary.do',//?workNum='+this.employeeNumber+'&workMonth='+this.workMonth, //仅为示例,并非真实接口地址。
+				    data:{usId:this.employee.id,evalUsId:this.employeeID,assessMonth:workMonth},
+					method:'GET',
+					timeout:20000,
+				    
+				    success: (res) => {
+						//console.log('读取月评:'+JSON.stringify(res.data));
+						//return;
+						
+				       if(res.data.success){
+						  
+							if(res.data.data)
+							{
+								if(res.data.data.list)
+								{
+									let items = res.data.data.list;
+									
+									for(let i = 0;i< items.length;i++)
+									 {
+										 
+										 let index = _self.findProjectByName(items[i].title);
+										 if(index<0)
+											continue;
+										 //console.log('find project'+items[i].title);	
+										 for(let j=0;j<items[i].children.length;j++)
+										 {
+											 if(items[i].children[j].date.indexOf('END')<=0)
+											 {
+												//console.log('ignore '+items[i].children[j].date)
+												continue;											 
+											 }	
+											 if(items[i].children[j].evalUsId != _self.employeeID)
+											 {
+												 //console.log()
+												 if(items[i].children[j].evalUsId == "70b7dbdd-7fb6-4755-a9c2-ed58ded25905")
+												 {
+													_self.disabled= true;
+													//console.log('set disabled true')
+													//console.log('ignore'+ JSON.stringify(items[i].children[j]))
+												 }
+												 //console.log('ignore'+ JSON.stringify(items[i].children[j]))
+												 continue;
+											 }
+											 let itemIndex = _self.findDtlByName(index,items[i].children[j].title);
+											 
+											 if(itemIndex>=0)
+											 {
+												 //console.log('find dtl'+items[i].children[j].title);
+												 _self.projects[index].items[itemIndex].checked = true;
+												 _self.projects[index].selectedIndex = itemIndex;
+												 _self.projects[index].items[itemIndex].data_id = items[i].children[j].id;
+												 _self.projects[index].items[itemIndex].value = items[i].children[j].unitScore;
+												 //_self.projects[index].items[itemIndex].value = 3.3
+											 	 //console.log('id '+ _self.projects[index].items[itemIndex].id);
+												 //let element = document.getElementById(_self.projects[index].items[itemIndex].id);
+												 //if(element)
+												//	element.data1 = items[i].children[j].unitScore;
+												// console.log('object'+ JSON.stringify(this.$refs[_self.projects[index].items[itemIndex].id]))
+												 //console.log('item'+JSON.stringify(_self.projects[index].items[itemIndex]))								 
+											 }
+										 }
+							
+									 }
+									 if(!items || items.length==0)
+									 {
+										   //console.log('fail xxxx')
+										   for(let i = 0;i < _self.projects.length;i++)
+										   {
+												_self.projects[i].selectedIndex = -1;
+												//console.log('xxx fail xxxx')
+												for(let j = 0;j<_self.projects[i].items.length;j++)
+												{
+													_self.projects[i].items[j].checked = false;
+												}
+										   }
+																//console.log('failed failed')
+									 } 
+									 _self.calc_score();
+									 loadMonthAssess = true;
+								}
+								
+							}
+										 
+					   }
+					   else{
+						   //console.log('fail refreshMonthAssess')
+						   //console.log('发送月评请求id:'+this.employee.id);
+						   //console.log('evaUsrID:'+this.employeeID);
+						   //console.log('workMonth:'+workMonth);
+						   
+						  uni.showToast({
+						      title: res.data.exception,
+							  icon: 'error',
+						      duration: 2000
+						  }); 
+					   }
+					   
+					   
+				      
+				    },
+					fail:(res)=>{
+						 console.log('requrest failed refreshMonthAssess')
+						 console.log('发送月评请求id:'+this.employee.id);
+						 console.log('evaUsrID:'+this.employeeID);
+						 console.log('workMonth:'+workMonth);
+						 
+						 console.log(res);
+						 uni.showModal({
+						 	title:'提示',
+							content:'请求服务失败,请检查网络!',
+							showCancel:false
+						 })
+						
+						 
+					},
+					complete:()=>{
+						//uni.hideLoading();
+						//console.log('complete');
+						if(!loadMonthAssess)
+						{
+							//_self.LoadWorkLog(this.year,this.month);
+							if(!items)
+								items = [];
+								
+							if(!items || (items && items.length==0))
+							{
+									   //console.log('fail xxxx')
+								   for(let i = 0;i < _self.projects.length;i++)
+								   {
+										_self.projects[i].selectedIndex = -1;
+										//console.log('xxx fail xxxx')
+										for(let j = 0;j<_self.projects[i].items.length;j++)
+										{
+											_self.projects[i].items[j].checked = false;
+										}
+								   }
+							//console.log('failed failed')
+							} 
+							_self.calc_score();
+						}
+						
+					}
+				});
+			},
+			refreshEmployeeList()
+			{ 
+				//console.log('url'+this.kpi_url+' usId' + this.employeeID)  
+				uni.request({
+				    url: this.kpi_url+ '/api/loadNeedAssessUsers.do',//'http://192.168.77.99:8080/api/loadMonthWorkSummary.do',//?workNum='+this.employeeNumber+'&workMonth='+this.workMonth, //仅为示例,并非真实接口地址。
+				    data:{usId:this.employeeID},
+					method:'GET',
+					timeout:20000,
+				   
+				    success: (res) => {
+					    //console.log('res1111'+JSON.stringify(res.data));
+						 
+				       if(res.data.success){
+						  
+						  let employees = res.data.data;
+						  //this.$refs.ren.set_status(year,month);
+						   
+							if(employees)
+							{
+								_self.employees = [];//employees;
+								let findEmployee = false;
+								for(let i = 0;i< employees.length;i++)
+								{
+									let employee = {id:employees[i].id,value:employees[i].name};
+									_self.employees.push(employee);
+									if(!findEmployee)
+									{
+										if(_self.employee.id == employee.id)
+										{
+											findEmployee = true;
+										}
+									}
+								}
+								//console.log('data '+JSON.stringify( _self.employees));
+								if(!findEmployee)
+								{
+									//console.log('not find data ');
+									if(_self.employees.length>0)
+									{
+										_self.employee = {"id":_self.employees[0].id,"name":_self.employees[0].value};//self.employees[0];	
+										//console.log('data '+JSON.stringify(_self.employee));
+										 _self.LoadKpiTemplate(_self.employee.id,_self.employeeID);
+									}
+									 
+								}
+							}
+										 
+					   }
+					   else{
+					   console.log('fail refreshEmployeeList')
+						  uni.showToast({
+						      title: res.data.exception,
+							  icon: 'error',
+						      duration: 2000
+						  }); 
+					   }
+				      
+				    },
+					fail:(res)=>{
+						console.log('requrest failed')
+						 console.log(res);
+						 uni.showModal({
+						 	title:'提示',
+							content:'请求服务失败,请检查网络!',
+							showCancel:false
+						 })
+						
+						 
+					},
+					complete:()=>{
+						//uni.hideLoading();
+					}
+				});
+			}, 
+			calc_score()
+			{
+				 
+				let total_score = 0;
+				if(this.projects)
+				{
+					
+					for(let i = 0;i< this.projects.length;i++)
+					{
+						let project = this.projects[i];
+						if(project)
+						{
+							//console.log('item'+JSON.stringify(project));
+							for(let j=0;j<project.items.length;j++)
+							{
+								let dtl = project.items[j];
+								if(project.is_multiple) 
+								{
+									//console.log('multiple')
+									if(dtl.value!= null && dtl.value>0)
+									{
+										total_score+= dtl.value*dtl.score;
+									}
+								}else{
+									//console.log('not multiple')
+									if(dtl.score!=null)
+									{
+										total_score+=dtl.score;
+									}
+								}
+								 
+							}
+						}
+					}
+				}
+				this.score = total_score;//console.log('score'+total_score);
+				return total_score;
+			},
+			formsubmit:function(e)
+			{
+				let datestr = utils.get_month_str(new Date(this.year,this.month-1,this.day));
+				
+				
+				let datas  = {id:'',data_id:null,name:'月评数据',value:0,score:0,unit:null,type:2,isMultiple:true,sliderMin:0,sliderMax:1, sliderStep:0,children:[],date:datestr,userId:this.employee.id, evalId:this.employeeID,level:this.level,radio:null};
+				
+				if(this.projects)
+				{
+					for(let i = 0;i< this.projects.length;i++)
+					{
+						let project =  this.projects[i];
+						if(project)
+						{
+							let parent  = {id:project.id,data_id:null,name:project.name,value:project.value,score:project.score,unit:project.unit,type:project.type,isMultiple:project.is_multiple,sliderMin:project.slider_min,sliderMax:project.slider_max, sliderStep:project.slider_step,children:[],date:datestr,userId:this.employee.id, evalId:this.employeeID,level:this.level,radio:null};
+							
+							for(let j=0;j<project.items.length;j++)
+							{
+								let dtl = project.items[j];
+								if(project.items[j].data_id != null || 
+									(project.items[j].value != null && project.items[j].value>0))
+								{
+									
+									let data ={};
+									if(project.items[j].id != null)
+										data.id  = project.items[j].id;
+									if(project.items[j].data_id != null)
+										data.data_id  = project.items[j].data_id;
+									if(project.items[j].text != null)
+										data.name  = project.items[j].text;	 
+									if(project.items[j].value != null)
+										data.value  = project.items[j].value;	 
+									if(project.items[j].score != null)
+										data.score  = project.items[j].score;
+									if(project.items[j].unit != null)
+										data.unit  = project.items[j].unit;
+									if(project.items[j].type != null)
+										data.type  = project.items[j].type;
+									if(project.items[j].is_multiple != null)
+										data.isMultiple  = project.items[j].is_multiple;
+									if(project.items[j].slider_step != null)
+										data.sliderStep  = project.items[j].slider_step;
+									if(project.items[j].slider_max != null)
+										data.sliderMax  = project.items[j].slider_max;
+									if(project.items[j].slider_min != null)
+										data.sliderMin  = project.items[j].slider_min;
+									data.userId = this.employee.id;
+									data.evalId = this.employeeID;
+									data.date = datestr;
+									data.level = this.level;
+									if(project.items[j].slider_max == 1 && project.items[j].slider_min ==0)
+									{
+										data.radio = project.items[j].id;
+									}
+									parent.children.push(data);
+									//console.log('dtl 初始值' + JSON.stringify(project.items[j]));	
+								}
+								 
+							}
+							if(parent.children.length>0)
+								datas.children.push(parent);
+							
+						}
+					}
+				}
+				if(_self.disabled)
+				{
+					uni.navigateTo({
+						url:'../employee_daily_report/employee_daily_report',
+						 success: function(res) {
+						     // 通过eventChannel向被打开页面传送数据
+													 //console.log('fill xxxx')
+						     res.eventChannel.emit('acceptDataFromOpenerPage', { data: 
+													 {action:'month_comment_score',year:_self.year,month:_self.month,day:_self.day,
+														id:_self.employee.id.toString(),name:_self.employee.name,employees:_self.employees} })
+						   }
+					})
+					return;
+				}
+				uni.request({
+				    url: this.kpi_url+ '/api/saveMonthAssess.do',//'http://192.168.77.99:8080/api/loadMonthWorkSummary.do',//?workNum='+this.employeeNumber+'&workMonth='+this.workMonth, //仅为示例,并非真实接口地址。
+				    data:datas,
+					headers: {
+					 "Content-Type": "application/json"
+					},   
+					method:'POST',
+					timeout:20000,
+				   
+				    success: (res) => {
+						//console.log('res'+JSON.stringify(res.data));
+						//return; 
+				       if(res.data.success){
+						  
+						   uni.navigateTo({
+						   	url:'../employee_daily_report/employee_daily_report',
+						   	 success: function(res) {
+						   	     // 通过eventChannel向被打开页面传送数据
+								 //console.log('fill xxxx')
+						   	     res.eventChannel.emit('acceptDataFromOpenerPage', { data: 
+								 {action:'month_comment_score',year:_self.year,month:_self.month,day:_self.day,
+									id:_self.employee.id.toString(),name:_self.employee.name,employees:_self.employees} })
+						   	   }
+						   })
+										 
+					   }
+					   else{
+					      console.log('fail')
+						  uni.showToast({
+						      title: res.data.exception,
+							  icon: 'error',
+						      duration: 2000
+						  });  
+					   }
+				      
+				    },
+					fail:(res)=>{
+						console.log('requrest failed')
+						 //console.log(res);
+						 uni.showModal({
+						 	title:'提示',
+							content:'请求服务失败,请检查网络!',
+							showCancel:false
+						 })
+						
+						 
+					},
+					complete:()=>{
+						//console.log('complete')
+						uni.hideLoading();
+					}
+				});
+				//console.log('formsubmit');
+			},
+		}
+	} 
+</script>
+
+<style lang="scss">
+	@import "@/common/pa_main.scss";
+	 
+	.content {
+	    //padding-top: 50rpx;
+		.change{
+	        display: flex;
+	        align-items: center;
+	        justify-content: center;
+	        margin: 0 auto;
+	        margin-top: 100rpx;
+	        height: 100rpx;
+	        color: #b89249;
+	        background-color: #21191b;
+			 
+			
+	    }
+		.head-box
+		{
+			
+		}
+		
+		
+	}
+	
+	 
+</style>

+ 306 - 0
pages/month_log/month_log.vue

@@ -0,0 +1,306 @@
+<template>
+	<view class="page-box">  <!--pa_column bg-primary pg_sb">-->
+		<view class="head-box">
+			<uni-nav-bar id="header_nav" left-icon="arrowleft" type="line" title="填写月度总结"  @clickLeft="back" />			
+		</view>
+		<!--cursor-spaceing="500rpx"-->
+		<form    @submit="formsubmit">
+			<view class="content-box_fixed  bg-grey">					
+			
+				<view class="pa-column bg_whilecolor my-1 a-center w_auto " >
+<!--					:class="{h-20:windowHeight==0;}">-->
+					<view class="mx-1 font-weight">
+						<label class="mark_color font-weight">*</label>
+						<label>{{dateText()}}工作总结</label>				
+					</view>
+					<view class="uni-textarea " style="height: 700rpx;">
+						<textarea   class="w_auto mx-1 "  style="height: 680rpx;" :adjust-position="false" placeholder="请填写内容" maxlength="400" name="summary"  v-model="summarize">			
+						 
+						</textarea>
+					</view>
+				</view>
+					
+			</view>
+			
+			<view class="footer-box">
+				<button form-type="submit" class="btn_bgcolor btn_color">提交</button>			
+			</view>
+			
+		</form>
+		
+	</view>
+</template>
+
+<script>
+	import uniCalendar from '@/components/uni-calendar/uni-calendar.vue'
+	import utils from '../../utils/common.js'
+	import store from '../../utils/store.js'
+	
+	var _self;
+	function getDate(date, AddDayCount = 0) {
+		if (!date) {
+			date = new Date()
+		}
+		 if (typeof date !== 'object') {
+		 	date = date.replace(/-/g, '/')
+		 }
+		const dd = new Date(date)
+	
+		dd.setDate(dd.getDate() + AddDayCount) // 获取AddDayCount天后的日期
+	
+		const y = dd.getFullYear()
+		const m = dd.getMonth() + 1 < 10 ? '0' + (dd.getMonth() + 1) : dd.getMonth() + 1 // 获取当前月份的日期,不足10补0
+		const d = dd.getDate() < 10 ? '0' + dd.getDate() : dd.getDate() // 获取当前几号,不足10补0
+		return {
+			fullDate: y + '-' + m + '-' + d,
+			year: y,
+			month: m,
+			date: d,
+			day: dd.getDay()
+		}
+	}
+	export default {
+	   components:{
+			uniCalendar
+	    },
+		onLoad:function(options) {
+		    _self = this;  
+			this.kpi_url=  uni.getStorageSync('kpi-url');
+			
+			this.windowOrignalHeight = this.getWindowHeight();
+			this.windowHeight = this.windowOrignalHeight;
+			//this.inputBoxHeight =this.windowOrignalHeight/5.0;
+			uni.onWindowResize((res) => {
+				this.windowHeight = this.getWindowHeight(); 
+				this.heightRatio = this.windowOrignalHeight/this.windowHeight;
+				//this.inputBoxHeight =this.windowHeight/5.0;
+			})
+			
+ 		 				
+			if(options.date)
+			{
+				const date1 = (decodeURIComponent(options.date));
+				if(date1)
+				{
+					
+					_self.date = date1					 
+					
+					//console.log('date1'+ _self.date);
+				}	
+				//_self.log.Program =
+			}
+		
+		 
+			this.employeeID =  uni.getStorageSync('usId');
+			if(!this.employeeID || this.employeeID.length<=0)
+			{
+				uni.showToast({
+					title: '未设置员工ID',
+											  icon: 'error',
+					duration: 2000
+				}); 
+				return;
+			}		 
+	
+			 
+		}, 
+		activated()
+		{
+			
+			  
+		},
+		onReady() {
+			this.doReady();
+		},
+		data() {
+			return {
+				date:"",
+				heightRatio:1,
+				windowOrignalHeight:0,
+				windowHeight:0,
+				count:1,
+				calendar:'',
+				showCalendar: false,
+				employeeID:'',
+				kpi_url:'',// 
+				Summary:'',//工作安排
+				info:{},
+				summarize:""
+			}
+		},
+		methods:{
+			dateText(){
+				var k=this.date.replace('-','年')+'月'
+				return k
+			},
+			getWindowHeight(){
+				var result = 0;
+				uni.getSystemInfo({
+						success: function(res) {
+							//console.log(res.windowHeight);// print 610
+							result = uni.upx2px(res.windowHeight)  // 这里加200或者加100为了看测试效果
+							// 不加200默认 return 292
+						}
+				});
+				return result;
+			  },
+			doReady()
+			{
+				
+				if(this.employeeID)
+				{
+					
+					this.refreshSummary();
+				}
+
+			},
+			
+			
+			back() {
+				console.log('test')
+				uni.navigateBack({
+					delta: 1
+				})
+			},
+			
+			
+		
+			
+			refreshSummary()
+			{
+				uni.request({
+				    url: this.kpi_url+ '/api/loadMonthSummarize.do',//'http://192.168.77.99:8080/api/loadMonthWorkSummary.do',//?workNum='+this.employeeNumber+'&workMonth='+this.workMonth, //仅为示例,并非真实接口地址。
+				    data:{usId:this.employeeID,queryMonth:this.date},
+					method:'GET',
+					timeout:20000,
+				   
+				    success: (res) => {
+						 if(res.data.success){
+							 if(res.data.data.summarize){
+								  this.summarize=res.data.data.summarize.content
+									this.info.id=res.data.data.summarize.id
+							 }else{
+								  this.summarize=""
+							 }
+							
+						 } else{
+						  console.log('fail')
+						  uni.showToast({
+						      title: res.data.exception,
+							  icon: 'error',
+						      duration: 2000
+						  }); 
+					   }
+					},
+				
+					fail:(res)=>{
+						 
+						 console.log('refreshSummaryMonthly requrest failed')
+						 console.log(res);
+						 uni.showModal({
+						 	title:'提示',
+							content:'请求服务失败,请检查网络!',
+							showCancel:false
+						 })
+						 
+						 
+					},
+					complete:()=>{
+						uni.hideLoading();
+					}
+					});
+			}, 
+			
+			  
+			formsubmit:function(e)
+			{
+				//this.count++;
+				//console.log('xxxxxx'+this.count);
+				//console.log('date: '+ utils.get_date_str(_self.date));
+				//console.log('datetime: '+_self.get_datetime_str(_self.date));
+				this.info.userId=this.employeeID
+				this.info.date=this.date
+				this.info.content=this.summarize
+				//console.log(formdata);				 
+				//console.log('date'+ datestr);
+				//console.log('datetimestr'+datetimestr);
+				//console.log('id'+ this.employeeID);
+				//console.log('log'+JSON.stringify(this.log))
+				uni.request({
+				    url: this.kpi_url+ '/api/saveMonthSummarize.do',//'http://192.168.77.99:8080/api/loadMonthWorkSummary.do',//?workNum='+this.employeeNumber+'&workMonth='+this.workMonth, //仅为示例,并非真实接口地址。
+				    data:this.info,
+					   header: {
+							
+							  'Content-Type':'application/json'
+						  },
+					method:'POST',
+					timeout:20000,
+				   
+				    success: (res) => {
+						console.log('saveMonthSummarize'+JSON.stringify(res.data));
+						 
+				       if(res.data.success){
+						  
+						   uni.navigateTo({
+						   	url:'../work_log/work_log',
+						   
+						   })
+										 
+					   }
+					   else{
+					   console.log('fail')
+						  uni.showToast({
+						      title: res.data.exception,
+							  icon: 'error',
+						      duration: 2000
+						  }); 
+					   }
+				      
+				    },
+					fail:(res)=>{
+						console.log('requrest failed')
+						 console.log(res);
+						 uni.showModal({
+						 	title:'提示',
+							content:'请求服务失败,请检查网络!',
+							showCancel:false
+						 })
+						
+						 
+					},
+					complete:()=>{
+						uni.hideLoading();
+					}
+				});
+				console.log('formsubmit');
+			},
+						
+		}
+		
+	}
+	
+</script>
+
+<style lang="scss">
+	@import "@/common/pa_main.scss";
+	
+	
+	.content {
+	   // padding-top: 50rpx;
+		.change{
+	        display: flex;
+	        align-items: center;
+	        justify-content: center;
+	        margin: 0 auto;
+	        margin-top: $margin_10;
+	        height: $default_row_height;
+	        color: $al_fgcolor;
+	        background-color: $al_bgcolor;
+			
+	    }
+		.head-box
+		{
+			
+		}
+	}
+</style>

+ 933 - 0
pages/work_log/work_log.vue

@@ -0,0 +1,933 @@
+<template>
+	<view class="content">
+		<view class="head-box">
+			<uni-nav-bar id="header_nav" left-icon="arrowleft" type="line" title="工作日志"  @clickLeft="back" />			
+			<!--<view class="heax-date-box">
+				 <view  :class="{pre: !is_future_month(-1),
+								  pre_unable: is_future_month(-1)}" @click="changeMonth('pre')">
+						<label class="font_smaller iconfont icon-left-circle">上月</label>
+						
+						</view> 
+					<view>
+						<label class="font_smaller">{{year}}年{{month}}月</label>
+					</view>
+					 <view :class="{next: !is_future_month(1),
+								   next_unable: is_future_month(1)}" @click="changeMonth('next')">
+					<label class="font_smaller">下月</label>
+					<label class="font_smaller iconfont icon-right-circle"></label>
+					</view>				 
+			</view>		-->	
+		</view>
+		<view class="content-box_with_none_footer">
+			<ren-calendar ref='ren'  :markDays='markDays' :datas="work_logs" :open="true" :disabledAfter='true'  @onDayClick='onDayClick'
+				@onPreviousMonth='onPreviousMonthClick' @onNextMonth='onNextMonthClick'></ren-calendar>
+			
+			<view class="month-class" @click="onMonthlyClick">
+				月度工作总结
+				<span v-if="summarize" style="color: #34C758;">
+					(已填写)
+				</span>
+				<span v-else  style="color: red;" >
+					(未填写)
+				</span>
+				<uni-icons color="#C8C8C8" type="arrowright"/>
+				
+			</view>
+			<view class="middle-box">
+				<view class="left-box" >
+				<label class="iconfont icon-msg" style="font-weight: bold;">上级考评</label>
+				</view>
+				<view class="right-box" style="font-weight: bold;">
+					<label >本月得分</label>
+					<label style="color: #FAB393;margin-left: 10rpx;">{{score_str}}</label>
+				</view>
+			</view>
+			<view style="footer-box">
+				<uni-collapse ref="collapse" >
+					<uni-collapse-item title="初评">						
+							<uni-list>
+								 <uni-list-item v-for="(item,index) in first_assess" :title="item.title" :note="item.note" :key="item.id" :rightText='item.date'></uni-list-item> 									 
+							</uni-list>
+<!--							<textarea class="text">{{first_assess}}</textarea>-->
+					
+					</uni-collapse-item>
+					<uni-collapse-item title="复审">
+						<uni-list>
+							 <uni-list-item v-for="(item,index) in second_assess" :title="item.title" :note="item.note" :key="item.id" :rightText='item.date'></uni-list-item> 									 
+						</uni-list> 
+					</uni-collapse-item>
+					<uni-collapse-item title="偏差修正">
+						<uni-list>
+							 <uni-list-item v-for="(item,index) in third_assess" :title="item.title" :note="item.note" :key="item.id" :rightText='item.date'></uni-list-item> 									 
+						</uni-list> 
+						 
+					</uni-collapse-item>
+				</uni-collapse>
+			</view>
+		</view>
+        <!--<uni-fab v-show="assesscount>0" ref="fab" :pattern="fab.pattern" :content="fab.content" :horizontal="fab.horizontal" :vertical="fab.vertical" :direction="fab.direction" @trigger="trigger" @fabClick="fabClick" />-->
+        <view v-show="assesscount>0" class="footer-box pa_row">
+			<button class="w-100 btn_bgcolor btn_color" @click="employeeListClicked">绩效打分</button>
+<!--			<button @click="dailyReportStatisticClicked">日报统计</button>-->
+		</view>
+	</view>
+</template>
+
+<script>
+    import RenCalendar from '@/components/ren-calendar/ren-calendar.vue'
+	import uniCollapseItem from '@/components/uni-collapse-item/uni-collapse-item.vue'
+	import uniCollapse from '@/components/uni-collapse/uni-collapse.vue'
+	import uniFab from '../../components/uni-fab/uni-fab.vue'
+	import uniList from '@/components/uni-list/uni-list.vue'
+	import uniListItem from '@/components/uni-list-item/uni-list-item.vue'
+	//Vue.component('uni-collapse-item',uniCollapseItem)
+	//Vue.component('uni-collapse',uniCollapse)
+	
+	import utils from '../../utils/common.js'
+	import store from '../../utils/store.js'
+	
+	var _self;
+	export default {
+        components:{
+            RenCalendar,
+			uniCollapseItem,
+			uniCollapse,
+			uniFab,
+			uniList,
+			uniListItem
+        },
+		data() {
+			return {
+				fab:{
+					title: 'uni-fab',
+					directionStr: '垂直',
+					horizontal: 'left',
+					vertical: 'bottom',
+					direction: 'horizontal',
+					pattern: {
+						color: '#7A7E83',
+						backgroundColor: '#fff',
+						selectedColor: '#007AFF',
+					},
+					content: [
+						/*{
+							iconPath: '/static/component.png',
+							selectedIconPath: '/static/componentHL.png',
+							text: '日志',
+							active: false
+						},*/
+						{
+							iconPath: '/static/extui.png',
+							selectedIconPath: '/static/extuiHL.png',
+							text: '员工列表',
+							active: false
+						},
+						{
+							iconPath: '/static/template.png',
+							selectedIconPath: '/static/templateHL.png',
+							text: '日报统计',
+							active: false
+						}
+					]
+				},
+				index:1,
+				kpi_url:'',
+				year:2020,
+				month:1,
+				employeeID:'',
+				workMonth:utils.get_month_str(new Date()),
+				score:99.00,
+				sale_task:0.00,//销售任务
+				first_trial:'',//初审
+				working_attitude:0.00,//工作态度
+				reviewing_officer:'',//复审员
+				deviation_correction:'',//偏差修正 				
+				curDate:'',
+                markDays:[],
+				work_logs:[],
+				first_assess:[],
+				second_assess:[],
+				third_assess:[],
+				assesscount:0,
+				summarize:"",
+				info:{},
+			}
+		},
+		computed:
+		{
+			score_str()
+			{
+				let str = this.score.toFixed(2); 
+				return str;
+			},
+			
+		},		
+		onLoad(options)
+		{
+			
+			//console.log('options'+JSON.stringify(options))
+			_self = this;
+			this.kpi_url=  uni.getStorageSync('kpi-url');
+			if(options && options.jobNumber)
+			{
+				let workNumber = options.jobNumber;
+				this.getUserIdByWorkNum(workNumber);
+			}else
+			{
+				this.employeeID =  uni.getStorageSync('usId');
+				if(!this.employeeID || this.employeeID.length<=0)
+				{
+					uni.showToast({
+						title: '未设置员工ID',
+												  icon: 'error',
+						duration: 2000
+					}); 
+					return;
+				}			
+				_self.clear();	
+				//console.log('usID' + this.employeeID);
+			}
+			
+			
+		},
+		activated() {
+			
+			console.log('activated'+this.year +'month'+ this.month)
+			
+		}, 
+		onReady() {
+			
+			this.doReady();
+			
+		},
+		methods: {
+			employeeListClicked()
+			{
+				let date = {year:_self.year,month:_self.month};
+					uni.navigateTo({
+						url:'../employee_list/employee_list?date='+encodeURIComponent(JSON.stringify(date)),
+						 success: function(res) {
+							 // 通过eventChannel向被打开页面传送数据
+							 //res.eventChannel.emit('acceptDataFromOpenerPage', { data: { date:data.date,remarks:ret } })
+						   }
+					});
+				
+			},
+			dailyReportStatisticClicked()
+			{
+					uni.navigateTo({
+						url:'../daily_report_statistics/daily_report_statistics',
+						 success: function(res) {
+							 // 通过eventChannel向被打开页面传送数据
+							 //res.eventChannel.emit('acceptDataFromOpenerPage', { data: { date:data.date,remarks:ret } })
+						   }
+					})		
+				
+			},
+			trigger(e) {
+				console.log(e)
+				this.fab.content[e.index].active = !e.item.active
+				if(e.index==0)
+				{
+					uni.navigateTo({
+						url:'../employee_list/employee_list',
+						 success: function(res) {
+							 // 通过eventChannel向被打开页面传送数据
+							 //res.eventChannel.emit('acceptDataFromOpenerPage', { data: { date:data.date,remarks:ret } })
+						   }
+					})
+					
+				}else if(e.index == 1)
+				{
+					uni.navigateTo({
+						url:'../daily_report_statistics/daily_report_statistics',
+						 success: function(res) {
+							 // 通过eventChannel向被打开页面传送数据
+							 //res.eventChannel.emit('acceptDataFromOpenerPage', { data: { date:data.date,remarks:ret } })
+						   }
+					})					
+				}
+				/*uni.showModal({
+					title: '提示',
+					content: `您${this.fab.content[e.index].active ? '选中了' : '取消了'}${e.item.text}`,
+					success: function(res) {
+						if (res.confirm) {
+							console.log('用户点击确定')
+						} else if (res.cancel) {
+							console.log('用户点击取消')
+						}
+					}
+				})*/
+			},
+			fabClick() {
+				/*uni.showToast({
+					title: '点击了悬浮按钮',
+					icon: 'none'
+				})*/
+			},
+			clear(){
+				//store.clear('employees');
+			},
+			doReady()
+			{
+				if(this.employeeID)
+				 {
+					// console.log('ID ' + this.employeeID);
+					let date = new Date();
+					let today = this.$refs.ren.getToday().date;
+					this.curDate = today;
+					this.markDays.push(today);
+					let year = date.getFullYear();
+					let month = date.getMonth()+1;
+					//this.holidays(year,month);
+					this.refreshSummary(year,month);
+					
+				 }
+			},
+			getUserIdByWorkNum(workNumber)
+			{
+				//let workMonth = _year.toString()+'-'+utils.formatNum(month);
+				//console.log("getUsIdByNum start");
+				uni.request({
+				    url: this.kpi_url +'/api/getUsIdByNum.do',//'http://192.168.77.99:8080/api/loadMonthWorkSummary.do',//?workNum='+this.employeeNumber+'&workMonth='+this.workMonth, //仅为示例,并非真实接口地址。
+				    data:{workNum:workNumber},
+					method:'GET',
+					/*header: {
+					  'content-type': 'application/x-www-form-urlencoded' //自定义请求头信息
+					},*/
+					timeout:20000,
+				   
+				    success: (res) => {
+						//console.log("url:"+this.kpi_url);
+					    //console.log('getUsIdByNum:'+JSON.stringify(res.data));
+						//return;
+				       if(res.data.success){
+						  
+						    if(res.data.data)
+							{			
+								if(res.data.data.assesscount)
+								{
+									this.assesscount = res.data.data.assesscount;
+									uni.setStorageSync('assesscount',this.assesscount)		
+								}
+								
+								if(res.data.data.id)
+								{
+									this.employeeID = res.data.data.id;
+									uni.setStorageSync('usId',this.employeeID);											
+									_self.clear();
+								}
+								_self.doReady();
+								//console.log('usID' + this.employeeID);	 
+								
+							}else
+							{
+								let _content ='工号'+ workNumber+'未找到';
+								uni.showModal({
+									title:'提示',
+										content:_content,
+										showCancel:false
+								})
+							}
+										 
+					   }
+					   else{
+						  console.log('fail  getUserIdByWorkNum')
+						  uni.showToast({
+						      title: res.data.exception,
+							  icon: 'error',
+						      duration: 2000
+						  }); 
+					   }
+				      
+				    },
+					fail:(res)=>{
+						console.log('requrest getUserIdByWorkNum failed')
+						 console.log(res);
+						 uni.showModal({
+						 	title:'提示',
+							content:'请求用户ID失败,请检查网络!',
+							showCancel:false
+						 })
+						
+						 
+					},
+					complete:()=>{
+						//console.log("getUsIdByNum finish");
+						//uni.hideLoading();
+					}
+				});
+			}, 
+			holidays(_year,month)
+			{
+				return;
+				let date = new Date(_year,month,1);
+				//console.log('date'+JSON.stringify(date));
+				let now = new Date();
+				if(date<=now)
+					return;
+				//console.log('xxxx');
+				//console.log('xxx'+_year+'xxx');
+				let monthstr = _year.toString() + utils.formatNum(month);
+				let yearstr = _year.toString();
+				let keystr = 'holidays_'+yearstr+monthstr;
+				//console.log('xx'+keystr+'xx');
+				let valuestr = uni.getStorageSync(keystr);
+				if(valuestr)
+				{
+					//console.log('xxxxx'+JSON.stringify(valuestr));
+					for(let i = 0;i< valuestr.length;i++)
+					{
+						this.$refs.ren.set_status_by_datestr(valuestr[i].date,2);
+					} 
+					return;
+				}
+			 
+				//let urlStr = 'https://api.apihubs.cn/holiday/get?field=year,month,date&year=' + _year.toString() + '&' + 'month=' +monthstr + '&holiday_recess=1&cn=1&size=31';
+				//console.log(urlStr);
+				uni.request({
+					url:'https://api.apihubs.cn/holiday/get',
+					data: 
+					{
+						field:'year,month,date',
+						year:yearstr,
+						month:monthstr,
+						holiday_recess:1,
+						cn:1,
+						size:31
+					},
+					method:'GET',
+					sslVerify:false,
+					timeout:2000,
+					
+					success:(res)=>{
+						//console.log('res success'+JSON.stringify(res.data));
+						if(res.data)
+						{
+							if(res.data.msg =='ok')
+							{
+								if(res.data.data)
+								{
+									if(res.data.data.list)
+									{
+										console.log('data'+res.data.data.list);
+										for(let i = 0;i< res.data.data.list.length;i++)
+										{
+											this.$refs.ren.set_status_by_datestr(res.data.data.list[i].date,2);
+										}
+										uni.setStorageSync(keystr,res.data.data.list);
+									}
+								}
+							}
+						}
+					},
+					fail:(res)=>{
+						console.log('holidays res failed'+JSON.stringify(res.data));
+					}
+				});		
+			},
+			refreshAllMonthAssess(_id,_year,month)
+			{ 
+				let workMonth = _year.toString()+'-'+utils.formatNum(month);
+				//console.log('id:'+_id);
+				//console.log('workMonth:'+workMonth);
+				//console.log('workMonth:'+workMonth);
+				_self.score = 0;
+				_self.first_assess = [];
+				_self.second_assess = [];
+				_self.third_assess = [];
+				//loadAllMonthAssess
+				//console.log("loadAllMonthAssess "+_id+" assessMonth "+workMonth);
+				uni.request({
+				    //url: this.kpi_url+ '/api/loadMonthAssess.do',//'http://192.168.77.99:8080/api/loadMonthWorkSummary.do',//?workNum='+this.employeeNumber+'&workMonth='+this.workMonth, //仅为示例,并非真实接口地址。
+				    url: this.kpi_url+ '/api/loadAllMonthAssess.do',//'http://192.168.77.99:8080/api/loadMonthWorkSummary.do',//?workNum='+this.employeeNumber+'&workMonth='+this.workMonth, //仅为示例,并非真实接口地址。
+				    data:{usId:_id,assessMonth:workMonth},
+					method:'GET',
+					timeout:20000,
+				   
+				    success: (res) => {
+						//console.log('loadAllMonthAssess:'+JSON.stringify(res));
+						//return;
+				       if(res.data.success){
+						  
+						    if(res.data.data)
+							{
+								let items = res.data.data.list;
+								if(items==null)
+								{
+									_self.score = 0;
+									//console.log('items is  null');
+									return;	
+								}
+								//console.log('items is not null');
+								_self.score = 0;
+								if(items.length ==0)
+									_self.score = 0; 
+								for(let i = 0;i<items.length;i++)
+								{
+									if(items[i] == null || items[i].level<0 || items[i].level>3)
+										continue;
+									if(items[i].actualScore == null || items[i].actualScore == 0)
+										continue;
+									let item ={};
+									if(items[i].projectName && items[i].optionsName)
+									{
+										item.title = items[i].projectName +'-'+items[i].optionsName +'      ';										
+										item.key = item.title;		
+									}
+										
+									if(items[i].actualScore)
+										item.title += items[i].actualScore +'                  ';
+									if(items[i].date)
+									{
+										item.key+= items[i].date+'-';
+										let index = items[i].date.indexOf('END');
+										if(index>=0)
+											item.date =items[i].date.substr(0,index)+' ';
+										else
+											item.date =items[i].date+' ';
+										
+									}
+									if(items[i].createByName)
+									{
+										item.key+= items[i].createByName
+										//item.title += items[i].createByName +'  ';										
+									}	
+									switch(items[i].level)
+									{
+										case 1:																				
+										if(item.title)
+											_self.first_assess.push(item);
+										break; 
+										
+										case 2:
+										if(item.title)
+											_self.second_assess.push(item);
+											 
+											 
+	 										break;
+	 									case 3:
+										if(item.title)
+											_self.third_assess.push(item);
+											  
+											 
+										break;	
+									}
+									if(items[i].isValid)
+										_self.score+= items[i].actualScore;
+									//console.log('score'+JSON.stringify(items[i]));
+								}
+//								console.log('first'+_self._self.first_assess);								
+//								console.log('second'+_self.second_assess);
+//								console.log('third'+_self.third_assess);
+								 
+								
+							}
+										 
+					   }
+					   else{
+					   console.log(' refreshAllMonthAssess fail')
+						  uni.showToast({
+						      title: res.data.exception,
+							  icon: 'error',
+						      duration: 2000
+						  }); 
+					   }
+				      
+				    },
+					fail:(res)=>{
+						console.log('requrest refreshAllMonthAssess failed')
+						 console.log(res);
+						 uni.showModal({
+						 	title:'提示',
+							content:'请求月份评价失败,请检查网络!',
+							showCancel:false
+						 })
+						
+						 
+					},
+					complete:()=>{
+						//uni.hideLoading();
+					}
+				});
+			}, 			
+			findDateByIndex(index)
+			{
+				
+				for(let j = 0;j< this.work_logs.length;j++)
+				{
+					if(this.work_logs[j].workDate)
+					{
+						let day = this.work_logs[j].workDate.substr(8,2);
+						if(Number(day)==index)
+							return j;
+					}
+				}
+				return -1;
+			},
+			refreshSummaryMonthly(year,month){
+				this.year = year;
+				this.month = month;
+				uni.request({
+				    url: this.kpi_url+ '/api/loadMonthSummarize.do',//'http://192.168.77.99:8080/api/loadMonthWorkSummary.do',//?workNum='+this.employeeNumber+'&workMonth='+this.workMonth, //仅为示例,并非真实接口地址。
+				    data:{usId:this.employeeID,queryMonth:this.workMonth},
+					method:'GET',
+					timeout:20000,
+				   
+				    success: (res) => {
+						 if(res.data.success){
+							 if(res.data.data.summarize){
+							 								  this.summarize=res.data.data.summarize.content
+							 }else{
+							 								  this.summarize=""
+							 }
+						 } else{
+						  console.log('fail')
+						  uni.showToast({
+						      title: res.data.exception,
+							  icon: 'error',
+						      duration: 2000
+						  }); 
+					   }
+					},
+				
+					fail:(res)=>{
+						 
+						 console.log('refreshSummaryMonthly requrest failed')
+						 console.log(res);
+						 uni.showModal({
+						 	title:'提示',
+							content:'请求服务失败,请检查网络!',
+							showCancel:false
+						 })
+						 
+						 
+					},
+					complete:()=>{
+						uni.hideLoading();
+					}
+					});
+			},
+			refreshSummary(year,month)
+			{
+				
+				this.year = year;
+				this.month = month;
+				let _name = uni.getStorageInfoSync('username');
+				
+				this.holidays(year,month);
+				this.refreshAllMonthAssess(this.employeeID,this.year,this.month); 
+				this.workMonth= year +'-'+ utils.formatNum(month);
+				this.refreshSummaryMonthly(year,month);
+				//console.log('refreshSummary' + this.employeeNumber + 'month:' + this.workMonth)
+				uni.request({
+				    url: this.kpi_url+ '/api/loadMonthWorkSummary.do',//'http://192.168.77.99:8080/api/loadMonthWorkSummary.do',//?workNum='+this.employeeNumber+'&workMonth='+this.workMonth, //仅为示例,并非真实接口地址。
+				    data:{usId:this.employeeID,workMonth:this.workMonth},
+					method:'GET',
+					timeout:20000,
+				   
+				    success: (res) => {
+						//console.log('loadMonthWorkSummary'+JSON.stringify(res.data));
+						 
+				       if(res.data.success){
+							//console.log("workLogs"+JSON.stringify(res.data.data.workLogs));
+						    if(res.data.data.workLogs)
+							{
+							    //let work_logs = res.data.data.workLogs;	
+								this.work_logs = res.data.data.workLogs;	
+								 for(let i = 0;i< this.work_logs.length;i++)
+								 {
+								 	let flag = this.work_logs[i].workday//Number(workTags[i]);
+									//console.log("workLogs"+JSON.stringify(res.data.data.workLogs[i]));
+									//console.log("flag"+flag);
+									//保存一个名字
+									if(i==0)
+									{										
+										_name = this.work_logs[i].name;
+										uni.setStorageSync('username',_name);
+										
+									}
+								 	//let workDay = year.toString()+'-'+ utils.formatNum(month) +'-' + utils.formatNum(i+1);
+								 	if(!flag)
+								 	{
+								 		this.$refs.ren.set_status_by_datestr1(this.work_logs[i].workDate,2);
+								 	}else
+								 	{
+								 		//let indexDate = this.findDateByIndex(i+1);
+								 		if(!this.work_logs[i])
+								 			continue;
+								 		if(this.work_logs[i].summaryLen>0)
+								 		   this.$refs.ren.set_status_by_datestr1(this.work_logs[i].workDate,1);
+								 		else
+								 		//if(this.work_logs[indexDate].summaryLen==0)
+								 			this.$refs.ren.set_status_by_datestr1(this.work_logs[i].workDate,3);
+								 		
+								 		//console.log('flag'+flag + ' workDate' + workDay + '  ' +this.work_logs[indexDate].workDate);
+								 		
+								 	}
+								 	
+								 	//console.log('i'+i+JSON.stringify(this.work_logs[i]));
+								 	//if(flag == 1)
+								 	//	this.$refs.ren.set_status_by_datestr1(this.work_logs[i].workDate,1);
+								 	//else
+								 	//	this.$refs.ren.set_status_by_datestr1(this.work_logs[i].workDate,3);
+								 	
+								 } 
+							}
+							/*if(res.data.data.workTags)
+							{
+								let workTags = res.data.data.workTags;
+								
+								for(let i = 0;i< workTags.length;i++)
+								{
+									let flag = Number(workTags[i]);
+									let workDay = year.toString()+'-'+ utils.formatNum(month) +'-' + utils.formatNum(i+1);
+									if(!flag)
+									{
+										this.$refs.ren.set_status_by_datestr1(workDay,2);
+									}else
+									{
+										let indexDate = this.findDateByIndex(i+1);
+										if(!this.work_logs[indexDate])
+											continue;
+										if(this.work_logs[indexDate].summaryLen>0)
+										   this.$refs.ren.set_status_by_datestr1(this.work_logs[indexDate].workDate,1);
+										else
+										//if(this.work_logs[indexDate].summaryLen==0)
+											this.$refs.ren.set_status_by_datestr1(this.work_logs[indexDate].workDate,3);
+										
+										//console.log('flag'+flag + ' workDate' + workDay + '  ' +this.work_logs[indexDate].workDate);
+										
+									}
+									
+									//console.log('i'+i+JSON.stringify(this.work_logs[i]));
+									//if(flag == 1)
+									//	this.$refs.ren.set_status_by_datestr1(this.work_logs[i].workDate,1);
+									//else
+									//	this.$refs.ren.set_status_by_datestr1(this.work_logs[i].workDate,3);
+									
+								} 
+//								console.log('xxxxxxxxxxxxx')
+							}*/
+										 
+					   }
+					   else{
+						  console.log('fail')
+						  uni.showToast({
+						      title: res.data.exception,
+							  icon: 'error',
+						      duration: 2000
+						  }); 
+					   }
+				      
+				    },
+					fail:(res)=>{
+						 
+						 console.log('refreshSummary requrest failed')
+						 console.log(res);
+						 uni.showModal({
+						 	title:'提示',
+							content:'请求服务失败,请检查网络!',
+							showCancel:false
+						 })
+						 
+						 
+					},
+					complete:()=>{
+						uni.hideLoading();
+					}
+				});
+			}, 
+			findDataByDay(date)
+			{
+				if(!this.work_logs)
+					return ;
+				//console.log('date'+date);
+				for(let i = 0;i< this.work_logs.length;i++)
+				{
+					if(this.work_logs[i].workDate == date)
+						return this.work_logs[i];
+					//console.log('xxxx'+JSON.stringify(this.work_logs[i]));
+				}
+				return ;
+			},
+            onDayClick(data){
+				 
+                this.curDate = data.date; 
+				let ret = this.findDataByDay(data.date);
+				//if(!ret)
+				//	console.log('xx null');
+				
+				//console.log('onDayClick'+JSON.stringify(data));
+				uni.navigateTo({
+					url:'../fill_log/fill_log?date='+encodeURIComponent(JSON.stringify(data.date)),
+					 success: function(res) {
+					     // 通过eventChannel向被打开页面传送数据
+					     res.eventChannel.emit('acceptDataFromOpenerPage', { data: { date:data.date,remarks:ret } })
+					   }
+				})
+            },
+			onMonthlyClick(){
+				 var date=this.workMonth
+			   // this.year = year;
+			   // this.month = month;
+			   
+			//	let ret = this.findDataByDay(data.date);
+				//if(!ret)
+				//	console.log('xx null');
+				
+				//console.log('onDayClick'+JSON.stringify(data));
+				uni.navigateTo({
+					url:'../month_log/month_log?date='+encodeURIComponent(date),
+					
+				})
+			},
+			onPreviousMonthClick(data){
+			    /*this.curDate = data.date; 
+				uni.navigateTo({
+					url:'../fill_log/fill_log?date='+encodeURIComponent(JSON.stringify(data.date)) 
+				})*/
+				this.refreshSummary(data.year,data.month);
+				 
+				//console.log('previous month year:' + data.year + ' month : ' + data.month);
+			},
+			onNextMonthClick(data){
+			    /**this.curDate = data.date; 
+				uni.navigateTo({
+					url:'../fill_log/fill_log?date='+encodeURIComponent(JSON.stringify(data.date)) 
+				})*/
+				//let date = new Date();
+				//let date2 = new Date(data.year,data.month,1);
+				//if(date2>date)
+				//	return;
+				//console.log('date2'+JSON.stringify(data.month));
+				this.refreshSummary(data.year,data.month);
+				//this.index = this.index+2;
+				//if(this.index>30)
+				//	this.index = 0;
+				//this.$refs.ren.set_status(this.index,0);
+				//console.log('next month year:' + data.year + ' month : ' + data.month)
+			},
+			addMonth(date, months) {
+				    let y = date.getFullYear();
+				    let m = date.getMonth();
+				    var d = date.getDate();
+				
+			//		console.log('add month y' + y + ' m:' + m + ' d: ' + d + ' month: ' + months);
+				    y += Math.floor((m + 1 + months) / 12); //计算年
+				    m = Math.floor((m + 1 + months) % 12) - 1; //计算月
+					let _date = new Date(y,m,d);
+			//		console.log('result y:' + y + ' m: ' + m + '_date:' + _date);
+					return _date;
+				},
+			is_future_month(increment)
+			{
+				let date = new Date();
+				let page_date = new Date(this.year,this.month-1,1);
+				page_date = this.addMonth(page_date,increment)
+				let _y = date.getFullYear();//当前年
+				let _m = date.getMonth();//当前月
+				let _y1 = page_date.getFullYear();
+				let _m1 = page_date.getMonth(); 
+				if(_y1>_y)
+					return true;
+				if(_y1<_y)
+					return false;
+				if(_m1 > _m)
+					return true;
+				return false;
+				
+				
+			},
+			back() {
+				//console.log('test')
+				/*uni.navigateBack({
+					delta: 1
+				})*/
+				history.back();
+			},
+			changeMonth(type){
+			    if(type=='pre'){
+			       if (this.month + 1 == 2) {
+			           this.month = 12;
+			           this.year = this.year - 1;
+			       } else {
+			           this.month = this.month - 1;
+			       } 
+			    }else{
+			        if (this.month + 1 == 13) {
+			            this.month = 1;
+			            this.year = this.year + 1;
+			        } else {
+			            this.month = this.month + 1;
+			        }
+			    }  
+				 
+			}
+		}
+	}
+</script>
+
+<style lang="scss">
+	@import url("/static/font/iconfont.css");
+	@import "@/common/pa_main.scss";
+    page{
+        background-color: $bgcolor;
+    }
+	.content { 
+		.change{
+            display: flex;
+            align-items: center;
+            justify-content: center;
+            margin: 0 auto;
+            margin-top: $margin_10;
+            height: $default_row_height;
+            color: $al_fgcolor;
+            background-color: $al_bgcolor;
+        }
+		.middle-box{
+			
+			display: flex;
+			flex-direction: row;
+			align-items: center;
+			justify-content: space-between;
+			background-color: $bgcolor;
+			height: $default_row_height;
+			width: auto;
+			.left-box{				
+				margin-left: $margin_2;
+			}
+			.right-box{
+				margin-right: $margin_2;	
+			}
+		}
+		.footer-box
+		{
+			background-color: $fgcolor;
+			.content
+			{
+				margin-left: $margin_1;
+			}
+		}
+	}
+	button::after { border: none }
+	 
+	::-webkit-scrollbar {
+	    display: none;  
+	    width: 0 !important;  
+	    height: 0 !important;  
+	    -webkit-appearance: none;  
+	    background: transparent;  
+	}
+	.month-class{
+		    border: 1px solid #E6E6E6;
+		    background: rgb(255, 255, 255);
+			display: flex;
+			align-items: center;
+			margin-top: 10px;
+			color: #42464A;
+			font-size: 32rpx;
+			font-weight: bold;
+			padding: 4rpx 20rpx;
+	}
+</style>

BIN
static/arrow_down.png


BIN
static/component.png


BIN
static/componentHL.png


BIN
static/extui.png


BIN
static/extuiHL.png


+ 539 - 0
static/font/demo.css

@@ -0,0 +1,539 @@
+/* Logo 字体 */
+@font-face {
+  font-family: "iconfont logo";
+  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
+  src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
+    url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
+}
+
+.logo {
+  font-family: "iconfont logo";
+  font-size: 160px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+/* tabs */
+.nav-tabs {
+  position: relative;
+}
+
+.nav-tabs .nav-more {
+  position: absolute;
+  right: 0;
+  bottom: 0;
+  height: 42px;
+  line-height: 42px;
+  color: #666;
+}
+
+#tabs {
+  border-bottom: 1px solid #eee;
+}
+
+#tabs li {
+  cursor: pointer;
+  width: 100px;
+  height: 40px;
+  line-height: 40px;
+  text-align: center;
+  font-size: 16px;
+  border-bottom: 2px solid transparent;
+  position: relative;
+  z-index: 1;
+  margin-bottom: -1px;
+  color: #666;
+}
+
+
+#tabs .active {
+  border-bottom-color: #f00;
+  color: #222;
+}
+
+.tab-container .content {
+  display: none;
+}
+
+/* 页面布局 */
+.main {
+  padding: 30px 100px;
+  width: 960px;
+  margin: 0 auto;
+}
+
+.main .logo {
+  color: #333;
+  text-align: left;
+  margin-bottom: 30px;
+  line-height: 1;
+  height: 110px;
+  margin-top: -50px;
+  overflow: hidden;
+  *zoom: 1;
+}
+
+.main .logo a {
+  font-size: 160px;
+  color: #333;
+}
+
+.helps {
+  margin-top: 40px;
+}
+
+.helps pre {
+  padding: 20px;
+  margin: 10px 0;
+  border: solid 1px #e7e1cd;
+  background-color: #fffdef;
+  overflow: auto;
+}
+
+.icon_lists {
+  width: 100% !important;
+  overflow: hidden;
+  *zoom: 1;
+}
+
+.icon_lists li {
+  width: 100px;
+  margin-bottom: 10px;
+  margin-right: 20px;
+  text-align: center;
+  list-style: none !important;
+  cursor: default;
+}
+
+.icon_lists li .code-name {
+  line-height: 1.2;
+}
+
+.icon_lists .icon {
+  display: block;
+  height: 100px;
+  line-height: 100px;
+  font-size: 42px;
+  margin: 10px auto;
+  color: #333;
+  -webkit-transition: font-size 0.25s linear, width 0.25s linear;
+  -moz-transition: font-size 0.25s linear, width 0.25s linear;
+  transition: font-size 0.25s linear, width 0.25s linear;
+}
+
+.icon_lists .icon:hover {
+  font-size: 100px;
+}
+
+.icon_lists .svg-icon {
+  /* 通过设置 font-size 来改变图标大小 */
+  width: 1em;
+  /* 图标和文字相邻时,垂直对齐 */
+  vertical-align: -0.15em;
+  /* 通过设置 color 来改变 SVG 的颜色/fill */
+  fill: currentColor;
+  /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
+      normalize.css 中也包含这行 */
+  overflow: hidden;
+}
+
+.icon_lists li .name,
+.icon_lists li .code-name {
+  color: #666;
+}
+
+/* markdown 样式 */
+.markdown {
+  color: #666;
+  font-size: 14px;
+  line-height: 1.8;
+}
+
+.highlight {
+  line-height: 1.5;
+}
+
+.markdown img {
+  vertical-align: middle;
+  max-width: 100%;
+}
+
+.markdown h1 {
+  color: #404040;
+  font-weight: 500;
+  line-height: 40px;
+  margin-bottom: 24px;
+}
+
+.markdown h2,
+.markdown h3,
+.markdown h4,
+.markdown h5,
+.markdown h6 {
+  color: #404040;
+  margin: 1.6em 0 0.6em 0;
+  font-weight: 500;
+  clear: both;
+}
+
+.markdown h1 {
+  font-size: 28px;
+}
+
+.markdown h2 {
+  font-size: 22px;
+}
+
+.markdown h3 {
+  font-size: 16px;
+}
+
+.markdown h4 {
+  font-size: 14px;
+}
+
+.markdown h5 {
+  font-size: 12px;
+}
+
+.markdown h6 {
+  font-size: 12px;
+}
+
+.markdown hr {
+  height: 1px;
+  border: 0;
+  background: #e9e9e9;
+  margin: 16px 0;
+  clear: both;
+}
+
+.markdown p {
+  margin: 1em 0;
+}
+
+.markdown>p,
+.markdown>blockquote,
+.markdown>.highlight,
+.markdown>ol,
+.markdown>ul {
+  width: 80%;
+}
+
+.markdown ul>li {
+  list-style: circle;
+}
+
+.markdown>ul li,
+.markdown blockquote ul>li {
+  margin-left: 20px;
+  padding-left: 4px;
+}
+
+.markdown>ul li p,
+.markdown>ol li p {
+  margin: 0.6em 0;
+}
+
+.markdown ol>li {
+  list-style: decimal;
+}
+
+.markdown>ol li,
+.markdown blockquote ol>li {
+  margin-left: 20px;
+  padding-left: 4px;
+}
+
+.markdown code {
+  margin: 0 3px;
+  padding: 0 5px;
+  background: #eee;
+  border-radius: 3px;
+}
+
+.markdown strong,
+.markdown b {
+  font-weight: 600;
+}
+
+.markdown>table {
+  border-collapse: collapse;
+  border-spacing: 0px;
+  empty-cells: show;
+  border: 1px solid #e9e9e9;
+  width: 95%;
+  margin-bottom: 24px;
+}
+
+.markdown>table th {
+  white-space: nowrap;
+  color: #333;
+  font-weight: 600;
+}
+
+.markdown>table th,
+.markdown>table td {
+  border: 1px solid #e9e9e9;
+  padding: 8px 16px;
+  text-align: left;
+}
+
+.markdown>table th {
+  background: #F7F7F7;
+}
+
+.markdown blockquote {
+  font-size: 90%;
+  color: #999;
+  border-left: 4px solid #e9e9e9;
+  padding-left: 0.8em;
+  margin: 1em 0;
+}
+
+.markdown blockquote p {
+  margin: 0;
+}
+
+.markdown .anchor {
+  opacity: 0;
+  transition: opacity 0.3s ease;
+  margin-left: 8px;
+}
+
+.markdown .waiting {
+  color: #ccc;
+}
+
+.markdown h1:hover .anchor,
+.markdown h2:hover .anchor,
+.markdown h3:hover .anchor,
+.markdown h4:hover .anchor,
+.markdown h5:hover .anchor,
+.markdown h6:hover .anchor {
+  opacity: 1;
+  display: inline-block;
+}
+
+.markdown>br,
+.markdown>p>br {
+  clear: both;
+}
+
+
+.hljs {
+  display: block;
+  background: white;
+  padding: 0.5em;
+  color: #333333;
+  overflow-x: auto;
+}
+
+.hljs-comment,
+.hljs-meta {
+  color: #969896;
+}
+
+.hljs-string,
+.hljs-variable,
+.hljs-template-variable,
+.hljs-strong,
+.hljs-emphasis,
+.hljs-quote {
+  color: #df5000;
+}
+
+.hljs-keyword,
+.hljs-selector-tag,
+.hljs-type {
+  color: #a71d5d;
+}
+
+.hljs-literal,
+.hljs-symbol,
+.hljs-bullet,
+.hljs-attribute {
+  color: #0086b3;
+}
+
+.hljs-section,
+.hljs-name {
+  color: #63a35c;
+}
+
+.hljs-tag {
+  color: #333333;
+}
+
+.hljs-title,
+.hljs-attr,
+.hljs-selector-id,
+.hljs-selector-class,
+.hljs-selector-attr,
+.hljs-selector-pseudo {
+  color: #795da3;
+}
+
+.hljs-addition {
+  color: #55a532;
+  background-color: #eaffea;
+}
+
+.hljs-deletion {
+  color: #bd2c00;
+  background-color: #ffecec;
+}
+
+.hljs-link {
+  text-decoration: underline;
+}
+
+/* 代码高亮 */
+/* PrismJS 1.15.0
+https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
+/**
+ * prism.js default theme for JavaScript, CSS and HTML
+ * Based on dabblet (http://dabblet.com)
+ * @author Lea Verou
+ */
+code[class*="language-"],
+pre[class*="language-"] {
+  color: black;
+  background: none;
+  text-shadow: 0 1px white;
+  font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+  text-align: left;
+  white-space: pre;
+  word-spacing: normal;
+  word-break: normal;
+  word-wrap: normal;
+  line-height: 1.5;
+
+  -moz-tab-size: 4;
+  -o-tab-size: 4;
+  tab-size: 4;
+
+  -webkit-hyphens: none;
+  -moz-hyphens: none;
+  -ms-hyphens: none;
+  hyphens: none;
+}
+
+pre[class*="language-"]::-moz-selection,
+pre[class*="language-"] ::-moz-selection,
+code[class*="language-"]::-moz-selection,
+code[class*="language-"] ::-moz-selection {
+  text-shadow: none;
+  background: #b3d4fc;
+}
+
+pre[class*="language-"]::selection,
+pre[class*="language-"] ::selection,
+code[class*="language-"]::selection,
+code[class*="language-"] ::selection {
+  text-shadow: none;
+  background: #b3d4fc;
+}
+
+@media print {
+
+  code[class*="language-"],
+  pre[class*="language-"] {
+    text-shadow: none;
+  }
+}
+
+/* Code blocks */
+pre[class*="language-"] {
+  padding: 1em;
+  margin: .5em 0;
+  overflow: auto;
+}
+
+:not(pre)>code[class*="language-"],
+pre[class*="language-"] {
+  background: #f5f2f0;
+}
+
+/* Inline code */
+:not(pre)>code[class*="language-"] {
+  padding: .1em;
+  border-radius: .3em;
+  white-space: normal;
+}
+
+.token.comment,
+.token.prolog,
+.token.doctype,
+.token.cdata {
+  color: slategray;
+}
+
+.token.punctuation {
+  color: #999;
+}
+
+.namespace {
+  opacity: .7;
+}
+
+.token.property,
+.token.tag,
+.token.boolean,
+.token.number,
+.token.constant,
+.token.symbol,
+.token.deleted {
+  color: #905;
+}
+
+.token.selector,
+.token.attr-name,
+.token.string,
+.token.char,
+.token.builtin,
+.token.inserted {
+  color: #690;
+}
+
+.token.operator,
+.token.entity,
+.token.url,
+.language-css .token.string,
+.style .token.string {
+  color: #9a6e3a;
+  background: hsla(0, 0%, 100%, .5);
+}
+
+.token.atrule,
+.token.attr-value,
+.token.keyword {
+  color: #07a;
+}
+
+.token.function,
+.token.class-name {
+  color: #DD4A68;
+}
+
+.token.regex,
+.token.important,
+.token.variable {
+  color: #e90;
+}
+
+.token.important,
+.token.bold {
+  font-weight: bold;
+}
+
+.token.italic {
+  font-style: italic;
+}
+
+.token.entity {
+  cursor: help;
+}

+ 349 - 0
static/font/demo_index.html

@@ -0,0 +1,349 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8"/>
+  <title>iconfont Demo</title>
+  <link rel="shortcut icon" href="//img.alicdn.com/imgextra/i2/O1CN01ZyAlrn1MwaMhqz36G_!!6000000001499-73-tps-64-64.ico" type="image/x-icon"/>
+  <link rel="icon" type="image/svg+xml" href="//img.alicdn.com/imgextra/i4/O1CN01EYTRnJ297D6vehehJ_!!6000000008020-55-tps-64-64.svg"/>
+  <link rel="stylesheet" href="https://g.alicdn.com/thx/cube/1.3.2/cube.min.css">
+  <link rel="stylesheet" href="demo.css">
+  <link rel="stylesheet" href="iconfont.css">
+  <script src="iconfont.js"></script>
+  <!-- jQuery -->
+  <script src="https://a1.alicdn.com/oss/uploads/2018/12/26/7bfddb60-08e8-11e9-9b04-53e73bb6408b.js"></script>
+  <!-- 代码高亮 -->
+  <script src="https://a1.alicdn.com/oss/uploads/2018/12/26/a3f714d0-08e6-11e9-8a15-ebf944d7534c.js"></script>
+  <style>
+    .main .logo {
+      margin-top: 0;
+      height: auto;
+    }
+
+    .main .logo a {
+      display: flex;
+      align-items: center;
+    }
+
+    .main .logo .sub-title {
+      margin-left: 0.5em;
+      font-size: 22px;
+      color: #fff;
+      background: linear-gradient(-45deg, #3967FF, #B500FE);
+      -webkit-background-clip: text;
+      -webkit-text-fill-color: transparent;
+    }
+  </style>
+</head>
+<body>
+  <div class="main">
+    <h1 class="logo"><a href="https://www.iconfont.cn/" title="iconfont 首页" target="_blank">
+      <img width="200" src="https://img.alicdn.com/imgextra/i3/O1CN01Mn65HV1FfSEzR6DKv_!!6000000000514-55-tps-228-59.svg">
+      
+    </a></h1>
+    <div class="nav-tabs">
+      <ul id="tabs" class="dib-box">
+        <li class="dib active"><span>Unicode</span></li>
+        <li class="dib"><span>Font class</span></li>
+        <li class="dib"><span>Symbol</span></li>
+      </ul>
+      
+      <a href="https://www.iconfont.cn/manage/index?manage_type=myprojects&projectId=2852387" target="_blank" class="nav-more">查看项目</a>
+      
+    </div>
+    <div class="tab-container">
+      <div class="content unicode" style="display: block;">
+          <ul class="icon_lists dib-box">
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe797;</span>
+                <div class="name">组织人员</div>
+                <div class="code-name">&amp;#xe797;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe6ae;</span>
+                <div class="name">triangle-down</div>
+                <div class="code-name">&amp;#xe6ae;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe837;</span>
+                <div class="name">switch</div>
+                <div class="code-name">&amp;#xe837;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe66d;</span>
+                <div class="name">msg</div>
+                <div class="code-name">&amp;#xe66d;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe600;</span>
+                <div class="name">left-icon</div>
+                <div class="code-name">&amp;#xe600;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe77f;</span>
+                <div class="name">left-circle</div>
+                <div class="code-name">&amp;#xe77f;</div>
+              </li>
+          
+            <li class="dib">
+              <span class="icon iconfont">&#xe783;</span>
+                <div class="name">right-circle</div>
+                <div class="code-name">&amp;#xe783;</div>
+              </li>
+          
+          </ul>
+          <div class="article markdown">
+          <h2 id="unicode-">Unicode 引用</h2>
+          <hr>
+
+          <p>Unicode 是字体在网页端最原始的应用方式,特点是:</p>
+          <ul>
+            <li>支持按字体的方式去动态调整图标大小,颜色等等。</li>
+            <li>默认情况下不支持多色,直接添加多色图标会自动去色。</li>
+          </ul>
+          <blockquote>
+            <p>注意:新版 iconfont 支持两种方式引用多色图标:SVG symbol 引用方式和彩色字体图标模式。(使用彩色字体图标需要在「编辑项目」中开启「彩色」选项后并重新生成。)</p>
+          </blockquote>
+          <p>Unicode 使用步骤如下:</p>
+          <h3 id="-font-face">第一步:拷贝项目下面生成的 <code>@font-face</code></h3>
+<pre><code class="language-css"
+>@font-face {
+  font-family: 'iconfont';
+  src: url('iconfont.woff2?t=1639792867334') format('woff2'),
+       url('iconfont.woff?t=1639792867334') format('woff'),
+       url('iconfont.ttf?t=1639792867334') format('truetype');
+}
+</code></pre>
+          <h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
+<pre><code class="language-css"
+>.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+</code></pre>
+          <h3 id="-">第三步:挑选相应图标并获取字体编码,应用于页面</h3>
+<pre>
+<code class="language-html"
+>&lt;span class="iconfont"&gt;&amp;#x33;&lt;/span&gt;
+</code></pre>
+          <blockquote>
+            <p>"iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
+          </blockquote>
+          </div>
+      </div>
+      <div class="content font-class">
+        <ul class="icon_lists dib-box">
+          
+          <li class="dib">
+            <span class="icon iconfont icon-zuzhirenyuan"></span>
+            <div class="name">
+              组织人员
+            </div>
+            <div class="code-name">.icon-zuzhirenyuan
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-triangle-down"></span>
+            <div class="name">
+              triangle-down
+            </div>
+            <div class="code-name">.icon-triangle-down
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-switch"></span>
+            <div class="name">
+              switch
+            </div>
+            <div class="code-name">.icon-switch
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-msg"></span>
+            <div class="name">
+              msg
+            </div>
+            <div class="code-name">.icon-msg
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-lefticon"></span>
+            <div class="name">
+              left-icon
+            </div>
+            <div class="code-name">.icon-lefticon
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-left-circle"></span>
+            <div class="name">
+              left-circle
+            </div>
+            <div class="code-name">.icon-left-circle
+            </div>
+          </li>
+          
+          <li class="dib">
+            <span class="icon iconfont icon-right-circle"></span>
+            <div class="name">
+              right-circle
+            </div>
+            <div class="code-name">.icon-right-circle
+            </div>
+          </li>
+          
+        </ul>
+        <div class="article markdown">
+        <h2 id="font-class-">font-class 引用</h2>
+        <hr>
+
+        <p>font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。</p>
+        <p>与 Unicode 使用方式相比,具有如下特点:</p>
+        <ul>
+          <li>相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。</li>
+          <li>因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。</li>
+        </ul>
+        <p>使用步骤如下:</p>
+        <h3 id="-fontclass-">第一步:引入项目下面生成的 fontclass 代码:</h3>
+<pre><code class="language-html">&lt;link rel="stylesheet" href="./iconfont.css"&gt;
+</code></pre>
+        <h3 id="-">第二步:挑选相应图标并获取类名,应用于页面:</h3>
+<pre><code class="language-html">&lt;span class="iconfont icon-xxx"&gt;&lt;/span&gt;
+</code></pre>
+        <blockquote>
+          <p>"
+            iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
+        </blockquote>
+      </div>
+      </div>
+      <div class="content symbol">
+          <ul class="icon_lists dib-box">
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-zuzhirenyuan"></use>
+                </svg>
+                <div class="name">组织人员</div>
+                <div class="code-name">#icon-zuzhirenyuan</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-triangle-down"></use>
+                </svg>
+                <div class="name">triangle-down</div>
+                <div class="code-name">#icon-triangle-down</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-switch"></use>
+                </svg>
+                <div class="name">switch</div>
+                <div class="code-name">#icon-switch</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-msg"></use>
+                </svg>
+                <div class="name">msg</div>
+                <div class="code-name">#icon-msg</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-lefticon"></use>
+                </svg>
+                <div class="name">left-icon</div>
+                <div class="code-name">#icon-lefticon</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-left-circle"></use>
+                </svg>
+                <div class="name">left-circle</div>
+                <div class="code-name">#icon-left-circle</div>
+            </li>
+          
+            <li class="dib">
+                <svg class="icon svg-icon" aria-hidden="true">
+                  <use xlink:href="#icon-right-circle"></use>
+                </svg>
+                <div class="name">right-circle</div>
+                <div class="code-name">#icon-right-circle</div>
+            </li>
+          
+          </ul>
+          <div class="article markdown">
+          <h2 id="symbol-">Symbol 引用</h2>
+          <hr>
+
+          <p>这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇<a href="">文章</a>
+            这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:</p>
+          <ul>
+            <li>支持多色图标了,不再受单色限制。</li>
+            <li>通过一些技巧,支持像字体那样,通过 <code>font-size</code>, <code>color</code> 来调整样式。</li>
+            <li>兼容性较差,支持 IE9+,及现代浏览器。</li>
+            <li>浏览器渲染 SVG 的性能一般,还不如 png。</li>
+          </ul>
+          <p>使用步骤如下:</p>
+          <h3 id="-symbol-">第一步:引入项目下面生成的 symbol 代码:</h3>
+<pre><code class="language-html">&lt;script src="./iconfont.js"&gt;&lt;/script&gt;
+</code></pre>
+          <h3 id="-css-">第二步:加入通用 CSS 代码(引入一次就行):</h3>
+<pre><code class="language-html">&lt;style&gt;
+.icon {
+  width: 1em;
+  height: 1em;
+  vertical-align: -0.15em;
+  fill: currentColor;
+  overflow: hidden;
+}
+&lt;/style&gt;
+</code></pre>
+          <h3 id="-">第三步:挑选相应图标并获取类名,应用于页面:</h3>
+<pre><code class="language-html">&lt;svg class="icon" aria-hidden="true"&gt;
+  &lt;use xlink:href="#icon-xxx"&gt;&lt;/use&gt;
+&lt;/svg&gt;
+</code></pre>
+          </div>
+      </div>
+
+    </div>
+  </div>
+  <script>
+  $(document).ready(function () {
+      $('.tab-container .content:first').show()
+
+      $('#tabs li').click(function (e) {
+        var tabContent = $('.tab-container .content')
+        var index = $(this).index()
+
+        if ($(this).hasClass('active')) {
+          return
+        } else {
+          $('#tabs li').removeClass('active')
+          $(this).addClass('active')
+
+          tabContent.hide().eq(index).fadeIn()
+        }
+      })
+    })
+  </script>
+</body>
+</html>

+ 42 - 0
static/font/iconfont.css

@@ -0,0 +1,42 @@
+@font-face {
+  font-family: "iconfont"; /* Project id 2852387 */
+  src: url('//at.alicdn.com/t/font_2852387_yivxpao891h.woff2?t=1639792862780') format('woff2'),
+       url('//at.alicdn.com/t/font_2852387_yivxpao891h.woff?t=1639792862780') format('woff'),
+       url('//at.alicdn.com/t/font_2852387_yivxpao891h.ttf?t=1639792862780') format('truetype');
+}
+
+.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-zuzhirenyuan:before {
+  content: "\e797";
+}
+
+.icon-triangle-down:before {
+  content: "\e6ae";
+}
+
+.icon-switch:before {
+  content: "\e837";
+}
+
+.icon-msg:before {
+  content: "\e66d";
+}
+
+.icon-lefticon:before {
+  content: "\e600";
+}
+
+.icon-left-circle:before {
+  content: "\e77f";
+}
+
+.icon-right-circle:before {
+  content: "\e783";
+}

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 0
static/font/iconfont.js


+ 58 - 0
static/font/iconfont.json

@@ -0,0 +1,58 @@
+{
+  "id": "2852387",
+  "name": "荆鹏绩效考核",
+  "font_family": "iconfont",
+  "css_prefix_text": "icon-",
+  "description": "",
+  "glyphs": [
+    {
+      "icon_id": "2533792",
+      "name": "组织人员",
+      "font_class": "zuzhirenyuan",
+      "unicode": "e797",
+      "unicode_decimal": 59287
+    },
+    {
+      "icon_id": "18592622",
+      "name": "triangle-down",
+      "font_class": "triangle-down",
+      "unicode": "e6ae",
+      "unicode_decimal": 59054
+    },
+    {
+      "icon_id": "6151314",
+      "name": "switch",
+      "font_class": "switch",
+      "unicode": "e837",
+      "unicode_decimal": 59447
+    },
+    {
+      "icon_id": "879393",
+      "name": "msg",
+      "font_class": "msg",
+      "unicode": "e66d",
+      "unicode_decimal": 58989
+    },
+    {
+      "icon_id": "795657",
+      "name": "left-icon",
+      "font_class": "lefticon",
+      "unicode": "e600",
+      "unicode_decimal": 58880
+    },
+    {
+      "icon_id": "4765728",
+      "name": "left-circle",
+      "font_class": "left-circle",
+      "unicode": "e77f",
+      "unicode_decimal": 59263
+    },
+    {
+      "icon_id": "4765738",
+      "name": "right-circle",
+      "font_class": "right-circle",
+      "unicode": "e783",
+      "unicode_decimal": 59267
+    }
+  ]
+}

BIN
static/font/iconfont.ttf


BIN
static/font/iconfont.woff


BIN
static/font/iconfont.woff2


BIN
static/logo.png


BIN
static/template.png


BIN
static/templateHL.png


BIN
static/uni.ttf


BIN
static/userpic.png


+ 23 - 0
store/index.js

@@ -0,0 +1,23 @@
+import Vue from 'vue'
+import Vuex from 'vuex'
+
+Vue.use(Vuex)
+ 
+export default new Vuex.Store({
+  modules: {
+    
+  },
+  strict: debug,
+  state:{
+    
+  },
+  mutations:{
+
+  },
+  actions:{
+
+  },
+  getters:{
+	  
+  }
+})

+ 76 - 0
uni.scss

@@ -0,0 +1,76 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+
+/* 颜色变量 */
+
+/* 行为相关颜色 */
+$uni-color-primary: #007aff;
+$uni-color-success: #4cd964;
+$uni-color-warning: #f0ad4e;
+$uni-color-error: #dd524d;
+
+/* 文字基本颜色 */
+$uni-text-color:#333;//基本色
+$uni-text-color-inverse:#fff;//反色
+$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息
+$uni-text-color-placeholder: #808080;
+$uni-text-color-disable:#c0c0c0;
+
+/* 背景颜色 */
+$uni-bg-color:#ffffff;
+$uni-bg-color-grey:#f8f8f8;
+$uni-bg-color-hover:#f1f1f1;//点击状态颜色
+$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色
+
+/* 边框颜色 */
+$uni-border-color:#c8c7cc;
+
+/* 尺寸变量 */
+
+/* 文字尺寸 */
+$uni-font-size-sm:24rpx;
+$uni-font-size-base:28rpx;
+$uni-font-size-lg:32rpx;
+
+/* 图片尺寸 */
+$uni-img-size-sm:40rpx;
+$uni-img-size-base:52rpx;
+$uni-img-size-lg:80rpx;
+
+/* Border Radius */
+$uni-border-radius-sm: 4rpx;
+$uni-border-radius-base: 6rpx;
+$uni-border-radius-lg: 12rpx;
+$uni-border-radius-circle: 50%;
+
+/* 水平间距 */
+$uni-spacing-row-sm: 10px;
+$uni-spacing-row-base: 20rpx;
+$uni-spacing-row-lg: 30rpx;
+
+/* 垂直间距 */
+$uni-spacing-col-sm: 8rpx;
+$uni-spacing-col-base: 16rpx;
+$uni-spacing-col-lg: 24rpx;
+
+/* 透明度 */
+$uni-opacity-disabled: 0.3; // 组件禁用态的透明度
+
+/* 文章场景相关 */
+$uni-color-title: #2C405A; // 文章标题颜色
+$uni-font-size-title:40rpx;
+$uni-color-subtitle: #555555; // 二级标题颜色
+$uni-font-size-subtitle:36rpx;
+$uni-color-paragraph: #3F536E; // 文章段落颜色
+$uni-font-size-paragraph:30rpx;

+ 133 - 0
utils/common.js

@@ -0,0 +1,133 @@
+
+var formatNum=function(num) {
+	let res = Number(num);
+	return res < 10 ? '0' + res : res;
+};
+
+var get_month_str=function(date)
+{
+	let y = date.getFullYear();
+	let m = date.getMonth();
+	//let d = date.getDate();
+	//let week = new Date().getDay();
+	//let weekText = ['日', '一', '二', '三', '四', '五', '六'];
+	//let formatWeek = '星期' + weekText[week];
+	let date_str = y + '-' + formatNum(m + 1) ;//+ ' ' +formatWeek;
+	return date_str;
+};
+var get_date_str=function(date)
+{
+	let y = date.getFullYear();
+	let m = date.getMonth();
+	let d = date.getDate();
+	//let week = new Date().getDay();
+	//let weekText = ['日', '一', '二', '三', '四', '五', '六'];
+	//let formatWeek = '星期' + weekText[week];
+	let date_str = y + '-' + formatNum(m + 1) + '-' + formatNum(d) ;//+ ' ' +formatWeek;
+	return date_str;
+};
+var get_datetime_str=function(date)
+{
+	let y = date.getFullYear();
+	let m = date.getMonth();
+	let d = date.getDate();
+	let hours = date.getHours();
+	let minutes = date.getMinutes();
+	let seconds = date.getSeconds();
+	let date_str = y + '-' + formatNum(m + 1) + '-' + formatNum(d) + ' ' + formatNum(hours)+ ':'+ formatNum(minutes)+':'+ formatNum(seconds);//+ ' ' +formatWeek;
+	return date_str; 
+};
+var get_date_week_str=function(date) {
+	//let date = new Date();
+	let y = date.getFullYear();
+	let m = date.getMonth();
+	let d = date.getDate();
+	let week = new Date(y,m,d).getDay();
+	let weekText = ['日', '一', '二', '三', '四', '五', '六'];
+	let formatWeek = '星期' + weekText[week];
+	let date_str = '';
+	//if(uni.getSystemInfoSync().platform == 'ios')
+	//	date_str = y + '/' + formatNum(m + 1) + '/' + formatNum(d) + ' ' +formatWeek;
+	//else 
+	date_str = y + '-' + formatNum(m + 1) + '-' + formatNum(d) + ' ' +formatWeek;
+	return date_str;
+};
+
+var get_date_week_str_by_slash=function(date) {
+	//let date = new Date();
+	let y = date.getFullYear();
+	let m = date.getMonth();
+	let d = date.getDate();
+	let week = new Date(y,m,d).getDay();
+	let weekText = ['日', '一', '二', '三', '四', '五', '六'];
+	let formatWeek = '星期' + weekText[week];
+	let date_str = y + '/' + formatNum(m + 1) + '/' + formatNum(d) + ' ' +formatWeek;
+	return date_str;
+};
+
+var addMonth=function(date, months) {
+	let y = date.getFullYear();
+	let m = date.getMonth();
+	var d = date.getDate();
+
+//		console.log('add month y' + y + ' m:' + m + ' d: ' + d + ' month: ' + months);
+	y += Math.floor((m + 1 + months) / 12); //计算年
+	m = Math.floor((m + 1 + months) % 12) - 1; //计算月
+	let _date = new Date(y,m,d);
+//		console.log('result y:' + y + ' m: ' + m + '_date:' + _date);
+	return _date;
+};
+var is_future_month=function(year,month,increment)
+{
+	let date = new Date();
+	let page_date = new Date(year,month-1,1);
+	page_date = addMonth(page_date,increment)
+	let _y = date.getFullYear();//当前年
+	let _m = date.getMonth();//当前月
+	let _y1 = page_date.getFullYear();
+	let _m1 = page_date.getMonth(); 
+	if(_y1>_y)
+		return true;
+	if(_y1<_y)
+		return false;
+	if(_m1 > _m)
+		return true;
+	return false;
+};
+var addDay=function(date, days) {
+	var _date = new Date(date.getTime() + 24*60*60*1000*days) 
+	return _date;
+};
+var is_future_day=function(year,month,day,increment)
+{
+	let date = new Date();
+	let page_date = new Date(year,month-1,day);
+	page_date = addDay(page_date,increment);
+	if(date < page_date)
+		return true;
+	/*let _y = date.getFullYear();//当前年
+	let _m = date.getMonth();//当前月
+	let _y1 = page_date.getFullYear();
+	let _m1 = page_date.getMonth(); 
+	if(_y1>_y)
+		return true;
+	if(_y1<_y)
+		return false;
+	if(_m1 > _m)
+		return true;
+	if(_m1)*/
+	return false;
+};
+
+export default{
+	formatNum,
+	get_date_str,
+	get_month_str,
+	get_datetime_str,
+	get_date_week_str,
+	get_date_week_str_by_slash,
+	addDay,
+	is_future_day,
+	addMonth,
+	is_future_month 
+}

+ 27 - 0
utils/store.js

@@ -0,0 +1,27 @@
+module.exports = {
+	// 设置值
+	setItem(key, value, module_name) {
+		if (module_name) { // 处理对象
+			let module_name_info = this.getItem(module_name);
+			module_name_info[key] = value;
+			uni.setStorageSync(module_name,module_name_info)
+		} else {
+			uni.setStorageSync(key, value);
+		}
+	},
+	// 获取值
+	getItem(key,module_name){
+		if(module_name){
+			let val = this.getItem(module_name);
+			if(val) return val[key];
+			return '';
+		}else{
+			return uni.getStorageSync(key);
+		}
+	},
+	// 删除值
+	clear(key){
+        // 三目运算;有key值时,删除storage中键名为key的缓存。没有key值时,删除storage中的所有值。
+		key?uni.removeStorageSync(key):uni.clearStorageSync();
+	},
+}

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff