components.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. const statisticsCard = {
  2. template: `
  3. <div class="statistics-card" :class="{ 'statistics-card_border':border,'statistics-card_shadow':shadow,'statistics-card_colourfull':colorful }" :style="{ backgroundImage:'url('+background+')' }">
  4. <div class="statistics-card_title" v-show="title">{{ title }}
  5. <el-tooltip effect="dark" :content="tip" placement="top" v-if="tip">
  6. <i class="el-icon-warning"></i>
  7. </el-tooltip>
  8. </div>
  9. <count-to class="statistics-card_count" :start-val='0' :end-val="Number(count)" :duration=4000 v-show="count!==null" :style="{ color:countColor }" :decimals="decimals" ></count-to>
  10. <slot/>
  11. </div>`,
  12. props: {
  13. title: {
  14. type: String,
  15. default: ""
  16. },
  17. tip: {
  18. type: String,
  19. default: ""
  20. },
  21. border: {
  22. type: Boolean,
  23. default: true
  24. },
  25. count: {
  26. type: Number | String,
  27. default: null
  28. },
  29. shadow: {
  30. type: Boolean,
  31. default: false
  32. },
  33. colorful: {
  34. type: Boolean,
  35. default: false
  36. },
  37. background: {
  38. type: String,
  39. default: "unset"
  40. },
  41. countColor: {
  42. type: String,
  43. default: "#5e6c84"
  44. },
  45. decimals: {
  46. type: Number,
  47. default: 0
  48. }
  49. },
  50. watch: {
  51. count(newV) {
  52. if (this.decimals === 0) {
  53. let split = String(newV).split(".");
  54. this.decimals = split[1] ? split[1].length : 0;
  55. }
  56. }
  57. }
  58. }
  59. const statisticsTimeRange = {
  60. template: `
  61. <div>
  62. <el-form-item>
  63. <el-select v-model="timeRangeType" @change="dateChanged">
  64. <el-option v-for="typeItem in timeRangeTypes" :key="typeItem.key" :label="typeItem.text" :value="typeItem.key"></el-option>
  65. </el-select>
  66. </el-form-item>
  67. <el-form-item>
  68. <el-date-picker v-model="timeRange" v-show="datePickerType !=='daterange'" :type="datePickerType" placeholder="选择日期"
  69. :format="datePickerFormat"
  70. clearable
  71. :picker-options="{'firstDayOfWeek': 1}"
  72. @change="dateChanged()">
  73. </el-date-picker>
  74. </el-form-item>
  75. <el-form-item>
  76. <el-date-picker
  77. v-show="datePickerType =='daterange'"
  78. v-model="timeRange"
  79. type="daterange"
  80. clearable
  81. @change="dateRangeChanged()"
  82. range-separator="至"
  83. start-placeholder="开始日期"
  84. end-placeholder="结束日期">
  85. </el-date-picker>
  86. </el-form-item>
  87. </div>
  88. `,
  89. props:{
  90. custom:{
  91. type:Boolean,
  92. default:false
  93. }
  94. },
  95. data() {
  96. return {
  97. datePickerFormat: "",
  98. timeRangeTypes: [{
  99. text: "日",
  100. key: "day"
  101. }, {
  102. text: "周",
  103. key: "week"
  104. }, {
  105. text: "月",
  106. key: "month"
  107. }],
  108. timeRangeType: "day",
  109. timeRange: null
  110. }
  111. },
  112. methods: {
  113. dateChanged() {
  114. this.$emit('changed', { timeRangeType: this.timeRangeType, timeRange: new Date(this.timeRange).getTime() });
  115. },
  116. handelDate(date){
  117. date[0] = date[0].getFullYear()+'-'+(date[0].getMonth()+1).toString().padStart(2,'0')+'-'+date[0].getDate().toString().padStart(2,'0')
  118. date[1] = date[1].getFullYear()+'-'+(date[1].getMonth()+1).toString().padStart(2,'0')+'-'+date[1].getDate().toString().padStart(2,'0')
  119. return date
  120. },
  121. dateRangeChanged(){
  122. let arr = []
  123. arr = this.handelDate(this.timeRange)
  124. this.$emit('changed', { timeRangeType: this.timeRangeType, timeRange:arr});
  125. }
  126. },
  127. computed: {
  128. datePickerType() {
  129. switch (this.timeRangeType) {
  130. case "day":
  131. this.datePickerFormat = "yyyy 年 MM 月 dd 日";
  132. return "date";
  133. break;
  134. case "week":
  135. this.datePickerFormat = "yyyy 第 WW 周";
  136. return "week";
  137. break;
  138. case "month":
  139. this.datePickerFormat = "yyyy 年 MM月";
  140. return "month";
  141. break;
  142. case "between":
  143. this.datePickerFormat = null;
  144. return "daterange"
  145. break
  146. }
  147. }
  148. },
  149. mounted(){
  150. if(this.custom){
  151. this.timeRangeTypes= [{
  152. text: "日",
  153. key: "day"
  154. }, {
  155. text: "周",
  156. key: "week"
  157. }, {
  158. text: "月",
  159. key: "month"
  160. },{
  161. text:'自定义',
  162. key:'between'
  163. }]
  164. }
  165. }
  166. }
  167. const StatisticsCardTitle = {
  168. template: `
  169. <div class="component-statistics-card_title">
  170. <slot />
  171. <slot name="right" />
  172. </div>
  173. `
  174. }
  175. const componentMixins = {
  176. components: {
  177. statisticsCard,
  178. StatisticsCardTitle,
  179. statisticsTimeRange
  180. },
  181. methods: {
  182. getDecimals(numbers) {
  183. let split = String(numbers).split(".");
  184. return split[1] ? split[1].length : 0;
  185. },
  186. }
  187. };