作者 王勇

添加了首页,dashboard

@@ -12751,6 +12751,11 @@ @@ -12751,6 +12751,11 @@
12751 "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.10.tgz", 12751 "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.10.tgz",
12752 "integrity": "sha512-ImThpeNU9HbdZL3utgMCq0oiMzAkt1mcgy3/E6zWC/G6AaQoeuFdsl9nDhTDU3X1R6FK7nsIUuRACVcjI+A2GQ==" 12752 "integrity": "sha512-ImThpeNU9HbdZL3utgMCq0oiMzAkt1mcgy3/E6zWC/G6AaQoeuFdsl9nDhTDU3X1R6FK7nsIUuRACVcjI+A2GQ=="
12753 }, 12753 },
  12754 + "vue-count-to": {
  12755 + "version": "1.0.13",
  12756 + "resolved": "https://registry.npmjs.org/vue-count-to/-/vue-count-to-1.0.13.tgz",
  12757 + "integrity": "sha512-6R4OVBVNtQTlcbXu6SJ8ENR35M2/CdWt3Jmv57jOUM+1ojiFmjVGvZPH8DfHpMDSA+ITs+EW5V6qthADxeyYOQ=="
  12758 + },
12754 "vue-hot-reload-api": { 12759 "vue-hot-reload-api": {
12755 "version": "2.3.3", 12760 "version": "2.3.3",
12756 "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.3.tgz", 12761 "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.3.tgz",
@@ -26,6 +26,7 @@ @@ -26,6 +26,7 @@
26 "nprogress": "^0.2.0", 26 "nprogress": "^0.2.0",
27 "script-loader": "^0.7.2", 27 "script-loader": "^0.7.2",
28 "vue": "^2.2.2", 28 "vue": "^2.2.2",
  29 + "vue-count-to": "^1.0.13",
29 "vue-i18n": "^8.14.0", 30 "vue-i18n": "^8.14.0",
30 "vue-router": "^2.3.0", 31 "vue-router": "^2.3.0",
31 "vuex": "^2.0.0-rc.6", 32 "vuex": "^2.0.0-rc.6",
  1 +import request from '@/utils/request'
  2 +
  3 +export function searchUser(name) {
  4 + return request({
  5 + url: '/vue-element-admin/search/user',
  6 + method: 'get',
  7 + params: { name }
  8 + })
  9 +}
  10 +
  11 +export function transactionList(query) {
  12 + return request({
  13 + url: '/vue-element-admin/transaction/list',
  14 + method: 'get',
  15 + params: query
  16 + })
  17 +}
  1 +<template>
  2 +<!-- href="https://github.com/PanJiaChen/vue-element-admin"-->
  3 + <a target="_blank" class="github-corner" aria-label="View source on Github">
  4 + <svg
  5 + width="80"
  6 + height="80"
  7 + viewBox="0 0 250 250"
  8 + style="fill:#40c9c6; color:#fff;"
  9 + aria-hidden="true"
  10 + >
  11 + <path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z" />
  12 + <path
  13 + d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2"
  14 + fill="currentColor"
  15 + style="transform-origin: 130px 106px;"
  16 + class="octo-arm"
  17 + />
  18 + <path
  19 + d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z"
  20 + fill="currentColor"
  21 + class="octo-body"
  22 + />
  23 + </svg>
  24 + </a>
  25 +</template>
  26 +
  27 +<style scoped>
  28 +.github-corner:hover .octo-arm {
  29 + animation: octocat-wave 560ms ease-in-out
  30 +}
  31 +
  32 +@keyframes octocat-wave {
  33 + 0%,
  34 + 100% {
  35 + transform: rotate(0)
  36 + }
  37 + 20%,
  38 + 60% {
  39 + transform: rotate(-25deg)
  40 + }
  41 + 40%,
  42 + 80% {
  43 + transform: rotate(10deg)
  44 + }
  45 +}
  46 +
  47 +@media (max-width:500px) {
  48 + .github-corner:hover .octo-arm {
  49 + animation: none
  50 + }
  51 + .github-corner .octo-arm {
  52 + animation: octocat-wave 560ms ease-in-out
  53 + }
  54 +}
  55 +</style>
  1 +<template>
  2 + <div :style="{zIndex:zIndex,height:height,width:width}" class="pan-item">
  3 + <div class="pan-info">
  4 + <div class="pan-info-roles-container">
  5 + <slot />
  6 + </div>
  7 + </div>
  8 + <!-- eslint-disable-next-line -->
  9 + <div :style="{backgroundImage: `url(${image})`}" class="pan-thumb"></div>
  10 + </div>
  11 +</template>
  12 +
  13 +<script>
  14 +export default {
  15 + name: 'PanThumb',
  16 + props: {
  17 + image: {
  18 + type: String,
  19 + required: true
  20 + },
  21 + zIndex: {
  22 + type: Number,
  23 + default: 1
  24 + },
  25 + width: {
  26 + type: String,
  27 + default: '150px'
  28 + },
  29 + height: {
  30 + type: String,
  31 + default: '150px'
  32 + }
  33 + }
  34 +}
  35 +</script>
  36 +
  37 +<style scoped>
  38 +.pan-item {
  39 + width: 200px;
  40 + height: 200px;
  41 + border-radius: 50%;
  42 + display: inline-block;
  43 + position: relative;
  44 + cursor: default;
  45 + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
  46 +}
  47 +
  48 +.pan-info-roles-container {
  49 + padding: 20px;
  50 + text-align: center;
  51 +}
  52 +
  53 +.pan-thumb {
  54 + width: 100%;
  55 + height: 100%;
  56 + background-position: center center;
  57 + background-size: cover;
  58 + border-radius: 50%;
  59 + overflow: hidden;
  60 + position: absolute;
  61 + transform-origin: 95% 40%;
  62 + transition: all 0.3s ease-in-out;
  63 +}
  64 +
  65 +/* .pan-thumb:after {
  66 + content: '';
  67 + width: 8px;
  68 + height: 8px;
  69 + position: absolute;
  70 + border-radius: 50%;
  71 + top: 40%;
  72 + left: 95%;
  73 + margin: -4px 0 0 -4px;
  74 + background: radial-gradient(ellipse at center, rgba(14, 14, 14, 1) 0%, rgba(125, 126, 125, 1) 100%);
  75 + box-shadow: 0 0 1px rgba(255, 255, 255, 0.9);
  76 +} */
  77 +
  78 +.pan-info {
  79 + position: absolute;
  80 + width: inherit;
  81 + height: inherit;
  82 + border-radius: 50%;
  83 + overflow: hidden;
  84 + box-shadow: inset 0 0 0 5px rgba(0, 0, 0, 0.05);
  85 +}
  86 +
  87 +.pan-info h3 {
  88 + color: #fff;
  89 + text-transform: uppercase;
  90 + position: relative;
  91 + letter-spacing: 2px;
  92 + font-size: 18px;
  93 + margin: 0 60px;
  94 + padding: 22px 0 0 0;
  95 + height: 85px;
  96 + font-family: 'Open Sans', Arial, sans-serif;
  97 + text-shadow: 0 0 1px #fff, 0 1px 2px rgba(0, 0, 0, 0.3);
  98 +}
  99 +
  100 +.pan-info p {
  101 + color: #fff;
  102 + padding: 10px 5px;
  103 + font-style: italic;
  104 + margin: 0 30px;
  105 + font-size: 12px;
  106 + border-top: 1px solid rgba(255, 255, 255, 0.5);
  107 +}
  108 +
  109 +.pan-info p a {
  110 + display: block;
  111 + color: #333;
  112 + width: 80px;
  113 + height: 80px;
  114 + background: rgba(255, 255, 255, 0.3);
  115 + border-radius: 50%;
  116 + color: #fff;
  117 + font-style: normal;
  118 + font-weight: 700;
  119 + text-transform: uppercase;
  120 + font-size: 9px;
  121 + letter-spacing: 1px;
  122 + padding-top: 24px;
  123 + margin: 7px auto 0;
  124 + font-family: 'Open Sans', Arial, sans-serif;
  125 + opacity: 0;
  126 + transition: transform 0.3s ease-in-out 0.2s, opacity 0.3s ease-in-out 0.2s, background 0.2s linear 0s;
  127 + transform: translateX(60px) rotate(90deg);
  128 +}
  129 +
  130 +.pan-info p a:hover {
  131 + background: rgba(255, 255, 255, 0.5);
  132 +}
  133 +
  134 +.pan-item:hover .pan-thumb {
  135 + transform: rotate(-110deg);
  136 +}
  137 +
  138 +.pan-item:hover .pan-info p a {
  139 + opacity: 1;
  140 + transform: translateX(0px) rotate(0deg);
  141 +}
  142 +</style>
  1 +<template>
  2 + <a :class="className" class="link--mallki" href="#">
  3 + {{ text }}
  4 + <span :data-letters="text" />
  5 + <span :data-letters="text" />
  6 + </a>
  7 +</template>
  8 +
  9 +<script>
  10 +export default {
  11 + props: {
  12 + className: {
  13 + type: String,
  14 + default: ''
  15 + },
  16 + text: {
  17 + type: String,
  18 + default: 'vue-element-admin'
  19 + }
  20 + }
  21 +}
  22 +</script>
  23 +
  24 +<style>
  25 +/* Mallki */
  26 +
  27 +.link--mallki {
  28 + font-weight: 800;
  29 + color: #4dd9d5;
  30 + font-family: 'Dosis', sans-serif;
  31 + -webkit-transition: color 0.5s 0.25s;
  32 + transition: color 0.5s 0.25s;
  33 + overflow: hidden;
  34 + position: relative;
  35 + display: inline-block;
  36 + line-height: 1;
  37 + outline: none;
  38 + text-decoration: none;
  39 +}
  40 +
  41 +.link--mallki:hover {
  42 + -webkit-transition: none;
  43 + transition: none;
  44 + color: transparent;
  45 +}
  46 +
  47 +.link--mallki::before {
  48 + content: '';
  49 + width: 100%;
  50 + height: 6px;
  51 + margin: -3px 0 0 0;
  52 + background: #3888fa;
  53 + position: absolute;
  54 + left: 0;
  55 + top: 50%;
  56 + -webkit-transform: translate3d(-100%, 0, 0);
  57 + transform: translate3d(-100%, 0, 0);
  58 + -webkit-transition: -webkit-transform 0.4s;
  59 + transition: transform 0.4s;
  60 + -webkit-transition-timing-function: cubic-bezier(0.7, 0, 0.3, 1);
  61 + transition-timing-function: cubic-bezier(0.7, 0, 0.3, 1);
  62 +}
  63 +
  64 +.link--mallki:hover::before {
  65 + -webkit-transform: translate3d(100%, 0, 0);
  66 + transform: translate3d(100%, 0, 0);
  67 +}
  68 +
  69 +.link--mallki span {
  70 + position: absolute;
  71 + height: 50%;
  72 + width: 100%;
  73 + left: 0;
  74 + top: 0;
  75 + overflow: hidden;
  76 +}
  77 +
  78 +.link--mallki span::before {
  79 + content: attr(data-letters);
  80 + color: red;
  81 + position: absolute;
  82 + left: 0;
  83 + width: 100%;
  84 + color: #3888fa;
  85 + -webkit-transition: -webkit-transform 0.5s;
  86 + transition: transform 0.5s;
  87 +}
  88 +
  89 +.link--mallki span:nth-child(2) {
  90 + top: 50%;
  91 +}
  92 +
  93 +.link--mallki span:first-child::before {
  94 + top: 0;
  95 + -webkit-transform: translate3d(0, 100%, 0);
  96 + transform: translate3d(0, 100%, 0);
  97 +}
  98 +
  99 +.link--mallki span:nth-child(2)::before {
  100 + bottom: 0;
  101 + -webkit-transform: translate3d(0, -100%, 0);
  102 + transform: translate3d(0, -100%, 0);
  103 +}
  104 +
  105 +.link--mallki:hover span::before {
  106 + -webkit-transition-delay: 0.3s;
  107 + transition-delay: 0.3s;
  108 + -webkit-transform: translate3d(0, 0, 0);
  109 + transform: translate3d(0, 0, 0);
  110 + -webkit-transition-timing-function: cubic-bezier(0.2, 1, 0.3, 1);
  111 + transition-timing-function: cubic-bezier(0.2, 1, 0.3, 1);
  112 +}
  113 +</style>
1 import Login from './views/Login.vue' 1 import Login from './views/Login.vue'
2 import NotFound from './views/404.vue' 2 import NotFound from './views/404.vue'
3 import Home from './views/Home.vue' 3 import Home from './views/Home.vue'
4 -import Main from './views/Main.vue' 4 +import Main from './views/dashboard/index'
5 // import Table from './views/nav1/Table.vue' 5 // import Table from './views/nav1/Table.vue'
6 import Role from './views/nav1/role.vue' 6 import Role from './views/nav1/role.vue'
7 import Perm from './views/nav1/perm.vue' 7 import Perm from './views/nav1/perm.vue'
  1 +<template>
  2 + <div :class="className" :style="{height:height,width:width}" />
  3 +</template>
  4 +
  5 +<script>
  6 +import echarts from 'echarts'
  7 +require('echarts/theme/macarons') // echarts theme
  8 +import resize from './mixins/resize'
  9 +
  10 +const animationDuration = 6000
  11 +
  12 +export default {
  13 + mixins: [resize],
  14 + props: {
  15 + className: {
  16 + type: String,
  17 + default: 'chart'
  18 + },
  19 + width: {
  20 + type: String,
  21 + default: '100%'
  22 + },
  23 + height: {
  24 + type: String,
  25 + default: '300px'
  26 + }
  27 + },
  28 + data() {
  29 + return {
  30 + chart: null
  31 + }
  32 + },
  33 + mounted() {
  34 + this.$nextTick(() => {
  35 + this.initChart()
  36 + })
  37 + },
  38 + beforeDestroy() {
  39 + if (!this.chart) {
  40 + return
  41 + }
  42 + this.chart.dispose()
  43 + this.chart = null
  44 + },
  45 + methods: {
  46 + initChart() {
  47 + this.chart = echarts.init(this.$el, 'macarons')
  48 +
  49 + this.chart.setOption({
  50 + tooltip: {
  51 + trigger: 'axis',
  52 + axisPointer: { // 坐标轴指示器,坐标轴触发有效
  53 + type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
  54 + }
  55 + },
  56 + grid: {
  57 + top: 10,
  58 + left: '2%',
  59 + right: '2%',
  60 + bottom: '3%',
  61 + containLabel: true
  62 + },
  63 + xAxis: [{
  64 + type: 'category',
  65 + data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
  66 + axisTick: {
  67 + alignWithLabel: true
  68 + }
  69 + }],
  70 + yAxis: [{
  71 + type: 'value',
  72 + axisTick: {
  73 + show: false
  74 + }
  75 + }],
  76 + series: [{
  77 + name: 'pageA',
  78 + type: 'bar',
  79 + stack: 'vistors',
  80 + barWidth: '60%',
  81 + data: [79, 52, 200, 334, 390, 330, 220],
  82 + animationDuration
  83 + }, {
  84 + name: 'pageB',
  85 + type: 'bar',
  86 + stack: 'vistors',
  87 + barWidth: '60%',
  88 + data: [80, 52, 200, 334, 390, 330, 220],
  89 + animationDuration
  90 + }, {
  91 + name: 'pageC',
  92 + type: 'bar',
  93 + stack: 'vistors',
  94 + barWidth: '60%',
  95 + data: [30, 52, 200, 334, 390, 330, 220],
  96 + animationDuration
  97 + }]
  98 + })
  99 + }
  100 + }
  101 +}
  102 +</script>
  1 +<template>
  2 + <el-card class="box-card-component" style="margin-left:8px;">
  3 + <div slot="header" class="box-card-header">
  4 + <img src="https://wpimg.wallstcn.com/e7d23d71-cf19-4b90-a1cc-f56af8c0903d.png">
  5 + </div>
  6 + <div style="position:relative;">
  7 + <pan-thumb :image="avatar" class="panThumb" />
  8 + <mallki class-name="mallki-text" text="vue-element-admin" />
  9 + <div style="padding-top:35px;" class="progress-item">
  10 + <span>Vue</span>
  11 + <el-progress :percentage="70" />
  12 + </div>
  13 + <div class="progress-item">
  14 + <span>JavaScript</span>
  15 + <el-progress :percentage="18" />
  16 + </div>
  17 + <div class="progress-item">
  18 + <span>Css</span>
  19 + <el-progress :percentage="12" />
  20 + </div>
  21 + <div class="progress-item">
  22 + <span>ESLint</span>
  23 + <el-progress :percentage="100" status="success" />
  24 + </div>
  25 + </div>
  26 + </el-card>
  27 +</template>
  28 +
  29 +<script>
  30 +import { mapGetters } from 'vuex'
  31 +import PanThumb from '../../../components/PanThumb'
  32 +import Mallki from '../../../components/TextHoverEffect/Mallki'
  33 +
  34 +export default {
  35 + components: { PanThumb, Mallki },
  36 +
  37 + filters: {
  38 + statusFilter(status) {
  39 + const statusMap = {
  40 + success: 'success',
  41 + pending: 'danger'
  42 + }
  43 + return statusMap[status]
  44 + }
  45 + },
  46 + data() {
  47 + return {
  48 + statisticsData: {
  49 + article_count: 1024,
  50 + pageviews_count: 1024
  51 + }
  52 + }
  53 + },
  54 + computed: {
  55 + ...mapGetters([
  56 + 'name',
  57 + 'avatar',
  58 + 'roles'
  59 + ])
  60 + }
  61 +}
  62 +</script>
  63 +
  64 +<style lang="scss" >
  65 +.box-card-component{
  66 + .el-card__header {
  67 + padding: 0px!important;
  68 + }
  69 +}
  70 +</style>
  71 +<style lang="scss" scoped>
  72 +.box-card-component {
  73 + .box-card-header {
  74 + position: relative;
  75 + height: 220px;
  76 + img {
  77 + width: 100%;
  78 + height: 100%;
  79 + transition: all 0.2s linear;
  80 + &:hover {
  81 + transform: scale(1.1, 1.1);
  82 + filter: contrast(130%);
  83 + }
  84 + }
  85 + }
  86 + .mallki-text {
  87 + position: absolute;
  88 + top: 0px;
  89 + right: 0px;
  90 + font-size: 20px;
  91 + font-weight: bold;
  92 + }
  93 + .panThumb {
  94 + z-index: 100;
  95 + height: 70px!important;
  96 + width: 70px!important;
  97 + position: absolute!important;
  98 + top: -45px;
  99 + left: 0px;
  100 + border: 5px solid #ffffff;
  101 + background-color: #fff;
  102 + margin: auto;
  103 + box-shadow: none!important;
  104 + /deep/ .pan-info {
  105 + box-shadow: none!important;
  106 + }
  107 + }
  108 + .progress-item {
  109 + margin-bottom: 10px;
  110 + font-size: 14px;
  111 + }
  112 + @media only screen and (max-width: 1510px){
  113 + .mallki-text{
  114 + display: none;
  115 + }
  116 + }
  117 +}
  118 +</style>
  1 +<template>
  2 + <div :class="className" :style="{height:height,width:width}" />
  3 +</template>
  4 +
  5 +<script>
  6 +import echarts from 'echarts'
  7 +require('echarts/theme/macarons') // echarts theme
  8 +import resize from './mixins/resize'
  9 +
  10 +export default {
  11 + mixins: [resize],
  12 + props: {
  13 + className: {
  14 + type: String,
  15 + default: 'chart'
  16 + },
  17 + width: {
  18 + type: String,
  19 + default: '100%'
  20 + },
  21 + height: {
  22 + type: String,
  23 + default: '350px'
  24 + },
  25 + autoResize: {
  26 + type: Boolean,
  27 + default: true
  28 + },
  29 + chartData: {
  30 + type: Object,
  31 + required: true
  32 + }
  33 + },
  34 + data() {
  35 + return {
  36 + chart: null
  37 + }
  38 + },
  39 + watch: {
  40 + chartData: {
  41 + deep: true,
  42 + handler(val) {
  43 + this.setOptions(val)
  44 + }
  45 + }
  46 + },
  47 + mounted() {
  48 + this.$nextTick(() => {
  49 + this.initChart()
  50 + })
  51 + },
  52 + beforeDestroy() {
  53 + if (!this.chart) {
  54 + return
  55 + }
  56 + this.chart.dispose()
  57 + this.chart = null
  58 + },
  59 + methods: {
  60 + initChart() {
  61 + this.chart = echarts.init(this.$el, 'macarons')
  62 + this.setOptions(this.chartData)
  63 + },
  64 + setOptions({ expectedData, actualData } = {}) {
  65 + this.chart.setOption({
  66 + xAxis: {
  67 + data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
  68 + boundaryGap: false,
  69 + axisTick: {
  70 + show: false
  71 + }
  72 + },
  73 + grid: {
  74 + left: 10,
  75 + right: 10,
  76 + bottom: 20,
  77 + top: 30,
  78 + containLabel: true
  79 + },
  80 + tooltip: {
  81 + trigger: 'axis',
  82 + axisPointer: {
  83 + type: 'cross'
  84 + },
  85 + padding: [5, 10]
  86 + },
  87 + yAxis: {
  88 + axisTick: {
  89 + show: false
  90 + }
  91 + },
  92 + legend: {
  93 + data: ['expected', 'actual']
  94 + },
  95 + series: [{
  96 + name: 'expected', itemStyle: {
  97 + normal: {
  98 + color: '#FF005A',
  99 + lineStyle: {
  100 + color: '#FF005A',
  101 + width: 2
  102 + }
  103 + }
  104 + },
  105 + smooth: true,
  106 + type: 'line',
  107 + data: expectedData,
  108 + animationDuration: 2800,
  109 + animationEasing: 'cubicInOut'
  110 + },
  111 + {
  112 + name: 'actual',
  113 + smooth: true,
  114 + type: 'line',
  115 + itemStyle: {
  116 + normal: {
  117 + color: '#3888fa',
  118 + lineStyle: {
  119 + color: '#3888fa',
  120 + width: 2
  121 + },
  122 + areaStyle: {
  123 + color: '#f3f8ff'
  124 + }
  125 + }
  126 + },
  127 + data: actualData,
  128 + animationDuration: 2800,
  129 + animationEasing: 'quadraticOut'
  130 + }]
  131 + })
  132 + }
  133 + }
  134 +}
  135 +</script>
  1 +<template>
  2 + <el-row :gutter="15" class="panel-group">
  3 +
  4 + <el-col :span="5" class="card-panel-col">
  5 + <div class="card-panel" @click="handleSetLineChartData('newVisitis')">
  6 + <div class="card-panel-icon-wrapper icon-people">
  7 +<!-- <svg-icon icon-class="peoples" class-name="card-panel-icon" />-->
  8 + <i class="el-icon-user-solid" style="font-size: 60px;"></i>
  9 + </div>
  10 + <div class="card-panel-description">
  11 + <div class="card-panel-text">
  12 + New Visits
  13 + </div>
  14 + <count-to :start-val="0" :end-val="102400" :duration="2600" class="card-panel-num" />
  15 + </div>
  16 + </div>
  17 + </el-col>
  18 +
  19 +<!-- :xs="12" :sm="12" :lg="6"-->
  20 + <el-col :span="5" class="card-panel-col">
  21 + <div class="card-panel" @click="handleSetLineChartData('messages')">
  22 + <div class="card-panel-icon-wrapper icon-message">
  23 +<!-- <svg-icon icon-class="message" class-name="card-panel-icon" />-->
  24 + <i class="el-icon-message" style="font-size: 60px;"></i>
  25 + </div>
  26 + <div class="card-panel-description">
  27 + <div class="card-panel-text">
  28 + Messages
  29 + </div>
  30 + <count-to :start-val="0" :end-val="81212" :duration="3000" class="card-panel-num" />
  31 + </div>
  32 + </div>
  33 + </el-col>
  34 +
  35 + <el-col :span="5" class="card-panel-col">
  36 + <div class="card-panel" @click="handleSetLineChartData('purchases')">
  37 + <div class="card-panel-icon-wrapper icon-money">
  38 +<!-- <svg-icon icon-class="money" class-name="card-panel-icon" />-->
  39 + <i class="el-icon-money" style="font-size: 60px;"></i>
  40 + </div>
  41 + <div class="card-panel-description">
  42 + <div class="card-panel-text">
  43 + Purchases
  44 + </div>
  45 + <count-to :start-val="0" :end-val="9280" :duration="3200" class="card-panel-num" />
  46 + </div>
  47 + </div>
  48 + </el-col>
  49 + <el-col :span="5" class="card-panel-col">
  50 + <div class="card-panel" @click="handleSetLineChartData('shoppings')">
  51 + <div class="card-panel-icon-wrapper icon-shopping">
  52 +<!-- <svg-icon icon-class="shopping" class-name="card-panel-icon" />-->
  53 + <i class="el-icon-shopping-cart-2" style="font-size: 60px;"></i>
  54 + </div>
  55 + <div class="card-panel-description">
  56 + <div class="card-panel-text">
  57 + Shoppings
  58 + </div>
  59 + <count-to :start-val="0" :end-val="13600" :duration="3600" class="card-panel-num" />
  60 + </div>
  61 + </div>
  62 + </el-col>
  63 + </el-row>
  64 +</template>
  65 +
  66 +<script>
  67 +import CountTo from 'vue-count-to'
  68 +// import '../../../icons'
  69 +export default {
  70 + components: {
  71 + CountTo
  72 + },
  73 + methods: {
  74 + handleSetLineChartData(type) {
  75 + this.$emit('handleSetLineChartData', type)
  76 + }
  77 + }
  78 +}
  79 +</script>
  80 +
  81 +<style lang="scss" scoped>
  82 +.panel-group {
  83 + margin-top: 18px;
  84 +
  85 + .card-panel-col {
  86 + margin-bottom: 32px;
  87 + }
  88 +
  89 + .card-panel {
  90 + height: 108px;
  91 + cursor: pointer;
  92 + font-size: 12px;
  93 + position: relative;
  94 + overflow: hidden;
  95 + color: #666;
  96 + background: #fff;
  97 + box-shadow: 4px 4px 40px rgba(0, 0, 0, .05);
  98 + border-color: rgba(0, 0, 0, .05);
  99 +
  100 + &:hover {
  101 + .card-panel-icon-wrapper {
  102 + color: #fff;
  103 + }
  104 +
  105 + .icon-people {
  106 + background: #40c9c6;
  107 + }
  108 +
  109 + .icon-message {
  110 + background: #36a3f7;
  111 + }
  112 +
  113 + .icon-money {
  114 + background: #f4516c;
  115 + }
  116 +
  117 + .icon-shopping {
  118 + background: #34bfa3
  119 + }
  120 + }
  121 +
  122 + .icon-people {
  123 + color: #40c9c6;
  124 + }
  125 +
  126 + .icon-message {
  127 + color: #36a3f7;
  128 + }
  129 +
  130 + .icon-money {
  131 + color: #f4516c;
  132 + }
  133 +
  134 + .icon-shopping {
  135 + color: #34bfa3
  136 + }
  137 +
  138 + .card-panel-icon-wrapper {
  139 + float: left;
  140 + margin: 14px 0 0 14px;
  141 + padding: 16px;
  142 + transition: all 0.38s ease-out;
  143 + border-radius: 6px;
  144 + }
  145 +
  146 + .card-panel-icon {
  147 + float: left;
  148 + font-size: 48px;
  149 + }
  150 +
  151 + .card-panel-description {
  152 + float: right;
  153 + font-weight: bold;
  154 + margin: 26px;
  155 + margin-left: 0px;
  156 +
  157 + .card-panel-text {
  158 + line-height: 18px;
  159 + color: rgba(0, 0, 0, 0.45);
  160 + font-size: 16px;
  161 + margin-bottom: 12px;
  162 + }
  163 +
  164 + .card-panel-num {
  165 + font-size: 20px;
  166 + }
  167 + }
  168 + }
  169 +}
  170 +
  171 +@media (max-width:550px) {
  172 + .card-panel-description {
  173 + display: none;
  174 + }
  175 +
  176 + .card-panel-icon-wrapper {
  177 + float: none !important;
  178 + width: 100%;
  179 + height: 100%;
  180 + margin: 0 !important;
  181 +
  182 + .svg-icon {
  183 + display: block;
  184 + margin: 14px auto !important;
  185 + float: none !important;
  186 + }
  187 + }
  188 +}
  189 +</style>
  1 +<template>
  2 + <div :class="className" :style="{height:height,width:width}" />
  3 +</template>
  4 +
  5 +<script>
  6 +import echarts from 'echarts'
  7 +require('echarts/theme/macarons') // echarts theme
  8 +import resize from './mixins/resize'
  9 +
  10 +export default {
  11 + mixins: [resize],
  12 + props: {
  13 + className: {
  14 + type: String,
  15 + default: 'chart'
  16 + },
  17 + width: {
  18 + type: String,
  19 + default: '100%'
  20 + },
  21 + height: {
  22 + type: String,
  23 + default: '300px'
  24 + }
  25 + },
  26 + data() {
  27 + return {
  28 + chart: null
  29 + }
  30 + },
  31 + mounted() {
  32 + this.$nextTick(() => {
  33 + this.initChart()
  34 + })
  35 + },
  36 + beforeDestroy() {
  37 + if (!this.chart) {
  38 + return
  39 + }
  40 + this.chart.dispose()
  41 + this.chart = null
  42 + },
  43 + methods: {
  44 + initChart() {
  45 + this.chart = echarts.init(this.$el, 'macarons')
  46 +
  47 + this.chart.setOption({
  48 + tooltip: {
  49 + trigger: 'item',
  50 + formatter: '{a} <br/>{b} : {c} ({d}%)'
  51 + },
  52 + legend: {
  53 + left: 'center',
  54 + bottom: '10',
  55 + data: ['Industries', 'Technology', 'Forex', 'Gold', 'Forecasts']
  56 + },
  57 + series: [
  58 + {
  59 + name: 'WEEKLY WRITE ARTICLES',
  60 + type: 'pie',
  61 + roseType: 'radius',
  62 + radius: [15, 95],
  63 + center: ['50%', '38%'],
  64 + data: [
  65 + { value: 320, name: 'Industries' },
  66 + { value: 240, name: 'Technology' },
  67 + { value: 149, name: 'Forex' },
  68 + { value: 100, name: 'Gold' },
  69 + { value: 59, name: 'Forecasts' }
  70 + ],
  71 + animationEasing: 'cubicInOut',
  72 + animationDuration: 2600
  73 + }
  74 + ]
  75 + })
  76 + }
  77 + }
  78 +}
  79 +</script>
  1 +<template>
  2 + <div :class="className" :style="{height:height,width:width}" />
  3 +</template>
  4 +
  5 +<script>
  6 +import echarts from 'echarts'
  7 +require('echarts/theme/macarons') // echarts theme
  8 +import resize from './mixins/resize'
  9 +
  10 +const animationDuration = 3000
  11 +
  12 +export default {
  13 + mixins: [resize],
  14 + props: {
  15 + className: {
  16 + type: String,
  17 + default: 'chart'
  18 + },
  19 + width: {
  20 + type: String,
  21 + default: '100%'
  22 + },
  23 + height: {
  24 + type: String,
  25 + default: '300px'
  26 + }
  27 + },
  28 + data() {
  29 + return {
  30 + chart: null
  31 + }
  32 + },
  33 + mounted() {
  34 + this.$nextTick(() => {
  35 + this.initChart()
  36 + })
  37 + },
  38 + beforeDestroy() {
  39 + if (!this.chart) {
  40 + return
  41 + }
  42 + this.chart.dispose()
  43 + this.chart = null
  44 + },
  45 + methods: {
  46 + initChart() {
  47 + this.chart = echarts.init(this.$el, 'macarons')
  48 +
  49 + this.chart.setOption({
  50 + tooltip: {
  51 + trigger: 'axis',
  52 + axisPointer: { // 坐标轴指示器,坐标轴触发有效
  53 + type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
  54 + }
  55 + },
  56 + radar: {
  57 + radius: '66%',
  58 + center: ['50%', '42%'],
  59 + splitNumber: 8,
  60 + splitArea: {
  61 + areaStyle: {
  62 + color: 'rgba(127,95,132,.3)',
  63 + opacity: 1,
  64 + shadowBlur: 45,
  65 + shadowColor: 'rgba(0,0,0,.5)',
  66 + shadowOffsetX: 0,
  67 + shadowOffsetY: 15
  68 + }
  69 + },
  70 + indicator: [
  71 + { name: 'Sales', max: 10000 },
  72 + { name: 'Administration', max: 20000 },
  73 + { name: 'Information Technology', max: 20000 },
  74 + { name: 'Customer Support', max: 20000 },
  75 + { name: 'Development', max: 20000 },
  76 + { name: 'Marketing', max: 20000 }
  77 + ]
  78 + },
  79 + legend: {
  80 + left: 'center',
  81 + bottom: '10',
  82 + data: ['Allocated Budget', 'Expected Spending', 'Actual Spending']
  83 + },
  84 + series: [{
  85 + type: 'radar',
  86 + symbolSize: 0,
  87 + areaStyle: {
  88 + normal: {
  89 + shadowBlur: 13,
  90 + shadowColor: 'rgba(0,0,0,.2)',
  91 + shadowOffsetX: 0,
  92 + shadowOffsetY: 10,
  93 + opacity: 1
  94 + }
  95 + },
  96 + data: [
  97 + {
  98 + value: [5000, 7000, 12000, 11000, 15000, 14000],
  99 + name: 'Allocated Budget'
  100 + },
  101 + {
  102 + value: [4000, 9000, 15000, 15000, 13000, 11000],
  103 + name: 'Expected Spending'
  104 + },
  105 + {
  106 + value: [5500, 11000, 12000, 15000, 12000, 12000],
  107 + name: 'Actual Spending'
  108 + }
  109 + ],
  110 + animationDuration: animationDuration
  111 + }]
  112 + })
  113 + }
  114 + }
  115 +}
  116 +</script>
  1 +<template>
  2 + <li :class="{ completed: todo.done, editing: editing }" class="todo">
  3 + <div class="view">
  4 + <input
  5 + :checked="todo.done"
  6 + class="toggle"
  7 + type="checkbox"
  8 + @change="toggleTodo( todo)"
  9 + >
  10 + <label @dblclick="editing = true" v-text="todo.text" />
  11 + <button class="destroy" @click="deleteTodo( todo )" />
  12 + </div>
  13 + <input
  14 + v-show="editing"
  15 + v-focus="editing"
  16 + :value="todo.text"
  17 + class="edit"
  18 + @keyup.enter="doneEdit"
  19 + @keyup.esc="cancelEdit"
  20 + @blur="doneEdit"
  21 + >
  22 + </li>
  23 +</template>
  24 +
  25 +<script>
  26 +export default {
  27 + name: 'Todo',
  28 + directives: {
  29 + focus(el, { value }, { context }) {
  30 + if (value) {
  31 + context.$nextTick(() => {
  32 + el.focus()
  33 + })
  34 + }
  35 + }
  36 + },
  37 + props: {
  38 + todo: {
  39 + type: Object,
  40 + default: function() {
  41 + return {}
  42 + }
  43 + }
  44 + },
  45 + data() {
  46 + return {
  47 + editing: false
  48 + }
  49 + },
  50 + methods: {
  51 + deleteTodo(todo) {
  52 + this.$emit('deleteTodo', todo)
  53 + },
  54 + editTodo({ todo, value }) {
  55 + this.$emit('editTodo', { todo, value })
  56 + },
  57 + toggleTodo(todo) {
  58 + this.$emit('toggleTodo', todo)
  59 + },
  60 + doneEdit(e) {
  61 + const value = e.target.value.trim()
  62 + const { todo } = this
  63 + if (!value) {
  64 + this.deleteTodo({
  65 + todo
  66 + })
  67 + } else if (this.editing) {
  68 + this.editTodo({
  69 + todo,
  70 + value
  71 + })
  72 + this.editing = false
  73 + }
  74 + },
  75 + cancelEdit(e) {
  76 + e.target.value = this.todo.text
  77 + this.editing = false
  78 + }
  79 + }
  80 +}
  81 +</script>
  1 +.todoapp {
  2 + font: 14px 'Helvetica Neue', Helvetica, Arial, sans-serif;
  3 + line-height: 1.4em;
  4 + color: #4d4d4d;
  5 + min-width: 230px;
  6 + max-width: 550px;
  7 + margin: 0 auto ;
  8 + -webkit-font-smoothing: antialiased;
  9 + -moz-osx-font-smoothing: grayscale;
  10 + font-weight: 300;
  11 + background: #fff;
  12 + z-index: 1;
  13 + position: relative;
  14 + button {
  15 + margin: 0;
  16 + padding: 0;
  17 + border: 0;
  18 + background: none;
  19 + font-size: 100%;
  20 + vertical-align: baseline;
  21 + font-family: inherit;
  22 + font-weight: inherit;
  23 + color: inherit;
  24 + -webkit-appearance: none;
  25 + appearance: none;
  26 + -webkit-font-smoothing: antialiased;
  27 + -moz-osx-font-smoothing: grayscale;
  28 + }
  29 + :focus {
  30 + outline: 0;
  31 + }
  32 + .hidden {
  33 + display: none;
  34 + }
  35 + .todoapp {
  36 + background: #fff;
  37 + margin: 130px 0 40px 0;
  38 + position: relative;
  39 + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.2), 0 25px 50px 0 rgba(0, 0, 0, 0.1);
  40 + }
  41 + .todoapp input::-webkit-input-placeholder {
  42 + font-style: italic;
  43 + font-weight: 300;
  44 + color: #e6e6e6;
  45 + }
  46 + .todoapp input::-moz-placeholder {
  47 + font-style: italic;
  48 + font-weight: 300;
  49 + color: #e6e6e6;
  50 + }
  51 + .todoapp input::input-placeholder {
  52 + font-style: italic;
  53 + font-weight: 300;
  54 + color: #e6e6e6;
  55 + }
  56 + .todoapp h1 {
  57 + position: absolute;
  58 + top: -155px;
  59 + width: 100%;
  60 + font-size: 100px;
  61 + font-weight: 100;
  62 + text-align: center;
  63 + color: rgba(175, 47, 47, 0.15);
  64 + -webkit-text-rendering: optimizeLegibility;
  65 + -moz-text-rendering: optimizeLegibility;
  66 + text-rendering: optimizeLegibility;
  67 + }
  68 + .new-todo,
  69 + .edit {
  70 + position: relative;
  71 + margin: 0;
  72 + width: 100%;
  73 + font-size: 18px;
  74 + font-family: inherit;
  75 + font-weight: inherit;
  76 + line-height: 1.4em;
  77 + border: 0;
  78 + color: inherit;
  79 + padding: 6px;
  80 + border: 1px solid #999;
  81 + box-shadow: inset 0 -1px 5px 0 rgba(0, 0, 0, 0.2);
  82 + box-sizing: border-box;
  83 + -webkit-font-smoothing: antialiased;
  84 + -moz-osx-font-smoothing: grayscale;
  85 + }
  86 + .new-todo {
  87 + padding: 10px 16px 16px 60px;
  88 + border: none;
  89 + background: rgba(0, 0, 0, 0.003);
  90 + box-shadow: inset 0 -2px 1px rgba(0, 0, 0, 0.03);
  91 + }
  92 + .main {
  93 + position: relative;
  94 + z-index: 2;
  95 + border-top: 1px solid #e6e6e6;
  96 + }
  97 + .toggle-all {
  98 + text-align: center;
  99 + border: none;
  100 + /* Mobile Safari */
  101 + opacity: 0;
  102 + position: absolute;
  103 + }
  104 + .toggle-all+label {
  105 + width: 60px;
  106 + height: 34px;
  107 + font-size: 0;
  108 + position: absolute;
  109 + top: -52px;
  110 + left: -13px;
  111 + -webkit-transform: rotate(90deg);
  112 + transform: rotate(90deg);
  113 + }
  114 + .toggle-all+label:before {
  115 + content: '❯';
  116 + font-size: 22px;
  117 + color: #e6e6e6;
  118 + padding: 10px 27px 10px 27px;
  119 + }
  120 + .toggle-all:checked+label:before {
  121 + color: #737373;
  122 + }
  123 + .todo-list {
  124 + margin: 0;
  125 + padding: 0;
  126 + list-style: none;
  127 + }
  128 + .todo-list li {
  129 + position: relative;
  130 + font-size: 24px;
  131 + border-bottom: 1px solid #ededed;
  132 + }
  133 + .todo-list li:last-child {
  134 + border-bottom: none;
  135 + }
  136 + .todo-list li.editing {
  137 + border-bottom: none;
  138 + padding: 0;
  139 + }
  140 + .todo-list li.editing .edit {
  141 + display: block;
  142 + width: 506px;
  143 + padding: 12px 16px;
  144 + margin: 0 0 0 43px;
  145 + }
  146 + .todo-list li.editing .view {
  147 + display: none;
  148 + }
  149 + .todo-list li .toggle {
  150 + text-align: center;
  151 + width: 40px;
  152 + /* auto, since non-WebKit browsers doesn't support input styling */
  153 + height: auto;
  154 + position: absolute;
  155 + top: 0;
  156 + bottom: 0;
  157 + margin: auto 0;
  158 + border: none;
  159 + /* Mobile Safari */
  160 + -webkit-appearance: none;
  161 + appearance: none;
  162 + }
  163 + .todo-list li .toggle {
  164 + opacity: 0;
  165 + }
  166 + .todo-list li .toggle+label {
  167 + /*
  168 + Firefox requires `#` to be escaped - https://bugzilla.mozilla.org/show_bug.cgi?id=922433
  169 + IE and Edge requires *everything* to be escaped to render, so we do that instead of just the `#` - https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/7157459/
  170 + */
  171 + background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23ededed%22%20stroke-width%3D%223%22/%3E%3C/svg%3E');
  172 + background-repeat: no-repeat;
  173 + background-position: center left;
  174 + background-size: 36px;
  175 + }
  176 + .todo-list li .toggle:checked+label {
  177 + background-size: 36px;
  178 + background-image: url('data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2240%22%20height%3D%2240%22%20viewBox%3D%22-10%20-18%20100%20135%22%3E%3Ccircle%20cx%3D%2250%22%20cy%3D%2250%22%20r%3D%2250%22%20fill%3D%22none%22%20stroke%3D%22%23bddad5%22%20stroke-width%3D%223%22/%3E%3Cpath%20fill%3D%22%235dc2af%22%20d%3D%22M72%2025L42%2071%2027%2056l-4%204%2020%2020%2034-52z%22/%3E%3C/svg%3E');
  179 + }
  180 + .todo-list li label {
  181 + word-break: break-all;
  182 + padding: 15px 15px 15px 50px;
  183 + display: block;
  184 + line-height: 1.0;
  185 + font-size: 14px;
  186 + transition: color 0.4s;
  187 + }
  188 + .todo-list li.completed label {
  189 + color: #d9d9d9;
  190 + text-decoration: line-through;
  191 + }
  192 + .todo-list li .destroy {
  193 + display: none;
  194 + position: absolute;
  195 + top: 0;
  196 + right: 10px;
  197 + bottom: 0;
  198 + width: 40px;
  199 + height: 40px;
  200 + margin: auto 0;
  201 + font-size: 30px;
  202 + color: #cc9a9a;
  203 + transition: color 0.2s ease-out;
  204 + cursor: pointer;
  205 + }
  206 + .todo-list li .destroy:hover {
  207 + color: #af5b5e;
  208 + }
  209 + .todo-list li .destroy:after {
  210 + content: '×';
  211 + }
  212 + .todo-list li:hover .destroy {
  213 + display: block;
  214 + }
  215 + .todo-list li .edit {
  216 + display: none;
  217 + }
  218 + .todo-list li.editing:last-child {
  219 + margin-bottom: -1px;
  220 + }
  221 + .footer {
  222 + color: #777;
  223 + position: relative;
  224 + padding: 10px 15px;
  225 + height: 40px;
  226 + text-align: center;
  227 + border-top: 1px solid #e6e6e6;
  228 + }
  229 + .footer:before {
  230 + content: '';
  231 + position: absolute;
  232 + right: 0;
  233 + bottom: 0;
  234 + left: 0;
  235 + height: 40px;
  236 + overflow: hidden;
  237 + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2), 0 8px 0 -3px #f6f6f6, 0 9px 1px -3px rgba(0, 0, 0, 0.2), 0 16px 0 -6px #f6f6f6, 0 17px 2px -6px rgba(0, 0, 0, 0.2);
  238 + }
  239 + .todo-count {
  240 + float: left;
  241 + text-align: left;
  242 + }
  243 + .todo-count strong {
  244 + font-weight: 300;
  245 + }
  246 + .filters {
  247 + margin: 0;
  248 + padding: 0;
  249 + position: relative;
  250 + z-index: 1;
  251 + list-style: none;
  252 + }
  253 + .filters li {
  254 + display: inline;
  255 + }
  256 + .filters li a {
  257 + color: inherit;
  258 + font-size: 12px;
  259 + padding: 3px 7px;
  260 + text-decoration: none;
  261 + border: 1px solid transparent;
  262 + border-radius: 3px;
  263 + }
  264 + .filters li a:hover {
  265 + border-color: rgba(175, 47, 47, 0.1);
  266 + }
  267 + .filters li a.selected {
  268 + border-color: rgba(175, 47, 47, 0.2);
  269 + }
  270 + .clear-completed,
  271 + html .clear-completed:active {
  272 + float: right;
  273 + position: relative;
  274 + line-height: 20px;
  275 + text-decoration: none;
  276 + cursor: pointer;
  277 + }
  278 + .clear-completed:hover {
  279 + text-decoration: underline;
  280 + }
  281 + .info {
  282 + margin: 65px auto 0;
  283 + color: #bfbfbf;
  284 + font-size: 10px;
  285 + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
  286 + text-align: center;
  287 + }
  288 + .info p {
  289 + line-height: 1;
  290 + }
  291 + .info a {
  292 + color: inherit;
  293 + text-decoration: none;
  294 + font-weight: 400;
  295 + }
  296 + .info a:hover {
  297 + text-decoration: underline;
  298 + }
  299 + /*
  300 + Hack to remove background from Mobile Safari.
  301 + Can't use it globally since it destroys checkboxes in Firefox
  302 +*/
  303 + @media screen and (-webkit-min-device-pixel-ratio:0) {
  304 + .toggle-all,
  305 + .todo-list li .toggle {
  306 + background: none;
  307 + }
  308 + .todo-list li .toggle {
  309 + height: 40px;
  310 + }
  311 + }
  312 + @media (max-width: 430px) {
  313 + .footer {
  314 + height: 50px;
  315 + }
  316 + .filters {
  317 + bottom: 10px;
  318 + }
  319 + }
  320 +}
  1 +<template>
  2 + <section class="todoapp">
  3 + <!-- header -->
  4 + <header class="header">
  5 + <input class="new-todo" autocomplete="off" placeholder="Todo List" @keyup.enter="addTodo">
  6 + </header>
  7 + <!-- main section -->
  8 + <section v-show="todos.length" class="main">
  9 + <input id="toggle-all" :checked="allChecked" class="toggle-all" type="checkbox" @change="toggleAll({ done: !allChecked })">
  10 + <label for="toggle-all" />
  11 + <ul class="todo-list">
  12 + <todo
  13 + v-for="(todo, index) in filteredTodos"
  14 + :key="index"
  15 + :todo="todo"
  16 + @toggleTodo="toggleTodo"
  17 + @editTodo="editTodo"
  18 + @deleteTodo="deleteTodo"
  19 + />
  20 + </ul>
  21 + </section>
  22 + <!-- footer -->
  23 + <footer v-show="todos.length" class="footer">
  24 + <span class="todo-count">
  25 + <strong>{{ remaining }}</strong>
  26 + {{ remaining | pluralize('item') }} left
  27 + </span>
  28 + <ul class="filters">
  29 + <li v-for="(val, key) in filters" :key="key">
  30 + <a :class="{ selected: visibility === key }" @click.prevent="visibility = key">{{ key | capitalize }}</a>
  31 + </li>
  32 + </ul>
  33 + <!-- <button class="clear-completed" v-show="todos.length > remaining" @click="clearCompleted">
  34 + Clear completed
  35 + </button> -->
  36 + </footer>
  37 + </section>
  38 +</template>
  39 +
  40 +<script>
  41 +import Todo from './Todo.vue'
  42 +
  43 +const STORAGE_KEY = 'todos'
  44 +const filters = {
  45 + all: todos => todos,
  46 + active: todos => todos.filter(todo => !todo.done),
  47 + completed: todos => todos.filter(todo => todo.done)
  48 +}
  49 +const defalutList = [
  50 + { text: 'star this repository', done: false },
  51 + { text: 'fork this repository', done: false },
  52 + { text: 'follow author', done: false },
  53 + { text: 'vue-element-admin', done: true },
  54 + { text: 'vue', done: true },
  55 + { text: 'element-ui', done: true },
  56 + { text: 'axios', done: true },
  57 + { text: 'webpack', done: true }
  58 +]
  59 +export default {
  60 + components: { Todo },
  61 + filters: {
  62 + pluralize: (n, w) => n === 1 ? w : w + 's',
  63 + capitalize: s => s.charAt(0).toUpperCase() + s.slice(1)
  64 + },
  65 + data() {
  66 + return {
  67 + visibility: 'all',
  68 + filters,
  69 + // todos: JSON.parse(window.localStorage.getItem(STORAGE_KEY)) || defalutList
  70 + todos: defalutList
  71 + }
  72 + },
  73 + computed: {
  74 + allChecked() {
  75 + return this.todos.every(todo => todo.done)
  76 + },
  77 + filteredTodos() {
  78 + return filters[this.visibility](this.todos)
  79 + },
  80 + remaining() {
  81 + return this.todos.filter(todo => !todo.done).length
  82 + }
  83 + },
  84 + methods: {
  85 + setLocalStorage() {
  86 + window.localStorage.setItem(STORAGE_KEY, JSON.stringify(this.todos))
  87 + },
  88 + addTodo(e) {
  89 + const text = e.target.value
  90 + if (text.trim()) {
  91 + this.todos.push({
  92 + text,
  93 + done: false
  94 + })
  95 + this.setLocalStorage()
  96 + }
  97 + e.target.value = ''
  98 + },
  99 + toggleTodo(val) {
  100 + val.done = !val.done
  101 + this.setLocalStorage()
  102 + },
  103 + deleteTodo(todo) {
  104 + this.todos.splice(this.todos.indexOf(todo), 1)
  105 + this.setLocalStorage()
  106 + },
  107 + editTodo({ todo, value }) {
  108 + todo.text = value
  109 + this.setLocalStorage()
  110 + },
  111 + clearCompleted() {
  112 + this.todos = this.todos.filter(todo => !todo.done)
  113 + this.setLocalStorage()
  114 + },
  115 + toggleAll({ done }) {
  116 + this.todos.forEach(todo => {
  117 + todo.done = done
  118 + this.setLocalStorage()
  119 + })
  120 + }
  121 + }
  122 +}
  123 +</script>
  124 +
  125 +<style lang="scss">
  126 + @import './index.scss';
  127 +</style>
  1 +<template>
  2 + <el-table :data="list" style="width: 100%;padding-top: 15px;">
  3 + <el-table-column label="Order_No" min-width="200">
  4 + <template slot-scope="scope">
  5 + {{ scope.row.order_no | orderNoFilter }}
  6 + </template>
  7 + </el-table-column>
  8 + <el-table-column label="Price" width="195" align="center">
  9 + <template slot-scope="scope">
  10 + ¥{{ scope.row.price | toThousandFilter }}
  11 + </template>
  12 + </el-table-column>
  13 + <el-table-column label="Status" width="100" align="center">
  14 + <template slot-scope="{row}">
  15 + <el-tag :type="row.status | statusFilter">
  16 + {{ row.status }}
  17 + </el-tag>
  18 + </template>
  19 + </el-table-column>
  20 + </el-table>
  21 +</template>
  22 +
  23 +<script>
  24 +import { transactionList } from '@/api/remote-search'
  25 +
  26 +export default {
  27 + filters: {
  28 + statusFilter(status) {
  29 + const statusMap = {
  30 + success: 'success',
  31 + pending: 'danger'
  32 + }
  33 + return statusMap[status]
  34 + },
  35 + orderNoFilter(str) {
  36 + return str.substring(0, 30)
  37 + }
  38 + },
  39 + data() {
  40 + return {
  41 + list: null
  42 + }
  43 + },
  44 + created() {
  45 + this.fetchData()
  46 + },
  47 + methods: {
  48 + fetchData() {
  49 + transactionList().then(response => {
  50 + this.list = response.data.items.slice(0, 8)
  51 + })
  52 + }
  53 + }
  54 +}
  55 +</script>
  1 +import { debounce } from '@/utils'
  2 +
  3 +export default {
  4 + data() {
  5 + return {
  6 + $_sidebarElm: null,
  7 + $_resizeHandler: null
  8 + }
  9 + },
  10 + mounted() {
  11 + this.$_resizeHandler = debounce(() => {
  12 + if (this.chart) {
  13 + this.chart.resize()
  14 + }
  15 + }, 100)
  16 + this.$_initResizeEvent()
  17 + this.$_initSidebarResizeEvent()
  18 + },
  19 + beforeDestroy() {
  20 + this.$_destroyResizeEvent()
  21 + this.$_destroySidebarResizeEvent()
  22 + },
  23 + // to fixed bug when cached by keep-alive
  24 + // https://github.com/PanJiaChen/vue-element-admin/issues/2116
  25 + activated() {
  26 + this.$_initResizeEvent()
  27 + this.$_initSidebarResizeEvent()
  28 + },
  29 + deactivated() {
  30 + this.$_destroyResizeEvent()
  31 + this.$_destroySidebarResizeEvent()
  32 + },
  33 + methods: {
  34 + // use $_ for mixins properties
  35 + // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential
  36 + $_initResizeEvent() {
  37 + window.addEventListener('resize', this.$_resizeHandler)
  38 + },
  39 + $_destroyResizeEvent() {
  40 + window.removeEventListener('resize', this.$_resizeHandler)
  41 + },
  42 + $_sidebarResizeHandler(e) {
  43 + if (e.propertyName === 'width') {
  44 + this.$_resizeHandler()
  45 + }
  46 + },
  47 + $_initSidebarResizeEvent() {
  48 + this.$_sidebarElm = document.getElementsByClassName('sidebar-container')[0]
  49 + this.$_sidebarElm && this.$_sidebarElm.addEventListener('transitionend', this.$_sidebarResizeHandler)
  50 + },
  51 + $_destroySidebarResizeEvent() {
  52 + this.$_sidebarElm && this.$_sidebarElm.removeEventListener('transitionend', this.$_sidebarResizeHandler)
  53 + }
  54 + }
  55 +}
  1 +<template>
  2 + <div class="dashboard-editor-container">
  3 + <github-corner class="github-corner" />
  4 +
  5 + <panel-group @handleSetLineChartData="handleSetLineChartData" />
  6 +
  7 + <el-row style="background:#fff;padding:16px 16px 0;margin-bottom:32px;">
  8 + <line-chart :chart-data="lineChartData" />
  9 + </el-row>
  10 +
  11 + <el-row :gutter="20">
  12 + <el-col :span="7">
  13 + <div class="chart-wrapper">
  14 + <raddar-chart />
  15 + </div>
  16 + </el-col>
  17 +<!-- :xs="24" :sm="24" :lg="8"-->
  18 + <el-col :span="7">
  19 + <div class="chart-wrapper">
  20 + <pie-chart />
  21 + </div>
  22 + </el-col>
  23 + <el-col :span="7">
  24 + <div class="chart-wrapper">
  25 + <bar-chart />
  26 + </div>
  27 + </el-col>
  28 + </el-row>
  29 +
  30 +<!-- <el-row :gutter="8">-->
  31 +<!-- <el-col :xs="{span: 24}" :sm="{span: 24}" :md="{span: 24}" :lg="{span: 12}" :xl="{span: 12}" style="padding-right:8px;margin-bottom:30px;">-->
  32 +<!-- <transaction-table />-->
  33 +<!-- </el-col>-->
  34 +<!-- <el-col :xs="{span: 24}" :sm="{span: 12}" :md="{span: 12}" :lg="{span: 6}" :xl="{span: 6}" style="margin-bottom:30px;">-->
  35 +<!-- <todo-list />-->
  36 +<!-- </el-col>-->
  37 +<!-- <el-col :xs="{span: 24}" :sm="{span: 12}" :md="{span: 12}" :lg="{span: 6}" :xl="{span: 6}" style="margin-bottom:30px;">-->
  38 +<!-- <box-card />-->
  39 +<!-- </el-col>-->
  40 +<!-- </el-row>-->
  41 + </div>
  42 +</template>
  43 +
  44 +<script>
  45 + import GithubCorner from '../../components/GithubCorner'
  46 + import PanelGroup from './components/PanelGroup'
  47 + import LineChart from './components/LineChart'
  48 + import RaddarChart from './components/RaddarChart'
  49 + import PieChart from './components/PieChart'
  50 + import BarChart from './components/BarChart'
  51 + import TransactionTable from './components/TransactionTable'
  52 + import TodoList from './components/TodoList'
  53 + import BoxCard from './components/BoxCard'
  54 +
  55 + const lineChartData = {
  56 + newVisitis: {
  57 + expectedData: [100, 120, 161, 134, 105, 160, 165],
  58 + actualData: [120, 82, 91, 154, 162, 140, 145]
  59 + },
  60 + messages: {
  61 + expectedData: [200, 192, 120, 144, 160, 130, 140],
  62 + actualData: [180, 160, 151, 106, 145, 150, 130]
  63 + },
  64 + purchases: {
  65 + expectedData: [80, 100, 121, 104, 105, 90, 100],
  66 + actualData: [120, 90, 100, 138, 142, 130, 130]
  67 + },
  68 + shoppings: {
  69 + expectedData: [130, 140, 141, 142, 145, 150, 160],
  70 + actualData: [120, 82, 91, 154, 162, 140, 130]
  71 + }
  72 + }
  73 +
  74 + export default {
  75 + name: 'DashboardAdmin',
  76 + components: {
  77 + GithubCorner,
  78 + PanelGroup,
  79 + LineChart,
  80 + RaddarChart,
  81 + PieChart,
  82 + BarChart,
  83 + TransactionTable,
  84 + TodoList,
  85 + BoxCard
  86 + },
  87 + data() {
  88 + return {
  89 + lineChartData: lineChartData.newVisitis
  90 + }
  91 + },
  92 + methods: {
  93 + handleSetLineChartData(type) {
  94 + this.lineChartData = lineChartData[type]
  95 + }
  96 + }
  97 + }
  98 +</script>
  99 +
  100 +<style lang="scss" scoped>
  101 + .dashboard-editor-container {
  102 + padding: 32px;
  103 + background-color: rgb(240, 242, 245);
  104 + position: relative;
  105 +
  106 + .github-corner {
  107 + position: absolute;
  108 + top: 0px;
  109 + border: 0;
  110 + right: 0;
  111 + }
  112 +
  113 + .chart-wrapper {
  114 + background: #fff;
  115 + padding: 16px 16px 0;
  116 + margin-bottom: 32px;
  117 + }
  118 + }
  119 +
  120 + @media (max-width:1024px) {
  121 + .chart-wrapper {
  122 + padding: 6px;
  123 + }
  124 + }
  125 +</style>